ngx-smart-modal
Version:
Smart modal handler to manage modals and data everywhere in Angular apps.
1 lines • 62.7 kB
Source Map (JSON)
{"version":3,"file":"ngx-smart-modal.mjs","sources":["../../../projects/ngx-smart-modal/src/lib/config/ngx-smart-modal.config.ts","../../../projects/ngx-smart-modal/src/lib/components/ngx-smart-modal.component.ts","../../../projects/ngx-smart-modal/src/lib/services/ngx-smart-modal-stack.service.ts","../../../projects/ngx-smart-modal/src/lib/services/ngx-smart-modal.service.ts","../../../projects/ngx-smart-modal/src/lib/modules/ngx-smart-modal.module.ts","../../../projects/ngx-smart-modal/src/public-api.ts","../../../projects/ngx-smart-modal/src/ngx-smart-modal.ts"],"sourcesContent":["export const NgxSmartModalConfig = {\n bodyClassOpen: 'dialog-open',\n prefixEvent: 'ngx-smart-modal.'\n};\n\nexport interface INgxSmartModalOptions {\n closable?: boolean;\n escapable?: boolean;\n dismissable?: boolean;\n customClass?: string;\n backdrop?: boolean;\n force?: boolean;\n hideDelay?: number;\n autostart?: boolean;\n target?: string;\n ariaLabel?: string;\n ariaLabelledBy?: string;\n ariaDescribedBy?: string;\n refocus?: boolean;\n}\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport {\n AfterViewChecked,\n ChangeDetectorRef,\n Component,\n ComponentRef,\n ElementRef,\n EventEmitter,\n HostListener,\n Inject,\n Input,\n OnDestroy,\n OnInit,\n Output,\n PLATFORM_ID,\n QueryList,\n Renderer2,\n Type,\n ViewChild,\n ViewChildren,\n ViewContainerRef\n} from '@angular/core';\nimport { NgxSmartModalConfig } from '../config/ngx-smart-modal.config';\n\n@Component({\n selector: 'ngx-smart-modal',\n template: `\n <div *ngIf=\"overlayVisible\"\n [style.z-index]=\"visible ? layerPosition-1 : -1\"\n [ngClass]=\"{'transparent':!backdrop, 'overlay':true, 'nsm-overlay-open':openedClass}\"\n (click)=\"dismiss($event)\" #nsmOverlay>\n <div [style.z-index]=\"visible ? layerPosition : -1\"\n [ngClass]=\"['nsm-dialog', customClass, openedClass ? 'nsm-dialog-open': 'nsm-dialog-close']\" #nsmDialog\n [attr.aria-hidden]=\"openedClass ? false : true\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.aria-describedby]=\"ariaDescribedBy\">\n <div class=\"nsm-content\" #nsmContent>\n <div class=\"nsm-body\">\n <ng-template #dynamicContent></ng-template>\n <ng-content></ng-content>\n </div>\n <button type=\"button\" *ngIf=\"closable\" (click)=\"close()\" aria-label=\"Close\" class=\"nsm-dialog-btn-close\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" id=\"Layer_1\" x=\"0px\" y=\"0px\" viewBox=\"0 0 512 512\"\n xml:space=\"preserve\" width=\"16px\" height=\"16px\" role=\"img\" aria-labelledby=\"closeIconTitle closeIconDesc\">\n <title id=\"closeIconTitle\">Close Icon</title>\n <desc id=\"closeIconDesc\">A light-gray close icon used to close the modal</desc>\n <g>\n <path d=\"M505.943,6.058c-8.077-8.077-21.172-8.077-29.249,0L6.058,476.693c-8.077,8.077-8.077,21.172,0,29.249 C10.096,509.982,15.39,512,20.683,512c5.293,0,10.586-2.019,14.625-6.059L505.943,35.306 C514.019,27.23,514.019,14.135,505.943,6.058z\"\n fill=\"currentColor\"/>\n </g>\n <g>\n <path d=\"M505.942,476.694L35.306,6.059c-8.076-8.077-21.172-8.077-29.248,0c-8.077,8.076-8.077,21.171,0,29.248l470.636,470.636 c4.038,4.039,9.332,6.058,14.625,6.058c5.293,0,10.587-2.019,14.624-6.057C514.018,497.866,514.018,484.771,505.942,476.694z\"\n fill=\"currentColor\"/>\n </g>\n </svg>\n </button>\n </div>\n </div>\n </div>\n`,\n styles: [\n ]\n})\nexport class NgxSmartModalComponent implements OnInit, OnDestroy, AfterViewChecked {\n\n @Input() public closable = true;\n @Input() public escapable = true;\n @Input() public dismissable = true;\n @Input() public identifier = '';\n @Input() public customClass = 'nsm-dialog-animation-fade';\n @Input() public visible = false;\n @Input() public backdrop = true;\n @Input() public force = true;\n @Input() public hideDelay = 500;\n @Input() public autostart = false;\n @Input() public target = '';\n @Input() public ariaLabel: string | null = null;\n @Input() public ariaLabelledBy: string | null = null;\n @Input() public ariaDescribedBy: string | null = null;\n @Input() public refocus = true;\n\n @Output() public visibleChange: EventEmitter<boolean> = new EventEmitter<boolean>();\n @Output() public onClose: EventEmitter<any> = new EventEmitter();\n @Output() public onCloseFinished: EventEmitter<any> = new EventEmitter();\n @Output() public onDismiss: EventEmitter<any> = new EventEmitter();\n @Output() public onDismissFinished: EventEmitter<any> = new EventEmitter();\n @Output() public onAnyCloseEvent: EventEmitter<any> = new EventEmitter();\n @Output() public onAnyCloseEventFinished: EventEmitter<any> = new EventEmitter();\n @Output() public onOpen: EventEmitter<any> = new EventEmitter();\n @Output() public onOpenFinished: EventEmitter<any> = new EventEmitter();\n @Output() public onEscape: EventEmitter<any> = new EventEmitter();\n @Output() public onDataAdded: EventEmitter<any> = new EventEmitter();\n @Output() public onDataRemoved: EventEmitter<any> = new EventEmitter();\n\n public contentComponent!: Type<any>;\n public layerPosition = 1041;\n public overlayVisible = false;\n public openedClass = false;\n\n public createFrom = 'html';\n\n private _data: any;\n private _componentRef!: ComponentRef<Component>;\n\n @ViewChildren('nsmContent') private nsmContent!: QueryList<ElementRef>;\n @ViewChildren('nsmDialog') public nsmDialog!: QueryList<ElementRef>;\n @ViewChildren('nsmOverlay') private nsmOverlay!: QueryList<ElementRef>;\n @ViewChild('dynamicContent', { read: ViewContainerRef }) private dynamicContentContainer!: ViewContainerRef;\n\n constructor(\n private _renderer: Renderer2,\n private _changeDetectorRef: ChangeDetectorRef,\n private _viewContainerRef: ViewContainerRef,\n public readonly elementRef: ElementRef,\n @Inject(DOCUMENT) private _document: Document,\n @Inject(PLATFORM_ID) private _platformId: object,\n ) { }\n\n public ngOnInit() {\n if (!this.identifier || !this.identifier.length) {\n throw new Error('identifier field isn’t set. Please set one before calling <ngx-smart-modal> in a template.');\n }\n\n this._sendEvent('create');\n }\n\n public ngAfterViewChecked() {\n if (\n this.overlayVisible &&\n this.contentComponent &&\n this.dynamicContentContainer &&\n this.dynamicContentContainer.length === 0\n ) {\n this.createDynamicContent();\n }\n }\n\n public ngOnDestroy() {\n this._sendEvent('delete');\n }\n\n /**\n * Open the modal instance\n *\n * @param top open the modal top of all other\n * @returns the modal component\n */\n public open(top?: boolean): NgxSmartModalComponent {\n this._sendEvent('open', { top: top });\n\n return this;\n }\n\n /**\n * Close the modal instance\n *\n * @returns the modal component\n */\n public close(): NgxSmartModalComponent {\n this._sendEvent('close');\n\n return this;\n }\n\n /**\n * Dismiss the modal instance\n *\n * @param e the event sent by the browser\n * @returns the modal component\n */\n public dismiss(e: MouseEvent): NgxSmartModalComponent {\n if (!this.dismissable || !(e?.target as Element)?.classList.contains('overlay')) {\n return this;\n }\n\n this._sendEvent('dismiss');\n\n return this;\n }\n\n /**\n * Toggle visibility of the modal instance\n *\n * @param top open the modal top of all other\n * @returns the modal component\n */\n public toggle(top?: boolean): NgxSmartModalComponent {\n this._sendEvent('toggle', { top: top });\n\n return this;\n }\n\n /**\n * Add a custom class to the modal instance\n *\n * @param className the class to add\n * @returns the modal component\n */\n public addCustomClass(className: string): NgxSmartModalComponent {\n if (!this.customClass.length) {\n this.customClass = className;\n } else {\n this.customClass += ' ' + className;\n }\n\n return this;\n }\n\n /**\n * Remove a custom class to the modal instance\n *\n * @param className the class to remove\n * @returns the modal component\n */\n public removeCustomClass(className?: string): NgxSmartModalComponent {\n if (className) {\n this.customClass = this.customClass.replace(className, '').trim();\n } else {\n this.customClass = '';\n }\n\n return this;\n }\n\n /**\n * Returns the visibility state of the modal instance\n */\n public isVisible(): boolean {\n return this.visible;\n }\n\n /**\n * Checks if data is attached to the modal instance\n */\n public hasData(): boolean {\n return this._data !== undefined;\n }\n\n /**\n * Attach data to the modal instance\n *\n * @param data the data to attach\n * @param force override potentially attached data\n * @returns the modal component\n */\n public setData(data: unknown, force?: boolean): NgxSmartModalComponent {\n if (!this.hasData() || (this.hasData() && force)) {\n this._data = data;\n this.assignModalDataToComponentData(this._componentRef);\n this.onDataAdded.emit(this._data);\n this.markForCheck();\n }\n\n return this;\n }\n\n /**\n * Retrieve the data attached to the modal instance\n */\n public getData(): unknown {\n this.assignComponentDataToModalData(this._componentRef);\n return this._data;\n }\n\n /**\n * Remove the data attached to the modal instance\n *\n * @returns the modal component\n */\n public removeData(): NgxSmartModalComponent {\n this._data = undefined;\n this.onDataRemoved.emit(true);\n this.markForCheck();\n\n return this;\n }\n\n /**\n * Add body class modal opened\n *\n * @returns the modal component\n */\n public addBodyClass(): NgxSmartModalComponent {\n this._renderer.addClass(this._document.body, NgxSmartModalConfig.bodyClassOpen);\n\n return this;\n }\n\n /**\n * Add body class modal opened\n *\n * @returns the modal component\n */\n public removeBodyClass(): NgxSmartModalComponent {\n this._renderer.removeClass(this._document.body, NgxSmartModalConfig.bodyClassOpen);\n\n return this;\n }\n\n public markForCheck() {\n try {\n this._changeDetectorRef.detectChanges();\n } catch (e) { /* empty */ }\n\n this._changeDetectorRef.markForCheck();\n }\n\n /**\n * Listens for window resize event and recalculates modal instance position if it is element-relative\n */\n @HostListener('window:resize')\n public targetPlacement(): boolean | void {\n if (!this.isBrowser || !this.nsmDialog.length || !this.nsmContent.length || !this.nsmOverlay.length || !this.target) {\n return false;\n }\n const targetElement = this._document.querySelector(this.target);\n\n if (!targetElement) {\n return false;\n }\n\n const targetElementRect = targetElement.getBoundingClientRect();\n const bodyRect = this.nsmOverlay.first.nativeElement.getBoundingClientRect();\n\n const nsmContentRect = this.nsmContent.first.nativeElement.getBoundingClientRect();\n const nsmDialogRect = this.nsmDialog.first.nativeElement.getBoundingClientRect();\n\n const marginLeft = parseInt(getComputedStyle(this.nsmContent.first.nativeElement).marginLeft, 10);\n const marginTop = parseInt(getComputedStyle(this.nsmContent.first.nativeElement).marginTop, 10);\n\n let offsetTop = targetElementRect.top - nsmDialogRect.top - ((nsmContentRect.height - targetElementRect.height) / 2);\n let offsetLeft = targetElementRect.left - nsmDialogRect.left - ((nsmContentRect.width - targetElementRect.width) / 2);\n\n if (offsetLeft + nsmDialogRect.left + nsmContentRect.width + (marginLeft * 2) > bodyRect.width) {\n offsetLeft = bodyRect.width - (nsmDialogRect.left + nsmContentRect.width) - (marginLeft * 2);\n } else if (offsetLeft + nsmDialogRect.left < 0) {\n offsetLeft = -nsmDialogRect.left;\n }\n\n if (offsetTop + nsmDialogRect.top + nsmContentRect.height + marginTop > bodyRect.height) {\n offsetTop = bodyRect.height - (nsmDialogRect.top + nsmContentRect.height) - marginTop;\n }\n\n this._renderer.setStyle(this.nsmContent.first.nativeElement, 'top', (offsetTop < 0 ? 0 : offsetTop) + 'px');\n this._renderer.setStyle(this.nsmContent.first.nativeElement, 'left', offsetLeft + 'px');\n }\n\n private _sendEvent(name: string, extraData?: unknown): boolean {\n if (!this.isBrowser) {\n return false;\n }\n\n const data = {\n extraData: extraData,\n instance: { id: this.identifier, modal: this }\n };\n\n const event = new CustomEvent(NgxSmartModalConfig.prefixEvent + name, { detail: data });\n\n return window.dispatchEvent(event);\n }\n\n /**\n * Is current platform browser\n */\n private get isBrowser(): boolean {\n return isPlatformBrowser(this._platformId);\n }\n\n /**\n * Creates content inside provided ViewContainerRef\n */\n private createDynamicContent(): void {\n this.dynamicContentContainer.clear();\n this._componentRef = this.dynamicContentContainer.createComponent(this.contentComponent);\n this.assignModalDataToComponentData(this._componentRef);\n this.markForCheck();\n }\n\n /**\n * Assigns the modal data to the ComponentRef instance properties\n */\n private assignModalDataToComponentData(componentRef: ComponentRef<Component>): void {\n if (componentRef) {\n Object.assign(componentRef.instance, this._data);\n }\n }\n\n /**\n * Assigns the ComponentRef instance properties to the modal data object\n */\n private assignComponentDataToModalData(componentRef: ComponentRef<Component>): void {\n if (componentRef) {\n Object.assign(this._data, componentRef.instance);\n }\n }\n\n}\n","import { Injectable } from '@angular/core';\n\nimport { ModalInstance } from './modal-instance';\nimport { NgxSmartModalComponent } from '../components/ngx-smart-modal.component';\n\n@Injectable()\nexport class NgxSmartModalStackService {\n private _modalStack: ModalInstance[];\n\n constructor() {\n this._modalStack = [];\n }\n\n /**\n * Add a new modal instance. This step is essential and allows to retrieve any modal at any time.\n * It stores an object that contains the given modal identifier and the modal itself directly in the `modalStack`.\n *\n * @param modalInstance The object that contains the given modal identifier and the modal itself.\n * @param force Optional parameter that forces the overriding of modal instance if it already exists.\n * @returns nothing special.\n */\n public addModal(modalInstance: ModalInstance, force?: boolean): void {\n if (force) {\n const i: number = this._modalStack.findIndex((o: ModalInstance) => o.id === modalInstance.id);\n if (i > -1) {\n this._modalStack[i].modal = modalInstance.modal;\n } else {\n this._modalStack.push(modalInstance);\n }\n return;\n }\n this._modalStack.push(modalInstance);\n }\n\n /**\n * Retrieve a modal instance by its identifier.\n *\n * @param id The modal identifier used at creation time.\n */\n public getModal(id: string): NgxSmartModalComponent {\n const i = this._modalStack.find((o: ModalInstance) => o.id === id);\n\n if (i !== undefined) {\n return i.modal;\n } else {\n throw new Error(`Cannot find modal with identifier ${id}`);\n }\n }\n\n /**\n * Retrieve all the created modals.\n *\n * @returns an array that contains all modal instances.\n */\n public getModalStack(): ModalInstance[] {\n return this._modalStack;\n }\n\n /**\n * Retrieve all the opened modals. It looks for all modal instances with their `visible` property set to `true`.\n *\n * @returns an array that contains all the opened modals.\n */\n public getOpenedModals(): ModalInstance[] {\n return this._modalStack.filter((o: ModalInstance) => o.modal.visible);\n }\n\n /**\n * Retrieve the opened modal with highest z-index.\n *\n * @returns the opened modal with highest z-index.\n */\n public getTopOpenedModal(): NgxSmartModalComponent {\n if (!this.getOpenedModals().length) {\n throw new Error('No modal is opened');\n }\n\n return this.getOpenedModals()\n .map((o: ModalInstance) => o.modal)\n .reduce((highest, item) => item.layerPosition > highest.layerPosition ? item : highest, this.getOpenedModals()[0].modal);\n }\n\n /**\n * Get the higher `z-index` value between all the modal instances. It iterates over the `ModalStack` array and\n * calculates a higher value (it takes the highest index value between all the modal instances and adds 1).\n * Use it to make a modal appear foreground.\n *\n * @returns a higher index from all the existing modal instances.\n */\n public getHigherIndex(): number {\n return Math.max(...this._modalStack.map((o) => o.modal.layerPosition), 1041) + 1;\n }\n\n /**\n * It gives the number of modal instances. It's helpful to know if the modal stack is empty or not.\n *\n * @returns the number of modal instances.\n */\n public getModalStackCount(): number {\n return this._modalStack.length;\n }\n\n /**\n * Remove a modal instance from the modal stack.\n * Returns the removed modal instance or undefined if no modal was found\n *\n * @param id The modal identifier.\n * @returns the removed modal instance.\n */\n public removeModal(id: string): undefined | ModalInstance {\n const i: number = this._modalStack.findIndex((o: any) => o.id === id);\n if (i < 0) {\n return;\n }\n\n const modalInstance = this._modalStack.splice(i, 1)[0];\n return modalInstance;\n }\n}\n","import { ApplicationRef, EmbeddedViewRef, Inject, Injectable, Injector, PLATFORM_ID, TemplateRef, Type, ViewContainerRef } from '@angular/core';\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { NgxSmartModalComponent } from '../components/ngx-smart-modal.component';\nimport { INgxSmartModalOptions, NgxSmartModalConfig } from '../config/ngx-smart-modal.config';\nimport { NgxSmartModalStackService } from './ngx-smart-modal-stack.service';\nimport { ModalInstance } from './modal-instance';\n\nexport type Content<T> = string | TemplateRef<T> | Type<T>;\n\n@Injectable({\n providedIn: 'root'\n})\nexport class NgxSmartModalService {\n private lastElementFocused: any;\n\n constructor(\n private _appRef: ApplicationRef,\n private _injector: Injector,\n private _modalStack: NgxSmartModalStackService,\n private applicationRef: ApplicationRef,\n @Inject(DOCUMENT) private _document: any,\n @Inject(PLATFORM_ID) private _platformId: any\n ) {\n this._addEvents();\n }\n\n /**\n * Add a new modal instance. This step is essential and allows to retrieve any modal at any time.\n * It stores an object that contains the given modal identifier and the modal itself directly in the `modalStack`.\n *\n * @param modalInstance The object that contains the given modal identifier and the modal itself.\n * @param force Optional parameter that forces the overriding of modal instance if it already exists.\n * @returns nothing special.\n */\n public addModal(modalInstance: ModalInstance, force?: boolean): void {\n this._modalStack.addModal(modalInstance, force);\n }\n\n /**\n * Retrieve a modal instance by its identifier.\n *\n * @param id The modal identifier used at creation time.\n */\n public getModal(id: string): NgxSmartModalComponent {\n return this._modalStack.getModal(id);\n }\n\n /**\n * Alias of `getModal` to retrieve a modal instance by its identifier.\n *\n * @param id The modal identifier used at creation time.\n */\n public get(id: string): NgxSmartModalComponent {\n return this.getModal(id);\n }\n\n /**\n * Open a given modal\n *\n * @param id The modal identifier used at creation time.\n * @param force Tell the modal to open top of all other opened modals\n */\n public open(id: string, force = false): boolean {\n return this._openModal(this.get(id), force);\n }\n\n /**\n * Close a given modal\n *\n * @param id The modal identifier used at creation time.\n */\n public close(id: string): boolean {\n return this._closeModal(this.get(id));\n }\n\n /**\n * Close all opened modals\n */\n public closeAll(): void {\n this.getOpenedModals().forEach((instance: ModalInstance) => {\n this._closeModal(instance.modal);\n });\n }\n\n /**\n * Toggles a given modal\n * If the retrieved modal is opened it closes it, else it opens it.\n *\n * @param id The modal identifier used at creation time.\n * @param force Tell the modal to open top of all other opened modals\n */\n public toggle(id: string, force = false): boolean {\n return this._toggleModal(this.get(id), force);\n }\n\n /**\n * Retrieve all the created modals.\n *\n * @returns an array that contains all modal instances.\n */\n public getModalStack(): ModalInstance[] {\n return this._modalStack.getModalStack();\n }\n\n /**\n * Retrieve all the opened modals. It looks for all modal instances with their `visible` property set to `true`.\n *\n * @returns an array that contains all the opened modals.\n */\n public getOpenedModals(): ModalInstance[] {\n return this._modalStack.getOpenedModals();\n }\n\n /**\n * Retrieve the opened modal with highest z-index.\n *\n * @returns the opened modal with highest z-index.\n */\n public getTopOpenedModal(): NgxSmartModalComponent {\n return this._modalStack.getTopOpenedModal();\n }\n\n /**\n * Get the higher `z-index` value between all the modal instances. It iterates over the `ModalStack` array and\n * calculates a higher value (it takes the highest index value between all the modal instances and adds 1).\n * Use it to make a modal appear foreground.\n *\n * @returns a higher index from all the existing modal instances.\n */\n public getHigherIndex(): number {\n return this._modalStack.getHigherIndex();\n }\n\n /**\n * It gives the number of modal instances. It's helpful to know if the modal stack is empty or not.\n *\n * @returns the number of modal instances.\n */\n public getModalStackCount(): number {\n return this._modalStack.getModalStackCount();\n }\n\n /**\n * Remove a modal instance from the modal stack.\n *\n * @param id The modal identifier.\n * @returns the removed modal instance.\n */\n public removeModal(id: string): void {\n const modalInstance = this._modalStack.removeModal(id);\n if (modalInstance) {\n this._destroyModal(modalInstance.modal);\n }\n }\n\n /**\n * Associate data to an identified modal. If the modal isn't already associated to some data, it creates a new\n * entry in the `modalData` array with its `id` and the given `data`. If the modal already has data, it rewrites\n * them with the new ones. Finally if no modal found it returns an error message in the console and false value\n * as method output.\n *\n * @param data The data you want to associate to the modal.\n * @param id The modal identifier.\n * @param force If true, overrides the previous stored data if there was.\n * @returns true if the given modal exists and the process has been tried, either false.\n */\n public setModalData(data: any, id: string, force?: boolean): boolean {\n const modal = this.get(id);\n if (modal) {\n modal.setData(data, force);\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * Retrieve modal data by its identifier.\n *\n * @param id The modal identifier used at creation time.\n * @returns the associated modal data.\n */\n public getModalData(id: string): unknown {\n const modal = this.get(id);\n if (modal) {\n return modal.getData();\n }\n\n return null;\n }\n\n /**\n * Reset the data attached to a given modal.\n *\n * @param id The modal identifier used at creation time.\n * @returns the removed data or false if modal doesn't exist.\n */\n public resetModalData(id: string): unknown | boolean {\n if (this._modalStack.getModalStack().find((o: ModalInstance) => o.id === id)) {\n const removed: unknown = this.getModal(id).getData();\n this.getModal(id).removeData();\n return removed;\n } else {\n return false;\n }\n }\n\n /**\n * Close the latest opened modal\n */\n public closeLatestModal(): void {\n this.getTopOpenedModal().close();\n }\n\n /**\n * Create dynamic NgxSmartModalComponent\n * @param vcr A ViewContainerRef reference\n * @param id The modal identifier used at creation time\n * @param content The modal content (string, templateRef or Component)\n * @param options Any NgxSmartModalComponent available options\n */\n public create<T>(id: string, content: Content<T>, vcr: ViewContainerRef, options: INgxSmartModalOptions = {}) {\n try {\n return this.getModal(id);\n } catch (e) {\n const ngContent = this._resolveNgContent(content);\n\n const componentRef = vcr.createComponent(NgxSmartModalComponent, { injector: this._injector, projectableNodes: ngContent });\n\n if (content instanceof Type) {\n componentRef.instance.contentComponent = content;\n }\n\n componentRef.instance.identifier = id;\n componentRef.instance.createFrom = 'service';\n\n if (typeof options.closable === 'boolean') { componentRef.instance.closable = options.closable; }\n if (typeof options.escapable === 'boolean') { componentRef.instance.escapable = options.escapable; }\n if (typeof options.dismissable === 'boolean') { componentRef.instance.dismissable = options.dismissable; }\n if (typeof options.customClass === 'string') { componentRef.instance.customClass = options.customClass; }\n if (typeof options.backdrop === 'boolean') { componentRef.instance.backdrop = options.backdrop; }\n if (typeof options.force === 'boolean') { componentRef.instance.force = options.force; }\n if (typeof options.hideDelay === 'number') { componentRef.instance.hideDelay = options.hideDelay; }\n if (typeof options.autostart === 'boolean') { componentRef.instance.autostart = options.autostart; }\n if (typeof options.target === 'string') { componentRef.instance.target = options.target; }\n if (typeof options.ariaLabel === 'string') { componentRef.instance.ariaLabel = options.ariaLabel; }\n if (typeof options.ariaLabelledBy === 'string') { componentRef.instance.ariaLabelledBy = options.ariaLabelledBy; }\n if (typeof options.ariaDescribedBy === 'string') { componentRef.instance.ariaDescribedBy = options.ariaDescribedBy; }\n if (typeof options.refocus === 'boolean') { componentRef.instance.refocus = options.refocus; }\n\n const domElem = (componentRef.hostView as EmbeddedViewRef<any>).rootNodes[0] as HTMLElement;\n this._document.body.appendChild(domElem);\n\n return componentRef.instance;\n }\n }\n\n private _addEvents(): boolean {\n if (!this.isBrowser) {\n return false;\n }\n\n window.addEventListener(NgxSmartModalConfig.prefixEvent + 'create', ((e: CustomEvent) => {\n this._initModal(e.detail.instance);\n }) as EventListener);\n\n window.addEventListener(NgxSmartModalConfig.prefixEvent + 'delete', ((e: CustomEvent) => {\n this._deleteModal(e.detail.instance);\n }) as EventListener);\n\n window.addEventListener(NgxSmartModalConfig.prefixEvent + 'open', ((e: CustomEvent) => {\n this._openModal(e.detail.instance.modal, e.detail.extraData.top);\n }) as EventListener);\n\n window.addEventListener(NgxSmartModalConfig.prefixEvent + 'toggle', ((e: CustomEvent) => {\n this._toggleModal(e.detail.instance.modal, e.detail.extraData.top);\n }) as EventListener);\n\n window.addEventListener(NgxSmartModalConfig.prefixEvent + 'close', ((e: CustomEvent) => {\n this._closeModal(e.detail.instance.modal);\n }) as EventListener);\n\n window.addEventListener(NgxSmartModalConfig.prefixEvent + 'dismiss', ((e: CustomEvent) => {\n this._dismissModal(e.detail.instance.modal);\n }) as EventListener);\n\n window.addEventListener('keyup', this._escapeKeyboardEvent);\n\n return true;\n }\n\n private _initModal(modalInstance: ModalInstance) {\n modalInstance.modal.layerPosition += this.getModalStackCount();\n this.addModal(modalInstance, modalInstance.modal.force);\n\n if (modalInstance.modal.autostart) {\n this.open(modalInstance.id);\n }\n }\n\n private _openModal(modal: NgxSmartModalComponent, top?: boolean): boolean {\n if (modal.visible) {\n return false;\n }\n\n this.lastElementFocused = document.activeElement;\n\n if (modal.escapable) {\n window.addEventListener('keyup', this._escapeKeyboardEvent);\n }\n\n if (modal.backdrop) {\n window.addEventListener('keydown', this._trapFocusModal);\n }\n\n if (top) {\n modal.layerPosition = this.getHigherIndex();\n }\n\n modal.addBodyClass();\n modal.overlayVisible = true;\n modal.visible = true;\n modal.onOpen.emit(modal);\n modal.markForCheck();\n\n setTimeout(() => {\n modal.openedClass = true;\n\n if (modal.target) {\n modal.targetPlacement();\n }\n\n modal.nsmDialog.first.nativeElement.setAttribute('role', 'dialog');\n modal.nsmDialog.first.nativeElement.setAttribute('tabIndex', '-1');\n modal.nsmDialog.first.nativeElement.setAttribute('aria-modal', 'true');\n modal.nsmDialog.first.nativeElement.focus();\n\n modal.markForCheck();\n modal.onOpenFinished.emit(modal);\n });\n\n return true;\n }\n\n private _toggleModal(modal: NgxSmartModalComponent, top?: boolean): boolean {\n if (modal.visible) {\n return this._closeModal(modal);\n } else {\n return this._openModal(modal, top);\n }\n }\n\n private _closeModal(modal: NgxSmartModalComponent): boolean {\n if (!modal.openedClass) {\n return false;\n }\n\n modal.openedClass = false;\n modal.onClose.emit(modal);\n modal.onAnyCloseEvent.emit(modal);\n\n if (this.getOpenedModals().length < 2) {\n modal.removeBodyClass();\n window.removeEventListener('keyup', this._escapeKeyboardEvent);\n window.removeEventListener('keydown', this._trapFocusModal);\n }\n\n setTimeout(() => {\n modal.visibleChange.emit(modal.visible);\n modal.visible = false;\n modal.overlayVisible = false;\n modal.nsmDialog.first.nativeElement.removeAttribute('tabIndex');\n modal.markForCheck();\n modal.onCloseFinished.emit(modal);\n modal.onAnyCloseEventFinished.emit(modal);\n if (modal.refocus) {\n this.lastElementFocused.focus();\n }\n }, modal.hideDelay);\n\n return true;\n }\n\n private _dismissModal(modal: NgxSmartModalComponent): boolean {\n if (!modal.openedClass) {\n return false;\n }\n\n modal.openedClass = false;\n modal.onDismiss.emit(modal);\n modal.onAnyCloseEvent.emit(modal);\n\n if (this.getOpenedModals().length < 2) {\n modal.removeBodyClass();\n }\n\n setTimeout(() => {\n modal.visible = false;\n modal.visibleChange.emit(modal.visible);\n modal.overlayVisible = false;\n modal.markForCheck();\n modal.onDismissFinished.emit(modal);\n modal.onAnyCloseEventFinished.emit(modal);\n }, modal.hideDelay);\n\n return true;\n }\n\n private _deleteModal(modalInstance: ModalInstance) {\n this.removeModal(modalInstance.id);\n\n if (!this.getModalStack().length) {\n modalInstance.modal.removeBodyClass();\n }\n }\n\n /**\n * Resolve content according to the types\n * @param content The modal content (string, templateRef or Component)\n */\n private _resolveNgContent<T>(content: Content<T>): any[][] | Text[][] {\n if (typeof content === 'string') {\n const element = this._document.createTextNode(content);\n return [[element]];\n }\n\n if (content instanceof TemplateRef) {\n const viewRef = content.createEmbeddedView(null as any);\n this.applicationRef.attachView(viewRef);\n return [viewRef.rootNodes];\n }\n\n return [];\n }\n\n /**\n * Close the latest opened modal if escape key event is emitted\n * @param event The Keyboard Event\n */\n private _escapeKeyboardEvent = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n try {\n const modal = this.getTopOpenedModal();\n\n if (!modal.escapable) {\n return false;\n }\n\n modal.onEscape.emit(modal);\n this.closeLatestModal();\n\n return true;\n } catch (e) {\n return false;\n }\n }\n\n return false;\n }\n\n /**\n * Is current platform browser\n */\n private get isBrowser(): boolean {\n return isPlatformBrowser(this._platformId);\n }\n\n /**\n * While modal is open, the focus stay on it\n * @param event The Keyboar dEvent\n */\n private _trapFocusModal = (event: KeyboardEvent) => {\n if (event.key === 'Tab') {\n try {\n const modal = this.getTopOpenedModal();\n\n if (!modal.nsmDialog.first.nativeElement.contains(document.activeElement)) {\n event.preventDefault();\n event.stopPropagation();\n modal.nsmDialog.first.nativeElement.focus();\n }\n\n return true;\n } catch (e) {\n return false;\n }\n }\n\n return false;\n }\n\n /**\n * Remove dynamically created modal from DOM\n */\n private _destroyModal(modal: NgxSmartModalComponent): void {\n // Prevent destruction of the inline modals\n if (modal.createFrom !== 'service') {\n return;\n }\n\n this._document.body.removeChild(modal.elementRef.nativeElement);\n }\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { NgxSmartModalComponent } from '../components/ngx-smart-modal.component';\nimport { NgxSmartModalService } from '../services/ngx-smart-modal.service';\nimport { NgxSmartModalStackService } from '../services/ngx-smart-modal-stack.service';\n\n@NgModule({\n declarations: [\n NgxSmartModalComponent\n ],\n imports: [\n CommonModule\n ],\n exports: [\n NgxSmartModalComponent\n ]\n})\nexport class NgxSmartModalModule {\n /**\n * Use in AppModule: new instance of NgxSmartModal.\n */\n public static forRoot(): ModuleWithProviders<NgxSmartModalModule> {\n return {\n ngModule: NgxSmartModalModule,\n providers: [\n NgxSmartModalService,\n NgxSmartModalStackService\n ]\n };\n }\n\n /**\n * Use in features modules with lazy loading: new instance of NgxSmartModal.\n */\n public static forChild(): ModuleWithProviders<NgxSmartModalModule> {\n return {\n ngModule: NgxSmartModalModule,\n providers: [\n NgxSmartModalService,\n NgxSmartModalStackService\n ]\n };\n }\n\n constructor(public service: NgxSmartModalService) { }\n}\n","/*\n * Public API Surface of ngx-smart-modal\n */\n\nexport * from './lib/services/ngx-smart-modal.service';\nexport * from './lib/components/ngx-smart-modal.component';\nexport * from './lib/modules/ngx-smart-modal.module';\nexport * from './lib/config/ngx-smart-modal.config';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.NgxSmartModalStackService","i1.NgxSmartModalService"],"mappings":";;;;;AAAa,MAAA,mBAAmB,GAAG;AAC/B,IAAA,aAAa,EAAE,aAAa;AAC5B,IAAA,WAAW,EAAE,kBAAkB;;;MC8DtB,sBAAsB,CAAA;IA8CjC,WACU,CAAA,SAAoB,EACpB,kBAAqC,EACrC,iBAAmC,EAC3B,UAAsB,EACZ,SAAmB,EAChB,WAAmB,EAAA;QALxC,IAAS,CAAA,SAAA,GAAT,SAAS,CAAW;QACpB,IAAkB,CAAA,kBAAA,GAAlB,kBAAkB,CAAmB;QACrC,IAAiB,CAAA,iBAAA,GAAjB,iBAAiB,CAAkB;QAC3B,IAAU,CAAA,UAAA,GAAV,UAAU,CAAY;QACZ,IAAS,CAAA,SAAA,GAAT,SAAS,CAAU;QAChB,IAAW,CAAA,WAAA,GAAX,WAAW,CAAQ;QAlDlC,IAAQ,CAAA,QAAA,GAAG,IAAI,CAAC;QAChB,IAAS,CAAA,SAAA,GAAG,IAAI,CAAC;QACjB,IAAW,CAAA,WAAA,GAAG,IAAI,CAAC;QACnB,IAAU,CAAA,UAAA,GAAG,EAAE,CAAC;QAChB,IAAW,CAAA,WAAA,GAAG,2BAA2B,CAAC;QAC1C,IAAO,CAAA,OAAA,GAAG,KAAK,CAAC;QAChB,IAAQ,CAAA,QAAA,GAAG,IAAI,CAAC;QAChB,IAAK,CAAA,KAAA,GAAG,IAAI,CAAC;QACb,IAAS,CAAA,SAAA,GAAG,GAAG,CAAC;QAChB,IAAS,CAAA,SAAA,GAAG,KAAK,CAAC;QAClB,IAAM,CAAA,MAAA,GAAG,EAAE,CAAC;QACZ,IAAS,CAAA,SAAA,GAAkB,IAAI,CAAC;QAChC,IAAc,CAAA,cAAA,GAAkB,IAAI,CAAC;QACrC,IAAe,CAAA,eAAA,GAAkB,IAAI,CAAC;QACtC,IAAO,CAAA,OAAA,GAAG,IAAI,CAAC;AAEd,QAAA,IAAA,CAAA,aAAa,GAA0B,IAAI,YAAY,EAAW,CAAC;AACnE,QAAA,IAAA,CAAA,OAAO,GAAsB,IAAI,YAAY,EAAE,CAAC;AAChD,QAAA,IAAA,CAAA,eAAe,GAAsB,IAAI,YAAY,EAAE,CAAC;AACxD,QAAA,IAAA,CAAA,SAAS,GAAsB,IAAI,YAAY,EAAE,CAAC;AAClD,QAAA,IAAA,CAAA,iBAAiB,GAAsB,IAAI,YAAY,EAAE,CAAC;AAC1D,QAAA,IAAA,CAAA,eAAe,GAAsB,IAAI,YAAY,EAAE,CAAC;AACxD,QAAA,IAAA,CAAA,uBAAuB,GAAsB,IAAI,YAAY,EAAE,CAAC;AAChE,QAAA,IAAA,CAAA,MAAM,GAAsB,IAAI,YAAY,EAAE,CAAC;AAC/C,QAAA,IAAA,CAAA,cAAc,GAAsB,IAAI,YAAY,EAAE,CAAC;AACvD,QAAA,IAAA,CAAA,QAAQ,GAAsB,IAAI,YAAY,EAAE,CAAC;AACjD,QAAA,IAAA,CAAA,WAAW,GAAsB,IAAI,YAAY,EAAE,CAAC;AACpD,QAAA,IAAA,CAAA,aAAa,GAAsB,IAAI,YAAY,EAAE,CAAC;QAGhE,IAAa,CAAA,aAAA,GAAG,IAAI,CAAC;QACrB,IAAc,CAAA,cAAA,GAAG,KAAK,CAAC;QACvB,IAAW,CAAA,WAAA,GAAG,KAAK,CAAC;QAEpB,IAAU,CAAA,UAAA,GAAG,MAAM,CAAC;KAiBtB;IAEE,QAAQ,GAAA;QACb,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;AAC/C,YAAA,MAAM,IAAI,KAAK,CAAC,4FAA4F,CAAC,CAAC;AAC/G,SAAA;AAED,QAAA,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;KAC3B;IAEM,kBAAkB,GAAA;QACvB,IACE,IAAI,CAAC,cAAc;AACnB,YAAA,IAAI,CAAC,gBAAgB;AACrB,YAAA,IAAI,CAAC,uBAAuB;AAC5B,YAAA,IAAI,CAAC,uBAAuB,CAAC,MAAM,KAAK,CAAC,EACzC;YACA,IAAI,CAAC,oBAAoB,EAAE,CAAC;AAC7B,SAAA;KACF;IAEM,WAAW,GAAA;AAChB,QAAA,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;KAC3B;AAED;;;;;AAKG;AACI,IAAA,IAAI,CAAC,GAAa,EAAA;QACvB,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;AAEtC,QAAA,OAAO,IAAI,CAAC;KACb;AAED;;;;AAIG;IACI,KAAK,GAAA;AACV,QAAA,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AAEzB,QAAA,OAAO,IAAI,CAAC;KACb;AAED;;;;;AAKG;AACI,IAAA,OAAO,CAAC,CAAa,EAAA;AAC1B,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAE,CAAC,EAAE,MAAkB,EAAE,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;AAC/E,YAAA,OAAO,IAAI,CAAC;AACb,SAAA;AAED,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;AAE3B,QAAA,OAAO,IAAI,CAAC;KACb;AAED;;;;;AAKG;AACI,IAAA,MAAM,CAAC,GAAa,EAAA;QACzB,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;AAExC,QAAA,OAAO,IAAI,CAAC;KACb;AAED;;;;;AAKG;AACI,IAAA,cAAc,CAAC,SAAiB,EAAA;AACrC,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;AAC5B,YAAA,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;AAC9B,SAAA;AAAM,aAAA;AACL,YAAA,IAAI,CAAC,WAAW,IAAI,GAAG,GAAG,SAAS,CAAC;AACrC,SAAA;AAED,QAAA,OAAO,IAAI,CAAC;KACb;AAED;;;;;AAKG;AACI,IAAA,iBAAiB,CAAC,SAAkB,EAAA;AACzC,QAAA,IAAI,SAAS,EAAE;AACb,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AACnE,SAAA;AAAM,aAAA;AACL,YAAA,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;AACvB,SAAA;AAED,QAAA,OAAO,IAAI,CAAC;KACb;AAED;;AAEG;IACI,SAAS,GAAA;QACd,OAAO,IAAI,CAAC,OAAO,CAAC;KACrB;AAED;;AAEG;IACI,OAAO,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC;KACjC;AAED;;;;;;AAMG;IACI,OAAO,CAAC,IAAa,EAAE,KAAe,EAAA;AAC3C,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,OAAO,EAAE,IAAI,KAAK,CAAC,EAAE;AAChD,YAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;AAClB,YAAA,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACxD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClC,IAAI,CAAC,YAAY,EAAE,CAAC;AACrB,SAAA;AAED,QAAA,OAAO,IAAI,CAAC;KACb;AAED;;AAEG;IACI,OAAO,GAAA;AACZ,QAAA,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC,KAAK,CAAC;KACnB;AAED;;;;AAIG;IACI,UAAU,GAAA;AACf,QAAA,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;AACvB,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,CAAC,YAAY,EAAE,CAAC;AAEpB,QAAA,OAAO,IAAI,CAAC;KACb;AAED;;;;AAIG;IACI,YAAY,GAAA;AACjB,QAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,mBAAmB,CAAC,aAAa,CAAC,CAAC;AAEhF,QAAA,OAAO,IAAI,CAAC;KACb;AAED;;;;AAIG;IACI,eAAe,GAAA;AACpB,QAAA,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,mBAAmB,CAAC,aAAa,CAAC,CAAC;AAEnF,QAAA,OAAO,IAAI,CAAC;KACb;IAEM,YAAY,GAAA;QACjB,IAAI;AACF,YAAA,IAAI,CAAC,kBAAkB,CAAC,aAAa,EAAE,CAAC;AACzC,SAAA;AAAC,QAAA,OAAO,CAAC,EAAE,eAAe;AAE3B,QAAA,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE,CAAC;KACxC;AAED;;AAEG;IAEI,eAAe,GAAA;AACpB,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;AACnH,YAAA,OAAO,KAAK,CAAC;AACd,SAAA;AACD,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEhE,IAAI,CAAC,aAAa,EAAE;AAClB,YAAA,OAAO,KAAK,CAAC;AACd,SAAA;AAED,QAAA,MAAM,iBAAiB,GAAG,aAAa,CAAC,qBAAqB,EAAE,CAAC;AAChE,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC;AAE7E,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC;AACnF,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC;AAEjF,QAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AAClG,QAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAEhG,IAAI,SAAS,GAAG,iBAAiB,CAAC,GAAG,GAAG,aAAa,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,iBAAiB,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;QACrH,IAAI,UAAU,GAAG,iBAAiB,CAAC,IAAI,GAAG,aAAa,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,GAAG,iBAAiB,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;AAEtH,QAAA,IAAI,UAAU,GAAG,aAAa,CAAC,IAAI,GAAG,cAAc,CAAC,KAAK,IAAI,UAAU,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAE;YAC9F,UAAU,GAAG,QAAQ,CAAC,KAAK,IAAI,aAAa,CAAC,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC;AAC9F,SAAA;AAAM,aAAA,IAAI,UAAU,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,EAAE;AAC9C,YAAA,UAAU,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC;AAClC,SAAA;AAED,QAAA,IAAI,SAAS,GAAG,aAAa,CAAC,GAAG,GAAG,cAAc,CAAC,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC,MAAM,EAAE;AACvF,YAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,aAAa,CAAC,GAAG,GAAG,cAAc,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;AACvF,SAAA;AAED,QAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,EAAE,CAAC,SAAS,GAAG,CAAC,GAAG,CAAC,GAAG,SAAS,IAAI,IAAI,CAAC,CAAC;AAC5G,QAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,aAAa,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC,CAAC;KACzF;IAEO,UAAU,CAAC,IAAY,EAAE,SAAmB,EAAA;AAClD,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;AACnB,YAAA,OAAO,KAAK,CAAC;AACd,SAAA;AAED,QAAA,MAAM,IAAI,GAAG;AACX,YAAA,SAAS,EAAE,SAAS;YACpB,QAAQ,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE;SAC/C,CAAC;AAEF,QAAA,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,mBAAmB,CAAC,WAAW,GAAG,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;AAExF,QAAA,OAAO,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;KACpC;AAED;;AAEG;AACH,IAAA,IAAY,SAAS,GAAA;AACnB,QAAA,OAAO,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;KAC5C;AAED;;AAEG;IACK,oBAAoB,GAAA;AAC1B,QAAA,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAC;AACrC,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,uBAAuB,CAAC,eAAe,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;AACzF,QAAA,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACxD,IAAI,CAAC,YAAY,EAAE,CAAC;KACrB;AAED;;AAEG;AACK,IAAA,8BAA8B,CAAC,YAAqC,EAAA;AAC1E,QAAA,IAAI,YAAY,EAAE;YAChB,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;AAClD,SAAA;KACF;AAED;;AAEG;AACK,IAAA,8BAA8B,CAAC,YAAqC,EAAA;AAC1E,QAAA,IAAI,YAAY,EAAE;YAChB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;AAClD,SAAA;KACF;+GA5UU,sBAAsB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,SAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAmDvB,QAAQ,EAAA,EAAA,EAAA,KAAA,EACR,WAAW,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;mGApDV,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,SAAA,EAAA,WAAA,EAAA,WAAA,EAAA,aAAA,EAAA,UAAA,EAAA,YAAA,EAAA,WAAA,EAAA,aAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,UAAA,EAAA,KAAA,EAAA,OAAA,EAAA,SAAA,EAAA,WAAA,EAAA,SAAA,EAAA,WAAA,EAAA,MAAA,EAAA,QAAA,EAAA,SAAA,EAAA,WAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,OAAA,EAAA,SAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,QAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,WAAA,EAAA,aAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,yBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EA4CI,gBAAgB,EAlF3C,EAAA,EAAA,YAAA,EAAA,YAAA,EAAA,SAAA,EAAA,CAAA,YAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,WAAA,EAAA,SAAA,EAAA,CAAA,WAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,YAAA,EAAA,SAAA,EAAA,CAAA,YAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCX,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;4FAIY,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAxClC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,EACjB,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCX,CAAA,EAAA,CAAA;;0BAuDI,MAAM;2BAAC,QAAQ,CAAA;;0BACf,MAAM;2BAAC,WAAW,CAAA;4CAlDL,QAAQ,EAAA,CAAA;sBAAvB,KAAK;gBACU,SAAS,EAAA,CAAA;sBAAxB,KAAK;gBACU,WAAW,EAAA,CAAA;sBAA1B,KAAK;gBACU,UAAU,EAAA,CAAA;sBAAzB,KAAK;gBACU,WAAW,EAAA,CAAA;sBAA1B,KAAK;gBACU,OAAO,EAAA,CAAA;sBAAtB,KAAK;gBACU,QAAQ,EAAA,CAAA;sBAAvB,KAAK;gBACU,KAAK,EAAA,CAAA;sBAApB,KAAK;gBACU,SAAS,EAAA,CAAA;sBAAxB,KAAK;gBACU,SAAS,EAAA,CAAA;sBAAxB,KAAK;gBACU,MAAM,EAAA,CAAA;sBAArB,KAAK;gBACU,SAAS,EAAA,CAAA;sBAAxB,KAAK;gBACU,cAAc,EAAA,CAAA;sBAA7B,KAAK;gBACU,eAAe,EAAA,CAAA;sBAA9B,KAAK;gBACU,OAAO,EAAA,CAAA;sBAAtB,KAAK;gBAEW,aAAa,EAAA,CAAA;sBAA7B,MAAM;gBACU,OAAO,EAAA,CAAA;sBAAvB,MAAM;gBACU,eAAe,EAAA,CAAA;sBAA/B,MAAM;gBACU,SAAS,EAAA,CAAA;sBAAzB,MAAM;gBACU,iBAAiB,EAAA,CAAA;sBAAjC,MAAM;gBACU,eAAe,EAAA,CAAA;sBAA/B,MAAM;gBACU,uBAAuB,EAAA,CAAA;sBAAvC,MAAM;gBACU,MAAM,EAAA,CAAA;sBAAtB,MAAM;gBACU,cAAc,EAAA,CAAA;sBAA9B,MAAM;gBACU,QAAQ,EAAA,CAAA;sBAAxB,MAAM;gBACU,WAAW,EAAA,CAAA;sBAA3B,MAAM;gBACU,aAAa,EAAA,CAAA;sBAA7B,MAAM;gBAY6B,UAAU,EAAA,CAAA;sBAA7C,YAAY;uBAAC,YAAY,CAAA;gBACQ,SAAS,EAAA,CAAA;sBAA1C,YAAY;uBAAC,WAAW,CAAA;gBACW,UAAU,EAAA,CAAA;sBAA7C,YAAY;uBAAC,YAAY,CAAA;gBACuC,uBAAuB,EAAA,CAAA;sBAAvF,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,gBAAgB,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAA;gBA4MhD,eAAe,EAAA,CAAA;sBADrB,YAAY;uBAAC,eAAe,CAAA;;;MCjTlB,yBAAyB,CAAA;AAGpC,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;KACvB;AAED;;;;;;;AAOG;IACI,QAAQ,CAAC,aAA4B,EAAE,KAAe,EAAA;AAC3D,QAAA,IAAI,KAAK,EAAE;YACT,MAAM,CAAC,GAAW,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAgB,KAAK,CAAC,CAAC,EAAE,KAAK,aAAa,CAAC,EAAE,CAAC,CAAC;AAC9F,YAAA,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE;gBACV,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC;AACjD,aAAA;AAAM,iBAAA;AACL,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AACtC,aAAA;YACD,OAAO;AACR,SAAA;AACD,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;KACtC;AAED;;;;AAIG;AACI,IAAA,QAAQ,CAAC,EAAU,EAAA;AACxB,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAgB,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAEnE,IAAI,CAAC,KAAK,SAAS,EAAE;YACnB,OAAO,CAAC,CAAC,KAAK,CAAC;AAChB,SAAA;AAAM,aAAA;AACL,YAAA,MAAM,IAAI,KAAK,CAAC,qCAAqC,EAAE,CAAA,CAAE,CAAC,CAAC;AAC5D,SAAA;KACF;AAED;;;;AAIG;IACI,aAAa,GAAA;QAClB,OAAO,IAAI,CAAC,WAAW,CAAC;KACzB;AAED;;;;AAIG;IACI,eAAe,GAAA;AACpB,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAgB,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;KACvE;AAED;;;;AAIG;IACI,iBAAiB,GAAA;AACtB,QAAA,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,EAAE;AAClC,YAAA,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;AACvC,SAAA;QAED,OAAO,IAAI,CAAC,eAAe,EAAE;aAC1B,GAAG,CAAC,CAAC,CAAgB,KAAK,CAAC,CAAC,KAAK,CAAC;AAClC,aAAA,MAAM,CAAC,CAAC,OAAO,EAAE,IAAI,KAAK,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,GAAG,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;KAC5H;AAED;;;;;;AAMG;IACI,cAAc,GAAA;QACnB,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;KAClF;AAED;;;;AAIG;IACI,kBAAkB,GAAA;AACvB,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;KAChC;AAED;;;;;;AAMG;AACI,IAAA,WAAW,CAAC,EAAU,EAAA;AAC3B,QAAA,MAAM,CAAC,GAAW,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAM,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACtE,IAAI,CAAC,GAAG,CAAC,EAAE;YACT,OAAO;AACR,SAAA;AAED,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACvD,QAAA,OAAO,aAAa,CAAC;KACtB;+GA/GU,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;mHAAzB,yBAAyB,EAAA,CAAA,CAAA,EAAA;;4FAAzB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBADrC,UAAU;;;MCOE,oBAAoB,CAAA;IAG/B,WACU,CAAA,OAAuB,EACvB,SAAmB,EACnB,WAAsC,EACtC,cAA8B,EACZ,SAAc,EACX,WAAgB,EAAA;QALrC,IAAO,CAAA,OAAA,GAAP,OAAO,CAAgB;QACvB,IAAS,CAAA,SAAA,GAAT,SAAS,CAAU;QACnB,IAAW,CAAA,WAAA,GAAX,WAAW,CAA2B;QACtC,IAAc,CAAA,cAAA,GAAd,cAAc,CAAgB;QACZ,IAAS,CAAA,SAAA,GAAT,SAAS,CAAK;QACX,IAAW,CAAA,WAAA,GAAX,WAAW,CAAK;AA8Z/C;;;AAGG;AACK,QAAA,IAAA,CAAA,oBAAoB,GAAG,CAAC,KAAoB,KAAI;AACtD,YAAA,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;gBAC1B,IAAI;AACF,oBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;AAEvC,oBAAA,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;AACpB,wBAAA,OAAO,KAAK,CAAC;AACd,qBAAA;AAED,oBAAA,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAC3B,IAAI,CAAC,gBAAgB,EAAE,CAAC;AAExB,oBAAA,OAAO,IAAI,CAAC;AACb,iBAAA;AAAC,gBAAA,OAAO,CAAC,EAAE;AACV,oBAAA,OAAO,KAAK,CAAC;AACd,iBAAA;AACF,aAAA;AAED,YAAA,OAAO,KAAK,CAAC;AACf,SAAC,CAAA;AASD;;;AAGG;AACK,QAAA,IAAA,CAAA,eAAe,GAAG,CAAC,KAAoB,KAAI;AACjD,YAAA,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,EAAE;gBACvB,IAAI;AACF,oBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,EAAE,CA