@scania-nl/tegel-angular-extensions 0.0.1 → 0.0.4

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.
Files changed (40) hide show
  1. package/esm2022/index.mjs +5 -0
  2. package/esm2022/lib/toast/models/toast-state.enum.mjs +19 -0
  3. package/esm2022/lib/toast/models/toast-type.mjs +5 -0
  4. package/esm2022/lib/toast/models/toast.model.mjs +2 -0
  5. package/esm2022/lib/toast/provide-toast.mjs +19 -0
  6. package/esm2022/lib/toast/toast.component.mjs +34 -0
  7. package/esm2022/lib/toast/toast.config.mjs +11 -0
  8. package/esm2022/lib/toast/toast.service.mjs +206 -0
  9. package/esm2022/lib/utils/bootstrap-global-component.mjs +43 -0
  10. package/esm2022/scania-nl-tegel-angular-extensions.mjs +5 -0
  11. package/{src/index.ts → index.d.ts} +1 -1
  12. package/lib/toast/models/toast-state.enum.d.ts +17 -0
  13. package/lib/toast/models/toast-type.d.ts +8 -0
  14. package/lib/toast/models/toast.model.d.ts +73 -0
  15. package/lib/toast/provide-toast.d.ts +3 -0
  16. package/lib/toast/toast.component.d.ts +24 -0
  17. package/lib/toast/toast.config.d.ts +35 -0
  18. package/lib/toast/toast.service.d.ts +98 -0
  19. package/lib/utils/bootstrap-global-component.d.ts +23 -0
  20. package/package.json +16 -2
  21. package/eslint.config.mjs +0 -48
  22. package/jest.config.ts +0 -21
  23. package/ng-package.json +0 -7
  24. package/project.json +0 -36
  25. package/src/lib/toast/models/toast-state.enum.ts +0 -19
  26. package/src/lib/toast/models/toast-type.ts +0 -9
  27. package/src/lib/toast/models/toast.model.ts +0 -87
  28. package/src/lib/toast/provide-toast.ts +0 -29
  29. package/src/lib/toast/toast.component.html +0 -41
  30. package/src/lib/toast/toast.component.scss +0 -118
  31. package/src/lib/toast/toast.component.spec.ts +0 -28
  32. package/src/lib/toast/toast.component.ts +0 -37
  33. package/src/lib/toast/toast.config.ts +0 -50
  34. package/src/lib/toast/toast.service.ts +0 -275
  35. package/src/lib/utils/bootstrap-global-component.ts +0 -73
  36. package/src/test-setup.ts +0 -6
  37. package/tsconfig.json +0 -28
  38. package/tsconfig.lib.json +0 -17
  39. package/tsconfig.lib.prod.json +0 -7
  40. package/tsconfig.spec.json +0 -16
