@@ -10,39 +10,51 @@ import {
1010Output ,
1111Renderer2 ,
1212SimpleChanges
13- } from ' @angular/core' ;
14- import { DOCUMENT } from ' @angular/common' ;
15- import { BooleanInput , coerceBooleanProperty } from ' @angular/cdk/coercion' ;
16- import { BreakpointObserver , BreakpointState } from ' @angular/cdk/layout' ;
17- import { Subscription } from ' rxjs' ;
13+ } from " @angular/core" ;
14+ import { DOCUMENT } from " @angular/common" ;
15+ import { BooleanInput , coerceBooleanProperty } from " @angular/cdk/coercion" ;
16+ import { BreakpointObserver , BreakpointState } from " @angular/cdk/layout" ;
17+ import { Subscription } from " rxjs" ;
1818
19- import { ISidebarAction , SidebarService } from ' ../sidebar.service' ;
20- import { SidebarBackdropService } from ' ../sidebar-backdrop/sidebar-backdrop.service' ;
19+ import { ISidebarAction , SidebarService } from " ../sidebar.service" ;
20+ import { SidebarBackdropService } from " ../sidebar-backdrop/sidebar-backdrop.service" ;
2121
2222@Component ( {
2323selector :'c-sidebar' ,
2424exportAs :'cSidebar' ,
2525template :'<ng-content></ng-content>'
2626} )
2727export class SidebarComponent implements OnChanges , OnDestroy , OnInit {
28-
2928static ngAcceptInputType_narrow :BooleanInput ;
3029static ngAcceptInputType_overlaid :BooleanInput ;
3130static ngAcceptInputType_unfoldable :BooleanInput ;
3231static ngAcceptInputType_visible :BooleanInput ;
3332
34- private _narrow = false ;
35- private _overlaid = false ;
36- private _unfoldable = false ;
37- private _visible = false ;
38- private onMobile = false ;
39- private layoutChangeSubscription ! :Subscription ;
40- private stateToggleSubscription ! :Subscription ;
33+ #narrow = false ;
34+ #overlaid = false ;
35+ #unfoldable = false ;
36+ #visible = false ;
37+ # onMobile= false ;
38+ # layoutChangeSubscription! :Subscription ;
39+ # stateToggleSubscription! :Subscription ;
4140
4241state :ISidebarAction = {
4342sidebar :this
4443} ;
4544
45+ #stateInitial= {
46+ narrow :false ,
47+ visible :false ,
48+ unfoldable :false
49+ } ;
50+
51+ /**
52+ * Sets if the color of text should be colored for a light or dark background. [docs]
53+ *
54+ *@type 'dark' | 'light'
55+ */
56+ @Input ( ) colorScheme ?:'dark' | 'light' ;
57+
4658/**
4759 * Sets html attribute id. [docs]
4860 *
@@ -56,11 +68,11 @@ export class SidebarComponent implements OnChanges, OnDestroy, OnInit {
5668 */
5769 @Input ( )
5870set narrow ( value :boolean ) {
59- this . _narrow = coerceBooleanProperty ( value ) ;
71+ this . #narrow = coerceBooleanProperty ( value ) ;
6072}
6173
6274get narrow ( ) {
63- return this . _narrow ;
75+ return this . #narrow ;
6476}
6577
6678/**
@@ -69,13 +81,19 @@ export class SidebarComponent implements OnChanges, OnDestroy, OnInit {
6981 */
7082 @Input ( )
7183set overlaid ( value :boolean ) {
72- this . _overlaid = coerceBooleanProperty ( value ) ;
84+ this . #overlaid = coerceBooleanProperty ( value ) ;
7385}
7486
7587get overlaid ( ) {
76- return this . _overlaid ;
88+ return this . #overlaid ;
7789}
7890
91+ /**
92+ * Components placement, there’s no default placement. [docs]
93+ *@type 'start' | 'end'
94+ */
95+ @Input ( ) placement ?:'start' | 'end' ;
96+
7997/**
8098 * Place sidebar in non-static positions. [docs]
8199 *@default 'fixed'
@@ -92,11 +110,11 @@ export class SidebarComponent implements OnChanges, OnDestroy, OnInit {
92110 */
93111 @Input ( )
94112set unfoldable ( value :boolean ) {
95- this . _unfoldable = coerceBooleanProperty ( value ) ;
113+ this . #unfoldable = coerceBooleanProperty ( value ) ;
96114}
97115
98116get unfoldable ( ) {
99- return this . _unfoldable ;
117+ return this . #unfoldable ;
100118}
101119
102120/**
@@ -105,14 +123,14 @@ export class SidebarComponent implements OnChanges, OnDestroy, OnInit {
105123 @Input ( )
106124set visible ( value :boolean ) {
107125const visible = coerceBooleanProperty ( value ) ;
108- if ( this . _visible !== visible ) {
109- this . _visible = visible ;
110- this . visibleChange . emit ( this . _visible ) ;
126+ if ( this . #visible !== visible ) {
127+ this . #visible = visible ;
128+ this . visibleChange . emit ( this . #visible ) ;
111129}
112130}
113131
114132get visible ( ) {
115- return this . _visible ;
133+ return this . #visible ;
116134}
117135
118136/**
@@ -126,7 +144,7 @@ export class SidebarComponent implements OnChanges, OnDestroy, OnInit {
126144if ( 'toggle' in newState ) {
127145if ( newState . toggle === 'visible' ) {
128146newState . visible = ! this . state . visible ;
129- this . visible = newState . visible && ! this . overlaid ;
147+ this . visible = newState . visible ;
130148} else if ( newState . toggle === 'unfoldable' ) {
131149newState . unfoldable = ! this . state . unfoldable ;
132150this . unfoldable = newState . unfoldable ;
@@ -136,24 +154,31 @@ export class SidebarComponent implements OnChanges, OnDestroy, OnInit {
136154}
137155this . state = {
138156 ...this . state ,
139- ...newState
157+ ...newState ,
140158} ;
141- this . state . mobile && this . state . visible ?this . backdropService . setBackdrop ( this ) :this . backdropService . clearBackdrop ( ) ;
159+ this . state . mobile && this . state . visible
160+ ?this . backdropService . setBackdrop ( this )
161+ :this . backdropService . clearBackdrop ( ) ;
142162}
143163
144164get sidebarState ( ) :ISidebarAction {
145165return this . state ;
146166}
147167
148168get getMobileBreakpoint ( ) :string {
149- const element = this . document . firstElementChild ;
150- const mobileBreakpoint = getComputedStyle ( element ) . getPropertyValue ( '--cui-mobile-breakpoint' ) || 'md' ;
151- const breakpointValue = getComputedStyle ( element ) . getPropertyValue ( `--cui-breakpoint-${ mobileBreakpoint . trim ( ) } ` ) || '768px' ;
152- return `${ parseFloat ( breakpointValue . trim ( ) ) - .02 } px` || '767.98px' ;
169+ const element :Element = this . document . documentElement ;
170+ const mobileBreakpoint =
171+ getComputedStyle ( element ) . getPropertyValue ( '--cui-mobile-breakpoint' ) ||
172+ 'md' ;
173+ const breakpointValue =
174+ getComputedStyle ( element ) . getPropertyValue (
175+ `--cui-breakpoint-${ mobileBreakpoint . trim ( ) } `
176+ ) || '768px' ;
177+ return `${ parseFloat ( breakpointValue . trim ( ) ) - 0.02 } px` || '767.98px' ;
153178}
154179
155180constructor (
156- @Inject ( DOCUMENT ) private document :any ,
181+ @Inject ( DOCUMENT ) private document :Document ,
157182private renderer :Renderer2 ,
158183private breakpointObserver :BreakpointObserver ,
159184private sidebarService :SidebarService ,
@@ -164,16 +189,16 @@ export class SidebarComponent implements OnChanges, OnDestroy, OnInit {
164189
165190 @HostBinding ( 'class' )
166191get getClasses ( ) :any {
167- const { mobile, unfoldable , visible} = this . sidebarState ;
192+ const { mobile, visible} = this . sidebarState ;
168193return {
169194sidebar :true ,
170195'sidebar-fixed' :this . position === 'fixed' && ! mobile ,
171196'sidebar-narrow' :this . narrow && ! this . unfoldable ,
172197'sidebar-narrow-unfoldable' :this . unfoldable ,
173198'sidebar-overlaid' :this . overlaid ,
174199[ `sidebar-${ this . size } ` ] :! ! this . size ,
175- show :visible && this . onMobile ,
176- hide :! visible && ! this . onMobile
200+ show :visible && this . # onMobile,
201+ hide :! visible ,
177202} ;
178203}
179204
@@ -213,23 +238,27 @@ export class SidebarComponent implements OnChanges, OnDestroy, OnInit {
213238}
214239
215240setInitialState ( ) :void {
216- this . sidebarService . toggle ( {
241+ this . #stateInitial = {
217242narrow :this . narrow ,
218243visible :this . visible ,
219244unfoldable :this . unfoldable ,
220- sidebar :this
245+ } ;
246+ this . sidebarService . toggle ( {
247+ ...this . #stateInitial,
248+ sidebar :this ,
221249} ) ;
222250}
223251
224252private stateToggleSubscribe ( subscribe :boolean = true ) :void {
225253if ( subscribe ) {
226- this . stateToggleSubscription = this . sidebarService . sidebarState$ . subscribe ( ( state ) => {
227- if ( this === state . sidebar || this . id === state . id ) {
228- this . sidebarState = state ;
229- }
230- } ) ;
254+ this . #stateToggleSubscription=
255+ this . sidebarService . sidebarState$ . subscribe ( ( state ) => {
256+ if ( this === state . sidebar || this . id === state . id ) {
257+ this . sidebarState = state ;
258+ }
259+ } ) ;
231260} else {
232- this . stateToggleSubscription . unsubscribe ( ) ;
261+ this . # stateToggleSubscription. unsubscribe ( ) ;
233262}
234263}
235264
@@ -239,21 +268,23 @@ export class SidebarComponent implements OnChanges, OnDestroy, OnInit {
239268if ( subscribe ) {
240269const layoutChanges = this . breakpointObserver . observe ( [ onMobile ] ) ;
241270
242- this . layoutChangeSubscription = layoutChanges . subscribe ( ( result :BreakpointState ) => {
243- const isOnMobile = result . breakpoints [ onMobile ] ;
244- const isUnfoldable = isOnMobile ?false :this . unfoldable ;
245- if ( this . onMobile !== isOnMobile ) {
246- this . onMobile = isOnMobile ;
247- this . sidebarService . toggle ( {
248- mobile :isOnMobile ,
249- unfoldable :isUnfoldable ,
250- visible :( ! isOnMobile ) || isUnfoldable ,
251- sidebar :this
252- } ) ;
271+ this . #layoutChangeSubscription= layoutChanges . subscribe (
272+ ( result :BreakpointState ) => {
273+ const isOnMobile = result . breakpoints [ onMobile ] ;
274+ const isUnfoldable = isOnMobile ?false :this . unfoldable ;
275+ if ( this . #onMobile!== isOnMobile ) {
276+ this . #onMobile= isOnMobile ;
277+ this . sidebarService . toggle ( {
278+ mobile :isOnMobile ,
279+ unfoldable :isUnfoldable ,
280+ visible :isOnMobile ?! isOnMobile :this . #stateInitial. visible ,
281+ sidebar :this ,
282+ } ) ;
283+ }
253284}
254- } ) ;
285+ ) ;
255286} else {
256- this . layoutChangeSubscription . unsubscribe ( ) ;
287+ this . # layoutChangeSubscription. unsubscribe ( ) ;
257288}
258289}
259290}