@theseam/ui-common 0.3.11 → 0.3.12-beta.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.
Files changed (74) hide show
  1. package/breadcrumbs/_breadcrumbs-theme.scss +3 -3
  2. package/breadcrumbs/breadcrumbs/breadcrumbs.component.scss +10 -10
  3. package/bundles/theseam-ui-common-framework.umd.js +899 -47
  4. package/bundles/theseam-ui-common-framework.umd.js.map +1 -1
  5. package/bundles/theseam-ui-common-layout.umd.js +14 -5
  6. package/bundles/theseam-ui-common-layout.umd.js.map +1 -1
  7. package/bundles/theseam-ui-common-menu.umd.js +4 -0
  8. package/bundles/theseam-ui-common-menu.umd.js.map +1 -1
  9. package/esm2015/framework/base-layout/base-layout.component.js +12 -4
  10. package/esm2015/framework/base-layout/base-layout.module.js +4 -1
  11. package/esm2015/framework/base-layout/directives/base-layout-nav-toggle.directive.js +17 -3
  12. package/esm2015/framework/base-layout/directives/base-layout-side-bar-header.directive.js +15 -0
  13. package/esm2015/framework/nav/horizontal-nav/horizontal-nav.component.js +68 -0
  14. package/esm2015/framework/nav/index.js +6 -0
  15. package/esm2015/framework/nav/nav-item/nav-item.component.js +169 -0
  16. package/esm2015/framework/nav/nav-utils.js +105 -0
  17. package/esm2015/framework/nav/nav.models.js +2 -0
  18. package/esm2015/framework/nav/nav.module.js +42 -0
  19. package/esm2015/framework/nav/nav.service.js +175 -0
  20. package/esm2015/framework/public-api.js +2 -1
  21. package/esm2015/framework/side-nav/side-nav-item/side-nav-item.component.js +11 -5
  22. package/esm2015/framework/side-nav/side-nav-toggle/side-nav-toggle.component.js +5 -5
  23. package/esm2015/framework/side-nav/side-nav.component.js +67 -18
  24. package/esm2015/framework/side-nav/side-nav.service.js +1 -1
  25. package/esm2015/framework/theseam-ui-common-framework.js +13 -9
  26. package/esm2015/framework/top-bar/top-bar-compact-menu-btn-detail.directive.js +15 -0
  27. package/esm2015/framework/top-bar/top-bar-item.directive.js +9 -2
  28. package/esm2015/framework/top-bar/top-bar-menu-button/top-bar-menu-button.component.js +4 -3
  29. package/esm2015/framework/top-bar/top-bar-nav-toggle-btn-detail.directive.js +15 -0
  30. package/esm2015/framework/top-bar/top-bar.component.js +44 -7
  31. package/esm2015/framework/top-bar/top-bar.module.js +9 -3
  32. package/esm2015/layout/layout.service.js +12 -2
  33. package/esm2015/menu/menu-toggle.directive.js +6 -2
  34. package/fesm2015/theseam-ui-common-framework.js +730 -41
  35. package/fesm2015/theseam-ui-common-framework.js.map +1 -1
  36. package/fesm2015/theseam-ui-common-layout.js +11 -2
  37. package/fesm2015/theseam-ui-common-layout.js.map +1 -1
  38. package/fesm2015/theseam-ui-common-menu.js +5 -1
  39. package/fesm2015/theseam-ui-common-menu.js.map +1 -1
  40. package/framework/base-layout/base-layout.component.d.ts +3 -1
  41. package/framework/base-layout/base-layout.component.scss +18 -10
  42. package/framework/base-layout/directives/base-layout-nav-toggle.directive.d.ts +7 -2
  43. package/framework/base-layout/directives/base-layout-side-bar-header.directive.d.ts +6 -0
  44. package/framework/base-layout/styles/_variables.scss +21 -0
  45. package/framework/nav/horizontal-nav/horizontal-nav.component.d.ts +31 -0
  46. package/framework/nav/index.d.ts +5 -0
  47. package/framework/nav/nav-item/nav-item.component.d.ts +67 -0
  48. package/framework/nav/nav-utils.d.ts +19 -0
  49. package/framework/nav/nav.models.d.ts +76 -0
  50. package/framework/nav/nav.module.d.ts +2 -0
  51. package/framework/nav/nav.service.d.ts +21 -0
  52. package/framework/public-api.d.ts +1 -0
  53. package/framework/side-nav/side-nav-item/side-nav-item.component.d.ts +2 -0
  54. package/framework/side-nav/side-nav-item/side-nav-item.component.scss +7 -5
  55. package/framework/side-nav/side-nav-toggle/side-nav-toggle.component.d.ts +4 -2
  56. package/framework/side-nav/side-nav-toggle/side-nav-toggle.component.scss +3 -6
  57. package/framework/side-nav/side-nav.component.d.ts +13 -1
  58. package/framework/side-nav/side-nav.component.scss +0 -1
  59. package/framework/side-nav/styles/_themes/light/_variables.scss +24 -14
  60. package/framework/side-nav/styles/_themes/primary/_variables.scss +8 -0
  61. package/framework/theseam-ui-common-framework.d.ts +12 -8
  62. package/framework/theseam-ui-common-framework.metadata.json +1 -1
  63. package/framework/top-bar/_top-bar-theme.scss +5 -5
  64. package/framework/top-bar/top-bar-compact-menu-btn-detail.directive.d.ts +5 -0
  65. package/framework/top-bar/top-bar-item.directive.d.ts +3 -0
  66. package/framework/top-bar/top-bar-menu-button/top-bar-menu-button.component.d.ts +4 -1
  67. package/framework/top-bar/top-bar-nav-toggle-btn-detail.directive.d.ts +5 -0
  68. package/framework/top-bar/top-bar.component.d.ts +25 -3
  69. package/framework/top-bar/top-bar.component.scss +7 -2
  70. package/layout/layout.service.d.ts +9 -1
  71. package/layout/theseam-ui-common-layout.metadata.json +1 -1
  72. package/menu/menu-toggle.directive.d.ts +2 -1
  73. package/menu/theseam-ui-common-menu.metadata.json +1 -1
  74. package/package.json +1 -1
@@ -1,14 +1,14 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Directive, ElementRef, InjectionToken, Optional, Inject, HostBinding, Input, HostListener, forwardRef, isDevMode, Component, ChangeDetectionStrategy, ViewEncapsulation, ViewContainerRef, ContentChild, TemplateRef, NgModule, ViewChild, Injectable, EventEmitter, ChangeDetectorRef, ViewChildren, Output, ComponentFactoryResolver, SkipSelf, Host, Self, ContentChildren } from '@angular/core';
2
+ import { Directive, ElementRef, InjectionToken, ChangeDetectorRef, Optional, Inject, HostBinding, Input, HostListener, forwardRef, isDevMode, Component, ChangeDetectionStrategy, ViewEncapsulation, ViewContainerRef, ContentChild, TemplateRef, NgModule, ViewChild, Injectable, EventEmitter, ViewChildren, Output, ComponentFactoryResolver, SkipSelf, Host, Self, ContentChildren } from '@angular/core';
3
+ import { tap, startWith, switchMap, map, shareReplay, mapTo, take, auditTime, debounceTime, takeUntil, distinctUntilChanged, finalize, filter } from 'rxjs/operators';
3
4
  import { TemplatePortal, PortalModule, ComponentPortal, BasePortalOutlet } from '@angular/cdk/portal';
4
5
  import { BehaviorSubject, isObservable, from, Subject, of, combineLatest, defer, Observable } from 'rxjs';
5
- import { faAngleDoubleRight, faAngleDoubleLeft, faLock, faUnlock, faAngleLeft, faBars, faAngleDown } from '@fortawesome/free-solid-svg-icons';
6
+ import { faAngleDoubleRight, faAngleDoubleLeft, faLock, faUnlock, faBars, faAngleLeft, faAngleDown } from '@fortawesome/free-solid-svg-icons';
6
7
  import { TheSeamLayoutService, TheSeamLayoutModule } from '@theseam/ui-common/layout';
7
8
  import { CommonModule } from '@angular/common';
8
9
  import { TheSeamButtonsModule } from '@theseam/ui-common/buttons';
9
10
  import { TheSeamIconModule } from '@theseam/ui-common/icon';
10
11
  import { TheSeamScrollbarModule } from '@theseam/ui-common/scrollbar';
11
- import { startWith, switchMap, map, shareReplay, tap, mapTo, take, auditTime, debounceTime, takeUntil, distinctUntilChanged, finalize, filter } from 'rxjs/operators';
12
12
  import { __decorate } from 'tslib';
13
13
  import { coerceNumberProperty, coerceBooleanProperty } from '@angular/cdk/coercion';
14
14
  import { moveItemInArray, transferArrayItem, CdkDrag, DragDropModule } from '@angular/cdk/drag-drop';
@@ -16,7 +16,7 @@ import { InputBoolean, InputNumber, mixinDisabled } from '@theseam/ui-common/cor
16
16
  import { THESEAM_WIDGET_ACCESSOR } from '@theseam/ui-common/widget';
17
17
  import * as i1 from '@theseam/ui-common/dynamic-component-loader';
18
18
  import { TheSeamDynamicComponentLoader } from '@theseam/ui-common/dynamic-component-loader';
19
- import { hasProperty, notNullOrUndefined, observeControlValue, observeControlStatus } from '@theseam/ui-common/utils';
19
+ import { hasProperty, notNullOrUndefined, observeControlValue, observeControlStatus, isNullOrUndefined } from '@theseam/ui-common/utils';
20
20
  import { TheSeamSharedModule } from '@theseam/ui-common/shared';
21
21
  import { trigger, transition, group, query, animateChild, state, style, animate, keyframes } from '@angular/animations';
22
22
  import { NavigationEnd, Router, RouterModule, NavigationStart, ActivatedRoute } from '@angular/router';
@@ -78,10 +78,13 @@ const THESEAM_BASE_LAYOUT_REF = new InjectionToken('seamBaseLayoutRef');
78
78
  * Can be used to toggle the expand state of the registered nav.
79
79
  */
80
80
  class BaseLayoutNavToggleDirective {
81
- constructor(_baseLayout) {
81
+ constructor(_cdr, _baseLayout) {
82
+ this._cdr = _cdr;
82
83
  this.type = 'button';
83
84
  /** Screenreader label for the button. */
84
85
  this.ariaLabel = 'Navigation toggle';
86
+ this._toggleClass = true;
87
+ this._expandedClass = false;
85
88
  this.baseLayout = _baseLayout;
86
89
  }
87
90
  get _attrType() { return this.type; }
@@ -91,6 +94,13 @@ class BaseLayoutNavToggleDirective {
91
94
  this.baseLayout.registeredNav.toggle();
92
95
  }
93
96
  }
97
+ ngOnInit() {
98
+ var _a, _b;
99
+ (_b = (_a = this.baseLayout) === null || _a === void 0 ? void 0 : _a.registeredNav) === null || _b === void 0 ? void 0 : _b.expanded$.pipe(tap(exp => {
100
+ this._expandedClass = exp;
101
+ this._cdr.markForCheck();
102
+ })).subscribe();
103
+ }
94
104
  }
95
105
  BaseLayoutNavToggleDirective.decorators = [
96
106
  { type: Directive, args: [{
@@ -99,6 +109,7 @@ BaseLayoutNavToggleDirective.decorators = [
99
109
  },] }
100
110
  ];
101
111
  BaseLayoutNavToggleDirective.ctorParameters = () => [
112
+ { type: ChangeDetectorRef },
102
113
  { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [THESEAM_BASE_LAYOUT_REF,] }] }
103
114
  ];
