theme-lib
Version:
This is a simple example Angular Library published to npm.
867 lines • 72.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/*
* @license
* Copyright Akveo. All Rights Reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*/
import { Component, ElementRef, HostBinding, HostListener, Input, Renderer2, ViewChild, ViewContainerRef, Inject, PLATFORM_ID, forwardRef, } from '@angular/core';
import { isPlatformBrowser } from '@angular/common';
import { BehaviorSubject } from 'rxjs';
import { filter, takeWhile } from 'rxjs/operators';
import { convertToBoolProperty } from '../helpers';
import { NbThemeService } from '../../services/theme.service';
import { NbSpinnerService } from '../../services/spinner.service';
import { NbLayoutDirectionService } from '../../services/direction.service';
import { NbRestoreScrollTopHelper } from './restore-scroll-top.service';
import { NbLayoutScrollService } from '../../services/scroll.service';
import { NbLayoutRulerService } from '../../services/ruler.service';
import { NB_WINDOW, NB_DOCUMENT } from '../../theme.options';
import { NbOverlayContainerAdapter } from '../cdk/adapter/overlay-container-adapter';
/*
* A container component which determines a content position inside of the layout.
* The layout could contain unlimited columns (not including the sidebars).
*
* By default the columns are ordered from the left to the right,
* but it's also possible to overwrite this behavior by setting a `left` attribute to the column,
* moving it to the very first position:
*
* @stacked-example(Column Left, layout/layout-column-left.component)
*/
var NbLayoutColumnComponent = /** @class */ (function () {
function NbLayoutColumnComponent() {
}
Object.defineProperty(NbLayoutColumnComponent.prototype, "left", {
/*
* Move the column to the very left position in the layout.
* @param {boolean} val
*/
set: /*
* Move the column to the very left position in the layout.
* @param {boolean} val
*/
/**
* @param {?} val
* @return {?}
*/
function (val) {
this.leftValue = convertToBoolProperty(val);
this.startValue = false;
},
enumerable: true,
configurable: true
});
Object.defineProperty(NbLayoutColumnComponent.prototype, "start", {
/*
* Make columnt first in the layout.
* @param {boolean} val
*/
set: /*
* Make columnt first in the layout.
* @param {boolean} val
*/
/**
* @param {?} val
* @return {?}
*/
function (val) {
this.startValue = convertToBoolProperty(val);
this.leftValue = false;
},
enumerable: true,
configurable: true
});
NbLayoutColumnComponent.decorators = [
{ type: Component, args: [{
selector: 'nb-layout-column',
template: "\n <ng-content></ng-content>\n "
}] }
];
NbLayoutColumnComponent.propDecorators = {
leftValue: [{ type: HostBinding, args: ['class.left',] }],
startValue: [{ type: HostBinding, args: ['class.start',] }],
left: [{ type: Input }],
start: [{ type: Input }]
};
return NbLayoutColumnComponent;
}());
export { NbLayoutColumnComponent };
if (false) {
/** @type {?} */
NbLayoutColumnComponent.prototype.leftValue;
/** @type {?} */
NbLayoutColumnComponent.prototype.startValue;
}
/*
* Page header component.
* Located on top of the page above the layout columns and sidebars.
* Could be made `fixed` by setting the corresponding property. In the fixed mode the header becomes
* sticky to the top of the nb-layout (to of the page). Here's an example:
*
* @stacked-example(Fixed Header, layout/layout-fixed-header.component)
*
* In a pair with sidebar it is possible to setup a configuration when header is placed on a side of the sidebar
* and not on top of it. To achieve this simply put a `subheader` property to the header like this:
* ```html
* <nb-layout-header subheader></nb-layout-header>
* ```
* @stacked-example(Subheader, layout/layout-sidebar-subheader.component)
* Note that in such configuration sidebar shadow is removed and header cannot be make `fixed`.
*
* Same way you can put both `fixed` and `clipped` headers adding creating a sub-header for your app:
*
* @stacked-example(Subheader, layout/layout-subheader.component)
*
* @styles
*
* header-font-family
* header-line-height
* header-fg
* header-bg
* header-height
* header-padding
* header-shadow
*/
var NbLayoutHeaderComponent = /** @class */ (function () {
// tslint:disable-next-line
function NbLayoutHeaderComponent(layout) {
this.layout = layout;
}
Object.defineProperty(NbLayoutHeaderComponent.prototype, "fixed", {
/*
* Makes the header sticky to the top of the nb-layout.
* @param {boolean} val
*/
set: /*
* Makes the header sticky to the top of the nb-layout.
* @param {boolean} val
*/
/**
* @param {?} val
* @return {?}
*/
function (val) {
this.fixedValue = convertToBoolProperty(val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(NbLayoutHeaderComponent.prototype, "subheader", {
/*
* Places header on a side of the sidebar, and not above.
* Disables fixed mode for this header and remove a shadow from the sidebar.
* @param {boolean} val
*/
set: /*
* Places header on a side of the sidebar, and not above.
* Disables fixed mode for this header and remove a shadow from the sidebar.
* @param {boolean} val
*/
/**
* @param {?} val
* @return {?}
*/
function (val) {
this.subheaderValue = convertToBoolProperty(val);
this.fixedValue = false;
this.layout.withSubheader = this.subheaderValue;
},
enumerable: true,
configurable: true
});
NbLayoutHeaderComponent.decorators = [
{ type: Component, args: [{
selector: 'nb-layout-header',
template: "\n <nav [class.fixed]=\"fixedValue\">\n <ng-content></ng-content>\n </nav>\n "
}] }
];
/** @nocollapse */
NbLayoutHeaderComponent.ctorParameters = function () { return [
{ type: NbLayoutComponent, decorators: [{ type: Inject, args: [forwardRef(function () { return NbLayoutComponent; }),] }] }
]; };
NbLayoutHeaderComponent.propDecorators = {
fixedValue: [{ type: HostBinding, args: ['class.fixed',] }],
subheaderValue: [{ type: HostBinding, args: ['class.subheader',] }],
fixed: [{ type: Input }],
subheader: [{ type: Input }]
};
return NbLayoutHeaderComponent;
}());
export { NbLayoutHeaderComponent };
if (false) {
/** @type {?} */
NbLayoutHeaderComponent.prototype.fixedValue;
/** @type {?} */
NbLayoutHeaderComponent.prototype.subheaderValue;
/**
* @type {?}
* @private
*/
NbLayoutHeaderComponent.prototype.layout;
}
/*
* Page footer.
* Located under the nb-layout content (specifically, under the columns).
* Could be made `fixed`, becoming sticky to the bottom of the view port (window).
*
* @styles
*
* footer-height
* footer-padding
* footer-fg
* footer-bg
* footer-separator
* footer-shadow
*/
var NbLayoutFooterComponent = /** @class */ (function () {
function NbLayoutFooterComponent() {
}
Object.defineProperty(NbLayoutFooterComponent.prototype, "fixed", {
/*
* Makes the footer sticky to the bottom of the window.
* @param {boolean} val
*/
set: /*
* Makes the footer sticky to the bottom of the window.
* @param {boolean} val
*/
/**
* @param {?} val
* @return {?}
*/
function (val) {
this.fixedValue = convertToBoolProperty(val);
},
enumerable: true,
configurable: true
});
NbLayoutFooterComponent.decorators = [
{ type: Component, args: [{
selector: 'nb-layout-footer',
template: "\n <nav [class.fixed]=\"fixedValue\">\n <ng-content></ng-content>\n </nav>\n "
}] }
];
NbLayoutFooterComponent.propDecorators = {
fixedValue: [{ type: HostBinding, args: ['class.fixed',] }],
fixed: [{ type: Input }]
};
return NbLayoutFooterComponent;
}());
export { NbLayoutFooterComponent };
if (false) {
/** @type {?} */
NbLayoutFooterComponent.prototype.fixedValue;
}
/*
* Layout container component.
* When using with Nebular Theme System it is required that all child components should be placed inside.
*
* Basic example of two column layout with header:
*
* @stacked-example(Showcase, layout/layout-showcase.component)
*
* Can contain the following components inside:
*
* ```html
* <nb-layout>
* <nb-layout-header></nb-layout-header>
* <nb-layout-footer></nb-layout-column>
* <nb-layout-column></nb-layout-column>
* <nb-sidebar></nb-sidebar>
* </nb-layout>
* ```
* ### Installation
*
* Import `NbLayoutModule.forRoot()` to your app module.
* ```ts
* @NgModule({
* imports: [
* // ...
* NbLayoutModule.forRoot(),
* ],
* })
* export class AppModule { }
* ```
* and `NbLayoutModule` to your feature module where the component should be shown:
* ```ts
* @NgModule({
* imports: [
* // ...
* NbLayoutModule,
* ],
* })
* export class PageModule { }
* ```
* ### Usage
* By default the layout fills up the whole view-port.
* The window scrollbars are disabled on the body and moved inside of the nb-layout, so that the scrollbars
* won't mess with the fixed nb-header.
*
* The child components are projected into a flexible layout structure allowing to adjust the layout behavior
* based on the settings provided.
*
* The layout content (columns) becomes centered when the window width is more than
* the value specified in the theme variable `layout-content-width`.
*
* The layout also contains the area on the very top (the first child of the nb-layout), which could be used
* to dynamically append some components like modals or spinners/loaders
* so that they are located on top of the elements hierarchy.
* More details are under the `ThemeService` section.
*
* The layout component is also responsible for changing application themes.
* It listens to the `themeChange` event and change a theme CSS class appended to body.
* Based on the class appended, specific CSS-theme is applied to the application.
* More details of the Theme System could be found here [Enabling Theme System](#/docs/concepts/theme-system)
*
* A simple layout with footer:
*
* @stacked-example(Layout With Footer, layout/layout-w-footer.component)
*
* It is possible to ask the layout to center the columns (notice: we added a `center` attribute
* to the layout:
*
* ```html
* <nb-layout center>
* <nb-layout-header>Awesome Company</nb-layout-header>
*
* <nb-layout-column>
* Hello World!
* </nb-layout-column>
*
* <nb-layout-footer>Contact us</nb-layout-footer>
* </nb-layout>
* ```
*
* @styles
*
* layout-font-family
* layout-font-size
* layout-line-height
* layout-fg
* layout-bg
* layout-min-height
* layout-content-width
* layout-window-mode-min-width
* layout-window-mode-max-width: window mode only, after this value layout turns into a floating window
* layout-window-mode-bg: window mode only, background
* layout-window-mode-padding-top: window mode only, max padding from top
* layout-window-shadow: window mode shadow
* layout-padding
* layout-medium-padding
* layout-small-padding
*/
var NbLayoutComponent = /** @class */ (function () {
function NbLayoutComponent(themeService, spinnerService, elementRef, renderer, window, document, platformId, layoutDirectionService, scrollService, rulerService, scrollTop, overlayContainer) {
var _this = this;
this.themeService = themeService;
this.spinnerService = spinnerService;
this.elementRef = elementRef;
this.renderer = renderer;
this.window = window;
this.document = document;
this.platformId = platformId;
this.layoutDirectionService = layoutDirectionService;
this.scrollService = scrollService;
this.rulerService = rulerService;
this.scrollTop = scrollTop;
this.overlayContainer = overlayContainer;
this.centerValue = false;
this.restoreScrollTopValue = true;
this.windowModeValue = false;
this.withScrollValue = false;
this.withSubheader = false;
this.afterViewInit$ = new BehaviorSubject(null);
this.alive = true;
this.registerAsOverlayContainer();
this.themeService.onThemeChange()
.pipe(takeWhile(function () { return _this.alive; }))
.subscribe(function (theme) {
/** @type {?} */
var body = _this.document.getElementsByTagName('body')[0];
if (theme.previous) {
_this.renderer.removeClass(body, "nb-theme-" + theme.previous);
}
_this.renderer.addClass(body, "nb-theme-" + theme.name);
});
this.themeService.onAppendLayoutClass()
.pipe(takeWhile(function () { return _this.alive; }))
.subscribe(function (className) {
_this.renderer.addClass(_this.elementRef.nativeElement, className);
});
this.themeService.onRemoveLayoutClass()
.pipe(takeWhile(function () { return _this.alive; }))
.subscribe(function (className) {
_this.renderer.removeClass(_this.elementRef.nativeElement, className);
});
this.spinnerService.registerLoader(new Promise(function (resolve, reject) {
_this.afterViewInit$
.pipe(takeWhile(function () { return _this.alive; }))
.subscribe(function (_) { return resolve(); });
}));
this.spinnerService.load();
this.rulerService.onGetDimensions()
.pipe(takeWhile(function () { return _this.alive; }))
.subscribe(function (_a) {
var listener = _a.listener;
listener.next(_this.getDimensions());
listener.complete();
});
this.scrollService.onGetPosition()
.pipe(takeWhile(function () { return _this.alive; }))
.subscribe(function (_a) {
var listener = _a.listener;
listener.next(_this.getScrollPosition());
listener.complete();
});
this.scrollTop
.shouldRestore()
.pipe(filter(function () { return _this.restoreScrollTopValue; }), takeWhile(function () { return _this.alive; }))
.subscribe(function () {
_this.scroll(0, 0);
});
if (isPlatformBrowser(this.platformId)) {
// trigger first time so that after the change we have the initial value
this.themeService.changeWindowWidth(this.window.innerWidth);
}
}
Object.defineProperty(NbLayoutComponent.prototype, "center", {
/*
* Defines whether the layout columns will be centered after some width
* @param {boolean} val
*/
set: /*
* Defines whether the layout columns will be centered after some width
* @param {boolean} val
*/
/**
* @param {?} val
* @return {?}
*/
function (val) {
this.centerValue = convertToBoolProperty(val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(NbLayoutComponent.prototype, "windowMode", {
/*
* Defines whether the layout enters a 'window' mode, when the layout content (including sidebars and fixed header)
* becomes centered by width with a margin from the top of the screen, like a floating window.
* Automatically enables `withScroll` mode, as in the window mode scroll must be inside the layout and cannot be on
* window. (TODO: check this)
* @param {boolean} val
*/
set: /*
* Defines whether the layout enters a 'window' mode, when the layout content (including sidebars and fixed header)
* becomes centered by width with a margin from the top of the screen, like a floating window.
* Automatically enables `withScroll` mode, as in the window mode scroll must be inside the layout and cannot be on
* window. (TODO: check this)
* @param {boolean} val
*/
/**
* @param {?} val
* @return {?}
*/
function (val) {
this.windowModeValue = convertToBoolProperty(val);
this.withScroll = this.windowModeValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(NbLayoutComponent.prototype, "withScroll", {
/*
* Defines whether to move the scrollbars to layout or leave it at the body level.
* Automatically set to true when `windowMode` is enabled.
* @param {boolean} val
*/
set: /*
* Defines whether to move the scrollbars to layout or leave it at the body level.
* Automatically set to true when `windowMode` is enabled.
* @param {boolean} val
*/
/**
* @param {?} val
* @return {?}
*/
function (val) {
this.withScrollValue = convertToBoolProperty(val);
// TODO: is this the best way of doing it? as we don't have access to body from theme styles
// TODO: add e2e test
/** @type {?} */
var body = this.document.getElementsByTagName('body')[0];
if (this.withScrollValue) {
this.renderer.setStyle(body, 'overflow', 'hidden');
}
else {
this.renderer.setStyle(body, 'overflow', 'initial');
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(NbLayoutComponent.prototype, "restoreScrollTop", {
/*
* Restores scroll to the top of the page after navigation
* @param {boolean} val
*/
set: /*
* Restores scroll to the top of the page after navigation
* @param {boolean} val
*/
/**
* @param {?} val
* @return {?}
*/
function (val) {
this.restoreScrollTopValue = convertToBoolProperty(val);
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
NbLayoutComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
var _this = this;
this.layoutDirectionService.onDirectionChange()
.pipe(takeWhile(function () { return _this.alive; }))
.subscribe(function (direction) {
_this.renderer.setProperty(_this.document, 'dir', direction);
});
this.scrollService.onManualScroll()
.pipe(takeWhile(function () { return _this.alive; }))
.subscribe(function (_a) {
var x = _a.x, y = _a.y;
return _this.scroll(x, y);
});
this.afterViewInit$.next(true);
};
/**
* @return {?}
*/
NbLayoutComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.alive = false;
this.unregisterAsOverlayContainer();
};
/**
* @param {?} $event
* @return {?}
*/
NbLayoutComponent.prototype.onScroll = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
this.scrollService.fireScrollChange($event);
};
/**
* @param {?} event
* @return {?}
*/
NbLayoutComponent.prototype.onResize = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.themeService.changeWindowWidth(event.target.innerWidth);
};
/*
* Returns scroll and client height/width
*
* Depending on the current scroll mode (`withScroll=true`) returns sizes from the body element
* or from the `.scrollable-container`
* @returns {NbLayoutDimensions}
*/
/*
* Returns scroll and client height/width
*
* Depending on the current scroll mode (`withScroll=true`) returns sizes from the body element
* or from the `.scrollable-container`
* @returns {NbLayoutDimensions}
*/
/**
* @return {?}
*/
NbLayoutComponent.prototype.getDimensions = /*
* Returns scroll and client height/width
*
* Depending on the current scroll mode (`withScroll=true`) returns sizes from the body element
* or from the `.scrollable-container`
* @returns {NbLayoutDimensions}
*/
/**
* @return {?}
*/
function () {
/** @type {?} */
var clientWidth;
/** @type {?} */
var clientHeight;
/** @type {?} */
var scrollWidth;
/** @type {?} */
var scrollHeight = 0;
if (this.withScrollValue) {
/** @type {?} */
var container = this.scrollableContainerRef.nativeElement;
clientWidth = container.clientWidth;
clientHeight = container.clientHeight;
scrollWidth = container.scrollWidth;
scrollHeight = container.scrollHeight;
}
else {
var _a = this.document, documentElement = _a.documentElement, body = _a.body;
clientWidth = documentElement.clientWidth || body.clientWidth;
clientHeight = documentElement.clientHeight || body.clientHeight;
scrollWidth = documentElement.scrollWidth || body.scrollWidth;
scrollHeight = documentElement.scrollHeight || body.scrollHeight;
}
return {
clientWidth: clientWidth,
clientHeight: clientHeight,
scrollWidth: scrollWidth,
scrollHeight: scrollHeight,
};
};
/*
* Returns scroll position of current scroll container.
*
* If `withScroll` = true, returns scroll position of the `.scrollable-container` element,
* otherwise - of the scrollable element of the window (which may be different depending of a browser)
*
* @returns {NbScrollPosition}
*/
/*
* Returns scroll position of current scroll container.
*
* If `withScroll` = true, returns scroll position of the `.scrollable-container` element,
* otherwise - of the scrollable element of the window (which may be different depending of a browser)
*
* @returns {NbScrollPosition}
*/
/**
* @return {?}
*/
NbLayoutComponent.prototype.getScrollPosition = /*
* Returns scroll position of current scroll container.
*
* If `withScroll` = true, returns scroll position of the `.scrollable-container` element,
* otherwise - of the scrollable element of the window (which may be different depending of a browser)
*
* @returns {NbScrollPosition}
*/
/**
* @return {?}
*/
function () {
if (this.withScrollValue) {
/** @type {?} */
var container = this.scrollableContainerRef.nativeElement;
return { x: container.scrollLeft, y: container.scrollTop };
}
/** @type {?} */
var documentRect = this.document.documentElement.getBoundingClientRect();
/** @type {?} */
var x = -documentRect.left || this.document.body.scrollLeft || this.window.scrollX ||
this.document.documentElement.scrollLeft || 0;
/** @type {?} */
var y = -documentRect.top || this.document.body.scrollTop || this.window.scrollY ||
this.document.documentElement.scrollTop || 0;
return { x: x, y: y };
};
/**
* @protected
* @return {?}
*/
NbLayoutComponent.prototype.registerAsOverlayContainer = /**
* @protected
* @return {?}
*/
function () {
if (this.overlayContainer.setContainer) {
this.overlayContainer.setContainer(this.elementRef.nativeElement);
}
};
/**
* @protected
* @return {?}
*/
NbLayoutComponent.prototype.unregisterAsOverlayContainer = /**
* @protected
* @return {?}
*/
function () {
if (this.overlayContainer.clearContainer) {
this.overlayContainer.clearContainer();
}
};
/**
* @private
* @param {?=} x
* @param {?=} y
* @return {?}
*/
NbLayoutComponent.prototype.scroll = /**
* @private
* @param {?=} x
* @param {?=} y
* @return {?}
*/
function (x, y) {
if (x === void 0) { x = null; }
if (y === void 0) { y = null; }
var _a = this.getScrollPosition(), currentX = _a.x, currentY = _a.y;
x = x == null ? currentX : x;
y = y == null ? currentY : y;
if (!isPlatformBrowser(this.platformId)) {
return;
}
if (this.withScrollValue) {
/** @type {?} */
var scrollable = this.scrollableContainerRef.nativeElement;
if (scrollable.scrollTo) {
scrollable.scrollTo(x, y);
}
else {
scrollable.scrollLeft = x;
scrollable.scrollTop = y;
}
}
else {
this.window.scrollTo(x, y);
}
};
NbLayoutComponent.decorators = [
{ type: Component, args: [{
selector: 'nb-layout',
template: "\n <div class=\"scrollable-container\" #scrollableContainer (scroll)=\"onScroll($event)\">\n <div class=\"layout\">\n <ng-content select=\"nb-layout-header:not([subheader])\"></ng-content>\n <div class=\"layout-container\">\n <ng-content select=\"nb-sidebar\"></ng-content>\n <div class=\"content\" [class.center]=\"centerValue\">\n <ng-content select=\"nb-layout-header[subheader]\"></ng-content>\n <div class=\"columns\">\n <ng-content select=\"nb-layout-column\"></ng-content>\n </div>\n <ng-content select=\"nb-layout-footer\"></ng-content>\n </div>\n </div>\n </div>\n </div>\n ",
styles: [":host{-webkit-font-smoothing:antialiased}[dir=ltr] :host{text-align:left}[dir=rtl] :host{text-align:right}:host .layout{display:flex;flex-direction:column}:host /deep/ nb-layout-header{display:block}:host /deep/ nb-layout-header nav{align-items:center;justify-content:flex-start;display:flex}:host /deep/ nb-layout-header.fixed{position:fixed;left:0;right:0;z-index:1040}:host .layout-container{display:flex;flex:1;-ms-flex:1 1 auto;flex-direction:row}[dir=ltr] :host .layout-container /deep/ nb-sidebar.left{order:0}[dir=rtl] :host .layout-container /deep/ nb-sidebar.left{order:2}[dir=ltr] :host .layout-container /deep/ nb-sidebar.right{order:2}[dir=rtl] :host .layout-container /deep/ nb-sidebar.right{order:0}:host .layout-container /deep/ nb-sidebar.end{order:2}:host .layout-container /deep/ nb-sidebar .fixed{position:fixed;width:100%;overflow-y:auto;height:100%}:host .layout-container .content{display:flex;flex:1;-ms-flex:1 1 auto;flex-direction:column;min-width:0}:host .layout-container .content.center{max-width:100%;position:relative;margin-left:auto;margin-right:auto}:host .layout-container .content .columns{display:flex;flex:1;-ms-flex:1 1 auto;flex-direction:row;width:100%}:host .layout-container .content .columns /deep/ nb-layout-column{order:1;flex:1 0;min-width:0}[dir=ltr] :host .layout-container .content .columns /deep/ nb-layout-column.left{order:0}[dir=rtl] :host .layout-container .content .columns /deep/ nb-layout-column.left{order:2}:host .layout-container .content .columns /deep/ nb-layout-column.start{order:0}:host .layout-container .content /deep/ nb-layout-footer{display:block;margin-top:auto}:host .layout-container .content /deep/ nb-layout-footer nav{justify-content:center;display:flex}"]
}] }
];
/** @nocollapse */
NbLayoutComponent.ctorParameters = function () { return [
{ type: NbThemeService },
{ type: NbSpinnerService },
{ type: ElementRef },
{ type: Renderer2 },
{ type: undefined, decorators: [{ type: Inject, args: [NB_WINDOW,] }] },
{ type: undefined, decorators: [{ type: Inject, args: [NB_DOCUMENT,] }] },
{ type: Object, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] },
{ type: NbLayoutDirectionService },
{ type: NbLayoutScrollService },
{ type: NbLayoutRulerService },
{ type: NbRestoreScrollTopHelper },
{ type: NbOverlayContainerAdapter }
]; };
NbLayoutComponent.propDecorators = {
windowModeValue: [{ type: HostBinding, args: ['class.window-mode',] }],
withScrollValue: [{ type: HostBinding, args: ['class.with-scroll',] }],
withSubheader: [{ type: HostBinding, args: ['class.with-subheader',] }],
center: [{ type: Input }],
windowMode: [{ type: Input }],
withScroll: [{ type: Input }],
restoreScrollTop: [{ type: Input }],
veryTopRef: [{ type: ViewChild, args: ['layoutTopDynamicArea', { read: ViewContainerRef },] }],
scrollableContainerRef: [{ type: ViewChild, args: ['scrollableContainer', { read: ElementRef },] }],
onScroll: [{ type: HostListener, args: ['window:scroll', ['$event'],] }],
onResize: [{ type: HostListener, args: ['window:resize', ['$event'],] }]
};
return NbLayoutComponent;
}());
export { NbLayoutComponent };
if (false) {
/** @type {?} */
NbLayoutComponent.prototype.centerValue;
/** @type {?} */
NbLayoutComponent.prototype.restoreScrollTopValue;
/** @type {?} */
NbLayoutComponent.prototype.windowModeValue;
/** @type {?} */
NbLayoutComponent.prototype.withScrollValue;
/** @type {?} */
NbLayoutComponent.prototype.withSubheader;
/** @type {?} */
NbLayoutComponent.prototype.veryTopRef;
/** @type {?} */
NbLayoutComponent.prototype.scrollableContainerRef;
/**
* @type {?}
* @protected
*/
NbLayoutComponent.prototype.afterViewInit$;
/**
* @type {?}
* @private
*/
NbLayoutComponent.prototype.alive;
/**
* @type {?}
* @protected
*/
NbLayoutComponent.prototype.themeService;
/**
* @type {?}
* @protected
*/
NbLayoutComponent.prototype.spinnerService;
/**
* @type {?}
* @protected
*/
NbLayoutComponent.prototype.elementRef;
/**
* @type {?}
* @protected
*/
NbLayoutComponent.prototype.renderer;
/**
* @type {?}
* @protected
*/
NbLayoutComponent.prototype.window;
/**
* @type {?}
* @protected
*/
NbLayoutComponent.prototype.document;
/**
* @type {?}
* @protected
*/
NbLayoutComponent.prototype.platformId;
/**
* @type {?}
* @protected
*/
NbLayoutComponent.prototype.layoutDirectionService;
/**
* @type {?}
* @protected
*/
NbLayoutComponent.prototype.scrollService;
/**
* @type {?}
* @protected
*/
NbLayoutComponent.prototype.rulerService;
/**
* @type {?}
* @protected
*/
NbLayoutComponent.prototype.scrollTop;
/**
* @type {?}
* @protected
*/
NbLayoutComponent.prototype.overlayContainer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL3RoZW1lLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL2xheW91dC9sYXlvdXQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQU1BLE9BQU8sRUFDVSxTQUFTLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUN0RSxTQUFTLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsVUFBVSxHQUN4RSxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFbkQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUM1RSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN4RSxPQUFPLEVBQW9CLHFCQUFxQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDeEYsT0FBTyxFQUFzQixvQkFBb0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3hGLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDN0QsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sMENBQTBDLENBQUM7Ozs7Ozs7Ozs7O0FBWXJGO0lBQUE7SUE4QkEsQ0FBQztJQWZDLHNCQUNJLHlD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cUJBQXFCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFOzJCQWdIckQsWUFBWSxTQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQzsyQkFLeEMsWUFBWSxTQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQzs7SUE4RjNDLHdCQUFDO0NBQUEsQUFwU0QsSUFvU0M7U0EvUVksaUJBQWlCOzs7SUFFNUIsd0NBQTZCOztJQUM3QixrREFBc0M7O0lBRXRDLDRDQUFtRTs7SUFDbkUsNENBQW1FOztJQUNuRSwwQ0FBb0U7O0lBb0RwRSx1Q0FBNEY7O0lBQzVGLG1EQUEyRjs7Ozs7SUFFM0YsMkNBQXFEOzs7OztJQUVyRCxrQ0FBOEI7Ozs7O0lBRzVCLHlDQUFzQzs7Ozs7SUFDdEMsMkNBQTBDOzs7OztJQUMxQyx1Q0FBZ0M7Ozs7O0lBQ2hDLHFDQUE2Qjs7Ozs7SUFDN0IsbUNBQW1DOzs7OztJQUNuQyxxQ0FBdUM7Ozs7O0lBQ3ZDLHVDQUFpRDs7Ozs7SUFDakQsbURBQTBEOzs7OztJQUMxRCwwQ0FBOEM7Ozs7O0lBQzlDLHlDQUE0Qzs7Ozs7SUFDNUMsc0NBQTZDOzs7OztJQUM3Qyw2Q0FBcUQiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgQWt2ZW8uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcbiAqL1xyXG5cclxuaW1wb3J0IHtcclxuICBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEhvc3RCaW5kaW5nLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkRlc3Ryb3ksXHJcbiAgUmVuZGVyZXIyLCBWaWV3Q2hpbGQsIFZpZXdDb250YWluZXJSZWYsIEluamVjdCwgUExBVEZPUk1fSUQsIGZvcndhcmRSZWYsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGZpbHRlciwgdGFrZVdoaWxlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuaW1wb3J0IHsgY29udmVydFRvQm9vbFByb3BlcnR5IH0gZnJvbSAnLi4vaGVscGVycyc7XHJcbmltcG9ydCB7IE5iVGhlbWVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdGhlbWUuc2VydmljZSc7XHJcbmltcG9ydCB7IE5iU3Bpbm5lclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zcGlubmVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOYkxheW91dERpcmVjdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kaXJlY3Rpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IE5iUmVzdG9yZVNjcm9sbFRvcEhlbHBlciB9IGZyb20gJy4vcmVzdG9yZS1zY3JvbGwtdG9wLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOYlNjcm9sbFBvc2l0aW9uLCBOYkxheW91dFNjcm9sbFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zY3JvbGwuc2VydmljZSc7XHJcbmltcG9ydCB7IE5iTGF5b3V0RGltZW5zaW9ucywgTmJMYXlvdXRSdWxlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9ydWxlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTkJfV0lORE9XLCBOQl9ET0NVTUVOVCB9IGZyb20gJy4uLy4uL3RoZW1lLm9wdGlvbnMnO1xyXG5pbXBvcnQgeyBOYk92ZXJsYXlDb250YWluZXJBZGFwdGVyIH0gZnJvbSAnLi4vY2RrL2FkYXB0ZXIvb3ZlcmxheS1jb250YWluZXItYWRhcHRlcic7XHJcblxyXG4vKlxyXG4gKiBBIGNvbnRhaW5lciBjb21wb25lbnQgd2hpY2ggZGV0ZXJtaW5lcyBhIGNvbnRlbnQgcG9zaXRpb24gaW5zaWRlIG9mIHRoZSBsYXlvdXQuXHJcbiAqIFRoZSBsYXlvdXQgY291bGQgY29udGFpbiB1bmxpbWl0ZWQgY29sdW1ucyAobm90IGluY2x1ZGluZyB0aGUgc2lkZWJhcnMpLlxyXG4gKlxyXG4gKiBCeSBkZWZhdWx0IHRoZSBjb2x1bW5zIGFyZSBvcmRlcmVkIGZyb20gdGhlIGxlZnQgdG8gdGhlIHJpZ2h0LFxyXG4gKiBidXQgaXQncyBhbHNvIHBvc3NpYmxlIHRvIG92ZXJ3cml0ZSB0aGlzIGJlaGF2aW9yIGJ5IHNldHRpbmcgYSBgbGVmdGAgYXR0cmlidXRlIHRvIHRoZSBjb2x1bW4sXHJcbiAqIG1vdmluZyBpdCB0byB0aGUgdmVyeSBmaXJzdCBwb3NpdGlvbjpcclxuICpcclxuICogQHN0YWNrZWQtZXhhbXBsZShDb2x1bW4gTGVmdCwgbGF5b3V0L2xheW91dC1jb2x1bW4tbGVmdC5jb21wb25lbnQpXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ25iLWxheW91dC1jb2x1bW4nLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XHJcbiAgYCxcclxufSlcclxuZXhwb3J0IGNsYXNzIE5iTGF5b3V0Q29sdW1uQ29tcG9uZW50IHtcclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5sZWZ0JykgbGVmdFZhbHVlOiBib29sZWFuO1xyXG4gIEBIb3N0QmluZGluZygnY2xhc3Muc3RhcnQnKSBzdGFydFZhbHVlOiBib29sZWFuO1xyXG5cclxuICAvKlxyXG4gICAqIE1vdmUgdGhlIGNvbHVtbiB0byB0aGUgdmVyeSBsZWZ0IHBvc2l0aW9uIGluIHRoZSBsYXlvdXQuXHJcbiAgICogQHBhcmFtIHtib29sZWFufSB2YWxcclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCBsZWZ0KHZhbDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5sZWZ0VmFsdWUgPSBjb252ZXJ0VG9Cb29sUHJvcGVydHkodmFsKTtcclxuICAgIHRoaXMuc3RhcnRWYWx1ZSA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBNYWtlIGNvbHVtbnQgZmlyc3QgaW4gdGhlIGxheW91dC