@rt-tools/ui-kit-v2 0.22.0 → 0.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/rt-tools-ui-kit-v2-core.mjs +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-core.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs +4 -2
- package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-icon.mjs +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-icon.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs +11 -0
- package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs +172 -26
- package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-toast.mjs +11 -6
- package/fesm2022/rt-tools-ui-kit-v2-toast.mjs.map +1 -1
- package/package.json +1 -1
- package/rt-tools-ui-kit-v2-0.23.0.tgz +0 -0
- package/src/assets/icons-material/folder.fill.svg +5 -0
- package/src/assets/icons-material/folder.svg +5 -0
- package/src/lib/components/dynamic-selector/CONTEXT.md +2 -1
- package/src/lib/components/scroll-area/CONTEXT.md +5 -1
- package/src/lib/components/side-menu/CONTEXT.md +17 -1
- package/src/lib/components/side-menu/favorites/rt-side-menu-favorites.component.scss +9 -0
- package/src/lib/components/side-menu/rt-side-menu.component.scss +42 -15
- package/src/lib/components/side-menu/stories/component/test-side-menu-cell.component.scss +34 -0
- package/src/lib/components/side-menu/sub-item/rt-side-menu-sub-item.component.scss +75 -14
- package/src/lib/components/toast/CONTEXT.md +2 -0
- package/types/rt-tools-ui-kit-v2-core.d.ts +12 -2
- package/types/rt-tools-ui-kit-v2-side-menu.d.ts +60 -8
- package/types/rt-tools-ui-kit-v2-toast.d.ts +1 -0
- package/rt-tools-ui-kit-v2-0.22.0.tgz +0 -0
|
@@ -138,7 +138,7 @@ class RtToastComponent {
|
|
|
138
138
|
// Вытесненный в режиме `replace` уходит тем же путём, что и закрытый крестиком.
|
|
139
139
|
effect(() => {
|
|
140
140
|
if (this.#mounted() && this.toast().replaced === true) {
|
|
141
|
-
this.#deleteToast();
|
|
141
|
+
this.#deleteToast('replaced');
|
|
142
142
|
}
|
|
143
143
|
});
|
|
144
144
|
}
|
|
@@ -155,27 +155,31 @@ class RtToastComponent {
|
|
|
155
155
|
}
|
|
156
156
|
onAction() {
|
|
157
157
|
this.toast().action?.handler();
|
|
158
|
-
this.#deleteToast();
|
|
158
|
+
this.#deleteToast(null);
|
|
159
159
|
}
|
|
160
160
|
onSecondaryAction() {
|
|
161
161
|
this.toast().secondaryAction?.handler();
|
|
162
|
-
this.#deleteToast();
|
|
162
|
+
this.#deleteToast(null);
|
|
163
163
|
}
|
|
164
164
|
onClose() {
|
|
165
|
-
this.#deleteToast();
|
|
165
|
+
this.#deleteToast('close');
|
|
166
166
|
}
|
|
167
|
-
|
|
167
|
+
/** Уход тоста. Причина — для колбэка приложения; ушедший по действию её не сообщает: `null`. */
|
|
168
|
+
#deleteToast(reason) {
|
|
168
169
|
if (this.#removed()) {
|
|
169
170
|
return;
|
|
170
171
|
}
|
|
171
172
|
this.#removed.set(true);
|
|
173
|
+
if (reason !== null) {
|
|
174
|
+
this.toast().onDismiss?.(reason);
|
|
175
|
+
}
|
|
172
176
|
this.#offsetBeforeRemove.set(this.#offset());
|
|
173
177
|
this.heightRemoved.emit(this.toast().id);
|
|
174
178
|
this.#unmountTimeoutId = setTimeout(() => this.dismissed.emit(this.toast().id), UNMOUNT_DELAY_MS);
|
|
175
179
|
}
|
|
176
180
|
#startTimer() {
|
|
177
181
|
this.#closeTimerStartedAt = Date.now();
|
|
178
|
-
this.#timeoutId = setTimeout(() => this.#deleteToast(), this.#remainingTimeMs);
|
|
182
|
+
this.#timeoutId = setTimeout(() => this.#deleteToast('timeout'), this.#remainingTimeMs);
|
|
179
183
|
}
|
|
180
184
|
#pauseTimer() {
|
|
181
185
|
if (this.#closeTimerPausedAt < this.#closeTimerStartedAt) {
|
|
@@ -294,6 +298,7 @@ class RtToasterComponent {
|
|
|
294
298
|
duration: event.payload.duration,
|
|
295
299
|
progress: event.payload.progress,
|
|
296
300
|
icon: event.payload.icon,
|
|
301
|
+
onDismiss: event.payload.onDismiss,
|
|
297
302
|
};
|
|
298
303
|
this.toasts.update((items) => [
|
|
299
304
|
toast,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rt-tools-ui-kit-v2-toast.mjs","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","../../../projects/ui-kit-v2/src/lib/components/toast/rt-tools-ui-kit-v2-toast.ts"],"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 /** Тост вытеснен новым в режиме `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();\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();\n }\n\n protected onSecondaryAction(): void {\n this.toast().secondaryAction?.handler();\n this.#deleteToast();\n }\n\n protected onClose(): void {\n this.#deleteToast();\n }\n\n #deleteToast(): void {\n if (this.#removed()) {\n return;\n }\n\n this.#removed.set(true);\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(), 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 };\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","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["BEM_BLOCK"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"rt-tools-ui-kit-v2-toast.mjs","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","../../../projects/ui-kit-v2/src/lib/components/toast/rt-tools-ui-kit-v2-toast.ts"],"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","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["BEM_BLOCK"],"mappings":"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"}
|
package/package.json
CHANGED
|
Binary file
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24">
|
|
2
|
+
<path
|
|
3
|
+
fill="currentColor"
|
|
4
|
+
d="M149-135q-39.05 0-66.53-27.98Q55-190.95 55-229v-502q0-38.46 27.47-66.73Q109.95-826 149-826h261l71 72h330q38.46 0 66.73 27.97Q906-698.05 906-660v431q0 38.05-28.27 66.02Q849.46-135 811-135H149Z" />
|
|
5
|
+
</svg>
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24">
|
|
2
|
+
<path
|
|
3
|
+
fill="currentColor"
|
|
4
|
+
d="M149-135q-39.05 0-66.53-27.98Q55-190.95 55-229v-502q0-38.46 27.47-66.73Q109.95-826 149-826h261l71 72h330q38.46 0 66.73 27.97Q906-698.05 906-660v431q0 38.05-28.27 66.02Q849.46-135 811-135H149Zm0-94h662v-431H442l-71-71H149v502Zm0 0v-502 502Z" />
|
|
5
|
+
</svg>
|
|
@@ -51,7 +51,8 @@
|
|
|
51
51
|
- Подпись поля — обёртка `rt-field` с `label`, как у любого поля кита. У поля строк она ведёт к полю
|
|
52
52
|
новой строки, пока оно открыто.
|
|
53
53
|
- Выбранное без формы — вход `chosenEntities`: непустой список с другими ключами становится и
|
|
54
|
-
значением, и списком для «Сбросить»; эхо выбора от родителя ничего не
|
|
54
|
+
значением, и списком для «Сбросить»; эхо выбора от родителя ничего не меняет, в каком бы порядке
|
|
55
|
+
он ни вернул те же ключи.
|
|
55
56
|
- `titleWrap="false"` — название строки и подпись пункта окна одной строкой с многоточием и
|
|
56
57
|
подсказкой при обрезке.
|
|
57
58
|
- Зазоры списка задают свойства `--rt-dynamic-selector-list-actions-gap`, `-controls-gap`,
|
|
@@ -34,7 +34,11 @@
|
|
|
34
34
|
**Признак встаёт до первого движения руки.** Событие прокрутки приходит только после того, как
|
|
35
35
|
кто-то прокрутил, а список не влезает уже на первой отрисовке: за размером тела и подвала следит
|
|
36
36
|
наблюдатель. Наблюдатели живут, только пока признак включён: без входа область не следит ни за чем
|
|
37
|
-
и
|
|
37
|
+
и размеров не измеряет.
|
|
38
|
+
|
|
39
|
+
**Содержимое, которое дорастает переходом высоты, перемеряется по концу перехода.** Раскрытая папка
|
|
40
|
+
растёт от нуля, и наблюдатель размера пропускал конец такого роста. Конец перехода или анимации
|
|
41
|
+
всплывает к телу, и область перемеряет признак по вставшей высоте.
|
|
38
42
|
|
|
39
43
|
**Полоса растушёвки доходит до содержимого подвала, а не до края тела.** Разделитель потребитель
|
|
40
44
|
рисует первой строкой подвала, и подъём полосы область измеряет сама — это высота подвала без его
|
|
@@ -23,6 +23,21 @@
|
|
|
23
23
|
**Подсказки строк подменю гасит `subMenuTooltipsShown="false"`.** Имена кнопок для чтения экрана
|
|
24
24
|
остаются.
|
|
25
25
|
|
|
26
|
+
**Вид первого кита — входы и свойства, умолчания дают прежний вид.** Без подписей полосы
|
|
27
|
+
(`railTitlesShown="false"`) имя пункта уходит в подсказку справа и в `aria-label`; подсказку гасит тот
|
|
28
|
+
же `subMenuTooltipsShown`. Строка и папка подменю несут номер пункта в `data-item-id`. Цвета пункта
|
|
29
|
+
объявлены и на строке избранного в руке: её CDK выносит из меню. Кнопки строки — «+», звезда,
|
|
30
|
+
«убрать» и ручка — берут скругление, размер, значок и цвет покоя из свойств строки; круг первого
|
|
31
|
+
кита приложение ставит свойством, умолчание — прежний скруглённый квадрат. Входы вида живут в
|
|
32
|
+
`rt-side-menu-look.base.ts`: класс меню иначе не помещался в предел длины файла.
|
|
33
|
+
|
|
34
|
+
**Строка подменю переходит сама, а не ссылкой роутера.** Ссылка роутера переходила раньше любого
|
|
35
|
+
обработчика строки, и приложение не могло взять переход на себя. Строка отдаёт нажатие выходом и
|
|
36
|
+
переходит через роутер, если умолчание не отменено; `href` строит труба `rtSideMenuHref`.
|
|
37
|
+
|
|
38
|
+
**Закрытие наведения откладывает `RtSideMenuCloseTimer`.** Нулевая задержка закрывает сразу, как
|
|
39
|
+
раньше; возврат указателя на панель и пункт с подменю снимают отложенное закрытие.
|
|
40
|
+
|
|
26
41
|
**Значок вне набора — шаблон `rtSideMenuIcon`.** Имя Material первого кита меню переводит парой
|
|
27
42
|
из перечня кита, как `rt-menu`. Имя без пары берёт свой шаблон меню, один на все пункты и кнопки строк;
|
|
28
43
|
контекст — строка (`$implicit`), имя (`icon`) и место (`slot`: `'icon'` или `'iconButton'`). Без
|
|
@@ -34,7 +49,8 @@
|
|
|
34
49
|
## Края
|
|
35
50
|
|
|
36
51
|
- Незакреплённая панель стоит над страницей и закрывается уходом указателя. Если человек взялся за
|
|
37
|
-
поле поиска, её закрывает только нажатие снаружи.
|
|
52
|
+
поле поиска, её закрывает только нажатие снаружи. Подложка для этого нажатия начинается после
|
|
53
|
+
полосы: наведение на другой пункт полосы переключает подменю и тогда, как у первого кита.
|
|
38
54
|
- Закреплённая панель стоит в потоке рядом с полосой, у неё есть ручка ширины.
|
|
39
55
|
- На узком экране закрепления нет: меню рисует один столбец с кнопкой «назад».
|
|
40
56
|
- Столбец узкого экрана шириной `--rt-side-menu-mobile-width`, 15rem, как меню телефона первого кита:
|
|
@@ -88,10 +88,19 @@
|
|
|
88
88
|
/* Ручка видна так же, как «убрать»: под наведением и фокусом клавиатуры своей строки, а где
|
|
89
89
|
указатель не умеет наводиться, — всегда. Прячется прозрачностью: остаётся в порядке Tab. */
|
|
90
90
|
.rt-side-menu-favorites__handle {
|
|
91
|
+
/* Размер, форма, значок и цвет ручки — свойства строки подменю, как у звезды и «убрать». */
|
|
92
|
+
--rt-icon-button-color: var(--rt-side-menu-sub-item-favorite-color);
|
|
93
|
+
--rt-icon-step-sm: var(--rt-side-menu-sub-item-button-icon-size);
|
|
94
|
+
|
|
91
95
|
flex-shrink: 0;
|
|
92
96
|
cursor: grab;
|
|
93
97
|
opacity: 0;
|
|
94
98
|
|
|
99
|
+
> .rt-icon-button {
|
|
100
|
+
--rt-icon-button-size-step: var(--rt-side-menu-sub-item-favorite-size);
|
|
101
|
+
--rt-icon-button-radius: var(--rt-side-menu-sub-item-button-radius);
|
|
102
|
+
}
|
|
103
|
+
|
|
95
104
|
&:active {
|
|
96
105
|
cursor: grabbing;
|
|
97
106
|
}
|
|
@@ -3,6 +3,17 @@
|
|
|
3
3
|
Host несёт класс блока: полоса пунктов, рядом панель подменю. Незакреплённая панель стоит над
|
|
4
4
|
страницей, закреплённая — в потоке рядом с полосой и сдвигает страницу. */
|
|
5
5
|
|
|
6
|
+
/* Цвета пункта — полосы, строки телефона и строки подменю. Объявлены и на строке избранного в
|
|
7
|
+
руке: её CDK выносит в конец страницы, вне меню. Цвет в покое по умолчанию берётся от меню, как
|
|
8
|
+
раньше брался наследованием. */
|
|
9
|
+
.rt-side-menu,
|
|
10
|
+
.rt-side-menu-favorites__row.cdk-drag-preview {
|
|
11
|
+
--rt-side-menu-item-color: currentcolor;
|
|
12
|
+
--rt-side-menu-item-bg-hover: var(--rt-color-bg-hover);
|
|
13
|
+
--rt-side-menu-item-bg-active: var(--rt-color-action-primary-subtle);
|
|
14
|
+
--rt-side-menu-item-color-active: var(--rt-color-action-primary-on-surface);
|
|
15
|
+
}
|
|
16
|
+
|
|
6
17
|
.rt-side-menu {
|
|
7
18
|
--rt-side-menu-rail-width: 5.5rem;
|
|
8
19
|
--rt-side-menu-panel-width: 15rem;
|
|
@@ -14,6 +25,14 @@
|
|
|
14
25
|
--rt-side-menu-resizer-border-width: var(--rt-border-width-thick);
|
|
15
26
|
--rt-side-menu-panel-border-width: var(--rt-border-width-thin);
|
|
16
27
|
--rt-side-menu-transition-duration: var(--rt-duration-fast);
|
|
28
|
+
--rt-side-menu-rail-icon-size: var(--rt-icon-step-md);
|
|
29
|
+
--rt-side-menu-rail-gap: var(--rt-space-md);
|
|
30
|
+
--rt-side-menu-rail-bg: var(--rt-color-bg-surface);
|
|
31
|
+
--rt-side-menu-rail-border-width: var(--rt-side-menu-panel-border-width);
|
|
32
|
+
--rt-side-menu-panel-bg: var(--rt-color-bg-surface);
|
|
33
|
+
--rt-side-menu-panel-head-padding: var(--rt-space-sm);
|
|
34
|
+
--rt-side-menu-sub-list-padding-inline: var(--rt-space-2);
|
|
35
|
+
--rt-side-menu-empty-padding: var(--rt-space-md);
|
|
17
36
|
|
|
18
37
|
/* Натянутую рукой ширину ставит привязка хоста; без неё панель берёт ширину оформления. */
|
|
19
38
|
--rt-side-menu-panel-dragged-width: 0px;
|
|
@@ -34,8 +53,8 @@
|
|
|
34
53
|
height: 100%;
|
|
35
54
|
box-sizing: border-box;
|
|
36
55
|
flex: 0 0 var(--rt-side-menu-rail-width);
|
|
37
|
-
border-right: var(--rt-side-menu-
|
|
38
|
-
background: var(--rt-
|
|
56
|
+
border-right: var(--rt-side-menu-rail-border-width) solid var(--rt-color-border-default);
|
|
57
|
+
background: var(--rt-side-menu-rail-bg);
|
|
39
58
|
|
|
40
59
|
/* Отступ области прокрутки оставлял подписи 56 пикселей из 88, и слово рвалось посреди. */
|
|
41
60
|
.rt-scroll-area__body {
|
|
@@ -47,7 +66,7 @@
|
|
|
47
66
|
display: flex;
|
|
48
67
|
flex-direction: column;
|
|
49
68
|
align-items: center;
|
|
50
|
-
gap: var(--rt-
|
|
69
|
+
gap: var(--rt-side-menu-rail-gap);
|
|
51
70
|
padding-block: var(--rt-space-sm);
|
|
52
71
|
}
|
|
53
72
|
|
|
@@ -59,7 +78,7 @@
|
|
|
59
78
|
padding: 0;
|
|
60
79
|
border: 0;
|
|
61
80
|
background: transparent;
|
|
62
|
-
color:
|
|
81
|
+
color: var(--rt-side-menu-item-color);
|
|
63
82
|
cursor: pointer;
|
|
64
83
|
font: inherit;
|
|
65
84
|
gap: var(--rt-space-1);
|
|
@@ -75,17 +94,22 @@
|
|
|
75
94
|
|
|
76
95
|
&:hover .rt-side-menu__rail-icon,
|
|
77
96
|
&:active .rt-side-menu__rail-icon {
|
|
78
|
-
background: var(--rt-
|
|
97
|
+
background: var(--rt-side-menu-item-bg-hover);
|
|
79
98
|
}
|
|
80
99
|
|
|
81
100
|
&--active .rt-side-menu__rail-icon,
|
|
82
101
|
&--active:hover .rt-side-menu__rail-icon {
|
|
83
|
-
background: var(--rt-
|
|
84
|
-
color: var(--rt-
|
|
102
|
+
background: var(--rt-side-menu-item-bg-active);
|
|
103
|
+
color: var(--rt-side-menu-item-color-active);
|
|
85
104
|
}
|
|
86
105
|
}
|
|
87
106
|
|
|
107
|
+
/* Размер значка полосы переназначает ступень значка внутри коробки. Свойство меню объявлено
|
|
108
|
+
ступенью без запаса: пока приложение не задало ни его, ни ступени, оно пусто, и значок берёт
|
|
109
|
+
свой запасной шаг, как раньше. Круга нет — свойство меню разрешено на корне. */
|
|
88
110
|
&__rail-icon {
|
|
111
|
+
--rt-icon-step-md: var(--rt-side-menu-rail-icon-size);
|
|
112
|
+
|
|
89
113
|
display: flex;
|
|
90
114
|
width: 3.5rem;
|
|
91
115
|
height: 2rem;
|
|
@@ -103,10 +127,13 @@
|
|
|
103
127
|
text-align: center;
|
|
104
128
|
}
|
|
105
129
|
|
|
130
|
+
/* Подложка начинается после полосы: наведение на другой пункт полосы переключает подменю и
|
|
131
|
+
тогда, когда его держит поле поиска, как у первого кита. */
|
|
106
132
|
&__backdrop {
|
|
107
133
|
position: fixed;
|
|
108
134
|
z-index: var(--rt-z-dropdown);
|
|
109
135
|
inset: 0;
|
|
136
|
+
inset-inline-start: var(--rt-side-menu-rail-width);
|
|
110
137
|
}
|
|
111
138
|
|
|
112
139
|
&__panel {
|
|
@@ -121,7 +148,7 @@
|
|
|
121
148
|
flex-direction: column;
|
|
122
149
|
border-radius: 0 var(--rt-side-menu-panel-radius) var(--rt-side-menu-panel-radius) 0;
|
|
123
150
|
border-left: var(--rt-side-menu-panel-border-width) solid var(--rt-color-border-default);
|
|
124
|
-
background: var(--rt-
|
|
151
|
+
background: var(--rt-side-menu-panel-bg);
|
|
125
152
|
box-shadow: var(--rt-side-menu-panel-shadow);
|
|
126
153
|
|
|
127
154
|
&--held {
|
|
@@ -141,7 +168,7 @@
|
|
|
141
168
|
&__panel-head {
|
|
142
169
|
display: flex;
|
|
143
170
|
align-items: center;
|
|
144
|
-
padding: var(--rt-
|
|
171
|
+
padding: var(--rt-side-menu-panel-head-padding);
|
|
145
172
|
gap: var(--rt-space-2);
|
|
146
173
|
}
|
|
147
174
|
|
|
@@ -163,11 +190,11 @@
|
|
|
163
190
|
display: flex;
|
|
164
191
|
flex-direction: column;
|
|
165
192
|
padding-block-end: var(--rt-space-sm);
|
|
166
|
-
padding-inline: var(--rt-
|
|
193
|
+
padding-inline: var(--rt-side-menu-sub-list-padding-inline);
|
|
167
194
|
}
|
|
168
195
|
|
|
169
196
|
&__empty {
|
|
170
|
-
padding: var(--rt-
|
|
197
|
+
padding: var(--rt-side-menu-empty-padding);
|
|
171
198
|
color: var(--rt-color-text-muted);
|
|
172
199
|
font-size: var(--rt-text-xs);
|
|
173
200
|
}
|
|
@@ -238,7 +265,7 @@
|
|
|
238
265
|
border: 0;
|
|
239
266
|
border-radius: var(--rt-side-menu-item-radius);
|
|
240
267
|
background: transparent;
|
|
241
|
-
color:
|
|
268
|
+
color: var(--rt-side-menu-item-color);
|
|
242
269
|
cursor: pointer;
|
|
243
270
|
font: inherit;
|
|
244
271
|
font-size: var(--rt-text-sm);
|
|
@@ -251,7 +278,7 @@
|
|
|
251
278
|
text-decoration: none;
|
|
252
279
|
|
|
253
280
|
&:hover {
|
|
254
|
-
background: var(--rt-
|
|
281
|
+
background: var(--rt-side-menu-item-bg-hover);
|
|
255
282
|
}
|
|
256
283
|
|
|
257
284
|
&:focus-visible {
|
|
@@ -260,8 +287,8 @@
|
|
|
260
287
|
}
|
|
261
288
|
|
|
262
289
|
&--active {
|
|
263
|
-
background: var(--rt-
|
|
264
|
-
color: var(--rt-
|
|
290
|
+
background: var(--rt-side-menu-item-bg-active);
|
|
291
|
+
color: var(--rt-side-menu-item-color-active);
|
|
265
292
|
}
|
|
266
293
|
}
|
|
267
294
|
|
|
@@ -23,5 +23,39 @@
|
|
|
23
23
|
width: 100%;
|
|
24
24
|
height: 100%;
|
|
25
25
|
}
|
|
26
|
+
|
|
27
|
+
/* Вид первого кита так, как его задаёт приложение: свойства меню на меню, свойства строки на
|
|
28
|
+
строке, черта под строкой страницы раздела — по номеру пункта на строке. Трекинг строки — ручка без
|
|
29
|
+
объявления в ките: он задан привязкой стиля на коробке и доходит до строк наследованием. */
|
|
30
|
+
&--first-kit {
|
|
31
|
+
.rt-side-menu {
|
|
32
|
+
--rt-side-menu-rail-icon-size: var(--rt-size-6);
|
|
33
|
+
--rt-side-menu-rail-gap: var(--rt-space-sm);
|
|
34
|
+
--rt-side-menu-rail-border-width: 0;
|
|
35
|
+
--rt-side-menu-panel-head-padding: var(--rt-space-sm);
|
|
36
|
+
--rt-side-menu-sub-list-padding-inline: var(--rt-space-md);
|
|
37
|
+
--rt-side-menu-panel-bg: var(--rt-color-bg-subtle);
|
|
38
|
+
--rt-side-menu-item-color-active: var(--rt-color-text-primary);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.rt-side-menu-sub-item {
|
|
42
|
+
--rt-side-menu-sub-item-min-height: calc(var(--rt-size-10) + var(--rt-space-1));
|
|
43
|
+
--rt-side-menu-sub-item-font-size: var(--rt-text-md);
|
|
44
|
+
--rt-side-menu-sub-item-padding-end: var(--rt-space-md);
|
|
45
|
+
--rt-side-menu-sub-item-icon-size: var(--rt-size-6);
|
|
46
|
+
--rt-side-menu-sub-item-gap: calc(var(--rt-space-1) * 3);
|
|
47
|
+
--rt-side-menu-sub-item-folder-padding-start: calc(var(--rt-space-1) * 3);
|
|
48
|
+
--rt-side-menu-sub-item-chevron-color: var(--rt-color-text-primary);
|
|
49
|
+
--rt-side-menu-sub-item-button-radius: var(--rt-radius-full);
|
|
50
|
+
--rt-side-menu-sub-item-button-icon-size: var(--rt-size-5);
|
|
51
|
+
--rt-side-menu-sub-item-action-size: calc(var(--rt-size-6) + var(--rt-space-0-5));
|
|
52
|
+
--rt-side-menu-sub-item-favorite-size: var(--rt-size-8);
|
|
53
|
+
--rt-side-menu-sub-item-favorite-color: var(--rt-color-text-muted);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.rt-side-menu-sub-item:has(> [data-item-id='2']) {
|
|
57
|
+
border-bottom: 1px solid var(--rt-color-border-subtle);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
26
60
|
}
|
|
27
61
|
}
|