@@ -0,0 +1,5 @@
1
+ export * from './lib/toast/provide-toast';
2
+ export * from './lib/toast/toast.config';
3
+ export * from './lib/toast/toast.service';
4
+ export * from './lib/toast/models/toast.model';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL3RlZ2VsLWFuZ3VsYXItZXh0ZW5zaW9ucy9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyxnQ0FBZ0MsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vbGliL3RvYXN0L3Byb3ZpZGUtdG9hc3QnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdG9hc3QvdG9hc3QuY29uZmlnJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3RvYXN0L3RvYXN0LnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdG9hc3QvbW9kZWxzL3RvYXN0Lm1vZGVsJyJdfQ==
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Represents the current lifecycle state of a toast.
3
+ */
4
+ export var ToastState;
5
+ (function (ToastState) {
6
+ /**
7
+ * The toast is fully visible and active.
8
+ */
9
+ ToastState["Open"] = "open";
10
+ /**
11
+ * The toast is transitioning out (e.g., fading out).
12
+ */
13
+ ToastState["Closing"] = "closing";
14
+ /**
15
+ * The toast is fully removed or dismissed.
16
+ */
17
+ ToastState["Closed"] = "closed";
18
+ })(ToastState || (ToastState = {}));
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3Qtc3RhdGUuZW51bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvdGVnZWwtYW5ndWxhci1leHRlbnNpb25zL3NyYy9saWIvdG9hc3QvbW9kZWxzL3RvYXN0LXN0YXRlLmVudW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFDSCxNQUFNLENBQU4sSUFBWSxVQWVYO0FBZkQsV0FBWSxVQUFVO0lBQ3BCOztPQUVHO0lBQ0gsMkJBQWEsQ0FBQTtJQUViOztPQUVHO0lBQ0gsaUNBQW1CLENBQUE7SUFFbkI7O09BRUc7SUFDSCwrQkFBaUIsQ0FBQTtBQUNuQixDQUFDLEVBZlcsVUFBVSxLQUFWLFVBQVUsUUFlckIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJlcHJlc2VudHMgdGhlIGN1cnJlbnQgbGlmZWN5Y2xlIHN0YXRlIG9mIGEgdG9hc3QuXG4gKi9cbmV4cG9ydCBlbnVtIFRvYXN0U3RhdGUge1xuICAvKipcbiAgICogVGhlIHRvYXN0IGlzIGZ1bGx5IHZpc2libGUgYW5kIGFjdGl2ZS5cbiAgICovXG4gIE9wZW4gPSAnb3BlbicsXG5cbiAgLyoqXG4gICAqIFRoZSB0b2FzdCBpcyB0cmFuc2l0aW9uaW5nIG91dCAoZS5nLiwgZmFkaW5nIG91dCkuXG4gICAqL1xuICBDbG9zaW5nID0gJ2Nsb3NpbmcnLFxuXG4gIC8qKlxuICAgKiBUaGUgdG9hc3QgaXMgZnVsbHkgcmVtb3ZlZCBvciBkaXNtaXNzZWQuXG4gICAqL1xuICBDbG9zZWQgPSAnY2xvc2VkJyxcbn0iXX0=
@@ -0,0 +1,5 @@
1
+ /**
2
+ * List of available toast types (inherited from Tegel)
3
+ */
4
+ export const TOAST_TYPES = ['success', 'information', 'warning', 'error'];
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3QtdHlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvdGVnZWwtYW5ndWxhci1leHRlbnNpb25zL3NyYy9saWIvdG9hc3QvbW9kZWxzL3RvYXN0LXR5cGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxTQUFTLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTGlzdCBvZiBhdmFpbGFibGUgdG9hc3QgdHlwZXMgKGluaGVyaXRlZCBmcm9tIFRlZ2VsKVxuICovXG5leHBvcnQgY29uc3QgVE9BU1RfVFlQRVMgPSBbJ3N1Y2Nlc3MnLCAnaW5mb3JtYXRpb24nLCAnd2FybmluZycsICdlcnJvciddIGFzIGNvbnN0O1xuXG4vKipcbiAqIFR5cGUgcmVwcmVzZW50aW5nIHZhbGlkIHRvYXN0IHR5cGUgdmFsdWVzLlxuICovXG5leHBvcnQgdHlwZSBUb2FzdFR5cGUgPSAodHlwZW9mIFRPQVNUX1RZUEVTKVtudW1iZXJdOyJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3QubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3RlZ2VsLWFuZ3VsYXItZXh0ZW5zaW9ucy9zcmMvbGliL3RvYXN0L21vZGVscy90b2FzdC5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVG9hc3RTdGF0ZSB9IGZyb20gJy4vdG9hc3Qtc3RhdGUuZW51bSc7XG5pbXBvcnQgeyBUb2FzdFR5cGUgfSBmcm9tICcuL3RvYXN0LXR5cGUnO1xuXG4vKipcbiAqIERlZmluZXMgdGhlIGJhc2Ugc3RydWN0dXJlIGZvciBhIHRvYXN0IG1lc3NhZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9hc3RPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSB2aXN1YWwgc3R5bGUgb2YgdGhlIHRvYXN0IChlLmcuLCBzdWNjZXNzLCBlcnJvcikuXG4gICAqL1xuICB0eXBlOiBUb2FzdFR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBtYWluIHRpdGxlIHRleHQgZGlzcGxheWVkIGluIHRoZSB0b2FzdC5cbiAgICovXG4gIHRpdGxlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGRlc2NyaXB0aW9uIHRleHQgcHJvdmlkaW5nIGFkZGl0aW9uYWwgY29udGV4dC5cbiAgICovXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIHRoZSB0b2FzdCBhdXRvLWRpc21pc3Nlcy5cbiAgICogVXNlIGAwYCBmb3IgcGVyc2lzdGVudCB0b2FzdHMuXG4gICAqL1xuICBkdXJhdGlvbjogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBEdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSBmYWRlLW91dCB0cmFuc2l0aW9uLlxuICAgKi9cbiAgY2xvc2VEdXJhdGlvbjogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSB0b2FzdCBjYW4gYmUgbWFudWFsbHkgY2xvc2VkIGJ5IHRoZSB1c2VyLlxuICAgKi9cbiAgY2xvc2FibGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCByb3V0ZXIgbGluayB0byBuYXZpZ2F0ZSB0byB3aGVuIHRoZSB0b2FzdCBpcyBjbGlja2VkLlxuICAgKi9cbiAgbGluaz86IHN0cmluZztcblxuICAvKipcbiAgICogQ3VzdG9tIGxpbmsgdGV4dCBzaG93biBpZiBhIGxpbmsgaXMgcHJvdmlkZWQuXG4gICAqL1xuICBsaW5rVGV4dD86IHN0cmluZztcblxuICAvKipcbiAgICogT3B0aW9uYWwgY2FsbGJhY2sgdHJpZ2dlcmVkIHdoZW4gdGhlIGxpbmtUZXh0IGlzIGNsaWNrZWQuXG4gICAqIFVzZWQgYXMgYW4gYWx0ZXJuYXRpdmUgdG8gYGxpbmtgIGZvciBpbnZva2luZyBjdXN0b20gYmVoYXZpb3IuXG4gICAqL1xuICBhY3Rpb24/OiAoKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBjYWxsYmFjayB0cmlnZ2VyZWQgd2hlbiB0aGUgdG9hc3QgaXMgY3JlYXRlZC5cbiAgICogQHBhcmFtIHRvYXN0IFRoZSBjcmVhdGVkIHRvYXN0IGluc3RhbmNlLlxuICAgKi9cbiAgb25DcmVhdGVkPzogKHRvYXN0OiBUb2FzdCkgPT4gdm9pZDtcblxuICAvKipcbiAgICogT3B0aW9uYWwgY2FsbGJhY2sgdHJpZ2dlcmVkIHdoZW4gdGhlIHRvYXN0IGJlZ2lucyB0byBjbG9zZS5cbiAgICogQHBhcmFtIHRvYXN0IFRoZSB0b2FzdCB0aGF0IGlzIGNsb3NpbmcuXG4gICAqL1xuICBvbkNsb3NlPzogKHRvYXN0OiBUb2FzdCkgPT4gdm9pZDtcblxuICAvKipcbiAgICogT3B0aW9uYWwgY2FsbGJhY2sgdHJpZ2dlcmVkIHdoZW4gdGhlIHRvYXN0IGhhcyBiZWVuIGZ1bGx5IHJlbW92ZWQuXG4gICAqIEBwYXJhbSB0b2FzdCBUaGUgcmVtb3ZlZCB0b2FzdCBpbnN0YW5jZS5cbiAgICovXG4gIG9uUmVtb3ZlZD86ICh0b2FzdDogVG9hc3QpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGZ1bGx5IGluc3RhbnRpYXRlZCB0b2FzdCwgaW5jbHVkaW5nIHVuaXF1ZSBJRCBhbmQgY3VycmVudCBzdGF0ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb2FzdCBleHRlbmRzIFRvYXN0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHRvYXN0IGluc3RhbmNlLlxuICAgKi9cbiAgaWQ6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHRvYXN0IChvcGVuLCBjbG9zaW5nLCBvciBjbG9zZWQpLlxuICAgKi9cbiAgc3RhdGU6IFRvYXN0U3RhdGU7XG59XG4iXX0=
@@ -0,0 +1,19 @@
1
+ import { makeEnvironmentProviders, provideAppInitializer, } from '@angular/core';
2
+ import { bootstrapGlobalComponent } from '../utils/bootstrap-global-component';
3
+ import { ToastComponent } from './toast.component';
4
+ import { DEFAULT_TOAST_CONFIG, TOAST_CONFIG, } from './toast.config';
5
+ export function provideToast(config = {}) {
6
+ return makeEnvironmentProviders([
7
+ {
8
+ provide: TOAST_CONFIG,
9
+ useFactory: () => ({
10
+ ...DEFAULT_TOAST_CONFIG,
11
+ ...(config ?? {}),
12
+ }),
13
+ },
14
+ provideAppInitializer(() => {
15
+ bootstrapGlobalComponent(ToastComponent, { reuseIfExists: true });
16
+ }),
17
+ ]);
18
+ }
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZS10b2FzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvdGVnZWwtYW5ndWxhci1leHRlbnNpb25zL3NyYy9saWIvdG9hc3QvcHJvdmlkZS10b2FzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsd0JBQXdCLEVBQ3hCLHFCQUFxQixHQUN0QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixZQUFZLEdBRWIsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixNQUFNLFVBQVUsWUFBWSxDQUMxQixTQUErQixFQUFFO0lBRWpDLE9BQU8sd0JBQXdCLENBQUM7UUFDOUI7WUFDRSxPQUFPLEVBQUUsWUFBWTtZQUNyQixVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDakIsR0FBRyxvQkFBb0I7Z0JBQ3ZCLEdBQUcsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDO2FBQ2xCLENBQUM7U0FDSDtRQUNELHFCQUFxQixDQUFDLEdBQUcsRUFBRTtZQUN6Qix3QkFBd0IsQ0FBQyxjQUFjLEVBQUUsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNwRSxDQUFDLENBQUM7S0FDSCxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRW52aXJvbm1lbnRQcm92aWRlcnMsXG4gIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyxcbiAgcHJvdmlkZUFwcEluaXRpYWxpemVyLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGJvb3RzdHJhcEdsb2JhbENvbXBvbmVudCB9IGZyb20gJy4uL3V0aWxzL2Jvb3RzdHJhcC1nbG9iYWwtY29tcG9uZW50JztcbmltcG9ydCB7IFRvYXN0Q29tcG9uZW50IH0gZnJvbSAnLi90b2FzdC5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9UT0FTVF9DT05GSUcsXG4gIFRPQVNUX0NPTkZJRyxcbiAgVG9hc3RDb25maWcsXG59IGZyb20gJy4vdG9hc3QuY29uZmlnJztcblxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVUb2FzdChcbiAgY29uZmlnOiBQYXJ0aWFsPFRvYXN0Q29uZmlnPiA9IHt9XG4pOiBFbnZpcm9ubWVudFByb3ZpZGVycyB7XG4gIHJldHVybiBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMoW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IFRPQVNUX0NPTkZJRyxcbiAgICAgIHVzZUZhY3Rvcnk6ICgpID0+ICh7XG4gICAgICAgIC4uLkRFRkFVTFRfVE9BU1RfQ09ORklHLFxuICAgICAgICAuLi4oY29uZmlnID8/IHt9KSxcbiAgICAgIH0pLFxuICAgIH0sXG4gICAgcHJvdmlkZUFwcEluaXRpYWxpemVyKCgpID0+IHtcbiAgICAgIGJvb3RzdHJhcEdsb2JhbENvbXBvbmVudChUb2FzdENvbXBvbmVudCwgeyByZXVzZUlmRXhpc3RzOiB0cnVlIH0pO1xuICAgIH0pLFxuICBdKTtcbn1cbiJdfQ==
@@ -0,0 +1,34 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { ChangeDetectionStrategy, Component, inject } from '@angular/core';
3
+ import { RouterLink } from '@angular/router';
4
+ import { TegelModule } from '@scania/tegel-angular-17';
5
+ import { ToastService } from './toast.service';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@scania/tegel-angular-17";
8
+ /**
9
+ * Displays toast notifications provided by the ToastService.
10
+ *
11
+ * Toasts are non-blocking messages that automatically disappear after a set duration
12
+ * or can be dismissed manually by the user.
13
+ */
14
+ export class ToastComponent {
15
+ toastService = inject(ToastService);
16
+ /**
17
+ * A reactive signal of all currently active toasts (open or closing).
18
+ */
19
+ toastsSignal = this.toastService.activeToasts;
20
+ /**
21
+ * Initiates the closing process for the given toast.
22
+ *
23
+ * @param toast The toast to be closed.
24
+ * @returns void
25
+ */
26
+ closeToast = (toast) => this.toastService.close(toast.id);
27
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: ToastComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
28
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.13", type: ToastComponent, isStandalone: true, selector: "tds-ext-toast", ngImport: i0, template: "<ul class=\"toast-list\" aria-live=\"polite\" aria-atomic=\"true\">\n @for (toast of toastsSignal(); track toast.id) {\n <li\n class=\"toast-item\"\n [class]=\"'toast-' + toast.type\"\n [class.toast-closing]=\"toast.state === 'closing'\"\n [style.--duration.ms]=\"toast.duration\"\n [style.--close-duration.ms]=\"toast.closeDuration\"\n role=\"status\"\n >\n <tds-toast\n [variant]=\"toast.type\"\n [header]=\"toast.title\"\n [subheader]=\"toast.description\"\n [closable]=\"toast.closable\"\n tds-close-aria-label=\"Toast close button\"\n >\n @if (toast.link) {\n <tds-link slot=\"actions\">\n <a [routerLink]=\"toast.link\">\n {{ toast.linkText ?? 'Click here' }}\n </a>\n </tds-link>\n } @else if (toast.action) {\n <tds-link slot=\"actions\">\n <a href=\"#\" (click)=\"toast.action()\">\n {{ toast.linkText ?? 'Click here' }}\n </a>\n </tds-link>\n }\n </tds-toast>\n @if (toast.closable) {\n <button\n class=\"toast-close\"\n (click)=\"closeToast(toast)\"\n aria-label=\"Close toast\"\n ></button>\n }\n </li>\n }\n</ul>\n", styles: [":host{position:fixed;right:0;bottom:0;overflow:hidden;z-index:9999}.toast-list{display:grid;grid-template-columns:1fr;gap:6px;list-style:none;padding:6px;margin:0}.toast-item{position:relative;animation:fadeIn .3s ease-in forwards}.toast-item.toast-closing{animation-name:fadeOut;animation-duration:var(--close-duration, .3s);animation-fill-mode:forwards;pointer-events:none}.toast-item:before{content:\"\";position:absolute;height:3px;width:100%;bottom:0;left:4px;right:0;animation:progress var(--duration, 7s) linear forwards;border-top-right-radius:4px;border-bottom-right-radius:4px}.toast-item.toast-information:before{background:var(--tds-information)}.toast-item.toast-success:before{background:var(--tds-positive)}.toast-item.toast-warning:before{background:var(--tds-warning)}.toast-item.toast-error:before{background:var(--tds-negative)}.toast-item .toast-close{height:20px;width:20px;box-sizing:border-box;cursor:pointer;position:absolute;top:14px;right:14px;border:0;background:transparent}.toast-item .toast-close:active{border:2px solid var(--tds-blue-400);outline-offset:-2px}@keyframes fadeIn{0%{transform:translateY(40%);opacity:0;margin-bottom:-25%}to{transform:translateY(0);opacity:1;margin-bottom:0%}}@keyframes fadeOut{0%{transform:translateY(0);opacity:1;margin-top:0}to{opacity:0;transform:translateY(75%);margin-top:-25%}}@keyframes progress{to{width:0%}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: TegelModule }, { kind: "component", type: i1.TdsLink, selector: "tds-link", inputs: ["disabled", "standalone", "underline"] }, { kind: "component", type: i1.TdsToast, selector: "tds-toast", inputs: ["closable", "header", "hidden", "subheader", "tdsAriaLive", "tdsCloseAriaLabel", "toastId", "toastRole", "variant"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
29
+ }
30
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: ToastComponent, decorators: [{
31
+ type: Component,
32
+ args: [{ selector: 'tds-ext-toast', imports: [CommonModule, TegelModule, RouterLink], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ul class=\"toast-list\" aria-live=\"polite\" aria-atomic=\"true\">\n @for (toast of toastsSignal(); track toast.id) {\n <li\n class=\"toast-item\"\n [class]=\"'toast-' + toast.type\"\n [class.toast-closing]=\"toast.state === 'closing'\"\n [style.--duration.ms]=\"toast.duration\"\n [style.--close-duration.ms]=\"toast.closeDuration\"\n role=\"status\"\n >\n <tds-toast\n [variant]=\"toast.type\"\n [header]=\"toast.title\"\n [subheader]=\"toast.description\"\n [closable]=\"toast.closable\"\n tds-close-aria-label=\"Toast close button\"\n >\n @if (toast.link) {\n <tds-link slot=\"actions\">\n <a [routerLink]=\"toast.link\">\n {{ toast.linkText ?? 'Click here' }}\n </a>\n </tds-link>\n } @else if (toast.action) {\n <tds-link slot=\"actions\">\n <a href=\"#\" (click)=\"toast.action()\">\n {{ toast.linkText ?? 'Click here' }}\n </a>\n </tds-link>\n }\n </tds-toast>\n @if (toast.closable) {\n <button\n class=\"toast-close\"\n (click)=\"closeToast(toast)\"\n aria-label=\"Close toast\"\n ></button>\n }\n </li>\n }\n</ul>\n", styles: [":host{position:fixed;right:0;bottom:0;overflow:hidden;z-index:9999}.toast-list{display:grid;grid-template-columns:1fr;gap:6px;list-style:none;padding:6px;margin:0}.toast-item{position:relative;animation:fadeIn .3s ease-in forwards}.toast-item.toast-closing{animation-name:fadeOut;animation-duration:var(--close-duration, .3s);animation-fill-mode:forwards;pointer-events:none}.toast-item:before{content:\"\";position:absolute;height:3px;width:100%;bottom:0;left:4px;right:0;animation:progress var(--duration, 7s) linear forwards;border-top-right-radius:4px;border-bottom-right-radius:4px}.toast-item.toast-information:before{background:var(--tds-information)}.toast-item.toast-success:before{background:var(--tds-positive)}.toast-item.toast-warning:before{background:var(--tds-warning)}.toast-item.toast-error:before{background:var(--tds-negative)}.toast-item .toast-close{height:20px;width:20px;box-sizing:border-box;cursor:pointer;position:absolute;top:14px;right:14px;border:0;background:transparent}.toast-item .toast-close:active{border:2px solid var(--tds-blue-400);outline-offset:-2px}@keyframes fadeIn{0%{transform:translateY(40%);opacity:0;margin-bottom:-25%}to{transform:translateY(0);opacity:1;margin-bottom:0%}}@keyframes fadeOut{0%{transform:translateY(0);opacity:1;margin-top:0}to{opacity:0;transform:translateY(75%);margin-top:-25%}}@keyframes progress{to{width:0%}}\n"] }]
33
+ }] });
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy90ZWdlbC1hbmd1bGFyLWV4dGVuc2lvbnMvc3JjL2xpYi90b2FzdC90b2FzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3RlZ2VsLWFuZ3VsYXItZXh0ZW5zaW9ucy9zcmMvbGliL3RvYXN0L3RvYXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBR3ZELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7O0FBRS9DOzs7OztHQUtHO0FBUUgsTUFBTSxPQUFPLGNBQWM7SUFDUixZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBRXJEOztPQUVHO0lBQ00sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDO0lBRXZEOzs7OztPQUtHO0lBQ0gsVUFBVSxHQUFHLENBQUMsS0FBWSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7d0dBZHRELGNBQWM7NEZBQWQsY0FBYyx5RUNyQjNCLDBxQ0F5Q0EsKzVDRHZCWSxZQUFZLDhCQUFFLFdBQVcsOFVBQUUsVUFBVTs7NEZBR3BDLGNBQWM7a0JBUDFCLFNBQVM7K0JBQ0UsZUFBZSxXQUdoQixDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsVUFBVSxDQUFDLG1CQUMvQix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUm91dGVyTGluayB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBUZWdlbE1vZHVsZSB9IGZyb20gJ0BzY2FuaWEvdGVnZWwtYW5ndWxhci0xNyc7XG5cbmltcG9ydCB7IFRvYXN0IH0gZnJvbSAnLi9tb2RlbHMvdG9hc3QubW9kZWwnO1xuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAnLi90b2FzdC5zZXJ2aWNlJztcblxuLyoqXG4gKiBEaXNwbGF5cyB0b2FzdCBub3RpZmljYXRpb25zIHByb3ZpZGVkIGJ5IHRoZSBUb2FzdFNlcnZpY2UuXG4gKlxuICogVG9hc3RzIGFyZSBub24tYmxvY2tpbmcgbWVzc2FnZXMgdGhhdCBhdXRvbWF0aWNhbGx5IGRpc2FwcGVhciBhZnRlciBhIHNldCBkdXJhdGlvblxuICogb3IgY2FuIGJlIGRpc21pc3NlZCBtYW51YWxseSBieSB0aGUgdXNlci5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGRzLWV4dC10b2FzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi90b2FzdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RvYXN0LmNvbXBvbmVudC5zY3NzJ10sXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFRlZ2VsTW9kdWxlLCBSb3V0ZXJMaW5rXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFRvYXN0Q29tcG9uZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSB0b2FzdFNlcnZpY2UgPSBpbmplY3QoVG9hc3RTZXJ2aWNlKTtcblxuICAvKipcbiAgICogQSByZWFjdGl2ZSBzaWduYWwgb2YgYWxsIGN1cnJlbnRseSBhY3RpdmUgdG9hc3RzIChvcGVuIG9yIGNsb3NpbmcpLlxuICAgKi9cbiAgcmVhZG9ubHkgdG9hc3RzU2lnbmFsID0gdGhpcy50b2FzdFNlcnZpY2UuYWN0aXZlVG9hc3RzO1xuXG4gIC8qKlxuICAgKiBJbml0aWF0ZXMgdGhlIGNsb3NpbmcgcHJvY2VzcyBmb3IgdGhlIGdpdmVuIHRvYXN0LlxuICAgKlxuICAgKiBAcGFyYW0gdG9hc3QgVGhlIHRvYXN0IHRvIGJlIGNsb3NlZC5cbiAgICogQHJldHVybnMgdm9pZFxuICAgKi9cbiAgY2xvc2VUb2FzdCA9ICh0b2FzdDogVG9hc3QpID0+IHRoaXMudG9hc3RTZXJ2aWNlLmNsb3NlKHRvYXN0LmlkKTtcbn1cbiIsIjx1bCBjbGFzcz1cInRvYXN0LWxpc3RcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIiBhcmlhLWF0b21pYz1cInRydWVcIj5cbiAgQGZvciAodG9hc3Qgb2YgdG9hc3RzU2lnbmFsKCk7IHRyYWNrIHRvYXN0LmlkKSB7XG4gIDxsaVxuICAgIGNsYXNzPVwidG9hc3QtaXRlbVwiXG4gICAgW2NsYXNzXT1cIid0b2FzdC0nICsgdG9hc3QudHlwZVwiXG4gICAgW2NsYXNzLnRvYXN0LWNsb3NpbmddPVwidG9hc3Quc3RhdGUgPT09ICdjbG9zaW5nJ1wiXG4gICAgW3N0eWxlLi0tZHVyYXRpb24ubXNdPVwidG9hc3QuZHVyYXRpb25cIlxuICAgIFtzdHlsZS4tLWNsb3NlLWR1cmF0aW9uLm1zXT1cInRvYXN0LmNsb3NlRHVyYXRpb25cIlxuICAgIHJvbGU9XCJzdGF0dXNcIlxuICA+XG4gICAgPHRkcy10b2FzdFxuICAgICAgW3ZhcmlhbnRdPVwidG9hc3QudHlwZVwiXG4gICAgICBbaGVhZGVyXT1cInRvYXN0LnRpdGxlXCJcbiAgICAgIFtzdWJoZWFkZXJdPVwidG9hc3QuZGVzY3JpcHRpb25cIlxuICAgICAgW2Nsb3NhYmxlXT1cInRvYXN0LmNsb3NhYmxlXCJcbiAgICAgIHRkcy1jbG9zZS1hcmlhLWxhYmVsPVwiVG9hc3QgY2xvc2UgYnV0dG9uXCJcbiAgICA+XG4gICAgICBAaWYgKHRvYXN0LmxpbmspIHtcbiAgICAgIDx0ZHMtbGluayBzbG90PVwiYWN0aW9uc1wiPlxuICAgICAgICA8YSBbcm91dGVyTGlua109XCJ0b2FzdC5saW5rXCI+XG4gICAgICAgICAge3sgdG9hc3QubGlua1RleHQgPz8gJ0NsaWNrIGhlcmUnIH19XG4gICAgICAgIDwvYT5cbiAgICAgIDwvdGRzLWxpbms+XG4gICAgICB9IEBlbHNlIGlmICh0b2FzdC5hY3Rpb24pIHtcbiAgICAgIDx0ZHMtbGluayBzbG90PVwiYWN0aW9uc1wiPlxuICAgICAgICA8YSBocmVmPVwiI1wiIChjbGljayk9XCJ0b2FzdC5hY3Rpb24oKVwiPlxuICAgICAgICAgIHt7IHRvYXN0LmxpbmtUZXh0ID8/ICdDbGljayBoZXJlJyB9fVxuICAgICAgICA8L2E+XG4gICAgICA8L3Rkcy1saW5rPlxuICAgICAgfVxuICAgIDwvdGRzLXRvYXN0PlxuICAgIEBpZiAodG9hc3QuY2xvc2FibGUpIHtcbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cInRvYXN0LWNsb3NlXCJcbiAgICAgIChjbGljayk9XCJjbG9zZVRvYXN0KHRvYXN0KVwiXG4gICAgICBhcmlhLWxhYmVsPVwiQ2xvc2UgdG9hc3RcIlxuICAgID48L2J1dHRvbj5cbiAgICB9XG4gIDwvbGk+XG4gIH1cbjwvdWw+XG4iXX0=
@@ -0,0 +1,11 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ export const TOAST_CONFIG = new InjectionToken('ToastConfig');
3
+ export const DEFAULT_TOAST_CONFIG = {
4
+ type: 'information',
5
+ title: 'Notification',
6
+ description: '',
7
+ duration: 7500,
8
+ closeDuration: 300,
9
+ closable: true,
10
+ };
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3QuY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy90ZWdlbC1hbmd1bGFyLWV4dGVuc2lvbnMvc3JjL2xpYi90b2FzdC90b2FzdC5jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQXdDL0MsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLElBQUksY0FBYyxDQUFjLGFBQWEsQ0FBQyxDQUFDO0FBRTNFLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUEwQjtJQUN6RCxJQUFJLEVBQUUsYUFBYTtJQUNuQixLQUFLLEVBQUUsY0FBYztJQUNyQixXQUFXLEVBQUUsRUFBRTtJQUNmLFFBQVEsRUFBRSxJQUFJO0lBQ2QsYUFBYSxFQUFFLEdBQUc7SUFDbEIsUUFBUSxFQUFFLElBQUk7Q0FDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRvYXN0VHlwZSB9IGZyb20gJy4vbW9kZWxzL3RvYXN0LXR5cGUnO1xuXG4vKipcbiAqIEdsb2JhbCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIHRvYXN0IGJlaGF2aW9yLlxuICogVXNlZCB3aGVuIGluZGl2aWR1YWwgdG9hc3QgcHJvcGVydGllcyBhcmUgbm90IGV4cGxpY2l0bHkgc2V0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvYXN0Q29uZmlnIHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdG9hc3QgdHlwZSAoZS5nLiwgJ3N1Y2Nlc3MnLCAnaW5mb3JtYXRpb24nLCBldGMuKS5cbiAgICovXG4gIHR5cGU6IFRvYXN0VHlwZTtcblxuICAvKipcbiAgICogRGVmYXVsdCB0aXRsZSB0byB1c2Ugd2hlbiBub25lIGlzIHByb3ZpZGVkLlxuICAgKi9cbiAgdGl0bGU6IHN0cmluZztcblxuICAvKipcbiAgICogRGVmYXVsdCBkZXNjcmlwdGlvbiB0byB1c2Ugd2hlbiBub25lIGlzIHByb3ZpZGVkLlxuICAgKi9cbiAgZGVzY3JpcHRpb246IHN0cmluZztcblxuICAvKipcbiAgICogRGVmYXVsdCBkdXJhdGlvbiAobXMpIGJlZm9yZSBhdXRvLWRpc21pc3MuXG4gICAqIFVzZSBgMGAgZm9yIHBlcnNpc3RlbnQgdG9hc3RzLlxuICAgKi9cbiAgZHVyYXRpb246IG51bWJlcjtcblxuICAvKipcbiAgICogRGVmYXVsdCBkdXJhdGlvbiAobXMpIGZvciB0aGUgZmFkZS1vdXQgYW5pbWF0aW9uLlxuICAgKi9cbiAgY2xvc2VEdXJhdGlvbjogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvYXN0cyBhcmUgY2xvc2FibGUgYnkgZGVmYXVsdC5cbiAgICovXG4gIGNsb3NhYmxlOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgVE9BU1RfQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuPFRvYXN0Q29uZmlnPignVG9hc3RDb25maWcnKTtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfVE9BU1RfQ09ORklHOiBSZXF1aXJlZDxUb2FzdENvbmZpZz4gPSB7XG4gIHR5cGU6ICdpbmZvcm1hdGlvbicsXG4gIHRpdGxlOiAnTm90aWZpY2F0aW9uJyxcbiAgZGVzY3JpcHRpb246ICcnLFxuICBkdXJhdGlvbjogNzUwMCxcbiAgY2xvc2VEdXJhdGlvbjogMzAwLFxuICBjbG9zYWJsZTogdHJ1ZSxcbn07Il19
@@ -0,0 +1,206 @@
1
+ import { computed, inject, Injectable, signal } from '@angular/core';
2
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
+ import { delay, filter, mergeMap, of, Subject, tap } from 'rxjs';
4
+ import { ToastState } from './models/toast-state.enum';
5
+ import { TOAST_TYPES } from './models/toast-type';
6
+ import { TOAST_CONFIG } from './toast.config';
7
+ import * as i0 from "@angular/core";
8
+ /**
9
+ * Service for creating, managing, and removing toast notifications.
10
+ * Supports automatic dismissal, manual control, and lifecycle hooks.
11
+ */
12
+ export class ToastService {
13
+ config = inject(TOAST_CONFIG);
14
+ //*------------------------------------------------------------
15
+ //* Section: Internal variables
16
+ //*------------------------------------------------------------
17
+ /** Internal ID tracker for unique toast IDs */
18
+ id = 0;
19
+ /** Signal state holding all toasts */
20
+ _toasts = signal([]);
21
+ /** Public signal of all toasts */
22
+ toasts = this._toasts.asReadonly();
23
+ /** Signal of toasts that are not yet closed (open or closing) */
24
+ activeToasts = computed(() => this._toasts().filter((toast) => toast.state !== ToastState.Closed));
25
+ /** Internal stream for auto-closing toasts */
26
+ autoCloseSubject = new Subject();
27
+ /** Internal stream for fade-out/removal of toasts */
28
+ closeSubject = new Subject();
29
+ constructor() {
30
+ // Auto-close after toast.duration
31
+ this.autoCloseSubject
32
+ .pipe(takeUntilDestroyed(), filter((toast) => toast.duration > 0), mergeMap((toast) => of(toast).pipe(delay(toast.duration), filter(() => this.shouldAutoClose(toast.id)), tap(() => this.close(toast.id)))))
33
+ .subscribe();
34
+ // Remove after toast.closeDuration (fade-out)
35
+ this.closeSubject
36
+ .pipe(takeUntilDestroyed(), mergeMap((toast) => of(toast).pipe(delay(toast.closeDuration), filter(() => this.shouldRemove(toast.id)), tap(() => this.remove(toast.id)))))
37
+ .subscribe();
38
+ }
39
+ //*------------------------------------------------------------
40
+ //* Section: Public methods
41
+ //*------------------------------------------------------------
42
+ /**
43
+ * Creates and adds a new toast.
44
+ * @param toastOptions Partial toast definition.
45
+ * @returns The toast's unique ID.
46
+ */
47
+ create(toastOptions) {
48
+ const id = this.createId();
49
+ const toast = {
50
+ ...this.config,
51
+ ...toastOptions,
52
+ id,
53
+ state: ToastState.Open,
54
+ duration: this.normalizeDuration(toastOptions.duration, this.config.duration),
55
+ closeDuration: this.normalizeDuration(toastOptions.closeDuration, this.config.closeDuration),
56
+ };
57
+ this.addToast(toast);
58
+ toast.onCreated?.(toast);
59
+ // Schedule auto-close if duration > 0
60
+ if (toast.duration > 0) {
61
+ this.autoCloseSubject.next(toast);
62
+ }
63
+ return id;
64
+ }
65
+ /**
66
+ * Initiates the fade-out transition for a toast.
67
+ * @param id The toast ID.
68
+ */
69
+ close(id) {
70
+ let toast = this.getToast(id);
71
+ if (!toast || toast.state !== ToastState.Open)
72
+ return;
73
+ toast = this.updateToastState(toast.id, ToastState.Closing);
74
+ toast?.onClose?.(toast);
75
+ // Schedule removal after close duration
76
+ if (toast)
77
+ this.closeSubject.next(toast);
78
+ }
79
+ /**
80
+ * Immediately marks a toast as closed and removes it from display.
81
+ * @param id The toast ID.
82
+ */
83
+ remove(id) {
84
+ const toast = this.updateToastState(id, ToastState.Closed);
85
+ toast?.onRemoved?.(toast);
86
+ }
87
+ /**
88
+ * Closes and removes all toasts immediately without fade-out.
89
+ */
90
+ removeAll() {
91
+ const closedToasts = [];
92
+ this._toasts.update((toasts) => toasts.map((toast) => {
93
+ if (toast.state !== ToastState.Closed) {
94
+ const updated = { ...toast, state: ToastState.Closed };
95
+ closedToasts.push(updated);
96
+ return updated;
97
+ }
98
+ return toast;
99
+ }));
100
+ closedToasts.forEach((toast) => toast.onRemoved?.(toast));
101
+ }
102
+ /**
103
+ * Initiates closing process for all open toasts.
104
+ */
105
+ closeAll() {
106
+ const openToasts = this.toasts().filter((toast) => toast.state === ToastState.Open);
107
+ openToasts.forEach((toast) => this.close(toast.id));
108
+ }
109
+ /**
110
+ * Gets a toast by ID.
111
+ * @param id The toast ID.
112
+ * @returns The toast instance or undefined.
113
+ */
114
+ getToast(id) {
115
+ return this._toasts().find((toast) => toast.id === id);
116
+ }
117
+ //*------------------------------------------------------------
118
+ //* Section: Internal methods
119
+ //*------------------------------------------------------------
120
+ /** Whether the toast is eligible for auto-closing */
121
+ shouldAutoClose(id) {
122
+ const currentToast = this.getToast(id);
123
+ return currentToast?.state === ToastState.Open;
124
+ }
125
+ /** Whether the toast is eligible for final removal */
126
+ shouldRemove(id) {
127
+ const currentToast = this.getToast(id);
128
+ return currentToast?.state === ToastState.Closing;
129
+ }
130
+ /** Add toast to signal list */
131
+ addToast(toast) {
132
+ this._toasts.update((prev) => [...prev, toast]);
133
+ }
134
+ /**
135
+ * Updates the state of a toast.
136
+ * @param id Toast ID
137
+ * @param state New state
138
+ * @returns The updated toast or undefined
139
+ */
140
+ updateToastState(id, state) {
141
+ let updatedToast;
142
+ this._toasts.update((prev) => prev.map((toast) => {
143
+ if (toast.id === id) {
144
+ updatedToast = { ...toast, state };
145
+ return updatedToast;
146
+ }
147
+ return toast;
148
+ }));
149
+ return updatedToast;
150
+ }
151
+ /**
152
+ * Creates a unique id
153
+ * @returns New id
154
+ */
155
+ createId() {
156
+ return ++this.id;
157
+ }
158
+ //*------------------------------------------------------------
159
+ //* Section: Public convenience methods
160
+ //*------------------------------------------------------------
161
+ /**
162
+ * Creates a success toast.
163
+ * @param props Toast props without type.
164
+ */
165
+ success = (props = {}) => this.create({ ...props, type: 'success' });
166
+ /**
167
+ * Creates an error toast.
168
+ * @param props Toast props without type.
169
+ */
170
+ error = (props = {}) => this.create({ ...props, type: 'error' });
171
+ /**
172
+ * Creates a warning toast.
173
+ * @param props Toast props without type.
174
+ */
175
+ warning = (props = {}) => this.create({ ...props, type: 'warning' });
176
+ /**
177
+ * Creates an informational toast.
178
+ * @param props Toast props without type.
179
+ */
180
+ info = (props = {}) => this.create({ ...props, type: 'information' });
181
+ /**
182
+ * Creates a random toast for testing/demo purposes.
183
+ * @param props Optional overrides
184
+ */
185
+ createRandomToast = (props = {}) => this.create({
186
+ type: TOAST_TYPES[~~(Math.random() * 4)],
187
+ title: `Random Toast ${Math.random().toString(36).substring(7)}`,
188
+ ...props,
189
+ });
190
+ //*------------------------------------------------------------
191
+ //* Section: Helper methods
192
+ //*------------------------------------------------------------
193
+ normalizeDuration(value, fallback) {
194
+ const num = typeof value === 'number' ? value : fallback;
195
+ return !Number.isFinite(num) || num < 0 ? 0 : num;
196
+ }
197
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: ToastService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
198
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: ToastService, providedIn: 'root' });
199
+ }
200
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: ToastService, decorators: [{
201
+ type: Injectable,
202
+ args: [{
203
+ providedIn: 'root',
204
+ }]
205
+ }], ctorParameters: () => [] });
206
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3Quc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvdGVnZWwtYW5ndWxhci1leHRlbnNpb25zL3NyYy9saWIvdG9hc3QvdG9hc3Quc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWxELE9BQU8sRUFBRSxZQUFZLEVBQWUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFFM0Q7OztHQUdHO0FBSUgsTUFBTSxPQUFPLFlBQVk7SUFDTixNQUFNLEdBQUcsTUFBTSxDQUFjLFlBQVksQ0FBQyxDQUFDO0lBRTVELCtEQUErRDtJQUMvRCwrQkFBK0I7SUFDL0IsK0RBQStEO0lBRS9ELCtDQUErQztJQUN2QyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBRWYsc0NBQXNDO0lBQ3JCLE9BQU8sR0FBRyxNQUFNLENBQVUsRUFBRSxDQUFDLENBQUM7SUFFL0Msa0NBQWtDO0lBQ3pCLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBRTVDLGlFQUFpRTtJQUN4RCxZQUFZLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUNwQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMs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LEdBQUcsS0FBSyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDO0lBRWpEOzs7T0FHRztJQUNNLGlCQUFpQixHQUFHLENBQUMsUUFBK0IsRUFBRSxFQUFFLEVBQUUsQ0FDakUsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNWLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLEtBQUssRUFBRSxnQkFBZ0IsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDaEUsR0FBRyxLQUFLO0tBQ1QsQ0FBQyxDQUFDO0lBRUwsK0RBQStEO0lBQy9ELDJCQUEyQjtJQUMzQiwrREFBK0Q7SUFDdkQsaUJBQWlCLENBQUMsS0FBYyxFQUFFLFFBQWdCO1FBQ3hELE1BQU0sR0FBRyxHQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7UUFDekQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDcEQsQ0FBQzt3R0FsUVUsWUFBWTs0R0FBWixZQUFZLGNBRlgsTUFBTTs7NEZBRVAsWUFBWTtrQkFIeEIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb21wdXRlZCwgaW5qZWN0LCBJbmplY3RhYmxlLCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IGRlbGF5LCBmaWx0ZXIsIG1lcmdlTWFwLCBvZiwgU3ViamVjdCwgdGFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBUb2FzdFN0YXRlIH0gZnJvbSAnLi9tb2RlbHMvdG9hc3Qtc3RhdGUuZW51bSc7XG5pbXBvcnQgeyBUT0FTVF9UWVBFUyB9IGZyb20gJy4vbW9kZWxzL3RvYXN0LXR5cGUnO1xuaW1wb3J0IHsgVG9hc3QsIFRvYXN0T3B0aW9ucyB9IGZyb20gJy4vbW9kZWxzL3RvYXN0Lm1vZGVsJztcbmltcG9ydCB7IFRPQVNUX0NPTkZJRywgVG9hc3RDb25maWcgfSBmcm9tICcuL3RvYXN0LmNvbmZpZyc7XG5cbi8qKlxuICogU2VydmljZSBmb3IgY3JlYXRpbmcsIG1hbmFnaW5nLCBhbmQgcmVtb3ZpbmcgdG9hc3Qgbm90aWZpY2F0aW9ucy5cbiAqIFN1cHBvcnRzIGF1dG9tYXRpYyBkaXNtaXNzYWwsIG1hbnVhbCBjb250cm9sLCBhbmQgbGlmZWN5Y2xlIGhvb2tzLlxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgVG9hc3RTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWcgPSBpbmplY3Q8VG9hc3RDb25maWc+KFRPQVNUX0NPTkZJRyk7XG5cbiAgLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vKiBTZWN0aW9uOiBJbnRlcm5hbCB2YXJpYWJsZXNcbiAgLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqIEludGVybmFsIElEIHRyYWNrZXIgZm9yIHVuaXF1ZSB0b2FzdCBJRHMgKi9cbiAgcHJpdmF0ZSBpZCA9IDA7XG5cbiAgLyoqIFNpZ25hbCBzdGF0ZSBob2xkaW5nIGFsbCB0b2FzdHMgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfdG9hc3RzID0gc2lnbmFsPFRvYXN0W10+KFtdKTtcblxuICAvKiogUHVibGljIHNpZ25hbCBvZiBhbGwgdG9hc3RzICovXG4gIHJlYWRvbmx5IHRvYXN0cyA9IHRoaXMuX3RvYXN0cy5hc1JlYWRvbmx5KCk7XG5cbiAgLyoqIFNpZ25hbCBvZiB0b2FzdHMgdGhhdCBhcmUgbm90IHlldCBjbG9zZWQgKG9wZW4gb3IgY2xvc2luZykgKi9cbiAgcmVhZG9ubHkgYWN0aXZlVG9hc3RzID0gY29tcHV0ZWQoKCkgPT5cbiAgICB0aGlzLl90b2FzdHMoKS5maWx0ZXIoKHRvYXN0KSA9PiB0b2FzdC5zdGF0ZSAhPT0gVG9hc3RTdGF0ZS5DbG9zZWQpXG4gICk7XG5cbiAgLyoqIEludGVybmFsIHN0cmVhbSBmb3IgYXV0by1jbG9zaW5nIHRvYXN0cyAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGF1dG9DbG9zZVN1YmplY3QgPSBuZXcgU3ViamVjdDxUb2FzdD4oKTtcblxuICAvKiogSW50ZXJuYWwgc3RyZWFtIGZvciBmYWRlLW91dC9yZW1vdmFsIG9mIHRvYXN0cyAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNsb3NlU3ViamVjdCA9IG5ldyBTdWJqZWN0PFRvYXN0PigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIEF1dG8tY2xvc2UgYWZ0ZXIgdG9hc3QuZHVyYXRpb25cbiAgICB0aGlzLmF1dG9DbG9zZVN1YmplY3RcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQoKSxcbiAgICAgICAgZmlsdGVyKCh0b2FzdCkgPT4gdG9hc3QuZHVyYXRpb24gPiAwKSxcbiAgICAgICAgbWVyZ2VNYXAoKHRvYXN0OiBUb2FzdCkgPT5cbiAgICAgICAgICBvZih0b2FzdCkucGlwZShcbiAgICAgICAgICAgIGRlbGF5KHRvYXN0LmR1cmF0aW9uKSxcbiAgICAgICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLnNob3VsZEF1dG9DbG9zZSh0b2FzdC5pZCkpLFxuICAgICAgICAgICAgdGFwKCgpID0+IHRoaXMuY2xvc2UodG9hc3QuaWQpKVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgLy8gUmVtb3ZlIGFmdGVyIHRvYXN0LmNsb3NlRHVyYXRpb24gKGZhZGUtb3V0KVxuICAgIHRoaXMuY2xvc2VTdWJqZWN0XG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKCksXG4gICAgICAgIG1lcmdlTWFwKCh0b2FzdDogVG9hc3QpID0+XG4gICAgICAgICAgb2YodG9hc3QpLnBpcGUoXG4gICAgICAgICAgICBkZWxheSh0b2FzdC5jbG9zZUR1cmF0aW9uKSxcbiAgICAgICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLnNob3VsZFJlbW92ZSh0b2FzdC5pZCkpLFxuICAgICAgICAgICAgdGFwKCgpID0+IHRoaXMucmVtb3ZlKHRvYXN0LmlkKSlcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyogU2VjdGlvbjogUHVibGljIG1ldGhvZHNcbiAgLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW5kIGFkZHMgYSBuZXcgdG9hc3QuXG4gICAqIEBwYXJhbSB0b2FzdE9wdGlvbnMgUGFydGlhbCB0b2FzdCBkZWZpbml0aW9uLlxuICAgKiBAcmV0dXJucyBUaGUgdG9hc3QncyB1bmlxdWUgSUQuXG4gICAqL1xuICBjcmVhdGUodG9hc3RPcHRpb25zOiBQYXJ0aWFsPFRvYXN0T3B0aW9ucz4pOiBudW1iZXIge1xuICAgIGNvbnN0IGlkID0gdGhpcy5jcmVhdGVJZCgpO1xuICAgIGNvbnN0IHRvYXN0OiBUb2FzdCA9IHtcbiAgICAgIC4uLnRoaXMuY29uZmlnLFxuICAgICAgLi4udG9hc3RPcHRpb25zLFxuICAgICAgaWQsXG4gICAgICBzdGF0ZTogVG9hc3RTdGF0ZS5PcGVuLFxuICAgICAgZHVyYXRpb246IHRoaXMubm9ybWFsaXplRHVyYXRpb24oXG4gICAgICAgIHRvYXN0T3B0aW9ucy5kdXJhdGlvbixcbiAgICAgICAgdGhpcy5jb25maWcuZHVyYXRpb25cbiAgICAgICksXG4gICAgICBjbG9zZUR1cmF0aW9uOiB0aGlzLm5vcm1hbGl6ZUR1cmF0aW9uKFxuICAgICAgICB0b2FzdE9wdGlvbnMuY2xvc2VEdXJhdGlvbixcbiAgICAgICAgdGhpcy5jb25maWcuY2xvc2VEdXJhdGlvblxuICAgICAgKSxcbiAgICB9O1xuXG4gICAgdGhpcy5hZGRUb2FzdCh0b2FzdCk7XG4gICAgdG9hc3Qub25DcmVhdGVkPy4odG9hc3QpO1xuXG4gICAgLy8gU2NoZWR1bGUgYXV0by1jbG9zZSBpZiBkdXJhdGlvbiA+IDBcbiAgICBpZiAodG9hc3QuZHVyYXRpb24gPiAwKSB7XG4gICAgICB0aGlzLmF1dG9DbG9zZVN1YmplY3QubmV4dCh0b2FzdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlkO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYXRlcyB0aGUgZmFkZS1vdXQgdHJhbnNpdGlvbiBmb3IgYSB0b2FzdC5cbiAgICogQHBhcmFtIGlkIFRoZSB0b2FzdCBJRC5cbiAgICovXG4gIGNsb3NlKGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgICBsZXQgdG9hc3QgPSB0aGlzLmdldFRvYXN0KGlkKTtcbiAgICBpZiAoIXRvYXN0IHx8IHRvYXN0LnN0YXRlICE9PSBUb2FzdFN0YXRlLk9wZW4pIHJldHVybjtcblxuICAgIHRvYXN0ID0gdGhpcy51cGRhdGVUb2FzdFN0YXRlKHRvYXN0LmlkLCBUb2FzdFN0YXRlLkNsb3NpbmcpO1xuICAgIHRvYXN0Py5vbkNsb3NlPy4odG9hc3QpO1xuXG4gICAgLy8gU2NoZWR1bGUgcmVtb3ZhbCBhZnRlciBjbG9zZSBkdXJhdGlvblxuICAgIGlmICh0b2FzdCkgdGhpcy5jbG9zZVN1YmplY3QubmV4dCh0b2FzdCk7XG4gIH1cblxuICAvKipcbiAgICogSW1tZWRpYXRlbHkgbWFya3MgYSB0b2FzdCBhcyBjbG9zZWQgYW5kIHJlbW92ZXMgaXQgZnJvbSBkaXNwbGF5LlxuICAgKiBAcGFyYW0gaWQgVGhlIHRvYXN0IElELlxuICAgKi9cbiAgcmVtb3ZlKGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB0b2FzdCA9IHRoaXMudXBkYXRlVG9hc3RTdGF0ZShpZCwgVG9hc3RTdGF0ZS5DbG9zZWQpO1xuICAgIHRvYXN0Py5vblJlbW92ZWQ/Lih0b2FzdCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIGFuZCByZW1vdmVzIGFsbCB0b2FzdHMgaW1tZWRpYXRlbHkgd2l0aG91dCBmYWRlLW91dC5cbiAgICovXG4gIHJlbW92ZUFsbCgpOiB2b2lkIHtcbiAgICBjb25zdCBjbG9zZWRUb2FzdHM6IFRvYXN0W10gPSBbXTtcblxuICAgIHRoaXMuX3RvYXN0cy51cGRhdGUoKHRvYXN0cykgPT5cbiAgICAgIHRvYXN0cy5tYXAoKHRvYXN0KSA9PiB7XG4gICAgICAgIGlmICh0b2FzdC5zdGF0ZSAhPT0gVG9hc3RTdGF0ZS5DbG9zZWQpIHtcbiAgICAgICAgICBjb25zdCB1cGRhdGVkID0geyAuLi50b2FzdCwgc3RhdGU6IFRvYXN0U3RhdGUuQ2xvc2VkIH07XG4gICAgICAgICAgY2xvc2VkVG9hc3RzLnB1c2godXBkYXRlZCk7XG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRvYXN0O1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgY2xvc2VkVG9hc3RzLmZvckVhY2goKHRvYXN0KSA9PiB0b2FzdC5vblJlbW92ZWQ/Lih0b2FzdCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYXRlcyBjbG9zaW5nIHByb2Nlc3MgZm9yIGFsbCBvcGVuIHRvYXN0cy5cbiAgICovXG4gIGNsb3NlQWxsKCk6IHZvaWQge1xuICAgIGNvbnN0IG9wZW5Ub2FzdHMgPSB0aGlzLnRvYXN0cygpLmZpbHRlcihcbiAgICAgICh0b2FzdCkgPT4gdG9hc3Quc3RhdGUgPT09IFRvYXN0U3RhdGUuT3BlblxuICAgICk7XG4gICAgb3BlblRvYXN0cy5mb3JFYWNoKCh0b2FzdCkgPT4gdGhpcy5jbG9zZSh0b2FzdC5pZCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSB0b2FzdCBieSBJRC5cbiAgICogQHBhcmFtIGlkIFRoZSB0b2FzdCBJRC5cbiAgICogQHJldHVybnMgVGhlIHRvYXN0IGluc3RhbmNlIG9yIHVuZGVmaW5lZC5cbiAgICovXG4gIGdldFRvYXN0KGlkOiBudW1iZXIpOiBUb2FzdCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3RvYXN0cygpLmZpbmQoKHRvYXN0KSA9PiB0b2FzdC5pZCA9PT0gaWQpO1xuICB9XG5cbiAgLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vKiBTZWN0aW9uOiBJbnRlcm5hbCBtZXRob2RzXG4gIC8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKiBXaGV0aGVyIHRoZSB0b2FzdCBpcyBlbGlnaWJsZSBmb3IgYXV0by1jbG9zaW5nICovXG4gIHByaXZhdGUgc2hvdWxkQXV0b0Nsb3NlKGlkOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBjdXJyZW50VG9hc3QgPSB0aGlzLmdldFRvYXN0KGlkKTtcbiAgICByZXR1cm4gY3VycmVudFRvYXN0Py5zdGF0ZSA9PT0gVG9hc3RTdGF0ZS5PcGVuO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIHRvYXN0IGlzIGVsaWdpYmxlIGZvciBmaW5hbCByZW1vdmFsICovXG4gIHByaXZhdGUgc2hvdWxkUmVtb3ZlKGlkOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBjdXJyZW50VG9hc3QgPSB0aGlzLmdldFRvYXN0KGlkKTtcbiAgICByZXR1cm4gY3VycmVudFRvYXN0Py5zdGF0ZSA9PT0gVG9hc3RTdGF0ZS5DbG9zaW5nO1xuICB9XG5cbiAgLyoqIEFkZCB0b2FzdCB0byBzaWduYWwgbGlzdCAqL1xuICBwcml2YXRlIGFkZFRvYXN0KHRvYXN0OiBUb2FzdCk6IHZvaWQge1xuICAgIHRoaXMuX3RvYXN0cy51cGRhdGUoKHByZXYpID0+IFsuLi5wcmV2LCB0b2FzdF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIHN0YXRlIG9mIGEgdG9hc3QuXG4gICAqIEBwYXJhbSBpZCBUb2FzdCBJRFxuICAgKiBAcGFyYW0gc3RhdGUgTmV3IHN0YXRlXG4gICAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIHRvYXN0IG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVUb2FzdFN0YXRlKGlkOiBudW1iZXIsIHN0YXRlOiBUb2FzdFN0YXRlKTogVG9hc3QgfCB1bmRlZmluZWQge1xuICAgIGxldCB1cGRhdGVkVG9hc3Q6IFRvYXN0IHwgdW5kZWZpbmVkO1xuXG4gICAgdGhpcy5fdG9hc3RzLnVwZGF0ZSgocHJldikgPT5cbiAgICAgIHByZXYubWFwKCh0b2FzdCkgPT4ge1xuICAgICAgICBpZiAodG9hc3QuaWQgPT09IGlkKSB7XG4gICAgICAgICAgdXBkYXRlZFRvYXN0ID0geyAuLi50b2FzdCwgc3RhdGUgfTtcbiAgICAgICAgICByZXR1cm4gdXBkYXRlZFRvYXN0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0b2FzdDtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHJldHVybiB1cGRhdGVkVG9hc3Q7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHVuaXF1ZSBpZFxuICAgKiBAcmV0dXJucyBOZXcgaWRcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlSWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKyt0aGlzLmlkO1xuICB9XG5cbiAgLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vKiBTZWN0aW9uOiBQdWJsaWMgY29udmVuaWVuY2UgbWV0aG9kc1xuICAvLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHN1Y2Nlc3MgdG9hc3QuXG4gICAqIEBwYXJhbSBwcm9wcyBUb2FzdCBwcm9wcyB3aXRob3V0IHR5cGUuXG4gICAqL1xuICByZWFkb25seSBzdWNjZXNzID0gKHByb3BzOiBQYXJ0aWFsPE9taXQ8VG9hc3RPcHRpb25zLCAndHlwZSc+PiA9IHt9KSA9PlxuICAgIHRoaXMuY3JlYXRlKHsgLi4ucHJvcHMsIHR5cGU6ICdzdWNjZXNzJyB9KTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBlcnJvciB0b2FzdC5cbiAgICogQHBhcmFtIHByb3BzIFRvYXN0IHByb3BzIHdpdGhvdXQgdHlwZS5cbiAgICovXG4gIHJlYWRvbmx5IGVycm9yID0gKHByb3BzOiBQYXJ0aWFsPE9taXQ8VG9hc3RPcHRpb25zLCAndHlwZSc+PiA9IHt9KSA9PlxuICAgIHRoaXMuY3JlYXRlKHsgLi4ucHJvcHMsIHR5cGU6ICdlcnJvcicgfSk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB3YXJuaW5nIHRvYXN0LlxuICAgKiBAcGFyYW0gcHJvcHMgVG9hc3QgcHJvcHMgd2l0aG91dCB0eXBlLlxuICAgKi9cbiAgcmVhZG9ubHkgd2FybmluZyA9IChwcm9wczogUGFydGlhbDxPbWl0PFRvYXN0T3B0aW9ucywgJ3R5cGUnPj4gPSB7fSkgPT5cbiAgICB0aGlzLmNyZWF0ZSh7IC4uLnByb3BzLCB0eXBlOiAnd2FybmluZycgfSk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5mb3JtYXRpb25hbCB0b2FzdC5cbiAgICogQHBhcmFtIHByb3BzIFRvYXN0IHByb3BzIHdpdGhvdXQgdHlwZS5cbiAgICovXG4gIHJlYWRvbmx5IGluZm8gPSAocHJvcHM6IFBhcnRpYWw8T21pdDxUb2FzdE9wdGlvbnMsICd0eXBlJz4+ID0ge30pID0+XG4gICAgdGhpcy5jcmVhdGUoeyAuLi5wcm9wcywgdHlwZTogJ2luZm9ybWF0aW9uJyB9KTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHJhbmRvbSB0b2FzdCBmb3IgdGVzdGluZy9kZW1vIHB1cnBvc2VzLlxuICAgKiBAcGFyYW0gcHJvcHMgT3B0aW9uYWwgb3ZlcnJpZGVzXG4gICAqL1xuICByZWFkb25seSBjcmVhdGVSYW5kb21Ub2FzdCA9IChwcm9wczogUGFydGlhbDxUb2FzdE9wdGlvbnM+ID0ge30pID0+XG4gICAgdGhpcy5jcmVhdGUoe1xuICAgICAgdHlwZTogVE9BU1RfVFlQRVNbfn4oTWF0aC5yYW5kb20oKSAqIDQpXSxcbiAgICAgIHRpdGxlOiBgUmFuZG9tIFRvYXN0ICR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDcpfWAsXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KTtcblxuICAvLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8qIFNlY3Rpb246IEhlbHBlciBtZXRob2RzXG4gIC8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICBwcml2YXRlIG5vcm1hbGl6ZUR1cmF0aW9uKHZhbHVlOiB1bmtub3duLCBmYWxsYmFjazogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBudW0gPSB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInID8gdmFsdWUgOiBmYWxsYmFjaztcbiAgICByZXR1cm4gIU51bWJlci5pc0Zpbml0ZShudW0pIHx8IG51bSA8IDAgPyAwIDogbnVtO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,43 @@
1
+ import { ApplicationRef, EnvironmentInjector, createComponent, inject, } from '@angular/core';
2
+ /**
3
+ * Internal map to track which global components have been bootstrapped.
4
+ */
5
+ const bootstrappedComponents = new WeakMap();
6
+ /**
7
+ * Bootstraps a global Angular component directly into the <body> element.
8
+ * Useful for toasts, modals, and other global overlays.
9
+ *
10
+ * @param component - The component class to bootstrap.
11
+ * @param options - Optional settings like preventing duplicates.
12
+ * @returns The created ComponentRef.
13
+ */
14
+ export function bootstrapGlobalComponent(component, options) {
15
+ const appRef = inject(ApplicationRef);
16
+ const injector = inject(EnvironmentInjector);
17
+ const existing = bootstrappedComponents.get(component);
18
+ if (existing && options?.reuseIfExists) {
19
+ return existing;
20
+ }
21
+ const cmpRef = createComponent(component, {
22
+ environmentInjector: injector,
23
+ });
24
+ appRef.attachView(cmpRef.hostView);
25
+ const viewRef = cmpRef.hostView;
26
+ const element = viewRef.rootNodes[0];
27
+ document.body.appendChild(element);
28
+ bootstrappedComponents.set(component, cmpRef);
29
+ return cmpRef;
30
+ }
31
+ /**
32
+ * Destroys a previously bootstrapped global component.
33
+ *
34
+ * @param component - The component class to remove from DOM.
35
+ */
36
+ export function destroyGlobalComponent(component) {
37
+ const cmpRef = bootstrappedComponents.get(component);
38
+ if (cmpRef) {
39
+ cmpRef.destroy();
40
+ bootstrappedComponents.delete(component);
41
+ }
42
+ }
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vdHN0cmFwLWdsb2JhbC1jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3RlZ2VsLWFuZ3VsYXItZXh0ZW5zaW9ucy9zcmMvbGliL3V0aWxzL2Jvb3RzdHJhcC1nbG9iYWwtY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxjQUFjLEVBR2QsbUJBQW1CLEVBRW5CLGVBQWUsRUFDZixNQUFNLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFFdkI7O0dBRUc7QUFDSCxNQUFNLHNCQUFzQixHQUFHLElBQUksT0FBTyxFQUd2QyxDQUFDO0FBU0o7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSx3QkFBd0IsQ0FDdEMsU0FBa0IsRUFDbEIsT0FBeUM7SUFFekMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3RDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBRTdDLE1BQU0sUUFBUSxHQUFHLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN2RCxJQUFJLFFBQVEsSUFBSSxPQUFPLEVBQUUsYUFBYSxFQUFFLENBQUM7UUFDdkMsT0FBTyxRQUEyQixDQUFDO0lBQ3JDLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsU0FBUyxFQUFFO1FBQ3hDLG1CQUFtQixFQUFFLFFBQVE7S0FDOUIsQ0FBQyxDQUFDO0lBRUgsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFbkMsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFFBQW9DLENBQUM7SUFDNUQsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQWdCLENBQUM7SUFFcEQsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFbkMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUU5QyxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FBSSxTQUFrQjtJQUMxRCxNQUFNLE1BQU0sR0FBRyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDckQsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUNYLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNqQixzQkFBc0IsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDM0MsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFwcGxpY2F0aW9uUmVmLFxuICAgIENvbXBvbmVudFJlZixcbiAgICBFbWJlZGRlZFZpZXdSZWYsXG4gICAgRW52aXJvbm1lbnRJbmplY3RvcixcbiAgICBUeXBlLFxuICAgIGNyZWF0ZUNvbXBvbmVudCxcbiAgICBpbmplY3QsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIEludGVybmFsIG1hcCB0byB0cmFjayB3aGljaCBnbG9iYWwgY29tcG9uZW50cyBoYXZlIGJlZW4gYm9vdHN0cmFwcGVkLlxuICovXG5jb25zdCBib290c3RyYXBwZWRDb21wb25lbnRzID0gbmV3IFdlYWtNYXA8XG4gIFR5cGU8dW5rbm93bj4sXG4gIENvbXBvbmVudFJlZjx1bmtub3duPlxuPigpO1xuXG5pbnRlcmZhY2UgQm9vdHN0cmFwR2xvYmFsQ29tcG9uZW50T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBJZiB0cnVlLCBhdm9pZHMgcmUtY3JlYXRpbmcgdGhlIGNvbXBvbmVudCBpZiBpdCdzIGFscmVhZHkgbW91bnRlZC5cbiAgICovXG4gIHJldXNlSWZFeGlzdHM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEJvb3RzdHJhcHMgYSBnbG9iYWwgQW5ndWxhciBjb21wb25lbnQgZGlyZWN0bHkgaW50byB0aGUgPGJvZHk+IGVsZW1lbnQuXG4gKiBVc2VmdWwgZm9yIHRvYXN0cywgbW9kYWxzLCBhbmQgb3RoZXIgZ2xvYmFsIG92ZXJsYXlzLlxuICpcbiAqIEBwYXJhbSBjb21wb25lbnQgLSBUaGUgY29tcG9uZW50IGNsYXNzIHRvIGJvb3RzdHJhcC5cbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgc2V0dGluZ3MgbGlrZSBwcmV2ZW50aW5nIGR1cGxpY2F0ZXMuXG4gKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBDb21wb25lbnRSZWYuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBib290c3RyYXBHbG9iYWxDb21wb25lbnQ8VD4oXG4gIGNvbXBvbmVudDogVHlwZTxUPixcbiAgb3B0aW9ucz86IEJvb3RzdHJhcEdsb2JhbENvbXBvbmVudE9wdGlvbnNcbik6IENvbXBvbmVudFJlZjxUPiB7XG4gIGNvbnN0IGFwcFJlZiA9IGluamVjdChBcHBsaWNhdGlvblJlZik7XG4gIGNvbnN0IGluamVjdG9yID0gaW5qZWN0KEVudmlyb25tZW50SW5qZWN0b3IpO1xuXG4gIGNvbnN0IGV4aXN0aW5nID0gYm9vdHN0cmFwcGVkQ29tcG9uZW50cy5nZXQoY29tcG9uZW50KTtcbiAgaWYgKGV4aXN0aW5nICYmIG9wdGlvbnM/LnJldXNlSWZFeGlzdHMpIHtcbiAgICByZXR1cm4gZXhpc3RpbmcgYXMgQ29tcG9uZW50UmVmPFQ+O1xuICB9XG5cbiAgY29uc3QgY21wUmVmID0gY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudCwge1xuICAgIGVudmlyb25tZW50SW5qZWN0b3I6IGluamVjdG9yLFxuICB9KTtcblxuICBhcHBSZWYuYXR0YWNoVmlldyhjbXBSZWYuaG9zdFZpZXcpO1xuXG4gIGNvbnN0IHZpZXdSZWYgPSBjbXBSZWYuaG9zdFZpZXcgYXMgRW1iZWRkZWRWaWV3UmVmPHVua25vd24+O1xuICBjb25zdCBlbGVtZW50ID0gdmlld1JlZi5yb290Tm9kZXNbMF0gYXMgSFRNTEVsZW1lbnQ7XG5cbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlbGVtZW50KTtcblxuICBib290c3RyYXBwZWRDb21wb25lbnRzLnNldChjb21wb25lbnQsIGNtcFJlZik7XG5cbiAgcmV0dXJuIGNtcFJlZjtcbn1cblxuLyoqXG4gKiBEZXN0cm95cyBhIHByZXZpb3VzbHkgYm9vdHN0cmFwcGVkIGdsb2JhbCBjb21wb25lbnQuXG4gKlxuICogQHBhcmFtIGNvbXBvbmVudCAtIFRoZSBjb21wb25lbnQgY2xhc3MgdG8gcmVtb3ZlIGZyb20gRE9NLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzdHJveUdsb2JhbENvbXBvbmVudDxUPihjb21wb25lbnQ6IFR5cGU8VD4pOiB2b2lkIHtcbiAgY29uc3QgY21wUmVmID0gYm9vdHN0cmFwcGVkQ29tcG9uZW50cy5nZXQoY29tcG9uZW50KTtcbiAgaWYgKGNtcFJlZikge1xuICAgIGNtcFJlZi5kZXN0cm95KCk7XG4gICAgYm9vdHN0cmFwcGVkQ29tcG9uZW50cy5kZWxldGUoY29tcG9uZW50KTtcbiAgfVxufVxuIl19
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NhbmlhLW5sLXRlZ2VsLWFuZ3VsYXItZXh0ZW5zaW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnMvdGVnZWwtYW5ndWxhci1leHRlbnNpb25zL3NyYy9zY2FuaWEtbmwtdGVnZWwtYW5ndWxhci1leHRlbnNpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuIl19
@@ -1,4 +1,4 @@
1
1
  export * from './lib/toast/provide-toast';
