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.
- package/esm2022/lib/toast-container/toast-container.component.mjs +106 -0
- package/esm2022/lib/toast.model.mjs +2 -0
- package/esm2022/lib/toast.module.mjs +41 -0
- package/esm2022/lib/toast.service.mjs +56 -0
- package/esm2022/ng-toast-alerts.mjs +5 -0
- package/esm2022/public-api.mjs +8 -0
- package/fesm2022/ng-toast-alerts.mjs +207 -0
- package/fesm2022/ng-toast-alerts.mjs.map +1 -0
- package/index.d.ts +6 -0
- package/lib/toast-container/toast-container.component.d.ts +19 -0
- package/lib/toast-container/toast-container.component.d.ts.map +1 -0
- package/lib/toast.model.d.ts +15 -0
- package/lib/toast.model.d.ts.map +1 -0
- package/lib/toast.module.d.ts +28 -0
- package/lib/toast.module.d.ts.map +1 -0
- package/lib/toast.service.d.ts +21 -0
- package/lib/toast.service.d.ts.map +1 -0
- package/ng-toast-alerts.d.ts.map +1 -0
- package/package.json +40 -0
- package/public-api.d.ts +5 -0
- package/public-api.d.ts.map +1 -0
|
@@ -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
|
+
>✕</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
|
+
>✕</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
|
+
>✕</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
|
+
>✕</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 >✕</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,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
|
+
}
|
package/public-api.d.ts
ADDED
|
@@ -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"}
|