UNPKG

ng-sidebar-v3

Version:
1 lines 56.3 kB
{"version":3,"file":"ng-sidebar-v3.mjs","sources":["../../../projects/ng-sidebar/src/lib/sidebar-container.component.ts","../../../projects/ng-sidebar/src/lib/utils.ts","../../../projects/ng-sidebar/src/lib/sidebar.component.ts","../../../projects/ng-sidebar/src/lib/close.directive.ts","../../../projects/ng-sidebar/src/lib/sidebar.module.ts","../../../projects/ng-sidebar/src/ng-sidebar-v3.ts"],"sourcesContent":["import {\r\n AfterContentInit,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n EventEmitter,\r\n Inject,\r\n Input,\r\n OnChanges,\r\n OnDestroy,\r\n Output,\r\n PLATFORM_ID,\r\n SimpleChanges\r\n} from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\n\r\nimport { Sidebar } from './sidebar.component';\r\n\r\n// Based on https://github.com/angular/material2/tree/master/src/lib/sidenav\r\n@Component({\n selector: 'ng-sidebar-container',\n template: `\r\n <div *ngIf=\"showBackdrop\"\r\n aria-hidden=\"true\"\r\n class=\"ng-sidebar__backdrop\"\r\n [ngClass]=\"backdropClass\"\r\n (click)=\"_onBackdropClicked()\"></div>\r\n\r\n <ng-content select=\"ng-sidebar,[ng-sidebar]\"></ng-content>\r\n\r\n <div class=\"ng-sidebar__content\"\r\n [class.ng-sidebar__content--animate]=\"animate\"\r\n [ngClass]=\"contentClass\"\r\n [ngStyle]=\"_getContentStyle()\">\r\n <ng-content select=\"[ng-sidebar-content]\"></ng-content>\r\n </div>\r\n `,\n styles: [`\r\n :host {\r\n box-sizing: border-box;\r\n display: block;\r\n position: relative;\r\n height: 100%;\r\n width: 100%;\r\n overflow: hidden;\r\n }\r\n\r\n .ng-sidebar__backdrop {\r\n position: absolute;\r\n top: 0;\r\n bottom: 0;\r\n left: 0;\r\n right: 0;\r\n background: #000;\r\n opacity: 0.75;\r\n pointer-events: auto;\r\n z-index: 1;\r\n }\r\n\r\n .ng-sidebar__content {\r\n -webkit-overflow-scrolling: touch;\r\n overflow: auto;\r\n position: absolute;\r\n top: 0;\r\n bottom: 0;\r\n left: 0;\r\n right: 0;\r\n }\r\n\r\n .ng-sidebar__content--animate {\r\n -webkit-transition: -webkit-transform 0.3s cubic-bezier(0, 0, 0.3, 1), padding 0.3s cubic-bezier(0, 0, 0.3, 1);\r\n transition: transform 0.3s cubic-bezier(0, 0, 0.3, 1), padding 0.3s cubic-bezier(0, 0, 0.3, 1);\r\n }\r\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\r\nexport class SidebarContainer implements AfterContentInit, OnChanges, OnDestroy {\r\n @Input() animate: boolean = true;\r\n\r\n @Input() allowSidebarBackdropControl: boolean = true;\r\n @Input() showBackdrop: boolean = false;\r\n @Output() showBackdropChange = new EventEmitter<boolean>();\r\n @Output() onBackdropClicked = new EventEmitter<null>();\r\n\r\n @Input() contentClass: string;\r\n @Input() backdropClass: string;\r\n\r\n private _sidebars: Array<Sidebar> = [];\r\n\r\n private _isBrowser: boolean;\r\n\r\n constructor(\r\n private _ref: ChangeDetectorRef,\r\n @Inject(PLATFORM_ID) platformId: Object) {\r\n this._isBrowser = isPlatformBrowser(platformId);\r\n }\r\n\r\n ngAfterContentInit(): void {\r\n if (!this._isBrowser) {\r\n return;\r\n }\r\n\r\n this._onToggle();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (!this._isBrowser) {\r\n return;\r\n }\r\n\r\n if (changes['showBackdrop']) {\r\n this.showBackdropChange.emit(changes['showBackdrop'].currentValue);\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (!this._isBrowser) {\r\n return;\r\n }\r\n\r\n this._unsubscribe();\r\n }\r\n\r\n /**\r\n * @internal\r\n *\r\n * Adds a sidebar to the container's list of sidebars.\r\n *\r\n * @param sidebar {Sidebar} A sidebar within the container to register.\r\n */\r\n _addSidebar(sidebar: Sidebar) {\r\n this._sidebars.push(sidebar);\r\n this._subscribe(sidebar);\r\n }\r\n\r\n /**\r\n * @internal\r\n *\r\n * Removes a sidebar from the container's list of sidebars.\r\n *\r\n * @param sidebar {Sidebar} The sidebar to remove.\r\n */\r\n _removeSidebar(sidebar: Sidebar) {\r\n const index = this._sidebars.indexOf(sidebar);\r\n if (index !== -1) {\r\n this._sidebars.splice(index, 1);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n *\r\n * Computes `margin` value to push page contents to accommodate open sidebars as needed.\r\n *\r\n * @return {CSSStyleDeclaration} margin styles for the page content.\r\n */\r\n _getContentStyle(): CSSStyleDeclaration {\r\n let left = 0,\r\n right = 0,\r\n top = 0,\r\n bottom = 0;\r\n\r\n let transformStyle: string = '';\r\n let heightStyle: string = '';\r\n let widthStyle: string = '';\r\n\r\n for (const sidebar of this._sidebars) {\r\n // Slide mode: we need to translate the entire container\r\n if (sidebar._isModeSlide) {\r\n if (sidebar.opened) {\r\n const transformDir: string = sidebar._isLeftOrRight ? 'X' : 'Y';\r\n const transformAmt: string =\r\n `${sidebar._isLeftOrTop ? '' : '-'}${sidebar._isLeftOrRight ? sidebar._width : sidebar._height}`;\r\n\r\n transformStyle = `translate${transformDir}(${transformAmt}px)`;\r\n }\r\n }\r\n\r\n // Create a space for the sidebar\r\n if ((sidebar._isModePush && sidebar.opened) || sidebar.dock) {\r\n let paddingAmt: number = 0;\r\n\r\n if (sidebar._isModeSlide && sidebar.opened) {\r\n if (sidebar._isLeftOrRight) {\r\n widthStyle = '100%';\r\n } else {\r\n heightStyle = '100%';\r\n }\r\n } else {\r\n if (sidebar._isDocked || (sidebar._isModeOver && sidebar.dock)) {\r\n paddingAmt = sidebar._dockedSize;\r\n } else {\r\n paddingAmt = sidebar._isLeftOrRight ? sidebar._width : sidebar._height;\r\n }\r\n }\r\n\r\n switch (sidebar.position) {\r\n case 'left':\r\n left = Math.max(left, paddingAmt);\r\n break;\r\n\r\n case 'right':\r\n right = Math.max(right, paddingAmt);\r\n break;\r\n\r\n case 'top':\r\n top = Math.max(top, paddingAmt);\r\n break;\r\n\r\n case 'bottom':\r\n bottom = Math.max(bottom, paddingAmt);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return {\r\n padding: `${top}px ${right}px ${bottom}px ${left}px`,\r\n webkitTransform: transformStyle,\r\n transform: transformStyle,\r\n height: heightStyle,\r\n width: widthStyle\r\n } as CSSStyleDeclaration;\r\n }\r\n\r\n /**\r\n * @internal\r\n *\r\n * Closes sidebars when the backdrop is clicked, if they have the\r\n * `closeOnClickBackdrop` option set.\r\n */\r\n _onBackdropClicked(): void {\r\n let backdropClicked = false;\r\n for (const sidebar of this._sidebars) {\r\n if (sidebar.opened && sidebar.showBackdrop && sidebar.closeOnClickBackdrop) {\r\n sidebar.close();\r\n backdropClicked = true;\r\n }\r\n }\r\n\r\n if (backdropClicked) {\r\n this.onBackdropClicked.emit();\r\n }\r\n }\r\n\r\n /**\r\n * Subscribes from a sidebar events to react properly.\r\n */\r\n private _subscribe(sidebar: Sidebar): void {\r\n sidebar.onOpenStart.subscribe(() => this._onToggle());\r\n sidebar.onOpened.subscribe(() => this._markForCheck());\r\n\r\n sidebar.onCloseStart.subscribe(() => this._onToggle());\r\n sidebar.onClosed.subscribe(() => this._markForCheck());\r\n\r\n sidebar.onModeChange.subscribe(() => this._markForCheck());\r\n sidebar.onPositionChange.subscribe(() => this._markForCheck());\r\n\r\n sidebar._onRerender.subscribe(() => this._markForCheck());\r\n }\r\n\r\n /**\r\n * Unsubscribes from all sidebars.\r\n */\r\n private _unsubscribe(): void {\r\n for (const sidebar of this._sidebars) {\r\n sidebar.onOpenStart.unsubscribe();\r\n sidebar.onOpened.unsubscribe();\r\n\r\n sidebar.onCloseStart.unsubscribe();\r\n sidebar.onClosed.unsubscribe();\r\n\r\n sidebar.onModeChange.unsubscribe();\r\n sidebar.onPositionChange.unsubscribe();\r\n\r\n sidebar._onRerender.unsubscribe();\r\n }\r\n }\r\n\r\n /**\r\n * Check if we should show the backdrop when a sidebar is toggled.\r\n */\r\n private _onToggle(): void {\r\n if (this._sidebars.length > 0 && this.allowSidebarBackdropControl) {\r\n // Show backdrop if a single open sidebar has it set\r\n const hasOpen = this._sidebars.some(sidebar => sidebar.opened && sidebar.showBackdrop);\r\n\r\n this.showBackdrop = hasOpen;\r\n this.showBackdropChange.emit(hasOpen);\r\n }\r\n\r\n setTimeout(() => {\r\n this._markForCheck();\r\n });\r\n }\r\n\r\n /**\r\n * Triggers change detection to recompute styles.\r\n */\r\n private _markForCheck(): void {\r\n this._ref.markForCheck();\r\n }\r\n}\r\n","/**\r\n * Returns whether the page is in LTR mode. Defaults to `true` if it can't be computed.\r\n *\r\n * @return {boolean} Page's language direction is left-to-right.\r\n */\r\nexport function isLTR(): boolean {\r\n let dir: string = 'ltr';\r\n\r\n if (typeof window !== 'undefined') {\r\n if (window.getComputedStyle) {\r\n dir = window.getComputedStyle(document.body, null).getPropertyValue('direction');\r\n } else {\r\n dir = (document.body as any).currentStyle.direction;\r\n }\r\n }\r\n\r\n return dir === 'ltr';\r\n}\r\n\r\n/**\r\n * Returns whether or not the current device is an iOS device.\r\n *\r\n * @return {boolean} Device is an iOS device (i.e. iPod touch/iPhone/iPad).\r\n */\r\nexport function isIOS(): boolean {\r\n if (typeof window !== 'undefined' && typeof navigator !== 'undefined') {\r\n return /iPad|iPhone|iPod/.test(navigator.userAgent) && !(window as any).MSStream;\r\n }\r\n\r\n return false;\r\n}\r\n","import {\r\n AfterContentInit,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n Inject,\r\n Input,\r\n OnChanges,\r\n OnDestroy,\r\n OnInit,\r\n Optional,\r\n Output,\r\n PLATFORM_ID,\r\n SimpleChanges,\r\n ViewChild\r\n} from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\n\r\nimport { SidebarContainer } from './sidebar-container.component';\r\nimport { isLTR, isIOS } from './utils';\r\n\r\n@Component({\n selector: 'ng-sidebar',\n template: `\r\n <aside #sidebar\r\n role=\"complementary\"\r\n [attr.aria-hidden]=\"!opened\"\r\n [attr.aria-label]=\"ariaLabel\"\r\n class=\"ng-sidebar ng-sidebar--{{opened ? 'opened' : 'closed'}} ng-sidebar--{{position}} ng-sidebar--{{mode}}\"\r\n [class.ng-sidebar--docked]=\"_isDocked\"\r\n [class.ng-sidebar--inert]=\"_isInert\"\r\n [class.ng-sidebar--animate]=\"animate\"\r\n [ngClass]=\"sidebarClass\"\r\n [ngStyle]=\"_getStyle()\">\r\n <ng-content></ng-content>\r\n </aside>\r\n `,\n styles: [`\r\n .ng-sidebar {\r\n -webkit-overflow-scrolling: touch;\r\n overflow: auto;\r\n pointer-events: auto;\r\n position: absolute;\r\n touch-action: auto;\r\n will-change: initial;\r\n z-index: 2;\r\n }\r\n\r\n .ng-sidebar--left {\r\n bottom: 0;\r\n left: 0;\r\n top: 0;\r\n }\r\n\r\n .ng-sidebar--right {\r\n bottom: 0;\r\n right: 0;\r\n top: 0;\r\n }\r\n\r\n .ng-sidebar--top {\r\n left: 0;\r\n right: 0;\r\n top: 0;\r\n }\r\n\r\n .ng-sidebar--bottom {\r\n bottom: 0;\r\n left: 0;\r\n right: 0;\r\n }\r\n\r\n .ng-sidebar--inert {\r\n pointer-events: none;\r\n touch-action: none;\r\n will-change: transform;\r\n }\r\n\r\n .ng-sidebar--animate {\r\n -webkit-transition: -webkit-transform 0.3s cubic-bezier(0, 0, 0.3, 1);\r\n transition: transform 0.3s cubic-bezier(0, 0, 0.3, 1);\r\n }\r\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\r\nexport class Sidebar implements AfterContentInit, OnInit, OnChanges, OnDestroy {\r\n // `openedChange` allows for \"2-way\" data binding\r\n @Input() opened: boolean = false;\r\n @Output() openedChange: EventEmitter<boolean> = new EventEmitter<boolean>();\r\n\r\n @Input() mode: 'over' | 'push' | 'slide' = 'over';\r\n @Input() dock: boolean = false;\r\n @Input() dockedSize: string = '0px';\r\n @Input() position: 'start' | 'end' | 'left' | 'right' | 'top' | 'bottom' = 'start';\r\n @Input() animate: boolean = true;\r\n\r\n @Input() autoCollapseHeight: number;\r\n @Input() autoCollapseWidth: number;\r\n @Input() autoCollapseOnInit: boolean = true;\r\n\r\n @Input() sidebarClass: string;\r\n\r\n @Input() ariaLabel: string;\r\n @Input() trapFocus: boolean = false;\r\n @Input() autoFocus: boolean = true;\r\n\r\n @Input() showBackdrop: boolean = false;\r\n @Input() closeOnClickBackdrop: boolean = false;\r\n @Input() closeOnClickOutside: boolean = false;\r\n\r\n @Input() keyClose: boolean = false;\r\n @Input() keyCode: number = 27; // Default to ESC key\r\n\r\n @Output() onContentInit: EventEmitter<null> = new EventEmitter<null>();\r\n @Output() onOpenStart: EventEmitter<null> = new EventEmitter<null>();\r\n @Output() onOpened: EventEmitter<null> = new EventEmitter<null>();\r\n @Output() onCloseStart: EventEmitter<null> = new EventEmitter<null>();\r\n @Output() onClosed: EventEmitter<null> = new EventEmitter<null>();\r\n @Output() onTransitionEnd: EventEmitter<null> = new EventEmitter<null>();\r\n @Output() onModeChange: EventEmitter<string> = new EventEmitter<string>();\r\n @Output() onPositionChange: EventEmitter<string> = new EventEmitter<string>();\r\n\r\n /** @internal */\r\n @Output() _onRerender: EventEmitter<null> = new EventEmitter<null>();\r\n\r\n /** @internal */\r\n @ViewChild('sidebar', {static: false}) _elSidebar: ElementRef;\r\n\r\n private _focusableElementsString: string = 'a[href], area[href], input:not([disabled]), select:not([disabled]),' +\r\n 'textarea:not([disabled]), button:not([disabled]), iframe, object, embed, [tabindex], [contenteditable]';\r\n private _focusableElements: Array<HTMLElement>;\r\n private _focusedBeforeOpen: HTMLElement;\r\n\r\n private _tabIndexAttr: string = '__tabindex__';\r\n private _tabIndexIndicatorAttr: string = '__ngsidebar-tabindex__';\r\n\r\n private _wasCollapsed: boolean;\r\n\r\n // Delay initial animation (issues #59, #112)\r\n private _shouldAnimate: boolean;\r\n\r\n private _clickEvent: string = 'click';\r\n private _onClickOutsideAttached: boolean = false;\r\n private _onKeyDownAttached: boolean = false;\r\n private _onResizeAttached: boolean = false;\r\n\r\n private _isBrowser: boolean;\r\n\r\n constructor(\r\n @Optional() private _container: SidebarContainer,\r\n private _ref: ChangeDetectorRef,\r\n @Inject(PLATFORM_ID) platformId: Object) {\r\n if (!this._container) {\r\n throw new Error(\r\n '<ng-sidebar> must be inside a <ng-sidebar-container>. ' +\r\n 'See https://github.com/arkon/ng-sidebar#usage for more info.'\r\n );\r\n }\r\n\r\n this._isBrowser = isPlatformBrowser(platformId);\r\n\r\n // Handle taps in iOS\r\n if (this._isBrowser && isIOS() && !('onclick' in window)) {\r\n this._clickEvent = 'touchstart';\r\n }\r\n\r\n this._normalizePosition();\r\n\r\n this.open = this.open.bind(this);\r\n this.close = this.close.bind(this);\r\n this._onTransitionEnd = this._onTransitionEnd.bind(this);\r\n this._onFocusTrap = this._onFocusTrap.bind(this);\r\n this._onClickOutside = this._onClickOutside.bind(this);\r\n this._onKeyDown = this._onKeyDown.bind(this);\r\n this._collapse = this._collapse.bind(this);\r\n }\r\n\r\n ngOnInit(): void {\r\n if (!this._isBrowser) {\r\n return;\r\n }\r\n\r\n if (this.animate) {\r\n this._shouldAnimate = true;\r\n this.animate = false;\r\n }\r\n\r\n this._container._addSidebar(this);\r\n\r\n if (this.autoCollapseOnInit) {\r\n this._collapse();\r\n }\r\n }\r\n\r\n ngAfterContentInit(): void {\r\n this.onContentInit.emit();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (!this._isBrowser) {\r\n return;\r\n }\r\n\r\n if (changes['animate'] && this._shouldAnimate) {\r\n this._shouldAnimate = changes['animate'].currentValue;\r\n }\r\n\r\n if (changes['closeOnClickOutside']) {\r\n if (changes['closeOnClickOutside'].currentValue) {\r\n this._initCloseClickListener();\r\n } else {\r\n this._destroyCloseClickListener();\r\n }\r\n }\r\n if (changes['keyClose']) {\r\n if (changes['keyClose'].currentValue) {\r\n this._initCloseKeyDownListener();\r\n } else {\r\n this._destroyCloseKeyDownListener();\r\n }\r\n }\r\n\r\n if (changes['position']) {\r\n // Handle \"start\" and \"end\" aliases\r\n this._normalizePosition();\r\n\r\n // Emit change in timeout to allow for position change to be rendered first\r\n setTimeout(() => {\r\n this.onPositionChange.emit(changes['position'].currentValue);\r\n });\r\n }\r\n\r\n if (changes['mode']) {\r\n setTimeout(() => {\r\n this.onModeChange.emit(changes['mode'].currentValue);\r\n });\r\n }\r\n\r\n if (changes['dock']) {\r\n this.triggerRerender();\r\n }\r\n\r\n if (changes['opened']) {\r\n if (this._shouldAnimate) {\r\n this.animate = true;\r\n this._shouldAnimate = false;\r\n }\r\n\r\n if (changes['opened'].currentValue) {\r\n this.open();\r\n } else {\r\n this.close();\r\n }\r\n }\r\n\r\n if (changes['autoCollapseHeight'] || changes['autoCollapseWidth']) {\r\n this._initCollapseListeners();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (!this._isBrowser) {\r\n return;\r\n }\r\n\r\n this._destroyCloseListeners();\r\n this._destroyCollapseListeners();\r\n\r\n this._container._removeSidebar(this);\r\n }\r\n\r\n // Sidebar toggling\r\n // ==============================================================================================\r\n\r\n /**\r\n * Opens the sidebar and emits the appropriate events.\r\n */\r\n open(): void {\r\n if (!this._isBrowser) {\r\n return;\r\n }\r\n\r\n this.opened = true;\r\n this.openedChange.emit(true);\r\n\r\n this.onOpenStart.emit();\r\n\r\n this._ref.detectChanges();\r\n\r\n setTimeout(() => {\r\n if (this.animate && !this._isModeSlide) {\r\n this._elSidebar.nativeElement.addEventListener('transitionend', this._onTransitionEnd);\r\n } else {\r\n this._setFocused();\r\n this._initCloseListeners();\r\n\r\n if (this.opened) {\r\n this.onOpened.emit();\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Closes the sidebar and emits the appropriate events.\r\n */\r\n close(): void {\r\n if (!this._isBrowser) {\r\n return;\r\n }\r\n\r\n this.opened = false;\r\n this.openedChange.emit(false);\r\n\r\n this.onCloseStart.emit();\r\n\r\n this._ref.detectChanges();\r\n\r\n setTimeout(() => {\r\n if (this.animate && !this._isModeSlide) {\r\n this._elSidebar.nativeElement.addEventListener('transitionend', this._onTransitionEnd);\r\n } else {\r\n this._setFocused();\r\n this._destroyCloseListeners();\r\n\r\n if (!this.opened) {\r\n this.onClosed.emit();\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Manually trigger a re-render of the container. Useful if the sidebar contents might change.\r\n */\r\n triggerRerender(): void {\r\n if (!this._isBrowser) {\r\n return;\r\n }\r\n\r\n setTimeout(() => {\r\n this._onRerender.emit();\r\n });\r\n }\r\n\r\n /**\r\n * @internal\r\n *\r\n * Computes the transform styles for the sidebar template.\r\n *\r\n * @return {CSSStyleDeclaration} The transform styles, with the WebKit-prefixed version as well.\r\n */\r\n _getStyle(): CSSStyleDeclaration {\r\n let transformStyle: string = '';\r\n\r\n // Hides sidebar off screen when closed\r\n if (!this.opened) {\r\n const transformDir: string = 'translate' + (this._isLeftOrRight ? 'X' : 'Y');\r\n let translateAmt: string = `${this._isLeftOrTop ? '-' : ''}100%`;\r\n\r\n transformStyle = `${transformDir}(${translateAmt})`;\r\n\r\n // Docked mode: partially remains open\r\n // Note that using `calc(...)` within `transform(...)` doesn't work in IE\r\n if (this.dock && this._dockedSize > 0 && !(this._isModeSlide && this.opened)) {\r\n transformStyle += ` ${transformDir}(${this._isLeftOrTop ? '+' : '-'}${this.dockedSize})`;\r\n }\r\n }\r\n\r\n return {\r\n webkitTransform: transformStyle,\r\n transform: transformStyle\r\n } as CSSStyleDeclaration;\r\n }\r\n\r\n /**\r\n * @internal\r\n *\r\n * Handles the `transitionend` event on the sidebar to emit the onOpened/onClosed events after the transform\r\n * transition is completed.\r\n */\r\n _onTransitionEnd(e: TransitionEvent): void {\r\n if (e.target === this._elSidebar.nativeElement && e.propertyName.endsWith('transform')) {\r\n this._setFocused();\r\n\r\n if (this.opened) {\r\n this._initCloseListeners();\r\n this.onOpened.emit();\r\n } else {\r\n this._destroyCloseListeners();\r\n this.onClosed.emit();\r\n }\r\n\r\n this.onTransitionEnd.emit();\r\n\r\n this._elSidebar.nativeElement.removeEventListener('transitionend', this._onTransitionEnd);\r\n }\r\n }\r\n\r\n // Focus on open/close\r\n // ==============================================================================================\r\n\r\n /**\r\n * Returns whether focus should be trapped within the sidebar.\r\n *\r\n * @return {boolean} Trap focus inside sidebar.\r\n */\r\n private get _shouldTrapFocus(): boolean {\r\n return this.opened && this.trapFocus;\r\n }\r\n\r\n /**\r\n * Sets focus to the first focusable element inside the sidebar.\r\n */\r\n private _focusFirstItem(): void {\r\n if (this._focusableElements && this._focusableElements.length > 0) {\r\n this._focusableElements[0].focus();\r\n }\r\n }\r\n\r\n /**\r\n * Loops focus back to the start of the sidebar if set to do so.\r\n */\r\n private _onFocusTrap(e: FocusEvent): void {\r\n if (this._shouldTrapFocus && !this._elSidebar.nativeElement.contains(e.target)) {\r\n this._focusFirstItem();\r\n }\r\n }\r\n\r\n /**\r\n * Handles the ability to focus sidebar elements when it's open/closed to ensure that the sidebar is inert when\r\n * appropriate.\r\n */\r\n private _setFocused(): void {\r\n this._focusableElements = Array.from(\r\n this._elSidebar.nativeElement.querySelectorAll(this._focusableElementsString)\r\n ) as Array<HTMLElement>;\r\n\r\n if (this.opened) {\r\n this._focusedBeforeOpen = document.activeElement as HTMLElement;\r\n\r\n // Restore focusability, with previous tabindex attributes\r\n for (const el of this._focusableElements) {\r\n const prevTabIndex = el.getAttribute(this._tabIndexAttr);\r\n const wasTabIndexSet = el.getAttribute(this._tabIndexIndicatorAttr) !== null;\r\n if (prevTabIndex !== null) {\r\n el.setAttribute('tabindex', prevTabIndex);\r\n el.removeAttribute(this._tabIndexAttr);\r\n } else if (wasTabIndexSet) {\r\n el.removeAttribute('tabindex');\r\n el.removeAttribute(this._tabIndexIndicatorAttr);\r\n }\r\n }\r\n\r\n if (this.autoFocus) {\r\n this._focusFirstItem();\r\n }\r\n\r\n document.addEventListener('focus', this._onFocusTrap, true);\r\n } else {\r\n // Manually make all focusable elements unfocusable, saving existing tabindex attributes\r\n for (const el of this._focusableElements) {\r\n const existingTabIndex = el.getAttribute('tabindex');\r\n el.setAttribute('tabindex', '-1');\r\n el.setAttribute(this._tabIndexIndicatorAttr, '');\r\n\r\n if (existingTabIndex !== null) {\r\n el.setAttribute(this._tabIndexAttr, existingTabIndex);\r\n }\r\n }\r\n\r\n document.removeEventListener('focus', this._onFocusTrap, true);\r\n\r\n // Set focus back to element before the sidebar was opened\r\n if (this._focusedBeforeOpen && this.autoFocus && this._isModeOver) {\r\n this._focusedBeforeOpen.focus();\r\n this._focusedBeforeOpen = null;\r\n }\r\n }\r\n }\r\n\r\n // Close event handlers\r\n // ==============================================================================================\r\n\r\n /**\r\n * Initializes event handlers for the closeOnClickOutside and keyClose options.\r\n */\r\n private _initCloseListeners(): void {\r\n this._initCloseClickListener();\r\n this._initCloseKeyDownListener();\r\n }\r\n\r\n private _initCloseClickListener(): void {\r\n // In a timeout so that things render first\r\n setTimeout(() => {\r\n if (this.opened && this.closeOnClickOutside && !this._onClickOutsideAttached) {\r\n document.addEventListener(this._clickEvent, this._onClickOutside);\r\n this._onClickOutsideAttached = true;\r\n }\r\n });\r\n }\r\n\r\n private _initCloseKeyDownListener(): void {\r\n // In a timeout so that things render first\r\n setTimeout(() => {\r\n if (this.opened && this.keyClose && !this._onKeyDownAttached) {\r\n document.addEventListener('keydown', this._onKeyDown);\r\n this._onKeyDownAttached = true;\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Destroys all event handlers from _initCloseListeners.\r\n */\r\n private _destroyCloseListeners(): void {\r\n this._destroyCloseClickListener();\r\n this._destroyCloseKeyDownListener();\r\n }\r\n\r\n private _destroyCloseClickListener(): void {\r\n if (this._onClickOutsideAttached) {\r\n document.removeEventListener(this._clickEvent, this._onClickOutside);\r\n this._onClickOutsideAttached = false;\r\n }\r\n }\r\n\r\n private _destroyCloseKeyDownListener(): void {\r\n if (this._onKeyDownAttached) {\r\n document.removeEventListener('keydown', this._onKeyDown);\r\n this._onKeyDownAttached = false;\r\n }\r\n }\r\n\r\n /**\r\n * Handles `click` events on anything while the sidebar is open for the closeOnClickOutside option.\r\n * Programatically closes the sidebar if a click occurs outside the sidebar.\r\n *\r\n * @param e {MouseEvent} Mouse click event.\r\n */\r\n private _onClickOutside(e: MouseEvent): void {\r\n if (this._onClickOutsideAttached && this._elSidebar && !this._elSidebar.nativeElement.contains(e.target)) {\r\n this.close();\r\n }\r\n }\r\n\r\n /**\r\n * Handles the `keydown` event for the keyClose option.\r\n *\r\n * @param e {KeyboardEvent} Normalized keydown event.\r\n */\r\n private _onKeyDown(e: KeyboardEvent | Event): void {\r\n e = e || window.event;\r\n\r\n if ((e as KeyboardEvent).keyCode === this.keyCode) {\r\n this.close();\r\n }\r\n }\r\n\r\n // Auto collapse handlers\r\n // ==============================================================================================\r\n\r\n private _initCollapseListeners(): void {\r\n if (this.autoCollapseHeight || this.autoCollapseWidth) {\r\n // In a timeout so that things render first\r\n setTimeout(() => {\r\n if (!this._onResizeAttached) {\r\n window.addEventListener('resize', this._collapse);\r\n this._onResizeAttached = true;\r\n }\r\n });\r\n }\r\n }\r\n\r\n private _destroyCollapseListeners(): void {\r\n if (this._onResizeAttached) {\r\n window.removeEventListener('resize', this._collapse);\r\n this._onResizeAttached = false;\r\n }\r\n }\r\n\r\n private _collapse(): void {\r\n const winHeight: number = window.innerHeight;\r\n const winWidth: number = window.innerWidth;\r\n\r\n if (this.autoCollapseHeight) {\r\n if (winHeight <= this.autoCollapseHeight && this.opened) {\r\n this._wasCollapsed = true;\r\n this.close();\r\n } else if (winHeight > this.autoCollapseHeight && this._wasCollapsed) {\r\n this.open();\r\n this._wasCollapsed = false;\r\n }\r\n }\r\n\r\n if (this.autoCollapseWidth) {\r\n if (winWidth <= this.autoCollapseWidth && this.opened) {\r\n this._wasCollapsed = true;\r\n this.close();\r\n } else if (winWidth > this.autoCollapseWidth && this._wasCollapsed) {\r\n this.open();\r\n this._wasCollapsed = false;\r\n }\r\n }\r\n }\r\n\r\n // Helpers\r\n // ==============================================================================================\r\n\r\n /**\r\n * @internal\r\n *\r\n * Returns the rendered height of the sidebar (or the docked size).\r\n * This is used in the sidebar container.\r\n *\r\n * @return {number} Height of sidebar.\r\n */\r\n get _height(): number {\r\n if (this._elSidebar.nativeElement) {\r\n return this._isDocked ? this._dockedSize : this._elSidebar.nativeElement.offsetHeight;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n /**\r\n * @internal\r\n *\r\n * Returns the rendered width of the sidebar (or the docked size).\r\n * This is used in the sidebar container.\r\n *\r\n * @return {number} Width of sidebar.\r\n */\r\n get _width(): number {\r\n if (this._elSidebar.nativeElement) {\r\n return this._isDocked ? this._dockedSize : this._elSidebar.nativeElement.offsetWidth;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n /**\r\n * @internal\r\n *\r\n * Returns the docked size as a number.\r\n *\r\n * @return {number} Docked size.\r\n */\r\n get _dockedSize(): number {\r\n return parseFloat(this.dockedSize);\r\n }\r\n\r\n /**\r\n * @internal\r\n *\r\n * Returns whether the sidebar is over mode.\r\n *\r\n * @return {boolean} Sidebar's mode is \"over\".\r\n */\r\n get _isModeOver(): boolean {\r\n return this.mode === 'over';\r\n }\r\n\r\n /**\r\n * @internal\r\n *\r\n * Returns whether the sidebar is push mode.\r\n *\r\n * @return {boolean} Sidebar's mode is \"push\".\r\n */\r\n get _isModePush(): boolean {\r\n return this.mode === 'push';\r\n }\r\n\r\n /**\r\n * @internal\r\n *\r\n * Returns whether the sidebar is slide mode.\r\n *\r\n * @return {boolean} Sidebar's mode is \"slide\".\r\n */\r\n get _isModeSlide(): boolean {\r\n return this.mode === 'slide';\r\n }\r\n\r\n /**\r\n * @internal\r\n *\r\n * Returns whether the sidebar is \"docked\" -- i.e. it is closed but in dock mode.\r\n *\r\n * @return {boolean} Sidebar is docked.\r\n */\r\n get _isDocked(): boolean {\r\n return this.dock && this.dockedSize && !this.opened;\r\n }\r\n\r\n /**\r\n * @internal\r\n *\r\n * Returns whether the sidebar is positioned at the left or top.\r\n *\r\n * @return {boolean} Sidebar is positioned at the left or top.\r\n */\r\n get _isLeftOrTop(): boolean {\r\n return this.position === 'left' || this.position === 'top';\r\n }\r\n\r\n /**\r\n * @internal\r\n *\r\n * Returns whether the sidebar is positioned at the left or right.\r\n *\r\n * @return {boolean} Sidebar is positioned at the left or right.\r\n */\r\n get _isLeftOrRight(): boolean {\r\n return this.position === 'left' || this.position === 'right';\r\n }\r\n\r\n /**\r\n * @internal\r\n *\r\n * Returns whether the sidebar is inert -- i.e. the contents cannot be focused.\r\n *\r\n * @return {boolean} Sidebar is inert.\r\n */\r\n get _isInert(): boolean {\r\n return !this.opened && !this.dock;\r\n }\r\n\r\n /**\r\n * \"Normalizes\" position. For example, \"start\" would be \"left\" if the page is LTR.\r\n */\r\n private _normalizePosition(): void {\r\n const ltr: boolean = isLTR();\r\n\r\n if (this.position === 'start') {\r\n this.position = ltr ? 'left' : 'right';\r\n } else if (this.position === 'end') {\r\n this.position = ltr ? 'right' : 'left';\r\n }\r\n }\r\n}\r\n","import { Directive } from '@angular/core';\r\n\r\nimport { Sidebar } from './sidebar.component';\r\n\r\n@Directive({\n selector: '[closeSidebar]',\n host: {\n '(click)': '_onClick()'\n },\n standalone: false\n})\r\nexport class CloseSidebar {\r\n constructor(private _sidebar: Sidebar) {}\r\n\r\n /** @internal */\r\n _onClick(): void {\r\n if (this._sidebar) {\r\n this._sidebar.close();\r\n }\r\n }\r\n}\r\n","import { ModuleWithProviders, NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { SidebarContainer } from './sidebar-container.component';\r\nimport { Sidebar } from './sidebar.component';\r\nimport { CloseSidebar } from './close.directive';\r\n\r\n@NgModule({\r\n declarations: [SidebarContainer, Sidebar, CloseSidebar],\r\n imports: [CommonModule],\r\n exports: [SidebarContainer, Sidebar, CloseSidebar]\r\n})\r\nexport class SidebarModule {\r\n static forRoot(): ModuleWithProviders<SidebarModule> {\r\n return {\r\n ngModule: SidebarModule\r\n };\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i1.Sidebar"],"mappings":"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