@filip.mazev/toastr 0.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Filip Mazev
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1 @@
1
+ # Toastr
@@ -0,0 +1,329 @@
1
+ import * as i0 from '@angular/core';
2
+ import { InjectionToken, signal, Injectable, computed, ViewContainerRef, ViewChild, Component, inject, Injector, ApplicationRef, EnvironmentInjector, createComponent } from '@angular/core';
3
+ import { NgClass, DOCUMENT } from '@angular/common';
4
+ import { Subject } from 'rxjs';
5
+
6
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
7
+ class ToastRef {
8
+ closeFn;
9
+ afterClosedSubject = new Subject();
10
+ afterClosed$ = this.afterClosedSubject.asObservable();
11
+ constructor(closeFn) {
12
+ this.closeFn = closeFn;
13
+ }
14
+ close(result) {
15
+ this.closeFn(result);
16
+ this.afterClosedSubject.next(result);
17
+ this.afterClosedSubject.complete();
18
+ }
19
+ }
20
+
21
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
22
+ const TOAST_DATA = new InjectionToken('TOAST_DATA');
23
+
24
+ class ToastrGlobalSettingsService {
25
+ position = signal('top-right', ...(ngDevMode ? [{ debugName: "position" }] : []));
26
+ animate = signal(true, ...(ngDevMode ? [{ debugName: "animate" }] : []));
27
+ useDefaultWrapperClass = signal(true, ...(ngDevMode ? [{ debugName: "useDefaultWrapperClass" }] : []));
28
+ durationInMs = signal(5000, ...(ngDevMode ? [{ debugName: "durationInMs" }] : []));
29
+ swipeToDismiss = signal(true, ...(ngDevMode ? [{ debugName: "swipeToDismiss" }] : []));
30
+ maxOpened = signal(4, ...(ngDevMode ? [{ debugName: "maxOpened" }] : []));
31
+ /**
32
+ * Updates the global toast settings with the provided values.
33
+ * @param settings An object containing the settings to be updated.
34
+ */
35
+ update(settings) {
36
+ if (settings.position !== undefined)
37
+ this.position.set(settings.position);
38
+ if (settings.animate !== undefined)
39
+ this.animate.set(settings.animate);
40
+ if (settings.useDefaultWrapperClass !== undefined)
41
+ this.useDefaultWrapperClass.set(settings.useDefaultWrapperClass);
42
+ if (settings.durationInMs !== undefined)
43
+ this.durationInMs.set(settings.durationInMs);
44
+ if (settings.swipeToDismiss !== undefined)
45
+ this.swipeToDismiss.set(settings.swipeToDismiss);
46
+ if (settings.maxOpened !== undefined)
47
+ this.maxOpened.set(settings.maxOpened);
48
+ }
49
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: ToastrGlobalSettingsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
50
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: ToastrGlobalSettingsService, providedIn: 'root' });
51
+ }
52
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: ToastrGlobalSettingsService, decorators: [{
53
+ type: Injectable,
54
+ args: [{
55
+ providedIn: 'root'
56
+ }]
57
+ }] });
58
+
59
+ class ToastCore {
60
+ componentRef;
61
+ config;
62
+ toastRef;
63
+ isVisible = signal(false, ...(ngDevMode ? [{ debugName: "isVisible" }] : []));
64
+ currentTranslateY = signal(0, ...(ngDevMode ? [{ debugName: "currentTranslateY" }] : []));
65
+ isSwipingFinished = signal(false, ...(ngDevMode ? [{ debugName: "isSwipingFinished" }] : []));
66
+ isAnimated = computed(() => this.config?.animate !== false, ...(ngDevMode ? [{ debugName: "isAnimated" }] : []));
67
+ dynamicContainer;
68
+ toastSwipeTarget;
69
+ wrapperClasses = computed(() => {
70
+ const isTop = (this.config?.position ?? 'top-right').includes('top');
71
+ return isTop ? 'anim-dir-top' : 'anim-dir-bottom';
72
+ }, ...(ngDevMode ? [{ debugName: "wrapperClasses" }] : []));
73
+ modalTransform = computed(() => {
74
+ if (!this.isAnimated())
75
+ return null;
76
+ const isTop = (this.config?.position ?? 'top-right').includes('top');
77
+ if (this.isSwipingFinished()) {
78
+ return isTop ? 'translateY(-120%)' : 'translateY(120%)';
79
+ }
80
+ if (this.currentTranslateY() !== 0) {
81
+ return `translateY(${this.currentTranslateY()}px)`;
82
+ }
83
+ return null;
84
+ }, ...(ngDevMode ? [{ debugName: "modalTransform" }] : []));
85
+ isTrackingSwipe = false;
86
+ cleanupListeners = null;
87
+ autoCloseTimeout;
88
+ ngOnInit() {
89
+ this.dynamicContainer.insert(this.componentRef.hostView);
90
+ setTimeout(() => this.isVisible.set(true), 10);
91
+ if (this.config?.swipeToDismiss !== false) {
92
+ this.startVerticalSwipeDetection();
93
+ }
94
+ if (this.config?.durationInMs) {
95
+ this.autoCloseTimeout = setTimeout(() => this.closeToast(), this.config.durationInMs);
96
+ }
97
+ }
98
+ ngOnDestroy() {
99
+ this.stopVerticalSwipeDetection();
100
+ clearTimeout(this.autoCloseTimeout);
101
+ }
102
+ closeToast() {
103
+ this.isVisible.set(false);
104
+ this.isSwipingFinished.set(true);
105
+ const delay = this.isAnimated() ? 500 : 0;
106
+ setTimeout(() => {
107
+ this.toastRef.close();
108
+ }, delay);
109
+ }
110
+ //#region Swipe Logic
111
+ startVerticalSwipeDetection() {
112
+ if (this.isTrackingSwipe)
113
+ return;
114
+ const hasTouch = typeof window !== 'undefined' && (window.matchMedia('(pointer: coarse)').matches || navigator.maxTouchPoints > 0);
115
+ if (!hasTouch)
116
+ return;
117
+ this.isTrackingSwipe = true;
118
+ const target = this.toastSwipeTarget.nativeElement;
119
+ const isTop = (this.config?.position ?? 'top-right').includes('top');
120
+ let startY = 0;
121
+ let startTime = 0;
122
+ let isPointerDown = false;
123
+ let limit = 0;
124
+ const pointerDown = (event) => {
125
+ if (event.button !== 0 && event.pointerType === 'mouse')
126
+ return;
127
+ const toastHeight = target.offsetHeight || 0;
128
+ limit = toastHeight / 3;
129
+ isPointerDown = true;
130
+ startY = event.clientY;
131
+ startTime = event.timeStamp;
132
+ clearTimeout(this.autoCloseTimeout);
133
+ target.setPointerCapture(event.pointerId);
134
+ };
135
+ const pointerMove = (event) => {
136
+ if (!isPointerDown)
137
+ return;
138
+ const currentY = event.clientY - startY;
139
+ if ((isTop && currentY < 0) || (!isTop && currentY > 0)) {
140
+ if (event.cancelable)
141
+ event.preventDefault();
142
+ this.currentTranslateY.set(currentY);
143
+ }
144
+ };
145
+ const pointerUp = (event) => {
146
+ if (!isPointerDown)
147
+ return;
148
+ isPointerDown = false;
149
+ target.releasePointerCapture(event.pointerId);
150
+ const deltaY = event.clientY - startY;
151
+ const duration = event.timeStamp - startTime || 1;
152
+ const velocityY = Math.abs(deltaY / duration);
153
+ const crossedLimit = isTop ? (deltaY < -limit) : (deltaY > limit);
154
+ if (crossedLimit || velocityY > 0.3) {
155
+ this.closeToast();
156
+ }
157
+ else {
158
+ this.currentTranslateY.set(0);
159
+ if (this.config?.durationInMs) {
160
+ this.autoCloseTimeout = setTimeout(() => this.closeToast(), this.config.durationInMs);
161
+ }
162
+ }
163
+ };
164
+ target.addEventListener('pointerdown', pointerDown, { passive: false });
165
+ target.addEventListener('pointermove', pointerMove, { passive: false });
166
+ target.addEventListener('pointerup', pointerUp);
167
+ target.addEventListener('pointercancel', pointerUp);
168
+ this.cleanupListeners = () => {
169
+ target.removeEventListener('pointerdown', pointerDown);
170
+ target.removeEventListener('pointermove', pointerMove);
171
+ target.removeEventListener('pointerup', pointerUp);
172
+ target.removeEventListener('pointercancel', pointerUp);
173
+ };
174
+ }
175
+ stopVerticalSwipeDetection() {
176
+ this.isTrackingSwipe = false;
177
+ if (this.cleanupListeners) {
178
+ this.cleanupListeners();
179
+ this.cleanupListeners = null;
180
+ }
181
+ }
182
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: ToastCore, deps: [], target: i0.ɵɵFactoryTarget.Component });
183
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.4", type: ToastCore, isStandalone: true, selector: "app-toast-core", viewQueries: [{ propertyName: "dynamicContainer", first: true, predicate: ["dynamicContainer"], descendants: true, read: ViewContainerRef, static: true }, { propertyName: "toastSwipeTarget", first: true, predicate: ["toastSwipeTarget"], descendants: true, static: true }], ngImport: i0, template: "<div #toastSwipeTarget class=\"toast-wrapper\" [ngClass]=\"wrapperClasses()\" [class.show]=\"isVisible()\"\n [class.no-animate]=\"!isAnimated()\" [class.default-wrapper]=\"config?.useDefaultWrapperClass !== false\"\n [style.transform]=\"modalTransform()\">\n <ng-container #dynamicContainer></ng-container>\n</div>", styles: ["::ng-deep .toast-container{position:fixed;z-index:9999;display:flex;gap:1rem;pointer-events:none}@media(max-width:768px){::ng-deep .toast-container{left:1rem!important;right:1rem!important;width:calc(100% - 2rem)}}::ng-deep .toast-container-top-right{top:1rem;right:1rem;flex-direction:column}::ng-deep .toast-container-top-left{top:1rem;left:1rem;flex-direction:column}::ng-deep .toast-container-top-center{top:1rem;left:50%;transform:translate(-50%);flex-direction:column}::ng-deep .toast-container-bottom-right{bottom:1rem;right:1rem;flex-direction:column-reverse}::ng-deep .toast-container-bottom-left{bottom:1rem;left:1rem;flex-direction:column-reverse}::ng-deep .toast-container-bottom-center{bottom:1rem;left:50%;transform:translate(-50%);flex-direction:column-reverse}@media(max-width:768px){::ng-deep .toast-container[class*=-top-]{top:1rem!important;bottom:auto!important;flex-direction:column!important;transform:none!important}::ng-deep .toast-container[class*=-bottom-]{bottom:1rem!important;top:auto!important;flex-direction:column-reverse!important;transform:none!important}}.toast-wrapper{position:relative;pointer-events:auto;opacity:0;transition:opacity .4s cubic-bezier(.25,.8,.25,1),transform .4s cubic-bezier(.25,.8,.25,1);transition-duration:calc(.4s * (1 - var(--a11y-reduced-motion, 0)))}.toast-wrapper.default-wrapper{background-color:var(--toast-bg, #fff);color:var(--toast-text, #000);border-radius:8px;box-shadow:0 4px 12px #00000026;padding:1rem;width:24rem;max-width:100%}.toast-wrapper.anim-dir-top{transform:translateY(-30px)}.toast-wrapper.anim-dir-bottom{transform:translateY(30px)}.toast-wrapper.show{opacity:1;transform:translateY(0)}.toast-wrapper.no-animate{transition:none!important;transform:none!important}@media(max-width:768px){.toast-wrapper{width:100%}}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
184
+ }
185
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: ToastCore, decorators: [{
186
+ type: Component,
187
+ args: [{ selector: 'app-toast-core', imports: [NgClass], template: "<div #toastSwipeTarget class=\"toast-wrapper\" [ngClass]=\"wrapperClasses()\" [class.show]=\"isVisible()\"\n [class.no-animate]=\"!isAnimated()\" [class.default-wrapper]=\"config?.useDefaultWrapperClass !== false\"\n [style.transform]=\"modalTransform()\">\n <ng-container #dynamicContainer></ng-container>\n</div>", styles: ["::ng-deep .toast-container{position:fixed;z-index:9999;display:flex;gap:1rem;pointer-events:none}@media(max-width:768px){::ng-deep .toast-container{left:1rem!important;right:1rem!important;width:calc(100% - 2rem)}}::ng-deep .toast-container-top-right{top:1rem;right:1rem;flex-direction:column}::ng-deep .toast-container-top-left{top:1rem;left:1rem;flex-direction:column}::ng-deep .toast-container-top-center{top:1rem;left:50%;transform:translate(-50%);flex-direction:column}::ng-deep .toast-container-bottom-right{bottom:1rem;right:1rem;flex-direction:column-reverse}::ng-deep .toast-container-bottom-left{bottom:1rem;left:1rem;flex-direction:column-reverse}::ng-deep .toast-container-bottom-center{bottom:1rem;left:50%;transform:translate(-50%);flex-direction:column-reverse}@media(max-width:768px){::ng-deep .toast-container[class*=-top-]{top:1rem!important;bottom:auto!important;flex-direction:column!important;transform:none!important}::ng-deep .toast-container[class*=-bottom-]{bottom:1rem!important;top:auto!important;flex-direction:column-reverse!important;transform:none!important}}.toast-wrapper{position:relative;pointer-events:auto;opacity:0;transition:opacity .4s cubic-bezier(.25,.8,.25,1),transform .4s cubic-bezier(.25,.8,.25,1);transition-duration:calc(.4s * (1 - var(--a11y-reduced-motion, 0)))}.toast-wrapper.default-wrapper{background-color:var(--toast-bg, #fff);color:var(--toast-text, #000);border-radius:8px;box-shadow:0 4px 12px #00000026;padding:1rem;width:24rem;max-width:100%}.toast-wrapper.anim-dir-top{transform:translateY(-30px)}.toast-wrapper.anim-dir-bottom{transform:translateY(30px)}.toast-wrapper.show{opacity:1;transform:translateY(0)}.toast-wrapper.no-animate{transition:none!important;transform:none!important}@media(max-width:768px){.toast-wrapper{width:100%}}\n"] }]
188
+ }], propDecorators: { dynamicContainer: [{
189
+ type: ViewChild,
190
+ args: ['dynamicContainer', { read: ViewContainerRef, static: true }]
191
+ }], toastSwipeTarget: [{
192
+ type: ViewChild,
193
+ args: ['toastSwipeTarget', { static: true }]
194
+ }] } });
195
+
196
+ class ToastrService {
197
+ injector = inject(Injector);
198
+ appRef = inject(ApplicationRef);
199
+ environmentInjector = inject(EnvironmentInjector);
200
+ document = inject(DOCUMENT);
201
+ globalSettings = inject(ToastrGlobalSettingsService);
202
+ toastQueue = [];
203
+ activeToasts = [];
204
+ containers = new Map();
205
+ queueToast(componentType, config) {
206
+ const resolvedConfig = this.resolveConfig(config);
207
+ this.toastQueue.push(() => this.buildAndAttachToast(componentType, resolvedConfig));
208
+ this.processQueue();
209
+ }
210
+ processQueue() {
211
+ const max = this.globalSettings.maxOpened();
212
+ while (this.activeToasts.length < max && this.toastQueue.length > 0) {
213
+ const buildNext = this.toastQueue.shift();
214
+ if (buildNext)
215
+ buildNext();
216
+ }
217
+ }
218
+ buildAndAttachToast(componentType, config) {
219
+ const dataInjector = Injector.create({
220
+ providers: [{ provide: TOAST_DATA, useValue: config.data }],
221
+ parent: this.injector
222
+ });
223
+ const contentRef = createComponent(componentType, {
224
+ environmentInjector: this.environmentInjector,
225
+ elementInjector: dataInjector
226
+ });
227
+ const toastRef = new ToastRef(() => this.cleanupToast(wrapperRef));
228
+ if (this.isIToast(contentRef.instance)) {
229
+ contentRef.instance.toast = toastRef;
230
+ if (typeof contentRef.instance.onToastInit === 'function') {
231
+ contentRef.instance.onToastInit();
232
+ }
233
+ }
234
+ const wrapperInjector = Injector.create({
235
+ providers: [{ provide: ToastRef, useValue: toastRef }],
236
+ parent: this.injector
237
+ });
238
+ const wrapperRef = createComponent(ToastCore, {
239
+ environmentInjector: this.environmentInjector,
240
+ elementInjector: wrapperInjector
241
+ });
242
+ wrapperRef.instance.componentRef = contentRef;
243
+ wrapperRef.instance.config = config;
244
+ wrapperRef.instance.toastRef = toastRef;
245
+ this.appRef.attachView(wrapperRef.hostView);
246
+ const container = this.getContainer(config.position);
247
+ container.appendChild(wrapperRef.location.nativeElement);
248
+ this.activeToasts.push(wrapperRef);
249
+ }
250
+ cleanupToast(wrapperRef) {
251
+ const index = this.activeToasts.indexOf(wrapperRef);
252
+ if (index > -1) {
253
+ this.activeToasts.splice(index, 1);
254
+ }
255
+ this.appRef.detachView(wrapperRef.hostView);
256
+ wrapperRef.location.nativeElement.remove();
257
+ wrapperRef.destroy();
258
+ setTimeout(() => this.processQueue(), 200);
259
+ }
260
+ getContainer(position) {
261
+ if (this.containers.has(position)) {
262
+ return this.containers.get(position);
263
+ }
264
+ const container = this.document.createElement('div');
265
+ container.classList.add('toast-container', `toast-container-${position}`);
266
+ this.document.body.appendChild(container);
267
+ this.containers.set(position, container);
268
+ return container;
269
+ }
270
+ resolveConfig(config) {
271
+ return {
272
+ ...config,
273
+ position: config?.position ?? this.globalSettings.position(),
274
+ animate: config?.animate ?? this.globalSettings.animate(),
275
+ useDefaultWrapperClass: config?.useDefaultWrapperClass ?? this.globalSettings.useDefaultWrapperClass(),
276
+ durationInMs: config?.durationInMs ?? this.globalSettings.durationInMs(),
277
+ swipeToDismiss: config?.swipeToDismiss ?? this.globalSettings.swipeToDismiss(),
278
+ };
279
+ }
280
+ isIToast(component) {
281
+ return typeof component === 'object' && component !== null && 'toast' in component;
282
+ }
283
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: ToastrService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
284
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: ToastrService, providedIn: 'root' });
285
+ }
286
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: ToastrService, decorators: [{
287
+ type: Injectable,
288
+ args: [{
289
+ providedIn: 'root'
290
+ }]
291
+ }] });
292
+
293
+ class Toast {
294
+ /**
295
+ * Data injected into the toast component.
296
+ */
297
+ data = inject(TOAST_DATA);
298
+ /**
299
+ * Reference to the ToastRef instance associated with this toast.
300
+ */
301
+ toast;
302
+ /**
303
+ * Called when the toast is initialized.
304
+ */
305
+ onToastInit() { }
306
+ /**
307
+ * Closes the toast with an optional result.
308
+ * @param result The result to be passed when closing the toast.
309
+ */
310
+ close(result) {
311
+ this.toast?.close(result);
312
+ }
313
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: Toast, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
314
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: Toast });
315
+ }
316
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: Toast, decorators: [{
317
+ type: Injectable
318
+ }] });
319
+
320
+ /*
321
+ * Public API Surface of toastr
322
+ */
323
+
324
+ /**
325
+ * Generated bundle index. Do not edit.
326
+ */
327
+
328
+ export { TOAST_DATA, Toast, ToastCore, ToastRef, ToastrGlobalSettingsService, ToastrService };
329
+ //# sourceMappingURL=filip.mazev-toastr.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filip.mazev-toastr.mjs","sources":["../../../projects/toastr/src/lib/classes/toast-ref.ts","../../../projects/toastr/src/lib/tokens/toast-data.token.ts","../../../projects/toastr/src/lib/services/toastr-global-settings.service.ts","../../../projects/toastr/src/lib/components/toast-core.ts","../../../projects/toastr/src/lib/components/toast-core.html","../../../projects/toastr/src/lib/services/toastr.service.ts","../../../projects/toastr/src/lib/classes/toast.ts","../../../projects/toastr/src/public-api.ts","../../../projects/toastr/src/filip.mazev-toastr.ts"],"sourcesContent":["import { Subject } from 'rxjs';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport class ToastRef<R = any> {\n private afterClosedSubject = new Subject<R | undefined>();\n public afterClosed$ = this.afterClosedSubject.asObservable();\n\n constructor(private readonly closeFn: (result?: R) => void) {}\n\n public close(result?: R): void {\n this.closeFn(result);\n this.afterClosedSubject.next(result);\n this.afterClosedSubject.complete();\n }\n}","import { InjectionToken } from '@angular/core';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const TOAST_DATA = new InjectionToken<any>('TOAST_DATA');","import { Injectable, signal } from '@angular/core';\nimport { ToastPosition } from '../types/toastr.types';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ToastrGlobalSettingsService {\n public readonly position = signal<ToastPosition>('top-right');\n public readonly animate = signal<boolean>(true);\n public readonly useDefaultWrapperClass = signal<boolean>(true);\n public readonly durationInMs = signal<number>(5000);\n public readonly swipeToDismiss = signal<boolean>(true);\n public readonly maxOpened = signal<number>(4);\n\n /**\n * Updates the global toast settings with the provided values.\n * @param settings An object containing the settings to be updated.\n */\n public update(settings: Partial<{\n position: ToastPosition;\n animate: boolean;\n useDefaultWrapperClass: boolean;\n durationInMs: number;\n swipeToDismiss: boolean;\n maxOpened: number;\n }>): void {\n if (settings.position !== undefined) this.position.set(settings.position);\n if (settings.animate !== undefined) this.animate.set(settings.animate);\n if (settings.useDefaultWrapperClass !== undefined) this.useDefaultWrapperClass.set(settings.useDefaultWrapperClass);\n if (settings.durationInMs !== undefined) this.durationInMs.set(settings.durationInMs);\n if (settings.swipeToDismiss !== undefined) this.swipeToDismiss.set(settings.swipeToDismiss);\n if (settings.maxOpened !== undefined) this.maxOpened.set(settings.maxOpened);\n }\n}","import { Component, ViewChild, ViewContainerRef, ComponentRef, ElementRef, OnInit, OnDestroy, signal, computed, inject } from '@angular/core';\nimport { NgClass } from '@angular/common';\nimport { IToastConfig } from '../interfaces/itoast-config.interface';\nimport { ToastRef } from '../classes/toast-ref';\nimport { IToast } from '../interfaces/itoast.interface';\n\n@Component({\n selector: 'app-toast-core',\n imports: [NgClass],\n templateUrl: './toast-core.html',\n styleUrl: './toast-core.scss'\n})\nexport class ToastCore<D, R, C extends IToast<D, R> = IToast<D, R>> implements OnInit, OnDestroy {\n public componentRef!: ComponentRef<C>;\n public config?: IToastConfig<D>;\n public toastRef!: ToastRef<R>;\n\n public isVisible = signal(false);\n public currentTranslateY = signal(0);\n public isSwipingFinished = signal(false);\n \n protected isAnimated = computed(() => this.config?.animate !== false);\n\n @ViewChild('dynamicContainer', { read: ViewContainerRef, static: true }) protected dynamicContainer!: ViewContainerRef;\n @ViewChild('toastSwipeTarget', { static: true }) protected toastSwipeTarget!: ElementRef;\n\n protected wrapperClasses = computed(() => {\n const isTop = (this.config?.position ?? 'top-right').includes('top');\n return isTop ? 'anim-dir-top' : 'anim-dir-bottom';\n });\n\n protected modalTransform = computed(() => {\n if (!this.isAnimated()) return null;\n\n const isTop = (this.config?.position ?? 'top-right').includes('top');\n\n if (this.isSwipingFinished()) {\n return isTop ? 'translateY(-120%)' : 'translateY(120%)';\n }\n\n if (this.currentTranslateY() !== 0) {\n return `translateY(${this.currentTranslateY()}px)`;\n }\n\n return null;\n });\n\n private isTrackingSwipe = false;\n private cleanupListeners: (() => void) | null = null;\n private autoCloseTimeout?: ReturnType<typeof setTimeout>;\n\n public ngOnInit(): void {\n this.dynamicContainer.insert(this.componentRef.hostView);\n\n setTimeout(() => this.isVisible.set(true), 10);\n\n if (this.config?.swipeToDismiss !== false) {\n this.startVerticalSwipeDetection();\n }\n\n if (this.config?.durationInMs) {\n this.autoCloseTimeout = setTimeout(() => this.closeToast(), this.config.durationInMs);\n }\n }\n\n public ngOnDestroy(): void {\n this.stopVerticalSwipeDetection();\n clearTimeout(this.autoCloseTimeout);\n }\n\n public closeToast(): void {\n this.isVisible.set(false);\n this.isSwipingFinished.set(true);\n \n const delay = this.isAnimated() ? 500 : 0;\n\n setTimeout(() => {\n this.toastRef.close();\n }, delay);\n }\n\n //#region Swipe Logic\n\n private startVerticalSwipeDetection(): void {\n if (this.isTrackingSwipe) return;\n\n const hasTouch = typeof window !== 'undefined' && (window.matchMedia('(pointer: coarse)').matches || navigator.maxTouchPoints > 0);\n if (!hasTouch) return;\n\n this.isTrackingSwipe = true;\n const target = this.toastSwipeTarget.nativeElement;\n const isTop = (this.config?.position ?? 'top-right').includes('top');\n\n let startY = 0;\n let startTime = 0;\n let isPointerDown = false;\n let limit = 0;\n\n const pointerDown = (event: PointerEvent) => {\n if (event.button !== 0 && event.pointerType === 'mouse') return;\n \n const toastHeight = target.offsetHeight || 0;\n limit = toastHeight / 3;\n\n isPointerDown = true;\n startY = event.clientY;\n startTime = event.timeStamp;\n \n clearTimeout(this.autoCloseTimeout);\n target.setPointerCapture(event.pointerId);\n };\n\n const pointerMove = (event: PointerEvent) => {\n if (!isPointerDown) return;\n const currentY = event.clientY - startY;\n \n if ((isTop && currentY < 0) || (!isTop && currentY > 0)) {\n if (event.cancelable) event.preventDefault();\n this.currentTranslateY.set(currentY);\n }\n };\n\n const pointerUp = (event: PointerEvent) => {\n if (!isPointerDown) return;\n isPointerDown = false;\n target.releasePointerCapture(event.pointerId);\n\n const deltaY = event.clientY - startY;\n const duration = event.timeStamp - startTime || 1;\n const velocityY = Math.abs(deltaY / duration);\n\n const crossedLimit = isTop ? (deltaY < -limit) : (deltaY > limit);\n\n if (crossedLimit || velocityY > 0.3) {\n this.closeToast();\n } else {\n this.currentTranslateY.set(0);\n if (this.config?.durationInMs) {\n this.autoCloseTimeout = setTimeout(() => this.closeToast(), this.config.durationInMs);\n }\n }\n };\n\n target.addEventListener('pointerdown', pointerDown, { passive: false });\n target.addEventListener('pointermove', pointerMove, { passive: false });\n target.addEventListener('pointerup', pointerUp);\n target.addEventListener('pointercancel', pointerUp);\n\n this.cleanupListeners = () => {\n target.removeEventListener('pointerdown', pointerDown);\n target.removeEventListener('pointermove', pointerMove);\n target.removeEventListener('pointerup', pointerUp);\n target.removeEventListener('pointercancel', pointerUp);\n };\n }\n\n private stopVerticalSwipeDetection(): void {\n this.isTrackingSwipe = false;\n if (this.cleanupListeners) {\n this.cleanupListeners();\n this.cleanupListeners = null;\n }\n }\n\n //#endregion\n}","<div #toastSwipeTarget class=\"toast-wrapper\" [ngClass]=\"wrapperClasses()\" [class.show]=\"isVisible()\"\n [class.no-animate]=\"!isAnimated()\" [class.default-wrapper]=\"config?.useDefaultWrapperClass !== false\"\n [style.transform]=\"modalTransform()\">\n <ng-container #dynamicContainer></ng-container>\n</div>","import { Injectable, inject, Injector, ApplicationRef, EnvironmentInjector, createComponent, ComponentRef } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { IToastConfig } from '../interfaces/itoast-config.interface';\nimport { ToastRef } from '../classes/toast-ref';\nimport { TOAST_DATA } from '../tokens/toast-data.token';\nimport { IToast } from '../interfaces/itoast.interface';\nimport { ToastrGlobalSettingsService } from './toastr-global-settings.service';\nimport { ToastPosition } from '../types/toastr.types';\nimport { ComponentType } from '@angular/cdk/portal';\nimport { ToastCore } from '../components/toast-core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ToastrService {\n private readonly injector = inject(Injector);\n private readonly appRef = inject(ApplicationRef);\n private readonly environmentInjector = inject(EnvironmentInjector);\n private readonly document = inject(DOCUMENT);\n private readonly globalSettings = inject(ToastrGlobalSettingsService);\n\n private toastQueue: (() => void)[] = [];\n private activeToasts: ComponentRef<unknown>[] = [];\n private containers: Map<ToastPosition, HTMLElement> = new Map();\n\n public queueToast<D, R, C extends IToast<D, R> = IToast<D, R>>(\n componentType: ComponentType<C>, \n config?: IToastConfig<D>\n ): void {\n const resolvedConfig = this.resolveConfig(config);\n \n this.toastQueue.push(() => this.buildAndAttachToast<D, R, C>(componentType, resolvedConfig));\n \n this.processQueue();\n }\n\n private processQueue(): void {\n const max = this.globalSettings.maxOpened();\n\n while (this.activeToasts.length < max && this.toastQueue.length > 0) {\n const buildNext = this.toastQueue.shift();\n if (buildNext) buildNext();\n }\n }\n\n private buildAndAttachToast<D, R, C extends IToast<D, R> = IToast<D, R>>(\n componentType: ComponentType<C>, \n config: IToastConfig<D>\n ): void {\n const dataInjector = Injector.create({\n providers: [{ provide: TOAST_DATA, useValue: config.data }],\n parent: this.injector\n });\n\n const contentRef = createComponent(componentType, {\n environmentInjector: this.environmentInjector,\n elementInjector: dataInjector\n });\n\n const toastRef = new ToastRef<R>(() => this.cleanupToast(wrapperRef));\n\n if (this.isIToast<D, R, C>(contentRef.instance)) {\n contentRef.instance.toast = toastRef;\n if (typeof contentRef.instance.onToastInit === 'function') {\n contentRef.instance.onToastInit();\n }\n }\n\n const wrapperInjector = Injector.create({\n providers: [{ provide: ToastRef, useValue: toastRef }],\n parent: this.injector\n });\n\n const wrapperRef = createComponent<ToastCore<D, R, C>>(ToastCore, {\n environmentInjector: this.environmentInjector,\n elementInjector: wrapperInjector\n });\n\n wrapperRef.instance.componentRef = contentRef;\n wrapperRef.instance.config = config;\n wrapperRef.instance.toastRef = toastRef;\n\n this.appRef.attachView(wrapperRef.hostView);\n\n const container = this.getContainer(config.position!);\n container.appendChild(wrapperRef.location.nativeElement);\n \n this.activeToasts.push(wrapperRef);\n }\n\n private cleanupToast<D, R, C extends IToast<D, R> = IToast<D, R>>(wrapperRef: ComponentRef<ToastCore<D, R, C>>): void {\n const index = this.activeToasts.indexOf(wrapperRef);\n if (index > -1) {\n this.activeToasts.splice(index, 1);\n }\n\n this.appRef.detachView(wrapperRef.hostView);\n wrapperRef.location.nativeElement.remove();\n wrapperRef.destroy();\n\n setTimeout(() => this.processQueue(), 200); \n }\n\n private getContainer(position: ToastPosition): HTMLElement {\n if (this.containers.has(position)) {\n return this.containers.get(position)!;\n }\n\n const container = this.document.createElement('div');\n container.classList.add('toast-container', `toast-container-${position}`);\n this.document.body.appendChild(container);\n this.containers.set(position, container);\n\n return container;\n }\n\n private resolveConfig<D>(config?: IToastConfig<D>): IToastConfig<D> {\n return {\n ...config,\n position: config?.position ?? this.globalSettings.position(),\n animate: config?.animate ?? this.globalSettings.animate(),\n useDefaultWrapperClass: config?.useDefaultWrapperClass ?? this.globalSettings.useDefaultWrapperClass(),\n durationInMs: config?.durationInMs ?? this.globalSettings.durationInMs(),\n swipeToDismiss: config?.swipeToDismiss ?? this.globalSettings.swipeToDismiss(),\n };\n }\n\n private isIToast<D, R, C extends IToast<D, R> = IToast<D, R>>(component: unknown): component is C {\n return typeof component === 'object' && component !== null && 'toast' in component;\n }\n}","import { inject, Injectable } from '@angular/core';\nimport { ToastRef } from './toast-ref';\nimport { TOAST_DATA } from '../tokens/toast-data.token';\nimport { IToast } from '../interfaces/itoast.interface';\n\n@Injectable()\nexport abstract class Toast<D = unknown, R = unknown> implements IToast<D, R> {\n /**\n * Data injected into the toast component.\n */\n public data = inject<D>(TOAST_DATA);\n\n /**\n * Reference to the ToastRef instance associated with this toast.\n */\n public toast!: ToastRef<R>;\n\n /**\n * Called when the toast is initialized.\n */\n public onToastInit(): void {}\n\n /**\n * Closes the toast with an optional result.\n * @param result The result to be passed when closing the toast.\n */\n public close(result?: R): void {\n this.toast?.close(result);\n }\n}","/*\n * Public API Surface of toastr\n */\n\nexport * from './lib/services/toastr.service';\nexport * from './lib/services/toastr-global-settings.service';\n\nexport * from './lib/components/toast-core';\n\nexport * from './lib/interfaces/itoast-config.interface';\nexport * from './lib/interfaces/itoast.interface';\n\nexport * from './lib/types/toastr.types';\n\nexport * from './lib/tokens/toast-data.token';\n\nexport * from './lib/classes/toast-ref';\nexport * from './lib/classes/toast';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "@filip.mazev/toastr",
3
+ "version": "0.0.1",
4
+ "license": "MIT",
5
+ "exports": {
6
+ "./_toastr-theme": "./lib/styles/_toastr-theme.scss",
7
+ "./index": "./lib/styles/_index.scss",
8
+ "./package.json": {
9
+ "default": "./package.json"
10
+ },
11
+ ".": {
12
+ "types": "./types/filip.mazev-toastr.d.ts",
13
+ "default": "./fesm2022/filip.mazev-toastr.mjs"
14
+ }
15
+ },
16
+ "style": "src/lib/styles/_index.scss",
17
+ "sass": "src/lib/styles/_index.scss",
18
+ "peerDependencies": {
19
+ "@angular/common": "^21.1.1",
20
+ "@angular/core": "^21.1.1"
21
+ },
22
+ "dependencies": {
23
+ "tslib": "^2.3.0"
24
+ },
25
+ "sideEffects": false,
26
+ "module": "fesm2022/filip.mazev-toastr.mjs",
27
+ "typings": "types/filip.mazev-toastr.d.ts"
28
+ }
@@ -0,0 +1,124 @@
1
+ import * as rxjs from 'rxjs';
2
+ import { ComponentType } from '@angular/cdk/portal';
3
+ import * as _angular_core from '@angular/core';
4
+ import { OnInit, OnDestroy, ComponentRef, ViewContainerRef, ElementRef, InjectionToken } from '@angular/core';
5
+
6
+ type ToastPosition = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'top-center' | 'bottom-center';
7
+
8
+ interface IToastConfig<D = unknown> {
9
+ data?: D;
10
+ position?: ToastPosition;
11
+ useDefaultWrapperClass?: boolean;
12
+ durationInMs?: number;
13
+ swipeToDismiss?: boolean;
14
+ animate?: boolean;
15
+ maxOpened?: number;
16
+ }
17
+
18
+ declare class ToastRef<R = any> {
19
+ private readonly closeFn;
20
+ private afterClosedSubject;
21
+ afterClosed$: rxjs.Observable<R | undefined>;
22
+ constructor(closeFn: (result?: R) => void);
23
+ close(result?: R): void;
24
+ }
25
+
26
+ interface IToast<D, R> {
27
+ data: D;
28
+ toast: ToastRef<R>;
29
+ onToastInit?(): void;
30
+ }
31
+
32
+ declare class ToastrService {
33
+ private readonly injector;
34
+ private readonly appRef;
35
+ private readonly environmentInjector;
36
+ private readonly document;
37
+ private readonly globalSettings;
38
+ private toastQueue;
39
+ private activeToasts;
40
+ private containers;
41
+ queueToast<D, R, C extends IToast<D, R> = IToast<D, R>>(componentType: ComponentType<C>, config?: IToastConfig<D>): void;
42
+ private processQueue;
43
+ private buildAndAttachToast;
44
+ private cleanupToast;
45
+ private getContainer;
46
+ private resolveConfig;
47
+ private isIToast;
48
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ToastrService, never>;
49
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<ToastrService>;
50
+ }
51
+
52
+ declare class ToastrGlobalSettingsService {
53
+ readonly position: _angular_core.WritableSignal<ToastPosition>;
54
+ readonly animate: _angular_core.WritableSignal<boolean>;
55
+ readonly useDefaultWrapperClass: _angular_core.WritableSignal<boolean>;
56
+ readonly durationInMs: _angular_core.WritableSignal<number>;
57
+ readonly swipeToDismiss: _angular_core.WritableSignal<boolean>;
58
+ readonly maxOpened: _angular_core.WritableSignal<number>;
59
+ /**
60
+ * Updates the global toast settings with the provided values.
61
+ * @param settings An object containing the settings to be updated.
62
+ */
63
+ update(settings: Partial<{
64
+ position: ToastPosition;
65
+ animate: boolean;
66
+ useDefaultWrapperClass: boolean;
67
+ durationInMs: number;
68
+ swipeToDismiss: boolean;
69
+ maxOpened: number;
70
+ }>): void;
71
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ToastrGlobalSettingsService, never>;
72
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<ToastrGlobalSettingsService>;
73
+ }
74
+
75
+ declare class ToastCore<D, R, C extends IToast<D, R> = IToast<D, R>> implements OnInit, OnDestroy {
76
+ componentRef: ComponentRef<C>;
77
+ config?: IToastConfig<D>;
78
+ toastRef: ToastRef<R>;
79
+ isVisible: _angular_core.WritableSignal<boolean>;
80
+ currentTranslateY: _angular_core.WritableSignal<number>;
81
+ isSwipingFinished: _angular_core.WritableSignal<boolean>;
82
+ protected isAnimated: _angular_core.Signal<boolean>;
83
+ protected dynamicContainer: ViewContainerRef;
84
+ protected toastSwipeTarget: ElementRef;
85
+ protected wrapperClasses: _angular_core.Signal<"anim-dir-top" | "anim-dir-bottom">;
86
+ protected modalTransform: _angular_core.Signal<string | null>;
87
+ private isTrackingSwipe;
88
+ private cleanupListeners;
89
+ private autoCloseTimeout?;
90
+ ngOnInit(): void;
91
+ ngOnDestroy(): void;
92
+ closeToast(): void;
93
+ private startVerticalSwipeDetection;
94
+ private stopVerticalSwipeDetection;
95
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ToastCore<any, any, any>, never>;
96
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ToastCore<any, any, any>, "app-toast-core", never, {}, {}, never, never, true, never>;
97
+ }
98
+
99
+ declare const TOAST_DATA: InjectionToken<any>;
100
+
101
+ declare abstract class Toast<D = unknown, R = unknown> implements IToast<D, R> {
102
+ /**
103
+ * Data injected into the toast component.
104
+ */
105
+ data: D;
106
+ /**
107
+ * Reference to the ToastRef instance associated with this toast.
108
+ */
109
+ toast: ToastRef<R>;
110
+ /**
111
+ * Called when the toast is initialized.
112
+ */
113
+ onToastInit(): void;
114
+ /**
115
+ * Closes the toast with an optional result.
116
+ * @param result The result to be passed when closing the toast.
117
+ */
118
+ close(result?: R): void;
119
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Toast<any, any>, never>;
120
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<Toast<any, any>>;
121
+ }
122
+
123
+ export { TOAST_DATA, Toast, ToastCore, ToastRef, ToastrGlobalSettingsService, ToastrService };
124
+ export type { IToast, IToastConfig, ToastPosition };