@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 };