@kudoengineer/toast 22.0.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/README.md
ADDED
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
# @kudoengineer/toast
|
|
2
|
+
|
|
3
|
+
A modern, lightweight, customizable Toast Notification library for Angular 22+.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- ✅ Standalone Components
|
|
8
|
+
- ✅ Angular Signals
|
|
9
|
+
- ✅ Tree Shakable
|
|
10
|
+
- ✅ Multiple Toast Types
|
|
11
|
+
- ✅ Queue Support
|
|
12
|
+
- ✅ Auto Close
|
|
13
|
+
- ✅ Progress Bar
|
|
14
|
+
- ✅ Close Button
|
|
15
|
+
- ✅ Custom Duration
|
|
16
|
+
- ✅ Duplicate Prevention
|
|
17
|
+
- ✅ Zero Dependencies
|
|
18
|
+
- ✅ Angular 22 Ready
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Installation
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
npm install @kudoengineer/toast
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Setup
|
|
31
|
+
|
|
32
|
+
### app.config.ts
|
|
33
|
+
|
|
34
|
+
```ts
|
|
35
|
+
import { ApplicationConfig } from '@angular/core';
|
|
36
|
+
import { provideToast } from '@kudoengineer/toast';
|
|
37
|
+
|
|
38
|
+
export const appConfig: ApplicationConfig = {
|
|
39
|
+
providers: [
|
|
40
|
+
provideToast({
|
|
41
|
+
duration: 4000,
|
|
42
|
+
position: 'top-right',
|
|
43
|
+
}),
|
|
44
|
+
],
|
|
45
|
+
};
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Import Component
|
|
51
|
+
|
|
52
|
+
```ts
|
|
53
|
+
import { Component } from '@angular/core';
|
|
54
|
+
import { KeToaster } from '@kudoengineer/toast';
|
|
55
|
+
|
|
56
|
+
@Component({
|
|
57
|
+
selector: 'app-root',
|
|
58
|
+
imports: [KeToaster],
|
|
59
|
+
template: `
|
|
60
|
+
<button (click)="show()">Show Toast</button>
|
|
61
|
+
|
|
62
|
+
<ke-toaster />
|
|
63
|
+
`,
|
|
64
|
+
})
|
|
65
|
+
export class AppComponent {}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## Usage
|
|
71
|
+
|
|
72
|
+
```ts
|
|
73
|
+
import { inject } from '@angular/core';
|
|
74
|
+
import { ToastService } from '@kudoengineer/toast';
|
|
75
|
+
|
|
76
|
+
export class AppComponent {
|
|
77
|
+
private toast = inject(ToastService);
|
|
78
|
+
|
|
79
|
+
success() {
|
|
80
|
+
this.toast.success('Saved Successfully');
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
error() {
|
|
84
|
+
this.toast.error('Something went wrong');
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
warning() {
|
|
88
|
+
this.toast.warning('Warning Message');
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
info() {
|
|
92
|
+
this.toast.info('Information');
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## Configuration
|
|
100
|
+
|
|
101
|
+
```ts
|
|
102
|
+
provideToast({
|
|
103
|
+
duration: 4000,
|
|
104
|
+
max: 5,
|
|
105
|
+
newestOnTop: true,
|
|
106
|
+
queue: true,
|
|
107
|
+
progressBar: true,
|
|
108
|
+
pauseOnHover: true,
|
|
109
|
+
preventDuplicates: false,
|
|
110
|
+
showClose: true,
|
|
111
|
+
position: 'top-right',
|
|
112
|
+
});
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Available Positions
|
|
118
|
+
|
|
119
|
+
```
|
|
120
|
+
top-left
|
|
121
|
+
top-center
|
|
122
|
+
top-right
|
|
123
|
+
|
|
124
|
+
bottom-left
|
|
125
|
+
bottom-center
|
|
126
|
+
bottom-right
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## Toast Types
|
|
132
|
+
|
|
133
|
+
```ts
|
|
134
|
+
toast.success(message);
|
|
135
|
+
|
|
136
|
+
toast.error(message);
|
|
137
|
+
|
|
138
|
+
toast.warning(message);
|
|
139
|
+
|
|
140
|
+
toast.info(message);
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## Component
|
|
146
|
+
|
|
147
|
+
```html
|
|
148
|
+
<ke-toaster />
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## API
|
|
154
|
+
|
|
155
|
+
### ToastService
|
|
156
|
+
|
|
157
|
+
| Method | Description |
|
|
158
|
+
| ---------- | --------------------- |
|
|
159
|
+
| success() | Success Toast |
|
|
160
|
+
| error() | Error Toast |
|
|
161
|
+
| warning() | Warning Toast |
|
|
162
|
+
| info() | Info Toast |
|
|
163
|
+
| clear() | Remove All Toasts |
|
|
164
|
+
| remove(id) | Remove Specific Toast |
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## Browser Support
|
|
169
|
+
|
|
170
|
+
- Chrome
|
|
171
|
+
- Edge
|
|
172
|
+
- Firefox
|
|
173
|
+
- Safari
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## Angular Compatibility
|
|
178
|
+
|
|
179
|
+
| Angular | Supported |
|
|
180
|
+
| ------- | --------- |
|
|
181
|
+
| 22+ | ✅ |
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
## Author
|
|
188
|
+
|
|
189
|
+
### KudoEngineer
|
|
190
|
+
|
|
191
|
+
Created and maintained by **[Satendra Rajput](https://satendra2rajput.com/)**.
|
|
192
|
+
|
|
193
|
+
- 🌐 Website: https://kudoengineer.com
|
|
194
|
+
- 💻 GitHub: https://github.com/satendra2rajput
|
|
195
|
+
- 💼 LinkedIn: https://www.linkedin.com/in/satendra2rajput
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
## Contributing
|
|
200
|
+
|
|
201
|
+
Contributions, issues, and feature requests are welcome!
|
|
202
|
+
|
|
203
|
+
If you find a bug or have an idea for improvement, feel free to open an issue or submit a pull request.
|
|
204
|
+
|
|
205
|
+
---
|
|
206
|
+
|
|
207
|
+
## License
|
|
208
|
+
|
|
209
|
+
MIT License © 2026 KudoEngineer.
|
|
210
|
+
|
|
211
|
+
Created and maintained by **Satendra Rajput**.
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
|
+
import * as i0 from '@angular/core';
|
|
3
|
+
import { EventEmitter, Output, Input, Component, InjectionToken, signal, Inject, Injectable, inject, ChangeDetectionStrategy, makeEnvironmentProviders } from '@angular/core';
|
|
4
|
+
|
|
5
|
+
class KeToast {
|
|
6
|
+
toast;
|
|
7
|
+
close = new EventEmitter();
|
|
8
|
+
type;
|
|
9
|
+
onClose() {
|
|
10
|
+
this.close.emit(this.toast.id);
|
|
11
|
+
}
|
|
12
|
+
onAction() {
|
|
13
|
+
this.toast.actionHandler?.();
|
|
14
|
+
}
|
|
15
|
+
getIcon(type) {
|
|
16
|
+
switch (type) {
|
|
17
|
+
case 'success':
|
|
18
|
+
return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABXdJREFUeNrsnY112jAQxy2/DkAmKJkgMEHoBIUJAhM0mSCvE5BOAJ0gZAKcCXAmgEwAncDVkYNnwMayfbI+fPeeXtrkBcv65X+nk+RzELBZZcKFTiZJMpBferJ1ZLvHb3exXbNYtp1sG9k+8f+xEGLDQNQHHwZ9iAPfw0ZtACmS7V22hU2AhCUQugjhQROAQEFJb7LNbVZPEyDGsr0mdtkS+tUmCB3ZHmVbJ3bb2nswCGKbuGX+gZE3NHRAEUW2wtmeu0EdZ0wzDNi+2Fy2Jxn8d04BAVUgjI6H3hdgTCSUBfUHh5qCNoB49RRGgPcFs8Op1QrBfOLVUC5hyiCHGVHlL4IQBkBYeqyKIhf2Q0KJrXBZOC1ctRTGwYWtKKbHggjGLGA7GAT7uREgDIMeimAYdkERFWEMcTbFRgxFVIDR5tlUFYPZV6QFCC6FrBmGvilx2WkvK6PalHiGf8x0QHCZoMfjW8lg3JSWWYQijAGqg62ejYoWJIUCjA5m4V0eT5J4cntt6V7FZT0zDNJ48lxZITjFXfE4kls/b9ZVpJApj50Wm5Z2WRjIBy0dMMiuJ+jzddggb39eXAGybCmQ43IHTmiWmqb7kbzODyWFtFgdJ2tPOBuCQYubUkmey/rVdhgNQXkodFm4L75mGJn5mA73dZPOS0JWh9oSuUaljIsUsm5RIlh6v0KDUuB5lX6mQjARZBjNKqWHYSLTZT0wDGUoE8L+DPOADBiGMhTKWPLzAgjKpscwlGMJ5QGPwWEDK60QhlEOxpg6UTwHcs8wjME4CqINCnEBxlEQInWxbeDfAQZXYIDtZF9vRCrZ2TIMYzAOdhsadFcwWBuGcWLd0ACIw8ExGLRbBMMwvqzzreGE8OIUH4CRNx4Q3bjLMPaeKjSgjDgj650QKMV1GGB3oWkYRFB8gLF3WaENMGpC8QVGkE4Mv5uGURGKVzDSnVlqKEWxxf2VygNU8Pljwvuf2VKJ6KAQHfnApM4SdYFS/FRGymV9Un8wRdmJHCjewkgD0eEGH4nApqF4DUMrEGlTKj+PUPq+w5AWh6nZkA6bEUKJPYcB9u8AJNZ4kZktFdkshwEW6VaINVAcgLHnkN6gShq4IFlQ9hAGuGWRDupxA9dsXCmuwDiMf9NAGoXiEIxMIB8NXlw7FMdggL2fA4ka7oA2KA7COI6/OLsREydPSAO9ozA2uJ19kakvDHSGTCmOwjjxTudA3gx1qDYUh2GcjHvWAzsmD8xVcl+Ow9gfkMtTiCm3VVkpjsO4GO8sIH8Nd1AZigcwwP6cZOs5Nwr1TUwfvr7qvjyBcfJ8YZ5CLqjZphRPYGSO87XSGrY8jXuiFI9gHHMPFYWA/bak4zN8M0/HIxi541tUL6tNz6wbV0eRQvbugsdOjxvO+8FVIFgAeMHjR5t3XCusrFoEk4snE2XlQd0imPjLTzyWJFb4MjHlUuPwRs7Ar7etmXBVo0IBlADC9XtrzKqCr4N+had7lE8u4oeNAv1HhnyMGyPV9x6WOkqKpwc5npSPG8oHSEqf7cVlDIaiZi/aX+iSiik+LWPosDkeEg8aAcJQ6GHUBsJQaGGQAGEodDAqBfWcQD/hQL8P4LUXY6lfTgwqgcr/bVv3IjvsR/4+dXwUGlxYG95XtcGkj+ygOvkzhtg5qGs79xwGbEv0iauT0ivkTC1DVItPLmyHLkrLPpHWWifYadiqfPElcAdf+xnub9pBXWBYwk/ctFm6HLhXBi8xsai2iAqIdrxMExUzxSI1NtkW+9UN2mqQvxh2Z1tUg/EdUWEhHBgUKCoMX3X+lcJ0NZLt3aYgLSxXDkyXB5hk3iGgKj49wunqB/47Vt3BYyAlJgcK0+7Itfv6L8AA0mPYDSVaymoAAAAASUVORK5CYII=';
|
|
19
|
+
case 'error':
|
|
20
|
+
return 'data:image/png;base64,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';
|
|
21
|
+
case 'info':
|
|
22
|
+
return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABRpJREFUeNrsnYtx4jAQhi1XQCo4p4JABTgVhKvgSAUhFZBUwHUAV0FIBZgK4lQAVwG+CnzazPrG+PySkawV3n9GQyAMY+nz7mple+V5LFISLhxkmqahfBnLNpJtih9n76uUyBbj3/vsvRAiYiBqgw+DHOLAZyB0C0BFCCqSkBIG8j+EmWwP+Nq3trK9wyslOFZckWzrlJbW6CIHBWIu2yGlLTi+OYNgML25po/UbR36cGXCMAgI1ivZrukMgwnAo6ngLwzCgNnSuiFXcFUJQtnq/mHfEAywircrheFhv95wRjYiayHy4AIEMfaGoxitJSYFRMIACLsrtoomF/Zdx7KMrwkGBO2PgcLIXNhOx/RYaIKx9liZwH1trABhGPqhCIZBC4roCGOGsymWZiiiA4whz6a6aKIyJRaKMEY4mwqITTljbGOv+UqijeMDKEcTGfiO2ILfS1mmLD9byHYidJwfJmAsiMEYN7lWYlBWOmGMqVmGoydRqCWGoMlRWZ9KpD++UTiZDoRi3hHjSdJ56QTOMmKLhZHh75sUnBiLzmtZGDCXxKaRn4rf/03s+Je4Kt7JQlacbxjRShkIUpzz2BnRrCrA11nIksfNrOtqDYStoxeFZbmUz9ZhVU+NQHL32bLMa15c+imzkBnPrPqF0gTkiceoV/2oBILBfMxj1KvG+eDul7grloW8pArIA4+NFT1UAQl5bKy5rdEZkME9NUQwUSxaCAOxq2kRyJTHxK7bKgIJeExouSwGYlmQB/oc0Ekp8HkMaAJhC2ELYZWJgdDSNwZC1GXd8VjQcll8hZAYkNihY1Zd4rlzEcgfh445bFs9IVedjmdZhtX2WYuFY+547yqQedMzInjXvnP3l7kYQzIt8RG7sAAC7pvdKVgRKQnsBHRq5/gEJfLcXwK6F7ngd+JJp3VNRM7UT5yPWHZXUvmgHvOQWFVcnPYyEGJA9jwmdnOQf7MsDuwkdAvlN/xcQEnYbVnTMauF4pfM5Vn9a1vM1DP94rGxFz/OYkgullAqRTEEnZUKKVtcZCvpV5uz5LDEQsA6Do51Kh/7QseO/azinF+Svh/zQYa4XmW7kcd8nzV4j587cSK1Kv+H20tQ17yhD9QKmCn3odihHeGOvLTsw4JwH0rDgqizEo/mNRKXC5jlVVpCtvISLhaWp5gobg1/vw/FVfV8m66pUwyOqgXJKN5R81z1j1ogaCUbYp355voySd22Fo1FMHEVGPwwlauJsBB3qxBDSBXw9BqKKjfeBoSrwI+EzrAAa8+3mr57tEqFvDZVuBYKZxoU358ROtNu68qtEiyLHmHiWiuVG+XASo5EOvflRquejcTPKcH42hKpzRdVi/FT3BkBAuQeTxYAMCW4ntV6h4Qu21VAus8buVyYAOpwWVmQ3zi0eGdbG+MbuuQsBaxkzmNeC0N5dnrppmAMRSOMi4EwFL0wtABhKPpgdArqFYH+kVg2bysLv3gMdG9OfM1bdtclfc+X7O5pDAhCgeRsKDtGa90pWpvLKrgvWI2dyD9/XjkM6N+9ThhGLKRgLSG6sOCKQBzRKiITP270KVw4aLx28Yq+1vVYAf2YmILRq2A5HKbHqZta1+0b5TqYwCEw1wuiwmJg69QDMQgnPC4rIAQROJC/QP1zW3uXQHyA24XeZXywetuQIGg5ACW7yGQylzkihL1tCKSBFN0aQgE4d2g9YYefitAKPjGZi+quxzOQbrCa9k1PdCdtfeivAAMAhjNuqHfE7vYAAAAASUVORK5CYII=';
|
|
23
|
+
case 'warn':
|
|
24
|
+
return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABHFJREFUeNrsnY1V2zAUhW2xgDdomKDOBu4GdAMzQcMEhglMJwgb0A1gA8IEZIO2A1Aq0WeapCm2/p7ek989RydAID++udL3JNkUhUgkEolEoixUcn7xv56fK31TQ6vgx/e6bdTJyQ+xF8+IWre1bi/vtFvdGjla8c3oR4w4ZkwlXVac7ukOuidbbXT7xKEbU4zCcetoRgF/d8chKYpJOi71je94YEzppMvyN2Ohbx52KMpXS911bSQh7uoCmmHUS0Lc09HAQB5an3VKvokh9obcBRg7jmmrDTmVLsvOjDaSGUYLAAVJiEXNYQbyRcSnMTXJKbXahGpCVpHNKAAUekkIPuaywmCKCekQzSCHwSWxdMTC3DGZea57MQQPc9lgsCJkRpvIjAGDV5KQfUOeEMiKPAYrImZcJjZjwOBu9gmBIvAJmazek0nJds4J6T3MMPWDmSgsh2a+L/5sdHDVupirYLPCi2Nbjzz22uOxm1l2WR6Ya7b5LCM+fjIMVgnNOPPA3K+Bf+8YBrezSogP5sJYMfV5XjhhsEpkBibmuk4cGtBYZZ+QEJhrmRDf6RhUDE6REOzZ3BBYnmeXBWsdq4KXzjAxGDshXIuuPjtD4FPWMDWkxsJgJemYnhKMvcEKKR0YmxZiCwWDFYIZJKa1A+kLgAnrhHDD3LGUdGwNYYq5Y2pjYnDshOS6ttCxM4Q55o6piYXBMRPSF3mri4HBKlI6zKenztyQKOOjimBGNYN0RMPgGAlZZYS56BisAqdjkVERaIPBNdWE9MU81ZMzBDD3bKaGNLBpg1RC5pqOoO9fBUrHHDB3FINDnEiqAphRSTr2MLhKnRDqmFshP5fXh7P0TIfB3AdsQ5A2yvnI+URS34QkWeuYSjQJN0336AlJeIKmUezN1iHkdCKp8kxHKtVTTkco0k7/O60FKcd0tEX6tQ4zZfFw2H2Z783Pzf0EMNh6Nrh0MAPjOiQu2hJ8TdY76F0SQnVLD8XXZD0bXFqmIwnmZqDJO+htE9KJGXEHeJsCq4Z0iCJisE1CZL4KoVhUE9Phc4Km6G/tNIri5URDUl+HJBeNYrCaYMalmBEUg1fOCSF4HZLsMXgsIb2YgTvAl4K5tDBYMcfcGFcDwlI3OSGAubfE39CNNuD8nYSb6rgl/h7O9Xu4mWIIdczlsEA1RWZgX+5isGKKuVeBfy+VFocYXHLEXAabHGyLxeWAwWoGmEt9gN9bMyl3PkkLSAd5ZZaQQa9bh9QYhlHU1PP7mP1jye4tITB2fGf04iddE5EBZR3qdEgIt9MIFgy2AbmoUTv4xU3DNqD2sKglsg3IRR9LRlXtHHSvdlhYRIEg4fanHAoisAJfbORYkNAjV+zNVUsFla8ZQ27keCQe0HWlznLqJFO9riC+TZ3AbOOVHJckuh6Wc8v/VLhSk+Bpb+XznwUquPNajhNaMs6P1SGHplyYPq3gsVmA5QAOY8bF4R2j6wow2JvJxw+FXK3BR6bWewSa2srhEIlEIpEoc/0WYADugLIhrdiXxQAAAABJRU5ErkJggg==';
|
|
25
|
+
default:
|
|
26
|
+
return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABRpJREFUeNrsnYtx4jAQhi1XQCo4p4JABTgVhKvgSAUhFZBUwHUAV0FIBZgK4lQAVwG+CnzazPrG+PySkawV3n9GQyAMY+nz7mple+V5LFISLhxkmqahfBnLNpJtih9n76uUyBbj3/vsvRAiYiBqgw+DHOLAZyB0C0BFCCqSkBIG8j+EmWwP+Nq3trK9wyslOFZckWzrlJbW6CIHBWIu2yGlLTi+OYNgML25po/UbR36cGXCMAgI1ivZrukMgwnAo6ngLwzCgNnSuiFXcFUJQtnq/mHfEAywircrheFhv95wRjYiayHy4AIEMfaGoxitJSYFRMIACLsrtoomF/Zdx7KMrwkGBO2PgcLIXNhOx/RYaIKx9liZwH1trABhGPqhCIZBC4roCGOGsymWZiiiA4whz6a6aKIyJRaKMEY4mwqITTljbGOv+UqijeMDKEcTGfiO2ILfS1mmLD9byHYidJwfJmAsiMEYN7lWYlBWOmGMqVmGoydRqCWGoMlRWZ9KpD++UTiZDoRi3hHjSdJ56QTOMmKLhZHh75sUnBiLzmtZGDCXxKaRn4rf/03s+Je4Kt7JQlacbxjRShkIUpzz2BnRrCrA11nIksfNrOtqDYStoxeFZbmUz9ZhVU+NQHL32bLMa15c+imzkBnPrPqF0gTkiceoV/2oBILBfMxj1KvG+eDul7grloW8pArIA4+NFT1UAQl5bKy5rdEZkME9NUQwUSxaCAOxq2kRyJTHxK7bKgIJeExouSwGYlmQB/oc0Ekp8HkMaAJhC2ELYZWJgdDSNwZC1GXd8VjQcll8hZAYkNihY1Zd4rlzEcgfh445bFs9IVedjmdZhtX2WYuFY+547yqQedMzInjXvnP3l7kYQzIt8RG7sAAC7pvdKVgRKQnsBHRq5/gEJfLcXwK6F7ngd+JJp3VNRM7UT5yPWHZXUvmgHvOQWFVcnPYyEGJA9jwmdnOQf7MsDuwkdAvlN/xcQEnYbVnTMauF4pfM5Vn9a1vM1DP94rGxFz/OYkgullAqRTEEnZUKKVtcZCvpV5uz5LDEQsA6Do51Kh/7QseO/azinF+Svh/zQYa4XmW7kcd8nzV4j587cSK1Kv+H20tQ17yhD9QKmCn3odihHeGOvLTsw4JwH0rDgqizEo/mNRKXC5jlVVpCtvISLhaWp5gobg1/vw/FVfV8m66pUwyOqgXJKN5R81z1j1ogaCUbYp355voySd22Fo1FMHEVGPwwlauJsBB3qxBDSBXw9BqKKjfeBoSrwI+EzrAAa8+3mr57tEqFvDZVuBYKZxoU358ROtNu68qtEiyLHmHiWiuVG+XASo5EOvflRquejcTPKcH42hKpzRdVi/FT3BkBAuQeTxYAMCW4ntV6h4Qu21VAus8buVyYAOpwWVmQ3zi0eGdbG+MbuuQsBaxkzmNeC0N5dnrppmAMRSOMi4EwFL0wtABhKPpgdArqFYH+kVg2bysLv3gMdG9OfM1bdtclfc+X7O5pDAhCgeRsKDtGa90pWpvLKrgvWI2dyD9/XjkM6N+9ThhGLKRgLSG6sOCKQBzRKiITP270KVw4aLx28Yq+1vVYAf2YmILRq2A5HKbHqZta1+0b5TqYwCEw1wuiwmJg69QDMQgnPC4rIAQROJC/QP1zW3uXQHyA24XeZXywetuQIGg5ACW7yGQylzkihL1tCKSBFN0aQgE4d2g9YYefitAKPjGZi+quxzOQbrCa9k1PdCdtfeivAAMAhjNuqHfE7vYAAAAASUVORK5CYII=';
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: KeToast, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
30
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.6", type: KeToast, isStandalone: true, selector: "ke-toast", inputs: { toast: "toast" }, outputs: { close: "close" }, ngImport: i0, template: "<div class=\"ke-toast\" [class]=\"toast.type\">\n\n <div class=\"icon\">\n <img [src]=\"toast.icon || getIcon(toast.type)\" [alt]=\"toast.type\" width=\"24\" height=\"24\" />\n </div>\n\n <div class=\"content\">\n\n @if (toast.title) {\n <div class=\"title\">\n {{ toast.title }}\n </div>\n }\n\n <div class=\"message\">\n {{ toast.message }}\n </div>\n\n @if (toast.action) {\n <button class=\"action\" (click)=\"onAction()\">\n {{ toast.action }}\n </button>\n }\n\n </div>\n\n @if (toast.closable) {\n <button class=\"close\" (click)=\"onClose()\">\n \u2715\n </button>\n }\n\n @if (toast.progressBar) {\n <div class=\"progress\"></div>\n }\n\n</div>", styles: [":host{display:block}.ke-toast{position:relative;display:flex;align-items:flex-start;gap:12px;width:360px;padding:16px;border-radius:12px;overflow:hidden;background:#fff;color:#222;box-shadow:0 10px 30px #00000014;border-left:4px solid transparent;animation:toastEnter .25s ease}.icon{flex-shrink:0;width:26px;height:26px;border-radius:50%;display:flex;align-items:center;justify-content:center}.icon img,.icon i{color:#fff;font-size:14px}.content{flex:1}.title{font-size:15px;font-weight:600;margin-bottom:4px}.message{font-size:14px;line-height:1.5;color:#555}.action{margin-top:6px;border:none;background:transparent;cursor:pointer;color:#1976d2;font-weight:600;padding:0}.close{flex-shrink:0;border:none;background:transparent;cursor:pointer;font-size:18px;color:#999}.progress{position:absolute;left:0;bottom:0;width:100%;height:3px;overflow:hidden}.progress:after{content:\"\";display:block;height:100%;width:100%;background:currentColor;animation:progress linear forwards;animation-duration:4s}.success{border-left-color:#16a34a;background:#eafaf0}.success .title,.success .close,.progress{color:#16a34a}.success .icon{background:#16a34a}.error{border-left-color:#dc2626;background:#fdecec}.error .title,.error .close,.error .progress{color:#dc2626}.error .icon{background:#dc2626}.info{border-left-color:#2563eb;background:#eaf1fd}.info .title,.info .close,.info .progress{color:#2563eb}.info .icon{background:#2563eb}.warning{border-left-color:#ea580c;background:#fef3e6}.warning .title,.warning .close,.warning .progress{color:#ea580c}.warning .icon{background:#ea580c}@keyframes toastEnter{0%{opacity:0;transform:translateY(-15px)}to{opacity:1;transform:translateY(0)}}@keyframes progress{0%{transform:scaleX(1);transform-origin:left}to{transform:scaleX(0);transform-origin:left}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }] });
|
|
31
|
+
}
|
|
32
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: KeToast, decorators: [{
|
|
33
|
+
type: Component,
|
|
34
|
+
args: [{ selector: 'ke-toast', imports: [CommonModule], template: "<div class=\"ke-toast\" [class]=\"toast.type\">\n\n <div class=\"icon\">\n <img [src]=\"toast.icon || getIcon(toast.type)\" [alt]=\"toast.type\" width=\"24\" height=\"24\" />\n </div>\n\n <div class=\"content\">\n\n @if (toast.title) {\n <div class=\"title\">\n {{ toast.title }}\n </div>\n }\n\n <div class=\"message\">\n {{ toast.message }}\n </div>\n\n @if (toast.action) {\n <button class=\"action\" (click)=\"onAction()\">\n {{ toast.action }}\n </button>\n }\n\n </div>\n\n @if (toast.closable) {\n <button class=\"close\" (click)=\"onClose()\">\n \u2715\n </button>\n }\n\n @if (toast.progressBar) {\n <div class=\"progress\"></div>\n }\n\n</div>", styles: [":host{display:block}.ke-toast{position:relative;display:flex;align-items:flex-start;gap:12px;width:360px;padding:16px;border-radius:12px;overflow:hidden;background:#fff;color:#222;box-shadow:0 10px 30px #00000014;border-left:4px solid transparent;animation:toastEnter .25s ease}.icon{flex-shrink:0;width:26px;height:26px;border-radius:50%;display:flex;align-items:center;justify-content:center}.icon img,.icon i{color:#fff;font-size:14px}.content{flex:1}.title{font-size:15px;font-weight:600;margin-bottom:4px}.message{font-size:14px;line-height:1.5;color:#555}.action{margin-top:6px;border:none;background:transparent;cursor:pointer;color:#1976d2;font-weight:600;padding:0}.close{flex-shrink:0;border:none;background:transparent;cursor:pointer;font-size:18px;color:#999}.progress{position:absolute;left:0;bottom:0;width:100%;height:3px;overflow:hidden}.progress:after{content:\"\";display:block;height:100%;width:100%;background:currentColor;animation:progress linear forwards;animation-duration:4s}.success{border-left-color:#16a34a;background:#eafaf0}.success .title,.success .close,.progress{color:#16a34a}.success .icon{background:#16a34a}.error{border-left-color:#dc2626;background:#fdecec}.error .title,.error .close,.error .progress{color:#dc2626}.error .icon{background:#dc2626}.info{border-left-color:#2563eb;background:#eaf1fd}.info .title,.info .close,.info .progress{color:#2563eb}.info .icon{background:#2563eb}.warning{border-left-color:#ea580c;background:#fef3e6}.warning .title,.warning .close,.warning .progress{color:#ea580c}.warning .icon{background:#ea580c}@keyframes toastEnter{0%{opacity:0;transform:translateY(-15px)}to{opacity:1;transform:translateY(0)}}@keyframes progress{0%{transform:scaleX(1);transform-origin:left}to{transform:scaleX(0);transform-origin:left}}\n"] }]
|
|
35
|
+
}], propDecorators: { toast: [{
|
|
36
|
+
type: Input,
|
|
37
|
+
args: [{ required: true }]
|
|
38
|
+
}], close: [{
|
|
39
|
+
type: Output
|
|
40
|
+
}] } });
|
|
41
|
+
|
|
42
|
+
const DEFAULT_TOAST_CONFIG = {
|
|
43
|
+
duration: 4000,
|
|
44
|
+
position: 'top-right',
|
|
45
|
+
showClose: true,
|
|
46
|
+
progressBar: true,
|
|
47
|
+
pauseOnHover: true,
|
|
48
|
+
max: 5,
|
|
49
|
+
preventDuplicates: true,
|
|
50
|
+
queue: true,
|
|
51
|
+
rtl: false,
|
|
52
|
+
theme: 'light',
|
|
53
|
+
animation: 'slide',
|
|
54
|
+
showIcon: true,
|
|
55
|
+
newestOnTop: true,
|
|
56
|
+
type: 'info',
|
|
57
|
+
};
|
|
58
|
+
const TOAST_CONFIG = new InjectionToken('TOAST_CONFIG', {
|
|
59
|
+
factory: () => DEFAULT_TOAST_CONFIG,
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Generates a unique toast id.
|
|
64
|
+
*/
|
|
65
|
+
function generateToastId() {
|
|
66
|
+
if (typeof crypto !== 'undefined' && crypto.randomUUID) {
|
|
67
|
+
return crypto.randomUUID();
|
|
68
|
+
}
|
|
69
|
+
return Date.now().toString(36) + Math.random().toString(36).substring(2, 10);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
class Timer {
|
|
73
|
+
duration;
|
|
74
|
+
callback;
|
|
75
|
+
timeoutId;
|
|
76
|
+
startTime = 0;
|
|
77
|
+
remaining;
|
|
78
|
+
constructor(duration, callback) {
|
|
79
|
+
this.duration = duration;
|
|
80
|
+
this.callback = callback;
|
|
81
|
+
this.remaining = duration;
|
|
82
|
+
}
|
|
83
|
+
start() {
|
|
84
|
+
this.startTime = Date.now();
|
|
85
|
+
this.timeoutId = setTimeout(() => {
|
|
86
|
+
this.callback();
|
|
87
|
+
}, this.remaining);
|
|
88
|
+
}
|
|
89
|
+
pause() {
|
|
90
|
+
if (!this.timeoutId) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
clearTimeout(this.timeoutId);
|
|
94
|
+
this.remaining -= Date.now() - this.startTime;
|
|
95
|
+
}
|
|
96
|
+
resume() {
|
|
97
|
+
if (this.remaining <= 0) {
|
|
98
|
+
this.callback();
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
this.start();
|
|
102
|
+
}
|
|
103
|
+
stop() {
|
|
104
|
+
if (this.timeoutId) {
|
|
105
|
+
clearTimeout(this.timeoutId);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
class ToastService {
|
|
111
|
+
/**
|
|
112
|
+
* Toast Store
|
|
113
|
+
*/
|
|
114
|
+
_toasts = signal([], /* @ts-ignore */
|
|
115
|
+
...(ngDevMode ? [{ debugName: "_toasts" }] : /* istanbul ignore next */ []));
|
|
116
|
+
/**
|
|
117
|
+
* Readonly Signal
|
|
118
|
+
*/
|
|
119
|
+
toasts = this._toasts.asReadonly();
|
|
120
|
+
/**
|
|
121
|
+
* Waiting Queue
|
|
122
|
+
*/
|
|
123
|
+
queue = [];
|
|
124
|
+
/**
|
|
125
|
+
* Active Timers
|
|
126
|
+
*/
|
|
127
|
+
timers = new Map();
|
|
128
|
+
/**
|
|
129
|
+
* Final Config
|
|
130
|
+
*/
|
|
131
|
+
config;
|
|
132
|
+
constructor(config) {
|
|
133
|
+
this.config = {
|
|
134
|
+
...DEFAULT_TOAST_CONFIG,
|
|
135
|
+
...config,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
// ============================================================
|
|
139
|
+
// Public APIs
|
|
140
|
+
// ============================================================
|
|
141
|
+
success(message, title) {
|
|
142
|
+
this.create('success', message, title);
|
|
143
|
+
}
|
|
144
|
+
error(message, title) {
|
|
145
|
+
this.create('error', message, title);
|
|
146
|
+
}
|
|
147
|
+
warning(message, title) {
|
|
148
|
+
this.create('warning', message, title);
|
|
149
|
+
}
|
|
150
|
+
info(message, title) {
|
|
151
|
+
this.create('info', message, title);
|
|
152
|
+
}
|
|
153
|
+
remove(id) {
|
|
154
|
+
this.timers.get(id)?.stop();
|
|
155
|
+
this.timers.delete(id);
|
|
156
|
+
this._toasts.update((toasts) => toasts.filter((t) => t.id !== id));
|
|
157
|
+
this.showNextFromQueue();
|
|
158
|
+
}
|
|
159
|
+
clear() {
|
|
160
|
+
this.timers.forEach((timer) => timer.stop());
|
|
161
|
+
this.timers.clear();
|
|
162
|
+
this.queue.length = 0;
|
|
163
|
+
this._toasts.set([]);
|
|
164
|
+
}
|
|
165
|
+
pause(id) {
|
|
166
|
+
this.timers.get(id)?.pause();
|
|
167
|
+
}
|
|
168
|
+
resume(id) {
|
|
169
|
+
this.timers.get(id)?.resume();
|
|
170
|
+
}
|
|
171
|
+
// ============================================================
|
|
172
|
+
// Private Methods
|
|
173
|
+
// ============================================================
|
|
174
|
+
create(type, message, title) {
|
|
175
|
+
if (this.config.preventDuplicates && this.hasDuplicate(message)) {
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
const toast = {
|
|
179
|
+
id: generateToastId(),
|
|
180
|
+
title,
|
|
181
|
+
message,
|
|
182
|
+
type,
|
|
183
|
+
duration: this.config.duration,
|
|
184
|
+
visible: true,
|
|
185
|
+
createdAt: Date.now(),
|
|
186
|
+
position: this.config.position,
|
|
187
|
+
progressBar: this.config.progressBar,
|
|
188
|
+
closable: this.config.showClose,
|
|
189
|
+
pauseOnHover: this.config.pauseOnHover,
|
|
190
|
+
icon: undefined,
|
|
191
|
+
action: undefined,
|
|
192
|
+
actionHandler: undefined,
|
|
193
|
+
cssClass: undefined,
|
|
194
|
+
data: undefined,
|
|
195
|
+
};
|
|
196
|
+
const active = this._toasts();
|
|
197
|
+
if (active.length >= this.config.max && this.config.queue) {
|
|
198
|
+
this.queue.push(toast);
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
const updated = this.config.newestOnTop ? [toast, ...active] : [...active, toast];
|
|
202
|
+
this._toasts.set(updated);
|
|
203
|
+
this.autoClose(toast);
|
|
204
|
+
}
|
|
205
|
+
autoClose(toast) {
|
|
206
|
+
if (toast.duration <= 0) {
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
const timer = new Timer(toast.duration, () => this.remove(toast.id));
|
|
210
|
+
this.timers.set(toast.id, timer);
|
|
211
|
+
timer.start();
|
|
212
|
+
}
|
|
213
|
+
hasDuplicate(message) {
|
|
214
|
+
return this._toasts().some((toast) => toast.message === message);
|
|
215
|
+
}
|
|
216
|
+
showNextFromQueue() {
|
|
217
|
+
if (!this.queue.length) {
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
const next = this.queue.shift();
|
|
221
|
+
if (!next) {
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
this._toasts.update((toasts) => this.config.newestOnTop ? [next, ...toasts] : [...toasts, next]);
|
|
225
|
+
this.autoClose(next);
|
|
226
|
+
}
|
|
227
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: ToastService, deps: [{ token: TOAST_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
228
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: ToastService, providedIn: 'root' });
|
|
229
|
+
}
|
|
230
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: ToastService, decorators: [{
|
|
231
|
+
type: Injectable,
|
|
232
|
+
args: [{
|
|
233
|
+
providedIn: 'root',
|
|
234
|
+
}]
|
|
235
|
+
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
236
|
+
type: Inject,
|
|
237
|
+
args: [TOAST_CONFIG]
|
|
238
|
+
}] }] });
|
|
239
|
+
|
|
240
|
+
class KeToaster {
|
|
241
|
+
toastService = inject(ToastService);
|
|
242
|
+
toasts = this.toastService.toasts;
|
|
243
|
+
remove(id) {
|
|
244
|
+
this.toastService.remove(id);
|
|
245
|
+
}
|
|
246
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: KeToaster, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
247
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.6", type: KeToaster, isStandalone: true, selector: "ke-toaster", ngImport: i0, template: "<div class=\"ke-toast-container\">\n\n @for (toast of toasts(); track toast.id) {\n\n <ke-toast [toast]=\"toast\" (close)=\"remove($event)\">\n </ke-toast>\n\n }\n\n</div>", styles: [":host{position:fixed;z-index:9999;inset:0;pointer-events:none}.ke-toast-container{position:fixed;top:24px;right:24px;display:flex;flex-direction:column;gap:12px;pointer-events:none}ke-toast{pointer-events:auto}@media(max-width:768px){.ke-toast-container{left:16px;right:16px;top:16px}ke-toast{width:100%}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: KeToast, selector: "ke-toast", inputs: ["toast"], outputs: ["close"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
248
|
+
}
|
|
249
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: KeToaster, decorators: [{
|
|
250
|
+
type: Component,
|
|
251
|
+
args: [{ selector: 'ke-toaster', imports: [CommonModule, KeToast], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"ke-toast-container\">\n\n @for (toast of toasts(); track toast.id) {\n\n <ke-toast [toast]=\"toast\" (close)=\"remove($event)\">\n </ke-toast>\n\n }\n\n</div>", styles: [":host{position:fixed;z-index:9999;inset:0;pointer-events:none}.ke-toast-container{position:fixed;top:24px;right:24px;display:flex;flex-direction:column;gap:12px;pointer-events:none}ke-toast{pointer-events:auto}@media(max-width:768px){.ke-toast-container{left:16px;right:16px;top:16px}ke-toast{width:100%}}\n"] }]
|
|
252
|
+
}] });
|
|
253
|
+
|
|
254
|
+
function provideToast(config = {}) {
|
|
255
|
+
return makeEnvironmentProviders([
|
|
256
|
+
{
|
|
257
|
+
provide: TOAST_CONFIG,
|
|
258
|
+
useValue: {
|
|
259
|
+
...DEFAULT_TOAST_CONFIG,
|
|
260
|
+
...config,
|
|
261
|
+
},
|
|
262
|
+
},
|
|
263
|
+
]);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/*
|
|
267
|
+
* Components
|
|
268
|
+
*/
|
|
269
|
+
|
|
270
|
+
/*
|
|
271
|
+
* Public API Surface of @kudoengineer/toast
|
|
272
|
+
*/
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Generated bundle index. Do not edit.
|
|
276
|
+
*/
|
|
277
|
+
|
|
278
|
+
export { DEFAULT_TOAST_CONFIG, KeToast, KeToaster, TOAST_CONFIG, Timer, ToastService, generateToastId, provideToast };
|
|
279
|
+
//# sourceMappingURL=kudoengineer-toast.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kudoengineer-toast.mjs","sources":["../../../projects/toast/src/lib/components/ke-toast/ke-toast.ts","../../../projects/toast/src/lib/components/ke-toast/ke-toast.html","../../../projects/toast/src/lib/tokens/toast-config.token.ts","../../../projects/toast/src/lib/utils/id.ts","../../../projects/toast/src/lib/utils/timer.ts","../../../projects/toast/src/lib/services/toast.service.ts","../../../projects/toast/src/lib/components/ke-toaster/ke-toaster.ts","../../../projects/toast/src/lib/components/ke-toaster/ke-toaster.html","../../../projects/toast/src/lib/providers/provide-toast.ts","../../../projects/toast/src/lib/toast.ts","../../../projects/toast/src/public-api.ts","../../../projects/toast/src/kudoengineer-toast.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { Toast } from '../../models/toast.model';\n\n@Component({\n selector: 'ke-toast',\n imports: [CommonModule],\n templateUrl: './ke-toast.html',\n styleUrl: './ke-toast.scss',\n})\nexport class KeToast {\n @Input({ required: true })\n toast!: Toast;\n\n @Output()\n close = new EventEmitter<string>();\n type: any;\n\n onClose(): void {\n this.close.emit(this.toast.id);\n }\n\n onAction(): void {\n this.toast.actionHandler?.();\n }\n\n getIcon(type: string): string {\n switch (type) {\n case 'success':\n return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABXdJREFUeNrsnY112jAQxy2/DkAmKJkgMEHoBIUJAhM0mSCvE5BOAJ0gZAKcCXAmgEwAncDVkYNnwMayfbI+fPeeXtrkBcv65X+nk+RzELBZZcKFTiZJMpBferJ1ZLvHb3exXbNYtp1sG9k+8f+xEGLDQNQHHwZ9iAPfw0ZtACmS7V22hU2AhCUQugjhQROAQEFJb7LNbVZPEyDGsr0mdtkS+tUmCB3ZHmVbJ3bb2nswCGKbuGX+gZE3NHRAEUW2wtmeu0EdZ0wzDNi+2Fy2Jxn8d04BAVUgjI6H3hdgTCSUBfUHh5qCNoB49RRGgPcFs8Op1QrBfOLVUC5hyiCHGVHlL4IQBkBYeqyKIhf2Q0KJrXBZOC1ctRTGwYWtKKbHggjGLGA7GAT7uREgDIMeimAYdkERFWEMcTbFRgxFVIDR5tlUFYPZV6QFCC6FrBmGvilx2WkvK6PalHiGf8x0QHCZoMfjW8lg3JSWWYQijAGqg62ejYoWJIUCjA5m4V0eT5J4cntt6V7FZT0zDNJ48lxZITjFXfE4kls/b9ZVpJApj50Wm5Z2WRjIBy0dMMiuJ+jzddggb39eXAGybCmQ43IHTmiWmqb7kbzODyWFtFgdJ2tPOBuCQYubUkmey/rVdhgNQXkodFm4L75mGJn5mA73dZPOS0JWh9oSuUaljIsUsm5RIlh6v0KDUuB5lX6mQjARZBjNKqWHYSLTZT0wDGUoE8L+DPOADBiGMhTKWPLzAgjKpscwlGMJ5QGPwWEDK60QhlEOxpg6UTwHcs8wjME4CqINCnEBxlEQInWxbeDfAQZXYIDtZF9vRCrZ2TIMYzAOdhsadFcwWBuGcWLd0ACIw8ExGLRbBMMwvqzzreGE8OIUH4CRNx4Q3bjLMPaeKjSgjDgj650QKMV1GGB3oWkYRFB8gLF3WaENMGpC8QVGkE4Mv5uGURGKVzDSnVlqKEWxxf2VygNU8Pljwvuf2VKJ6KAQHfnApM4SdYFS/FRGymV9Un8wRdmJHCjewkgD0eEGH4nApqF4DUMrEGlTKj+PUPq+w5AWh6nZkA6bEUKJPYcB9u8AJNZ4kZktFdkshwEW6VaINVAcgLHnkN6gShq4IFlQ9hAGuGWRDupxA9dsXCmuwDiMf9NAGoXiEIxMIB8NXlw7FMdggL2fA4ka7oA2KA7COI6/OLsREydPSAO9ozA2uJ19kakvDHSGTCmOwjjxTudA3gx1qDYUh2GcjHvWAzsmD8xVcl+Ow9gfkMtTiCm3VVkpjsO4GO8sIH8Nd1AZigcwwP6cZOs5Nwr1TUwfvr7qvjyBcfJ8YZ5CLqjZphRPYGSO87XSGrY8jXuiFI9gHHMPFYWA/bak4zN8M0/HIxi541tUL6tNz6wbV0eRQvbugsdOjxvO+8FVIFgAeMHjR5t3XCusrFoEk4snE2XlQd0imPjLTzyWJFb4MjHlUuPwRs7Ar7etmXBVo0IBlADC9XtrzKqCr4N+had7lE8u4oeNAv1HhnyMGyPV9x6WOkqKpwc5npSPG8oHSEqf7cVlDIaiZi/aX+iSiik+LWPosDkeEg8aAcJQ6GHUBsJQaGGQAGEodDAqBfWcQD/hQL8P4LUXY6lfTgwqgcr/bVv3IjvsR/4+dXwUGlxYG95XtcGkj+ygOvkzhtg5qGs79xwGbEv0iauT0ivkTC1DVItPLmyHLkrLPpHWWifYadiqfPElcAdf+xnub9pBXWBYwk/ctFm6HLhXBi8xsai2iAqIdrxMExUzxSI1NtkW+9UN2mqQvxh2Z1tUg/EdUWEhHBgUKCoMX3X+lcJ0NZLt3aYgLSxXDkyXB5hk3iGgKj49wunqB/47Vt3BYyAlJgcK0+7Itfv6L8AA0mPYDSVaymoAAAAASUVORK5CYII=';\n case 'error':\n return 'data:image/png;base64,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';\n case 'info':\n return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABRpJREFUeNrsnYtx4jAQhi1XQCo4p4JABTgVhKvgSAUhFZBUwHUAV0FIBZgK4lQAVwG+CnzazPrG+PySkawV3n9GQyAMY+nz7mple+V5LFISLhxkmqahfBnLNpJtih9n76uUyBbj3/vsvRAiYiBqgw+DHOLAZyB0C0BFCCqSkBIG8j+EmWwP+Nq3trK9wyslOFZckWzrlJbW6CIHBWIu2yGlLTi+OYNgML25po/UbR36cGXCMAgI1ivZrukMgwnAo6ngLwzCgNnSuiFXcFUJQtnq/mHfEAywircrheFhv95wRjYiayHy4AIEMfaGoxitJSYFRMIACLsrtoomF/Zdx7KMrwkGBO2PgcLIXNhOx/RYaIKx9liZwH1trABhGPqhCIZBC4roCGOGsymWZiiiA4whz6a6aKIyJRaKMEY4mwqITTljbGOv+UqijeMDKEcTGfiO2ILfS1mmLD9byHYidJwfJmAsiMEYN7lWYlBWOmGMqVmGoydRqCWGoMlRWZ9KpD++UTiZDoRi3hHjSdJ56QTOMmKLhZHh75sUnBiLzmtZGDCXxKaRn4rf/03s+Je4Kt7JQlacbxjRShkIUpzz2BnRrCrA11nIksfNrOtqDYStoxeFZbmUz9ZhVU+NQHL32bLMa15c+imzkBnPrPqF0gTkiceoV/2oBILBfMxj1KvG+eDul7grloW8pArIA4+NFT1UAQl5bKy5rdEZkME9NUQwUSxaCAOxq2kRyJTHxK7bKgIJeExouSwGYlmQB/oc0Ekp8HkMaAJhC2ELYZWJgdDSNwZC1GXd8VjQcll8hZAYkNihY1Zd4rlzEcgfh445bFs9IVedjmdZhtX2WYuFY+547yqQedMzInjXvnP3l7kYQzIt8RG7sAAC7pvdKVgRKQnsBHRq5/gEJfLcXwK6F7ngd+JJp3VNRM7UT5yPWHZXUvmgHvOQWFVcnPYyEGJA9jwmdnOQf7MsDuwkdAvlN/xcQEnYbVnTMauF4pfM5Vn9a1vM1DP94rGxFz/OYkgullAqRTEEnZUKKVtcZCvpV5uz5LDEQsA6Do51Kh/7QseO/azinF+Svh/zQYa4XmW7kcd8nzV4j587cSK1Kv+H20tQ17yhD9QKmCn3odihHeGOvLTsw4JwH0rDgqizEo/mNRKXC5jlVVpCtvISLhaWp5gobg1/vw/FVfV8m66pUwyOqgXJKN5R81z1j1ogaCUbYp355voySd22Fo1FMHEVGPwwlauJsBB3qxBDSBXw9BqKKjfeBoSrwI+EzrAAa8+3mr57tEqFvDZVuBYKZxoU358ROtNu68qtEiyLHmHiWiuVG+XASo5EOvflRquejcTPKcH42hKpzRdVi/FT3BkBAuQeTxYAMCW4ntV6h4Qu21VAus8buVyYAOpwWVmQ3zi0eGdbG+MbuuQsBaxkzmNeC0N5dnrppmAMRSOMi4EwFL0wtABhKPpgdArqFYH+kVg2bysLv3gMdG9OfM1bdtclfc+X7O5pDAhCgeRsKDtGa90pWpvLKrgvWI2dyD9/XjkM6N+9ThhGLKRgLSG6sOCKQBzRKiITP270KVw4aLx28Yq+1vVYAf2YmILRq2A5HKbHqZta1+0b5TqYwCEw1wuiwmJg69QDMQgnPC4rIAQROJC/QP1zW3uXQHyA24XeZXywetuQIGg5ACW7yGQylzkihL1tCKSBFN0aQgE4d2g9YYefitAKPjGZi+quxzOQbrCa9k1PdCdtfeivAAMAhjNuqHfE7vYAAAAASUVORK5CYII=';\n case 'warn':\n return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABHFJREFUeNrsnY1V2zAUhW2xgDdomKDOBu4GdAMzQcMEhglMJwgb0A1gA8IEZIO2A1Aq0WeapCm2/p7ek989RydAID++udL3JNkUhUgkEolEoixUcn7xv56fK31TQ6vgx/e6bdTJyQ+xF8+IWre1bi/vtFvdGjla8c3oR4w4ZkwlXVac7ukOuidbbXT7xKEbU4zCcetoRgF/d8chKYpJOi71je94YEzppMvyN2Ohbx52KMpXS911bSQh7uoCmmHUS0Lc09HAQB5an3VKvokh9obcBRg7jmmrDTmVLsvOjDaSGUYLAAVJiEXNYQbyRcSnMTXJKbXahGpCVpHNKAAUekkIPuaywmCKCekQzSCHwSWxdMTC3DGZea57MQQPc9lgsCJkRpvIjAGDV5KQfUOeEMiKPAYrImZcJjZjwOBu9gmBIvAJmazek0nJds4J6T3MMPWDmSgsh2a+L/5sdHDVupirYLPCi2Nbjzz22uOxm1l2WR6Ya7b5LCM+fjIMVgnNOPPA3K+Bf+8YBrezSogP5sJYMfV5XjhhsEpkBibmuk4cGtBYZZ+QEJhrmRDf6RhUDE6REOzZ3BBYnmeXBWsdq4KXzjAxGDshXIuuPjtD4FPWMDWkxsJgJemYnhKMvcEKKR0YmxZiCwWDFYIZJKa1A+kLgAnrhHDD3LGUdGwNYYq5Y2pjYnDshOS6ttCxM4Q55o6piYXBMRPSF3mri4HBKlI6zKenztyQKOOjimBGNYN0RMPgGAlZZYS56BisAqdjkVERaIPBNdWE9MU81ZMzBDD3bKaGNLBpg1RC5pqOoO9fBUrHHDB3FINDnEiqAphRSTr2MLhKnRDqmFshP5fXh7P0TIfB3AdsQ5A2yvnI+URS34QkWeuYSjQJN0336AlJeIKmUezN1iHkdCKp8kxHKtVTTkco0k7/O60FKcd0tEX6tQ4zZfFw2H2Z783Pzf0EMNh6Nrh0MAPjOiQu2hJ8TdY76F0SQnVLD8XXZD0bXFqmIwnmZqDJO+htE9KJGXEHeJsCq4Z0iCJisE1CZL4KoVhUE9Phc4Km6G/tNIri5URDUl+HJBeNYrCaYMalmBEUg1fOCSF4HZLsMXgsIb2YgTvAl4K5tDBYMcfcGFcDwlI3OSGAubfE39CNNuD8nYSb6rgl/h7O9Xu4mWIIdczlsEA1RWZgX+5isGKKuVeBfy+VFocYXHLEXAabHGyLxeWAwWoGmEt9gN9bMyl3PkkLSAd5ZZaQQa9bh9QYhlHU1PP7mP1jye4tITB2fGf04iddE5EBZR3qdEgIt9MIFgy2AbmoUTv4xU3DNqD2sKglsg3IRR9LRlXtHHSvdlhYRIEg4fanHAoisAJfbORYkNAjV+zNVUsFla8ZQ27keCQe0HWlznLqJFO9riC+TZ3AbOOVHJckuh6Wc8v/VLhSk+Bpb+XznwUquPNajhNaMs6P1SGHplyYPq3gsVmA5QAOY8bF4R2j6wow2JvJxw+FXK3BR6bWewSa2srhEIlEIpEoc/0WYADugLIhrdiXxQAAAABJRU5ErkJggg==';\n default:\n return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABRpJREFUeNrsnYtx4jAQhi1XQCo4p4JABTgVhKvgSAUhFZBUwHUAV0FIBZgK4lQAVwG+CnzazPrG+PySkawV3n9GQyAMY+nz7mple+V5LFISLhxkmqahfBnLNpJtih9n76uUyBbj3/vsvRAiYiBqgw+DHOLAZyB0C0BFCCqSkBIG8j+EmWwP+Nq3trK9wyslOFZckWzrlJbW6CIHBWIu2yGlLTi+OYNgML25po/UbR36cGXCMAgI1ivZrukMgwnAo6ngLwzCgNnSuiFXcFUJQtnq/mHfEAywircrheFhv95wRjYiayHy4AIEMfaGoxitJSYFRMIACLsrtoomF/Zdx7KMrwkGBO2PgcLIXNhOx/RYaIKx9liZwH1trABhGPqhCIZBC4roCGOGsymWZiiiA4whz6a6aKIyJRaKMEY4mwqITTljbGOv+UqijeMDKEcTGfiO2ILfS1mmLD9byHYidJwfJmAsiMEYN7lWYlBWOmGMqVmGoydRqCWGoMlRWZ9KpD++UTiZDoRi3hHjSdJ56QTOMmKLhZHh75sUnBiLzmtZGDCXxKaRn4rf/03s+Je4Kt7JQlacbxjRShkIUpzz2BnRrCrA11nIksfNrOtqDYStoxeFZbmUz9ZhVU+NQHL32bLMa15c+imzkBnPrPqF0gTkiceoV/2oBILBfMxj1KvG+eDul7grloW8pArIA4+NFT1UAQl5bKy5rdEZkME9NUQwUSxaCAOxq2kRyJTHxK7bKgIJeExouSwGYlmQB/oc0Ekp8HkMaAJhC2ELYZWJgdDSNwZC1GXd8VjQcll8hZAYkNihY1Zd4rlzEcgfh445bFs9IVedjmdZhtX2WYuFY+547yqQedMzInjXvnP3l7kYQzIt8RG7sAAC7pvdKVgRKQnsBHRq5/gEJfLcXwK6F7ngd+JJp3VNRM7UT5yPWHZXUvmgHvOQWFVcnPYyEGJA9jwmdnOQf7MsDuwkdAvlN/xcQEnYbVnTMauF4pfM5Vn9a1vM1DP94rGxFz/OYkgullAqRTEEnZUKKVtcZCvpV5uz5LDEQsA6Do51Kh/7QseO/azinF+Svh/zQYa4XmW7kcd8nzV4j587cSK1Kv+H20tQ17yhD9QKmCn3odihHeGOvLTsw4JwH0rDgqizEo/mNRKXC5jlVVpCtvISLhaWp5gobg1/vw/FVfV8m66pUwyOqgXJKN5R81z1j1ogaCUbYp355voySd22Fo1FMHEVGPwwlauJsBB3qxBDSBXw9BqKKjfeBoSrwI+EzrAAa8+3mr57tEqFvDZVuBYKZxoU358ROtNu68qtEiyLHmHiWiuVG+XASo5EOvflRquejcTPKcH42hKpzRdVi/FT3BkBAuQeTxYAMCW4ntV6h4Qu21VAus8buVyYAOpwWVmQ3zi0eGdbG+MbuuQsBaxkzmNeC0N5dnrppmAMRSOMi4EwFL0wtABhKPpgdArqFYH+kVg2bysLv3gMdG9OfM1bdtclfc+X7O5pDAhCgeRsKDtGa90pWpvLKrgvWI2dyD9/XjkM6N+9ThhGLKRgLSG6sOCKQBzRKiITP270KVw4aLx28Yq+1vVYAf2YmILRq2A5HKbHqZta1+0b5TqYwCEw1wuiwmJg69QDMQgnPC4rIAQROJC/QP1zW3uXQHyA24XeZXywetuQIGg5ACW7yGQylzkihL1tCKSBFN0aQgE4d2g9YYefitAKPjGZi+quxzOQbrCa9k1PdCdtfeivAAMAhjNuqHfE7vYAAAAASUVORK5CYII=';\n }\n }\n}\n","<div class=\"ke-toast\" [class]=\"toast.type\">\n\n <div class=\"icon\">\n <img [src]=\"toast.icon || getIcon(toast.type)\" [alt]=\"toast.type\" width=\"24\" height=\"24\" />\n </div>\n\n <div class=\"content\">\n\n @if (toast.title) {\n <div class=\"title\">\n {{ toast.title }}\n </div>\n }\n\n <div class=\"message\">\n {{ toast.message }}\n </div>\n\n @if (toast.action) {\n <button class=\"action\" (click)=\"onAction()\">\n {{ toast.action }}\n </button>\n }\n\n </div>\n\n @if (toast.closable) {\n <button class=\"close\" (click)=\"onClose()\">\n ✕\n </button>\n }\n\n @if (toast.progressBar) {\n <div class=\"progress\"></div>\n }\n\n</div>","import { InjectionToken } from '@angular/core';\r\nimport { ToastConfig } from '../models/toast-config';\r\n\r\nexport const DEFAULT_TOAST_CONFIG: ToastConfig = {\r\n duration: 4000,\r\n position: 'top-right',\r\n showClose: true,\r\n progressBar: true,\r\n pauseOnHover: true,\r\n max: 5,\r\n preventDuplicates: true,\r\n queue: true,\r\n rtl: false,\r\n theme: 'light',\r\n animation: 'slide',\r\n showIcon: true,\r\n newestOnTop: true,\r\n type: 'info',\r\n};\r\n\r\nexport const TOAST_CONFIG = new InjectionToken<ToastConfig>('TOAST_CONFIG', {\r\n factory: () => DEFAULT_TOAST_CONFIG,\r\n});\r\n","/**\r\n * Generates a unique toast id.\r\n */\r\nexport function generateToastId(): string {\r\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\r\n return crypto.randomUUID();\r\n }\r\n\r\n return Date.now().toString(36) + Math.random().toString(36).substring(2, 10);\r\n}\r\n","export class Timer {\r\n private timeoutId?: ReturnType<typeof setTimeout>;\r\n\r\n private startTime = 0;\r\n\r\n private remaining: number;\r\n\r\n constructor(\r\n private readonly duration: number,\r\n private readonly callback: () => void,\r\n ) {\r\n this.remaining = duration;\r\n }\r\n\r\n start(): void {\r\n this.startTime = Date.now();\r\n\r\n this.timeoutId = setTimeout(() => {\r\n this.callback();\r\n }, this.remaining);\r\n }\r\n\r\n pause(): void {\r\n if (!this.timeoutId) {\r\n return;\r\n }\r\n\r\n clearTimeout(this.timeoutId);\r\n\r\n this.remaining -= Date.now() - this.startTime;\r\n }\r\n\r\n resume(): void {\r\n if (this.remaining <= 0) {\r\n this.callback();\r\n return;\r\n }\r\n\r\n this.start();\r\n }\r\n\r\n stop(): void {\r\n if (this.timeoutId) {\r\n clearTimeout(this.timeoutId);\r\n }\r\n }\r\n}\r\n","import { Inject, Injectable, signal } from '@angular/core';\r\n\r\nimport { Toast } from '../models/toast.model';\r\nimport { ToastConfig } from '../models/toast-config';\r\nimport { ToastType } from '../models/toast-type';\r\n\r\nimport { DEFAULT_TOAST_CONFIG, TOAST_CONFIG } from '../tokens/toast-config.token';\r\n\r\nimport { generateToastId } from '../utils/id';\r\nimport { Timer } from '../utils/timer';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ToastService {\r\n /**\r\n * Toast Store\r\n */\r\n private readonly _toasts = signal<Toast[]>([]);\r\n\r\n /**\r\n * Readonly Signal\r\n */\r\n readonly toasts = this._toasts.asReadonly();\r\n\r\n /**\r\n * Waiting Queue\r\n */\r\n private readonly queue: Toast[] = [];\r\n\r\n /**\r\n * Active Timers\r\n */\r\n private readonly timers = new Map<string, Timer>();\r\n\r\n /**\r\n * Final Config\r\n */\r\n private readonly config: ToastConfig;\r\n\r\n constructor(@Inject(TOAST_CONFIG) config: ToastConfig) {\r\n this.config = {\r\n ...DEFAULT_TOAST_CONFIG,\r\n ...config,\r\n };\r\n }\r\n\r\n // ============================================================\r\n // Public APIs\r\n // ============================================================\r\n\r\n success(message: string, title?: string): void {\r\n this.create('success', message, title);\r\n }\r\n\r\n error(message: string, title?: string): void {\r\n this.create('error', message, title);\r\n }\r\n\r\n warning(message: string, title?: string): void {\r\n this.create('warning', message, title);\r\n }\r\n\r\n info(message: string, title?: string): void {\r\n this.create('info', message, title);\r\n }\r\n\r\n remove(id: string): void {\r\n this.timers.get(id)?.stop();\r\n this.timers.delete(id);\r\n\r\n this._toasts.update((toasts) => toasts.filter((t) => t.id !== id));\r\n\r\n this.showNextFromQueue();\r\n }\r\n\r\n clear(): void {\r\n this.timers.forEach((timer) => timer.stop());\r\n\r\n this.timers.clear();\r\n\r\n this.queue.length = 0;\r\n\r\n this._toasts.set([]);\r\n }\r\n\r\n pause(id: string): void {\r\n this.timers.get(id)?.pause();\r\n }\r\n\r\n resume(id: string): void {\r\n this.timers.get(id)?.resume();\r\n }\r\n\r\n // ============================================================\r\n // Private Methods\r\n // ============================================================\r\n\r\n private create(type: ToastType, message: string, title?: string): void {\r\n if (this.config.preventDuplicates && this.hasDuplicate(message)) {\r\n return;\r\n }\r\n\r\n const toast: Toast = {\r\n id: generateToastId(),\r\n title,\r\n message,\r\n type,\r\n duration: this.config.duration!,\r\n visible: true,\r\n createdAt: Date.now(),\r\n position: this.config.position!,\r\n progressBar: this.config.progressBar!,\r\n closable: this.config.showClose!,\r\n pauseOnHover: this.config.pauseOnHover!,\r\n icon: undefined,\r\n action: undefined,\r\n actionHandler: undefined,\r\n cssClass: undefined,\r\n data: undefined,\r\n };\r\n\r\n const active = this._toasts();\r\n\r\n if (active.length >= this.config.max! && this.config.queue) {\r\n this.queue.push(toast);\r\n return;\r\n }\r\n\r\n const updated = this.config.newestOnTop ? [toast, ...active] : [...active, toast];\r\n\r\n this._toasts.set(updated);\r\n\r\n this.autoClose(toast);\r\n }\r\n\r\n private autoClose(toast: Toast): void {\r\n if (toast.duration <= 0) {\r\n return;\r\n }\r\n\r\n const timer = new Timer(toast.duration, () => this.remove(toast.id));\r\n\r\n this.timers.set(toast.id, timer);\r\n\r\n timer.start();\r\n }\r\n\r\n private hasDuplicate(message: string): boolean {\r\n return this._toasts().some((toast) => toast.message === message);\r\n }\r\n\r\n private showNextFromQueue(): void {\r\n if (!this.queue.length) {\r\n return;\r\n }\r\n\r\n const next = this.queue.shift();\r\n\r\n if (!next) {\r\n return;\r\n }\r\n\r\n this._toasts.update((toasts) =>\r\n this.config.newestOnTop ? [next, ...toasts] : [...toasts, next],\r\n );\r\n\r\n this.autoClose(next);\r\n }\r\n}\r\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { ToastService } from '../../services/toast.service';\nimport { KeToast } from '../ke-toast/ke-toast';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n selector: 'ke-toaster',\n imports: [CommonModule, KeToast],\n templateUrl: './ke-toaster.html',\n styleUrl: './ke-toaster.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class KeToaster {\n readonly toastService = inject(ToastService);\n\n readonly toasts = this.toastService.toasts;\n\n remove(id: string): void {\n this.toastService.remove(id);\n }\n}\n","<div class=\"ke-toast-container\">\n\n @for (toast of toasts(); track toast.id) {\n\n <ke-toast [toast]=\"toast\" (close)=\"remove($event)\">\n </ke-toast>\n\n }\n\n</div>","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\r\n\r\nimport { ToastConfig } from '../models/toast-config';\r\nimport { DEFAULT_TOAST_CONFIG, TOAST_CONFIG } from '../tokens/toast-config.token';\r\n\r\nexport function provideToast(config: ToastConfig = {}): EnvironmentProviders {\r\n return makeEnvironmentProviders([\r\n {\r\n provide: TOAST_CONFIG,\r\n useValue: {\r\n ...DEFAULT_TOAST_CONFIG,\r\n ...config,\r\n },\r\n },\r\n ]);\r\n}\r\n","/*\r\n * Components\r\n */\r\nexport * from './components/ke-toast/ke-toast';\r\nexport * from './components/ke-toaster/ke-toaster';\r\n\r\n/*\r\n * Services\r\n */\r\nexport * from './services/toast.service';\r\n\r\n/*\r\n * Providers\r\n */\r\nexport * from './providers/provide-toast';\r\n\r\n/*\r\n * Models\r\n */\r\nexport * from './models/toast.model';\r\nexport * from './models/toast-config';\r\nexport * from './models/toast-type';\r\n\r\n/*\r\n * Tokens\r\n */\r\nexport * from './tokens/toast-config.token';\r\n\r\n/*\r\n * Utilities\r\n */\r\nexport * from './utils/id';\r\nexport * from './utils/timer';\r\n","/*\n * Public API Surface of @kudoengineer/toast\n */\n\nexport * from './lib/toast';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
Binary file
|
package/package.json
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@kudoengineer/toast",
|
|
3
|
+
"version": "22.0.1",
|
|
4
|
+
"description": "Modern toast notification library for Angular.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"angular",
|
|
7
|
+
"angular22",
|
|
8
|
+
"toast",
|
|
9
|
+
"notification",
|
|
10
|
+
"snackbar",
|
|
11
|
+
"kudoengineer"
|
|
12
|
+
],
|
|
13
|
+
"author": "Satendra Rajput",
|
|
14
|
+
"license": "MIT",
|
|
15
|
+
"peerDependencies": {
|
|
16
|
+
"@angular/common": "^22.0.0",
|
|
17
|
+
"@angular/core": "^22.0.0",
|
|
18
|
+
"@angular/animations": "^22.0.0"
|
|
19
|
+
},
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"tslib": "^2.8.1"
|
|
22
|
+
},
|
|
23
|
+
"sideEffects": false,
|
|
24
|
+
"module": "fesm2022/kudoengineer-toast.mjs",
|
|
25
|
+
"typings": "types/kudoengineer-toast.d.ts",
|
|
26
|
+
"exports": {
|
|
27
|
+
"./package.json": {
|
|
28
|
+
"default": "./package.json"
|
|
29
|
+
},
|
|
30
|
+
".": {
|
|
31
|
+
"types": "./types/kudoengineer-toast.d.ts",
|
|
32
|
+
"default": "./fesm2022/kudoengineer-toast.mjs"
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"type": "module"
|
|
36
|
+
}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { EventEmitter, EnvironmentProviders, InjectionToken } from '@angular/core';
|
|
3
|
+
import * as _kudoengineer_toast from '@kudoengineer/toast';
|
|
4
|
+
|
|
5
|
+
type ToastType = 'success' | 'error' | 'warning' | 'info';
|
|
6
|
+
|
|
7
|
+
interface Toast {
|
|
8
|
+
/**
|
|
9
|
+
* Unique id
|
|
10
|
+
*/
|
|
11
|
+
id: string;
|
|
12
|
+
/**
|
|
13
|
+
* Title
|
|
14
|
+
*/
|
|
15
|
+
title?: string;
|
|
16
|
+
/**
|
|
17
|
+
* Main message
|
|
18
|
+
*/
|
|
19
|
+
message: string;
|
|
20
|
+
/**
|
|
21
|
+
* Success | Error | Warning | Info
|
|
22
|
+
*/
|
|
23
|
+
type: ToastType;
|
|
24
|
+
/**
|
|
25
|
+
* Auto dismiss duration
|
|
26
|
+
*/
|
|
27
|
+
duration: number;
|
|
28
|
+
/**
|
|
29
|
+
* Current visibility
|
|
30
|
+
*/
|
|
31
|
+
visible: boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Creation timestamp
|
|
34
|
+
*/
|
|
35
|
+
createdAt: number;
|
|
36
|
+
/**
|
|
37
|
+
* Position
|
|
38
|
+
*/
|
|
39
|
+
position: 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right';
|
|
40
|
+
/**
|
|
41
|
+
* Progress bar
|
|
42
|
+
*/
|
|
43
|
+
progressBar: boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Close button
|
|
46
|
+
*/
|
|
47
|
+
closable: boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Pause on hover
|
|
50
|
+
*/
|
|
51
|
+
pauseOnHover: boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Icon
|
|
54
|
+
*/
|
|
55
|
+
icon?: string;
|
|
56
|
+
/**
|
|
57
|
+
* Optional action text
|
|
58
|
+
*/
|
|
59
|
+
action?: string;
|
|
60
|
+
/**
|
|
61
|
+
* Callback when action clicked
|
|
62
|
+
*/
|
|
63
|
+
actionHandler?: () => void;
|
|
64
|
+
/**
|
|
65
|
+
* Custom css class
|
|
66
|
+
*/
|
|
67
|
+
cssClass?: string;
|
|
68
|
+
/**
|
|
69
|
+
* Data payload
|
|
70
|
+
*/
|
|
71
|
+
data?: unknown;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
declare class KeToast {
|
|
75
|
+
toast: Toast;
|
|
76
|
+
close: EventEmitter<string>;
|
|
77
|
+
type: any;
|
|
78
|
+
onClose(): void;
|
|
79
|
+
onAction(): void;
|
|
80
|
+
getIcon(type: string): string;
|
|
81
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<KeToast, never>;
|
|
82
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<KeToast, "ke-toast", never, { "toast": { "alias": "toast"; "required": true; }; }, { "close": "close"; }, never, never, true, never>;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
type ToastPosition = 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right';
|
|
86
|
+
type ToastTheme = 'light' | 'dark' | 'auto';
|
|
87
|
+
type ToastAnimation = 'fade' | 'slide' | 'scale' | 'bounce';
|
|
88
|
+
interface ToastConfig {
|
|
89
|
+
/**
|
|
90
|
+
* Default duration (ms)
|
|
91
|
+
*/
|
|
92
|
+
duration?: number;
|
|
93
|
+
/**
|
|
94
|
+
* Toast position
|
|
95
|
+
*/
|
|
96
|
+
position?: ToastPosition;
|
|
97
|
+
/**
|
|
98
|
+
* Show close button
|
|
99
|
+
*/
|
|
100
|
+
showClose?: boolean;
|
|
101
|
+
/**
|
|
102
|
+
* Show progress bar
|
|
103
|
+
*/
|
|
104
|
+
progressBar?: boolean;
|
|
105
|
+
/**
|
|
106
|
+
* Pause timer while hovering
|
|
107
|
+
*/
|
|
108
|
+
pauseOnHover?: boolean;
|
|
109
|
+
/**
|
|
110
|
+
* Maximum visible toasts
|
|
111
|
+
*/
|
|
112
|
+
max?: number;
|
|
113
|
+
/**
|
|
114
|
+
* Prevent duplicate messages
|
|
115
|
+
*/
|
|
116
|
+
preventDuplicates?: boolean;
|
|
117
|
+
/**
|
|
118
|
+
* Queue remaining toasts
|
|
119
|
+
*/
|
|
120
|
+
queue?: boolean;
|
|
121
|
+
/**
|
|
122
|
+
* RTL Support
|
|
123
|
+
*/
|
|
124
|
+
rtl?: boolean;
|
|
125
|
+
/**
|
|
126
|
+
* Light / Dark / Auto
|
|
127
|
+
*/
|
|
128
|
+
theme?: ToastTheme;
|
|
129
|
+
/**
|
|
130
|
+
* Animation style
|
|
131
|
+
*/
|
|
132
|
+
animation?: ToastAnimation;
|
|
133
|
+
/**
|
|
134
|
+
* Default icon visibility
|
|
135
|
+
*/
|
|
136
|
+
showIcon?: boolean;
|
|
137
|
+
/**
|
|
138
|
+
* Newest toast on top
|
|
139
|
+
*/
|
|
140
|
+
newestOnTop?: boolean;
|
|
141
|
+
/**
|
|
142
|
+
* Default type
|
|
143
|
+
*/
|
|
144
|
+
type?: ToastType;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
declare class ToastService {
|
|
148
|
+
/**
|
|
149
|
+
* Toast Store
|
|
150
|
+
*/
|
|
151
|
+
private readonly _toasts;
|
|
152
|
+
/**
|
|
153
|
+
* Readonly Signal
|
|
154
|
+
*/
|
|
155
|
+
readonly toasts: i0.Signal<Toast[]>;
|
|
156
|
+
/**
|
|
157
|
+
* Waiting Queue
|
|
158
|
+
*/
|
|
159
|
+
private readonly queue;
|
|
160
|
+
/**
|
|
161
|
+
* Active Timers
|
|
162
|
+
*/
|
|
163
|
+
private readonly timers;
|
|
164
|
+
/**
|
|
165
|
+
* Final Config
|
|
166
|
+
*/
|
|
167
|
+
private readonly config;
|
|
168
|
+
constructor(config: ToastConfig);
|
|
169
|
+
success(message: string, title?: string): void;
|
|
170
|
+
error(message: string, title?: string): void;
|
|
171
|
+
warning(message: string, title?: string): void;
|
|
172
|
+
info(message: string, title?: string): void;
|
|
173
|
+
remove(id: string): void;
|
|
174
|
+
clear(): void;
|
|
175
|
+
pause(id: string): void;
|
|
176
|
+
resume(id: string): void;
|
|
177
|
+
private create;
|
|
178
|
+
private autoClose;
|
|
179
|
+
private hasDuplicate;
|
|
180
|
+
private showNextFromQueue;
|
|
181
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ToastService, never>;
|
|
182
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<ToastService>;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
declare class KeToaster {
|
|
186
|
+
readonly toastService: ToastService;
|
|
187
|
+
readonly toasts: i0.Signal<_kudoengineer_toast.Toast[]>;
|
|
188
|
+
remove(id: string): void;
|
|
189
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<KeToaster, never>;
|
|
190
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<KeToaster, "ke-toaster", never, {}, {}, never, never, true, never>;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
declare function provideToast(config?: ToastConfig): EnvironmentProviders;
|
|
194
|
+
|
|
195
|
+
declare const DEFAULT_TOAST_CONFIG: ToastConfig;
|
|
196
|
+
declare const TOAST_CONFIG: InjectionToken<ToastConfig>;
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Generates a unique toast id.
|
|
200
|
+
*/
|
|
201
|
+
declare function generateToastId(): string;
|
|
202
|
+
|
|
203
|
+
declare class Timer {
|
|
204
|
+
private readonly duration;
|
|
205
|
+
private readonly callback;
|
|
206
|
+
private timeoutId?;
|
|
207
|
+
private startTime;
|
|
208
|
+
private remaining;
|
|
209
|
+
constructor(duration: number, callback: () => void);
|
|
210
|
+
start(): void;
|
|
211
|
+
pause(): void;
|
|
212
|
+
resume(): void;
|
|
213
|
+
stop(): void;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
export { DEFAULT_TOAST_CONFIG, KeToast, KeToaster, TOAST_CONFIG, Timer, ToastService, generateToastId, provideToast };
|
|
217
|
+
export type { Toast, ToastAnimation, ToastConfig, ToastPosition, ToastTheme, ToastType };
|