ngx-material-drawer
Version:
A dynamic, configurable Angular Material drawer with dashboard capabilities
1 lines • 90.6 kB
Source Map (JSON)
{"version":3,"file":"ngx-material-drawer.mjs","sources":["../../../projects/ngx-material-drawer/src/lib/app/utils/mat-event-emitter.service.ts","../../../projects/ngx-material-drawer/src/lib/app/utils/nav.service.ts","../../../projects/ngx-material-drawer/src/lib/app/utils/utils.service.ts","../../../projects/ngx-material-drawer/src/lib/app/directive/card.directive.ts","../../../projects/ngx-material-drawer/src/lib/app/card-holder/card-holder.component.ts","../../../projects/ngx-material-drawer/src/lib/app/card-holder/card-holder.component.html","../../../projects/ngx-material-drawer/src/lib/app/nav-list-item/nav-list-item.component.ts","../../../projects/ngx-material-drawer/src/lib/app/nav-list-item/nav-list-item.component.html","../../../projects/ngx-material-drawer/src/lib/app/menu-list-item/menu-list-item.component.ts","../../../projects/ngx-material-drawer/src/lib/app/menu-list-item/menu-list-item.component.html","../../../projects/ngx-material-drawer/src/lib/app/top-nav/top-nav.component.ts","../../../projects/ngx-material-drawer/src/lib/app/top-nav/top-nav.component.html","../../../projects/ngx-material-drawer/src/lib/app/nav-list-item-mini/nav-list-item-mini.component.ts","../../../projects/ngx-material-drawer/src/lib/app/nav-list-item-mini/nav-list-item-mini.component.html","../../../projects/ngx-material-drawer/src/lib/app/fab/fab.component.ts","../../../projects/ngx-material-drawer/src/lib/app/fab/fab.component.html","../../../projects/ngx-material-drawer/src/lib/app/material-drawer/material-drawer.component.ts","../../../projects/ngx-material-drawer/src/lib/app/material-drawer/material-drawer.component.html","../../../projects/ngx-material-drawer/src/lib/app/material.module.ts","../../../projects/ngx-material-drawer/src/lib/app/utils/breakpoint-observer.service.ts","../../../projects/ngx-material-drawer/src/lib/app/grid/grid.component.ts","../../../projects/ngx-material-drawer/src/lib/app/grid/grid.component.html","../../../projects/ngx-material-drawer/src/lib/app/matrial-drawer.module.ts","../../../projects/ngx-material-drawer/src/public_api.ts","../../../projects/ngx-material-drawer/src/ngx-material-drawer.ts"],"sourcesContent":["import { Injectable, EventEmitter, ElementRef } from \"@angular/core\";\nimport { Subject, ReplaySubject } from \"rxjs\";\n\n@Injectable({\n providedIn: \"root\",\n})\nexport class NgxMaterialDrawerEventEmitter {\n public onMatDrawerInit = new Subject();\n public onMatDrawerAfterViewInit = new Subject();\n public onNavStateChange = new Subject();\n public onDataChange = new ReplaySubject(1);\n public onGridDataChange = new ReplaySubject(1);\n public onSideNavOpen = new Subject();\n public onSideNavClosed = new Subject();\n public onMinVarientChange = new Subject();\n public onSideNavItemClick = new Subject();\n public onSideNavItemExpanded = new Subject();\n public onSideNavItemCollapsed = new Subject();\n public onMenuItemClick = new Subject();\n public onMenuItemExpanded = new Subject();\n public onMenuItemCollapsed = new Subject();\n public onSearchValueChange = new Subject();\n public onSerachFocusIn = new Subject();\n public onSerachFocusOut = new Subject();\n public onSerachInputOpen = new Subject();\n public onSerachInputClosed = new Subject();\n public onFabExpanded = new Subject();\n public onFabCollapsed = new Subject();\n public onMainFabButtonClick = new Subject();\n public onFabButtonClick = new Subject();\n\n constructor() {}\n\n /**\n * Material drawer Main component life cycle\n * @param event json\n */\n public matDrawerInit(event: any) {\n this.onMatDrawerInit.next(event);\n }\n\n /**\n * Material drawer Main component life cycle\n * @param event json\n */\n public matDrawerAfterViewInit(event: any) {\n this.onMatDrawerAfterViewInit.next(event);\n }\n\n /**\n * using on side nav toggle\n * @param event json\n */\n public navStateChange(event: any) {\n this.onNavStateChange.next(event);\n }\n\n /**\n * On Search value change\n * @param searchObject containing value and input search object\n */\n public searchValueChange(searchObject: {\n value: string;\n inputRef: ElementRef<any>;\n }): any {\n this.onSearchValueChange.next(searchObject);\n }\n\n /**\n * On Search focusin\n * @param searchObject containing value and input search object\n */\n public serachFocusIn(searchObject: {\n value: string;\n inputRef: ElementRef<any>;\n }): any {\n this.onSerachFocusIn.next(searchObject);\n }\n\n /**\n * On Search focusout\n * @param searchObject containing value and input search object\n */\n public serachFocusOut(searchObject: {\n value: string;\n inputRef: ElementRef<any>;\n }): any {\n this.onSerachFocusOut.next(searchObject);\n }\n\n /**\n * On Search focusout\n * @param searchObject containing value and input search object\n */\n public serachInputOpen(searchObject: {\n value: string;\n inputRef: ElementRef<any>;\n }): any {\n this.onSerachInputOpen.next(searchObject);\n }\n\n /**\n * On Search focusout\n * @param searchObject containing value and input search object\n */\n public serachInputClosed(searchObject: {\n value: string;\n inputRef: ElementRef<any>;\n }): any {\n this.onSerachInputClosed.next(searchObject);\n }\n\n /**\n * on data chamge\n * @param event new json\n */\n public dataChange(event: any) {\n this.onDataChange.next(event);\n }\n\n /**\n * on data chamge\n * @param event new json\n */\n public gridDataChange(event: any) {\n this.onGridDataChange.next(event);\n }\n\n /**\n * using on side nav open\n * @param event json\n */\n public sideNavOpen(event: any) {\n this.onSideNavOpen.next(event);\n }\n\n /**\n * using on side nav closed\n * @param event json\n */\n public sideNavClosed(event: any) {\n this.onSideNavClosed.next(event);\n }\n\n /**\n * Not using currently\n * @param event json\n */\n public minVarientChange(event: any) {\n this.onMinVarientChange.next(event);\n }\n\n /**\n * using in side nav item\n * @param event json\n */\n public sideNavItemClick(event: any) {\n this.onSideNavItemClick.next(event);\n }\n\n /**\n * using in side nav item\n * @param event json\n */\n public sideNavItemExpanded(event: any) {\n this.onSideNavItemExpanded.next(event);\n }\n\n /**\n * using in side nav item\n * @param event json\n */\n public sideNavItemCollapsed(event: any) {\n this.onSideNavItemCollapsed.next(event);\n }\n\n /**\n * using in toolbar menu\n * @param event json\n */\n public menuItemClick(event: any) {\n this.onMenuItemClick.next(event);\n }\n\n /**\n * using in toolbar menu\n * @param event json\n */\n public menuItemExpanded(event: any) {\n this.onMenuItemExpanded.next(event);\n }\n\n /**\n * using in toolbar menu\n * @param event json\n */\n public menuItemCollapsed(event: any) {\n this.onMenuItemCollapsed.next(event);\n }\n\n /**\n * using in toolbar menu\n * @param event json\n */\n public fabExpanded(event: any) {\n this.onFabExpanded.next(event);\n }\n\n /**\n * using in toolbar menu\n * @param event json\n */\n public fabCollapsed(event: any) {\n this.onFabCollapsed.next(event);\n }\n\n /**\n * using in toolbar menu\n * @param event json\n */\n public mainFabButtonClick(event: any) {\n this.onMainFabButtonClick.next(event);\n }\n\n /**\n * using in toolbar menu\n * @param event json\n */\n public fabButtonClick(event: any) {\n this.onFabButtonClick.next(event);\n }\n}\n","import { EventEmitter, Injectable } from \"@angular/core\";\nimport { BehaviorSubject } from \"rxjs\";\nimport { NgxMaterialDrawerEventEmitter } from \"./mat-event-emitter.service\";\n\n@Injectable({\n providedIn: \"root\",\n})\nexport class NgxNavService {\n public appDrawer: any;\n public isMiniVarient: any;\n public isOpened: boolean = false;\n public currentUrl = new BehaviorSubject<string>(\"\");\n public isDrawerOpened = false;\n\n constructor(public matEventEmitterService: NgxMaterialDrawerEventEmitter) {}\n\n public closeNav() {\n if (!this.isMiniVarient) {\n this.appDrawer.close();\n }\n this.isOpened = false;\n this.matEventEmitterService.sideNavClosed(this.getData(this.isOpened));\n }\n\n public openNav() {\n if (!this.isMiniVarient) {\n this.appDrawer.open();\n }\n this.isOpened = true;\n this.matEventEmitterService.sideNavOpen(this.getData(this.isOpened));\n }\n\n public toggleNav() {\n if (!this.isMiniVarient) {\n this.appDrawer.toggle();\n }\n this.isOpened = !this.isOpened;\n if (this.isOpened) {\n this.matEventEmitterService.sideNavOpen(this.getData(this.isOpened));\n } else {\n this.matEventEmitterService.sideNavClosed(this.getData(this.isOpened));\n }\n this.matEventEmitterService.navStateChange(this.getData(this.isOpened));\n }\n\n getData(b: any): object {\n return {\n drawer: this.appDrawer,\n isOpened: b,\n };\n }\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class NgxUtilsService {\n private instance: any;\n constructor() { }\n public get componentInstance(): any {\n return this.instance;\n }\n public set componentInstance(instance) {\n this.instance = { ...this.instance, ...instance };\n }\n\n public getExtendedData(card: any) {\n let compDetail = this.componentInstance[card.component];\n let detail = { ...card, ...compDetail };\n return detail;\n }\n}\n","import { Directive, ViewContainerRef } from '@angular/core';\n\n@Directive({\n selector: '[card-host]'\n})\nexport class CardDirective {\n constructor(public viewContainerRef: ViewContainerRef) { }\n}","import {\n Component,\n Input,\n OnInit,\n ViewChild,\n ComponentFactoryResolver,\n OnDestroy,\n} from \"@angular/core\";\nimport { CardDirective } from \"../directive/card.directive\";\nimport { INgxCard } from \"../interface\";\n\n@Component({\n selector: \"lib-card-holder\",\n templateUrl: \"./card-holder.component.html\",\n styleUrls: [\"./card-holder.component.scss\"],\n})\nexport class CardHolderComponent implements OnInit {\n @Input() cardData: any;\n @ViewChild(CardDirective, { static: true }) cardHost!: CardDirective;\n\n constructor(private componentFactoryResolver: ComponentFactoryResolver) {}\n\n ngOnInit() {\n this.cardHost && this.cardData && this.loadComponent();\n }\n\n ngAfterViewInit() {}\n\n loadComponent() {\n const componentFactory =\n this.componentFactoryResolver.resolveComponentFactory(\n this.cardData.component\n );\n\n const viewContainerRef = this.cardHost.viewContainerRef;\n viewContainerRef.clear();\n\n const componentRef = viewContainerRef.createComponent(componentFactory);\n (<INgxCard>componentRef.instance).data = this.cardData.data;\n }\n}\n","<div class=\"ngx-card-holder\">\n <ng-template card-host></ng-template>\n</div>","import {\n Component,\n HostBinding,\n Input,\n OnInit,\n AfterViewInit,\n Output,\n EventEmitter,\n} from \"@angular/core\";\nimport { NgxNavService } from \"../utils/nav.service\";\nimport {\n animate,\n state,\n style,\n transition,\n trigger,\n} from \"@angular/animations\";\nimport { NgxMaterialDrawerEventEmitter } from \"../utils/mat-event-emitter.service\";\nimport { NgxUtilsService } from \"../utils/utils.service\";\n\n@Component({\n selector: \"lib-nav-list-item\",\n templateUrl: \"./nav-list-item.component.html\",\n styleUrls: [\"./nav-list-item.component.scss\"],\n animations: [\n trigger(\"indicatorRotate\", [\n state(\"collapsed\", style({ transform: \"rotate(0deg)\" })),\n state(\"expanded\", style({ transform: \"rotate(180deg)\" })),\n transition(\n \"expanded <=> collapsed\",\n animate(\"225ms cubic-bezier(0.4,0.0,0.2,1)\")\n ),\n ]),\n ],\n})\nexport class NgxNavListItemComponent implements OnInit {\n expanded: boolean = false;\n @HostBinding(\"attr.aria-expanded\") ariaExpanded = this.expanded;\n @Input() item: any;\n @Input() depth: number = 0;\n\n constructor(\n public navService: NgxNavService,\n public matEventEmitterService: NgxMaterialDrawerEventEmitter,\n public ngxUtilsService: NgxUtilsService\n ) {\n if (this.depth === undefined) {\n this.depth = 0;\n }\n }\n\n ngOnInit() {\n this.navService.currentUrl.subscribe((url: string) => {\n if (this.item.route && url) {\n // console.log(`Checking '/${this.item.route}' against '${url}'`);\n this.expanded = url.indexOf(`/${this.item.route}`) === 0;\n this.ariaExpanded = this.expanded;\n // console.log(`${this.item.route} is expanded: ${this.expanded}`);\n }\n });\n }\n\n onItemSelected(item: any) {\n if (!item.children || !item.children.length) {\n if (item.onClickClose) {\n this.navService.closeNav();\n }\n this.matEventEmitterService.sideNavItemClick(item);\n }\n if (item.children && item.children.length) {\n this.expanded = !this.expanded;\n if (this.expanded) {\n this.matEventEmitterService.sideNavItemExpanded(item);\n } else {\n this.matEventEmitterService.sideNavItemCollapsed(item);\n }\n }\n }\n}\n","<a\n mat-list-item\n [style.padding-left]=\"(depth * 5) + 'px'\"\n [ngStyle]=\"item.style? item.style : ''\"\n (click)=\"onItemSelected(item)\"\n class=\"menu-list-item\"\n>\n <ng-container *ngIf=\"item.component; else elseBlock\">\n <lib-card-holder [cardData]=\"ngxUtilsService.getExtendedData(item.component)\"></lib-card-holder>\n </ng-container>\n <ng-template #elseBlock>\n <mat-icon class=\"routeIcon\">{{item.iconName}}</mat-icon>\n <span>{{item.displayName}}</span>\n <span\n fxFlex\n *ngIf=\"item.children && item.children.length\"\n >\n <span fxFlex></span>\n <mat-icon [@indicatorRotate]=\"expanded ? 'expanded': 'collapsed'\">expand_more</mat-icon>\n </span>\n </ng-template>\n\n\n\n</a>\n<div *ngIf=\"expanded\">\n <lib-nav-list-item\n *ngFor=\"let child of item.children\"\n [item]=\"child\"\n [depth]=\"depth+1\"\n >\n </lib-nav-list-item>\n</div>\n","import {\n Component,\n HostBinding,\n Input,\n OnInit,\n ViewChild,\n} from \"@angular/core\";\nimport { MatMenu } from \"@angular/material/menu\";\nimport { NgxMaterialDrawerEventEmitter } from \"../utils/mat-event-emitter.service\";\nimport { NgxNavService } from \"../utils/nav.service\";\nimport { NgxUtilsService } from \"../utils/utils.service\";\n\n@Component({\n selector: \"lib-menu-list-item\",\n templateUrl: \"./menu-list-item.component.html\",\n styleUrls: [\"./menu-list-item.component.scss\"],\n exportAs: \"menuInMenuListItemComponent\",\n})\nexport class NgxMenuListItemComponent implements OnInit {\n expanded: boolean = false;\n @HostBinding(\"attr.aria-expanded\") ariaExpanded = this.expanded;\n @ViewChild(\"childMenu\", { static: true }) public childMenu: any;\n @Input() menus: any;\n @Input() depth: number = 0;\n @Input() matMenu!: MatMenu;\n\n constructor(\n public navService: NgxNavService,\n public matEventEmitterService: NgxMaterialDrawerEventEmitter,\n public ngxUtilsService: NgxUtilsService\n ) {\n if (this.depth === undefined) {\n this.depth = 0;\n }\n }\n\n ngOnInit() {\n this.navService.currentUrl.subscribe((url: string) => {\n if (this.menus.route && url) {\n // console.log(`Checking '/${this.item.route}' against '${url}'`);\n this.expanded = url.indexOf(`/${this.menus.route}`) === 0;\n this.ariaExpanded = this.expanded;\n // console.log(`${this.item.route} is expanded: ${this.expanded}`);\n }\n });\n }\n\n onItemSelected(item: any) {\n if (!item.children || !item.children.length) {\n this.matEventEmitterService.menuItemClick(item);\n }\n if (item.children && item.children.length) {\n this.expanded = !this.expanded;\n if (this.expanded) {\n this.matEventEmitterService.menuItemExpanded(item);\n } else {\n this.matEventEmitterService.menuItemCollapsed(item);\n }\n }\n }\n}\n","<span class=\"toolbar-spacer\"></span>\n<mat-menu\n #childMenu=\"matMenu\"\n [overlapTrigger]=\"false\"\n>\n <span *ngFor=\"let item of menus\">\n <!-- Handle branch node menu items -->\n <span *ngIf=\"item.children && item.children.length > 0\">\n\n <button\n [ngStyle]=\"item.style? item.style : ''\"\n mat-menu-item\n color=\"primary\"\n [matMenuTriggerFor]=\"menu.childMenu\"\n >\n <mat-icon>{{item.iconName}}</mat-icon>\n <span>{{item.displayName}}</span>\n </button>\n <lib-menu-list-item\n #menu\n [menus]=\"item.children\"\n ></lib-menu-list-item>\n </span>\n <!-- Handle leaf node menu items -->\n <span *ngIf=\"!item.children || item.children.length === 0\">\n <button\n [ngStyle]=\"item.style? item.style : ''\"\n mat-menu-item\n (click)=\"onItemSelected(item)\"\n >\n <mat-icon>{{item.iconName}}</mat-icon>\n <span>{{item.displayName}}</span>\n </button>\n </span>\n </span>\n</mat-menu>\n","import { Component, OnInit, Input, ViewChild, ElementRef } from \"@angular/core\";\nimport { NgxNavService } from \"../utils/nav.service\";\nimport { NgxMaterialDrawerEventEmitter } from \"../utils/mat-event-emitter.service\";\nimport { trigger, style, animate, transition } from \"@angular/animations\";\nimport { NgxUtilsService } from \"../utils/utils.service\";\n\n@Component({\n selector: \"lib-top-nav\",\n templateUrl: \"./top-nav.component.html\",\n styleUrls: [\"./top-nav.component.scss\"],\n animations: [\n trigger(\"enterAnimation\", [\n transition(\":enter\", [\n style({ transform: \"translateX(100%)\", opacity: 0 }),\n animate(\"500ms\", style({ transform: \"translateX(0)\", opacity: 1 })),\n ]),\n transition(\":leave\", [\n style({ transform: \"translateX(0)\", opacity: 1 }),\n animate(\"500ms\", style({ transform: \"translateX(100%)\", opacity: 0 })),\n ]),\n ]),\n ],\n})\nexport class NgxTopNavComponent implements OnInit {\n @ViewChild(\"ngxSearchBox\", { static: false }) ngxSearchBox!: ElementRef;\n @Input() config: any;\n public isDrawerOpened: any;\n public isSearchActive: boolean = false;\n public searchValue: string = \"\";\n\n constructor(\n public matEventEmitterService: NgxMaterialDrawerEventEmitter,\n public navService: NgxNavService,\n public ngxUtilsService: NgxUtilsService\n ) {}\n\n ngOnInit() {}\n\n ngAfterViewInit() {\n this.matEventEmitterService.onNavStateChange.subscribe((flag: any) => {\n this.isDrawerOpened = flag.isOpened;\n });\n this.matEventEmitterService.onSideNavClosed.subscribe((flag: any) => {\n this.isDrawerOpened = flag.isOpened;\n });\n this.matEventEmitterService.onSideNavClosed.subscribe((flag: any) => {\n this.isDrawerOpened = flag.isOpened;\n });\n }\n\n public onItemSelected(item: any) {\n if (!item.children || !item.children.length) {\n this.matEventEmitterService.menuItemClick(item);\n }\n }\n\n public toggleSearchBar() {\n this.isSearchActive = !this.isSearchActive;\n let searchObject = {\n value: this.searchValue,\n inputRef: this.ngxSearchBox,\n };\n if (this.isSearchActive) {\n this.matEventEmitterService.serachInputOpen(searchObject);\n } else {\n this.matEventEmitterService.serachInputClosed(searchObject);\n }\n }\n\n public onSearchValueChange(event: any) {\n let searchObject = {\n value: this.searchValue,\n inputRef: this.ngxSearchBox,\n };\n this.matEventEmitterService.searchValueChange(searchObject);\n }\n\n public onSerachFocusIn(event: any) {\n let searchObject = {\n value: this.searchValue,\n inputRef: this.ngxSearchBox,\n };\n this.matEventEmitterService.serachFocusIn(searchObject);\n }\n\n public onSerachFocusOut(event: any) {\n let searchObject = {\n value: this.searchValue,\n inputRef: this.ngxSearchBox,\n };\n this.matEventEmitterService.serachFocusOut(searchObject);\n }\n}\n","<mat-toolbar\n color=\"primary\"\n class=\"mat-elevation-z1 ngx-material-toolbar\"\n>\n <ng-container *ngIf=\"!isSearchActive\">\n <!-- DrawerToggle menu -->\n <button\n class=\"btn-toggle\"\n mat-icon-button\n id=\"menu\"\n (click)=\"navService.toggleNav()\"\n >\n <!-- <mat-icon>{{config?.toggleIcon ? config.toggleIcon : 'menu'}}</mat-icon> -->\n <div\n class=\"wrapper-menu\"\n *ngIf=\"!config?.toggleIcon\"\n [ngClass]=\"isDrawerOpened ? 'open' : 'close'\"\n >\n <div class=\"line-menu half start\"></div>\n <div class=\"line-menu\"></div>\n <div class=\"line-menu half end\"></div>\n </div>\n <ng-container *ngIf=\"config?.toggleIcon\">\n <mat-icon>\n {{!isDrawerOpened ? config.toggleIcon : config?.closedToggleIcon ? config?.closedToggleIcon : 'close'}}\n </mat-icon>\n </ng-container>\n </button>\n <span>\n {{config?.appName ? config.appName : 'Default name'}}\n </span>\n <!-- Right Menu -->\n <span class=\"toolbar-spacer\"></span>\n <div\n class=\"right-nav\"\n [ngStyle]=\"config?.rightMenus?.style? config?.rightMenus.style : ''\"\n >\n <button\n *ngIf=\"config?.search?.isEnable\"\n mat-button\n mat-icon-button\n (click)=\"toggleSearchBar()\"\n >\n <mat-icon>search</mat-icon>\n </button>\n <ng-container *ngIf=\"config?.rightMenus?.data\">\n <span *ngFor=\"let item of config?.rightMenus?.data\">\n <!-- Handle branch node buttons here -->\n <span *ngIf=\"item.children && item.children.length > 0\">\n <ng-container *ngIf=\"item.component; else elseBlock\">\n <lib-card-holder\n [matMenuTriggerFor]=\"menu.childMenu\"\n [cardData]=\"ngxUtilsService.getExtendedData(item.component)\"\n ></lib-card-holder>\n </ng-container>\n <ng-template #elseBlock>\n <button\n *ngIf=\"item.displayName?.trim()\"\n [ngStyle]=\"item?.style? item.style : ''\"\n mat-button\n [matMenuTriggerFor]=\"menu.childMenu\"\n [disabled]=\"item.disabled\"\n >\n <mat-icon>{{item.iconName}}</mat-icon>\n <span>{{item.displayName}}</span>\n </button>\n <button\n *ngIf=\"!item?.displayName?.trim()\"\n [ngStyle]=\"item?.style? item.style : ''\"\n mat-icon-button\n [matMenuTriggerFor]=\"menu.childMenu\"\n [disabled]=\"item.disabled\"\n >\n <mat-icon>{{item.iconName}}</mat-icon>\n </button>\n </ng-template>\n <lib-menu-list-item\n #menu\n [menus]=\"item.children\"\n ></lib-menu-list-item>\n </span>\n <!-- Leaf node buttons here -->\n <span *ngIf=\"!item.children || item.children.length === 0\">\n <ng-container *ngIf=\"item.component; else elseBlock\">\n <lib-card-holder [cardData]=\"ngxUtilsService.getExtendedData(item.component)\"></lib-card-holder>\n </ng-container>\n <ng-template #elseBlock>\n <button\n *ngIf=\"item.displayName?.trim()\"\n [ngStyle]=\"item?.style? item.style : ''\"\n mat-button\n (click)=\"onItemSelected(item)\"\n [disabled]=\"item.disabled\"\n >\n <mat-icon>{{item.iconName}}</mat-icon>\n <span>{{item.displayName}}</span>\n </button>\n <button\n *ngIf=\"!item?.displayName?.trim()\"\n [ngStyle]=\"item?.style? item.style : ''\"\n mat-icon-button\n (click)=\"onItemSelected(item)\"\n [disabled]=\"item.disabled\"\n >\n <mat-icon>{{item.iconName}}</mat-icon>\n </button>\n </ng-template>\n </span>\n </span>\n </ng-container>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isSearchActive\">\n <div\n class=\"searchBarMain\"\n [ngStyle]=\"config?.search?.style ? config?.search?.style : ''\"\n [@enterAnimation]\n >\n <i\n (click)=\"toggleSearchBar()\"\n class=\"material-icons searchBarSearchIcon\"\n >\n {{config?.search?.backIcon ? config?.search?.backIcon : 'arrow_back'}}\n </i>\n <input\n type=\"text\"\n #ngxSearchBox\n name=\"header-search\"\n [(ngModel)]=\"searchValue\"\n class=\"searchBarInput\"\n (input)=\"onSearchValueChange($event)\"\n (focus)=\"onSerachFocusIn($event)\"\n (focusout)=\"onSerachFocusOut($event)\"\n [placeholder]=\"config?.search?.placeHolder ? config?.search?.placeHolder : 'Search, discover, explore...'\"\n >\n <i\n *ngIf=\"searchValue.length\"\n (click)=\"searchValue = ''\"\n class=\"material-icons clearSearchBarField\"\n >\n {{config?.search?.clearIcon ? config?.search?.clearIcon : 'clear'}}\n </i>\n </div>\n </ng-container>\n</mat-toolbar>\n","import {\n Component,\n HostBinding,\n Input,\n OnInit,\n AfterViewInit,\n} from \"@angular/core\";\n\nimport { NgxNavService } from \"../utils/nav.service\";\nimport {\n animate,\n state,\n style,\n transition,\n trigger,\n} from \"@angular/animations\";\nimport { NgxMaterialDrawerEventEmitter } from \"../utils/mat-event-emitter.service\";\n\n@Component({\n selector: \"lib-nav-list-item-mini\",\n templateUrl: \"./nav-list-item-mini.component.html\",\n styleUrls: [\"./nav-list-item-mini.component.scss\"],\n animations: [\n trigger(\"indicatorRotate\", [\n state(\"collapsed\", style({ transform: \"rotate(0deg)\" })),\n state(\"expanded\", style({ transform: \"rotate(180deg)\" })),\n transition(\n \"expanded <=> collapsed\",\n animate(\"225ms cubic-bezier(0.4,0.0,0.2,1)\")\n ),\n ]),\n ],\n})\nexport class NgxNavListItemMiniComponent implements OnInit {\n expanded: boolean = false;\n @HostBinding(\"attr.aria-expanded\") ariaExpanded = this.expanded;\n @Input() item: any;\n @Input() depth: number = 0;\n\n constructor(\n public navService: NgxNavService,\n public matEventEmitterService: NgxMaterialDrawerEventEmitter\n ) {\n if (this.depth === undefined) {\n this.depth = 0;\n }\n }\n\n ngOnInit() {\n this.navService.currentUrl.subscribe((url: string) => {\n if (this.item.route && url) {\n // console.log(`Checking '/${this.item.route}' against '${url}'`);\n this.expanded = url.indexOf(`/${this.item.route}`) === 0;\n this.ariaExpanded = this.expanded;\n // console.log(`${this.item.route} is expanded: ${this.expanded}`);\n }\n });\n }\n\n onItemSelected(item: any) {\n if (!item.children || !item.children.length) {\n if (item.onClickClose) {\n this.navService.closeNav();\n }\n this.matEventEmitterService.sideNavItemClick(item);\n }\n if (item.children && item.children.length) {\n this.expanded = !this.expanded;\n if (this.expanded) {\n this.matEventEmitterService.sideNavItemExpanded(item);\n } else {\n this.matEventEmitterService.sideNavItemCollapsed(item);\n }\n }\n }\n}\n","<a\n mat-list-item\n *ngIf=\"item\"\n [ngStyle]=\"item?.style? item?.style : ''\"\n (click)=\"onItemSelected(item)\"\n class=\"menu-list-item\"\n>\n <mat-icon class=\"routeIcon\">{{item.iconName}}</mat-icon>\n</a>\n<div *ngIf=\"expanded\">\n <lib-nav-list-item-mini\n *ngFor=\"let child of item.children\"\n [item]=\"child\"\n [depth]=\"depth+1\"\n >\n </lib-nav-list-item-mini>\n</div>\n","import {\n Component,\n HostBinding,\n Input,\n OnInit,\n ViewChild,\n} from \"@angular/core\";\nimport { NgxNavService } from \"../utils/nav.service\";\nimport {\n animate,\n state,\n style,\n transition,\n trigger,\n} from \"@angular/animations\";\nimport { MatMenu } from \"@angular/material/menu\";\nimport { NgxMaterialDrawerEventEmitter } from \"../utils/mat-event-emitter.service\";\n\n@Component({\n selector: \"lib-fab\",\n templateUrl: \"./fab.component.html\",\n styleUrls: [\"./fab.component.scss\"],\n animations: [\n trigger(\"slideInOut\", [\n transition(\":enter\", [\n style({ transform: \"translateY(100%)\" }),\n animate(\"200ms ease-in\", style({ transform: \"translateY(0%)\" })),\n ]),\n transition(\":leave\", [\n animate(\"200ms ease-in\", style({ transform: \"translateY(100%)\" })),\n ]),\n ]),\n ],\n})\nexport class NgxFabComponent implements OnInit {\n public expanded: boolean = false;\n @Input() fabData: any;\n\n constructor(\n public navService: NgxNavService,\n public matEventEmitterService: NgxMaterialDrawerEventEmitter\n ) {}\n\n ngOnInit() {}\n\n onFabClick(item: any) {\n this.matEventEmitterService.fabButtonClick(item);\n }\n\n onMainFabClick(item: any) {\n this.expanded = !this.expanded;\n if (\n this.fabData &&\n this.fabData.children &&\n this.fabData.children.length &&\n this.fabData.children.filter((f: any) => f.isEnable).length\n ) {\n if (this.expanded) {\n this.matEventEmitterService.fabExpanded(item);\n } else {\n this.matEventEmitterService.fabCollapsed(item);\n }\n } else {\n this.matEventEmitterService.mainFabButtonClick(item);\n }\n }\n}\n","<div\n class=\"ngx-material-fab\"\n *ngIf=\"fabData?.isEnable\"\n>\n <div\n class=\"ngx-material-mini-fab\"\n *ngIf=\"expanded\"\n [@slideInOut]\n >\n <ng-container *ngFor=\"let item of fabData?.children\">\n <button\n *ngIf=\"item?.isEnable\"\n [ngStyle]=\"item?.style? item?.style : ''\"\n mat-mini-fab\n [matTooltip]=\"item?.tooltip\"\n class=\"mini-fab\"\n (click)=\"onFabClick(item)\"\n >\n <mat-icon>{{item?.icon}}</mat-icon>\n </button>\n </ng-container>\n </div>\n <button\n mat-fab\n [matTooltip]=\"fabData?.tooltip\"\n *ngIf=\"fabData?.isEnable\"\n [ngStyle]=\"fabData?.style? fabData?.style : ''\"\n (click)=\"onMainFabClick(fabData)\"\n >\n <mat-icon>{{fabData?.icon}}</mat-icon>\n </button>\n</div>\n","import {\n Component,\n ViewChild,\n ElementRef,\n AfterViewInit,\n EventEmitter,\n Input,\n Output,\n OnInit,\n} from \"@angular/core\";\nimport { VERSION } from \"@angular/material/core\";\nimport { NgxNavService } from \"../utils/nav.service\";\nimport { NgxMaterialDrawerEventEmitter } from \"../utils/mat-event-emitter.service\";\nimport { NgxUtilsService } from \"../utils/utils.service\";\n\n@Component({\n selector: \"ngx-material-drawer\",\n templateUrl: \"./material-drawer.component.html\",\n styleUrls: [\"./material-drawer.component.scss\"],\n})\nexport class NgxMaterialDrawerComponent implements AfterViewInit, OnInit {\n @ViewChild(\"appDrawer\", { static: false }) appDrawer!: ElementRef;\n\n @Input(\"data\") navData: any;\n @Input(\"componentInstance\") componentInstance: any;\n\n @Output() public onMatDrawerInit: any = new EventEmitter();\n @Output() public onMatDrawerAfterViewInit: any = new EventEmitter();\n @Output() public onNavStateChange: any = new EventEmitter();\n @Output() public onDataChange: any = new EventEmitter();\n @Output() public onSideNavOpen: any = new EventEmitter();\n @Output() public onSideNavClosed: any = new EventEmitter();\n @Output() public onMinVarientChange: any = new EventEmitter();\n @Output() public onSideNavItemClick: any = new EventEmitter();\n @Output() public onSideNavItemExpanded: any = new EventEmitter();\n @Output() public onSideNavItemCollapsed: any = new EventEmitter();\n @Output() public onMenuItemClick: any = new EventEmitter();\n @Output() public onSerachValueChange: any = new EventEmitter();\n @Output() public onSerachFocusIn: any = new EventEmitter();\n @Output() public onSerachFocusOut: any = new EventEmitter();\n @Output() public onSerachInputOpen: any = new EventEmitter();\n @Output() public onSerachInputClosed: any = new EventEmitter();\n @Output() public onFabExpanded: any = new EventEmitter();\n @Output() public onFabCollapsed: any = new EventEmitter();\n @Output() public onMainFabButtonClick: any = new EventEmitter();\n @Output() public onFabButtonClick: any = new EventEmitter();\n\n //Material drawer version\n public version = VERSION;\n\n constructor(\n public navService: NgxNavService,\n public matEventEmitterService: NgxMaterialDrawerEventEmitter,\n public ngxUtilsService: NgxUtilsService\n ) {\n this.subscribeToEventEmitter();\n }\n\n public ngOnInit() {\n this.ngxUtilsService.componentInstance = this.componentInstance;\n this.matEventEmitterService.dataChange(this.navData);\n this.matEventEmitterService.onDataChange.subscribe((res) => {\n this.navData = res;\n this.navService.isMiniVarient = this.navData[\"miniVarient\"];\n this.navService.isOpened = this.navData[\"opened\"];\n });\n this.matEventEmitterService.matDrawerInit(this.navData);\n }\n\n public ngAfterViewInit() {\n this.navService.appDrawer = this.appDrawer;\n this.matEventEmitterService.matDrawerAfterViewInit(this.navData);\n }\n\n private subscribeToEventEmitter() {\n this.matEventEmitterService.onMatDrawerInit.subscribe((event) => {\n this.onMatDrawerInit.emit(event);\n });\n this.matEventEmitterService.onMatDrawerAfterViewInit.subscribe((event) => {\n this.onMatDrawerAfterViewInit.emit(event);\n });\n this.matEventEmitterService.onNavStateChange.subscribe((event) => {\n this.onNavStateChange.emit(event);\n });\n this.matEventEmitterService.onDataChange.subscribe((event) => {\n this.onDataChange.emit(event);\n });\n this.matEventEmitterService.onSideNavOpen.subscribe((event) => {\n this.onSideNavOpen.emit(event);\n });\n this.matEventEmitterService.onSideNavClosed.subscribe((event) => {\n this.onSideNavClosed.emit(event);\n });\n this.matEventEmitterService.onMinVarientChange.subscribe((event) => {\n this.onMinVarientChange.emit(event);\n });\n this.matEventEmitterService.onSideNavItemClick.subscribe((event) => {\n this.onSideNavItemClick.emit(event);\n });\n this.matEventEmitterService.onSideNavItemExpanded.subscribe((event) => {\n this.onSideNavItemExpanded.emit(event);\n });\n this.matEventEmitterService.onSideNavItemCollapsed.subscribe((event) => {\n this.onSideNavItemCollapsed.emit(event);\n });\n this.matEventEmitterService.onMenuItemClick.subscribe((event) => {\n this.onMenuItemClick.emit(event);\n });\n this.matEventEmitterService.onSearchValueChange.subscribe((event) => {\n this.onSerachValueChange.emit(event);\n });\n this.matEventEmitterService.onSerachFocusIn.subscribe((event) => {\n this.onSerachFocusIn.emit(event);\n });\n this.matEventEmitterService.onSerachFocusOut.subscribe((event) => {\n this.onSerachFocusOut.emit(event);\n });\n this.matEventEmitterService.onFabExpanded.subscribe((event) => {\n this.onFabExpanded.emit(event);\n });\n this.matEventEmitterService.onFabCollapsed.subscribe((event) => {\n this.onFabCollapsed.emit(event);\n });\n this.matEventEmitterService.onMainFabButtonClick.subscribe((event) => {\n this.onMainFabButtonClick.emit(event);\n });\n this.matEventEmitterService.onFabButtonClick.subscribe((event) => {\n this.onFabButtonClick.emit(event);\n });\n\n this.matEventEmitterService.onSerachInputOpen.subscribe((event) => {\n this.onSerachInputOpen.emit(event);\n });\n\n this.matEventEmitterService.onSerachInputClosed.subscribe((event) => {\n this.onSerachInputClosed.emit(event);\n });\n }\n}\n","<lib-top-nav\n [config]=\"navData\"\n class=\"fixed-topnav\"\n></lib-top-nav>\n<!-- <lib-top-nav [config]=\"navData?\" class=\"fixed-topnav\"></lib-top-nav> -->\n<mat-sidenav-container\n [hasBackdrop]=\"navData?.hasBackdrop\"\n autosize\n>\n <mat-sidenav\n [ngClass]=\"navData?.miniVarient && !navService?.isOpened? 'mini-drawer': ''\"\n [ngStyle]=\"navData?.navItems?.style? navData?.navItems.style : ''\"\n [position]=\"navData?.position\"\n #appDrawer\n [mode]=\"navData?.mode\"\n [opened]=\"navData?.miniVarient ? 'open' : navData?.opened\"\n >\n <mat-nav-list *ngIf=\"!navData?.miniVarient || navData?.miniVarient && navService?.isOpened\">\n <lib-nav-list-item\n *ngFor=\"let item of navData?.navItems?.data\"\n [item]=\"item\"\n ></lib-nav-list-item>\n </mat-nav-list>\n <mat-nav-list *ngIf=\"navData?.miniVarient && !navService?.isOpened\">\n <lib-nav-list-item-mini\n *ngFor=\"let item of navData?.navItems?.data\"\n [item]=\"item\"\n ></lib-nav-list-item-mini>\n </mat-nav-list>\n </mat-sidenav>\n <div [ngClass]=\"navData?.miniVarient ? 'main-container-on-mini-variant' :''\">\n <ng-content></ng-content>\n </div>\n</mat-sidenav-container>\n\n\n<!-- Fab Buttons -->\n<lib-fab [fabData]=\"navData?.fabs\"></lib-fab>\n","import { NgModule } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatRippleModule } from '@angular/material/core';\nimport { MatGridListModule } from '@angular/material/grid-list';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatListModule } from '@angular/material/list';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatSidenavModule } from '@angular/material/sidenav';\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\n/**\n * NgModule that includes all Material modules that are required.\n */\n@NgModule({\n exports: [\n MatButtonModule,\n MatIconModule,\n MatListModule,\n MatMenuModule,\n MatRippleModule,\n MatSidenavModule,\n MatToolbarModule,\n MatTooltipModule,\n MatGridListModule,\n MatCardModule\n ],\n declarations: []\n })\n export class MaterialModule { }","import { Injectable } from \"@angular/core\";\nimport { fromEvent, Observable } from \"rxjs\";\nimport {\n startWith,\n map,\n distinctUntilChanged,\n shareReplay,\n} from \"rxjs/operators\";\nexport const POINTS_NAME = [\"xl\", \"lg\", \"md\", \"sm\", \"xs\"];\nconst QUERY: Map<string, string> = new Map([\n [POINTS_NAME[0], \"(min-width: 1200px)\"],\n [POINTS_NAME[1], \"(min-width: 992px)\"],\n [POINTS_NAME[2], \"(min-width: 768px)\"],\n [POINTS_NAME[3], \"(min-width: 576px)\"],\n [POINTS_NAME[4], \"(min-width: 0px)\"],\n]);\n\n@Injectable({\n providedIn: \"root\",\n})\nexport class BreakpointObserverService {\n private _size$: Observable<string>;\n\n constructor() {\n this._size$ = fromEvent(window, \"resize\").pipe(\n startWith(this._getScreenSize()),\n map(() => this._getScreenSize()),\n distinctUntilChanged(),\n shareReplay(1)\n );\n }\n\n public get size$(): Observable<string> {\n return this._size$;\n }\n\n private _getScreenSize(): string {\n const [[newSize = \"never\"]] = Array.from(QUERY.entries()).filter(\n ([size, mediaQuery]) => window.matchMedia(mediaQuery).matches\n );\n return newSize;\n }\n}\n","import {\n Component,\n Input,\n OnInit,\n ViewChild,\n ComponentFactoryResolver,\n OnDestroy,\n EventEmitter,\n Output,\n} from \"@angular/core\";\nimport {\n BreakpointObserverService,\n POINTS_NAME,\n} from \"../utils/breakpoint-observer.service\";\nimport { Observable } from \"rxjs\";\nimport { NgxMaterialDrawerEventEmitter } from \"../utils/mat-event-emitter.service\";\nimport { NgxUtilsService } from \"../utils/utils.service\";\n\n@Component({\n selector: \"ngx-material-grid\",\n templateUrl: \"./grid.component.html\",\n styleUrls: [\"./grid.component.scss\"],\n})\nexport class NgxGridComponent implements OnInit {\n @Input(\"gridData\") inputData: any;\n @Input(\"componentInstance\") componentInstance: any;\n @Output() public onGridDataChange: any = new EventEmitter();\n public gridData: any;\n public size: any;\n public size$!: Observable<string>;\n\n constructor(\n private _breakpointObserverService: BreakpointObserverService,\n public matEventEmitterService: NgxMaterialDrawerEventEmitter,\n public ngxUtilsService: NgxUtilsService\n ) {\n this.matEventEmitterService.onGridDataChange.subscribe((event: any) => {\n if (event) {\n this.refreshGrid(event[\"grids\"], this.size);\n } else if (this.inputData[\"grid\"]) {\n this.gridData = this.inputData.grid;\n }\n });\n }\n\n ngOnInit() {\n if (this.inputData && typeof this.inputData == \"object\") {\n if (this.inputData[\"grids\"]) {\n this.registerBreakPoints(this.inputData[\"grids\"]);\n } else if (this.inputData[\"grid\"]) {\n this.gridData = this.inputData.grid;\n }\n }\n this.ngxUtilsService.componentInstance = this.componentInstance;\n }\n\n registerBreakPoints(grids: any) {\n this.size$ = this._breakpointObserverService.size$;\n this.size$.subscribe((size) => {\n this.size = size;\n this.refreshGrid(grids, size);\n });\n }\n\n refreshGrid(grids: any, size: any) {\n if (grids[size] && grids[size][\"grid\"]) {\n this.gridData = grids[size][\"grid\"];\n } else {\n let gData;\n let index = POINTS_NAME.indexOf(size);\n while (!gData && index > 0) {\n index--;\n gData = grids[POINTS_NAME[index]] && grids[POINTS_NAME[index]][\"grid\"];\n }\n index = POINTS_NAME.indexOf(size);\n while (!gData && index < POINTS_NAME.length - 1) {\n index++;\n gData = grids[POINTS_NAME[index]] && grids[POINTS_NAME[index]][\"grid\"];\n }\n this.gridData = gData || [];\n }\n }\n}\n","<div class=\"grid-container\">\n <mat-grid-list\n [cols]=\"gridData?.cols || inputData?.cols || 4\"\n [rowHeight]=\"gridData?.rowHeight || inputData?.rowHeight || '200px'\"\n [gutterSize]=\"gridData?.gutterSize || inputData?.gutterSize || '0px'\"\n >\n <mat-grid-tile\n *ngFor=\"let card of gridData\"\n [colspan]=\"card.cols\"\n [rowspan]=\"card.rows\"\n >\n <lib-card-holder [cardData]='ngxUtilsService.getExtendedData(card)'></lib-card-holder>\n </mat-grid-tile>\n </mat-grid-list>\n</div>\n","import { BrowserModule } from '@angular/platform-browser';\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\nimport { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FlexLayoutModule } from '@angular/flex-layout';\nimport { NgxNavListItemComponent as NgxNavListItemComponent } from './nav-list-item/nav-list-item.component';\nimport { NgxNavService } from './utils/nav.service';\nimport { NgxTopNavComponent } from './top-nav/top-nav.component';\nimport { NgxMenuListItemComponent } from './menu-list-item/menu-list-item.component';\nimport { NgxMaterialDrawerComponent } from './material-drawer/material-drawer.component';\nimport { NgxNavListItemMiniComponent } from './nav-list-item-mini/nav-list-item-mini.component';\nimport { MaterialModule } from './material.module';\nimport { FormsModule } from '@angular/forms';\nimport { NgxFabComponent } from './fab/fab.component';\nimport { NgxGridComponent } from './grid/grid.component';\nimport { CardHolderComponent } from './card-holder/card-holder.component';\nimport { CardDirective } from './directive/card.directive';\n\n@NgModule({\n imports: [\n BrowserModule,\n CommonModule,\n MaterialModule,\n BrowserAnimationsModule,\n FlexLayoutModule,\n FormsModule\n ],\n declarations: [\n NgxNavListItemComponent,\n NgxMenuListItemComponent,\n NgxMaterialDrawerComponent,\n NgxTopNavComponent,\n NgxNavListItemMiniComponent,\n NgxFabComponent,\n NgxGridComponent,\n CardHolderComponent,\n CardDirective\n ],\n bootstrap: [NgxMaterialDrawerComponent],\n providers: [NgxNavService],\n exports:[NgxMaterialDrawerComponent,NgxGridComponent]\n})\nexport class NgxMaterialDrawerModule { }","/*\n * Public API Surface of ngx-material-drawer\n */\n\nexport * from \"./lib/app/material-drawer/material-drawer.component\";\nexport * from \"./lib/app/matrial-drawer.module\";\nexport * from \"./lib/app/utils/mat-event-emitter.service\";\nexport * from \"./lib/app/grid/grid.component\";\nexport * from \"./lib/app/card-holder/card-holder.component\";\nexport * from \"./lib/app/fab/fab.component\";\nexport * from \"./lib/app/menu-list-item/menu-list-item.component\";\nexport * from \"./lib/app/nav-list-item/nav-list-item.component\";\nexport * from \"./lib/app/nav-list-item-mini/nav-list-item-mini.component\";\nexport * from \"./lib/app/top-nav/top-nav.component\";\nexport * from \"./lib/app/utils/nav.service\";\nexport * from \"./lib/app/utils/breakpoint-observer.service\";\nexport * from \"./lib/app/utils/utils.service\";\nexport * from \"./lib/app/interface\";\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i1.NgxMaterialDrawerEventEmitter","i1.CardDirective","i1.NgxNavService","i2.NgxMaterialDrawerEventEmitter","i3.NgxUtilsService","i6","i8","i9.CardHolderComponent","i7","i2.NgxNavService","i5","i9","i11.NgxMenuListItemComponent","i12.CardHolderComponent","i3","i4","i8.NgxNavListItemComponent","i9.NgxTopNavComponent","i10.NgxNavListItemMiniComponent","i11.NgxFabComponent","i1.BreakpointObserverService","i6.CardHolderComponent"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAMa,6BAA6B,CAAA;AAyBxC,IAAA,WAAA,GAAA;AAxBO,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,OAAO,EAAE;AAC/B,QAAA,IAAA,CAAA,wBAAwB,GAAG,IAAI,OAAO,EAAE;AACxC,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,OAAO,EAAE;AAChC,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,aAAa,CAAC,CAAC,CAAC;AACnC,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,aAAa,CAAC,CAAC,CAAC;AACvC,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,OAAO,EAAE;AAC7B,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,OAAO,EAAE;AAC/B,QAAA,IAAA,CAAA,kBAAkB,GAAG,IAAI,OAAO,EAAE;AAClC,QAAA,IAAA,CAAA,kBAAkB,GAAG,IAAI,OAAO,EAAE;AAClC,QAAA,IAAA,CAAA,qBAAqB,GAAG,IAAI,OAAO,EAAE;AACrC,QAAA,IAAA,CAAA,sBAAsB,GAAG,IAAI,OAAO,EAAE;AACtC,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,OAAO,EAAE;AAC/B,QAAA,IAAA,CAAA,kBAAkB,GAAG,IAAI,OAAO,EAAE;AAClC,QAAA,IAAA,CAAA,mBAAmB,GAAG,IAAI,OAAO,EAAE;AACnC,QAAA,IAAA,CAAA,mBAAmB,GAAG,IAAI,OAAO,EAAE;AACnC,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,OAAO,EAAE;AAC/B,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,OAAO,EAAE;AAChC,QAAA,IAAA,CAAA,iBAAiB,GAAG,IAAI,OAAO,EAAE;AACjC,QAAA,IAAA,CAAA,mBAAmB,GAAG,IAAI,OAAO,EAAE;AACnC,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,OAAO,EAAE;AAC7B,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,OAAO,EAAE;AAC9B,QAAA,IAAA,CAAA,oBAAoB,GAAG,IAAI,OAAO,EAAE;AACpC,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,OAAO,EAAE;IAExB;AAEf;;;AAGG;AACI,IAAA,aAAa,CAAC,KAAU,EAAA;AAC7B,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;IAClC;AAEA;;;AAGG;AACI,IAAA,sBAAsB,CAAC,KAAU,EAAA;AACtC,QAAA,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC;IAC3C;AAEA;;;AAGG;AACI,IAAA,cAAc,CAAC,KAAU,EAAA;AAC9B,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;IACnC;AAEA;;;AAGG;AACI,IAAA,iBAAiB,CAAC,YAGxB,EAAA;AACC,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,YAAY,CAAC;IAC7C;AAEA;;;AAGG;AACI,IAAA,aAAa,CAAC,YAGpB,EAAA;AACC,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CA