ng-toast-alerts 1.0.0

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.
@@ -0,0 +1,106 @@
1
+ import { Component, ChangeDetectionStrategy } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "../toast.service";
5
+ import * as i2 from "@angular/common";
6
+ export class ToastContainerComponent {
7
+ constructor(toastService, cdr) {
8
+ this.toastService = toastService;
9
+ this.cdr = cdr;
10
+ this.toasts = [];
11
+ this.icons = {
12
+ success: '✔',
13
+ error: '✖',
14
+ warning: '⚠',
15
+ info: 'ℹ',
16
+ };
17
+ }
18
+ ngOnInit() {
19
+ this.sub = this.toastService.toasts$.subscribe(toasts => {
20
+ this.toasts = toasts;
21
+ this.cdr.markForCheck();
22
+ });
23
+ }
24
+ ngOnDestroy() {
25
+ this.sub?.unsubscribe();
26
+ }
27
+ dismiss(id) {
28
+ this.toastService.dismiss(id);
29
+ }
30
+ trackById(_index, toast) {
31
+ return toast.id;
32
+ }
33
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ToastContainerComponent, deps: [{ token: i1.ToastService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
34
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ToastContainerComponent, isStandalone: true, selector: "ng-toast-container", ngImport: i0, template: `
35
+ <div class="ng-toast-container" role="region" aria-label="Notifications" aria-live="polite">
36
+ <div
37
+ *ngFor="let toast of toasts; trackBy: trackById"
38
+ class="ng-toast ng-toast--{{ toast.type }}"
39
+ role="alert"
40
+ [attr.aria-label]="toast.type + ': ' + toast.message"
41
+ >
42
+ <!-- Icon -->
43
+ <span class="ng-toast__icon" aria-hidden="true">{{ icons[toast.type] }}</span>
44
+
45
+ <!-- Body -->
46
+ <div class="ng-toast__body">
47
+ <strong *ngIf="toast.title" class="ng-toast__title">{{ toast.title }}</strong>
48
+ <span class="ng-toast__message">{{ toast.message }}</span>
49
+ </div>
50
+
51
+ <!-- Dismiss button -->
52
+ <button
53
+ class="ng-toast__close"
54
+ (click)="dismiss(toast.id)"
55
+ aria-label="Dismiss notification"
56
+ type="button"
57
+ >&#x2715;</button>
58
+
59
+ <!-- Progress bar (only when duration > 0) -->
60
+ <div
61
+ *ngIf="toast.duration > 0"
62
+ class="ng-toast__progress"
63
+ [style.animation-duration.ms]="toast.duration"
64
+ ></div>
65
+ </div>
66
+ </div>
67
+ `, isInline: true, styles: [".ng-toast-container{position:fixed;bottom:1.5rem;right:1.5rem;z-index:9999;display:flex;flex-direction:column;gap:.625rem;max-width:360px;width:100%;pointer-events:none}.ng-toast{display:flex;align-items:flex-start;gap:.75rem;padding:.875rem 1rem;border-radius:8px;box-shadow:0 4px 16px #00000026;background:#fff;border-left:4px solid;position:relative;overflow:hidden;pointer-events:all;animation:ng-toast-in .25s ease;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;font-size:.875rem;line-height:1.4;color:#1a1a1a}.ng-toast--success{border-color:#22c55e}.ng-toast--error{border-color:#ef4444}.ng-toast--warning{border-color:#f59e0b}.ng-toast--info{border-color:#3b82f6}.ng-toast__icon{font-size:1.1rem;flex-shrink:0;margin-top:1px}.ng-toast--success .ng-toast__icon{color:#22c55e}.ng-toast--error .ng-toast__icon{color:#ef4444}.ng-toast--warning .ng-toast__icon{color:#f59e0b}.ng-toast--info .ng-toast__icon{color:#3b82f6}.ng-toast__body{flex:1;display:flex;flex-direction:column;gap:2px}.ng-toast__title{font-weight:600;font-size:.875rem}.ng-toast__message{color:#444}.ng-toast__close{background:none;border:none;cursor:pointer;color:#999;font-size:.875rem;line-height:1;padding:2px 4px;border-radius:4px;flex-shrink:0;transition:color .15s,background .15s}.ng-toast__close:hover{color:#333;background:#0000000f}.ng-toast__progress{position:absolute;bottom:0;left:0;height:3px;width:100%;background:#0000001f;transform-origin:left;animation:ng-toast-progress linear forwards}@keyframes ng-toast-in{0%{opacity:0;transform:translate(60px)}to{opacity:1;transform:translate(0)}}@keyframes ng-toast-progress{0%{transform:scaleX(1)}to{transform:scaleX(0)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
68
+ }
69
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ToastContainerComponent, decorators: [{
70
+ type: Component,
71
+ args: [{ selector: 'ng-toast-container', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
72
+ <div class="ng-toast-container" role="region" aria-label="Notifications" aria-live="polite">
73
+ <div
74
+ *ngFor="let toast of toasts; trackBy: trackById"
75
+ class="ng-toast ng-toast--{{ toast.type }}"
76
+ role="alert"
77
+ [attr.aria-label]="toast.type + ': ' + toast.message"
78
+ >
79
+ <!-- Icon -->
80
+ <span class="ng-toast__icon" aria-hidden="true">{{ icons[toast.type] }}</span>
81
+
82
+ <!-- Body -->
83
+ <div class="ng-toast__body">
84
+ <strong *ngIf="toast.title" class="ng-toast__title">{{ toast.title }}</strong>
85
+ <span class="ng-toast__message">{{ toast.message }}</span>
86
+ </div>
87
+
88
+ <!-- Dismiss button -->
89
+ <button
90
+ class="ng-toast__close"
91
+ (click)="dismiss(toast.id)"
92
+ aria-label="Dismiss notification"
93
+ type="button"
94
+ >&#x2715;</button>
95
+
96
+ <!-- Progress bar (only when duration > 0) -->
97
+ <div
98
+ *ngIf="toast.duration > 0"
99
+ class="ng-toast__progress"
100
+ [style.animation-duration.ms]="toast.duration"
101
+ ></div>
102
+ </div>
103
+ </div>
104
+ `, styles: [".ng-toast-container{position:fixed;bottom:1.5rem;right:1.5rem;z-index:9999;display:flex;flex-direction:column;gap:.625rem;max-width:360px;width:100%;pointer-events:none}.ng-toast{display:flex;align-items:flex-start;gap:.75rem;padding:.875rem 1rem;border-radius:8px;box-shadow:0 4px 16px #00000026;background:#fff;border-left:4px solid;position:relative;overflow:hidden;pointer-events:all;animation:ng-toast-in .25s ease;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;font-size:.875rem;line-height:1.4;color:#1a1a1a}.ng-toast--success{border-color:#22c55e}.ng-toast--error{border-color:#ef4444}.ng-toast--warning{border-color:#f59e0b}.ng-toast--info{border-color:#3b82f6}.ng-toast__icon{font-size:1.1rem;flex-shrink:0;margin-top:1px}.ng-toast--success .ng-toast__icon{color:#22c55e}.ng-toast--error .ng-toast__icon{color:#ef4444}.ng-toast--warning .ng-toast__icon{color:#f59e0b}.ng-toast--info .ng-toast__icon{color:#3b82f6}.ng-toast__body{flex:1;display:flex;flex-direction:column;gap:2px}.ng-toast__title{font-weight:600;font-size:.875rem}.ng-toast__message{color:#444}.ng-toast__close{background:none;border:none;cursor:pointer;color:#999;font-size:.875rem;line-height:1;padding:2px 4px;border-radius:4px;flex-shrink:0;transition:color .15s,background .15s}.ng-toast__close:hover{color:#333;background:#0000000f}.ng-toast__progress{position:absolute;bottom:0;left:0;height:3px;width:100%;background:#0000001f;transform-origin:left;animation:ng-toast-progress linear forwards}@keyframes ng-toast-in{0%{opacity:0;transform:translate(60px)}to{opacity:1;transform:translate(0)}}@keyframes ng-toast-progress{0%{transform:scaleX(1)}to{transform:scaleX(0)}}\n"] }]
105
+ }], ctorParameters: () => [{ type: i1.ToastService }, { type: i0.ChangeDetectorRef }] });
106
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3QtY29udGFpbmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdG9hc3QtY29udGFpbmVyL3RvYXN0LWNvbnRhaW5lci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsdUJBQXVCLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQ3pHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7OztBQStKL0MsTUFBTSxPQUFPLHVCQUF1QjtJQVlsQyxZQUNVLFlBQTBCLEVBQzFCLEdBQXNCO1FBRHRCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBYmhDLFdBQU0sR0FBWSxFQUFFLENBQUM7UUFFWixVQUFLLEdBQTJCO1lBQ3ZDLE9BQU8sRUFBRSxHQUFHO1lBQ1osS0FBSyxFQUFJLEdBQUc7WUFDWixPQUFPLEVBQUUsR0FBRztZQUNaLElBQUksRUFBSyxHQUFHO1NBQ2IsQ0FBQztJQU9DLENBQUM7SUFFSixRQUFRO1FBQ04sSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDdEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7WUFDckIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLEdBQUcsRUFBRSxXQUFXLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsT0FBTyxDQUFDLEVBQVU7UUFDaEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELFNBQVMsQ0FBQyxNQUFjLEVBQUUsS0FBWTtRQUNwQyxPQUFPLEtBQUssQ0FBQyxFQUFFLENBQUM7SUFDbEIsQ0FBQzsrR0FsQ1UsdUJBQXVCO21HQUF2Qix1QkFBdUIsOEVBckp4Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUNULGl0REFuQ1MsWUFBWTs7NEZBdUpYLHVCQUF1QjtrQkExSm5DLFNBQVM7K0JBQ0Usb0JBQW9CLGNBQ2xCLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxtQkFDTix1QkFBdUIsQ0FBQyxNQUFNLFlBQ3JDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQ1QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT25EZXN0cm95LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRvYXN0IH0gZnJvbSAnLi4vdG9hc3QubW9kZWwnO1xuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAnLi4vdG9hc3Quc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25nLXRvYXN0LWNvbnRhaW5lcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwibmctdG9hc3QtY29udGFpbmVyXCIgcm9sZT1cInJlZ2lvblwiIGFyaWEtbGFiZWw9XCJOb3RpZmljYXRpb25zXCIgYXJpYS1saXZlPVwicG9saXRlXCI+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0Zvcj1cImxldCB0b2FzdCBvZiB0b2FzdHM7IHRyYWNrQnk6IHRyYWNrQnlJZFwiXG4gICAgICAgIGNsYXNzPVwibmctdG9hc3QgbmctdG9hc3QtLXt7IHRvYXN0LnR5cGUgfX1cIlxuICAgICAgICByb2xlPVwiYWxlcnRcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRvYXN0LnR5cGUgKyAnOiAnICsgdG9hc3QubWVzc2FnZVwiXG4gICAgICA+XG4gICAgICAgIDwhLS0gSWNvbiAtLT5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJuZy10b2FzdF9faWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPnt7IGljb25zW3RvYXN0LnR5cGVdIH19PC9zcGFuPlxuXG4gICAgICAgIDwhLS0gQm9keSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm5nLXRvYXN0X19ib2R5XCI+XG4gICAgICAgICAgPHN0cm9uZyAqbmdJZj1cInRvYXN0LnRpdGxlXCIgY2xhc3M9XCJuZy10b2FzdF9fdGl0bGVcIj57eyB0b2FzdC50aXRsZSB9fTwvc3Ryb25nPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmctdG9hc3RfX21lc3NhZ2VcIj57eyB0b2FzdC5tZXNzYWdlIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIERpc21pc3MgYnV0dG9uIC0tPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJuZy10b2FzdF9fY2xvc2VcIlxuICAgICAgICAgIChjbGljayk9XCJkaXNtaXNzKHRvYXN0LmlkKVwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIkRpc21pc3Mgbm90aWZpY2F0aW9uXCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgPiYjeDI3MTU7PC9idXR0b24+XG5cbiAgICAgICAgPCEtLSBQcm9ncmVzcyBiYXIgKG9ubHkgd2hlbiBkdXJhdGlvbiA+IDApIC0tPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKm5nSWY9XCJ0b2FzdC5kdXJhdGlvbiA+IDBcIlxuICAgICAgICAgIGNsYXNzPVwibmctdG9hc3RfX3Byb2dyZXNzXCJcbiAgICAgICAgICBbc3R5bGUuYW5pbWF0aW9uLWR1cmF0aW9uLm1zXT1cInRvYXN0LmR1cmF0aW9uXCJcbiAgICAgICAgPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlczogW2BcbiAgICAubmctdG9hc3QtY29udGFpbmVyIHtcbiAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgIGJvdHRvbTogMS41cmVtO1xuICAgICAgcmlnaHQ6IDEuNXJlbTtcbiAgICAgIHotaW5kZXg6IDk5OTk7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGdhcDogMC42MjVyZW07XG4gICAgICBtYXgtd2lkdGg6IDM2MHB4O1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICB9XG5cbiAgICAubmctdG9hc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICAgICAgZ2FwOiAwLjc1cmVtO1xuICAgICAgcGFkZGluZzogMC44NzVyZW0gMXJlbTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgIGJveC1zaGFkb3c6IDAgNHB4IDE2cHggcmdiYSgwLCAwLCAwLCAwLjE1KTtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmY7XG4gICAgICBib3JkZXItbGVmdDogNHB4IHNvbGlkO1xuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBhbGw7XG4gICAgICBhbmltYXRpb246IG5nLXRvYXN0LWluIDAuMjVzIGVhc2U7XG4gICAgICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCBzYW5zLXNlcmlmO1xuICAgICAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgICAgIGxpbmUtaGVpZ2h0OiAxLjQ7XG4gICAgICBjb2xvcjogIzFhMWExYTtcbiAgICB9XG5cbiAgICAvKiBUeXBlIGNvbG91cnMgKi9cbiAgICAubmctdG9hc3QtLXN1Y2Nlc3MgeyBib3JkZXItY29sb3I6ICMyMmM1NWU7IH1cbiAgICAubmctdG9hc3QtLWVycm9yICAgeyBib3JkZXItY29sb3I6ICNlZjQ0NDQ7IH1cbiAgICAubmctdG9hc3QtLXdhcm5pbmcgeyBib3JkZXItY29sb3I6ICNmNTllMGI7IH1cbiAgICAubmctdG9hc3QtLWluZm8gICAgeyBib3JkZXItY29sb3I6ICMzYjgyZjY7IH1cblxuICAgIC5uZy10b2FzdF9faWNvbiB7XG4gICAgICBmb250LXNpemU6IDEuMXJlbTtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgbWFyZ2luLXRvcDogMXB4O1xuICAgIH1cblxuICAgIC5uZy10b2FzdC0tc3VjY2VzcyAubmctdG9hc3RfX2ljb24geyBjb2xvcjogIzIyYzU1ZTsgfVxuICAgIC5uZy10b2FzdC0tZXJyb3IgICAubmctdG9hc3RfX2ljb24geyBjb2xvcjogI2VmNDQ0NDsgfVxuICAgIC5uZy10b2FzdC0td2FybmluZyAubmctdG9hc3RfX2ljb24geyBjb2xvcjogI2Y1OWUwYjsgfVxuICAgIC5uZy10b2FzdC0taW5mbyAgICAubmctdG9hc3RfX2ljb24geyBjb2xvcjogIzNiODJmNjsgfVxuXG4gICAgLm5nLXRvYXN0X19ib2R5IHtcbiAgICAgIGZsZXg6IDE7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGdhcDogMnB4O1xuICAgIH1cblxuICAgIC5uZy10b2FzdF9fdGl0bGUge1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gICAgfVxuXG4gICAgLm5nLXRvYXN0X19tZXNzYWdlIHtcbiAgICAgIGNvbG9yOiAjNDQ0O1xuICAgIH1cblxuICAgIC5uZy10b2FzdF9fY2xvc2Uge1xuICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIGNvbG9yOiAjOTk5O1xuICAgICAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgICAgIGxpbmUtaGVpZ2h0OiAxO1xuICAgICAgcGFkZGluZzogMnB4IDRweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgdHJhbnNpdGlvbjogY29sb3IgMC4xNXMsIGJhY2tncm91bmQgMC4xNXM7XG4gICAgfVxuXG4gICAgLm5nLXRvYXN0X19jbG9zZTpob3ZlciB7XG4gICAgICBjb2xvcjogIzMzMztcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4wNik7XG4gICAgfVxuXG4gICAgLyogUHJvZ3Jlc3MgYmFyICovXG4gICAgLm5nLXRvYXN0X19wcm9ncmVzcyB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBib3R0b206IDA7XG4gICAgICBsZWZ0OiAwO1xuICAgICAgaGVpZ2h0OiAzcHg7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4xMik7XG4gICAgICB0cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0O1xuICAgICAgYW5pbWF0aW9uOiBuZy10b2FzdC1wcm9ncmVzcyBsaW5lYXIgZm9yd2FyZHM7XG4gICAgfVxuXG4gICAgLyogU2xpZGUtaW4gYW5pbWF0aW9uICovXG4gICAgQGtleWZyYW1lcyBuZy10b2FzdC1pbiB7XG4gICAgICBmcm9tIHtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDYwcHgpO1xuICAgICAgfVxuICAgICAgdG8ge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogU2hyaW5rIHByb2dyZXNzIGJhciAqL1xuICAgIEBrZXlmcmFtZXMgbmctdG9hc3QtcHJvZ3Jlc3Mge1xuICAgICAgZnJvbSB7IHRyYW5zZm9ybTogc2NhbGVYKDEpOyB9XG4gICAgICB0byAgIHsgdHJhbnNmb3JtOiBzY2FsZVgoMCk7IH1cbiAgICB9XG4gIGBdXG59KVxuZXhwb3J0IGNsYXNzIFRvYXN0Q29udGFpbmVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICB0b2FzdHM6IFRvYXN0W10gPSBbXTtcblxuICByZWFkb25seSBpY29uczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICBzdWNjZXNzOiAn4pyUJyxcbiAgICBlcnJvcjogICAn4pyWJyxcbiAgICB3YXJuaW5nOiAn4pqgJyxcbiAgICBpbmZvOiAgICAn4oS5JyxcbiAgfTtcblxuICBwcml2YXRlIHN1YiE6IFN1YnNjcmlwdGlvbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHRvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdWIgPSB0aGlzLnRvYXN0U2VydmljZS50b2FzdHMkLnN1YnNjcmliZSh0b2FzdHMgPT4ge1xuICAgICAgdGhpcy50b2FzdHMgPSB0b2FzdHM7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3ViPy51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgZGlzbWlzcyhpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy50b2FzdFNlcnZpY2UuZGlzbWlzcyhpZCk7XG4gIH1cblxuICB0cmFja0J5SWQoX2luZGV4OiBudW1iZXIsIHRvYXN0OiBUb2FzdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRvYXN0LmlkO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3QubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RvYXN0Lm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBUb2FzdFR5cGUgPSAnc3VjY2VzcycgfCAnZXJyb3InIHwgJ3dhcm5pbmcnIHwgJ2luZm8nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRvYXN0IHtcbiAgaWQ6IHN0cmluZztcbiAgbWVzc2FnZTogc3RyaW5nO1xuICB0eXBlOiBUb2FzdFR5cGU7XG4gIGR1cmF0aW9uOiBudW1iZXI7XG4gIHRpdGxlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRvYXN0T3B0aW9ucyB7XG4gIC8qKiBEaXNwbGF5IHRpdGxlIGFib3ZlIHRoZSBtZXNzYWdlICovXG4gIHRpdGxlPzogc3RyaW5nO1xuICAvKiogQXV0by1kaXNtaXNzIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcy4gRGVmYXVsdDogMzAwMC4gU2V0IHRvIDAgdG8gZGlzYWJsZS4gKi9cbiAgZHVyYXRpb24/OiBudW1iZXI7XG59XG4iXX0=
@@ -0,0 +1,41 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { ToastContainerComponent } from './toast-container/toast-container.component';
4
+ import { ToastService } from './toast.service';
5
+ import * as i0 from "@angular/core";
6
+ /**
7
+ * NgToastAlertsModule
8
+ *
9
+ * Usage (NgModule-based apps):
10
+ * Import in AppModule:
11
+ * NgToastAlertsModule.forRoot()
12
+ *
13
+ * Add the container once in your AppComponent template:
14
+ * <ng-toast-container></ng-toast-container>
15
+ *
16
+ * Usage (standalone apps):
17
+ * Import ToastContainerComponent directly and provide ToastService in bootstrapApplication.
18
+ */
19
+ export class NgToastAlertsModule {
20
+ /**
21
+ * Call forRoot() in the root AppModule to register the singleton ToastService.
22
+ * Do NOT call forRoot() in lazy-loaded or feature modules.
23
+ */
24
+ static forRoot() {
25
+ return {
26
+ ngModule: NgToastAlertsModule,
27
+ providers: [ToastService],
28
+ };
29
+ }
30
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgToastAlertsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
31
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.12", ngImport: i0, type: NgToastAlertsModule, imports: [CommonModule, ToastContainerComponent], exports: [ToastContainerComponent] }); }
32
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgToastAlertsModule, imports: [CommonModule, ToastContainerComponent] }); }
33
+ }
34
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgToastAlertsModule, decorators: [{
35
+ type: NgModule,
36
+ args: [{
37
+ imports: [CommonModule, ToastContainerComponent],
38
+ exports: [ToastContainerComponent],
39
+ }]
40
+ }] });
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3QubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90b2FzdC5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBdUIsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7QUFFL0M7Ozs7Ozs7Ozs7OztHQVlHO0FBS0gsTUFBTSxPQUFPLG1CQUFtQjtJQUM5Qjs7O09BR0c7SUFDSCxNQUFNLENBQUMsT0FBTztRQUNaLE9BQU87WUFDTCxRQUFRLEVBQUUsbUJBQW1CO1lBQzdCLFNBQVMsRUFBRSxDQUFDLFlBQVksQ0FBQztTQUMxQixDQUFDO0lBQ0osQ0FBQzsrR0FWVSxtQkFBbUI7Z0hBQW5CLG1CQUFtQixZQUhwQixZQUFZLEVBQUUsdUJBQXVCLGFBQ3JDLHVCQUF1QjtnSEFFdEIsbUJBQW1CLFlBSHBCLFlBQVksRUFBRSx1QkFBdUI7OzRGQUdwQyxtQkFBbUI7a0JBSi9CLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFLENBQUMsWUFBWSxFQUFFLHVCQUF1QixDQUFDO29CQUNoRCxPQUFPLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQztpQkFDbkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSwgTW9kdWxlV2l0aFByb3ZpZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFRvYXN0Q29udGFpbmVyQ29tcG9uZW50IH0gZnJvbSAnLi90b2FzdC1jb250YWluZXIvdG9hc3QtY29udGFpbmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICcuL3RvYXN0LnNlcnZpY2UnO1xuXG4vKipcbiAqIE5nVG9hc3RBbGVydHNNb2R1bGVcbiAqXG4gKiBVc2FnZSAoTmdNb2R1bGUtYmFzZWQgYXBwcyk6XG4gKiAgIEltcG9ydCBpbiBBcHBNb2R1bGU6XG4gKiAgICAgTmdUb2FzdEFsZXJ0c01vZHVsZS5mb3JSb290KClcbiAqXG4gKiAgIEFkZCB0aGUgY29udGFpbmVyIG9uY2UgaW4geW91ciBBcHBDb21wb25lbnQgdGVtcGxhdGU6XG4gKiAgICAgPG5nLXRvYXN0LWNvbnRhaW5lcj48L25nLXRvYXN0LWNvbnRhaW5lcj5cbiAqXG4gKiBVc2FnZSAoc3RhbmRhbG9uZSBhcHBzKTpcbiAqICAgSW1wb3J0IFRvYXN0Q29udGFpbmVyQ29tcG9uZW50IGRpcmVjdGx5IGFuZCBwcm92aWRlIFRvYXN0U2VydmljZSBpbiBib290c3RyYXBBcHBsaWNhdGlvbi5cbiAqL1xuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgVG9hc3RDb250YWluZXJDb21wb25lbnRdLFxuICBleHBvcnRzOiBbVG9hc3RDb250YWluZXJDb21wb25lbnRdLFxufSlcbmV4cG9ydCBjbGFzcyBOZ1RvYXN0QWxlcnRzTW9kdWxlIHtcbiAgLyoqXG4gICAqIENhbGwgZm9yUm9vdCgpIGluIHRoZSByb290IEFwcE1vZHVsZSB0byByZWdpc3RlciB0aGUgc2luZ2xldG9uIFRvYXN0U2VydmljZS5cbiAgICogRG8gTk9UIGNhbGwgZm9yUm9vdCgpIGluIGxhenktbG9hZGVkIG9yIGZlYXR1cmUgbW9kdWxlcy5cbiAgICovXG4gIHN0YXRpYyBmb3JSb290KCk6IE1vZHVsZVdpdGhQcm92aWRlcnM8TmdUb2FzdEFsZXJ0c01vZHVsZT4ge1xuICAgIHJldHVybiB7XG4gICAgICBuZ01vZHVsZTogTmdUb2FzdEFsZXJ0c01vZHVsZSxcbiAgICAgIHByb3ZpZGVyczogW1RvYXN0U2VydmljZV0sXG4gICAgfTtcbiAgfVxufVxuIl19
@@ -0,0 +1,56 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { BehaviorSubject } from 'rxjs';
3
+ import * as i0 from "@angular/core";
4
+ export class ToastService {
5
+ constructor() {
6
+ this.toastsSubject = new BehaviorSubject([]);
7
+ /** Observable list of active toasts — the container component subscribes to this. */
8
+ this.toasts$ = this.toastsSubject.asObservable();
9
+ }
10
+ // ── Public API ────────────────────────────────────────────────────────────
11
+ success(message, options) {
12
+ this.add(message, 'success', options);
13
+ }
14
+ error(message, options) {
15
+ this.add(message, 'error', { duration: 5000, ...options });
16
+ }
17
+ warning(message, options) {
18
+ this.add(message, 'warning', options);
19
+ }
20
+ info(message, options) {
21
+ this.add(message, 'info', options);
22
+ }
23
+ /** Manually dismiss a toast by its id. */
24
+ dismiss(id) {
25
+ this.toastsSubject.next(this.toastsSubject.getValue().filter(t => t.id !== id));
26
+ }
27
+ /** Dismiss all active toasts immediately. */
28
+ clear() {
29
+ this.toastsSubject.next([]);
30
+ }
31
+ // ── Internal ──────────────────────────────────────────────────────────────
32
+ add(message, type, options) {
33
+ const duration = options?.duration ?? 3000;
34
+ const toast = {
35
+ id: this.generateId(),
36
+ message,
37
+ type,
38
+ duration,
39
+ title: options?.title,
40
+ };
41
+ this.toastsSubject.next([...this.toastsSubject.getValue(), toast]);
42
+ if (duration > 0) {
43
+ setTimeout(() => this.dismiss(toast.id), duration);
44
+ }
45
+ }
46
+ generateId() {
47
+ return `toast-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;
48
+ }
49
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ToastService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
50
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ToastService, providedIn: 'root' }); }
51
+ }
52
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ToastService, decorators: [{
53
+ type: Injectable,
54
+ args: [{ providedIn: 'root' }]
55
+ }] });
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3Quc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvdG9hc3Quc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7O0FBSW5ELE1BQU0sT0FBTyxZQUFZO0lBRHpCO1FBRVUsa0JBQWEsR0FBRyxJQUFJLGVBQWUsQ0FBVSxFQUFFLENBQUMsQ0FBQztRQUV6RCxxRkFBcUY7UUFDNUUsWUFBTyxHQUF3QixJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFDO0tBc0QzRTtJQXBEQyw2RUFBNkU7SUFFN0UsT0FBTyxDQUFDLE9BQWUsRUFBRSxPQUFzQjtRQUM3QyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFlLEVBQUUsT0FBc0I7UUFDM0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVELE9BQU8sQ0FBQyxPQUFlLEVBQUUsT0FBc0I7UUFDN0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxJQUFJLENBQUMsT0FBZSxFQUFFLE9BQXNCO1FBQzFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsMENBQTBDO0lBQzFDLE9BQU8sQ0FBQyxFQUFVO1FBQ2hCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUNyQixJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQ3ZELENBQUM7SUFDSixDQUFDO0lBRUQsNkNBQTZDO0lBQzdDLEtBQUs7UUFDSCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsNkVBQTZFO0lBRXJFLEdBQUcsQ0FBQyxPQUFlLEVBQUUsSUFBZSxFQUFFLE9BQXNCO1FBQ2xFLE1BQU0sUUFBUSxHQUFHLE9BQU8sRUFBRSxRQUFRLElBQUksSUFBSSxDQUFDO1FBQzNDLE1BQU0sS0FBSyxHQUFVO1lBQ25CLEVBQUUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ3JCLE9BQU87WUFDUCxJQUFJO1lBQ0osUUFBUTtZQUNSLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSztTQUN0QixDQUFDO1FBRUYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUVuRSxJQUFJLFFBQVEsR0FBRyxDQUFDLEVBQUU7WUFDaEIsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQ3BEO0lBQ0gsQ0FBQztJQUVPLFVBQVU7UUFDaEIsT0FBTyxTQUFTLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUN6RSxDQUFDOytHQXpEVSxZQUFZO21IQUFaLFlBQVksY0FEQyxNQUFNOzs0RkFDbkIsWUFBWTtrQkFEeEIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRvYXN0LCBUb2FzdE9wdGlvbnMsIFRvYXN0VHlwZSB9IGZyb20gJy4vdG9hc3QubW9kZWwnO1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFRvYXN0U2VydmljZSB7XG4gIHByaXZhdGUgdG9hc3RzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VG9hc3RbXT4oW10pO1xuXG4gIC8qKiBPYnNlcnZhYmxlIGxpc3Qgb2YgYWN0aXZlIHRvYXN0cyDigJQgdGhlIGNvbnRhaW5lciBjb21wb25lbnQgc3Vic2NyaWJlcyB0byB0aGlzLiAqL1xuICByZWFkb25seSB0b2FzdHMkOiBPYnNlcnZhYmxlPFRvYXN0W10+ID0gdGhpcy50b2FzdHNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIC8vIOKUgOKUgCBQdWJsaWMgQVBJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHN1Y2Nlc3MobWVzc2FnZTogc3RyaW5nLCBvcHRpb25zPzogVG9hc3RPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5hZGQobWVzc2FnZSwgJ3N1Y2Nlc3MnLCBvcHRpb25zKTtcbiAgfVxuXG4gIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgb3B0aW9ucz86IFRvYXN0T3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMuYWRkKG1lc3NhZ2UsICdlcnJvcicsIHsgZHVyYXRpb246IDUwMDAsIC4uLm9wdGlvbnMgfSk7XG4gIH1cblxuICB3YXJuaW5nKG1lc3NhZ2U6IHN0cmluZywgb3B0aW9ucz86IFRvYXN0T3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMuYWRkKG1lc3NhZ2UsICd3YXJuaW5nJywgb3B0aW9ucyk7XG4gIH1cblxuICBpbmZvKG1lc3NhZ2U6IHN0cmluZywgb3B0aW9ucz86IFRvYXN0T3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMuYWRkKG1lc3NhZ2UsICdpbmZvJywgb3B0aW9ucyk7XG4gIH1cblxuICAvKiogTWFudWFsbHkgZGlzbWlzcyBhIHRvYXN0IGJ5IGl0cyBpZC4gKi9cbiAgZGlzbWlzcyhpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy50b2FzdHNTdWJqZWN0Lm5leHQoXG4gICAgICB0aGlzLnRvYXN0c1N1YmplY3QuZ2V0VmFsdWUoKS5maWx0ZXIodCA9PiB0LmlkICE9PSBpZClcbiAgICApO1xuICB9XG5cbiAgLyoqIERpc21pc3MgYWxsIGFjdGl2ZSB0b2FzdHMgaW1tZWRpYXRlbHkuICovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMudG9hc3RzU3ViamVjdC5uZXh0KFtdKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJbnRlcm5hbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwcml2YXRlIGFkZChtZXNzYWdlOiBzdHJpbmcsIHR5cGU6IFRvYXN0VHlwZSwgb3B0aW9ucz86IFRvYXN0T3B0aW9ucyk6IHZvaWQge1xuICAgIGNvbnN0IGR1cmF0aW9uID0gb3B0aW9ucz8uZHVyYXRpb24gPz8gMzAwMDtcbiAgICBjb25zdCB0b2FzdDogVG9hc3QgPSB7XG4gICAgICBpZDogdGhpcy5nZW5lcmF0ZUlkKCksXG4gICAgICBtZXNzYWdlLFxuICAgICAgdHlwZSxcbiAgICAgIGR1cmF0aW9uLFxuICAgICAgdGl0bGU6IG9wdGlvbnM/LnRpdGxlLFxuICAgIH07XG5cbiAgICB0aGlzLnRvYXN0c1N1YmplY3QubmV4dChbLi4udGhpcy50b2FzdHNTdWJqZWN0LmdldFZhbHVlKCksIHRvYXN0XSk7XG5cbiAgICBpZiAoZHVyYXRpb24gPiAwKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuZGlzbWlzcyh0b2FzdC5pZCksIGR1cmF0aW9uKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHRvYXN0LSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCA3KX1gO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctdG9hc3QtYWxlcnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25nLXRvYXN0LWFsZXJ0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3B1YmxpYy1hcGknO1xuIl19
@@ -0,0 +1,8 @@
1
+ /*
2
+ * Public API Surface of ng-toast-alerts
3
+ * Everything exported here is available to consumers of the library.
4
+ */
5
+ export { ToastService } from './lib/toast.service';
6
+ export { ToastContainerComponent } from './lib/toast-container/toast-container.component';
7
+ export { NgToastAlertsModule } from './lib/toast.module';
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUdILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUMxRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBQdWJsaWMgQVBJIFN1cmZhY2Ugb2YgbmctdG9hc3QtYWxlcnRzXG4gKiBFdmVyeXRoaW5nIGV4cG9ydGVkIGhlcmUgaXMgYXZhaWxhYmxlIHRvIGNvbnN1bWVycyBvZiB0aGUgbGlicmFyeS5cbiAqL1xuXG5leHBvcnQgeyBUb2FzdFR5cGUsIFRvYXN0LCBUb2FzdE9wdGlvbnMgfSBmcm9tICcuL2xpYi90b2FzdC5tb2RlbCc7XG5leHBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICcuL2xpYi90b2FzdC5zZXJ2aWNlJztcbmV4cG9ydCB7IFRvYXN0Q29udGFpbmVyQ29tcG9uZW50IH0gZnJvbSAnLi9saWIvdG9hc3QtY29udGFpbmVyL3RvYXN0LWNvbnRhaW5lci5jb21wb25lbnQnO1xuZXhwb3J0IHsgTmdUb2FzdEFsZXJ0c01vZHVsZSB9IGZyb20gJy4vbGliL3RvYXN0Lm1vZHVsZSc7XG4iXX0=
@@ -0,0 +1,207 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Injectable, ChangeDetectionStrategy, Component, NgModule } from '@angular/core';
3
+ import { BehaviorSubject } from 'rxjs';
4
+ import * as i2 from '@angular/common';
5
+ import { CommonModule } from '@angular/common';
6
+
7
+ class ToastService {
8
+ constructor() {
9
+ this.toastsSubject = new BehaviorSubject([]);
10
+ /** Observable list of active toasts — the container component subscribes to this. */
11
+ this.toasts$ = this.toastsSubject.asObservable();
12
+ }
13
+ // ── Public API ────────────────────────────────────────────────────────────
14
+ success(message, options) {
15
+ this.add(message, 'success', options);
16
+ }
17
+ error(message, options) {
18
+ this.add(message, 'error', { duration: 5000, ...options });
19
+ }
20
+ warning(message, options) {
21
+ this.add(message, 'warning', options);
22
+ }
23
+ info(message, options) {
24
+ this.add(message, 'info', options);
25
+ }
26
+ /** Manually dismiss a toast by its id. */
27
+ dismiss(id) {
28
+ this.toastsSubject.next(this.toastsSubject.getValue().filter(t => t.id !== id));
29
+ }
30
+ /** Dismiss all active toasts immediately. */
31
+ clear() {
32
+ this.toastsSubject.next([]);
33
+ }
34
+ // ── Internal ──────────────────────────────────────────────────────────────
35
+ add(message, type, options) {
36
+ const duration = options?.duration ?? 3000;
37
+ const toast = {
38
+ id: this.generateId(),
39
+ message,
40
+ type,
41
+ duration,
42
+ title: options?.title,
43
+ };
44
+ this.toastsSubject.next([...this.toastsSubject.getValue(), toast]);
45
+ if (duration > 0) {
46
+ setTimeout(() => this.dismiss(toast.id), duration);
47
+ }
48
+ }
49
+ generateId() {
50
+ return `toast-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;
51
+ }
52
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ToastService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
53
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ToastService, providedIn: 'root' }); }
54
+ }
55
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ToastService, decorators: [{
56
+ type: Injectable,
57
+ args: [{ providedIn: 'root' }]
58
+ }] });
59
+
60
+ class ToastContainerComponent {
61
+ constructor(toastService, cdr) {
62
+ this.toastService = toastService;
63
+ this.cdr = cdr;
64
+ this.toasts = [];
65
+ this.icons = {
66
+ success: '✔',
67
+ error: '✖',
68
+ warning: '⚠',
69
+ info: 'ℹ',
70
+ };
71
+ }
72
+ ngOnInit() {
73
+ this.sub = this.toastService.toasts$.subscribe(toasts => {
74
+ this.toasts = toasts;
75
+ this.cdr.markForCheck();
76
+ });
77
+ }
78
+ ngOnDestroy() {
79
+ this.sub?.unsubscribe();
80
+ }
81
+ dismiss(id) {
82
+ this.toastService.dismiss(id);
83
+ }
84
+ trackById(_index, toast) {
85
+ return toast.id;
86
+ }
87
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ToastContainerComponent, deps: [{ token: ToastService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
88
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ToastContainerComponent, isStandalone: true, selector: "ng-toast-container", ngImport: i0, template: `
89
+ <div class="ng-toast-container" role="region" aria-label="Notifications" aria-live="polite">
90
+ <div
91
+ *ngFor="let toast of toasts; trackBy: trackById"
92
+ class="ng-toast ng-toast--{{ toast.type }}"
93
+ role="alert"
94
+ [attr.aria-label]="toast.type + ': ' + toast.message"
95
+ >
96
+ <!-- Icon -->
97
+ <span class="ng-toast__icon" aria-hidden="true">{{ icons[toast.type] }}</span>
98
+
99
+ <!-- Body -->
100
+ <div class="ng-toast__body">
101
+ <strong *ngIf="toast.title" class="ng-toast__title">{{ toast.title }}</strong>
102
+ <span class="ng-toast__message">{{ toast.message }}</span>
103
+ </div>
104
+
105
+ <!-- Dismiss button -->
106
+ <button
107
+ class="ng-toast__close"
108
+ (click)="dismiss(toast.id)"
109
+ aria-label="Dismiss notification"
110
+ type="button"
111
+ >&#x2715;</button>
112
+
113
+ <!-- Progress bar (only when duration > 0) -->
114
+ <div
115
+ *ngIf="toast.duration > 0"
116
+ class="ng-toast__progress"
117
+ [style.animation-duration.ms]="toast.duration"
118
+ ></div>
119
+ </div>
120
+ </div>
121
+ `, isInline: true, styles: [".ng-toast-container{position:fixed;bottom:1.5rem;right:1.5rem;z-index:9999;display:flex;flex-direction:column;gap:.625rem;max-width:360px;width:100%;pointer-events:none}.ng-toast{display:flex;align-items:flex-start;gap:.75rem;padding:.875rem 1rem;border-radius:8px;box-shadow:0 4px 16px #00000026;background:#fff;border-left:4px solid;position:relative;overflow:hidden;pointer-events:all;animation:ng-toast-in .25s ease;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;font-size:.875rem;line-height:1.4;color:#1a1a1a}.ng-toast--success{border-color:#22c55e}.ng-toast--error{border-color:#ef4444}.ng-toast--warning{border-color:#f59e0b}.ng-toast--info{border-color:#3b82f6}.ng-toast__icon{font-size:1.1rem;flex-shrink:0;margin-top:1px}.ng-toast--success .ng-toast__icon{color:#22c55e}.ng-toast--error .ng-toast__icon{color:#ef4444}.ng-toast--warning .ng-toast__icon{color:#f59e0b}.ng-toast--info .ng-toast__icon{color:#3b82f6}.ng-toast__body{flex:1;display:flex;flex-direction:column;gap:2px}.ng-toast__title{font-weight:600;font-size:.875rem}.ng-toast__message{color:#444}.ng-toast__close{background:none;border:none;cursor:pointer;color:#999;font-size:.875rem;line-height:1;padding:2px 4px;border-radius:4px;flex-shrink:0;transition:color .15s,background .15s}.ng-toast__close:hover{color:#333;background:#0000000f}.ng-toast__progress{position:absolute;bottom:0;left:0;height:3px;width:100%;background:#0000001f;transform-origin:left;animation:ng-toast-progress linear forwards}@keyframes ng-toast-in{0%{opacity:0;transform:translate(60px)}to{opacity:1;transform:translate(0)}}@keyframes ng-toast-progress{0%{transform:scaleX(1)}to{transform:scaleX(0)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
122
+ }
123
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ToastContainerComponent, decorators: [{
124
+ type: Component,
125
+ args: [{ selector: 'ng-toast-container', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
126
+ <div class="ng-toast-container" role="region" aria-label="Notifications" aria-live="polite">
127
+ <div
128
+ *ngFor="let toast of toasts; trackBy: trackById"
129
+ class="ng-toast ng-toast--{{ toast.type }}"
130
+ role="alert"
131
+ [attr.aria-label]="toast.type + ': ' + toast.message"
132
+ >
133
+ <!-- Icon -->
134
+ <span class="ng-toast__icon" aria-hidden="true">{{ icons[toast.type] }}</span>
135
+
136
+ <!-- Body -->
137
+ <div class="ng-toast__body">
138
+ <strong *ngIf="toast.title" class="ng-toast__title">{{ toast.title }}</strong>
139
+ <span class="ng-toast__message">{{ toast.message }}</span>
140
+ </div>
141
+
142
+ <!-- Dismiss button -->
143
+ <button
144
+ class="ng-toast__close"
145
+ (click)="dismiss(toast.id)"
146
+ aria-label="Dismiss notification"
147
+ type="button"
148
+ >&#x2715;</button>
149
+
150
+ <!-- Progress bar (only when duration > 0) -->
151
+ <div
152
+ *ngIf="toast.duration > 0"
153
+ class="ng-toast__progress"
154
+ [style.animation-duration.ms]="toast.duration"
155
+ ></div>
156
+ </div>
157
+ </div>
158
+ `, styles: [".ng-toast-container{position:fixed;bottom:1.5rem;right:1.5rem;z-index:9999;display:flex;flex-direction:column;gap:.625rem;max-width:360px;width:100%;pointer-events:none}.ng-toast{display:flex;align-items:flex-start;gap:.75rem;padding:.875rem 1rem;border-radius:8px;box-shadow:0 4px 16px #00000026;background:#fff;border-left:4px solid;position:relative;overflow:hidden;pointer-events:all;animation:ng-toast-in .25s ease;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;font-size:.875rem;line-height:1.4;color:#1a1a1a}.ng-toast--success{border-color:#22c55e}.ng-toast--error{border-color:#ef4444}.ng-toast--warning{border-color:#f59e0b}.ng-toast--info{border-color:#3b82f6}.ng-toast__icon{font-size:1.1rem;flex-shrink:0;margin-top:1px}.ng-toast--success .ng-toast__icon{color:#22c55e}.ng-toast--error .ng-toast__icon{color:#ef4444}.ng-toast--warning .ng-toast__icon{color:#f59e0b}.ng-toast--info .ng-toast__icon{color:#3b82f6}.ng-toast__body{flex:1;display:flex;flex-direction:column;gap:2px}.ng-toast__title{font-weight:600;font-size:.875rem}.ng-toast__message{color:#444}.ng-toast__close{background:none;border:none;cursor:pointer;color:#999;font-size:.875rem;line-height:1;padding:2px 4px;border-radius:4px;flex-shrink:0;transition:color .15s,background .15s}.ng-toast__close:hover{color:#333;background:#0000000f}.ng-toast__progress{position:absolute;bottom:0;left:0;height:3px;width:100%;background:#0000001f;transform-origin:left;animation:ng-toast-progress linear forwards}@keyframes ng-toast-in{0%{opacity:0;transform:translate(60px)}to{opacity:1;transform:translate(0)}}@keyframes ng-toast-progress{0%{transform:scaleX(1)}to{transform:scaleX(0)}}\n"] }]
159
+ }], ctorParameters: () => [{ type: ToastService }, { type: i0.ChangeDetectorRef }] });
160
+
161
+ /**
162
+ * NgToastAlertsModule
163
+ *
164
+ * Usage (NgModule-based apps):
165
+ * Import in AppModule:
166
+ * NgToastAlertsModule.forRoot()
167
+ *
168
+ * Add the container once in your AppComponent template:
169
+ * <ng-toast-container></ng-toast-container>
170
+ *
171
+ * Usage (standalone apps):
172
+ * Import ToastContainerComponent directly and provide ToastService in bootstrapApplication.
173
+ */
174
+ class NgToastAlertsModule {
175
+ /**
176
+ * Call forRoot() in the root AppModule to register the singleton ToastService.
177
+ * Do NOT call forRoot() in lazy-loaded or feature modules.
178
+ */
179
+ static forRoot() {
180
+ return {
181
+ ngModule: NgToastAlertsModule,
182
+ providers: [ToastService],
183
+ };
184
+ }
185
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgToastAlertsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
186
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.12", ngImport: i0, type: NgToastAlertsModule, imports: [CommonModule, ToastContainerComponent], exports: [ToastContainerComponent] }); }
187
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgToastAlertsModule, imports: [CommonModule, ToastContainerComponent] }); }
188
+ }
189
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgToastAlertsModule, decorators: [{
190
+ type: NgModule,
191
+ args: [{
192
+ imports: [CommonModule, ToastContainerComponent],
193
+ exports: [ToastContainerComponent],
194
+ }]
195
+ }] });
196
+
197
+ /*
198
+ * Public API Surface of ng-toast-alerts
199
+ * Everything exported here is available to consumers of the library.
200
+ */
201
+
202
+ /**
203
+ * Generated bundle index. Do not edit.
204
+ */
205
+
206
+ export { NgToastAlertsModule, ToastContainerComponent, ToastService };
207
+ //# sourceMappingURL=ng-toast-alerts.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ng-toast-alerts.mjs","sources":["../../src/lib/toast.service.ts","../../src/lib/toast-container/toast-container.component.ts","../../src/lib/toast.module.ts","../../src/public-api.ts","../../src/ng-toast-alerts.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { Toast, ToastOptions, ToastType } from './toast.model';\n\n@Injectable({ providedIn: 'root' })\nexport class ToastService {\n private toastsSubject = new BehaviorSubject<Toast[]>([]);\n\n /** Observable list of active toasts — the container component subscribes to this. */\n readonly toasts$: Observable<Toast[]> = this.toastsSubject.asObservable();\n\n // ── Public API ────────────────────────────────────────────────────────────\n\n success(message: string, options?: ToastOptions): void {\n this.add(message, 'success', options);\n }\n\n error(message: string, options?: ToastOptions): void {\n this.add(message, 'error', { duration: 5000, ...options });\n }\n\n warning(message: string, options?: ToastOptions): void {\n this.add(message, 'warning', options);\n }\n\n info(message: string, options?: ToastOptions): void {\n this.add(message, 'info', options);\n }\n\n /** Manually dismiss a toast by its id. */\n dismiss(id: string): void {\n this.toastsSubject.next(\n this.toastsSubject.getValue().filter(t => t.id !== id)\n );\n }\n\n /** Dismiss all active toasts immediately. */\n clear(): void {\n this.toastsSubject.next([]);\n }\n\n // ── Internal ──────────────────────────────────────────────────────────────\n\n private add(message: string, type: ToastType, options?: ToastOptions): void {\n const duration = options?.duration ?? 3000;\n const toast: Toast = {\n id: this.generateId(),\n message,\n type,\n duration,\n title: options?.title,\n };\n\n this.toastsSubject.next([...this.toastsSubject.getValue(), toast]);\n\n if (duration > 0) {\n setTimeout(() => this.dismiss(toast.id), duration);\n }\n }\n\n private generateId(): string {\n return `toast-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;\n }\n}\n","import { Component, OnInit, OnDestroy, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Subscription } from 'rxjs';\nimport { Toast } from '../toast.model';\nimport { ToastService } from '../toast.service';\n\n@Component({\n selector: 'ng-toast-container',\n standalone: true,\n imports: [CommonModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"ng-toast-container\" role=\"region\" aria-label=\"Notifications\" aria-live=\"polite\">\n <div\n *ngFor=\"let toast of toasts; trackBy: trackById\"\n class=\"ng-toast ng-toast--{{ toast.type }}\"\n role=\"alert\"\n [attr.aria-label]=\"toast.type + ': ' + toast.message\"\n >\n <!-- Icon -->\n <span class=\"ng-toast__icon\" aria-hidden=\"true\">{{ icons[toast.type] }}</span>\n\n <!-- Body -->\n <div class=\"ng-toast__body\">\n <strong *ngIf=\"toast.title\" class=\"ng-toast__title\">{{ toast.title }}</strong>\n <span class=\"ng-toast__message\">{{ toast.message }}</span>\n </div>\n\n <!-- Dismiss button -->\n <button\n class=\"ng-toast__close\"\n (click)=\"dismiss(toast.id)\"\n aria-label=\"Dismiss notification\"\n type=\"button\"\n >&#x2715;</button>\n\n <!-- Progress bar (only when duration > 0) -->\n <div\n *ngIf=\"toast.duration > 0\"\n class=\"ng-toast__progress\"\n [style.animation-duration.ms]=\"toast.duration\"\n ></div>\n </div>\n </div>\n `,\n styles: [`\n .ng-toast-container {\n position: fixed;\n bottom: 1.5rem;\n right: 1.5rem;\n z-index: 9999;\n display: flex;\n flex-direction: column;\n gap: 0.625rem;\n max-width: 360px;\n width: 100%;\n pointer-events: none;\n }\n\n .ng-toast {\n display: flex;\n align-items: flex-start;\n gap: 0.75rem;\n padding: 0.875rem 1rem;\n border-radius: 8px;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);\n background: #fff;\n border-left: 4px solid;\n position: relative;\n overflow: hidden;\n pointer-events: all;\n animation: ng-toast-in 0.25s ease;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n font-size: 0.875rem;\n line-height: 1.4;\n color: #1a1a1a;\n }\n\n /* Type colours */\n .ng-toast--success { border-color: #22c55e; }\n .ng-toast--error { border-color: #ef4444; }\n .ng-toast--warning { border-color: #f59e0b; }\n .ng-toast--info { border-color: #3b82f6; }\n\n .ng-toast__icon {\n font-size: 1.1rem;\n flex-shrink: 0;\n margin-top: 1px;\n }\n\n .ng-toast--success .ng-toast__icon { color: #22c55e; }\n .ng-toast--error .ng-toast__icon { color: #ef4444; }\n .ng-toast--warning .ng-toast__icon { color: #f59e0b; }\n .ng-toast--info .ng-toast__icon { color: #3b82f6; }\n\n .ng-toast__body {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .ng-toast__title {\n font-weight: 600;\n font-size: 0.875rem;\n }\n\n .ng-toast__message {\n color: #444;\n }\n\n .ng-toast__close {\n background: none;\n border: none;\n cursor: pointer;\n color: #999;\n font-size: 0.875rem;\n line-height: 1;\n padding: 2px 4px;\n border-radius: 4px;\n flex-shrink: 0;\n transition: color 0.15s, background 0.15s;\n }\n\n .ng-toast__close:hover {\n color: #333;\n background: rgba(0, 0, 0, 0.06);\n }\n\n /* Progress bar */\n .ng-toast__progress {\n position: absolute;\n bottom: 0;\n left: 0;\n height: 3px;\n width: 100%;\n background: rgba(0, 0, 0, 0.12);\n transform-origin: left;\n animation: ng-toast-progress linear forwards;\n }\n\n /* Slide-in animation */\n @keyframes ng-toast-in {\n from {\n opacity: 0;\n transform: translateX(60px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n }\n\n /* Shrink progress bar */\n @keyframes ng-toast-progress {\n from { transform: scaleX(1); }\n to { transform: scaleX(0); }\n }\n `]\n})\nexport class ToastContainerComponent implements OnInit, OnDestroy {\n toasts: Toast[] = [];\n\n readonly icons: Record<string, string> = {\n success: '✔',\n error: '✖',\n warning: '⚠',\n info: 'ℹ',\n };\n\n private sub!: Subscription;\n\n constructor(\n private toastService: ToastService,\n private cdr: ChangeDetectorRef\n ) {}\n\n ngOnInit(): void {\n this.sub = this.toastService.toasts$.subscribe(toasts => {\n this.toasts = toasts;\n this.cdr.markForCheck();\n });\n }\n\n ngOnDestroy(): void {\n this.sub?.unsubscribe();\n }\n\n dismiss(id: string): void {\n this.toastService.dismiss(id);\n }\n\n trackById(_index: number, toast: Toast): string {\n return toast.id;\n }\n}\n","import { NgModule, ModuleWithProviders } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ToastContainerComponent } from './toast-container/toast-container.component';\nimport { ToastService } from './toast.service';\n\n/**\n * NgToastAlertsModule\n *\n * Usage (NgModule-based apps):\n * Import in AppModule:\n * NgToastAlertsModule.forRoot()\n *\n * Add the container once in your AppComponent template:\n * <ng-toast-container></ng-toast-container>\n *\n * Usage (standalone apps):\n * Import ToastContainerComponent directly and provide ToastService in bootstrapApplication.\n */\n@NgModule({\n imports: [CommonModule, ToastContainerComponent],\n exports: [ToastContainerComponent],\n})\nexport class NgToastAlertsModule {\n /**\n * Call forRoot() in the root AppModule to register the singleton ToastService.\n * Do NOT call forRoot() in lazy-loaded or feature modules.\n */\n static forRoot(): ModuleWithProviders<NgToastAlertsModule> {\n return {\n ngModule: NgToastAlertsModule,\n providers: [ToastService],\n };\n }\n}\n","/*\n * Public API Surface of ng-toast-alerts\n * Everything exported here is available to consumers of the library.\n */\n\nexport { ToastType, Toast, ToastOptions } from './lib/toast.model';\nexport { ToastService } from './lib/toast.service';\nexport { ToastContainerComponent } from './lib/toast-container/toast-container.component';\nexport { NgToastAlertsModule } from './lib/toast.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.ToastService"],"mappings":"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"}
package/index.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="ng-toast-alerts" />
5
+ export * from './public-api';
6
+ //# sourceMappingURL=ng-toast-alerts.d.ts.map
@@ -0,0 +1,19 @@
1
+ import { OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';
2
+ import { Toast } from '../toast.model';
3
+ import { ToastService } from '../toast.service';
4
+ import * as i0 from "@angular/core";
5
+ export declare class ToastContainerComponent implements OnInit, OnDestroy {
6
+ private toastService;
7
+ private cdr;
8
+ toasts: Toast[];
9
+ readonly icons: Record<string, string>;
10
+ private sub;
11
+ constructor(toastService: ToastService, cdr: ChangeDetectorRef);
12
+ ngOnInit(): void;
13
+ ngOnDestroy(): void;
14
+ dismiss(id: string): void;
15
+ trackById(_index: number, toast: Toast): string;
16
+ static ɵfac: i0.ɵɵFactoryDeclaration<ToastContainerComponent, never>;
17
+ static ɵcmp: i0.ɵɵComponentDeclaration<ToastContainerComponent, "ng-toast-container", never, {}, {}, never, never, true, never>;
18
+ }
19
+ //# sourceMappingURL=toast-container.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toast-container.component.d.ts","sourceRoot":"","sources":["../../../src/lib/toast-container/toast-container.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAA2B,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGzG,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;;AAEhD,qBA0Ja,uBAAwB,YAAW,MAAM,EAAE,SAAS;IAa7D,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,GAAG;IAbb,MAAM,EAAE,KAAK,EAAE,CAAM;IAErB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAKpC;IAEF,OAAO,CAAC,GAAG,CAAgB;gBAGjB,YAAY,EAAE,YAAY,EAC1B,GAAG,EAAE,iBAAiB;IAGhC,QAAQ,IAAI,IAAI;IAOhB,WAAW,IAAI,IAAI;IAInB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAIzB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM;yCAhCpC,uBAAuB;2CAAvB,uBAAuB;CAmCnC"}
@@ -0,0 +1,15 @@
1
+ export type ToastType = 'success' | 'error' | 'warning' | 'info';
2
+ export interface Toast {
3
+ id: string;
4
+ message: string;
5
+ type: ToastType;
6
+ duration: number;
7
+ title?: string;
8
+ }
9
+ export interface ToastOptions {
10
+ /** Display title above the message */
11
+ title?: string;
12
+ /** Auto-dismiss duration in milliseconds. Default: 3000. Set to 0 to disable. */
13
+ duration?: number;
14
+ }
15
+ //# sourceMappingURL=toast.model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toast.model.d.ts","sourceRoot":"","sources":["../../src/lib/toast.model.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAEjE,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iFAAiF;IACjF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB"}
@@ -0,0 +1,28 @@
1
+ import { ModuleWithProviders } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/common";
4
+ import * as i2 from "./toast-container/toast-container.component";
5
+ /**
6
+ * NgToastAlertsModule
7
+ *
8
+ * Usage (NgModule-based apps):
9
+ * Import in AppModule:
10
+ * NgToastAlertsModule.forRoot()
11
+ *
12
+ * Add the container once in your AppComponent template:
13
+ * <ng-toast-container></ng-toast-container>
14
+ *
15
+ * Usage (standalone apps):
16
+ * Import ToastContainerComponent directly and provide ToastService in bootstrapApplication.
17
+ */
18
+ export declare class NgToastAlertsModule {
19
+ /**
20
+ * Call forRoot() in the root AppModule to register the singleton ToastService.
21
+ * Do NOT call forRoot() in lazy-loaded or feature modules.
22
+ */
23
+ static forRoot(): ModuleWithProviders<NgToastAlertsModule>;
24
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgToastAlertsModule, never>;
25
+ static ɵmod: i0.ɵɵNgModuleDeclaration<NgToastAlertsModule, never, [typeof i1.CommonModule, typeof i2.ToastContainerComponent], [typeof i2.ToastContainerComponent]>;
26
+ static ɵinj: i0.ɵɵInjectorDeclaration<NgToastAlertsModule>;
27
+ }
28
+ //# sourceMappingURL=toast.module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toast.module.d.ts","sourceRoot":"","sources":["../../src/lib/toast.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,mBAAmB,EAAE,MAAM,eAAe,CAAC;;;;AAK9D;;;;;;;;;;;;GAYG;AACH,qBAIa,mBAAmB;IAC9B;;;OAGG;IACH,MAAM,CAAC,OAAO,IAAI,mBAAmB,CAAC,mBAAmB,CAAC;yCAL/C,mBAAmB;0CAAnB,mBAAmB;0CAAnB,mBAAmB;CAW/B"}
@@ -0,0 +1,21 @@
1
+ import { Observable } from 'rxjs';
2
+ import { Toast, ToastOptions } from './toast.model';
3
+ import * as i0 from "@angular/core";
4
+ export declare class ToastService {
5
+ private toastsSubject;
6
+ /** Observable list of active toasts — the container component subscribes to this. */
7
+ readonly toasts$: Observable<Toast[]>;
8
+ success(message: string, options?: ToastOptions): void;
9
+ error(message: string, options?: ToastOptions): void;
10
+ warning(message: string, options?: ToastOptions): void;
11
+ info(message: string, options?: ToastOptions): void;
12
+ /** Manually dismiss a toast by its id. */
13
+ dismiss(id: string): void;
14
+ /** Dismiss all active toasts immediately. */
15
+ clear(): void;
16
+ private add;
17
+ private generateId;
18
+ static ɵfac: i0.ɵɵFactoryDeclaration<ToastService, never>;
19
+ static ɵprov: i0.ɵɵInjectableDeclaration<ToastService>;
20
+ }
21
+ //# sourceMappingURL=toast.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toast.service.d.ts","sourceRoot":"","sources":["../../src/lib/toast.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,UAAU,EAAE,MAAM,MAAM,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,YAAY,EAAa,MAAM,eAAe,CAAC;;AAE/D,qBACa,YAAY;IACvB,OAAO,CAAC,aAAa,CAAoC;IAEzD,qFAAqF;IACrF,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC,CAAqC;IAI1E,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI;IAItD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI;IAIpD,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI;IAItD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI;IAInD,0CAA0C;IAC1C,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAMzB,6CAA6C;IAC7C,KAAK,IAAI,IAAI;IAMb,OAAO,CAAC,GAAG;IAiBX,OAAO,CAAC,UAAU;yCAvDP,YAAY;6CAAZ,YAAY;CA0DxB"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ng-toast-alerts.d.ts","sourceRoot":"","sources":["../src/ng-toast-alerts.ts"],"names":[],"mappings":"AAAA;;GAEG;;AAEH,cAAc,cAAc,CAAC"}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "ng-toast-alerts",
3
+ "version": "1.0.0",
4
+ "description": "A lightweight, zero-dependency Angular toast notification library.",
5
+ "keywords": [
6
+ "angular",
7
+ "toast",
8
+ "notification",
9
+ "alert",
10
+ "snackbar"
11
+ ],
12
+ "author": "",
13
+ "license": "MIT",
14
+ "repository": {
15
+ "type": "git",
16
+ "url": ""
17
+ },
18
+ "peerDependencies": {
19
+ "@angular/common": ">=15.0.0",
20
+ "@angular/core": ">=15.0.0",
21
+ "rxjs": ">=7.0.0"
22
+ },
23
+ "sideEffects": false,
24
+ "module": "fesm2022/ng-toast-alerts.mjs",
25
+ "typings": "index.d.ts",
26
+ "exports": {
27
+ "./package.json": {
28
+ "default": "./package.json"
29
+ },
30
+ ".": {
31
+ "types": "./index.d.ts",
32
+ "esm2022": "./esm2022/ng-toast-alerts.mjs",
33
+ "esm": "./esm2022/ng-toast-alerts.mjs",
34
+ "default": "./fesm2022/ng-toast-alerts.mjs"
35
+ }
36
+ },
37
+ "dependencies": {
38
+ "tslib": "^2.3.0"
39
+ }
40
+ }
@@ -0,0 +1,5 @@
1
+ export { ToastType, Toast, ToastOptions } from './lib/toast.model';
2
+ export { ToastService } from './lib/toast.service';
3
+ export { ToastContainerComponent } from './lib/toast-container/toast-container.component';
4
+ export { NgToastAlertsModule } from './lib/toast.module';
5
+ //# sourceMappingURL=public-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-api.d.ts","sourceRoot":"","sources":["../src/public-api.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iDAAiD,CAAC;AAC1F,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC"}