@rt-tools/ui-kit-v2 0.33.0 → 0.34.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -3
- package/fesm2022/rt-tools-ui-kit-v2-ai-run-status.mjs +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-ai-run-status.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs +92 -5
- package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-badge.mjs +191 -0
- package/fesm2022/rt-tools-ui-kit-v2-badge.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-breadcrumbs.mjs +3 -2
- package/fesm2022/rt-tools-ui-kit-v2-breadcrumbs.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-button.mjs +6 -1
- package/fesm2022/rt-tools-ui-kit-v2-button.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-checkbox.mjs +35 -4
- package/fesm2022/rt-tools-ui-kit-v2-checkbox.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-color-palette.mjs +13 -4
- package/fesm2022/rt-tools-ui-kit-v2-color-palette.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-container.mjs +245 -60
- package/fesm2022/rt-tools-ui-kit-v2-container.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-copy-value.mjs +30 -5
- package/fesm2022/rt-tools-ui-kit-v2-copy-value.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-core.mjs +113 -2
- package/fesm2022/rt-tools-ui-kit-v2-core.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs +14 -3
- package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs +17 -3
- package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs +6 -3
- package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs +2 -2
- package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-divider.mjs +112 -0
- package/fesm2022/rt-tools-ui-kit-v2-divider.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-draggable-tree.mjs +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-draggable-tree.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-drawer.mjs +854 -0
- package/fesm2022/rt-tools-ui-kit-v2-drawer.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-dynamic-list.mjs +16 -5
- package/fesm2022/rt-tools-ui-kit-v2-dynamic-list.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs +580 -65
- package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-expansion-panel.mjs +203 -15
- package/fesm2022/rt-tools-ui-kit-v2-expansion-panel.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-field.mjs +40 -8
- package/fesm2022/rt-tools-ui-kit-v2-field.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-filter-control.mjs +7 -3
- package/fesm2022/rt-tools-ui-kit-v2-filter-control.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-form-control.mjs +53 -2
- package/fesm2022/rt-tools-ui-kit-v2-form-control.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-hybrid-tree-selector.mjs +14 -4
- package/fesm2022/rt-tools-ui-kit-v2-hybrid-tree-selector.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-hybrid-tree.mjs +6 -3
- package/fesm2022/rt-tools-ui-kit-v2-hybrid-tree.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs +16 -5
- package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-image-upload.mjs +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-image-upload.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-inline-edit.mjs +14 -4
- package/fesm2022/rt-tools-ui-kit-v2-inline-edit.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs +3 -2
- package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-input.mjs +207 -7
- package/fesm2022/rt-tools-ui-kit-v2-input.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-menu.mjs +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-menu.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs +3 -2
- package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs +2 -0
- package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-pagination.mjs +3 -2
- package/fesm2022/rt-tools-ui-kit-v2-pagination.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-profile-menu.mjs +3 -2
- package/fesm2022/rt-tools-ui-kit-v2-profile-menu.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-progress-bar.mjs +171 -0
- package/fesm2022/rt-tools-ui-kit-v2-progress-bar.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-radio-button.mjs +176 -6
- package/fesm2022/rt-tools-ui-kit-v2-radio-button.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +2 -1
- package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-select.mjs +142 -23
- package/fesm2022/rt-tools-ui-kit-v2-select.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs +22 -9
- package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-speed-menu.mjs +3 -2
- package/fesm2022/rt-tools-ui-kit-v2-speed-menu.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-stepper.mjs +105 -8
- package/fesm2022/rt-tools-ui-kit-v2-stepper.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-table.mjs +13 -2
- package/fesm2022/rt-tools-ui-kit-v2-table.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs +654 -43
- package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-tag.mjs +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-tag.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-textarea.mjs +45 -7
- package/fesm2022/rt-tools-ui-kit-v2-textarea.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-theme-toggle.mjs +2 -2
- package/fesm2022/rt-tools-ui-kit-v2-theme-toggle.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs +11 -2
- package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-toast.mjs +152 -11
- package/fesm2022/rt-tools-ui-kit-v2-toast.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs +199 -17
- package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-tooltip.mjs +35 -5
- package/fesm2022/rt-tools-ui-kit-v2-tooltip.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-tree-selector.mjs +14 -4
- package/fesm2022/rt-tools-ui-kit-v2-tree-selector.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-tree.mjs +6 -3
- package/fesm2022/rt-tools-ui-kit-v2-tree.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs +21 -6
- package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2.mjs +4 -0
- package/package.json +17 -1
- package/src/assets/icons/volume-off.svg +2 -1
- package/src/lib/components/autocomplete/CONTEXT.md +25 -14
- package/src/lib/components/autocomplete/rt-autocomplete.component.scss +19 -0
- package/src/lib/components/badge/CONTEXT.md +33 -0
- package/src/lib/components/badge/rt-badge.directive.scss +104 -0
- package/src/lib/components/breadcrumbs/rt-breadcrumbs.component.scss +2 -2
- package/src/lib/components/button/CONTEXT.md +5 -0
- package/src/lib/components/button/rt-button.directive.scss +3 -1
- package/src/lib/components/checkbox/CONTEXT.md +15 -8
- package/src/lib/components/color-palette/rt-color-palette.component.scss +2 -2
- package/src/lib/components/container/CONTEXT.md +23 -6
- package/src/lib/components/container/rt-container.component.scss +90 -1
- package/src/lib/components/copy-value/CONTEXT.md +6 -5
- package/src/lib/components/copy-value/rt-copy-value.component.scss +16 -0
- package/src/lib/components/date-picker/rt-date-picker.component.scss +7 -0
- package/src/lib/components/date-range/rt-date-range.component.scss +7 -0
- package/src/lib/components/divider/CONTEXT.md +21 -0
- package/src/lib/components/divider/rt-divider.component.scss +34 -0
- package/src/lib/components/drawer/CONTEXT.md +73 -0
- package/src/lib/components/drawer/rt-drawer-container.component.scss +19 -0
- package/src/lib/components/drawer/rt-drawer.component.scss +168 -0
- package/src/lib/components/drawer/rt-resize-handle.component.scss +42 -0
- package/src/lib/components/dynamic-selector/CONTEXT.md +5 -0
- package/src/lib/components/expansion-panel/CONTEXT.md +32 -8
- package/src/lib/components/expansion-panel/rt-expansion-panel.component.scss +67 -2
- package/src/lib/components/field/CONTEXT.md +43 -0
- package/src/lib/components/field/rt-field-label-inside.scss +179 -0
- package/src/lib/components/field/rt-field.component.scss +51 -2
- package/src/lib/components/icon-button/CONTEXT.md +17 -15
- package/src/lib/components/icon-button/rt-icon-button.component.scss +3 -1
- package/src/lib/components/inline-edit/rt-inline-edit.component.scss +4 -4
- package/src/lib/components/input/CONTEXT.md +45 -11
- package/src/lib/components/input/rt-input-floating-label.scss +192 -0
- package/src/lib/components/input/rt-input-icons.scss +105 -0
- package/src/lib/components/input/rt-input.component.scss +91 -13
- package/src/lib/components/input-number/CONTEXT.md +7 -0
- package/src/lib/components/input-number/rt-input-number.component.scss +58 -1
- package/src/lib/components/menu/CONTEXT.md +1 -0
- package/src/lib/components/multiselect/CONTEXT.md +2 -1
- package/src/lib/components/multiselect/rt-multiselect.component.scss +7 -0
- package/src/lib/components/pagination/CONTEXT.md +3 -0
- package/src/lib/components/pagination/rt-pagination.component.scss +7 -0
- package/src/lib/components/progress-bar/CONTEXT.md +22 -0
- package/src/lib/components/progress-bar/rt-progress-bar.component.scss +77 -0
- package/src/lib/components/radio-button/CONTEXT.md +9 -0
- package/src/lib/components/radio-button/rt-radio-group.component.scss +13 -0
- package/src/lib/components/select/CONTEXT.md +28 -0
- package/src/lib/components/select/rt-select-clear.scss +88 -0
- package/src/lib/components/select/rt-select-floating-label.scss +155 -0
- package/src/lib/components/select/rt-select-material.scss +54 -0
- package/src/lib/components/select/rt-select.component.scss +54 -16
- package/src/lib/components/side-menu/CONTEXT.md +5 -0
- package/src/lib/components/speed-menu/rt-speed-menu.component.scss +5 -5
- package/src/lib/components/stepper/CONTEXT.md +13 -5
- package/src/lib/components/stepper/rt-stepper.component.scss +93 -0
- package/src/lib/components/tabs/CONTEXT.md +61 -9
- package/src/lib/components/tabs/rt-tabs.component.scss +201 -5
- package/src/lib/components/textarea/CONTEXT.md +12 -1
- package/src/lib/components/textarea/rt-textarea.component.scss +116 -1
- package/src/lib/components/toast/CONTEXT.md +23 -0
- package/src/lib/components/toast/rt-toast.component.scss +37 -0
- package/src/lib/components/toggle-button-group/CONTEXT.md +24 -4
- package/src/lib/components/toggle-button-group/rt-toggle-button-group-chips.scss +151 -0
- package/src/lib/components/toggle-button-group/rt-toggle-button-group.component.scss +35 -0
- package/src/lib/components/tooltip/CONTEXT.md +7 -1
- package/src/lib/components/tree/rt-tree.component.scss +2 -2
- package/src/styles/_color-scheme.scss +1 -1
- package/src/styles/_density.scss +48 -0
- package/src/styles/_index.scss +8 -0
- package/src/styles/_preset-material.scss +160 -70
- package/src/styles/_primitives.scss +1 -0
- package/src/styles/_semantic-navigation.scss +117 -0
- package/src/styles/_semantic.scss +29 -98
- package/src/styles/_theme-dark.scss +8 -0
- package/styles/tokens.css +2066 -1134
- package/types/rt-tools-ui-kit-v2-autocomplete.d.ts +34 -0
- package/types/rt-tools-ui-kit-v2-badge.d.ts +71 -0
- package/types/rt-tools-ui-kit-v2-checkbox.d.ts +17 -3
- package/types/rt-tools-ui-kit-v2-container.d.ts +65 -9
- package/types/rt-tools-ui-kit-v2-copy-value.d.ts +11 -1
- package/types/rt-tools-ui-kit-v2-core.d.ts +109 -4
- package/types/rt-tools-ui-kit-v2-divider.d.ts +29 -0
- package/types/rt-tools-ui-kit-v2-drawer.d.ts +257 -0
- package/types/rt-tools-ui-kit-v2-dynamic-selector.d.ts +240 -25
- package/types/rt-tools-ui-kit-v2-expansion-panel.d.ts +87 -3
- package/types/rt-tools-ui-kit-v2-field.d.ts +18 -1
- package/types/rt-tools-ui-kit-v2-form-control.d.ts +42 -4
- package/types/rt-tools-ui-kit-v2-icon-button.d.ts +2 -1
- package/types/rt-tools-ui-kit-v2-input-number.d.ts +1 -0
- package/types/rt-tools-ui-kit-v2-input.d.ts +98 -4
- package/types/rt-tools-ui-kit-v2-progress-bar.d.ts +53 -0
- package/types/rt-tools-ui-kit-v2-radio-button.d.ts +80 -1
- package/types/rt-tools-ui-kit-v2-select.d.ts +65 -1
- package/types/rt-tools-ui-kit-v2-side-menu.d.ts +3 -0
- package/types/rt-tools-ui-kit-v2-stepper.d.ts +57 -4
- package/types/rt-tools-ui-kit-v2-tabs.d.ts +337 -8
- package/types/rt-tools-ui-kit-v2-textarea.d.ts +16 -0
- package/types/rt-tools-ui-kit-v2-toast.d.ts +38 -2
- package/types/rt-tools-ui-kit-v2-toggle-button-group.d.ts +83 -3
- package/types/rt-tools-ui-kit-v2-tooltip.d.ts +17 -2
- package/types/rt-tools-ui-kit-v2.d.ts +4 -0
- package/src/lib/components/dynamic-selector/stories/component/test-dynamic-selector-popup-frame.component.scss +0 -6
|
@@ -1,11 +1,15 @@
|
|
|
1
|
+
import { NgComponentOutlet } from "@angular/common";
|
|
1
2
|
import * as i0 from "@angular/core";
|
|
2
|
-
import { ChangeDetectionStrategy, Component, ElementRef, HostBinding, InjectionToken, ViewEncapsulation, booleanAttribute, computed, effect, inject, input, linkedSignal, numberAttribute, output, signal } from "@angular/core";
|
|
3
|
+
import { ChangeDetectionStrategy, Component, ElementRef, HostBinding, InjectionToken, Injector, ViewEncapsulation, afterNextRender, booleanAttribute, computed, effect, inject, input, linkedSignal, numberAttribute, output, signal } from "@angular/core";
|
|
3
4
|
import { BlockDirective, ElemDirective } from "@rt-tools/core";
|
|
4
|
-
import { NotificationBus, RT_KIT_LABELS, rtKitLabel } from "@rt-tools/ui-kit-v2/core";
|
|
5
|
+
import { NotificationBus, NotificationRef, RT_KIT_LABELS, rtKitLabel } from "@rt-tools/ui-kit-v2/core";
|
|
5
6
|
import { RtButtonDirective } from "@rt-tools/ui-kit-v2/button";
|
|
7
|
+
import { RtCopyValueComponent } from "@rt-tools/ui-kit-v2/copy-value";
|
|
8
|
+
import { RtProgressBarComponent } from "@rt-tools/ui-kit-v2/progress-bar";
|
|
6
9
|
import { RtIconButtonComponent } from "@rt-tools/ui-kit-v2/icon-button";
|
|
7
10
|
import { RtIconComponent } from "@rt-tools/ui-kit-v2/icon";
|
|
8
11
|
import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
|
|
12
|
+
import { EMPTY, filter, map, merge, mergeMap } from "rxjs";
|
|
9
13
|
const RT_TOASTER_GAP_PX = 14;
|
|
10
14
|
const RT_TOAST_SEVERITY_ICONS = new InjectionToken("RT_TOAST_SEVERITY_ICONS", {
|
|
11
15
|
providedIn: "root",
|
|
@@ -16,10 +20,13 @@ const RT_TOAST_SEVERITY_ICONS = new InjectionToken("RT_TOAST_SEVERITY_ICONS", {
|
|
|
16
20
|
danger: "times-circle"
|
|
17
21
|
})
|
|
18
22
|
});
|
|
23
|
+
const RT_TOAST_DATA = new InjectionToken("RT_TOAST_DATA");
|
|
19
24
|
const BEM_BLOCK$1 = "rt-toast";
|
|
20
25
|
const UNMOUNT_DELAY_MS = 200;
|
|
21
26
|
var RtToastComponent = class RtToastComponent {
|
|
22
27
|
#host;
|
|
28
|
+
#injector;
|
|
29
|
+
#componentInputs;
|
|
23
30
|
#severityIcons;
|
|
24
31
|
#mounted;
|
|
25
32
|
#removed;
|
|
@@ -38,6 +45,7 @@ var RtToastComponent = class RtToastComponent {
|
|
|
38
45
|
return {
|
|
39
46
|
[`${BEM_BLOCK$1}--severity--${this.toast().severity}`]: true,
|
|
40
47
|
[`${BEM_BLOCK$1}--filled`]: this.toast().filled === true,
|
|
48
|
+
[`${BEM_BLOCK$1}--bare`]: this.bare(),
|
|
41
49
|
[`${BEM_BLOCK$1}--y--${this.#positionY()}`]: true,
|
|
42
50
|
[`${BEM_BLOCK$1}--mounted`]: this.#mounted(),
|
|
43
51
|
[`${BEM_BLOCK$1}--removed`]: this.#removed(),
|
|
@@ -59,6 +67,14 @@ var RtToastComponent = class RtToastComponent {
|
|
|
59
67
|
}
|
|
60
68
|
constructor() {
|
|
61
69
|
this.#host = inject(ElementRef);
|
|
70
|
+
this.#injector = inject(Injector);
|
|
71
|
+
this.#componentInputs = computed(() => ({
|
|
72
|
+
data: this.toast().data,
|
|
73
|
+
ref: this.toast().ref
|
|
74
|
+
}), {
|
|
75
|
+
...ngDevMode ? { debugName: "#componentInputs" } : /* istanbul ignore next */ {},
|
|
76
|
+
equal: (left, right) => left.data === right.data && left.ref === right.ref
|
|
77
|
+
});
|
|
62
78
|
this.#severityIcons = inject(RT_TOAST_SEVERITY_ICONS);
|
|
63
79
|
this.#mounted = signal(false, ...ngDevMode ? [{ debugName: "#mounted" }] : /* istanbul ignore next */ []);
|
|
64
80
|
this.#removed = signal(false, ...ngDevMode ? [{ debugName: "#removed" }] : /* istanbul ignore next */ []);
|
|
@@ -80,7 +96,23 @@ var RtToastComponent = class RtToastComponent {
|
|
|
80
96
|
const duration = this.toast().duration;
|
|
81
97
|
return duration === void 0 ? this.duration() : duration;
|
|
82
98
|
}, ...ngDevMode ? [{ debugName: "lifetime" }] : /* istanbul ignore next */ []);
|
|
83
|
-
this.
|
|
99
|
+
this.componentInjector = computed(() => {
|
|
100
|
+
const inputs = this.#componentInputs();
|
|
101
|
+
return Injector.create({
|
|
102
|
+
providers: [{
|
|
103
|
+
provide: RT_TOAST_DATA,
|
|
104
|
+
useValue: inputs.data
|
|
105
|
+
}, {
|
|
106
|
+
provide: NotificationRef,
|
|
107
|
+
useValue: inputs.ref ?? null
|
|
108
|
+
}],
|
|
109
|
+
parent: this.#injector
|
|
110
|
+
});
|
|
111
|
+
}, ...ngDevMode ? [{ debugName: "componentInjector" }] : /* istanbul ignore next */ []);
|
|
112
|
+
this.progressValue = computed(() => this.toast().progressValue ?? null, ...ngDevMode ? [{ debugName: "progressValue" }] : /* istanbul ignore next */ []);
|
|
113
|
+
this.detailsOpen = signal(false, ...ngDevMode ? [{ debugName: "detailsOpen" }] : /* istanbul ignore next */ []);
|
|
114
|
+
this.bare = computed(() => this.toast().bare === true, ...ngDevMode ? [{ debugName: "bare" }] : /* istanbul ignore next */ []);
|
|
115
|
+
this.showProgress = computed(() => !this.bare() && this.toast().progress === true && this.lifetime() !== null, ...ngDevMode ? [{ debugName: "showProgress" }] : /* istanbul ignore next */ []);
|
|
84
116
|
this.paused = computed(() => this.expanded() || this.interacting(), ...ngDevMode ? [{ debugName: "paused" }] : /* istanbul ignore next */ []);
|
|
85
117
|
this.toast = input.required(...ngDevMode ? [{ debugName: "toast" }] : /* istanbul ignore next */ []);
|
|
86
118
|
this.index = input.required(...ngDevMode ? [{ debugName: "index" }] : /* istanbul ignore next */ []);
|
|
@@ -113,6 +145,15 @@ var RtToastComponent = class RtToastComponent {
|
|
|
113
145
|
effect(() => {
|
|
114
146
|
if (this.#mounted() && this.toast().replaced === true) this.#deleteToast("replaced");
|
|
115
147
|
});
|
|
148
|
+
effect(() => {
|
|
149
|
+
if (this.#mounted() && this.toast().dismissRequested === true) this.#deleteToast("dismiss");
|
|
150
|
+
});
|
|
151
|
+
effect(() => {
|
|
152
|
+
const toast = this.toast();
|
|
153
|
+
this.detailsOpen();
|
|
154
|
+
if (!this.#mounted() || toast.replaced === true) return;
|
|
155
|
+
afterNextRender(() => this.#remeasure(), { injector: this.#injector });
|
|
156
|
+
});
|
|
116
157
|
}
|
|
117
158
|
ngAfterViewInit() {
|
|
118
159
|
this.#remainingTimeMs = this.lifetime() ?? 0;
|
|
@@ -127,6 +168,7 @@ var RtToastComponent = class RtToastComponent {
|
|
|
127
168
|
ngOnDestroy() {
|
|
128
169
|
clearTimeout(this.#timeoutId);
|
|
129
170
|
clearTimeout(this.#unmountTimeoutId);
|
|
171
|
+
this.toast().ref?.markClosed("destroyed");
|
|
130
172
|
}
|
|
131
173
|
onAction() {
|
|
132
174
|
this.toast().action?.handler();
|
|
@@ -139,14 +181,32 @@ var RtToastComponent = class RtToastComponent {
|
|
|
139
181
|
onClose() {
|
|
140
182
|
this.#deleteToast("close");
|
|
141
183
|
}
|
|
184
|
+
toggleDetails() {
|
|
185
|
+
this.detailsOpen.update((open) => !open);
|
|
186
|
+
}
|
|
142
187
|
#deleteToast(reason) {
|
|
143
188
|
if (this.#removed()) return;
|
|
144
189
|
this.#removed.set(true);
|
|
145
|
-
if (reason !== null) this.toast().onDismiss?.(reason);
|
|
190
|
+
if (reason !== null && reason !== "action" && reason !== "dismiss" && reason !== "destroyed") this.toast().onDismiss?.(reason);
|
|
191
|
+
this.toast().ref?.markClosed(reason ?? "action");
|
|
146
192
|
this.#offsetBeforeRemove.set(this.#offset());
|
|
147
193
|
this.heightRemoved.emit(this.toast().id);
|
|
148
194
|
this.#unmountTimeoutId = setTimeout(() => this.dismissed.emit(this.toast().id), UNMOUNT_DELAY_MS);
|
|
149
195
|
}
|
|
196
|
+
#remeasure() {
|
|
197
|
+
if (this.#removed()) return;
|
|
198
|
+
const host = this.#host.nativeElement;
|
|
199
|
+
host.style.height = "auto";
|
|
200
|
+
const height = host.offsetHeight;
|
|
201
|
+
host.style.height = "";
|
|
202
|
+
if (height !== this.#initialHeight()) {
|
|
203
|
+
this.#initialHeight.set(height);
|
|
204
|
+
this.heightAdded.emit({
|
|
205
|
+
toastId: this.toast().id,
|
|
206
|
+
height
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
}
|
|
150
210
|
#startTimer() {
|
|
151
211
|
this.#closeTimerStartedAt = Date.now();
|
|
152
212
|
this.#timeoutId = setTimeout(() => this.#deleteToast("timeout"), this.#remainingTimeMs);
|
|
@@ -264,9 +324,23 @@ var RtToastComponent = class RtToastComponent {
|
|
|
264
324
|
classAttribute: "rt-toast"
|
|
265
325
|
},
|
|
266
326
|
ngImport: i0,
|
|
267
|
-
template: "<ng-container rtBlock=\"rt-toast\">\n @if (icon(); as icon) {\n <rt-icon rtElem=\"icon\" qa-dataid=\"toast-icon\" size=\"sm\" [name]=\"icon\" />\n }\n <div rtElem=\"content\" qa-dataid=\"toast-content\">\n @if (toast().meta; as meta) {\n <span rtElem=\"meta\" qa-dataid=\"toast-meta\">{{ meta }}</span>\n }\n <span rtElem=\"message\" qa-dataid=\"toast-message\">{{ toast().message }}</span>\n
|
|
268
|
-
styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-toast{--rt-toast-radius: var(--rt-radius-md);--rt-toast-border-width: var(--rt-border-width-thin);--rt-toast-shadow: var(--rt-shadow-card);--rt-toast-enter-duration: var(--rt-duration-slow);--rt-toast-shadow-duration: var(--rt-duration-base);--rt-toast-leave-duration: var(--rt-duration-slower);--rt-toast-fade-duration: var(--rt-duration-fast);--rt-toast-severity-color: var(--rt-color-state-info);--y: translateY(100%);--lift-amount: calc(var(--lift) * var(--gap));position:absolute;z-index:var(--z-index);display:flex;width:100%;box-sizing:border-box;align-items:center;padding:var(--rt-space-4);border:var(--rt-toast-border-width) solid var(--rt-toast-border-color, var(--rt-color-border-subtle));border-radius:var(--rt-toast-radius);background:var(--rt-toast-bg, var(--rt-color-bg-surface));box-shadow:var(--rt-toast-shadow);color:var(--rt-toast-color, var(--rt-color-text-primary));font-size:var(--rt-text-sm);font-weight:var(--rt-font-weight-medium);gap:var(--rt-space-2);line-height:var(--rt-leading-normal);opacity:0;outline:none;overflow-wrap:anywhere;touch-action:none;transform:var(--y);transition:transform var(--rt-toast-enter-duration),opacity var(--rt-toast-enter-duration),height var(--rt-toast-enter-duration),box-shadow var(--rt-toast-shadow-duration)}.rt-toast:after{position:absolute;bottom:100%;left:0;width:100%;height:calc(var(--gap) + 1px);content:\"\"}.rt-toast>*{transition:opacity var(--rt-toast-enter-duration)}.rt-toast--y--top{--y: translateY(-100%);--lift: 1;top:0}.rt-toast--y--bottom{--y: translateY(100%);--lift: -1;bottom:0}.rt-toast--severity--success{--rt-toast-severity-color: var(--rt-color-state-success)}.rt-toast--severity--warning{--rt-toast-severity-color: var(--rt-color-state-warning)}.rt-toast--severity--danger{--rt-toast-severity-color: var(--rt-color-state-danger)}.rt-toast--filled .rt-toast__description{color:inherit}.rt-toast--filled .rt-toast__icon{color:currentcolor}.rt-toast--filled.rt-toast--severity--info{border-color:var(--rt-toast-filled-info-border-color, var(--rt-color-state-info-bg));background:var(--rt-toast-filled-info-bg, var(--rt-color-state-info-bg));color:var(--rt-toast-filled-info-color, var(--rt-color-state-info))}.rt-toast--filled.rt-toast--severity--success{border-color:var(--rt-toast-filled-success-border-color, var(--rt-color-state-success-bg));background:var(--rt-toast-filled-success-bg, var(--rt-color-state-success-bg));color:var(--rt-toast-filled-success-color, var(--rt-color-state-success))}.rt-toast--filled.rt-toast--severity--warning{border-color:var(--rt-toast-filled-warning-border-color, var(--rt-color-state-warning-bg));background:var(--rt-toast-filled-warning-bg, var(--rt-color-state-warning-bg));color:var(--rt-toast-filled-warning-color, var(--rt-color-state-warning))}.rt-toast--filled.rt-toast--severity--danger{border-color:var(--rt-toast-filled-danger-border-color, var(--rt-color-state-danger-bg));background:var(--rt-toast-filled-danger-bg, var(--rt-color-state-danger-bg));color:var(--rt-toast-filled-danger-color, var(--rt-color-state-danger))}.rt-toast--mounted{--y: translateY(0);opacity:1}.rt-toast:not(.rt-toast--expanded,.rt-toast--front){--scale: var(--toasts-before) * .05 + 1;--y: translateY(calc(var(--lift-amount) * var(--toasts-before))) scale(calc(-1 * var(--scale)));height:var(--front-toast-height)}.rt-toast:not(.rt-toast--expanded,.rt-toast--front)>*{opacity:0}.rt-toast--hidden{opacity:0;pointer-events:none}.rt-toast--mounted.rt-toast--expanded{--y: translateY(calc(var(--lift) * var(--offset)));height:var(--initial-height)}.rt-toast--removed.rt-toast--front{--y: translateY(calc(var(--lift) * -100%));opacity:0}.rt-toast--removed.rt-toast--expanded:not(.rt-toast--front){--y: translateY(calc(var(--lift) * var(--offset) + var(--lift) * -100%));opacity:0}.rt-toast--removed:not(.rt-toast--front,.rt-toast--expanded){--y: translateY(40%);opacity:0;transition:transform var(--rt-toast-leave-duration),opacity var(--rt-toast-shadow-duration)}.rt-toast--removed:not(.rt-toast--front):before{position:absolute;content:\"\";inset:0;transform:scaleY(2)}.rt-toast__icon{flex-shrink:0;color:var(--rt-toast-icon-color, var(--rt-toast-severity-color))}.rt-toast__progress{position:absolute;bottom:0;animation:rt-toast-progress var(--lifetime) linear forwards;background:var(--rt-toast-progress-color, var(--rt-toast-severity-color));block-size:var(--rt-toast-progress-height, var(--rt-space-0-5));border-end-end-radius:var(--rt-toast-radius);border-end-start-radius:var(--rt-toast-radius);inset-inline:0;transform-origin:left center}.rt-toast--paused .rt-toast__progress{animation-play-state:paused}.rt-toast__content{display:flex;min-width:0;flex:1 1 auto;flex-direction:column;gap:var(--rt-space-0-5)}.rt-toast__description,.rt-toast__meta{color:var(--rt-color-text-muted);font-size:var(--rt-text-xs);font-weight:var(--rt-font-weight-regular)}.rt-toast__actions{display:flex;flex-wrap:wrap;align-items:center;gap:var(--rt-space-2);margin-block-start:var(--rt-space-1)}.rt-toast .rt-toast__action{align-self:flex-start}.rt-toast .rt-toast__action:not(.rt-button--text){--rt-btn-bg: var(--rt-toast-action-color, var(--rt-color-action-primary));--rt-btn-bg-hover: var(--rt-toast-action-color, var(--rt-color-action-primary-hover));--rt-btn-bg-active: var(--rt-toast-action-color, var(--rt-color-action-primary-active))}.rt-toast .rt-toast__close{--rt-icon-button-color: var(--rt-toast-close-color, var(--rt-color-text-primary));flex-shrink:0;align-self:flex-start;margin-inline-start:auto;opacity:0;transition:opacity var(--rt-toast-fade-duration)}.rt-toast:hover .rt-toast__close,.rt-toast .rt-toast__close:focus-visible{opacity:1}@media(prefers-reduced-motion){.rt-toast{transition:none}.rt-toast>*{transition:none}}@keyframes rt-toast-progress{0%{transform:scaleX(1)}to{transform:scaleX(0)}}}\n"],
|
|
327
|
+
template: "<ng-container rtBlock=\"rt-toast\">\n @if (!bare() && icon(); as icon) {\n <rt-icon rtElem=\"icon\" qa-dataid=\"toast-icon\" size=\"sm\" [name]=\"icon\" />\n }\n <div rtElem=\"content\" qa-dataid=\"toast-content\">\n @if (toast().meta; as meta) {\n <span rtElem=\"meta\" qa-dataid=\"toast-meta\">{{ meta }}</span>\n }\n @if (toast().component; as component) {\n <!-- Свой компонент встаёт на место сообщения; сообщение остаётся именем для чтения с экрана. -->\n @if (toast().message) {\n <span rtElem=\"sr-message\">{{ toast().message }}</span>\n }\n <div rtElem=\"custom\" qa-dataid=\"toast-custom\">\n <ng-container [ngComponentOutlet]=\"component\" [ngComponentOutletInjector]=\"componentInjector()\" />\n </div>\n } @else {\n <span rtElem=\"message\" qa-dataid=\"toast-message\">{{ toast().message }}</span>\n @if (toast().description; as description) {\n <span rtElem=\"description\" qa-dataid=\"toast-description\">{{ description }}</span>\n }\n }\n @if (progressValue() !== null) {\n <rt-progress-bar rtElem=\"value\" qa-dataid=\"toast-progress-value\" [value]=\"progressValue() ?? 0\" [ariaLabel]=\"toast().message\" />\n }\n @if (toast().details; as details) {\n <button\n rtButton\n rtElem=\"details-toggle\"\n qa-dataid=\"toast-details-toggle\"\n size=\"sm\"\n theme=\"secondary\"\n appearance=\"text\"\n type=\"button\"\n [attr.aria-expanded]=\"detailsOpen()\"\n (click)=\"toggleDetails()\">\n {{ detailsOpen() ? t().uiHide : t().uiDetails }}\n </button>\n @if (detailsOpen()) {\n <rt-copy-value rtElem=\"details\" qa-dataid=\"toast-details\" wrap [value]=\"details\" />\n }\n }\n @if (toast().action || toast().secondaryAction) {\n <div rtElem=\"actions\">\n @if (toast().action; as action) {\n <button rtButton rtElem=\"action\" qa-dataid=\"toast-action\" size=\"sm\" type=\"button\" (click)=\"onAction()\">\n {{ action.label }}\n </button>\n }\n @if (toast().secondaryAction; as secondaryAction) {\n <button\n rtButton\n rtElem=\"action\"\n qa-dataid=\"toast-secondary-action\"\n size=\"sm\"\n theme=\"secondary\"\n appearance=\"text\"\n type=\"button\"\n (click)=\"onSecondaryAction()\">\n {{ secondaryAction.label }}\n </button>\n }\n </div>\n }\n </div>\n @if (!bare()) {\n <rt-icon-button\n rtElem=\"close\"\n qa-dataid=\"toast-close\"\n icon=\"ico-close\"\n variant=\"ghost\"\n size=\"sm\"\n [ariaLabel]=\"t().uiClose\"\n (clicked)=\"onClose()\" />\n }\n @if (showProgress()) {\n <span rtElem=\"progress\" qa-dataid=\"toast-progress\" aria-hidden=\"true\"></span>\n }\n</ng-container>\n",
|
|
328
|
+
styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-toast{--rt-toast-radius: var(--rt-radius-md);--rt-toast-border-width: var(--rt-border-width-thin);--rt-toast-shadow: var(--rt-shadow-card);--rt-toast-enter-duration: var(--rt-duration-slow);--rt-toast-shadow-duration: var(--rt-duration-base);--rt-toast-leave-duration: var(--rt-duration-slower);--rt-toast-fade-duration: var(--rt-duration-fast);--rt-toast-severity-color: var(--rt-color-state-info);--y: translateY(100%);--lift-amount: calc(var(--lift) * var(--gap));position:absolute;z-index:var(--z-index);display:flex;width:100%;box-sizing:border-box;align-items:center;padding:var(--rt-space-4);border:var(--rt-toast-border-width) solid var(--rt-toast-border-color, var(--rt-color-border-subtle));border-radius:var(--rt-toast-radius);background:var(--rt-toast-bg, var(--rt-color-bg-surface));box-shadow:var(--rt-toast-shadow);color:var(--rt-toast-color, var(--rt-color-text-primary));font-size:var(--rt-text-sm);font-weight:var(--rt-font-weight-medium);gap:var(--rt-space-2);line-height:var(--rt-leading-normal);opacity:0;outline:none;overflow-wrap:anywhere;touch-action:none;transform:var(--y);transition:transform var(--rt-toast-enter-duration),opacity var(--rt-toast-enter-duration),height var(--rt-toast-enter-duration),box-shadow var(--rt-toast-shadow-duration)}.rt-toast:after{position:absolute;bottom:100%;left:0;width:100%;height:calc(var(--gap) + 1px);content:\"\"}.rt-toast>*{transition:opacity var(--rt-toast-enter-duration)}.rt-toast--y--top{--y: translateY(-100%);--lift: 1;top:0}.rt-toast--y--bottom{--y: translateY(100%);--lift: -1;bottom:0}.rt-toast--severity--success{--rt-toast-severity-color: var(--rt-color-state-success)}.rt-toast--severity--warning{--rt-toast-severity-color: var(--rt-color-state-warning)}.rt-toast--severity--danger{--rt-toast-severity-color: var(--rt-color-state-danger)}.rt-toast--filled .rt-toast__description{color:inherit}.rt-toast--filled .rt-toast__icon{color:currentcolor}.rt-toast--filled.rt-toast--severity--info{border-color:var(--rt-toast-filled-info-border-color, var(--rt-color-state-info-bg));background:var(--rt-toast-filled-info-bg, var(--rt-color-state-info-bg));color:var(--rt-toast-filled-info-color, var(--rt-color-state-info))}.rt-toast--filled.rt-toast--severity--success{border-color:var(--rt-toast-filled-success-border-color, var(--rt-color-state-success-bg));background:var(--rt-toast-filled-success-bg, var(--rt-color-state-success-bg));color:var(--rt-toast-filled-success-color, var(--rt-color-state-success))}.rt-toast--filled.rt-toast--severity--warning{border-color:var(--rt-toast-filled-warning-border-color, var(--rt-color-state-warning-bg));background:var(--rt-toast-filled-warning-bg, var(--rt-color-state-warning-bg));color:var(--rt-toast-filled-warning-color, var(--rt-color-state-warning))}.rt-toast--filled.rt-toast--severity--danger{border-color:var(--rt-toast-filled-danger-border-color, var(--rt-color-state-danger-bg));background:var(--rt-toast-filled-danger-bg, var(--rt-color-state-danger-bg));color:var(--rt-toast-filled-danger-color, var(--rt-color-state-danger))}.rt-toast.rt-toast--bare{--rt-toast-radius: 0;--rt-toast-border-width: 0;--rt-toast-shadow: none;padding:0;background:transparent}.rt-toast--mounted{--y: translateY(0);opacity:1}.rt-toast:not(.rt-toast--expanded,.rt-toast--front){--scale: var(--toasts-before) * .05 + 1;--y: translateY(calc(var(--lift-amount) * var(--toasts-before))) scale(calc(-1 * var(--scale)));height:var(--front-toast-height)}.rt-toast:not(.rt-toast--expanded,.rt-toast--front)>*{opacity:0}.rt-toast--hidden{opacity:0;pointer-events:none}.rt-toast--mounted.rt-toast--expanded{--y: translateY(calc(var(--lift) * var(--offset)));height:var(--initial-height)}.rt-toast--removed.rt-toast--front{--y: translateY(calc(var(--lift) * -100%));opacity:0}.rt-toast--removed.rt-toast--expanded:not(.rt-toast--front){--y: translateY(calc(var(--lift) * var(--offset) + var(--lift) * -100%));opacity:0}.rt-toast--removed:not(.rt-toast--front,.rt-toast--expanded){--y: translateY(40%);opacity:0;transition:transform var(--rt-toast-leave-duration),opacity var(--rt-toast-shadow-duration)}.rt-toast--removed:not(.rt-toast--front):before{position:absolute;content:\"\";inset:0;transform:scaleY(2)}.rt-toast__icon{flex-shrink:0;color:var(--rt-toast-icon-color, var(--rt-toast-severity-color))}.rt-toast__progress{position:absolute;bottom:0;animation:rt-toast-progress var(--lifetime) linear forwards;background:var(--rt-toast-progress-color, var(--rt-toast-severity-color));block-size:var(--rt-toast-progress-height, var(--rt-space-0-5));border-end-end-radius:var(--rt-toast-radius);border-end-start-radius:var(--rt-toast-radius);inset-inline:0;transform-origin:left center}.rt-toast--paused .rt-toast__progress{animation-play-state:paused}.rt-toast__content{display:flex;min-width:0;flex:1 1 auto;flex-direction:column;gap:var(--rt-space-0-5)}.rt-toast__description,.rt-toast__meta{color:var(--rt-color-text-muted);font-size:var(--rt-text-xs);font-weight:var(--rt-font-weight-regular)}.rt-toast__sr-message{position:absolute;overflow:hidden;width:1px;height:1px;clip-path:inset(50%);white-space:nowrap}.rt-toast__custom{min-width:0}.rt-toast__value{margin-block:var(--rt-space-1)}.rt-toast .rt-toast__details-toggle{align-self:flex-start}.rt-toast__details{display:flex}.rt-toast__actions{display:flex;flex-wrap:wrap;align-items:center;gap:var(--rt-space-2);margin-block-start:var(--rt-space-1)}.rt-toast .rt-toast__action{align-self:flex-start}.rt-toast .rt-toast__action:not(.rt-button--text){--rt-btn-bg: var(--rt-toast-action-color, var(--rt-color-action-primary));--rt-btn-bg-hover: var(--rt-toast-action-color, var(--rt-color-action-primary-hover));--rt-btn-bg-active: var(--rt-toast-action-color, var(--rt-color-action-primary-active))}.rt-toast .rt-toast__close{--rt-icon-button-color: var(--rt-toast-close-color, var(--rt-color-text-primary));flex-shrink:0;align-self:flex-start;margin-inline-start:auto;opacity:0;transition:opacity var(--rt-toast-fade-duration)}.rt-toast:hover .rt-toast__close,.rt-toast .rt-toast__close:focus-visible{opacity:1}@media(prefers-reduced-motion){.rt-toast{transition:none}.rt-toast>*{transition:none}}@keyframes rt-toast-progress{0%{transform:scaleX(1)}to{transform:scaleX(0)}}}\n"],
|
|
269
329
|
dependencies: [
|
|
330
|
+
{
|
|
331
|
+
kind: "directive",
|
|
332
|
+
type: NgComponentOutlet,
|
|
333
|
+
selector: "[ngComponentOutlet]",
|
|
334
|
+
inputs: [
|
|
335
|
+
"ngComponentOutlet",
|
|
336
|
+
"ngComponentOutletInputs",
|
|
337
|
+
"ngComponentOutletInjector",
|
|
338
|
+
"ngComponentOutletEnvironmentInjector",
|
|
339
|
+
"ngComponentOutletContent",
|
|
340
|
+
"ngComponentOutletNgModule"
|
|
341
|
+
],
|
|
342
|
+
exportAs: ["ngComponentOutlet"]
|
|
343
|
+
},
|
|
270
344
|
{
|
|
271
345
|
kind: "directive",
|
|
272
346
|
type: RtButtonDirective,
|
|
@@ -284,6 +358,18 @@ var RtToastComponent = class RtToastComponent {
|
|
|
284
358
|
"pressed"
|
|
285
359
|
]
|
|
286
360
|
},
|
|
361
|
+
{
|
|
362
|
+
kind: "component",
|
|
363
|
+
type: RtCopyValueComponent,
|
|
364
|
+
selector: "rt-copy-value",
|
|
365
|
+
inputs: [
|
|
366
|
+
"value",
|
|
367
|
+
"label",
|
|
368
|
+
"copyLabel",
|
|
369
|
+
"wrap"
|
|
370
|
+
],
|
|
371
|
+
outputs: ["copiedValue"]
|
|
372
|
+
},
|
|
287
373
|
{
|
|
288
374
|
kind: "component",
|
|
289
375
|
type: RtIconComponent,
|
|
@@ -324,6 +410,17 @@ var RtToastComponent = class RtToastComponent {
|
|
|
324
410
|
],
|
|
325
411
|
outputs: ["clicked"]
|
|
326
412
|
},
|
|
413
|
+
{
|
|
414
|
+
kind: "component",
|
|
415
|
+
type: RtProgressBarComponent,
|
|
416
|
+
selector: "rt-progress-bar",
|
|
417
|
+
inputs: [
|
|
418
|
+
"mode",
|
|
419
|
+
"value",
|
|
420
|
+
"color",
|
|
421
|
+
"ariaLabel"
|
|
422
|
+
]
|
|
423
|
+
},
|
|
327
424
|
{
|
|
328
425
|
kind: "directive",
|
|
329
426
|
type: BlockDirective,
|
|
@@ -354,9 +451,12 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
354
451
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
355
452
|
encapsulation: ViewEncapsulation.None,
|
|
356
453
|
imports: [
|
|
454
|
+
NgComponentOutlet,
|
|
357
455
|
RtButtonDirective,
|
|
456
|
+
RtCopyValueComponent,
|
|
358
457
|
RtIconComponent,
|
|
359
458
|
RtIconButtonComponent,
|
|
459
|
+
RtProgressBarComponent,
|
|
360
460
|
BlockDirective,
|
|
361
461
|
ElemDirective
|
|
362
462
|
],
|
|
@@ -365,8 +465,8 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
365
465
|
role: "status",
|
|
366
466
|
"aria-atomic": "true"
|
|
367
467
|
},
|
|
368
|
-
template: "<ng-container rtBlock=\"rt-toast\">\n @if (icon(); as icon) {\n <rt-icon rtElem=\"icon\" qa-dataid=\"toast-icon\" size=\"sm\" [name]=\"icon\" />\n }\n <div rtElem=\"content\" qa-dataid=\"toast-content\">\n @if (toast().meta; as meta) {\n <span rtElem=\"meta\" qa-dataid=\"toast-meta\">{{ meta }}</span>\n }\n <span rtElem=\"message\" qa-dataid=\"toast-message\">{{ toast().message }}</span>\n
|
|
369
|
-
styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-toast{--rt-toast-radius: var(--rt-radius-md);--rt-toast-border-width: var(--rt-border-width-thin);--rt-toast-shadow: var(--rt-shadow-card);--rt-toast-enter-duration: var(--rt-duration-slow);--rt-toast-shadow-duration: var(--rt-duration-base);--rt-toast-leave-duration: var(--rt-duration-slower);--rt-toast-fade-duration: var(--rt-duration-fast);--rt-toast-severity-color: var(--rt-color-state-info);--y: translateY(100%);--lift-amount: calc(var(--lift) * var(--gap));position:absolute;z-index:var(--z-index);display:flex;width:100%;box-sizing:border-box;align-items:center;padding:var(--rt-space-4);border:var(--rt-toast-border-width) solid var(--rt-toast-border-color, var(--rt-color-border-subtle));border-radius:var(--rt-toast-radius);background:var(--rt-toast-bg, var(--rt-color-bg-surface));box-shadow:var(--rt-toast-shadow);color:var(--rt-toast-color, var(--rt-color-text-primary));font-size:var(--rt-text-sm);font-weight:var(--rt-font-weight-medium);gap:var(--rt-space-2);line-height:var(--rt-leading-normal);opacity:0;outline:none;overflow-wrap:anywhere;touch-action:none;transform:var(--y);transition:transform var(--rt-toast-enter-duration),opacity var(--rt-toast-enter-duration),height var(--rt-toast-enter-duration),box-shadow var(--rt-toast-shadow-duration)}.rt-toast:after{position:absolute;bottom:100%;left:0;width:100%;height:calc(var(--gap) + 1px);content:\"\"}.rt-toast>*{transition:opacity var(--rt-toast-enter-duration)}.rt-toast--y--top{--y: translateY(-100%);--lift: 1;top:0}.rt-toast--y--bottom{--y: translateY(100%);--lift: -1;bottom:0}.rt-toast--severity--success{--rt-toast-severity-color: var(--rt-color-state-success)}.rt-toast--severity--warning{--rt-toast-severity-color: var(--rt-color-state-warning)}.rt-toast--severity--danger{--rt-toast-severity-color: var(--rt-color-state-danger)}.rt-toast--filled .rt-toast__description{color:inherit}.rt-toast--filled .rt-toast__icon{color:currentcolor}.rt-toast--filled.rt-toast--severity--info{border-color:var(--rt-toast-filled-info-border-color, var(--rt-color-state-info-bg));background:var(--rt-toast-filled-info-bg, var(--rt-color-state-info-bg));color:var(--rt-toast-filled-info-color, var(--rt-color-state-info))}.rt-toast--filled.rt-toast--severity--success{border-color:var(--rt-toast-filled-success-border-color, var(--rt-color-state-success-bg));background:var(--rt-toast-filled-success-bg, var(--rt-color-state-success-bg));color:var(--rt-toast-filled-success-color, var(--rt-color-state-success))}.rt-toast--filled.rt-toast--severity--warning{border-color:var(--rt-toast-filled-warning-border-color, var(--rt-color-state-warning-bg));background:var(--rt-toast-filled-warning-bg, var(--rt-color-state-warning-bg));color:var(--rt-toast-filled-warning-color, var(--rt-color-state-warning))}.rt-toast--filled.rt-toast--severity--danger{border-color:var(--rt-toast-filled-danger-border-color, var(--rt-color-state-danger-bg));background:var(--rt-toast-filled-danger-bg, var(--rt-color-state-danger-bg));color:var(--rt-toast-filled-danger-color, var(--rt-color-state-danger))}.rt-toast--mounted{--y: translateY(0);opacity:1}.rt-toast:not(.rt-toast--expanded,.rt-toast--front){--scale: var(--toasts-before) * .05 + 1;--y: translateY(calc(var(--lift-amount) * var(--toasts-before))) scale(calc(-1 * var(--scale)));height:var(--front-toast-height)}.rt-toast:not(.rt-toast--expanded,.rt-toast--front)>*{opacity:0}.rt-toast--hidden{opacity:0;pointer-events:none}.rt-toast--mounted.rt-toast--expanded{--y: translateY(calc(var(--lift) * var(--offset)));height:var(--initial-height)}.rt-toast--removed.rt-toast--front{--y: translateY(calc(var(--lift) * -100%));opacity:0}.rt-toast--removed.rt-toast--expanded:not(.rt-toast--front){--y: translateY(calc(var(--lift) * var(--offset) + var(--lift) * -100%));opacity:0}.rt-toast--removed:not(.rt-toast--front,.rt-toast--expanded){--y: translateY(40%);opacity:0;transition:transform var(--rt-toast-leave-duration),opacity var(--rt-toast-shadow-duration)}.rt-toast--removed:not(.rt-toast--front):before{position:absolute;content:\"\";inset:0;transform:scaleY(2)}.rt-toast__icon{flex-shrink:0;color:var(--rt-toast-icon-color, var(--rt-toast-severity-color))}.rt-toast__progress{position:absolute;bottom:0;animation:rt-toast-progress var(--lifetime) linear forwards;background:var(--rt-toast-progress-color, var(--rt-toast-severity-color));block-size:var(--rt-toast-progress-height, var(--rt-space-0-5));border-end-end-radius:var(--rt-toast-radius);border-end-start-radius:var(--rt-toast-radius);inset-inline:0;transform-origin:left center}.rt-toast--paused .rt-toast__progress{animation-play-state:paused}.rt-toast__content{display:flex;min-width:0;flex:1 1 auto;flex-direction:column;gap:var(--rt-space-0-5)}.rt-toast__description,.rt-toast__meta{color:var(--rt-color-text-muted);font-size:var(--rt-text-xs);font-weight:var(--rt-font-weight-regular)}.rt-toast__actions{display:flex;flex-wrap:wrap;align-items:center;gap:var(--rt-space-2);margin-block-start:var(--rt-space-1)}.rt-toast .rt-toast__action{align-self:flex-start}.rt-toast .rt-toast__action:not(.rt-button--text){--rt-btn-bg: var(--rt-toast-action-color, var(--rt-color-action-primary));--rt-btn-bg-hover: var(--rt-toast-action-color, var(--rt-color-action-primary-hover));--rt-btn-bg-active: var(--rt-toast-action-color, var(--rt-color-action-primary-active))}.rt-toast .rt-toast__close{--rt-icon-button-color: var(--rt-toast-close-color, var(--rt-color-text-primary));flex-shrink:0;align-self:flex-start;margin-inline-start:auto;opacity:0;transition:opacity var(--rt-toast-fade-duration)}.rt-toast:hover .rt-toast__close,.rt-toast .rt-toast__close:focus-visible{opacity:1}@media(prefers-reduced-motion){.rt-toast{transition:none}.rt-toast>*{transition:none}}@keyframes rt-toast-progress{0%{transform:scaleX(1)}to{transform:scaleX(0)}}}\n"]
|
|
468
|
+
template: "<ng-container rtBlock=\"rt-toast\">\n @if (!bare() && icon(); as icon) {\n <rt-icon rtElem=\"icon\" qa-dataid=\"toast-icon\" size=\"sm\" [name]=\"icon\" />\n }\n <div rtElem=\"content\" qa-dataid=\"toast-content\">\n @if (toast().meta; as meta) {\n <span rtElem=\"meta\" qa-dataid=\"toast-meta\">{{ meta }}</span>\n }\n @if (toast().component; as component) {\n <!-- Свой компонент встаёт на место сообщения; сообщение остаётся именем для чтения с экрана. -->\n @if (toast().message) {\n <span rtElem=\"sr-message\">{{ toast().message }}</span>\n }\n <div rtElem=\"custom\" qa-dataid=\"toast-custom\">\n <ng-container [ngComponentOutlet]=\"component\" [ngComponentOutletInjector]=\"componentInjector()\" />\n </div>\n } @else {\n <span rtElem=\"message\" qa-dataid=\"toast-message\">{{ toast().message }}</span>\n @if (toast().description; as description) {\n <span rtElem=\"description\" qa-dataid=\"toast-description\">{{ description }}</span>\n }\n }\n @if (progressValue() !== null) {\n <rt-progress-bar rtElem=\"value\" qa-dataid=\"toast-progress-value\" [value]=\"progressValue() ?? 0\" [ariaLabel]=\"toast().message\" />\n }\n @if (toast().details; as details) {\n <button\n rtButton\n rtElem=\"details-toggle\"\n qa-dataid=\"toast-details-toggle\"\n size=\"sm\"\n theme=\"secondary\"\n appearance=\"text\"\n type=\"button\"\n [attr.aria-expanded]=\"detailsOpen()\"\n (click)=\"toggleDetails()\">\n {{ detailsOpen() ? t().uiHide : t().uiDetails }}\n </button>\n @if (detailsOpen()) {\n <rt-copy-value rtElem=\"details\" qa-dataid=\"toast-details\" wrap [value]=\"details\" />\n }\n }\n @if (toast().action || toast().secondaryAction) {\n <div rtElem=\"actions\">\n @if (toast().action; as action) {\n <button rtButton rtElem=\"action\" qa-dataid=\"toast-action\" size=\"sm\" type=\"button\" (click)=\"onAction()\">\n {{ action.label }}\n </button>\n }\n @if (toast().secondaryAction; as secondaryAction) {\n <button\n rtButton\n rtElem=\"action\"\n qa-dataid=\"toast-secondary-action\"\n size=\"sm\"\n theme=\"secondary\"\n appearance=\"text\"\n type=\"button\"\n (click)=\"onSecondaryAction()\">\n {{ secondaryAction.label }}\n </button>\n }\n </div>\n }\n </div>\n @if (!bare()) {\n <rt-icon-button\n rtElem=\"close\"\n qa-dataid=\"toast-close\"\n icon=\"ico-close\"\n variant=\"ghost\"\n size=\"sm\"\n [ariaLabel]=\"t().uiClose\"\n (clicked)=\"onClose()\" />\n }\n @if (showProgress()) {\n <span rtElem=\"progress\" qa-dataid=\"toast-progress\" aria-hidden=\"true\"></span>\n }\n</ng-container>\n",
|
|
469
|
+
styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-toast{--rt-toast-radius: var(--rt-radius-md);--rt-toast-border-width: var(--rt-border-width-thin);--rt-toast-shadow: var(--rt-shadow-card);--rt-toast-enter-duration: var(--rt-duration-slow);--rt-toast-shadow-duration: var(--rt-duration-base);--rt-toast-leave-duration: var(--rt-duration-slower);--rt-toast-fade-duration: var(--rt-duration-fast);--rt-toast-severity-color: var(--rt-color-state-info);--y: translateY(100%);--lift-amount: calc(var(--lift) * var(--gap));position:absolute;z-index:var(--z-index);display:flex;width:100%;box-sizing:border-box;align-items:center;padding:var(--rt-space-4);border:var(--rt-toast-border-width) solid var(--rt-toast-border-color, var(--rt-color-border-subtle));border-radius:var(--rt-toast-radius);background:var(--rt-toast-bg, var(--rt-color-bg-surface));box-shadow:var(--rt-toast-shadow);color:var(--rt-toast-color, var(--rt-color-text-primary));font-size:var(--rt-text-sm);font-weight:var(--rt-font-weight-medium);gap:var(--rt-space-2);line-height:var(--rt-leading-normal);opacity:0;outline:none;overflow-wrap:anywhere;touch-action:none;transform:var(--y);transition:transform var(--rt-toast-enter-duration),opacity var(--rt-toast-enter-duration),height var(--rt-toast-enter-duration),box-shadow var(--rt-toast-shadow-duration)}.rt-toast:after{position:absolute;bottom:100%;left:0;width:100%;height:calc(var(--gap) + 1px);content:\"\"}.rt-toast>*{transition:opacity var(--rt-toast-enter-duration)}.rt-toast--y--top{--y: translateY(-100%);--lift: 1;top:0}.rt-toast--y--bottom{--y: translateY(100%);--lift: -1;bottom:0}.rt-toast--severity--success{--rt-toast-severity-color: var(--rt-color-state-success)}.rt-toast--severity--warning{--rt-toast-severity-color: var(--rt-color-state-warning)}.rt-toast--severity--danger{--rt-toast-severity-color: var(--rt-color-state-danger)}.rt-toast--filled .rt-toast__description{color:inherit}.rt-toast--filled .rt-toast__icon{color:currentcolor}.rt-toast--filled.rt-toast--severity--info{border-color:var(--rt-toast-filled-info-border-color, var(--rt-color-state-info-bg));background:var(--rt-toast-filled-info-bg, var(--rt-color-state-info-bg));color:var(--rt-toast-filled-info-color, var(--rt-color-state-info))}.rt-toast--filled.rt-toast--severity--success{border-color:var(--rt-toast-filled-success-border-color, var(--rt-color-state-success-bg));background:var(--rt-toast-filled-success-bg, var(--rt-color-state-success-bg));color:var(--rt-toast-filled-success-color, var(--rt-color-state-success))}.rt-toast--filled.rt-toast--severity--warning{border-color:var(--rt-toast-filled-warning-border-color, var(--rt-color-state-warning-bg));background:var(--rt-toast-filled-warning-bg, var(--rt-color-state-warning-bg));color:var(--rt-toast-filled-warning-color, var(--rt-color-state-warning))}.rt-toast--filled.rt-toast--severity--danger{border-color:var(--rt-toast-filled-danger-border-color, var(--rt-color-state-danger-bg));background:var(--rt-toast-filled-danger-bg, var(--rt-color-state-danger-bg));color:var(--rt-toast-filled-danger-color, var(--rt-color-state-danger))}.rt-toast.rt-toast--bare{--rt-toast-radius: 0;--rt-toast-border-width: 0;--rt-toast-shadow: none;padding:0;background:transparent}.rt-toast--mounted{--y: translateY(0);opacity:1}.rt-toast:not(.rt-toast--expanded,.rt-toast--front){--scale: var(--toasts-before) * .05 + 1;--y: translateY(calc(var(--lift-amount) * var(--toasts-before))) scale(calc(-1 * var(--scale)));height:var(--front-toast-height)}.rt-toast:not(.rt-toast--expanded,.rt-toast--front)>*{opacity:0}.rt-toast--hidden{opacity:0;pointer-events:none}.rt-toast--mounted.rt-toast--expanded{--y: translateY(calc(var(--lift) * var(--offset)));height:var(--initial-height)}.rt-toast--removed.rt-toast--front{--y: translateY(calc(var(--lift) * -100%));opacity:0}.rt-toast--removed.rt-toast--expanded:not(.rt-toast--front){--y: translateY(calc(var(--lift) * var(--offset) + var(--lift) * -100%));opacity:0}.rt-toast--removed:not(.rt-toast--front,.rt-toast--expanded){--y: translateY(40%);opacity:0;transition:transform var(--rt-toast-leave-duration),opacity var(--rt-toast-shadow-duration)}.rt-toast--removed:not(.rt-toast--front):before{position:absolute;content:\"\";inset:0;transform:scaleY(2)}.rt-toast__icon{flex-shrink:0;color:var(--rt-toast-icon-color, var(--rt-toast-severity-color))}.rt-toast__progress{position:absolute;bottom:0;animation:rt-toast-progress var(--lifetime) linear forwards;background:var(--rt-toast-progress-color, var(--rt-toast-severity-color));block-size:var(--rt-toast-progress-height, var(--rt-space-0-5));border-end-end-radius:var(--rt-toast-radius);border-end-start-radius:var(--rt-toast-radius);inset-inline:0;transform-origin:left center}.rt-toast--paused .rt-toast__progress{animation-play-state:paused}.rt-toast__content{display:flex;min-width:0;flex:1 1 auto;flex-direction:column;gap:var(--rt-space-0-5)}.rt-toast__description,.rt-toast__meta{color:var(--rt-color-text-muted);font-size:var(--rt-text-xs);font-weight:var(--rt-font-weight-regular)}.rt-toast__sr-message{position:absolute;overflow:hidden;width:1px;height:1px;clip-path:inset(50%);white-space:nowrap}.rt-toast__custom{min-width:0}.rt-toast__value{margin-block:var(--rt-space-1)}.rt-toast .rt-toast__details-toggle{align-self:flex-start}.rt-toast__details{display:flex}.rt-toast__actions{display:flex;flex-wrap:wrap;align-items:center;gap:var(--rt-space-2);margin-block-start:var(--rt-space-1)}.rt-toast .rt-toast__action{align-self:flex-start}.rt-toast .rt-toast__action:not(.rt-button--text){--rt-btn-bg: var(--rt-toast-action-color, var(--rt-color-action-primary));--rt-btn-bg-hover: var(--rt-toast-action-color, var(--rt-color-action-primary-hover));--rt-btn-bg-active: var(--rt-toast-action-color, var(--rt-color-action-primary-active))}.rt-toast .rt-toast__close{--rt-icon-button-color: var(--rt-toast-close-color, var(--rt-color-text-primary));flex-shrink:0;align-self:flex-start;margin-inline-start:auto;opacity:0;transition:opacity var(--rt-toast-fade-duration)}.rt-toast:hover .rt-toast__close,.rt-toast .rt-toast__close:focus-visible{opacity:1}@media(prefers-reduced-motion){.rt-toast{transition:none}.rt-toast>*{transition:none}}@keyframes rt-toast-progress{0%{transform:scaleX(1)}to{transform:scaleX(0)}}}\n"]
|
|
370
470
|
}]
|
|
371
471
|
}],
|
|
372
472
|
ctorParameters: () => [],
|
|
@@ -476,6 +576,7 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
476
576
|
const BEM_BLOCK = "rt-toaster";
|
|
477
577
|
const DEFAULT_DURATION_MS = 4e3;
|
|
478
578
|
const DEFAULT_VISIBLE_TOASTS = 3;
|
|
579
|
+
const DEFAULT_CHANNEL = "default";
|
|
479
580
|
var RtToasterComponent = class RtToasterComponent {
|
|
480
581
|
#notificationBus;
|
|
481
582
|
#toastCounter;
|
|
@@ -522,7 +623,8 @@ var RtToasterComponent = class RtToasterComponent {
|
|
|
522
623
|
...ngDevMode ? { debugName: "expand" } : /* istanbul ignore next */ {},
|
|
523
624
|
transform: booleanAttribute
|
|
524
625
|
});
|
|
525
|
-
this
|
|
626
|
+
this.channel = input(DEFAULT_CHANNEL, ...ngDevMode ? [{ debugName: "channel" }] : /* istanbul ignore next */ []);
|
|
627
|
+
this.#notificationBus.onEmit().pipe(filter((event) => (event.payload.channel ?? DEFAULT_CHANNEL) === this.channel()), map((event) => this.#addToast(event)), mergeMap((toast) => this.#changesOf(toast)), takeUntilDestroyed()).subscribe((change) => this.#applyChange(change));
|
|
526
628
|
}
|
|
527
629
|
onStackEnter() {
|
|
528
630
|
if (this.toasts().length > 0) this.expanded.set(true);
|
|
@@ -560,9 +662,33 @@ var RtToasterComponent = class RtToasterComponent {
|
|
|
560
662
|
duration: event.payload.duration,
|
|
561
663
|
progress: event.payload.progress,
|
|
562
664
|
icon: event.payload.icon,
|
|
563
|
-
onDismiss: event.payload.onDismiss
|
|
665
|
+
onDismiss: event.payload.onDismiss,
|
|
666
|
+
progressValue: event.payload.progressValue,
|
|
667
|
+
details: event.payload.details,
|
|
668
|
+
component: event.payload.component,
|
|
669
|
+
data: event.payload.data,
|
|
670
|
+
bare: event.payload.bare,
|
|
671
|
+
ref: event.ref instanceof NotificationRef ? event.ref : void 0
|
|
564
672
|
};
|
|
565
673
|
this.toasts.update((items) => [toast, ...this.mode() === "replace" ? items.map((item) => this.#replaced(item)) : items]);
|
|
674
|
+
return toast;
|
|
675
|
+
}
|
|
676
|
+
#changesOf(toast) {
|
|
677
|
+
const ref = toast.ref;
|
|
678
|
+
if (ref === void 0) return EMPTY;
|
|
679
|
+
return merge(ref.onUpdate().pipe(map((patch) => ({
|
|
680
|
+
toastId: toast.id,
|
|
681
|
+
patch
|
|
682
|
+
}))), ref.onDismissRequest().pipe(map(() => ({
|
|
683
|
+
toastId: toast.id,
|
|
684
|
+
patch: { dismissRequested: true }
|
|
685
|
+
}))));
|
|
686
|
+
}
|
|
687
|
+
#applyChange(change) {
|
|
688
|
+
this.toasts.update((items) => items.map((item) => item.id === change.toastId ? {
|
|
689
|
+
...item,
|
|
690
|
+
...change.patch
|
|
691
|
+
} : item));
|
|
566
692
|
}
|
|
567
693
|
#replaced(toast) {
|
|
568
694
|
return toast.replaced ? toast : {
|
|
@@ -626,6 +752,13 @@ var RtToasterComponent = class RtToasterComponent {
|
|
|
626
752
|
isSignal: true,
|
|
627
753
|
isRequired: false,
|
|
628
754
|
transformFunction: null
|
|
755
|
+
},
|
|
756
|
+
channel: {
|
|
757
|
+
classPropertyName: "channel",
|
|
758
|
+
publicName: "channel",
|
|
759
|
+
isSignal: true,
|
|
760
|
+
isRequired: false,
|
|
761
|
+
transformFunction: null
|
|
629
762
|
}
|
|
630
763
|
},
|
|
631
764
|
host: {
|
|
@@ -742,6 +875,14 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
742
875
|
required: false
|
|
743
876
|
}]
|
|
744
877
|
}],
|
|
878
|
+
channel: [{
|
|
879
|
+
type: i0.Input,
|
|
880
|
+
args: [{
|
|
881
|
+
isSignal: true,
|
|
882
|
+
alias: "channel",
|
|
883
|
+
required: false
|
|
884
|
+
}]
|
|
885
|
+
}],
|
|
745
886
|
hostModifierClasses: [{
|
|
746
887
|
type: HostBinding,
|
|
747
888
|
args: ["class"]
|
|
@@ -752,6 +893,6 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
752
893
|
}]
|
|
753
894
|
}
|
|
754
895
|
});
|
|
755
|
-
export { RT_TOASTER_GAP_PX, RT_TOAST_SEVERITY_ICONS, RtToastComponent, RtToasterComponent };
|
|
896
|
+
export { RT_TOASTER_GAP_PX, RT_TOAST_DATA, RT_TOAST_SEVERITY_ICONS, RtToastComponent, RtToasterComponent };
|
|
756
897
|
|
|
757
898
|
//# sourceMappingURL=rt-tools-ui-kit-v2-toast.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rt-tools-ui-kit-v2-toast.mjs","names":["BEM_BLOCK"],"sources":["../../../projects/ui-kit-v2/src/lib/components/toast/rt-toaster.model.ts","../../../projects/ui-kit-v2/src/lib/components/toast/rt-toast.component.ts","../../../projects/ui-kit-v2/src/lib/components/toast/rt-toast.component.html","../../../projects/ui-kit-v2/src/lib/components/toast/rt-toaster.component.ts","../../../projects/ui-kit-v2/src/lib/components/toast/rt-toaster.component.html"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nimport { INotification } from '@rt-tools/ui-kit-v2/core';\n\nimport { IRtIcon } from '@rt-tools/ui-kit-v2/core';\n\nexport const RT_TOASTER_GAP_PX: number = 14;\n\n/**\n * Значки severity у тоста. Приложение подменяет карту целиком — например, на имена\n * Material, — а тост со своим `icon` берёт свой значок мимо карты.\n */\nexport const RT_TOAST_SEVERITY_ICONS: InjectionToken<Readonly<Record<INotification.Severity, IRtIcon.Name>>> = new InjectionToken<\n Readonly<Record<INotification.Severity, IRtIcon.Name>>\n>('RT_TOAST_SEVERITY_ICONS', {\n providedIn: 'root',\n factory: (): Readonly<Record<INotification.Severity, IRtIcon.Name>> => ({\n info: 'info-circle',\n success: 'check-circle',\n warning: 'exclamation-circle',\n danger: 'times-circle',\n }),\n});\n\nexport namespace IRtToaster {\n export type Position = 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right';\n\n export type PositionY = 'top' | 'bottom';\n\n export type PositionX = 'left' | 'center' | 'right';\n\n /** `stack` копит тосты стопкой; `replace` — новый тост уводит прежние. */\n export type Mode = 'stack' | 'replace';\n\n export interface Toast {\n readonly id: number;\n readonly severity: INotification.Severity;\n readonly message: string;\n readonly description?: string;\n readonly meta?: string;\n readonly action?: INotification.Action;\n readonly secondaryAction?: INotification.Action;\n readonly filled?: boolean;\n readonly duration?: number | null;\n readonly progress?: boolean;\n readonly icon?: IRtIcon.Name | null;\n readonly onDismiss?: (reason: INotification.DismissReason) => void;\n /** Тост вытеснен новым в режиме `replace` и уходит своей анимацией. */\n readonly replaced?: boolean;\n }\n\n export interface Height {\n readonly toastId: number;\n readonly height: number;\n }\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n AfterViewInit,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n HostBinding,\n inject,\n input,\n InputSignal,\n InputSignalWithTransform,\n OnDestroy,\n output,\n OutputEmitterRef,\n signal,\n Signal,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nimport { RT_KIT_LABELS, TRtKitLabelMap } from '@rt-tools/ui-kit-v2/core';\nimport { INotification } from '@rt-tools/ui-kit-v2/core';\n\nimport { RtButtonDirective } from '@rt-tools/ui-kit-v2/button';\nimport { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';\nimport { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';\nimport { IRtIcon } from '@rt-tools/ui-kit-v2/core';\nimport { RT_TOAST_SEVERITY_ICONS, RT_TOASTER_GAP_PX, IRtToaster } from './rt-toaster.model';\n\nconst BEM_BLOCK: string = 'rt-toast';\n\nconst UNMOUNT_DELAY_MS: number = 200;\n\n@Component({\n selector: 'rt-toast',\n templateUrl: './rt-toast.component.html',\n styleUrl: './rt-toast.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [RtButtonDirective, RtIconComponent, RtIconButtonComponent, BlockDirective, ElemDirective],\n host: {\n class: BEM_BLOCK,\n role: 'status',\n 'aria-atomic': 'true',\n },\n})\nexport class RtToastComponent implements AfterViewInit, OnDestroy {\n readonly #host: ElementRef<HTMLElement> = inject(ElementRef);\n\n readonly #severityIcons: Readonly<Record<INotification.Severity, IRtIcon.Name>> = inject(RT_TOAST_SEVERITY_ICONS);\n\n readonly #mounted: WritableSignal<boolean> = signal<boolean>(false);\n\n readonly #removed: WritableSignal<boolean> = signal<boolean>(false);\n\n readonly #offsetBeforeRemove: WritableSignal<number> = signal<number>(0);\n\n readonly #initialHeight: WritableSignal<number> = signal<number>(0);\n\n readonly #heightIndex: Signal<number> = computed((): number =>\n this.heights().findIndex((item: IRtToaster.Height): boolean => item.toastId === this.toast().id)\n );\n\n readonly #heightBefore: Signal<number> = computed((): number =>\n this.heights().reduce(\n (total: number, item: IRtToaster.Height, itemIndex: number): number =>\n itemIndex >= this.#heightIndex() ? total : total + item.height,\n 0\n )\n );\n\n readonly #offset: Signal<number> = computed((): number => Math.round(this.#heightIndex() * RT_TOASTER_GAP_PX + this.#heightBefore()));\n\n readonly #positionY: Signal<IRtToaster.PositionY> = computed((): IRtToaster.PositionY =>\n this.position().startsWith('top') ? 'top' : 'bottom'\n );\n\n #timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n #unmountTimeoutId: ReturnType<typeof setTimeout> | undefined;\n\n #remainingTimeMs: number = 0;\n\n #closeTimerStartedAt: number = 0;\n\n #closeTimerPausedAt: number = 0;\n\n protected readonly t: Signal<TRtKitLabelMap> = inject(RT_KIT_LABELS);\n\n /** Свой значок тоста важнее карты severity; `null` у тоста значок снимает. */\n protected readonly icon: Signal<IRtIcon.Name | null> = computed((): IRtIcon.Name | null => {\n const icon: IRtIcon.Name | null | undefined = this.toast().icon;\n return icon === undefined ? this.#severityIcons[this.toast().severity] : icon;\n });\n\n /** Срок жизни тоста: свой, если задан, иначе тостера; `null` — таймера нет. */\n protected readonly lifetime: Signal<number | null> = computed((): number | null => {\n const duration: number | null | undefined = this.toast().duration;\n return duration === undefined ? this.duration() : duration;\n });\n\n protected readonly showProgress: Signal<boolean> = computed((): boolean => this.toast().progress === true && this.lifetime() !== null);\n\n /** Таймер и полоса срока встают от одного признака, чтобы не разойтись. */\n protected readonly paused: Signal<boolean> = computed((): boolean => this.expanded() || this.interacting());\n\n public readonly toast: InputSignal<IRtToaster.Toast> = input.required<IRtToaster.Toast>();\n\n public readonly index: InputSignal<number> = input.required<number>();\n\n public readonly totalToasts: InputSignal<number> = input.required<number>();\n\n public readonly heights: InputSignal<IRtToaster.Height[]> = input.required<IRtToaster.Height[]>();\n\n public readonly expanded: InputSignalWithTransform<boolean, BooleanInput> = input.required<boolean, BooleanInput>({\n transform: booleanAttribute,\n });\n\n public readonly expandByDefault: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n public readonly interacting: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n public readonly position: InputSignal<IRtToaster.Position> = input<IRtToaster.Position>('bottom-right');\n\n public readonly visibleToasts: InputSignal<number> = input<number>(3);\n\n public readonly duration: InputSignal<number> = input<number>(4000);\n\n public readonly heightAdded: OutputEmitterRef<IRtToaster.Height> = output<IRtToaster.Height>();\n\n public readonly heightRemoved: OutputEmitterRef<number> = output<number>();\n\n public readonly dismissed: OutputEmitterRef<number> = output<number>();\n\n @HostBinding('class')\n public get hostModifierClasses(): Record<string, boolean> {\n return {\n [`${BEM_BLOCK}--severity--${this.toast().severity}`]: true,\n [`${BEM_BLOCK}--filled`]: this.toast().filled === true,\n [`${BEM_BLOCK}--y--${this.#positionY()}`]: true,\n [`${BEM_BLOCK}--mounted`]: this.#mounted(),\n [`${BEM_BLOCK}--removed`]: this.#removed(),\n [`${BEM_BLOCK}--front`]: this.index() === 0,\n [`${BEM_BLOCK}--hidden`]: this.index() + 1 > this.visibleToasts(),\n [`${BEM_BLOCK}--expanded`]: this.expanded() || (this.expandByDefault() && this.#mounted()),\n [`${BEM_BLOCK}--paused`]: this.paused(),\n };\n }\n\n @HostBinding('style')\n public get hostStackStyles(): Record<string, string> {\n return {\n '--index': `${this.index()}`,\n '--toasts-before': `${this.index()}`,\n '--z-index': `${this.totalToasts() - this.index()}`,\n '--offset': `${this.#removed() ? this.#offsetBeforeRemove() : this.#offset()}px`,\n '--initial-height': this.expandByDefault() ? 'auto' : `${this.#initialHeight()}px`,\n '--lifetime': `${this.lifetime() ?? 0}ms`,\n };\n }\n\n constructor() {\n effect((onCleanup: (cleanup: () => void) => void): void => {\n if (!this.#mounted() || this.#removed() || this.lifetime() === null) {\n return;\n }\n\n if (this.paused()) {\n this.#pauseTimer();\n } else {\n this.#startTimer();\n }\n\n onCleanup((): void => clearTimeout(this.#timeoutId));\n });\n\n // Вытесненный в режиме `replace` уходит тем же путём, что и закрытый крестиком.\n effect((): void => {\n if (this.#mounted() && this.toast().replaced === true) {\n this.#deleteToast('replaced');\n }\n });\n }\n\n public ngAfterViewInit(): void {\n this.#remainingTimeMs = this.lifetime() ?? 0;\n\n const height: number = this.#host.nativeElement.getBoundingClientRect().height;\n this.#initialHeight.set(height);\n this.heightAdded.emit({ toastId: this.toast().id, height });\n\n this.#mounted.set(true);\n }\n\n public ngOnDestroy(): void {\n clearTimeout(this.#timeoutId);\n clearTimeout(this.#unmountTimeoutId);\n }\n\n protected onAction(): void {\n this.toast().action?.handler();\n this.#deleteToast(null);\n }\n\n protected onSecondaryAction(): void {\n this.toast().secondaryAction?.handler();\n this.#deleteToast(null);\n }\n\n protected onClose(): void {\n this.#deleteToast('close');\n }\n\n /** Уход тоста. Причина — для колбэка приложения; ушедший по действию её не сообщает: `null`. */\n #deleteToast(reason: INotification.DismissReason | null): void {\n if (this.#removed()) {\n return;\n }\n\n this.#removed.set(true);\n\n if (reason !== null) {\n this.toast().onDismiss?.(reason);\n }\n\n this.#offsetBeforeRemove.set(this.#offset());\n this.heightRemoved.emit(this.toast().id);\n\n this.#unmountTimeoutId = setTimeout((): void => this.dismissed.emit(this.toast().id), UNMOUNT_DELAY_MS);\n }\n\n #startTimer(): void {\n this.#closeTimerStartedAt = Date.now();\n this.#timeoutId = setTimeout((): void => this.#deleteToast('timeout'), this.#remainingTimeMs);\n }\n\n #pauseTimer(): void {\n if (this.#closeTimerPausedAt < this.#closeTimerStartedAt) {\n const elapsedMs: number = Date.now() - this.#closeTimerStartedAt;\n this.#remainingTimeMs = this.#remainingTimeMs - elapsedMs;\n }\n\n this.#closeTimerPausedAt = Date.now();\n }\n}\n","<ng-container rtBlock=\"rt-toast\">\n @if (icon(); as icon) {\n <rt-icon rtElem=\"icon\" qa-dataid=\"toast-icon\" size=\"sm\" [name]=\"icon\" />\n }\n <div rtElem=\"content\" qa-dataid=\"toast-content\">\n @if (toast().meta; as meta) {\n <span rtElem=\"meta\" qa-dataid=\"toast-meta\">{{ meta }}</span>\n }\n <span rtElem=\"message\" qa-dataid=\"toast-message\">{{ toast().message }}</span>\n @if (toast().description; as description) {\n <span rtElem=\"description\" qa-dataid=\"toast-description\">{{ description }}</span>\n }\n @if (toast().action || toast().secondaryAction) {\n <div rtElem=\"actions\">\n @if (toast().action; as action) {\n <button rtButton rtElem=\"action\" qa-dataid=\"toast-action\" size=\"sm\" type=\"button\" (click)=\"onAction()\">\n {{ action.label }}\n </button>\n }\n @if (toast().secondaryAction; as secondaryAction) {\n <button\n rtButton\n rtElem=\"action\"\n qa-dataid=\"toast-secondary-action\"\n size=\"sm\"\n theme=\"secondary\"\n appearance=\"text\"\n type=\"button\"\n (click)=\"onSecondaryAction()\">\n {{ secondaryAction.label }}\n </button>\n }\n </div>\n }\n </div>\n <rt-icon-button\n rtElem=\"close\"\n qa-dataid=\"toast-close\"\n icon=\"ico-close\"\n variant=\"ghost\"\n size=\"sm\"\n [ariaLabel]=\"t().uiClose\"\n (clicked)=\"onClose()\" />\n @if (showProgress()) {\n <span rtElem=\"progress\" qa-dataid=\"toast-progress\" aria-hidden=\"true\"></span>\n }\n</ng-container>\n","import {\n ChangeDetectionStrategy,\n Component,\n HostBinding,\n InputSignal,\n InputSignalWithTransform,\n Signal,\n ViewEncapsulation,\n WritableSignal,\n booleanAttribute,\n computed,\n inject,\n input,\n linkedSignal,\n numberAttribute,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { rtKitLabel } from '@rt-tools/ui-kit-v2/core';\nimport { INotification, NotificationBus } from '@rt-tools/ui-kit-v2/core';\n\nimport { RtToastComponent } from './rt-toast.component';\nimport { RT_TOASTER_GAP_PX, IRtToaster } from './rt-toaster.model';\n\nconst BEM_BLOCK: string = 'rt-toaster';\n\nconst DEFAULT_DURATION_MS: number = 4000;\n\nconst DEFAULT_VISIBLE_TOASTS: number = 3;\n\n@Component({\n selector: 'rt-toaster',\n templateUrl: './rt-toaster.component.html',\n styleUrl: './rt-toaster.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [RtToastComponent],\n host: {\n class: BEM_BLOCK,\n role: 'region',\n '[attr.aria-label]': 'ariaLabel()',\n '(mouseenter)': 'onStackEnter()',\n '(mousemove)': 'onStackEnter()',\n '(mouseleave)': 'onStackLeave()',\n '(pointerdown)': 'onStackPointerDown()',\n '(pointerup)': 'onStackPointerUp()',\n },\n})\nexport class RtToasterComponent {\n readonly #notificationBus: NotificationBus = inject(NotificationBus);\n\n protected readonly ariaLabel: Signal<string> = rtKitLabel('uiNotifications');\n\n #toastCounter: number = 0;\n\n protected readonly toasts: WritableSignal<IRtToaster.Toast[]> = signal<IRtToaster.Toast[]>([]);\n\n protected readonly heights: WritableSignal<IRtToaster.Height[]> = signal<IRtToaster.Height[]>([]);\n\n protected readonly expanded: WritableSignal<boolean> = linkedSignal<IRtToaster.Toast[], boolean>({\n source: this.toasts,\n computation: (toasts: IRtToaster.Toast[]): boolean => toasts.length < 1,\n });\n\n protected readonly interacting: WritableSignal<boolean> = signal<boolean>(false);\n\n protected readonly positionY: Signal<IRtToaster.PositionY> = computed((): IRtToaster.PositionY =>\n this.position().startsWith('top') ? 'top' : 'bottom'\n );\n\n protected readonly positionX: Signal<IRtToaster.PositionX> = computed((): IRtToaster.PositionX => {\n if (this.position().endsWith('left')) {\n return 'left';\n }\n return this.position().endsWith('center') ? 'center' : 'right';\n });\n\n public readonly position: InputSignal<IRtToaster.Position> = input<IRtToaster.Position>('bottom-right');\n\n public readonly duration: InputSignalWithTransform<number, number | string> = input<number, number | string>(DEFAULT_DURATION_MS, {\n transform: numberAttribute,\n });\n\n public readonly visibleToasts: InputSignalWithTransform<number, number | string> = input<number, number | string>(\n DEFAULT_VISIBLE_TOASTS,\n { transform: numberAttribute }\n );\n\n /** `replace` — новый тост уводит прежние их же анимацией ухода, а не копится стопкой. */\n public readonly mode: InputSignal<IRtToaster.Mode> = input<IRtToaster.Mode>('stack');\n\n public readonly expand: InputSignalWithTransform<boolean, boolean | string> = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n\n @HostBinding('class')\n public get hostModifierClasses(): Record<string, boolean> {\n return {\n [`${BEM_BLOCK}--y--${this.positionY()}`]: true,\n [`${BEM_BLOCK}--x--${this.positionX()}`]: true,\n };\n }\n\n @HostBinding('style')\n public get hostStackStyles(): Record<string, string> {\n return {\n '--front-toast-height': `${this.heights()[0]?.height ?? 0}px`,\n '--gap': `${RT_TOASTER_GAP_PX}px`,\n };\n }\n\n constructor() {\n this.#notificationBus\n .onEmit()\n .pipe(takeUntilDestroyed())\n .subscribe((event: INotification.Event): void => this.#addToast(event));\n }\n\n protected onStackEnter(): void {\n if (this.toasts().length > 0) {\n this.expanded.set(true);\n }\n }\n\n protected onStackLeave(): void {\n if (!this.interacting()) {\n this.expanded.set(false);\n }\n }\n\n protected onStackPointerDown(): void {\n this.interacting.set(true);\n }\n\n protected onStackPointerUp(): void {\n this.interacting.set(false);\n }\n\n protected onHeightAdded(height: IRtToaster.Height): void {\n this.heights.update((items: IRtToaster.Height[]): IRtToaster.Height[] =>\n this.#sortHeights([height, ...items.filter((item: IRtToaster.Height): boolean => item.toastId !== height.toastId)])\n );\n }\n\n protected onHeightRemoved(toastId: number): void {\n this.heights.update((items: IRtToaster.Height[]): IRtToaster.Height[] =>\n items.filter((item: IRtToaster.Height): boolean => item.toastId !== toastId)\n );\n }\n\n protected onDismissed(toastId: number): void {\n this.onHeightRemoved(toastId);\n this.toasts.update((items: IRtToaster.Toast[]): IRtToaster.Toast[] =>\n items.filter((item: IRtToaster.Toast): boolean => item.id !== toastId)\n );\n }\n\n #addToast(event: INotification.Event): void {\n this.#toastCounter += 1;\n const toast: IRtToaster.Toast = {\n id: this.#toastCounter,\n severity: event.payload.severity,\n message: event.payload.message,\n description: event.payload.description,\n meta: event.payload.meta,\n action: event.payload.action,\n secondaryAction: event.payload.secondaryAction,\n filled: event.payload.filled,\n duration: event.payload.duration,\n progress: event.payload.progress,\n icon: event.payload.icon,\n onDismiss: event.payload.onDismiss,\n };\n this.toasts.update((items: IRtToaster.Toast[]): IRtToaster.Toast[] => [\n toast,\n ...(this.mode() === 'replace' ? items.map((item: IRtToaster.Toast): IRtToaster.Toast => this.#replaced(item)) : items),\n ]);\n }\n\n #replaced(toast: IRtToaster.Toast): IRtToaster.Toast {\n return toast.replaced ? toast : { ...toast, replaced: true };\n }\n\n #sortHeights(items: IRtToaster.Height[]): IRtToaster.Height[] {\n const order: number[] = this.toasts().map((toast: IRtToaster.Toast): number => toast.id);\n return [...items].sort(\n (left: IRtToaster.Height, right: IRtToaster.Height): number => order.indexOf(left.toastId) - order.indexOf(right.toastId)\n );\n }\n}\n","@for (item of toasts(); track item.id) {\n <rt-toast\n qa-dataid=\"toast\"\n [toast]=\"item\"\n [index]=\"$index\"\n [totalToasts]=\"toasts().length\"\n [heights]=\"heights()\"\n [expanded]=\"expanded()\"\n [expandByDefault]=\"expand()\"\n [interacting]=\"interacting()\"\n [position]=\"position()\"\n [visibleToasts]=\"visibleToasts()\"\n [duration]=\"duration()\"\n (heightAdded)=\"onHeightAdded($event)\"\n (heightRemoved)=\"onHeightRemoved($event)\"\n (dismissed)=\"onDismissed($event)\" />\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"rt-tools-ui-kit-v2-toast.mjs","names":["BEM_BLOCK"],"sources":["../../../projects/ui-kit-v2/src/lib/components/toast/rt-toaster.model.ts","../../../projects/ui-kit-v2/src/lib/components/toast/rt-toast.component.ts","../../../projects/ui-kit-v2/src/lib/components/toast/rt-toast.component.html","../../../projects/ui-kit-v2/src/lib/components/toast/rt-toaster.component.ts","../../../projects/ui-kit-v2/src/lib/components/toast/rt-toaster.component.html"],"sourcesContent":["import { InjectionToken, Type } from '@angular/core';\n\nimport { INotification, NotificationRef } from '@rt-tools/ui-kit-v2/core';\n\nimport { IRtIcon } from '@rt-tools/ui-kit-v2/core';\n\nexport const RT_TOASTER_GAP_PX: number = 14;\n\n/**\n * Значки severity у тоста. Приложение подменяет карту целиком — например, на имена\n * Material, — а тост со своим `icon` берёт свой значок мимо карты.\n */\nexport const RT_TOAST_SEVERITY_ICONS: InjectionToken<Readonly<Record<INotification.Severity, IRtIcon.Name>>> = new InjectionToken<\n Readonly<Record<INotification.Severity, IRtIcon.Name>>\n>('RT_TOAST_SEVERITY_ICONS', {\n providedIn: 'root',\n factory: (): Readonly<Record<INotification.Severity, IRtIcon.Name>> => ({\n info: 'info-circle',\n success: 'check-circle',\n warning: 'exclamation-circle',\n danger: 'times-circle',\n }),\n});\n\n/** Данные своего компонента тоста — то, что приложение передало в `openFromComponent`. */\nexport const RT_TOAST_DATA: InjectionToken<unknown> = new InjectionToken<unknown>('RT_TOAST_DATA');\n\nexport namespace IRtToaster {\n export type Position = 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right';\n\n export type PositionY = 'top' | 'bottom';\n\n export type PositionX = 'left' | 'center' | 'right';\n\n /** `stack` копит тосты стопкой; `replace` — новый тост уводит прежние. */\n export type Mode = 'stack' | 'replace';\n\n export interface Toast {\n readonly id: number;\n readonly severity: INotification.Severity;\n readonly message: string;\n readonly description?: string;\n readonly meta?: string;\n readonly action?: INotification.Action;\n readonly secondaryAction?: INotification.Action;\n readonly filled?: boolean;\n readonly duration?: number | null;\n readonly progress?: boolean;\n readonly icon?: IRtIcon.Name | null;\n readonly onDismiss?: (reason: INotification.DismissReason) => void;\n /** Тост вытеснен новым в режиме `replace` и уходит своей анимацией. */\n readonly replaced?: boolean;\n readonly progressValue?: number | null;\n readonly details?: string;\n readonly component?: Type<unknown>;\n readonly data?: unknown;\n /** Голый тост: оболочки нет, свой компонент рисует карточку сам. */\n readonly bare?: boolean;\n /** Ручка тоста: тост сообщает ей, почему ушёл. */\n readonly ref?: NotificationRef;\n /** Приложение закрыло тост ручкой: он уходит своей анимацией, как вытесненный. */\n readonly dismissRequested?: boolean;\n }\n\n /** Изменение показанного тоста от его ручки. */\n export interface Change {\n readonly toastId: number;\n readonly patch: INotification.Update & Pick<Toast, 'dismissRequested'>;\n }\n\n export interface Height {\n readonly toastId: number;\n readonly height: number;\n }\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { NgComponentOutlet } from '@angular/common';\nimport {\n afterNextRender,\n AfterViewInit,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n HostBinding,\n inject,\n Injector,\n input,\n InputSignal,\n InputSignalWithTransform,\n OnDestroy,\n output,\n OutputEmitterRef,\n signal,\n Signal,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nimport { RT_KIT_LABELS, TRtKitLabelMap } from '@rt-tools/ui-kit-v2/core';\nimport { INotification, NotificationRef } from '@rt-tools/ui-kit-v2/core';\n\nimport { RtButtonDirective } from '@rt-tools/ui-kit-v2/button';\nimport { RtCopyValueComponent } from '@rt-tools/ui-kit-v2/copy-value';\nimport { RtProgressBarComponent } from '@rt-tools/ui-kit-v2/progress-bar';\nimport { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';\nimport { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';\nimport { IRtIcon } from '@rt-tools/ui-kit-v2/core';\nimport { RT_TOAST_DATA, RT_TOAST_SEVERITY_ICONS, RT_TOASTER_GAP_PX, IRtToaster } from './rt-toaster.model';\n\n/** Что нужно своему компоненту тоста: данные и ручка. Меняются они реже прочих полей тоста. */\ninterface IToastComponentInputs {\n readonly data: unknown;\n readonly ref: NotificationRef | undefined;\n}\n\nconst BEM_BLOCK: string = 'rt-toast';\n\nconst UNMOUNT_DELAY_MS: number = 200;\n\n@Component({\n selector: 'rt-toast',\n templateUrl: './rt-toast.component.html',\n styleUrl: './rt-toast.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n NgComponentOutlet,\n RtButtonDirective,\n RtCopyValueComponent,\n RtIconComponent,\n RtIconButtonComponent,\n RtProgressBarComponent,\n BlockDirective,\n ElemDirective,\n ],\n host: {\n class: BEM_BLOCK,\n role: 'status',\n 'aria-atomic': 'true',\n },\n})\nexport class RtToastComponent implements AfterViewInit, OnDestroy {\n readonly #host: ElementRef<HTMLElement> = inject(ElementRef);\n\n readonly #injector: Injector = inject(Injector);\n\n /**\n * Данные и ручка своего компонента — отдельным сигналом с равенством по ним: живая доля\n * меняет тост на каждом тике, и без этого компонент создавался бы заново вместе с инжектором.\n */\n readonly #componentInputs: Signal<IToastComponentInputs> = computed(\n (): IToastComponentInputs => ({ data: this.toast().data, ref: this.toast().ref }),\n {\n equal: (left: IToastComponentInputs, right: IToastComponentInputs): boolean =>\n left.data === right.data && left.ref === right.ref,\n }\n );\n\n readonly #severityIcons: Readonly<Record<INotification.Severity, IRtIcon.Name>> = inject(RT_TOAST_SEVERITY_ICONS);\n\n readonly #mounted: WritableSignal<boolean> = signal<boolean>(false);\n\n readonly #removed: WritableSignal<boolean> = signal<boolean>(false);\n\n readonly #offsetBeforeRemove: WritableSignal<number> = signal<number>(0);\n\n readonly #initialHeight: WritableSignal<number> = signal<number>(0);\n\n readonly #heightIndex: Signal<number> = computed((): number =>\n this.heights().findIndex((item: IRtToaster.Height): boolean => item.toastId === this.toast().id)\n );\n\n readonly #heightBefore: Signal<number> = computed((): number =>\n this.heights().reduce(\n (total: number, item: IRtToaster.Height, itemIndex: number): number =>\n itemIndex >= this.#heightIndex() ? total : total + item.height,\n 0\n )\n );\n\n readonly #offset: Signal<number> = computed((): number => Math.round(this.#heightIndex() * RT_TOASTER_GAP_PX + this.#heightBefore()));\n\n readonly #positionY: Signal<IRtToaster.PositionY> = computed((): IRtToaster.PositionY =>\n this.position().startsWith('top') ? 'top' : 'bottom'\n );\n\n #timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n #unmountTimeoutId: ReturnType<typeof setTimeout> | undefined;\n\n #remainingTimeMs: number = 0;\n\n #closeTimerStartedAt: number = 0;\n\n #closeTimerPausedAt: number = 0;\n\n protected readonly t: Signal<TRtKitLabelMap> = inject(RT_KIT_LABELS);\n\n /** Свой значок тоста важнее карты severity; `null` у тоста значок снимает. */\n protected readonly icon: Signal<IRtIcon.Name | null> = computed((): IRtIcon.Name | null => {\n const icon: IRtIcon.Name | null | undefined = this.toast().icon;\n return icon === undefined ? this.#severityIcons[this.toast().severity] : icon;\n });\n\n /** Срок жизни тоста: свой, если задан, иначе тостера; `null` — таймера нет. */\n protected readonly lifetime: Signal<number | null> = computed((): number | null => {\n const duration: number | null | undefined = this.toast().duration;\n return duration === undefined ? this.duration() : duration;\n });\n\n /** Инжектор своего компонента: данные токеном `RT_TOAST_DATA` и ручка `NotificationRef`. */\n protected readonly componentInjector: Signal<Injector> = computed((): Injector => {\n const inputs: IToastComponentInputs = this.#componentInputs();\n\n return Injector.create({\n providers: [\n { provide: RT_TOAST_DATA, useValue: inputs.data },\n { provide: NotificationRef, useValue: inputs.ref ?? null },\n ],\n parent: this.#injector,\n });\n });\n\n /** Живая доля задачи: число 0–100 — полоса стоит, `null` и пусто — её нет. */\n protected readonly progressValue: Signal<number | null> = computed((): number | null => this.toast().progressValue ?? null);\n\n /** Подробности раскрыты. */\n protected readonly detailsOpen: WritableSignal<boolean> = signal<boolean>(false);\n\n /** Голый тост: значка, крестика и полосы срока нет, оболочку снимает модификатор. */\n protected readonly bare: Signal<boolean> = computed((): boolean => this.toast().bare === true);\n\n protected readonly showProgress: Signal<boolean> = computed(\n (): boolean => !this.bare() && this.toast().progress === true && this.lifetime() !== null\n );\n\n /** Таймер и полоса срока встают от одного признака, чтобы не разойтись. */\n protected readonly paused: Signal<boolean> = computed((): boolean => this.expanded() || this.interacting());\n\n public readonly toast: InputSignal<IRtToaster.Toast> = input.required<IRtToaster.Toast>();\n\n public readonly index: InputSignal<number> = input.required<number>();\n\n public readonly totalToasts: InputSignal<number> = input.required<number>();\n\n public readonly heights: InputSignal<IRtToaster.Height[]> = input.required<IRtToaster.Height[]>();\n\n public readonly expanded: InputSignalWithTransform<boolean, BooleanInput> = input.required<boolean, BooleanInput>({\n transform: booleanAttribute,\n });\n\n public readonly expandByDefault: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n public readonly interacting: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n public readonly position: InputSignal<IRtToaster.Position> = input<IRtToaster.Position>('bottom-right');\n\n public readonly visibleToasts: InputSignal<number> = input<number>(3);\n\n public readonly duration: InputSignal<number> = input<number>(4000);\n\n public readonly heightAdded: OutputEmitterRef<IRtToaster.Height> = output<IRtToaster.Height>();\n\n public readonly heightRemoved: OutputEmitterRef<number> = output<number>();\n\n public readonly dismissed: OutputEmitterRef<number> = output<number>();\n\n @HostBinding('class')\n public get hostModifierClasses(): Record<string, boolean> {\n return {\n [`${BEM_BLOCK}--severity--${this.toast().severity}`]: true,\n [`${BEM_BLOCK}--filled`]: this.toast().filled === true,\n [`${BEM_BLOCK}--bare`]: this.bare(),\n [`${BEM_BLOCK}--y--${this.#positionY()}`]: true,\n [`${BEM_BLOCK}--mounted`]: this.#mounted(),\n [`${BEM_BLOCK}--removed`]: this.#removed(),\n [`${BEM_BLOCK}--front`]: this.index() === 0,\n [`${BEM_BLOCK}--hidden`]: this.index() + 1 > this.visibleToasts(),\n [`${BEM_BLOCK}--expanded`]: this.expanded() || (this.expandByDefault() && this.#mounted()),\n [`${BEM_BLOCK}--paused`]: this.paused(),\n };\n }\n\n @HostBinding('style')\n public get hostStackStyles(): Record<string, string> {\n return {\n '--index': `${this.index()}`,\n '--toasts-before': `${this.index()}`,\n '--z-index': `${this.totalToasts() - this.index()}`,\n '--offset': `${this.#removed() ? this.#offsetBeforeRemove() : this.#offset()}px`,\n '--initial-height': this.expandByDefault() ? 'auto' : `${this.#initialHeight()}px`,\n '--lifetime': `${this.lifetime() ?? 0}ms`,\n };\n }\n\n constructor() {\n effect((onCleanup: (cleanup: () => void) => void): void => {\n if (!this.#mounted() || this.#removed() || this.lifetime() === null) {\n return;\n }\n\n if (this.paused()) {\n this.#pauseTimer();\n } else {\n this.#startTimer();\n }\n\n onCleanup((): void => clearTimeout(this.#timeoutId));\n });\n\n // Вытесненный в режиме `replace` уходит тем же путём, что и закрытый крестиком.\n effect((): void => {\n if (this.#mounted() && this.toast().replaced === true) {\n this.#deleteToast('replaced');\n }\n });\n\n // Закрытый ручкой приложения — тоже.\n effect((): void => {\n if (this.#mounted() && this.toast().dismissRequested === true) {\n this.#deleteToast('dismiss');\n }\n });\n\n // Новый текст, доля или раскрытые подробности меняют высоту: стопка пересчитывает сдвиги.\n effect((): void => {\n const toast: IRtToaster.Toast = this.toast();\n this.detailsOpen();\n if (!this.#mounted() || toast.replaced === true) {\n return;\n }\n afterNextRender((): void => this.#remeasure(), { injector: this.#injector });\n });\n }\n\n public ngAfterViewInit(): void {\n this.#remainingTimeMs = this.lifetime() ?? 0;\n\n const height: number = this.#host.nativeElement.getBoundingClientRect().height;\n this.#initialHeight.set(height);\n this.heightAdded.emit({ toastId: this.toast().id, height });\n\n this.#mounted.set(true);\n }\n\n public ngOnDestroy(): void {\n clearTimeout(this.#timeoutId);\n clearTimeout(this.#unmountTimeoutId);\n // Тост ушёл не своим путём — вместе с тостером. Ушедший своим путём ручку уже закрыл, и\n // повторная отметка ничего не делает.\n this.toast().ref?.markClosed('destroyed');\n }\n\n protected onAction(): void {\n this.toast().action?.handler();\n this.#deleteToast(null);\n }\n\n protected onSecondaryAction(): void {\n this.toast().secondaryAction?.handler();\n this.#deleteToast(null);\n }\n\n protected onClose(): void {\n this.#deleteToast('close');\n }\n\n protected toggleDetails(): void {\n this.detailsOpen.update((open: boolean): boolean => !open);\n }\n\n /**\n * Уход тоста. Причину получает ручка; колбэк приложения — только уход без действия и без\n * `dismiss()`: действие уже вызвало свой обработчик, а закрыло тост само приложение.\n */\n #deleteToast(reason: INotification.CloseReason | null): void {\n if (this.#removed()) {\n return;\n }\n\n this.#removed.set(true);\n\n if (reason !== null && reason !== 'action' && reason !== 'dismiss' && reason !== 'destroyed') {\n this.toast().onDismiss?.(reason);\n }\n\n this.toast().ref?.markClosed(reason ?? 'action');\n\n this.#offsetBeforeRemove.set(this.#offset());\n this.heightRemoved.emit(this.toast().id);\n\n this.#unmountTimeoutId = setTimeout((): void => this.dismissed.emit(this.toast().id), UNMOUNT_DELAY_MS);\n }\n\n /** Высота по содержимому: своя высота стопки на время замера снимается. */\n #remeasure(): void {\n if (this.#removed()) {\n return;\n }\n\n const host: HTMLElement = this.#host.nativeElement;\n host.style.height = 'auto';\n const height: number = host.offsetHeight;\n host.style.height = '';\n\n if (height !== this.#initialHeight()) {\n this.#initialHeight.set(height);\n this.heightAdded.emit({ toastId: this.toast().id, height });\n }\n }\n\n #startTimer(): void {\n this.#closeTimerStartedAt = Date.now();\n this.#timeoutId = setTimeout((): void => this.#deleteToast('timeout'), this.#remainingTimeMs);\n }\n\n #pauseTimer(): void {\n if (this.#closeTimerPausedAt < this.#closeTimerStartedAt) {\n const elapsedMs: number = Date.now() - this.#closeTimerStartedAt;\n this.#remainingTimeMs = this.#remainingTimeMs - elapsedMs;\n }\n\n this.#closeTimerPausedAt = Date.now();\n }\n}\n","<ng-container rtBlock=\"rt-toast\">\n @if (!bare() && icon(); as icon) {\n <rt-icon rtElem=\"icon\" qa-dataid=\"toast-icon\" size=\"sm\" [name]=\"icon\" />\n }\n <div rtElem=\"content\" qa-dataid=\"toast-content\">\n @if (toast().meta; as meta) {\n <span rtElem=\"meta\" qa-dataid=\"toast-meta\">{{ meta }}</span>\n }\n @if (toast().component; as component) {\n <!-- Свой компонент встаёт на место сообщения; сообщение остаётся именем для чтения с экрана. -->\n @if (toast().message) {\n <span rtElem=\"sr-message\">{{ toast().message }}</span>\n }\n <div rtElem=\"custom\" qa-dataid=\"toast-custom\">\n <ng-container [ngComponentOutlet]=\"component\" [ngComponentOutletInjector]=\"componentInjector()\" />\n </div>\n } @else {\n <span rtElem=\"message\" qa-dataid=\"toast-message\">{{ toast().message }}</span>\n @if (toast().description; as description) {\n <span rtElem=\"description\" qa-dataid=\"toast-description\">{{ description }}</span>\n }\n }\n @if (progressValue() !== null) {\n <rt-progress-bar rtElem=\"value\" qa-dataid=\"toast-progress-value\" [value]=\"progressValue() ?? 0\" [ariaLabel]=\"toast().message\" />\n }\n @if (toast().details; as details) {\n <button\n rtButton\n rtElem=\"details-toggle\"\n qa-dataid=\"toast-details-toggle\"\n size=\"sm\"\n theme=\"secondary\"\n appearance=\"text\"\n type=\"button\"\n [attr.aria-expanded]=\"detailsOpen()\"\n (click)=\"toggleDetails()\">\n {{ detailsOpen() ? t().uiHide : t().uiDetails }}\n </button>\n @if (detailsOpen()) {\n <rt-copy-value rtElem=\"details\" qa-dataid=\"toast-details\" wrap [value]=\"details\" />\n }\n }\n @if (toast().action || toast().secondaryAction) {\n <div rtElem=\"actions\">\n @if (toast().action; as action) {\n <button rtButton rtElem=\"action\" qa-dataid=\"toast-action\" size=\"sm\" type=\"button\" (click)=\"onAction()\">\n {{ action.label }}\n </button>\n }\n @if (toast().secondaryAction; as secondaryAction) {\n <button\n rtButton\n rtElem=\"action\"\n qa-dataid=\"toast-secondary-action\"\n size=\"sm\"\n theme=\"secondary\"\n appearance=\"text\"\n type=\"button\"\n (click)=\"onSecondaryAction()\">\n {{ secondaryAction.label }}\n </button>\n }\n </div>\n }\n </div>\n @if (!bare()) {\n <rt-icon-button\n rtElem=\"close\"\n qa-dataid=\"toast-close\"\n icon=\"ico-close\"\n variant=\"ghost\"\n size=\"sm\"\n [ariaLabel]=\"t().uiClose\"\n (clicked)=\"onClose()\" />\n }\n @if (showProgress()) {\n <span rtElem=\"progress\" qa-dataid=\"toast-progress\" aria-hidden=\"true\"></span>\n }\n</ng-container>\n","import {\n ChangeDetectionStrategy,\n Component,\n HostBinding,\n InputSignal,\n InputSignalWithTransform,\n Signal,\n ViewEncapsulation,\n WritableSignal,\n booleanAttribute,\n computed,\n inject,\n input,\n linkedSignal,\n numberAttribute,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { EMPTY, filter, map, merge, mergeMap, Observable } from 'rxjs';\n\nimport { rtKitLabel } from '@rt-tools/ui-kit-v2/core';\nimport { INotification, NotificationBus, NotificationRef } from '@rt-tools/ui-kit-v2/core';\n\nimport { RtToastComponent } from './rt-toast.component';\nimport { RT_TOASTER_GAP_PX, IRtToaster } from './rt-toaster.model';\n\nconst BEM_BLOCK: string = 'rt-toaster';\n\nconst DEFAULT_DURATION_MS: number = 4000;\n\nconst DEFAULT_VISIBLE_TOASTS: number = 3;\n\n/** Канал события без своего `channel` и тостера без входа: один тостер по-прежнему получает всё. */\nconst DEFAULT_CHANNEL: string = 'default';\n\n@Component({\n selector: 'rt-toaster',\n templateUrl: './rt-toaster.component.html',\n styleUrl: './rt-toaster.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [RtToastComponent],\n host: {\n class: BEM_BLOCK,\n role: 'region',\n '[attr.aria-label]': 'ariaLabel()',\n '(mouseenter)': 'onStackEnter()',\n '(mousemove)': 'onStackEnter()',\n '(mouseleave)': 'onStackLeave()',\n '(pointerdown)': 'onStackPointerDown()',\n '(pointerup)': 'onStackPointerUp()',\n },\n})\nexport class RtToasterComponent {\n readonly #notificationBus: NotificationBus = inject(NotificationBus);\n\n protected readonly ariaLabel: Signal<string> = rtKitLabel('uiNotifications');\n\n #toastCounter: number = 0;\n\n protected readonly toasts: WritableSignal<IRtToaster.Toast[]> = signal<IRtToaster.Toast[]>([]);\n\n protected readonly heights: WritableSignal<IRtToaster.Height[]> = signal<IRtToaster.Height[]>([]);\n\n protected readonly expanded: WritableSignal<boolean> = linkedSignal<IRtToaster.Toast[], boolean>({\n source: this.toasts,\n computation: (toasts: IRtToaster.Toast[]): boolean => toasts.length < 1,\n });\n\n protected readonly interacting: WritableSignal<boolean> = signal<boolean>(false);\n\n protected readonly positionY: Signal<IRtToaster.PositionY> = computed((): IRtToaster.PositionY =>\n this.position().startsWith('top') ? 'top' : 'bottom'\n );\n\n protected readonly positionX: Signal<IRtToaster.PositionX> = computed((): IRtToaster.PositionX => {\n if (this.position().endsWith('left')) {\n return 'left';\n }\n return this.position().endsWith('center') ? 'center' : 'right';\n });\n\n public readonly position: InputSignal<IRtToaster.Position> = input<IRtToaster.Position>('bottom-right');\n\n public readonly duration: InputSignalWithTransform<number, number | string> = input<number, number | string>(DEFAULT_DURATION_MS, {\n transform: numberAttribute,\n });\n\n public readonly visibleToasts: InputSignalWithTransform<number, number | string> = input<number, number | string>(\n DEFAULT_VISIBLE_TOASTS,\n { transform: numberAttribute }\n );\n\n /** `replace` — новый тост уводит прежние их же анимацией ухода, а не копится стопкой. */\n public readonly mode: InputSignal<IRtToaster.Mode> = input<IRtToaster.Mode>('stack');\n\n public readonly expand: InputSignalWithTransform<boolean, boolean | string> = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n\n /**\n * Канал тостера: он показывает только события с этим `channel`. Второй тостер со своим каналом\n * держит закреплённые тосты в своём углу и своей стопке.\n */\n public readonly channel: InputSignal<string> = input<string>(DEFAULT_CHANNEL);\n\n @HostBinding('class')\n public get hostModifierClasses(): Record<string, boolean> {\n return {\n [`${BEM_BLOCK}--y--${this.positionY()}`]: true,\n [`${BEM_BLOCK}--x--${this.positionX()}`]: true,\n };\n }\n\n @HostBinding('style')\n public get hostStackStyles(): Record<string, string> {\n return {\n '--front-toast-height': `${this.heights()[0]?.height ?? 0}px`,\n '--gap': `${RT_TOASTER_GAP_PX}px`,\n };\n }\n\n constructor() {\n // Ручка тоста слушается до его ухода: `markClosed` завершает её потоки, и подписка уходит сама.\n this.#notificationBus\n .onEmit()\n .pipe(\n filter((event: INotification.Event): boolean => (event.payload.channel ?? DEFAULT_CHANNEL) === this.channel()),\n map((event: INotification.Event): IRtToaster.Toast => this.#addToast(event)),\n mergeMap((toast: IRtToaster.Toast): Observable<IRtToaster.Change> => this.#changesOf(toast)),\n takeUntilDestroyed()\n )\n .subscribe((change: IRtToaster.Change): void => this.#applyChange(change));\n }\n\n protected onStackEnter(): void {\n if (this.toasts().length > 0) {\n this.expanded.set(true);\n }\n }\n\n protected onStackLeave(): void {\n if (!this.interacting()) {\n this.expanded.set(false);\n }\n }\n\n protected onStackPointerDown(): void {\n this.interacting.set(true);\n }\n\n protected onStackPointerUp(): void {\n this.interacting.set(false);\n }\n\n protected onHeightAdded(height: IRtToaster.Height): void {\n this.heights.update((items: IRtToaster.Height[]): IRtToaster.Height[] =>\n this.#sortHeights([height, ...items.filter((item: IRtToaster.Height): boolean => item.toastId !== height.toastId)])\n );\n }\n\n protected onHeightRemoved(toastId: number): void {\n this.heights.update((items: IRtToaster.Height[]): IRtToaster.Height[] =>\n items.filter((item: IRtToaster.Height): boolean => item.toastId !== toastId)\n );\n }\n\n protected onDismissed(toastId: number): void {\n this.onHeightRemoved(toastId);\n this.toasts.update((items: IRtToaster.Toast[]): IRtToaster.Toast[] =>\n items.filter((item: IRtToaster.Toast): boolean => item.id !== toastId)\n );\n }\n\n #addToast(event: INotification.Event): IRtToaster.Toast {\n this.#toastCounter += 1;\n const toast: IRtToaster.Toast = {\n id: this.#toastCounter,\n severity: event.payload.severity,\n message: event.payload.message,\n description: event.payload.description,\n meta: event.payload.meta,\n action: event.payload.action,\n secondaryAction: event.payload.secondaryAction,\n filled: event.payload.filled,\n duration: event.payload.duration,\n progress: event.payload.progress,\n icon: event.payload.icon,\n onDismiss: event.payload.onDismiss,\n progressValue: event.payload.progressValue,\n details: event.payload.details,\n component: event.payload.component,\n data: event.payload.data,\n bare: event.payload.bare,\n ref: event.ref instanceof NotificationRef ? event.ref : undefined,\n };\n this.toasts.update((items: IRtToaster.Toast[]): IRtToaster.Toast[] => [\n toast,\n ...(this.mode() === 'replace' ? items.map((item: IRtToaster.Toast): IRtToaster.Toast => this.#replaced(item)) : items),\n ]);\n\n return toast;\n }\n\n /** Изменения тоста от его ручки: обновление полей и просьба закрыть. Без ручки — ничего. */\n #changesOf(toast: IRtToaster.Toast): Observable<IRtToaster.Change> {\n const ref: NotificationRef | undefined = toast.ref;\n\n if (ref === undefined) {\n return EMPTY;\n }\n\n return merge(\n ref.onUpdate().pipe(map((patch: INotification.Update): IRtToaster.Change => ({ toastId: toast.id, patch }))),\n ref.onDismissRequest().pipe(map((): IRtToaster.Change => ({ toastId: toast.id, patch: { dismissRequested: true } })))\n );\n }\n\n #applyChange(change: IRtToaster.Change): void {\n this.toasts.update((items: IRtToaster.Toast[]): IRtToaster.Toast[] =>\n items.map((item: IRtToaster.Toast): IRtToaster.Toast => (item.id === change.toastId ? { ...item, ...change.patch } : item))\n );\n }\n\n #replaced(toast: IRtToaster.Toast): IRtToaster.Toast {\n return toast.replaced ? toast : { ...toast, replaced: true };\n }\n\n #sortHeights(items: IRtToaster.Height[]): IRtToaster.Height[] {\n const order: number[] = this.toasts().map((toast: IRtToaster.Toast): number => toast.id);\n return [...items].sort(\n (left: IRtToaster.Height, right: IRtToaster.Height): number => order.indexOf(left.toastId) - order.indexOf(right.toastId)\n );\n }\n}\n","@for (item of toasts(); track item.id) {\n <rt-toast\n qa-dataid=\"toast\"\n [toast]=\"item\"\n [index]=\"$index\"\n [totalToasts]=\"toasts().length\"\n [heights]=\"heights()\"\n [expanded]=\"expanded()\"\n [expandByDefault]=\"expand()\"\n [interacting]=\"interacting()\"\n [position]=\"position()\"\n [visibleToasts]=\"visibleToasts()\"\n [duration]=\"duration()\"\n (heightAdded)=\"onHeightAdded($event)\"\n (heightRemoved)=\"onHeightRemoved($event)\"\n (dismissed)=\"onDismissed($event)\" />\n}\n"],"mappings":"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"}
|