import { ChangeDetectionStrategy, Component, effect, inject, signal, ViewEncapsulation } from "@angular/core"; import { toSignal } from "@angular/core/rxjs-interop"; import { NavigationStart, Router } from "@angular/router"; import { filter } from "rxjs"; @Component({ selector: "sd-sidebar-container", changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, standalone: true, imports: [], host: { "[attr.data-sd-toggle]": "toggle()", }, template: `
`, styles: [ /* language=SCSS */ ` @use "../../../scss/commons/variables"; sd-sidebar-container { display: block; position: relative; height: 100%; padding-left: var(--sidebar-width); transition: padding-left 0.1s ease-out; &[data-sd-toggle="true"] { padding-left: 0; transition: padding-left 0.1s ease-in; } > ._backdrop { display: none; } } @media all and (max-width: variables.$breakpoint-mobile) { sd-sidebar-container { padding-left: 0; > ._backdrop { position: absolute; display: block; z-index: calc(var(--z-index-sidebar) - 1); top: 0; left: 0; width: 100%; height: 100%; background: var(--background-rev-color); opacity: 0; pointer-events: none; transition: opacity 0.3s ease-in-out; } &[data-sd-toggle="true"] { > ._backdrop { opacity: 0.6; pointer-events: auto; } } } } `, ], }) export class SdSidebarContainer { private readonly _router = inject(Router, { optional: true }); toggle = signal(false); private readonly _navStart = this._router ? toSignal(this._router.events.pipe(filter((e) => e instanceof NavigationStart))) : undefined; constructor() { const navStart = this._navStart; if (navStart) { effect(() => { if (navStart()) { this.toggle.set(false); } }); } } onBackdropClick(): void { this.toggle.update((v) => !v); } }