104
115
  BaseLayoutNavToggleDirective.propDecorators = {
@@ -106,6 +117,8 @@ BaseLayoutNavToggleDirective.propDecorators = {
106
117
  type: [{ type: Input }],
107
118
  _attrAriaLabel: [{ type: HostBinding, args: ['attr.aria-label',] }],
108
119
  ariaLabel: [{ type: Input, args: ['aria-label',] }],
120
+ _toggleClass: [{ type: HostBinding, args: ['class.base-layout-nav-toggle',] }],
121
+ _expandedClass: [{ type: HostBinding, args: ['class.base-layout-nav-toggle--expanded',] }],
109
122
  _onClick: [{ type: HostListener, args: ['click',] }]
110
123
  };
111
124
 
@@ -150,6 +163,7 @@ class TheSeamBaseLayoutComponent {
150
163
  this.faAngleDoubleRight = faAngleDoubleRight;
151
164
  this.faAngleDoubleLeft = faAngleDoubleLeft;
152
165
  this.overlayNav = false;
166
+ this.showSidebar = true;
153
167
  this._hasSideBar = new BehaviorSubject(false);
154
168
  this._registeredNav = new BehaviorSubject(undefined);
155
169
  this.registeredNav$ = this._registeredNav.asObservable();
@@ -161,12 +175,17 @@ class TheSeamBaseLayoutComponent {
161
175
  get registeredNav() { return this._registeredNav.value; }
162
176
  get registeredActions() { return this._registeredActions.value; }
163
177
  ngOnInit() {
178
+ if (this.mobileBreakpoint) {
179
+ this._layout.setMobileBreakpoint(this.mobileBreakpoint);
180
+ }
164
181
  if (this._topBarTpl) {
165
182
  this._topBarPortal = new TemplatePortal(this._topBarTpl, this._viewContainerRef);
166
183
  }
167
184
  if (this._sideBarTpl) {
168
185
  this._sideBarPortal = new TemplatePortal(this._sideBarTpl, this._viewContainerRef);
169
- this._hasSideBar.next(true);
186
+ if (this.showSidebar) {
187
+ this._hasSideBar.next(true);
188
+ }
170
189
  }
171
190
  if (this._contentTpl) {
172
191
  this._contentPortal = new TemplatePortal(this._contentTpl, this._viewContainerRef);
@@ -223,11 +242,11 @@ class TheSeamBaseLayoutComponent {
223
242
  TheSeamBaseLayoutComponent.decorators = [
224
243
  { type: Component, args: [{
225
244
  selector: 'seam-base-layout',
226
- template: "<div class=\"base-layout-side-bar-nav-content-mobile\" *ngIf=\"isMobile$ | async\">\n <ng-template [cdkPortalOutlet]=\"_sideBarPortal\"></ng-template>\n</div>\n\n<div class=\"base-layout-top-bar-container\">\n <ng-template [cdkPortalOutlet]=\"_topBarPortal\"></ng-template>\n</div>\n<div class=\"base-layout-main-container\">\n <div *ngIf=\"hasSideBar$ | async\"\n class=\"base-layout-side-bar-container\">\n <div class=\"base-layout-side-bar-nav-content\" *ngIf=\"!(isMobile$ | async)\">\n <ng-template [cdkPortalOutlet]=\"_sideBarPortal\"></ng-template>\n </div>\n </div>\n <div class=\"base-layout-content-container\">\n <div class=\"base-layout-content-container-header\">\n <!-- <ng-template [cdkPortalOutlet]=\"_contentHeaderPortal\"></ng-template> -->\n\n <div class=\"d-flex d-flex-row\">\n <div class=\"flex-grow-1\">\n <ng-template [cdkPortalOutlet]=\"_contentHeaderPortal\"></ng-template>\n </div>\n <div class=\"d-flex\">\n <ng-container *ngFor=\"let action of registeredActions$ | async; first as isFirst\">\n <div>\n <ng-container [ngTemplateOutlet]=\"$any(action)?.template\"></ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n\n\n </div>\n <div class=\"base-layout-content-container-inner\" seamOverlayScrollbar>\n <ng-template [cdkPortalOutlet]=\"_contentPortal\"></ng-template>\n </div>\n <div class=\"base-layout-content-container-footer\">\n <ng-template [cdkPortalOutlet]=\"_contentFooterPortal\"></ng-template>\n </div>\n </div>\n</div>\n",
245
+ template: "<div class=\"base-layout-side-bar-nav-content-mobile\" *ngIf=\"isMobile$ | async\">\n <ng-template [cdkPortalOutlet]=\"_sideBarPortal\"></ng-template>\n</div>\n\n<div class=\"base-layout-top-bar-container\">\n <ng-template [cdkPortalOutlet]=\"_topBarPortal\"></ng-template>\n</div>\n<div class=\"base-layout-main-container\">\n <div *ngIf=\"hasSideBar$ | async\"\n class=\"base-layout-side-bar-container\">\n <div class=\"base-layout-side-bar-nav-content\" *ngIf=\"!(isMobile$ | async)\">\n <ng-template [cdkPortalOutlet]=\"_sideBarPortal\"></ng-template>\n </div>\n </div>\n <div class=\"base-layout-content-container\">\n <div class=\"base-layout-content-container-header d-flex flex-row\">\n <div class=\"base-layout-content-container-header-left flex-grow-1\">\n <ng-template [cdkPortalOutlet]=\"_contentHeaderPortal\"></ng-template>\n </div>\n <div class=\"base-layout-content-container-header-right d-flex\">\n <ng-container *ngFor=\"let action of registeredActions$ | async; first as isFirst\">\n <div class=\"base-layout-registered-action\">\n <ng-container [ngTemplateOutlet]=\"$any(action)?.template\"></ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n <div class=\"base-layout-content-container-inner\" seamOverlayScrollbar>\n <ng-template [cdkPortalOutlet]=\"_contentPortal\"></ng-template>\n </div>\n <div class=\"base-layout-content-container-footer\">\n <ng-template [cdkPortalOutlet]=\"_contentFooterPortal\"></ng-template>\n </div>\n </div>\n</div>\n",
227
246
  providers: [THE_SEAM_BASE_LAYOUT],
228
247
  changeDetection: ChangeDetectionStrategy.OnPush,
229
248
  encapsulation: ViewEncapsulation.None,
230
- styles: ["seam-base-layout{display:flex;flex-direction:column;height:100%;width:100%}seam-base-layout .base-layout-side-bar-nav-content-mobile{position:absolute;top:0;bottom:0;left:0;float:left;z-index:9999}seam-base-layout .base-layout-side-bar-container{flex:0 0 auto;display:flex;flex-direction:column;border-top:none;border-right:1px solid #dee2e6;border-bottom:none;border-left:none}seam-base-layout .base-layout-side-bar-container .base-layout-side-bar-nav-content{flex:1 1 0}seam-base-layout .base-layout-main-container{flex:1 1 100%;display:flex;flex-direction:row;transform:translateZ(0)}seam-base-layout .base-layout-top-bar-container{flex:0 0 auto;border-top:none;border-right:none;border-bottom:1px solid #dee2e6;border-left:none}seam-base-layout .base-layout-content-container{flex:1 1 auto;display:flex;flex-direction:column}seam-base-layout .base-layout-content-container .base-layout-content-container-header{flex:0 0 auto}seam-base-layout .base-layout-content-container .base-layout-content-container-inner{flex:1 1 auto}seam-base-layout .base-layout-content-container .base-layout-content-container-footer{flex:0 0 auto}seam-base-layout .base-layout-content-container-header{margin:.25rem;padding:0;background:none;border-radius:0;overflow:hidden}seam-base-layout .btn-baselayout-action{margin:0 0 0 .25rem;color:#212529;background-color:#e9ecef;border-color:#e9ecef;padding:.5rem 1rem;font-size:1rem;line-height:1.5;border-radius:.25rem;border:none;color:#6c757d}seam-base-layout .btn-baselayout-action:hover{color:#212529;background-color:#d3d9df;border-color:#cbd3da}seam-base-layout .btn-baselayout-action:focus,seam-base-layout .btn-baselayout-action.focus{color:#212529;background-color:#d3d9df;border-color:#cbd3da;box-shadow:0 0 0 .2rem #cbced180}seam-base-layout .btn-baselayout-action.disabled,seam-base-layout .btn-baselayout-action:disabled{color:#212529;background-color:#e9ecef;border-color:#e9ecef}seam-base-layout .btn-baselayout-action:not(:disabled):not(.disabled):active,seam-base-layout .btn-baselayout-action:not(:disabled):not(.disabled).active,.show>seam-base-layout .btn-baselayout-action.dropdown-toggle{color:#212529;background-color:#d3d9df;border-color:#c4ccd4}seam-base-layout .btn-baselayout-action:not(:disabled):not(.disabled):active:focus,seam-base-layout .btn-baselayout-action:not(:disabled):not(.disabled).active:focus,.show>seam-base-layout .btn-baselayout-action.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #cbced180}seam-base-layout .btn-baselayout-action:hover{color:#6c757d}seam-base-layout .btn-baselayout-action:focus,seam-base-layout .btn-baselayout-action.focus{color:#6c757d}\n"]
249
+ styles: ["seam-base-layout{display:flex;flex-direction:column;height:100%;width:100%}seam-base-layout .base-layout-side-bar-nav-content-mobile{position:absolute;top:0;bottom:0;left:0;z-index:999}seam-base-layout .base-layout-side-bar-container{flex:0 0 auto;display:flex;flex-direction:column;border-top:none;border-right:1px solid #dee2e6;border-bottom:none;border-left:none}seam-base-layout .base-layout-side-bar-container .base-layout-side-bar-nav-content{flex:1 1 0}seam-base-layout .base-layout-main-container{flex:1 1 100%;display:flex;flex-direction:row;transform:translateZ(0)}seam-base-layout .base-layout-top-bar-container{flex:0 0 auto;border-top:none;border-right:none;border-bottom:1px solid #dee2e6;border-left:none}seam-base-layout .base-layout-content-container{flex:1 1 auto;display:flex;flex-direction:column}seam-base-layout .base-layout-content-container .base-layout-content-container-header{flex:0 0 auto;background:none;margin:.25rem;padding:0;border-radius:0;overflow:hidden}seam-base-layout .base-layout-content-container .base-layout-content-container-header-left{background:none;padding:0;margin:0;border-radius:0}seam-base-layout .base-layout-content-container .base-layout-content-container-header-right{background:none;padding:0;margin:0;border-radius:0}seam-base-layout .base-layout-content-container .base-layout-content-container-inner{flex:1 1 auto}seam-base-layout .base-layout-content-container .base-layout-content-container-footer{flex:0 0 auto}seam-base-layout .btn-baselayout-action{margin:0 0 0 .25rem;color:#212529;background-color:#e9ecef;border-color:#e9ecef;padding:.5rem 1rem;font-size:1rem;line-height:1.5;border-radius:.25rem;border:none;color:#6c757d}seam-base-layout .btn-baselayout-action:hover{color:#212529;background-color:#d3d9df;border-color:#cbd3da}seam-base-layout .btn-baselayout-action:focus,seam-base-layout .btn-baselayout-action.focus{color:#212529;background-color:#d3d9df;border-color:#cbd3da;box-shadow:0 0 0 .2rem #cbced180}seam-base-layout .btn-baselayout-action.disabled,seam-base-layout .btn-baselayout-action:disabled{color:#212529;background-color:#e9ecef;border-color:#e9ecef}seam-base-layout .btn-baselayout-action:not(:disabled):not(.disabled):active,seam-base-layout .btn-baselayout-action:not(:disabled):not(.disabled).active,.show>seam-base-layout .btn-baselayout-action.dropdown-toggle{color:#212529;background-color:#d3d9df;border-color:#c4ccd4}seam-base-layout .btn-baselayout-action:not(:disabled):not(.disabled):active:focus,seam-base-layout .btn-baselayout-action:not(:disabled):not(.disabled).active:focus,.show>seam-base-layout .btn-baselayout-action.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #cbced180}seam-base-layout .btn-baselayout-action:hover{color:#6c757d}seam-base-layout .btn-baselayout-action:focus,seam-base-layout .btn-baselayout-action.focus{color:#6c757d}\n"]
231
250
  },] }
232
251
  ];
233
252
  TheSeamBaseLayoutComponent.ctorParameters = () => [
@@ -236,6 +255,8 @@ TheSeamBaseLayoutComponent.ctorParameters = () => [
236
255
  ];
237
256
  TheSeamBaseLayoutComponent.propDecorators = {
238
257
  overlayNav: [{ type: Input }],
258
+ mobileBreakpoint: [{ type: Input }],
259
+ showSidebar: [{ type: Input }],
239
260
  _topBarTpl: [{ type: ContentChild, args: [BaseLayoutTopBarDirective, { static: true, read: TemplateRef },] }],
240
261
  _sideBarTpl: [{ type: ContentChild, args: [BaseLayoutSideBarDirective, { static: true, read: TemplateRef },] }],
241
262
  _contentTpl: [{ type: ContentChild, args: [BaseLayoutContentDirective, { static: true, read: TemplateRef },] }],
@@ -257,6 +278,20 @@ BaseLayoutSideBarFooterDirective.ctorParameters = () => [
257
278
  { type: ElementRef }
258
279
  ];
259
280
 
281
+ class BaseLayoutSideBarHeaderDirective {
282
+ constructor(_elementRef) {
283
+ this._elementRef = _elementRef;
284
+ }
285
+ }
286
+ BaseLayoutSideBarHeaderDirective.decorators = [
287
+ { type: Directive, args: [{
288
+ selector: '[seamBaseLayoutSideBarHeader]'
289
+ },] }
290
+ ];
291
+ BaseLayoutSideBarHeaderDirective.ctorParameters = () => [
292
+ { type: ElementRef }
293
+ ];
294
+
260
295
  class TheSeamBaseLayoutModule {
261
296
  }
262
297
  TheSeamBaseLayoutModule.decorators = [
@@ -266,6 +301,7 @@ TheSeamBaseLayoutModule.decorators = [
266
301
  BaseLayoutContentDirective,
267
302
  BaseLayoutSideBarDirective,
268
303
  BaseLayoutSideBarFooterDirective,
304
+ BaseLayoutSideBarHeaderDirective,
269
305
  BaseLayoutTopBarDirective,
270
306
  BaseLayoutNavToggleDirective,
271
307
  BaseLayoutContentHeaderDirective,
@@ -283,6 +319,7 @@ TheSeamBaseLayoutModule.decorators = [
283
319
  BaseLayoutContentDirective,
284
320
  BaseLayoutSideBarDirective,
285
321
  BaseLayoutSideBarFooterDirective,
322
+ BaseLayoutSideBarHeaderDirective,
286
323
  BaseLayoutTopBarDirective,
287
324
  BaseLayoutNavToggleDirective,
288
325
  BaseLayoutContentHeaderDirective,
@@ -1268,14 +1305,20 @@ class SideNavComponent {
1268
1305
  this._sideNav = _sideNav;
1269
1306
  this._baseLayoutRef = _baseLayoutRef;
1270
1307
  this._ngUnsubscribe = new Subject();
1308
+ this.faBars = faBars;
1271
1309
  // @HostBinding('@sideNavExpand') _sideNavExpand = EXPANDED_STATE
1272
1310
  // _sideNavExpand = EXPANDED_STATE
1273
1311
  // @HostBinding('@sideNavAnim') _sideNavExpand = EXPANDED_STATE
1274
1312
  this._sideNavExpand = 'initial';
1275
1313
  this.hasHeaderToggle = true;
1314
+ this.toggleIcon = faBars;
1276
1315
  this._items = new BehaviorSubject([]);
1316
+ this.indentSize = 10;
1277
1317
  this._expanded = new BehaviorSubject(true);
1278
1318
  this.expanded$ = this._expanded.asObservable();
1319
+ this.expandOrigin = 'left';
1320
+ this.expandHeight = '100%';
1321
+ this.expandWidth = 'calc(100vw - 50px)';
1279
1322
  this._overlay = new BehaviorSubject(false);
1280
1323
  this.overlay$ = this._overlay.asObservable();
1281
1324
  this.toggleExpand = new EventEmitter();
@@ -1291,7 +1334,7 @@ class SideNavComponent {
1291
1334
  get expanded() { return this._expanded.value; }
1292
1335
  set expanded(value) {
1293
1336
  const expanded = coerceBooleanProperty(value);
1294
- let emit = expanded !== this.expanded;
1337
+ const emit = expanded !== this.expanded;
1295
1338
  this._expanded.next(expanded);
1296
1339
  if (emit) {
1297
1340
  this.toggleExpand.emit(coerceBooleanProperty(value));
@@ -1309,6 +1352,9 @@ class SideNavComponent {
1309
1352
  this.sideNavExpandedState$
1310
1353
  .pipe(takeUntil(this._ngUnsubscribe))
1311
1354
  .subscribe(v => this._sideNavExpand = v);
1355
+ if (this._sideBarHeaderTpl) {
1356
+ this._sideBarHeaderPortal = new TemplatePortal(this._sideBarHeaderTpl, this._viewContainerRef);
1357
+ }
1312
1358
  if (this._sideBarFooterTpl) {
1313
1359
  this._sideBarFooterPortal = new TemplatePortal(this._sideBarFooterTpl, this._viewContainerRef);
1314
1360
  }
@@ -1339,11 +1385,28 @@ class SideNavComponent {
1339
1385
  this._backdropHidden.next(true);
1340
1386
  }
1341
1387
  }
1388
+ get expandOriginTransform() {
1389
+ switch (this.expandOrigin) {
1390
+ case 'right':
1391
+ return this._sideNavExpand === EXPANDED_OVERLAY_STATE ? 'translateX(100vw) translateX(-100%)' :
1392
+ this._sideNavExpand === COLLAPSED_OVERLAY_STATE ? 'translateX(100vw)' : null;
1393
+ case 'top':
1394
+ return this._sideNavExpand === EXPANDED_OVERLAY_STATE ? 'translateY(0)' :
1395
+ this._sideNavExpand === COLLAPSED_OVERLAY_STATE ? 'translateY(-100%)' : null;
1396
+ case 'bottom':
1397
+ return this._sideNavExpand === EXPANDED_OVERLAY_STATE ? 'translateY(100vh) translateY(-100%)' :
1398
+ this._sideNavExpand === COLLAPSED_OVERLAY_STATE ? 'translateY(100vh)' : null;
1399
+ case 'left':
1400
+ default:
1401
+ return this._sideNavExpand === EXPANDED_OVERLAY_STATE ? 'translateX(0)' :
1402
+ this._sideNavExpand === COLLAPSED_OVERLAY_STATE ? 'translateX(-100%)' : null;
1403
+ }
1404
+ }
1342
1405
  }
1343
1406
  SideNavComponent.decorators = [
1344
1407
  { type: Component, args: [{
1345
1408
  selector: 'seam-side-nav',
1346
- template: "<div class=\"side-nav-backdrop\" *ngIf=\"isMobile$ | async\"\n [@sideNavBackdrop]=\"_sideNavExpand\"\n [class.side-nav-backdrop-hidden]=\"_backdropHidden | async\"></div>\n\n<div class=\"side-nav-inner-wrapper\" [@sideNavExpand]=\"_sideNavExpand\"\n (@sideNavExpand.start)=\"animateStart()\"\n (@sideNavExpand.done)=\"animateEnd()\">\n <nav class=\"nav side-nav-content\">\n <seam-side-nav-toggle *ngIf=\"hasHeaderToggle\"\n [expanded]=\"expanded$ | async\"\n (toggleExpand)=\"toggle()\">\n </seam-side-nav-toggle>\n <div class=\"side-nav-items-container\" seamOverlayScrollbar>\n <seam-side-nav-item *ngFor=\"let item of items$ | async\"\n [compact]=\"!(expanded$ | async)\"\n [itemType]=\"$any(item)?.itemType\"\n [icon]=\"$any(item)?.icon\"\n [label]=\"$any(item)?.label\"\n [link]=\"$any(item)?.link\"\n [badgeText]=\"$any(item)?.badge?.text\"\n [badgeTheme]=\"$any(item)?.badge?.theme || 'danger'\"\n [badgeSrContent]=\"$any(item)?.badge?.srContent\"\n [badgeTooltip]=\"$any(item)?.badge?.tooltip\"\n [queryParams]=\"$any(item)?.queryParams\"\n [children]=\"$any(item)?.children\"\n [active]=\"$any(item).__state.active\"\n [expanded]=\"$any(item).__state.expanded\">\n </seam-side-nav-item>\n </div>\n <ng-template [cdkPortalOutlet]=\"_sideBarFooterPortal\"></ng-template>\n </nav>\n</div>\n",
1409
+ template: "<div class=\"side-nav-backdrop\" *ngIf=\"isMobile$ | async\"\n [@sideNavBackdrop]=\"_sideNavExpand\"\n [class.side-nav-backdrop-hidden]=\"_backdropHidden | async\"\n (click)=\"collapse()\"></div>\n\n<div\n class=\"side-nav-inner-wrapper\"\n [@sideNavExpand]=\"{\n value: _sideNavExpand,\n params: {\n origin: expandOriginTransform,\n height: expandHeight,\n width: expandWidth\n }\n }\"\n (@sideNavExpand.start)=\"animateStart()\"\n (@sideNavExpand.done)=\"animateEnd()\">\n <nav class=\"nav side-nav-content\">\n <seam-side-nav-toggle *ngIf=\"hasHeaderToggle\"\n [toggleIcon]=\"toggleIcon\"\n [toggleTpl]=\"toggleTpl\"\n [expanded]=\"expanded$ | async\"\n (toggleExpand)=\"toggle()\">\n <ng-template [cdkPortalOutlet]=\"_sideBarHeaderPortal\"></ng-template>\n </seam-side-nav-toggle>\n <div class=\"side-nav-items-container\" seamOverlayScrollbar>\n <div class=\"side-nav--group side-nav--group--level-0\">\n <seam-side-nav-item *ngFor=\"let item of items$ | async\"\n [compact]=\"!(expanded$ | async)\"\n [itemType]=\"$any(item)?.itemType\"\n [icon]=\"$any(item)?.icon\"\n [label]=\"$any(item)?.label\"\n [link]=\"$any(item)?.link\"\n [badgeText]=\"$any(item)?.badge?.text\"\n [badgeTheme]=\"$any(item)?.badge?.theme || 'danger'\"\n [badgeSrContent]=\"$any(item)?.badge?.srContent\"\n [badgeTooltip]=\"$any(item)?.badge?.tooltip\"\n [queryParams]=\"$any(item)?.queryParams\"\n [children]=\"$any(item)?.children\"\n [active]=\"$any(item).__state?.active\"\n [expanded]=\"$any(item).__state?.expanded\"\n [hideEmptyIcon]=\"hideEmptyIcon\"\n [indentSize]=\"indentSize\">\n </seam-side-nav-item>\n </div>\n </div>\n <ng-template [cdkPortalOutlet]=\"_sideBarFooterPortal\"></ng-template>\n </nav>\n</div>\n",
1347
1410
  providers: [
1348
1411
  TheSeamSideNavService
1349
1412
  ],
@@ -1370,32 +1433,42 @@ SideNavComponent.decorators = [
1370
1433
  transition(sideNavExpandStateChangeFn, animate('0.2s ease-in-out')),
1371
1434
  ]),
1372
1435
  trigger('sideNavExpand', [
1373
- // TODO: Make width configurable.
1436
+ // TODO: Make width configurable for non-overlay state.
1374
1437
  state(EXPANDED_STATE$1, style({ width: '260px' })),
1375
1438
  state(COLLAPSED_STATE$1, style({ width: '50px', 'overflow-x': 'hidden' })),
1376
1439
  state(EXPANDED_OVERLAY_STATE, style({
1377
1440
  position: 'absolute',
1378
1441
  top: 0,
1379
- height: '100%',
1380
1442
  bottom: 0,
1381
1443
  left: 0,
1382
- float: 'left',
1444
+ height: '{{ height }}',
1445
+ width: '{{ width }}',
1446
+ transform: '{{ origin }}',
1383
1447
  zIndex: '9999',
1384
- width: 'calc(100vw - 50px)',
1385
- transform: 'translateX(0)'
1386
- })),
1448
+ }), {
1449
+ params: {
1450
+ origin: 'translateX(100%)',
1451
+ height: '100%',
1452
+ width: 'calc(100vw - 50px)',
1453
+ }
1454
+ }),
1387
1455
  state(COLLAPSED_OVERLAY_STATE, style({
1388
1456
  position: 'absolute',
1389
1457
  top: 0,
1390
- height: '100%',
1391
1458
  bottom: 0,
1392
1459
  left: 0,
1393
- float: 'left',
1460
+ height: '{{ height }}',
1461
+ width: '{{ width }}',
1462
+ transform: '{{ origin }}',
1463
+ 'overflow-x': 'hidden',
1394
1464
  zIndex: '9999',
1395
- width: 'calc(100vw - 50px)',
1396
- transform: 'translateX(calc(-100vw + 50px))',
1397
- 'overflow-x': 'hidden'
1398
- })),
1465
+ }), {
1466
+ params: {
1467
+ origin: 'translateX(0)',
1468
+ height: '100%',
1469
+ width: 'calc(100vw - 50px)',
1470
+ }
1471
+ }),
1399
1472
  // transition(`${EXPANDED_STATE} <=> ${COLLAPSED_STATE}`, animate('0.2s ease-in-out')),
1400
1473
  transition(sideNavExpandStateChangeFn, animate('0.2s ease-in-out')),
1401
1474
  // transition(`${EXPANDED_STATE} <=> ${COLLAPSED_STATE}`, [
@@ -1424,15 +1497,26 @@ SideNavComponent.ctorParameters = () => [
1424
1497
  SideNavComponent.propDecorators = {
1425
1498
  _sideNavExpand: [{ type: HostBinding, args: ['@sideNavAnim',] }],
1426
1499
  hasHeaderToggle: [{ type: Input }],
1500
+ toggleIcon: [{ type: Input }],
1501
+ toggleTpl: [{ type: Input }],
1427
1502
  items: [{ type: Input }],
1503
+ hideEmptyIcon: [{ type: Input }],
1504
+ indentSize: [{ type: Input }],
1428
1505
  expanded: [{ type: Input }],
1506
+ expandOrigin: [{ type: Input }],
1507
+ expandHeight: [{ type: Input }],
1508
+ expandWidth: [{ type: Input }],
1429
1509
  overlay: [{ type: Input }],
1430
1510
  toggleExpand: [{ type: Output }],
1511
+ _sideBarHeaderTpl: [{ type: ContentChild, args: [BaseLayoutSideBarHeaderDirective, { static: true, read: TemplateRef },] }],
1431
1512
  _sideBarFooterTpl: [{ type: ContentChild, args: [BaseLayoutSideBarFooterDirective, { static: true, read: TemplateRef },] }]
1432
1513
  };
1433
1514
  __decorate([
1434
1515
  InputBoolean()
1435
- ], SideNavComponent.prototype, "hasHeaderToggle", void 0);
1516
+ ], SideNavComponent.prototype, "hasHeaderToggle", void 0);
1517
+ __decorate([
1518
+ InputNumber(10)
1519
+ ], SideNavComponent.prototype, "indentSize", void 0);
1436
1520
 
1437
1521
  const EXPANDED_STATE = 'expanded';
1438
1522
  const COLLAPSED_STATE = 'collapsed';
@@ -1472,13 +1556,14 @@ class SideNavItemComponent {
1472
1556
  this._badgeTooltip = {
1473
1557
  tooltip: value,
1474
1558
  placement: 'auto',
1475
- disabled: false
1559
+ disabled: false,
1560
+ container: 'body'
1476
1561
  };
1477
1562
  }
1478
1563
  else {
1479
1564
  this._badgeTooltip = Object.assign(Object.assign({}, value), { placement: value.placement || 'auto', disabled: typeof (value === null || value === void 0 ? void 0 : value.disabled) === 'boolean'
1480
1565
  ? value.disabled
1481
- : typeof value.tooltip === 'string' ? false : true });
1566
+ : typeof value.tooltip === 'string' ? false : true, container: value.container || 'body' });
1482
1567
  }
1483
1568
  }
1484
1569
  else {
@@ -1503,11 +1588,14 @@ class SideNavItemComponent {
1503
1588
  this._sideNav.collapse();
1504
1589
  }
1505
1590
  }
1591
+ get showIconBlock() {
1592
+ return notNullOrUndefined(this.icon) || this.hideEmptyIcon !== true;
1593
+ }
1506
1594
  }
1507
1595
  SideNavItemComponent.decorators = [
1508
1596
  { type: Component, args: [{
1509
1597
  selector: 'seam-side-nav-item',
1510
- template: "<div class=\"d-flex flex-row\">\n <ng-container *ngIf=\"itemType === 'basic'\">\n <ng-template [ngTemplateOutlet]=\"itemTypeBasic\"></ng-template>\n </ng-container>\n <ng-container *ngIf=\"itemType === 'link'\">\n <ng-template [ngTemplateOutlet]=\"itemTypeLink\"></ng-template>\n </ng-container>\n <ng-container *ngIf=\"itemType === 'divider'\">\n <ng-template [ngTemplateOutlet]=\"itemTypeDivider\"></ng-template>\n </ng-container>\n <ng-container *ngIf=\"itemType === 'title'\">\n <ng-template [ngTemplateOutlet]=\"itemTypeTitle\"></ng-template>\n </ng-container>\n</div>\n\n<ng-container *ngIf=\"hasChildren\">\n <div class=\"side-nav--group side-nav--group--level-{{ hierLevel + 1 }}\"\n [@childGroupAnim]=\"childGroupAnimState$ | async\">\n <seam-side-nav-item *ngFor=\"let child of children\"\n [hierLevel]=\"compact ? 0 : (hierLevel + 1)\"\n [compact]=\"compact\"\n [itemType]=\"$any(child).itemType\"\n [icon]=\"$any(child).icon\"\n [label]=\"$any(child).label\"\n [link]=\"$any(child).link\"\n [badgeText]=\"$any(child).badge?.text\"\n [badgeTheme]=\"$any(child).badge?.theme || 'danger'\"\n [badgeSrContent]=\"$any(child).badge?.srContent\"\n [badgeTooltip]=\"$any(child)?.badge?.tooltip\"\n [queryParams]=\"$any(child).queryParams\"\n routerLinkActive=\"active\"\n [routerLinkActiveOptions]=\"{ exact: true }\"\n [children]=\"$any(child)?.children\"\n [active]=\"$any(child).__state.active\"\n [expanded]=\"$any(child).__state.expanded\">\n </seam-side-nav-item>\n </div>\n</ng-container>\n\n<ng-template #itemTypeBasic>\n <button class=\"side-nav-item btn side-nav-btn p-0 d-flex flex-row rounded-0 text-decoration-none text-nowrap w-100\"\n cdkMonitorElementFocus\n (click)=\"toggleChildren()\"\n [attr.aria-expanded]=\"expanded\">\n <div class=\"nav-link d-flex flex-row w-100\" [class.nav-link__compact]=\"compact\">\n <div [style.padding-left.px]=\"hierLevel * indentSize\"></div>\n <div class=\"side-nav-item--icon\">\n <seam-icon *ngIf=\"icon\" [icon]=\"icon\"></seam-icon>\n <ng-container *ngIf=\"compact\">\n <ng-template [ngTemplateOutlet]=\"itemBadge\"></ng-template>\n </ng-container>\n </div>\n <span *ngIf=\"!compact\" side-nav-item-label style=\"margin-left: 11px;\">\n {{ label }}\n </span>\n <span *ngIf=\"compact\" class=\"sr-only\" side-nav-item-label>{{ label }}</span>\n <ng-container *ngIf=\"!compact\">\n <ng-template [ngTemplateOutlet]=\"itemBadge\"></ng-template>\n </ng-container>\n </div>\n\n <div *ngIf=\"hasChildren && !compact\"\n class=\"btn side-nav-btn side-nav-item--toggle-btn-container rounded-0\">\n <seam-icon\n class=\"side-nav-item--toggle-btn\"\n [class.side-nav-item--toggle-btn-expanded]=\"expanded\"\n [icon]=\"faAngleLeft\"\n type>\n </seam-icon>\n </div>\n </button>\n</ng-template>\n\n<ng-template #itemTypeLink>\n <a *ngIf=\"link; else noLink\" class=\"side-nav-item nav-link d-flex flex-row text-nowrap w-100 align-items-center\"\n [class.nav-link__compact]=\"compact\"\n [routerLink]=\"link\"\n [queryParams]=\"queryParams\"\n routerLinkActive=\"active\"\n [routerLinkActiveOptions]=\"{ exact: true }\"\n (click)=\"_linkClicked()\">\n <div [style.padding-left.px]=\"hierLevel * indentSize\"></div>\n <div class=\"side-nav-item--icon\">\n <seam-icon *ngIf=\"icon\" [icon]=\"icon\"></seam-icon>\n <ng-container *ngIf=\"compact\">\n <ng-template [ngTemplateOutlet]=\"itemBadge\"></ng-template>\n </ng-container>\n </div>\n <span *ngIf=\"!compact\" style=\"margin-left: 11px;\" side-nav-item-label>\n {{ label }}\n </span>\n <span *ngIf=\"compact\" class=\"sr-only\" side-nav-item-label>{{ label }}</span>\n <ng-container *ngIf=\"!compact\">\n <ng-template [ngTemplateOutlet]=\"itemBadge\"></ng-template>\n </ng-container>\n </a>\n\n <ng-template #noLink>\n <a class=\"side-nav-item nav-link d-flex flex-row text-nowrap w-100 align-items-center\" [class.nav-link__compact]=\"compact\">\n <div [style.padding-left.px]=\"hierLevel * indentSize\"></div>\n <div class=\"side-nav-item--icon\">\n <seam-icon *ngIf=\"icon\" [icon]=\"icon\"></seam-icon>\n </div>\n <span *ngIf=\"!compact\" style=\"margin-left: 11px;\" side-nav-item-label>\n {{ label }}\n </span>\n <span *ngIf=\"compact\" class=\"sr-only\" side-nav-item-label>{{ label }}</span>\n </a>\n </ng-template>\n\n <button *ngIf=\"hasChildren && !compact\"\n type=\"button\"\n class=\"btn side-nav-btn side-nav-item--toggle-btn-container rounded-0\"\n (click)=\"toggleChildren()\"\n [attr.aria-expanded]=\"expanded\"\n cdkMonitorElementFocus>\n <seam-icon\n class=\"side-nav-item--toggle-btn\"\n [class.side-nav-item--toggle-btn-expanded]=\"expanded\"\n [icon]=\"faAngleLeft\"\n type>\n </seam-icon>\n <span class=\"sr-only\">Group Toggle</span>\n </button>\n</ng-template>\n\n<ng-template #itemTypeDivider>\n <div class=\"px-2 w-100\">\n <hr class=\"side-nav-item--divider\" />\n </div>\n</ng-template>\n\n<ng-template #itemTypeTitle>\n <ng-container *ngIf=\"!compact\">\n <span class=\"side-nav-item--title pt-1\" side-nav-item-label>{{ label }}</span>\n </ng-container>\n</ng-template>\n\n<ng-template #itemBadge>\n <ng-container *ngIf=\"badgeText\">\n <div class=\"badge-spacer flex-grow-1\" *ngIf=\"!compact\"></div>\n <div class=\"side-nav-item--badge\"\n [class.side-nav-item--badge-no-icon]=\"!icon\"\n [ngbTooltip]=\"$any(badgeTooltip)?.tooltip\"\n [tooltipClass]=\"$any(badgeTooltip)?.class\"\n [placement]=\"$any(badgeTooltip)?.placement\"\n [container]=\"$any(badgeTooltip)?.container\"\n [disableTooltip]=\"!badgeTooltip || !!$any(badgeTooltip)?.disabled\">\n <span class=\"badge badge-pill badge-{{ badgeTheme }}\">\n <ng-container *ngIf=\"!compact || !icon\">\n {{ badgeText }}\n </ng-container>\n <span *ngIf=\"badgeSrContent\">{{ badgeSrContent }}</span>\n </span>\n </div>\n </ng-container>\n</ng-template>\n",
1598
+ template: "<div class=\"d-flex flex-row side-nav-item-wrapper\">\n <ng-container *ngIf=\"itemType === 'basic'\">\n <ng-template [ngTemplateOutlet]=\"itemTypeBasic\"></ng-template>\n </ng-container>\n <ng-container *ngIf=\"itemType === 'link'\">\n <ng-template [ngTemplateOutlet]=\"itemTypeLink\"></ng-template>\n </ng-container>\n <ng-container *ngIf=\"itemType === 'divider'\">\n <ng-template [ngTemplateOutlet]=\"itemTypeDivider\"></ng-template>\n </ng-container>\n <ng-container *ngIf=\"itemType === 'title'\">\n <ng-template [ngTemplateOutlet]=\"itemTypeTitle\"></ng-template>\n </ng-container>\n</div>\n\n<ng-container *ngIf=\"hasChildren\">\n <div class=\"side-nav--group side-nav--group--level-{{ hierLevel + 1 }}\"\n [@childGroupAnim]=\"childGroupAnimState$ | async\">\n <seam-side-nav-item *ngFor=\"let child of children\"\n [hierLevel]=\"compact ? 0 : (hierLevel + 1)\"\n [compact]=\"compact\"\n [itemType]=\"$any(child).itemType\"\n [icon]=\"$any(child).icon\"\n [label]=\"$any(child).label\"\n [link]=\"$any(child).link\"\n [badgeText]=\"$any(child).badge?.text\"\n [badgeTheme]=\"$any(child).badge?.theme || 'danger'\"\n [badgeSrContent]=\"$any(child).badge?.srContent\"\n [badgeTooltip]=\"$any(child)?.badge?.tooltip\"\n [queryParams]=\"$any(child).queryParams\"\n routerLinkActive=\"active\"\n [routerLinkActiveOptions]=\"{ exact: true }\"\n [children]=\"$any(child)?.children\"\n [active]=\"$any(child).__state?.active\"\n [expanded]=\"$any(child).__state?.expanded\"\n [hideEmptyIcon]=\"hideEmptyIcon\"\n [indentSize]=\"indentSize\">\n </seam-side-nav-item>\n </div>\n</ng-container>\n\n<ng-template #itemTypeBasic>\n <button class=\"side-nav-item btn side-nav-btn p-0 d-flex flex-row align-items-stretch rounded-0 text-decoration-none text-nowrap w-100\"\n cdkMonitorElementFocus\n (click)=\"toggleChildren()\"\n [attr.aria-expanded]=\"expanded\">\n <div class=\"nav-link d-flex flex-row align-items-center w-100\" [class.nav-link__compact]=\"compact\">\n <div [style.padding-left.px]=\"hierLevel * indentSize\"></div>\n <div class=\"side-nav-item--icon\" *ngIf=\"showIconBlock\">\n <seam-icon *ngIf=\"icon\" [icon]=\"icon\"></seam-icon>\n <ng-container *ngIf=\"compact\">\n <ng-template [ngTemplateOutlet]=\"itemBadge\"></ng-template>\n </ng-container>\n </div>\n <span *ngIf=\"!compact\" side-nav-item-label style=\"margin-left: 11px;\">\n {{ label }}\n </span>\n <span *ngIf=\"compact\" class=\"sr-only\" side-nav-item-label>{{ label }}</span>\n <ng-container *ngIf=\"!compact\">\n <ng-template [ngTemplateOutlet]=\"itemBadge\"></ng-template>\n </ng-container>\n </div>\n\n <div *ngIf=\"hasChildren && !compact\"\n class=\"btn side-nav-btn side-nav-item--toggle-btn-container rounded-0\">\n <seam-icon\n class=\"side-nav-item--toggle-btn\"\n [class.side-nav-item--toggle-btn-expanded]=\"expanded\"\n [icon]=\"faAngleLeft\"\n type>\n </seam-icon>\n </div>\n </button>\n</ng-template>\n\n<ng-template #itemTypeLink>\n <a *ngIf=\"link; else noLink\" class=\"side-nav-item nav-link d-flex flex-row text-nowrap w-100 align-items-center\"\n [class.nav-link__compact]=\"compact\"\n [routerLink]=\"link\"\n [queryParams]=\"queryParams\"\n routerLinkActive=\"active\"\n [routerLinkActiveOptions]=\"{ exact: true }\"\n (click)=\"_linkClicked()\">\n <div [style.padding-left.px]=\"hierLevel * indentSize\"></div>\n <div class=\"side-nav-item--icon\" *ngIf=\"showIconBlock\">\n <seam-icon *ngIf=\"icon\" [icon]=\"icon\"></seam-icon>\n <ng-container *ngIf=\"compact\">\n <ng-template [ngTemplateOutlet]=\"itemBadge\"></ng-template>\n </ng-container>\n </div>\n <span *ngIf=\"!compact\" style=\"margin-left: 11px;\" side-nav-item-label>\n {{ label }}\n </span>\n <span *ngIf=\"compact\" class=\"sr-only\" side-nav-item-label>{{ label }}</span>\n <ng-container *ngIf=\"!compact\">\n <ng-template [ngTemplateOutlet]=\"itemBadge\"></ng-template>\n </ng-container>\n </a>\n\n <ng-template #noLink>\n <a class=\"side-nav-item nav-link d-flex flex-row text-nowrap w-100 align-items-center\" [class.nav-link__compact]=\"compact\">\n <div [style.padding-left.px]=\"hierLevel * indentSize\"></div>\n <div class=\"side-nav-item--icon\" *ngIf=\"showIconBlock\">\n <seam-icon *ngIf=\"icon\" [icon]=\"icon\"></seam-icon>\n </div>\n <span *ngIf=\"!compact\" style=\"margin-left: 11px;\" side-nav-item-label>\n {{ label }}\n </span>\n <span *ngIf=\"compact\" class=\"sr-only\" side-nav-item-label>{{ label }}</span>\n </a>\n </ng-template>\n\n <button *ngIf=\"hasChildren && !compact\"\n type=\"button\"\n class=\"btn side-nav-btn side-nav-item--toggle-btn-container rounded-0\"\n (click)=\"toggleChildren()\"\n [attr.aria-expanded]=\"expanded\"\n cdkMonitorElementFocus>\n <seam-icon\n class=\"side-nav-item--toggle-btn\"\n [class.side-nav-item--toggle-btn-expanded]=\"expanded\"\n [icon]=\"faAngleLeft\"\n type>\n </seam-icon>\n <span class=\"sr-only\">Group Toggle</span>\n </button>\n</ng-template>\n\n<ng-template #itemTypeDivider>\n <div class=\"px-2 w-100\">\n <hr class=\"side-nav-item--divider\" />\n </div>\n</ng-template>\n\n<ng-template #itemTypeTitle>\n <ng-container *ngIf=\"!compact\">\n <span class=\"side-nav-item--title pt-1\" side-nav-item-label>{{ label }}</span>\n </ng-container>\n</ng-template>\n\n<ng-template #itemBadge>\n <ng-container *ngIf=\"badgeText\">\n <div class=\"badge-spacer flex-grow-1\" *ngIf=\"!compact\"></div>\n <div class=\"side-nav-item--badge\"\n [class.side-nav-item--badge-no-icon]=\"!icon\"\n [ngbTooltip]=\"$any(badgeTooltip)?.tooltip\"\n [tooltipClass]=\"$any(badgeTooltip)?.class\"\n [placement]=\"$any(badgeTooltip)?.placement\"\n [container]=\"$any(badgeTooltip)?.container\"\n [disableTooltip]=\"!badgeTooltip || !!$any(badgeTooltip)?.disabled\">\n <span class=\"badge badge-pill badge-{{ badgeTheme }}\">\n <ng-container *ngIf=\"!compact || !icon\">\n {{ badgeText }}\n </ng-container>\n <span *ngIf=\"badgeSrContent\">{{ badgeSrContent }}</span>\n </span>\n </div>\n </ng-container>\n</ng-template>\n",
1511
1599
  exportAs: 'seamSideNavItem',
1512
1600
  animations: [
1513
1601
  trigger('childGroupAnim', [
@@ -1540,7 +1628,7 @@ SideNavItemComponent.decorators = [
1540
1628
  ],
1541
1629
  changeDetection: ChangeDetectionStrategy.OnPush,
1542
1630
  encapsulation: ViewEncapsulation.None,
1543
- styles: ["seam-side-nav-item{display:block;transition:.25s ease-in-out background-color}seam-side-nav-item.seam-side-nav-item--active{background-color:#2a6395}seam-side-nav-item.seam-side-nav-item--active .active,seam-side-nav-item.seam-side-nav-item--active:active,seam-side-nav-item.seam-side-nav-item--active .side-nav-item.active:hover{background-color:#2a6395}seam-side-nav-item.seam-side-nav-item--active .side-nav-item:hover{background-color:#2f71a9}seam-side-nav-item.seam-side-nav-item--active .nav-link{color:#fff}seam-side-nav-item .badge{vertical-align:middle}seam-side-nav-item:not(.side-nav-item--icon) .side-nav-item--badge{pointer-events:all;margin-left:5px;margin-right:3px}seam-side-nav-item .side-nav-item--icon{position:relative;width:24px;max-width:24px;min-width:24px;height:24px;max-height:24px;min-height:24px;text-align:center}seam-side-nav-item .side-nav-item--icon .side-nav-item--badge{top:-4px;right:-4px;position:absolute}seam-side-nav-item .side-nav-item--icon .side-nav-item--badge .badge:empty{display:block;width:8px;height:8px;padding:0}seam-side-nav-item .side-nav-item--icon .side-nav-item--badge.side-nav-item--badge-no-icon{top:0px;right:0px}seam-side-nav-item .side-nav-item{min-height:45px;transition:.25s ease-in-out background-color}seam-side-nav-item .side-nav-item:hover{background-color:#2f71a9}seam-side-nav-item .side-nav-item.active{pointer-events:none;cursor:default}seam-side-nav-item a.side-nav-item:not([href]):not([tabindex]){color:#ccc}seam-side-nav-item a.side-nav-item:not([href]):not([tabindex]):hover{background-color:transparent}seam-side-nav-item .nav-link{color:#fff;padding-right:2px}seam-side-nav-item .nav-link__compact{padding-right:0;padding-left:12px}seam-side-nav-item .nav-link:last-child{padding-right:8px}seam-side-nav-item .side-nav-btn{font-weight:400;color:#fff;text-decoration:none}seam-side-nav-item .side-nav-btn:hover{color:#2f71a9;text-decoration:underline}seam-side-nav-item .side-nav-btn:focus,seam-side-nav-item .side-nav-btn.focus{text-decoration:underline;box-shadow:none}seam-side-nav-item .side-nav-btn:disabled,seam-side-nav-item .side-nav-btn.disabled{color:#ccc;pointer-events:none}seam-side-nav-item .cdk-keyboard-focused{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}seam-side-nav-item .side-nav-item--toggle-btn-container{transition:.25s ease-in-out background-color;padding:.5rem 1rem}seam-side-nav-item button.side-nav-item--toggle-btn-container:hover{background-color:#2f71a9}seam-side-nav-item .side-nav-item--toggle-btn{color:#fff}seam-side-nav-item .side-nav-item--toggle-btn .svg-inline--fa{transition:.1s ease-in-out transform}seam-side-nav-item .side-nav-item--toggle-btn.side-nav-item--toggle-btn-expanded .svg-inline--fa{transform:rotate(-90deg)}seam-side-nav-item .side-nav--group{will-change:height;overflow:hidden}seam-side-nav-item .side-nav--group--level-1{background-color:#3276b1}seam-side-nav-item .side-nav--group--level-2{background-color:#2e6ea5}seam-side-nav-item .side-nav--group--level-3{background-color:#2b6699}seam-side-nav-item .side-nav--group--level-4{background-color:#285e8d}seam-side-nav-item .side-nav--group--level-5{background-color:#245681}seam-side-nav-item .side-nav--group--level-6{background-color:#214e75}seam-side-nav-item .side-nav--group--level-7{background-color:#1e4669}seam-side-nav-item .side-nav--group--level-8{background-color:#1a3e5d}seam-side-nav-item .side-nav--group--level-9{background-color:#173651}seam-side-nav-item .side-nav-item--divider{display:block;border-top:1px solid #2a6395;width:100%}seam-side-nav-item .side-nav-item--title{color:#fff;font-size:24px;padding-left:10px}seam-side-nav-item .sr-only{top:0;left:0}\n"]
1631
+ styles: ["seam-side-nav-item{display:block;transition:.25s ease-in-out background-color}seam-side-nav-item.seam-side-nav-item--active{background-color:#2a6395}seam-side-nav-item.seam-side-nav-item--active .active,seam-side-nav-item.seam-side-nav-item--active:active,seam-side-nav-item.seam-side-nav-item--active .side-nav-item.active:hover{background-color:#2a6395}seam-side-nav-item.seam-side-nav-item--active .side-nav-item:hover{background-color:#2f71a9}seam-side-nav-item.seam-side-nav-item--active .nav-link{color:#fff}seam-side-nav-item.seam-side-nav-item--active .side-nav-btn{color:#fff}seam-side-nav-item .badge{vertical-align:middle}seam-side-nav-item:not(.side-nav-item--icon) .side-nav-item--badge{pointer-events:all;margin-left:5px;margin-right:3px}seam-side-nav-item .side-nav-item--icon{position:relative;width:24px;max-width:24px;min-width:24px;height:24px;max-height:24px;min-height:24px;text-align:center}seam-side-nav-item .side-nav-item--icon .side-nav-item--badge{top:-4px;right:-4px;position:absolute}seam-side-nav-item .side-nav-item--icon .side-nav-item--badge .badge:empty{display:block;width:8px;height:8px;padding:0}seam-side-nav-item .side-nav-item--icon .side-nav-item--badge.side-nav-item--badge-no-icon{top:0px;right:0px}seam-side-nav-item .side-nav-item{min-height:45px;transition:.25s ease-in-out background-color}seam-side-nav-item .side-nav-item:hover{background-color:#2f71a9}seam-side-nav-item .side-nav-item.active{pointer-events:none;cursor:default}seam-side-nav-item a.side-nav-item:not([href]):not([tabindex]){color:#ccc}seam-side-nav-item a.side-nav-item:not([href]):not([tabindex]):hover{background-color:transparent}seam-side-nav-item .nav-link{color:#fff;padding-right:2px}seam-side-nav-item .nav-link__compact{padding-right:0;padding-left:12px}seam-side-nav-item .nav-link:last-child{padding-right:8px}seam-side-nav-item .side-nav-btn{font-weight:400;color:#fff;text-decoration:none}seam-side-nav-item .side-nav-btn:hover{color:#fff;text-decoration:underline}seam-side-nav-item .side-nav-btn:focus,seam-side-nav-item .side-nav-btn.focus{text-decoration:underline;box-shadow:none}seam-side-nav-item .side-nav-btn:disabled,seam-side-nav-item .side-nav-btn.disabled{color:#ccc;pointer-events:none}seam-side-nav-item .cdk-keyboard-focused{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}seam-side-nav-item .side-nav-item--toggle-btn-container{transition:.25s ease-in-out background-color;padding:.5rem 1rem}seam-side-nav-item button.side-nav-item--toggle-btn-container:hover{background-color:#2f71a9}seam-side-nav-item .side-nav-item--toggle-btn .svg-inline--fa{transition:.1s ease-in-out transform}seam-side-nav-item .side-nav-item--toggle-btn.side-nav-item--toggle-btn-expanded .svg-inline--fa{transform:rotate(-90deg)}seam-side-nav-item .side-nav--group{will-change:height;overflow:hidden}seam-side-nav-item .side-nav--group--level-1{background-color:#3276b1}seam-side-nav-item .side-nav--group--level-2{background-color:#2e6ea5}seam-side-nav-item .side-nav--group--level-3{background-color:#2b6699}seam-side-nav-item .side-nav--group--level-4{background-color:#285e8d}seam-side-nav-item .side-nav--group--level-5{background-color:#245681}seam-side-nav-item .side-nav--group--level-6{background-color:#214e75}seam-side-nav-item .side-nav--group--level-7{background-color:#1e4669}seam-side-nav-item .side-nav--group--level-8{background-color:#1a3e5d}seam-side-nav-item .side-nav--group--level-9{background-color:#173651}seam-side-nav-item .side-nav-item--divider{display:block;border-top:1px solid #2a6395;width:100%}seam-side-nav-item .side-nav-item--title{color:#fff;font-size:24px;padding-left:10px}seam-side-nav-item .sr-only{top:0;left:0}\n"]
1544
1632
  },] }
1545
1633
  ];
1546
1634
  SideNavItemComponent.ctorParameters = () => [
@@ -1550,6 +1638,7 @@ SideNavItemComponent.ctorParameters = () => [
1550
1638
  SideNavItemComponent.propDecorators = {
1551
1639
  itemType: [{ type: Input }],
1552
1640
  icon: [{ type: Input }],
1641
+ hideEmptyIcon: [{ type: Input }],
1553
1642
  label: [{ type: Input }],
1554
1643
  active: [{ type: Input }],
1555
1644
  link: [{ type: Input }],
@@ -1578,7 +1667,6 @@ __decorate([
1578
1667
 
1579
1668
  class SideNavToggleComponent {
1580
1669
  constructor() {
1581
- this.faBars = faBars;
1582
1670
  this.expanded = false;
1583
1671
  this.toggleExpand = new EventEmitter();
1584
1672
  }
@@ -1590,18 +1678,20 @@ class SideNavToggleComponent {
1590
1678
  SideNavToggleComponent.decorators = [
1591
1679
  { type: Component, args: [{
1592
1680
  selector: 'seam-side-nav-toggle',
1593
- template: "<div class=\"side-nav-toggle--content\" *ngIf=\"expanded\">\n <ng-content></ng-content>\n</div>\n<button seamIconBtn [icon]=\"faBars\"\n iconType=\"borderless-styled-square\"\n btnSize=\"sm\"\n class=\"side-nav-toggle--btn ml-1\"\n (click)=\"toggle()\">\n <span class=\"sr-only\">Toggle sidebar</span>\n</button>\n",
1681
+ template: "<div class=\"side-nav-toggle--content\">\n <ng-container *ngIf=\"expanded\">\n <ng-content></ng-content>\n </ng-container>\n</div>\n\n<ng-container *ngIf=\"toggleTpl; else iconBtn\">\n <button\n class=\"side-nav-toggle--btn mx-1\"\n (click)=\"toggle()\">\n <span class=\"sr-only\">Toggle sidebar</span>\n <ng-container *ngTemplateOutlet=\"toggleTpl\"></ng-container>\n </button>\n</ng-container>\n\n<ng-template #iconBtn>\n <button seamIconBtn [icon]=\"toggleIcon\"\n iconType=\"borderless-styled-square\"\n btnSize=\"sm\"\n class=\"side-nav-toggle--btn mx-1\"\n (click)=\"toggle()\">\n <span class=\"sr-only\">Toggle sidebar</span>\n </button>\n</ng-template>\n",
1594
1682
  host: {
1595
1683
  '[class.side-nav-toggle--compact]': '!expanded'
1596
1684
  },
1597
1685
  changeDetection: ChangeDetectionStrategy.OnPush,
1598
1686
  encapsulation: ViewEncapsulation.None,
1599
- styles: ["seam-side-nav-toggle{display:flex;flex-direction:row;flex-shrink:0;position:relative;height:45px;width:100%}seam-side-nav-toggle .side-nav-toggle--content{flex:1 1 0}seam-side-nav-toggle .side-nav-toggle--btn{position:absolute;top:0;right:5px;color:#fff}seam-side-nav-toggle .side-nav-toggle--btn seam-icon{padding:5px}\n"]
1687
+ styles: ["seam-side-nav-toggle{display:flex;flex-direction:row;flex-shrink:0;align-items:center;background:#357ebd;position:relative;height:45px;width:100%}seam-side-nav-toggle .side-nav-toggle--content{flex:1 1 0}seam-side-nav-toggle .side-nav-toggle--btn{color:#fff}seam-side-nav-toggle .side-nav-toggle--btn seam-icon{padding:5px}\n"]
1600
1688
  },] }
1601
1689
  ];
1602
1690
  SideNavToggleComponent.ctorParameters = () => [];
1603
1691
  SideNavToggleComponent.propDecorators = {
1604
1692
  expanded: [{ type: Input }],
1693
+ toggleIcon: [{ type: Input }],
1694
+ toggleTpl: [{ type: Input }],
1605
1695
  toggleExpand: [{ type: Output }]
1606
1696
  };
1607
1697
  __decorate([
@@ -1655,7 +1745,7 @@ TopBarMenuButtonComponent.decorators = [
1655
1745
  { type: Component, args: [{
1656
1746
  // tslint:disable-next-line:component-selector
1657
1747
  selector: 'button[seamTopBarMenuButton]',
1658
- template: "<div class=\"d-flex flex-row\" *ngIf=\"!compact; else compactTpl\">\n <div class=\"text-left flex-grow-1 text-truncate\">\n <ng-template [ngTemplateOutlet]=\"$any(detailTpl)\"></ng-template>\n </div>\n <!-- Arrow Button -->\n <div class=\"pl-2 d-flex flex-column\">\n <div class=\"flex-grow-1\"></div>\n <seam-icon class=\"d-block\" [icon]=\"faAngleDown\"></seam-icon>\n <div class=\"flex-grow-1\"></div>\n </div>\n</div>\n<ng-template #compactTpl>\n <seam-icon [icon]=\"profileIcon\" iconType=\"borderless-styled-square\"></seam-icon>\n</ng-template>\n",
1748
+ template: "<div class=\"d-flex flex-row\" *ngIf=\"!compact; else compactTpl\">\n <div class=\"text-left flex-grow-1 text-truncate\">\n <ng-template [ngTemplateOutlet]=\"$any(detailTpl)\"></ng-template>\n </div>\n <!-- Arrow Button -->\n <div class=\"pl-2 d-flex flex-column\">\n <div class=\"flex-grow-1\"></div>\n <seam-icon class=\"d-block\" [icon]=\"faAngleDown\"></seam-icon>\n <div class=\"flex-grow-1\"></div>\n </div>\n</div>\n<ng-template #compactTpl>\n <ng-container *ngIf=\"compactDetailTpl; else iconTpl\">\n <ng-template [ngTemplateOutlet]=\"$any(compactDetailTpl)\"></ng-template>\n </ng-container>\n <ng-template #iconTpl>\n <seam-icon [icon]=\"profileIcon\" iconType=\"borderless-styled-square\"></seam-icon>\n </ng-template>\n</ng-template>\n",
1659
1749
  encapsulation: ViewEncapsulation.None,
1660
1750
  exportAs: 'seamButton',
1661
1751
  // tslint:disable-next-line:use-input-property-decorator
@@ -1663,7 +1753,7 @@ TopBarMenuButtonComponent.decorators = [
1663
1753
  // tslint:disable-next-line:use-host-property-decorator
1664
1754
  host: {
1665
1755
  'attr.type': 'button',
1666
- 'class': 'btn border text-decoration-none py-0',
1756
+ 'class': 'btn border text-decoration-none py-0 top-bar-menu-button',
1667
1757
  '[attr.aria-disabled]': 'disabled.toString()',
1668
1758
  '[attr.disabled]': 'disabled || null',
1669
1759
  },
@@ -1673,6 +1763,7 @@ TopBarMenuButtonComponent.decorators = [
1673
1763
  ];
1674
1764
  TopBarMenuButtonComponent.propDecorators = {
1675
1765
  detailTpl: [{ type: Input }],
1766
+ compactDetailTpl: [{ type: Input }],
1676
1767
  compact: [{ type: Input }],
1677
1768
  profileIcon: [{ type: Input }],
1678
1769
  _hasCompactClass: [{ type: HostBinding, args: ['class.top-bar-menu-button--compact',] }],
@@ -1706,6 +1797,10 @@ TopBarTitleComponent.propDecorators = {
1706
1797
  class TopBarItemDirective {
1707
1798
  constructor(template) {
1708
1799
  this.template = template;
1800
+ this.position = 'right';
1801
+ }
1802
+ set seamTopBarItem(value) {
1803
+ this.position = value;
1709
1804
  }
1710
1805
  }
1711
1806
  TopBarItemDirective.decorators = [
@@ -1715,7 +1810,10 @@ TopBarItemDirective.decorators = [
1715
1810
  ];
1716
1811
  TopBarItemDirective.ctorParameters = () => [
1717
1812
  { type: TemplateRef }
1718
- ];
1813
+ ];
1814
+ TopBarItemDirective.propDecorators = {
1815
+ seamTopBarItem: [{ type: Input }]
1816
+ };
1719
1817
 
1720
1818
  class TopBarMenuBtnDetailDirective {
1721
1819
  constructor(template) {
@@ -1745,6 +1843,34 @@ TopBarMenuDirective.ctorParameters = () => [
1745
1843
  { type: MenuComponent, decorators: [{ type: Self }] }
1746
1844
  ];
1747
1845
 
1846
+ class TopBarCompactMenuBtnDetailDirective {
1847
+ constructor(template) {
1848
+ this.template = template;
1849
+ }
1850
+ }
1851
+ TopBarCompactMenuBtnDetailDirective.decorators = [
1852
+ { type: Directive, args: [{
1853
+ selector: '[seamTopBarCompactMenuBtnDetail]'
1854
+ },] }
1855
+ ];
1856
+ TopBarCompactMenuBtnDetailDirective.ctorParameters = () => [
1857
+ { type: TemplateRef }
1858
+ ];
1859
+
1860
+ class TopBarNavToggleBtnDetailDirective {
1861
+ constructor(template) {
1862
+ this.template = template;
1863
+ }
1864
+ }
1865
+ TopBarNavToggleBtnDetailDirective.decorators = [
1866
+ { type: Directive, args: [{
1867
+ selector: '[seamTopBarNavToggleBtnDetail]'
1868
+ },] }
1869
+ ];
1870
+ TopBarNavToggleBtnDetailDirective.ctorParameters = () => [
1871
+ { type: TemplateRef }
1872
+ ];
1873
+
1748
1874
  /**
1749
1875
  * Top bar of an app.
1750
1876
  *
@@ -1769,8 +1895,26 @@ class TheSeamTopBarComponent {
1769
1895
  this.logoRoute = '/';
1770
1896
  /** Determines if the title should be displayed. */
1771
1897
  this.hasTitle = false;
1898
+ /** Determines if the top bar button should be displayed. */
1899
+ this.hasTopBarMenuButton = true;
1772
1900
  /** Icon to display on mobile to activate profile dropdown. Defaults to faUserCircle. */
1773
1901
  this.profileIcon = faUserCircle;
1902
+ /** Icon to display for mobile nav toggle. Defaults to faBars. */
1903
+ this.toggleIcon = faBars;
1904
+ /** Display nav toggle on either left or right side of top bar. Defaults to left. */
1905
+ this.navToggleAlign = 'left';
1906
+ /** @ignore */
1907
+ this._leftItems = new BehaviorSubject([]);
1908
+ /** Additional templates to display on left side of top bar */
1909
+ this.leftItems$ = this._leftItems.asObservable();
1910
+ /** @ignore */
1911
+ this._centerItems = new BehaviorSubject([]);
1912
+ /** Additional templates to display in center of top bar */
1913
+ this.centerItems$ = this._centerItems.asObservable();
1914
+ /** @ignore */
1915
+ this._rightItems = new BehaviorSubject([]);
1916
+ /** Additional templates to display on right side of top bar */
1917
+ this.rightItems$ = this._rightItems.asObservable();
1774
1918
  this.isMobile$ = this._layout.isMobile$;
1775
1919
  }
1776
1920
  /** @ignore */
@@ -1783,18 +1927,27 @@ class TheSeamTopBarComponent {
1783
1927
  /** @ignore */
1784
1928
  ngAfterContentInit() {
1785
1929
  if (this._topBarItems) {
1786
- this._items$ = this._topBarItems.changes.pipe(startWith(undefined), takeUntil(this._ngUnsubscribe), map(() => { var _a; return ((_a = this._topBarItems) === null || _a === void 0 ? void 0 : _a.toArray()) || []; }), shareReplay({ bufferSize: 1, refCount: true }));
1930
+ this._topBarItems.changes.pipe(startWith(undefined), takeUntil(this._ngUnsubscribe), map(() => {
1931
+ var _a;
1932
+ const items = ((_a = this._topBarItems) === null || _a === void 0 ? void 0 : _a.toArray()) || [];
1933
+ const left = items.filter(i => i.position === 'left');
1934
+ const right = items.filter(i => i.position === 'right');
1935
+ const center = items.filter(i => i.position === 'center');
1936
+ this._leftItems.next(left);
1937
+ this._rightItems.next(right);
1938
+ this._centerItems.next(center);
1939
+ }), shareReplay({ bufferSize: 1, refCount: true })).subscribe();
1787
1940
  }
1788
1941
  }
1789
1942
  }
1790
1943
  TheSeamTopBarComponent.decorators = [
1791
1944
  { type: Component, args: [{
1792
1945
  selector: 'seam-top-bar',
1793
- template: "<!-- Nav Toggle -->\n<div class=\"d-flex flex-column justify-content-center pr-2\" *ngIf=\"isMobile$ | async\">\n <button seamBaseLayoutNavToggle seamIconBtn [icon]=\"faBars\" iconType=\"borderless-styled-square\"></button>\n</div>\n\n<!-- Logo -->\n<div class=\"top-bar--logo d-flex flex-column justify-content-center\" *ngIf=\"logoHref; else useLogoRoute\"\n [class.top-bar--logo-mobile]=\"isMobile$ | async\">\n <a [href]=\"logoHref\" [target]=\"logoHrefTarget\">\n <div>\n <img *ngIf=\"logo\" [src]=\"logo\" [src.lt-md]=\"hasTitle ? logoSm : logo\" alt=\"Logo\">\n </div>\n </a>\n</div>\n\n<ng-template #useLogoRoute>\n <div class=\"top-bar--logo d-flex flex-column justify-content-center\" [routerLink]=\"logoRoute\"\n [class.top-bar--logo-mobile]=\"isMobile$ | async\">\n <div>\n <img *ngIf=\"logo\" [src]=\"logo\" [src.lt-md]=\"hasTitle ? logoSm : logo\" alt=\"Logo\">\n </div>\n </div>\n</ng-template>\n\n<!-- Title -->\n<div class=\"d-flex flex-column flex-grow-1\">\n <seam-top-bar-title *ngIf=\"hasTitle\"\n [titleText]=\"titleText\"\n [subTitleText]=\"subTitleText\"\n [class.ml-2]=\"isMobile$ | async\">\n </seam-top-bar-title>\n</div>\n\n<!-- Items -->\n<div class=\"top-bar-icon-container mr-2\">\n <ng-container *ngFor=\"let item of _items$ | async\">\n <ng-template [ngTemplateOutlet]=\"item.template\"></ng-template>\n </ng-container>\n</div>\n\n<!-- Menu -->\n<button seamTopBarMenuButton\n [seamMenuToggle]=\"_topBarMenu?.menu\"\n [detailTpl]=\"_topBarMenuBtnDetailTpl?.template\"\n [compact]=\"isMobile$ | async\"\n [profileIcon]=\"profileIcon\">\n</button>\n",
1946
+ template: "<div class=\"top-bar--left d-flex\">\n <!-- Nav Toggle -->\n <ng-container *ngIf=\"navToggleAlign === 'left'\">\n <ng-container *ngTemplateOutlet=\"navToggle\"></ng-container>\n </ng-container>\n\n <!-- Logo -->\n <div class=\"top-bar--logo d-flex flex-column justify-content-center\" *ngIf=\"logoHref; else useLogoRoute\"\n [class.top-bar--logo-mobile]=\"isMobile$ | async\">\n <a [href]=\"logoHref\" [target]=\"logoHrefTarget\">\n <ng-container *ngTemplateOutlet=\"logoTpl\"></ng-container>\n </a>\n </div>\n\n <ng-template #useLogoRoute>\n <div class=\"top-bar--logo d-flex flex-column justify-content-center\" [routerLink]=\"logoRoute\"\n [class.top-bar--logo-mobile]=\"isMobile$ | async\">\n <ng-container *ngTemplateOutlet=\"logoTpl\"></ng-container>\n </div>\n </ng-template>\n\n <ng-template #logoTpl>\n <div>\n <img *ngIf=\"logo\" [src]=\"logo\" [src.lt-md]=\"logoSm ? logoSm : logo\" alt=\"Logo\">\n </div>\n </ng-template>\n\n <!-- Title -->\n <div class=\"d-flex flex-column\" *ngIf=\"hasTitle\">\n <seam-top-bar-title\n [titleText]=\"titleText\"\n [subTitleText]=\"subTitleText\"\n [class.ml-2]=\"isMobile$ | async\">\n </seam-top-bar-title>\n </div>\n\n <!-- Items -->\n <div class=\"top-bar-items top-bar-items--left mr-2\">\n <ng-container *ngFor=\"let item of leftItems$ | async\">\n <ng-template [ngTemplateOutlet]=\"item.template\"></ng-template>\n </ng-container>\n </div>\n</div>\n\n<div class=\"top-bar--center\">\n <!-- Items -->\n <div class=\"top-bar-items top-bar-items--center mr-2\">\n <ng-container *ngFor=\"let item of centerItems$ | async\">\n <ng-template [ngTemplateOutlet]=\"item.template\"></ng-template>\n </ng-container>\n </div>\n</div>\n\n<div class=\"top-bar--right d-flex\">\n <!-- Items -->\n <div class=\"top-bar-items top-bar-items--right mr-2\">\n <ng-container *ngFor=\"let item of rightItems$ | async\">\n <ng-template [ngTemplateOutlet]=\"item.template\"></ng-template>\n </ng-container>\n </div>\n\n <!-- Menu -->\n <button\n *ngIf=\"hasTopBarMenuButton\"\n seamTopBarMenuButton\n [seamMenuToggle]=\"_topBarMenu?.menu\"\n [detailTpl]=\"_topBarMenuBtnDetailTpl?.template\"\n [compactDetailTpl]=\"_topBarCompactMenuBtnDetailTpl?.template\"\n [compact]=\"isMobile$ | async\"\n [profileIcon]=\"profileIcon\">\n </button>\n\n <ng-container *ngIf=\"navToggleAlign === 'right'\">\n <ng-container *ngTemplateOutlet=\"navToggle\"></ng-container>\n </ng-container>\n</div>\n\n<ng-template #navToggle>\n <div class=\"d-flex flex-column justify-content-center pr-2\" *ngIf=\"isMobile$ | async\">\n <ng-container *ngIf=\"_topBarNavToggleBtnDetailTpl; else iconBtn\">\n <button seamButton seamBaseLayoutNavToggle>\n <ng-template [ngTemplateOutlet]=\"_topBarNavToggleBtnDetailTpl?.template\"></ng-template>\n </button>\n </ng-container>\n <ng-template #iconBtn>\n <button seamBaseLayoutNavToggle seamIconBtn [icon]=\"toggleIcon\" iconType=\"borderless-styled-square\"></button>\n </ng-template>\n </div>\n</ng-template>\n\n",
1794
1947
  encapsulation: ViewEncapsulation.None,
1795
1948
  exportAs: 'seamTopBar',
1796
1949
  changeDetection: ChangeDetectionStrategy.OnPush,
1797
- styles: ["seam-top-bar{display:flex;flex:1 1 100%;flex-direction:row;background:white;margin:0;padding:8px;border-radius:0;box-shadow:none}.top-bar--logo{flex:0 0 auto;overflow:hidden;cursor:pointer}.top-bar--logo img{height:auto;max-height:60px;width:auto;max-width:200px}.top-bar--logo.top-bar--logo-mobile img{height:auto;max-height:40px;width:auto;max-width:150px}.top-bar-icon-container{margin:auto 0}\n"]
1950
+ styles: ["seam-top-bar{display:flex;flex:1 1 100%;flex-direction:row;background:white;margin:0;padding:8px;border-radius:0;box-shadow:none}.top-bar--logo{flex:0 0 auto;overflow:hidden;cursor:pointer}.top-bar--logo img{height:auto;max-height:60px;width:auto;max-width:200px}.top-bar--logo.top-bar--logo-mobile img{height:auto;max-height:40px;width:auto;max-width:150px}.top-bar--left{flex-grow:1}.top-bar-items{display:flex;align-items:center}\n"]
1798
1951
  },] }
1799
1952
  ];
1800
1953
  TheSeamTopBarComponent.ctorParameters = () => [
@@ -1804,6 +1957,8 @@ TheSeamTopBarComponent.propDecorators = {
1804
1957
  _topBarMenu: [{ type: ContentChild, args: [TopBarMenuDirective, { static: true },] }],
1805
1958
  _topBarItems: [{ type: ContentChildren, args: [TopBarItemDirective,] }],
1806
1959
  _topBarMenuBtnDetailTpl: [{ type: ContentChild, args: [TopBarMenuBtnDetailDirective,] }],
1960
+ _topBarCompactMenuBtnDetailTpl: [{ type: ContentChild, args: [TopBarCompactMenuBtnDetailDirective,] }],
1961
+ _topBarNavToggleBtnDetailTpl: [{ type: ContentChild, args: [TopBarNavToggleBtnDetailDirective,] }],
1807
1962
  logo: [{ type: Input }],
1808
1963
  logoSm: [{ type: Input }],
1809
1964
  logoHref: [{ type: Input }],
@@ -1812,11 +1967,17 @@ TheSeamTopBarComponent.propDecorators = {
1812
1967
  hasTitle: [{ type: Input }],
1813
1968
  titleText: [{ type: Input }],
1814
1969
  subTitleText: [{ type: Input }],
1815
- profileIcon: [{ type: Input }]
1970
+ hasTopBarMenuButton: [{ type: Input }],
1971
+ profileIcon: [{ type: Input }],
1972
+ toggleIcon: [{ type: Input }],
1973
+ navToggleAlign: [{ type: Input }]
1816
1974
  };
1817
1975
  __decorate([
1818
1976
  InputBoolean()
1819
- ], TheSeamTopBarComponent.prototype, "hasTitle", void 0);
1977
+ ], TheSeamTopBarComponent.prototype, "hasTitle", void 0);
1978
+ __decorate([
1979
+ InputBoolean()
1980
+ ], TheSeamTopBarComponent.prototype, "hasTopBarMenuButton", void 0);
1820
1981
 
1821
1982
  class TheSeamTopBarModule {
1822
1983
  }
@@ -1828,7 +1989,9 @@ TheSeamTopBarModule.decorators = [
1828
1989
  TopBarMenuButtonComponent,
1829
1990
  TopBarMenuDirective,
1830
1991
  TopBarItemDirective,
1831
- TopBarMenuBtnDetailDirective
1992
+ TopBarMenuBtnDetailDirective,
1993
+ TopBarCompactMenuBtnDetailDirective,
1994
+ TopBarNavToggleBtnDetailDirective
1832
1995
  ],
1833
1996
  imports: [
1834
1997
  CommonModule,
@@ -1845,7 +2008,9 @@ TheSeamTopBarModule.decorators = [
1845
2008
  TopBarMenuDirective,
1846
2009
  TheSeamMenuModule,
1847
2010
  TopBarItemDirective,
1848
- TopBarMenuBtnDetailDirective
2011
+ TopBarMenuBtnDetailDirective,
2012
+ TopBarCompactMenuBtnDetailDirective,
2013
+ TopBarNavToggleBtnDetailDirective
1849
2014
  ]
1850
2015
  },] }
1851
2016
  ];
@@ -2677,9 +2842,533 @@ TheSeamSchemaFormModule.decorators = [
2677
2842
  },] }
2678
2843
  ];
2679
2844
 
2845
+ function isHorizontalNavItemType(item, type) {
2846
+ return item.itemType === type;
2847
+ }
2848
+ function isHorizontalNavItemActive(item) {
2849
+ var _a, _b;
2850
+ return (_b = (_a = item.__state) === null || _a === void 0 ? void 0 : _a.active) !== null && _b !== void 0 ? _b : false;
2851
+ }
2852
+ function isHorizontalNavItemExpanded(item) {
2853
+ var _a, _b;
2854
+ return (_b = (_a = item.__state) === null || _a === void 0 ? void 0 : _a.expanded) !== null && _b !== void 0 ? _b : false;
2855
+ }
2856
+ function horizontalNavItemHasChildren(item) {
2857
+ return horizontalNavItemCanHaveChildren(item) && hasProperty(item, 'children') && item.children.length > 0;
2858
+ }
2859
+ function horizontalNavItemCanHaveChildren(item) {
2860
+ return isHorizontalNavItemType(item, 'basic') || isHorizontalNavItemType(item, 'link');
2861
+ }
2862
+ function horizontalNavItemHasActiveChild(item) {
2863
+ if (!horizontalNavItemHasChildren(item)) {
2864
+ return false;
2865
+ }
2866
+ for (const child of item.children) {
2867
+ if (getHorizontalNavItemStateProp(child, 'active') || horizontalNavItemHasActiveChild(child)) {
2868
+ return true;
2869
+ }
2870
+ }
2871
+ return false;
2872
+ }
2873
+ function horizontalNavItemHasExpandedChild(item) {
2874
+ if (!horizontalNavItemHasChildren(item)) {
2875
+ return false;
2876
+ }
2877
+ for (const child of item.children) {
2878
+ if (getHorizontalNavItemStateProp(child, 'expanded')) {
2879
+ return true;
2880
+ }
2881
+ }
2882
+ return false;
2883
+ }
2884
+ function horizontalNavItemCanBeActive(item) {
2885
+ return isHorizontalNavItemType(item, 'basic') || isHorizontalNavItemType(item, 'link');
2886
+ }
2887
+ function horizontalNavItemCanExpand(item) {
2888
+ return horizontalNavItemCanHaveChildren(item);
2889
+ }
2890
+ function findHorizontalNavLinkItems(items) {
2891
+ const linkItems = [];
2892
+ const _fn = (_items) => {
2893
+ for (const item of _items) {
2894
+ if (isHorizontalNavItemType(item, 'link')) {
2895
+ linkItems.push(item);
2896
+ }
2897
+ if (horizontalNavItemCanHaveChildren(item) && hasProperty(item, 'children')) {
2898
+ _fn(item.children);
2899
+ }
2900
+ }
2901
+ };
2902
+ _fn(items);
2903
+ return linkItems;
2904
+ }
2905
+ function setHorizontalNavItemStateProp(item, prop, value) {
2906
+ if (hasProperty(item, '__state')) {
2907
+ item.__state[prop] = value;
2908
+ }
2909
+ }
2910
+ function getHorizontalNavItemStateProp(item, prop) {
2911
+ return setDefaultHorizontalNavItemState(item).__state[prop];
2912
+ }
2913
+ function setDefaultHorizontalNavItemState(item) {
2914
+ if (hasProperty(item, '__state')) {
2915
+ return item;
2916
+ }
2917
+ item.__state = {
2918
+ active: false,
2919
+ expanded: false
2920
+ };
2921
+ // TODO: See if there is a nice way to fix the typing for this.
2922
+ return item;
2923
+ }
2924
+ function areSameHorizontalNavItem(item1, item2) {
2925
+ if (isNullOrUndefined(item1) || isNullOrUndefined(item2)) {
2926
+ return false;
2927
+ }
2928
+ if (item1.itemType !== item2.itemType) {
2929
+ return false;
2930
+ }
2931
+ if (isHorizontalNavItemType(item1, 'title') && isHorizontalNavItemType(item2, 'title')) {
2932
+ return item1.label === item2.label;
2933
+ }
2934
+ else if (isHorizontalNavItemType(item1, 'divider') && isHorizontalNavItemType(item2, 'divider')) {
2935
+ return item1.label === item2.label;
2936
+ }
2937
+ else if (isHorizontalNavItemType(item1, 'basic') && isHorizontalNavItemType(item2, 'basic')) {
2938
+ return item1.label === item2.label;
2939
+ }
2940
+ else if (isHorizontalNavItemType(item1, 'link') && isHorizontalNavItemType(item2, 'link')) {
2941
+ return item1.label === item2.label && item1.link === item2.link;
2942
+ }
2943
+ else if (isHorizontalNavItemType(item1, 'button') && isHorizontalNavItemType(item2, 'button')) {
2944
+ return item1.onClick === item2.onClick;
2945
+ }
2946
+ return false;
2947
+ }
2948
+
2949
+ class NavItemComponent {
2950
+ constructor() {
2951
+ this._ngUnsubscribe = new Subject();
2952
+ this.faAngleLeft = faAngleLeft;
2953
+ this.active = false;
2954
+ this._link = new BehaviorSubject(undefined);
2955
+ this.link$ = this._link.asObservable();
2956
+ this.hierLevel = 0;
2957
+ this.indentSize = 10;
2958
+ this._expanded = new BehaviorSubject(false);
2959
+ this.expanded$ = this._expanded.asObservable();
2960
+ this._compact = new BehaviorSubject(false);
2961
+ this.compact$ = this._compact.asObservable();
2962
+ this.badgeTheme = 'danger';
2963
+ this.childAction = 'menu';
2964
+ this.expandAction = 'toggle';
2965
+ this.navItemExpanded = new EventEmitter();
2966
+ }
2967
+ set link(value) { this._link.next(value); }
2968
+ get link() { return this._link.value; }
2969
+ set expanded(value) {
2970
+ this._expanded.next(coerceBooleanProperty(value));
2971
+ }
2972
+ get expanded() { return this._expanded.value; }
2973
+ set compact(value) { this._compact.next(coerceBooleanProperty(value)); }
2974
+ get compact() { return this._compact.value; }
2975
+ get badgeTooltip() { return this._badgeTooltip; }
2976
+ set badgeTooltip(value) {
2977
+ if (value !== null && value !== undefined) {
2978
+ if (typeof value === 'string') {
2979
+ this._badgeTooltip = {
2980
+ tooltip: value,
2981
+ placement: 'auto',
2982
+ disabled: false
2983
+ };
2984
+ }
2985
+ else {
2986
+ this._badgeTooltip = Object.assign(Object.assign({}, value), { placement: value.placement || 'auto', disabled: typeof (value === null || value === void 0 ? void 0 : value.disabled) === 'boolean'
2987
+ ? value.disabled
2988
+ : typeof value.tooltip === 'string' ? false : true });
2989
+ }
2990
+ }
2991
+ else {
2992
+ this._badgeTooltip = undefined;
2993
+ }
2994
+ }
2995
+ get _isActiveCssClass() { return this.active; }
2996
+ get _isChildActiveCssClass() { return this.hasActiveChild; }
2997
+ get _isExpandedCssClass() { return this.expanded; }
2998
+ get _attrDataHierLevel() { return this.hierLevel; }
2999
+ ngOnDestroy() {
3000
+ this._ngUnsubscribe.next();
3001
+ this._ngUnsubscribe.complete();
3002
+ }
3003
+ get hasChildren() {
3004
+ return Array.isArray(this.children) && this.children.length > 0;
3005
+ }
3006
+ get hasActiveChild() {
3007
+ if (notNullOrUndefined(this.item)) {
3008
+ return horizontalNavItemHasActiveChild(this.item);
3009
+ }
3010
+ return false;
3011
+ }
3012
+ get hasMenuToggle() {
3013
+ return this.hasChildren && this.childAction === 'menu';
3014
+ }
3015
+ get menuTpl() {
3016
+ return this.hasMenuToggle ? this._menu : undefined;
3017
+ }
3018
+ get hasExpandingChildren() {
3019
+ return this.hasChildren && this.childAction === 'expand';
3020
+ }
3021
+ _toggleChildren(event) {
3022
+ let ex = !this.expanded;
3023
+ if (this.expandAction === 'expandOnly') {
3024
+ ex = true;
3025
+ }
3026
+ this.expanded = ex;
3027
+ this.navItemExpanded.emit(this.expanded);
3028
+ // Prevents seam-menu from closing out when toggling child expand
3029
+ event.stopPropagation();
3030
+ }
3031
+ // Updates expanded state when user exits seam-menu
3032
+ _menuEvent(menuExpanded) {
3033
+ if (menuExpanded === false) {
3034
+ this.expanded = false;
3035
+ // TODO: figure out why closing seam-menu with expanded submenu messes up animation
3036
+ if (this._navItems && this._navItems.length) {
3037
+ this._navItems.forEach(navItem => {
3038
+ navItem.expanded = false;
3039
+ });
3040
+ }
3041
+ }
3042
+ }
3043
+ get showIconBlock() {
3044
+ return notNullOrUndefined(this.icon) || this.hideEmptyIcon !== true;
3045
+ }
3046
+ }
3047
+ NavItemComponent.decorators = [
3048
+ { type: Component, args: [{
3049
+ selector: 'seam-nav-item',
3050
+ template: "<div class=\"d-flex flex-row h-100\">\n <ng-container *ngIf=\"itemType === 'basic'\">\n <ng-template [ngTemplateOutlet]=\"itemTypeBasic\"></ng-template>\n </ng-container>\n <ng-container *ngIf=\"itemType === 'link'\">\n <ng-template [ngTemplateOutlet]=\"itemTypeLink\"></ng-template>\n </ng-container>\n <ng-container *ngIf=\"itemType === 'divider'\">\n <ng-template [ngTemplateOutlet]=\"itemTypeDivider\"></ng-template>\n </ng-container>\n <ng-container *ngIf=\"itemType === 'title'\">\n <ng-template [ngTemplateOutlet]=\"itemTypeTitle\"></ng-template>\n </ng-container>\n</div>\n\n<ng-container *ngIf=\"hasExpandingChildren\">\n <div class=\"nav--group nav--group--level-{{ hierLevel + 1 }}\"\n *ngIf=\"expanded$ | async\" @childGroupAnim>\n <ng-container *ngTemplateOutlet=\"navChildren\"></ng-container>\n </div>\n</ng-container>\n\n<ng-template #itemTypeBasic>\n <button class=\"nav-item btn nav-btn p-0 d-flex align-items-stretch flex-row text-decoration-none w-100\"\n cdkMonitorElementFocus\n (click)=\"_toggleChildren($event)\"\n [seamMenuToggle]=\"menuTpl\"\n (menuToggle)=\"_menuEvent($event)\"\n [attr.aria-expanded]=\"expanded$ | async\">\n <div class=\"nav-link d-flex flex-row align-items-center w-100\" [class.nav-link__compact]=\"compact\">\n <div class=\"nav-item--icon\" *ngIf=\"showIconBlock\">\n <seam-icon [icon]=\"icon\" *ngIf=\"icon\"></seam-icon>\n <ng-container *ngIf=\"compact\">\n <ng-template [ngTemplateOutlet]=\"itemBadge\"></ng-template>\n </ng-container>\n </div>\n <span *ngIf=\"!compact\" nav-item-label>\n {{ label }}\n </span>\n <span *ngIf=\"compact\" class=\"sr-only\" nav-item-label>{{ label }}</span>\n <ng-container *ngIf=\"!compact\">\n <ng-template [ngTemplateOutlet]=\"itemBadge\"></ng-template>\n </ng-container>\n </div>\n\n <div *ngIf=\"hasChildren && !compact\"\n class=\"btn nav-btn nav-item--toggle-btn-container d-flex align-items-center\">\n <seam-icon\n class=\"nav-item--toggle-btn\"\n [class.nav-item--toggle-btn-expanded]=\"expanded$ | async\"\n [icon]=\"faAngleLeft\"\n type>\n </seam-icon>\n </div>\n </button>\n</ng-template>\n\n<ng-template #itemTypeLink>\n <a *ngIf=\"link; else noLink\" class=\"nav-item nav-link d-flex flex-row w-100 align-items-center\"\n [class.nav-link__compact]=\"compact\"\n [routerLink]=\"link\"\n [queryParams]=\"queryParams\"\n routerLinkActive=\"active\"\n [routerLinkActiveOptions]=\"{ exact: true }\">\n <div class=\"nav-item--icon\" *ngIf=\"showIconBlock\">\n <seam-icon [icon]=\"icon\" *ngIf=\"icon\"></seam-icon>\n <ng-container *ngIf=\"compact\">\n <ng-template [ngTemplateOutlet]=\"itemBadge\"></ng-template>\n </ng-container>\n </div>\n <span *ngIf=\"!compact\" nav-item-label>\n {{ label }}\n </span>\n <span *ngIf=\"compact\" class=\"sr-only\" nav-item-label>{{ label }}</span>\n <ng-container *ngIf=\"!compact\">\n <ng-template [ngTemplateOutlet]=\"itemBadge\"></ng-template>\n </ng-container>\n </a>\n\n <ng-template #noLink>\n <a class=\"nav-item nav-link d-flex flex-row w-100 align-items-center\" [class.nav-link__compact]=\"compact\">\n <div class=\"nav-item--icon\" *ngIf=\"showIconBlock\">\n <seam-icon [icon]=\"icon\" *ngIf=\"icon\"></seam-icon>\n </div>\n <span *ngIf=\"!compact\" nav-item-label>\n {{ label }}\n </span>\n <span *ngIf=\"compact\" class=\"sr-only\" nav-item-label>{{ label }}</span>\n </a>\n </ng-template>\n\n <button *ngIf=\"hasChildren && !compact\"\n type=\"button\"\n class=\"btn nav-btn nav-item--toggle-btn-container\"\n (click)=\"_toggleChildren($event)\"\n [seamMenuToggle]=\"menuTpl\"\n (menuToggle)=\"_menuEvent($event)\"\n [attr.aria-expanded]=\"expanded$ | async\"\n cdkMonitorElementFocus>\n <seam-icon\n class=\"nav-item--toggle-btn\"\n [class.nav-item--toggle-btn-expanded]=\"expanded$ | async\"\n [icon]=\"faAngleLeft\"\n type>\n </seam-icon>\n <span class=\"sr-only\">Group Toggle</span>\n </button>\n</ng-template>\n\n<ng-template #itemTypeDivider>\n <div class=\"px-2 w-100\">\n <hr class=\"nav-item--divider\" />\n </div>\n</ng-template>\n\n<ng-template #itemTypeTitle>\n <ng-container *ngIf=\"!compact\">\n <span class=\"nav-item--title pt-1\" nav-item-label>{{ label }}</span>\n </ng-container>\n</ng-template>\n\n<ng-template #itemBadge>\n <ng-container *ngIf=\"badgeText\">\n <div class=\"badge-spacer flex-grow-1\" *ngIf=\"!compact\"></div>\n <div class=\"nav-item--badge\"\n [class.nav-item--badge-no-icon]=\"!icon\"\n [ngbTooltip]=\"$any(badgeTooltip)?.tooltip\"\n [tooltipClass]=\"$any(badgeTooltip)?.class\"\n [placement]=\"$any(badgeTooltip)?.placement\"\n [container]=\"$any(badgeTooltip)?.container\"\n [disableTooltip]=\"!badgeTooltip || !!$any(badgeTooltip)?.disabled\">\n <span class=\"badge badge-pill badge-{{ badgeTheme }}\">\n <ng-container *ngIf=\"!compact || !icon\">\n {{ badgeText }}\n </ng-container>\n <span *ngIf=\"badgeSrContent\">{{ badgeSrContent }}</span>\n </span>\n </div>\n </ng-container>\n</ng-template>\n\n<seam-menu #menu *ngIf=\"hasMenuToggle\">\n <ng-container *ngTemplateOutlet=\"navChildren\"></ng-container>\n</seam-menu>\n\n<ng-template #navChildren>\n <seam-nav-item *ngFor=\"let child of children\"\n [item]=\"child\"\n [hierLevel]=\"compact ? 0 : (hierLevel + 1)\"\n [compact]=\"compact\"\n [itemType]=\"$any(child).itemType\"\n [icon]=\"$any(child).icon\"\n [label]=\"$any(child).label\"\n [link]=\"$any(child).link\"\n [badgeText]=\"$any(child).badge?.text\"\n [badgeTheme]=\"$any(child).badge?.theme || 'danger'\"\n [badgeSrContent]=\"$any(child).badge?.srContent\"\n [badgeTooltip]=\"$any(child)?.badge?.tooltip\"\n [queryParams]=\"$any(child).queryParams\"\n routerLinkActive=\"active\"\n [routerLinkActiveOptions]=\"{ exact: true }\"\n [children]=\"$any(child)?.children\"\n [active]=\"$any(child).__state?.active\"\n [expanded]=\"$any(child).__state?.expanded\"\n childAction=\"expand\"\n [hideEmptyIcon]=\"hideEmptyIcon\">\n </seam-nav-item>\n</ng-template>\n\n",
3051
+ exportAs: 'seamNavItem',
3052
+ animations: [
3053
+ trigger('childGroupAnim', [
3054
+ transition(':enter', [
3055
+ style({ height: 0 }),
3056
+ animate('0.2s ease-in-out', style({ height: '*' }))
3057
+ ]),
3058
+ transition(':leave', [
3059
+ style({ height: '*' }),
3060
+ animate('0.2s ease-in-out', style({ height: 0 }))
3061
+ ])
3062
+ ])
3063
+ ],
3064
+ changeDetection: ChangeDetectionStrategy.OnPush,
3065
+ encapsulation: ViewEncapsulation.None,
3066
+ styles: ["seam-nav-item{display:block;transition:.25s ease-in-out background-color;text-align:inherit;border-radius:0;overflow:hidden;background:transparent;margin:0}seam-nav-item.seam-nav-item--expanded{background-color:transparent}seam-nav-item.seam-nav-item--expanded .nav-link{color:#000}seam-nav-item.seam-nav-item--child-active{background-color:#dae0e5}seam-nav-item.seam-nav-item--child-active .nav-link{color:#000}seam-nav-item.seam-nav-item--active{background-color:#dae0e5}seam-nav-item.seam-nav-item--active .active,seam-nav-item.seam-nav-item--active:active,seam-nav-item.seam-nav-item--active .nav-item.active:hover{background-color:#dae0e5}seam-nav-item.seam-nav-item--active .nav-item:hover{background-color:#e9ecef}seam-nav-item.seam-nav-item--active .nav-link{color:#000}seam-nav-item .badge{vertical-align:middle}seam-nav-item:not(.nav-item--icon) .nav-item--badge{pointer-events:all;margin-left:5px;margin-right:3px}seam-nav-item .nav-item--icon{position:relative;width:24px;max-width:24px;min-width:24px;height:24px;max-height:24px;min-height:24px;text-align:center;margin-right:.5rem}seam-nav-item .nav-item--icon .nav-item--badge{top:-4px;right:-4px;position:absolute}seam-nav-item .nav-item--icon .nav-item--badge .badge:empty{display:block;width:8px;height:8px;padding:0}seam-nav-item .nav-item--icon .nav-item--badge.nav-item--badge-no-icon{top:0px;right:0px}seam-nav-item .nav-item{transition:.25s ease-in-out background-color}seam-nav-item .nav-item:hover{background-color:#e9ecef}seam-nav-item .nav-item.active{pointer-events:none;cursor:default}seam-nav-item a.nav-item:not([href]):not([tabindex]){color:#000}seam-nav-item a.nav-item:not([href]):not([tabindex]):hover{background-color:transparent}seam-nav-item .nav-link{color:#000}seam-nav-item .nav-btn{font-weight:400;color:#000;text-decoration:none;border-radius:0;border:0 solid #dee2e6}seam-nav-item .nav-btn:hover{color:#000;text-decoration:underline}seam-nav-item .nav-btn:focus,seam-nav-item .nav-btn.focus{text-decoration:underline;box-shadow:none}seam-nav-item .nav-btn:disabled,seam-nav-item .nav-btn.disabled{color:#000;pointer-events:none}seam-nav-item .cdk-keyboard-focused{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}seam-nav-item .nav-item--toggle-btn-container{transition:.25s ease-in-out background-color;padding:0 .5rem}seam-nav-item button.nav-item--toggle-btn-container:hover{background-color:#e9ecef}seam-nav-item .nav-item--toggle-btn .svg-inline--fa{transition:.1s ease-in-out transform;transform:none}seam-nav-item .nav-item--toggle-btn.nav-item--toggle-btn-expanded .svg-inline--fa{transform:rotate(-90deg)}seam-nav-item .nav--group{will-change:height;overflow:hidden}seam-nav-item .nav--group--level-1{background-color:#eff1f4}seam-nav-item .nav--group--level-2{background-color:#e6eaed}seam-nav-item .nav--group--level-3{background-color:#dde2e7}seam-nav-item .nav--group--level-4{background-color:#d4dae1}seam-nav-item .nav--group--level-5{background-color:#cbd3da}seam-nav-item .nav--group--level-6{background-color:#c2cbd4}seam-nav-item .nav--group--level-7{background-color:#bac3cd}seam-nav-item .nav--group--level-8{background-color:#b1bcc7}seam-nav-item .nav--group--level-9{background-color:#a8b4c1}seam-nav-item .nav-item--divider{display:block;border-top:1px solid #dae0e5;width:100%}seam-nav-item .nav-item--title{color:#000;font-size:24px;padding-left:10px}seam-nav-item .sr-only{top:0;left:0}\n"]
3067
+ },] }
3068
+ ];
3069
+ NavItemComponent.ctorParameters = () => [];
3070
+ NavItemComponent.propDecorators = {
3071
+ item: [{ type: Input }],
3072
+ itemType: [{ type: Input }],
3073
+ icon: [{ type: Input }],
3074
+ hideEmptyIcon: [{ type: Input }],
3075
+ label: [{ type: Input }],
3076
+ active: [{ type: Input }],
3077
+ link: [{ type: Input }],
3078
+ queryParams: [{ type: Input }],
3079
+ children: [{ type: Input }],
3080
+ hierLevel: [{ type: Input }],
3081
+ indentSize: [{ type: Input }],
3082
+ expanded: [{ type: Input }],
3083
+ compact: [{ type: Input }],
3084
+ badgeText: [{ type: Input }],
3085
+ badgeTheme: [{ type: Input }],
3086
+ badgeSrContent: [{ type: Input }],
3087
+ badgeTooltip: [{ type: Input }],
3088
+ childAction: [{ type: Input }],
3089
+ expandAction: [{ type: Input }],
3090
+ navItemExpanded: [{ type: Output }],
3091
+ _isActiveCssClass: [{ type: HostBinding, args: ['class.seam-nav-item--active',] }],
3092
+ _isChildActiveCssClass: [{ type: HostBinding, args: ['class.seam-nav-item--child-active',] }],
3093
+ _isExpandedCssClass: [{ type: HostBinding, args: ['class.seam-nav-item--expanded',] }],
3094
+ _attrDataHierLevel: [{ type: HostBinding, args: ['attr.data-hier-level',] }],
3095
+ _menu: [{ type: ViewChild, args: [MenuComponent,] }],
3096
+ _navItems: [{ type: ViewChildren, args: [NavItemComponent,] }]
3097
+ };
3098
+ __decorate([
3099
+ InputBoolean()
3100
+ ], NavItemComponent.prototype, "active", void 0);
3101
+ __decorate([
3102
+ InputNumber(0)
3103
+ ], NavItemComponent.prototype, "hierLevel", void 0);
3104
+ __decorate([
3105
+ InputNumber(10)
3106
+ ], NavItemComponent.prototype, "indentSize", void 0);
3107
+
3108
+ class TheSeamNavService {
3109
+ constructor(_router) {
3110
+ this._router = _router;
3111
+ this._updatingCount = new BehaviorSubject(0);
3112
+ this.itemChanged = new Subject();
3113
+ this.loading$ = this._updatingCount.pipe(map(count => count > 0), distinctUntilChanged(), shareReplay({ bufferSize: 1, refCount: true }));
3114
+ }
3115
+ createItemsObservable(items) {
3116
+ return defer(() => {
3117
+ this.updateItemsStates(items);
3118
+ return new Observable((subscriber) => {
3119
+ const stateChangeSub = this.itemChanged.pipe(switchMap(change => {
3120
+ return this.loading$.pipe(filter(loading => !loading));
3121
+ })).subscribe(() => {
3122
+ subscriber.next(items);
3123
+ });
3124
+ try {
3125
+ this.updateItemsStates(items);
3126
+ }
3127
+ catch (err) {
3128
+ subscriber.error(err);
3129
+ }
3130
+ const routeChangeSub = this._router.events.pipe(filter(event => event instanceof NavigationEnd)).subscribe(() => {
3131
+ try {
3132
+ this.updateItemsStates(items);
3133
+ }
3134
+ catch (err) {
3135
+ subscriber.error(err);
3136
+ }
3137
+ });
3138
+ return () => {
3139
+ stateChangeSub.unsubscribe();
3140
+ routeChangeSub.unsubscribe();
3141
+ };
3142
+ }).pipe(startWith(items));
3143
+ });
3144
+ }
3145
+ _incUpdatingCount() {
3146
+ this._updatingCount.next(this._updatingCount.value + 1);
3147
+ }
3148
+ _decrUpdatingCount() {
3149
+ this._updatingCount.next(this._updatingCount.value - 1);
3150
+ }
3151
+ updateItemsStates(items) {
3152
+ this._incUpdatingCount();
3153
+ try {
3154
+ for (const item of items) {
3155
+ if (horizontalNavItemHasChildren(item)) {
3156
+ this.updateItemsStates(item.children);
3157
+ }
3158
+ this.updateItemState(item);
3159
+ }
3160
+ this._decrUpdatingCount();
3161
+ }
3162
+ catch (err) {
3163
+ this._decrUpdatingCount();
3164
+ throw err;
3165
+ }
3166
+ }
3167
+ updateItemState(item) {
3168
+ this._incUpdatingCount();
3169
+ try {
3170
+ setDefaultHorizontalNavItemState(item);
3171
+ if (isHorizontalNavItemType(item, 'link')) {
3172
+ const url = this._getUrl(item);
3173
+ if (notNullOrUndefined(url)) {
3174
+ const opts = this._getMatchOptions(item);
3175
+ this.setItemStateProp(item, 'active', this._router.isActive(url, opts));
3176
+ }
3177
+ }
3178
+ // TODO: Implement this in a more optimized way. Unless our apps start
3179
+ // having large navs constantly updating their state, this shouldn't
3180
+ // have much impact on performance.
3181
+ this._updateItemExpandedState(item);
3182
+ this._decrUpdatingCount();
3183
+ }
3184
+ catch (err) {
3185
+ this._decrUpdatingCount();
3186
+ throw err;
3187
+ }
3188
+ }
3189
+ _updateItemsExpandedState(items) {
3190
+ for (const item of items) {
3191
+ if (horizontalNavItemHasChildren(item)) {
3192
+ this._updateItemsExpandedState(item.children);
3193
+ }
3194
+ this._updateItemExpandedState(item);
3195
+ }
3196
+ }
3197
+ _updateItemExpandedState(item) {
3198
+ if (!horizontalNavItemCanExpand(item)) {
3199
+ if (getHorizontalNavItemStateProp(item, 'expanded')) {
3200
+ this.setItemStateProp(item, 'expanded', false);
3201
+ }
3202
+ return;
3203
+ }
3204
+ if (horizontalNavItemHasChildren(item)) {
3205
+ this._updateItemsExpandedState(item.children);
3206
+ }
3207
+ if (horizontalNavItemHasActiveChild(item) || horizontalNavItemHasExpandedChild(item)) {
3208
+ if (!getHorizontalNavItemStateProp(item, 'expanded')) {
3209
+ this.setItemStateProp(item, 'expanded', true);
3210
+ }
3211
+ }
3212
+ else {
3213
+ if (getHorizontalNavItemStateProp(item, 'expanded')) {
3214
+ this.setItemStateProp(item, 'expanded', false);
3215
+ }
3216
+ }
3217
+ }
3218
+ _getNavExtras(item) {
3219
+ const navigationExtras = {};
3220
+ if (hasProperty(item, 'queryParams')) {
3221
+ navigationExtras.queryParams = item.queryParams;
3222
+ }
3223
+ if (hasProperty(item, 'fragment')) {
3224
+ navigationExtras.fragment = item.fragment;
3225
+ }
3226
+ if (hasProperty(item, 'queryParamsHandling')) {
3227
+ navigationExtras.queryParamsHandling = item.queryParamsHandling;
3228
+ }
3229
+ if (hasProperty(item, 'preserveFragment')) {
3230
+ navigationExtras.preserveFragment = item.preserveFragment;
3231
+ }
3232
+ return navigationExtras;
3233
+ }
3234
+ _getUrl(item) {
3235
+ const link = item.link;
3236
+ if (typeof link === 'string') {
3237
+ return this._router.createUrlTree([link], this._getNavExtras(item)).toString();
3238
+ }
3239
+ else if (Array.isArray(link)) {
3240
+ return this._router.createUrlTree(link, this._getNavExtras(item)).toString();
3241
+ }
3242
+ return null;
3243
+ }
3244
+ _getMatchOptions(item) {
3245
+ const defaultMatchOpts = {
3246
+ paths: 'subset',
3247
+ queryParams: 'subset',
3248
+ fragment: 'ignored',
3249
+ matrixParams: 'ignored'
3250
+ };
3251
+ if (hasProperty(item, 'matchOptions')) {
3252
+ return Object.assign(Object.assign({}, defaultMatchOpts), item.matchOptions);
3253
+ }
3254
+ return defaultMatchOpts;
3255
+ }
3256
+ setItemStateProp(item, prop, value) {
3257
+ const currentValue = getHorizontalNavItemStateProp(item, prop);
3258
+ if (currentValue !== value) {
3259
+ setHorizontalNavItemStateProp(item, prop, value);
3260
+ const changed = {
3261
+ item,
3262
+ prop,
3263
+ prevValue: currentValue,
3264
+ newValue: value
3265
+ };
3266
+ this.itemChanged.next(changed);
3267
+ }
3268
+ }
3269
+ }
3270
+ TheSeamNavService.decorators = [
3271
+ { type: Injectable }
3272
+ ];
3273
+ TheSeamNavService.ctorParameters = () => [
3274
+ { type: Router }
3275
+ ];
3276
+
3277
+ class HorizontalNavComponent {
3278
+ constructor() {
3279
+ this._ngUnsubscribe = new Subject();
3280
+ this._items = new BehaviorSubject([]);
3281
+ this.hideEmptyIcon = true;
3282
+ this.hierLevel = 0;
3283
+ this.childAction = 'menu';
3284
+ this.expandAction = 'toggle';
3285
+ this._focusedNavItem = new BehaviorSubject(undefined);
3286
+ this.focusedNavItem$ = this._focusedNavItem.asObservable();
3287
+ this.navItemExpanded = new EventEmitter();
3288
+ this.items$ = this._items.asObservable();
3289
+ }
3290
+ get items() { return this._items.value; }
3291
+ set items(value) {
3292
+ this._items.next(value);
3293
+ }
3294
+ /**
3295
+ * The 'focused' nav item refers to the item in
3296
+ * the list that was most recently expanded or activated.
3297
+ * // TODO: make all this better
3298
+ */
3299
+ get focusedNavItem() {
3300
+ return this._focusedNavItem.value;
3301
+ }
3302
+ set focusedNavItem(value) {
3303
+ this._focusedNavItem.next(value);
3304
+ }
3305
+ ngOnInit() { }
3306
+ ngOnDestroy() {
3307
+ this._ngUnsubscribe.next();
3308
+ this._ngUnsubscribe.complete();
3309
+ }
3310
+ _navItemExpanded(item, expanded) {
3311
+ this.navItemExpanded.emit({ navItem: item, expanded });
3312
+ }
3313
+ _navItemIsFocused(item) {
3314
+ return this.focusedNavItem$.pipe(map(focusedNavItem => areSameHorizontalNavItem(focusedNavItem, item)));
3315
+ }
3316
+ }
3317
+ HorizontalNavComponent.decorators = [
3318
+ { type: Component, args: [{
3319
+ selector: 'seam-horizontal-nav',
3320
+ template: "<div class=\"nav-inner-wrapper\" class=\"nav-inner-wrapper-{{hierLevel}}\">\n <div class=\"nav-items-row\">\n <seam-nav-item *ngFor=\"let item of items$ | async\"\n class=\"flex-shrink-0\"\n [item]=\"item\"\n [itemType]=\"$any(item)?.itemType\"\n [icon]=\"$any(item)?.icon\"\n [label]=\"$any(item)?.label\"\n [link]=\"$any(item)?.link\"\n [badgeText]=\"$any(item)?.badge?.text\"\n [badgeTheme]=\"$any(item)?.badge?.theme || 'danger'\"\n [badgeSrContent]=\"$any(item)?.badge?.srContent\"\n [badgeTooltip]=\"$any(item)?.badge?.tooltip\"\n [queryParams]=\"$any(item)?.queryParams\"\n [children]=\"$any(item)?.children\"\n [active]=\"$any(item).__state?.active\"\n [expanded]=\"$any(item).__state?.expanded\"\n [hierLevel]=\"hierLevel\"\n [childAction]=\"childAction\"\n [expandAction]=\"expandAction\"\n (navItemExpanded)=\"_navItemExpanded(item, $event)\"\n [class.seam-nav-item--focused]=\"_navItemIsFocused(item) | async\"\n [hideEmptyIcon]=\"hideEmptyIcon\">\n </seam-nav-item>\n </div>\n</div>\n",
3321
+ providers: [
3322
+ TheSeamNavService
3323
+ ],
3324
+ changeDetection: ChangeDetectionStrategy.OnPush,
3325
+ encapsulation: ViewEncapsulation.None,
3326
+ styles: ["seam-horizontal-nav,.seam-horizontal-nav{display:block;height:100%;position:relative;z-index:2}seam-horizontal-nav .nav-inner-wrapper,.seam-horizontal-nav .nav-inner-wrapper{background:none;height:100%}seam-horizontal-nav .nav-backdrop,.seam-horizontal-nav .nav-backdrop{background:rgba(52,58,64,.6);width:100vw;height:100vh}seam-horizontal-nav .nav-backdrop.nav-backdrop-hidden,.seam-horizontal-nav .nav-backdrop.nav-backdrop-hidden{display:none;width:0;height:0;padding:0;margin:0}seam-horizontal-nav .nav-content,.seam-horizontal-nav .nav-content{display:flex;flex-direction:column;height:100%;flex-wrap:nowrap}seam-horizontal-nav .nav-items-container,.seam-horizontal-nav .nav-items-container{display:flex;flex-direction:column;width:100%;flex:1 1 100%}seam-horizontal-nav .nav-items-row,.seam-horizontal-nav .nav-items-row{height:100%;display:flex;padding:.25rem .5rem}\n"]
3327
+ },] }
3328
+ ];
3329
+ HorizontalNavComponent.ctorParameters = () => [];
3330
+ HorizontalNavComponent.propDecorators = {
3331
+ items: [{ type: Input }],
3332
+ hideEmptyIcon: [{ type: Input }],
3333
+ hierLevel: [{ type: Input }],
3334
+ childAction: [{ type: Input }],
3335
+ expandAction: [{ type: Input }],
3336
+ focusedNavItem: [{ type: Input }],
3337
+ navItemExpanded: [{ type: Output }]
3338
+ };
3339
+
3340
+ class TheSeamNavModule {
3341
+ }
3342
+ TheSeamNavModule.decorators = [
3343
+ { type: NgModule, args: [{
3344
+ declarations: [
3345
+ NavItemComponent,
3346
+ HorizontalNavComponent,
3347
+ ],
3348
+ imports: [
3349
+ CommonModule,
3350
+ RouterModule,
3351
+ TheSeamIconModule,
3352
+ A11yModule,
3353
+ TheSeamScrollbarModule,
3354
+ TheSeamLayoutModule,
3355
+ NgbTooltipModule,
3356
+ PortalModule,
3357
+ TheSeamMenuModule
3358
+ ],
3359
+ exports: [
3360
+ NavItemComponent,
3361
+ HorizontalNavComponent,
3362
+ ],
3363
+ providers: [
3364
+ TheSeamNavService,
3365
+ ]
3366
+ },] }
3367
+ ];
3368
+
2680
3369
  /**
2681
3370
  * Generated bundle index. Do not edit.
2682
3371
  */
2683
3372
 
2684
- export { BaseLayoutContentDirective, BaseLayoutContentFooterDirective, BaseLayoutContentHeaderDirective, BaseLayoutNavToggleDirective, BaseLayoutSideBarDirective, BaseLayoutTopBarDirective, DashboardComponent, DashboardWidgetContainerComponent, DashboardWidgetPortalOutletDirective, DashboardWidgetTemplateContainerComponent, DashboardWidgetsComponent, DashboardWidgetsPreferencesService, DashboardWidgetsService, HierarchyLevelResolver, HierarchyRouterOutletComponent, SideNavComponent, SideNavItemComponent, SideNavToggleComponent, THESEAM_BASE_LAYOUT_REF, THESEAM_DASHBOARD_WIDGETS_PREFERENCES_ACCESSOR, THE_SEAM_BASE_LAYOUT, TheSeamBaseLayoutComponent, TheSeamBaseLayoutModule, TheSeamDashboardModule, TheSeamDynamicRouterModule, TheSeamFramework, TheSeamSchemaFormFrameworkComponent, TheSeamSchemaFormModule, TheSeamSideNavModule, TheSeamTopBarComponent, TheSeamTopBarModule, TopBarItemDirective, TopBarMenuBtnDetailDirective, TopBarMenuButtonComponent, TopBarMenuDirective, TopBarTitleComponent, canBeActive, canExpand, canHaveChildren, fader, findLinkItems, getItemStateProp, hasActiveChild, hasChildren, hasExpandedChild, isExpanded, isNavItemActive, isNavItemType, routeChanges, setDefaultState, setItemStateProp, sideNavExpandStateChangeFn, sideToSide, slider, stepper, transformer, BaseLayoutSideBarFooterDirective as ɵa, TheSeamSideNavService as ɵb, TheSeamSchemaFormControlsModule as ɵc, TheSeamSchemaFormCheckboxComponent as ɵd, TheSeamSchemaFormSubmitComponent as ɵe, TheSeamSchemaFormSelectComponent as ɵf, TheSeamSchemaFormInputComponent as ɵg, TheSeamSchemaFormNumberComponent as ɵh, TheSeamSchemaFormSubmitSplitComponent as ɵi };
3373
+ export { BaseLayoutContentDirective, BaseLayoutContentFooterDirective, BaseLayoutContentHeaderDirective, BaseLayoutNavToggleDirective, BaseLayoutSideBarDirective, BaseLayoutTopBarDirective, DashboardComponent, DashboardWidgetContainerComponent, DashboardWidgetPortalOutletDirective, DashboardWidgetTemplateContainerComponent, DashboardWidgetsComponent, DashboardWidgetsPreferencesService, DashboardWidgetsService, HierarchyLevelResolver, HierarchyRouterOutletComponent, HorizontalNavComponent, NavItemComponent, SideNavComponent, SideNavItemComponent, SideNavToggleComponent, THESEAM_BASE_LAYOUT_REF, THESEAM_DASHBOARD_WIDGETS_PREFERENCES_ACCESSOR, THE_SEAM_BASE_LAYOUT, TheSeamBaseLayoutComponent, TheSeamBaseLayoutModule, TheSeamDashboardModule, TheSeamDynamicRouterModule, TheSeamFramework, TheSeamNavModule, TheSeamSchemaFormFrameworkComponent, TheSeamSchemaFormModule, TheSeamSideNavModule, TheSeamTopBarComponent, TheSeamTopBarModule, TopBarItemDirective, TopBarMenuBtnDetailDirective, TopBarMenuButtonComponent, TopBarMenuDirective, TopBarTitleComponent, areSameHorizontalNavItem, canBeActive, canExpand, canHaveChildren, fader, findHorizontalNavLinkItems, findLinkItems, getHorizontalNavItemStateProp, getItemStateProp, hasActiveChild, hasChildren, hasExpandedChild, horizontalNavItemCanBeActive, horizontalNavItemCanExpand, horizontalNavItemCanHaveChildren, horizontalNavItemHasActiveChild, horizontalNavItemHasChildren, horizontalNavItemHasExpandedChild, isExpanded, isHorizontalNavItemActive, isHorizontalNavItemExpanded, isHorizontalNavItemType, isNavItemActive, isNavItemType, routeChanges, setDefaultHorizontalNavItemState, setDefaultState, setHorizontalNavItemStateProp, setItemStateProp, sideNavExpandStateChangeFn, sideToSide, slider, stepper, transformer, BaseLayoutSideBarFooterDirective as ɵa, BaseLayoutSideBarHeaderDirective as ɵb, TheSeamSideNavService as ɵc, TopBarCompactMenuBtnDetailDirective as ɵd, TopBarNavToggleBtnDetailDirective as ɵe, TheSeamSchemaFormControlsModule as ɵf, TheSeamSchemaFormCheckboxComponent as ɵg, TheSeamSchemaFormSubmitComponent as ɵh, TheSeamSchemaFormSelectComponent as ɵi, TheSeamSchemaFormInputComponent as ɵj, TheSeamSchemaFormNumberComponent as ɵk, TheSeamSchemaFormSubmitSplitComponent as ɵl, TheSeamNavService as ɵm };
2685
3374
  //# sourceMappingURL=theseam-ui-common-framework.js.map