2
2
  export * from './lib/toast/toast.config';
3
3
  export * from './lib/toast/toast.service';
4
- export * from './lib/toast/models/toast.model'
4
+ export * from './lib/toast/models/toast.model';
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Represents the current lifecycle state of a toast.
3
+ */
4
+ export declare enum ToastState {
5
+ /**
6
+ * The toast is fully visible and active.
7
+ */
8
+ Open = "open",
9
+ /**
10
+ * The toast is transitioning out (e.g., fading out).
11
+ */
12
+ Closing = "closing",
13
+ /**
14
+ * The toast is fully removed or dismissed.
15
+ */
16
+ Closed = "closed"
17
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * List of available toast types (inherited from Tegel)
3
+ */
4
+ export declare const TOAST_TYPES: readonly ["success", "information", "warning", "error"];
5
+ /**
6
+ * Type representing valid toast type values.
7
+ */
8
+ export type ToastType = (typeof TOAST_TYPES)[number];
@@ -0,0 +1,73 @@
1
+ import { ToastState } from './toast-state.enum';
2
+ import { ToastType } from './toast-type';
3
+ /**
4
+ * Defines the base structure for a toast message.
5
+ */
6
+ export interface ToastOptions {
7
+ /**
8
+ * The visual style of the toast (e.g., success, error).
9
+ */
10
+ type: ToastType;
11
+ /**
12
+ * The main title text displayed in the toast.
13
+ */
14
+ title: string;
15
+ /**
16
+ * Optional description text providing additional context.
17
+ */
18
+ description?: string;
19
+ /**
20
+ * Duration in milliseconds before the toast auto-dismisses.
21
+ * Use `0` for persistent toasts.
22
+ */
23
+ duration: number;
24
+ /**
25
+ * Duration in milliseconds for the fade-out transition.
26
+ */
27
+ closeDuration: number;
28
+ /**
29
+ * Whether the toast can be manually closed by the user.
30
+ */
31
+ closable?: boolean;
32
+ /**
33
+ * Optional router link to navigate to when the toast is clicked.
34
+ */
35
+ link?: string;
36
+ /**
37
+ * Custom link text shown if a link is provided.
38
+ */
39
+ linkText?: string;
40
+ /**
41
+ * Optional callback triggered when the linkText is clicked.
42
+ * Used as an alternative to `link` for invoking custom behavior.
43
+ */
44
+ action?: () => void;
45
+ /**
46
+ * Optional callback triggered when the toast is created.
47
+ * @param toast The created toast instance.
48
+ */
49
+ onCreated?: (toast: Toast) => void;
50
+ /**
51
+ * Optional callback triggered when the toast begins to close.
52
+ * @param toast The toast that is closing.
53
+ */
54
+ onClose?: (toast: Toast) => void;
55
+ /**
56
+ * Optional callback triggered when the toast has been fully removed.
57
+ * @param toast The removed toast instance.
58
+ */
59
+ onRemoved?: (toast: Toast) => void;
60
+ }
61
+ /**
62
+ * Represents a fully instantiated toast, including unique ID and current state.
63
+ */
64
+ export interface Toast extends ToastOptions {
65
+ /**
66
+ * Unique identifier for the toast instance.
67
+ */
68
+ id: number;
69
+ /**
70
+ * The current state of the toast (open, closing, or closed).
71
+ */
72
+ state: ToastState;
73
+ }
@@ -0,0 +1,3 @@
1
+ import { EnvironmentProviders } from '@angular/core';
2
+ import { ToastConfig } from './toast.config';
3
+ export declare function provideToast(config?: Partial<ToastConfig>): EnvironmentProviders;
@@ -0,0 +1,24 @@
1
+ import { Toast } from './models/toast.model';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Displays toast notifications provided by the ToastService.
5
+ *
6
+ * Toasts are non-blocking messages that automatically disappear after a set duration
7
+ * or can be dismissed manually by the user.
8
+ */
9
+ export declare class ToastComponent {
10
+ private readonly toastService;
11
+ /**
12
+ * A reactive signal of all currently active toasts (open or closing).
13
+ */
14
+ readonly toastsSignal: import("@angular/core").Signal<Toast[]>;
15
+ /**
16
+ * Initiates the closing process for the given toast.
17
+ *
18
+ * @param toast The toast to be closed.
19
+ * @returns void
20
+ */
21
+ closeToast: (toast: Toast) => void;
22
+ static ɵfac: i0.ɵɵFactoryDeclaration<ToastComponent, never>;
23
+ static ɵcmp: i0.ɵɵComponentDeclaration<ToastComponent, "tds-ext-toast", never, {}, {}, never, never, true, never>;
24
+ }
@@ -0,0 +1,35 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ import { ToastType } from './models/toast-type';
3
+ /**
4
+ * Global default configuration for toast behavior.
5
+ * Used when individual toast properties are not explicitly set.
6
+ */
7
+ export interface ToastConfig {
8
+ /**
9
+ * Default toast type (e.g., 'success', 'information', etc.).
10
+ */
11
+ type: ToastType;
12
+ /**
13
+ * Default title to use when none is provided.
14
+ */
15
+ title: string;
16
+ /**
17
+ * Default description to use when none is provided.
18
+ */
19
+ description: string;
20
+ /**
21
+ * Default duration (ms) before auto-dismiss.
22
+ * Use `0` for persistent toasts.
23
+ */
24
+ duration: number;
25
+ /**
26
+ * Default duration (ms) for the fade-out animation.
27
+ */
28
+ closeDuration: number;
29
+ /**
30
+ * Whether toasts are closable by default.
31
+ */
32
+ closable: boolean;
33
+ }
34
+ export declare const TOAST_CONFIG: InjectionToken<ToastConfig>;
35
+ export declare const DEFAULT_TOAST_CONFIG: Required<ToastConfig>;