/** * @license * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.io/license */ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, ContentChildren, forwardRef, Inject, Input, ViewEncapsulation, QueryList, ElementRef, NgZone, } from '@angular/core'; import {MatDrawer, MatDrawerContainer, MatDrawerContent} from './drawer'; import {matDrawerAnimations} from './drawer-animations'; import {coerceBooleanProperty, coerceNumberProperty} from '@angular/cdk/coercion'; import {ScrollDispatcher} from '@angular/cdk/scrolling'; @Component({ moduleId: module.id, selector: 'mat-sidenav-content', template: '', host: { 'class': 'mat-drawer-content mat-sidenav-content', '[style.margin-left.px]': '_container._contentMargins.left', '[style.margin-right.px]': '_container._contentMargins.right', }, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, }) export class MatSidenavContent extends MatDrawerContent { constructor( changeDetectorRef: ChangeDetectorRef, @Inject(forwardRef(() => MatSidenavContainer)) container: MatSidenavContainer, elementRef: ElementRef, scrollDispatcher: ScrollDispatcher, ngZone: NgZone) { super(changeDetectorRef, container, elementRef, scrollDispatcher, ngZone); } } @Component({ moduleId: module.id, selector: 'mat-sidenav', exportAs: 'matSidenav', templateUrl: 'drawer.html', animations: [matDrawerAnimations.transformDrawer], host: { 'class': 'mat-drawer mat-sidenav', 'tabIndex': '-1', // must prevent the browser from aligning text based on value '[attr.align]': 'null', '[class.mat-drawer-end]': 'position === "end"', '[class.mat-drawer-over]': 'mode === "over"', '[class.mat-drawer-push]': 'mode === "push"', '[class.mat-drawer-side]': 'mode === "side"', '[class.mat-drawer-opened]': 'opened', '[class.mat-sidenav-fixed]': 'fixedInViewport', '[style.top.px]': 'fixedInViewport ? fixedTopGap : null', '[style.bottom.px]': 'fixedInViewport ? fixedBottomGap : null', }, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, }) export class MatSidenav extends MatDrawer { /** Whether the sidenav is fixed in the viewport. */ @Input() get fixedInViewport(): boolean { return this._fixedInViewport; } set fixedInViewport(value) { this._fixedInViewport = coerceBooleanProperty(value); } private _fixedInViewport = false; /** * The gap between the top of the sidenav and the top of the viewport when the sidenav is in fixed * mode. */ @Input() get fixedTopGap(): number { return this._fixedTopGap; } set fixedTopGap(value) { this._fixedTopGap = coerceNumberProperty(value); } private _fixedTopGap = 0; /** * The gap between the bottom of the sidenav and the bottom of the viewport when the sidenav is in * fixed mode. */ @Input() get fixedBottomGap(): number { return this._fixedBottomGap; } set fixedBottomGap(value) { this._fixedBottomGap = coerceNumberProperty(value); } private _fixedBottomGap = 0; } @Component({ moduleId: module.id, selector: 'mat-sidenav-container', exportAs: 'matSidenavContainer', templateUrl: 'sidenav-container.html', styleUrls: ['drawer.css'], host: { 'class': 'mat-drawer-container mat-sidenav-container', '[class.mat-drawer-container-explicit-backdrop]': '_backdropOverride', }, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, }) export class MatSidenavContainer extends MatDrawerContainer { @ContentChildren(MatSidenav) _drawers: QueryList; @ContentChild(MatSidenavContent, {static: false}) _content: MatSidenavContent; }