ez-nav
Version:
A responsive, configurable Angular navigation bar component with support for dropdown menus, mobile drawer toggles, and custom layouts. Easily integrate a dynamic navbar using a simple configuration object.
1 lines • 13.6 kB
Source Map (JSON)
{"version":3,"file":"ez-nav.mjs","sources":["../../../projects/ez-nav/src/lib/services/screen-size.service.ts","../../../projects/ez-nav/src/lib/components/nav-drawer/nav-drawer.component.ts","../../../projects/ez-nav/src/lib/components/nav-drawer/nav-drawer.component.html","../../../projects/ez-nav/src/lib/components/header/ez-nav.component.ts","../../../projects/ez-nav/src/lib/components/header/ez-nav.component.html","../../../projects/ez-nav/src/lib/ez-nav.module.ts","../../../projects/ez-nav/src/ez-nav.ts"],"sourcesContent":["import { Injectable, NgZone } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ScreenSizeService {\n\n private screenWidthSubject = new BehaviorSubject<string>(\"desktop\");\n screenWidth$ = this.screenWidthSubject.asObservable();\n\n constructor(private ngZone: NgZone) {\n // Listen to window resize in the service\n if( window.innerWidth <= 600 ){ this.screenWidthSubject.next( \"mobile\" ); }\n else if( window.innerWidth > 600 && window.innerWidth <= 1024 ){ this.screenWidthSubject.next( \"tablet\" ) }\n else if( window.innerWidth > 1024 ){ this.screenWidthSubject.next( \"desktop\" ) }\n this.listenToResize();\n }\n\n private listenToResize() {\n this.ngZone.runOutsideAngular(() => {\n window.addEventListener('resize', () => {\n this.ngZone.run(() => {\n if( window.innerWidth <= 600 ){ this.screenWidthSubject.next( \"mobile\" ); }\n else if( window.innerWidth > 600 && window.innerWidth <= 1024 ){ this.screenWidthSubject.next( \"tablet\" ) }\n else if( window.innerWidth > 1024 ){ this.screenWidthSubject.next( \"desktop\" ) }\n });\n });\n });\n\n }\n}\n","import { Component, EventEmitter, Input, Output, OnInit, OnDestroy } from '@angular/core';\nimport { Subscription } from 'rxjs';\n\nimport { NavItem, NavRow } from \"../../models/headerConfig\";\nimport { ScreenSizeService } from '../../services/screen-size.service';\nimport { CommonModule } from '@angular/common';\nimport { RouterLink } from '@angular/router';\n\n@Component({\n selector: 'ez-nav-nav-drawer',\n standalone: true,\n imports: [ CommonModule, RouterLink ],\n templateUrl: './nav-drawer.component.html'\n})\nexport class NavDrawerComponent implements OnInit, OnDestroy {\n @Input() navRow!: NavRow;\n @Output() drawerPosition: EventEmitter<boolean> = new EventEmitter<boolean>(false);\n public screenType: string | null = null;\n\n public isDrawerOpen: boolean = false;\n private screenSizeSubscription: Subscription | undefined;\n\n public subNavsOpen: boolean[] = [];\n\n constructor(private screenSizeService: ScreenSizeService) { // Corrected type\n }\n ngOnInit(): void {\n this.screenSizeSubscription = this.screenSizeService.screenWidth$.subscribe(screenType => {\n this.screenType = screenType;\n });\n this.subNavsOpen = this.navRow.items.map(item => !!item.subNav?.length && false);\n }\n toggleSubNav( index: number, event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n\n // Close all others, open the clicked one\n this.subNavsOpen = this.subNavsOpen.map((open, i) => i === index ? !open : false);\n\n }\n\n ngOnDestroy(): void {\n if (this.screenSizeSubscription) {\n this.screenSizeSubscription.unsubscribe();\n }\n }\n\n public updateDrawer(drawerPosition: boolean): void {\n this.isDrawerOpen = drawerPosition;\n this.drawerPosition.emit(drawerPosition);\n }\n}\n","\n<div class=\"row\">\n <ng-container *ngIf=\"screenType === 'desktop' || screenType === 'tablet'\">\n <ng-container *ngFor=\"let link of navRow.items; let i = index\">\n <div [ngClass]=\"link.gridClasses\" (click)=\"toggleSubNav(i, $event)\">\n <a [routerLink]=\"link.route\" [ngClass]=\"link.anchorTagClass\" class=\"d-flex align-items-center gap-1\">\n <span>{{ link.title }}</span>\n\n <!-- Subnav Icons -->\n <ng-container *ngIf=\"link.subNav?.length\">\n <i class=\"bi\"\n [ngClass]=\"subNavsOpen[i] ? link.subNavOpenClasses : link.subNavCloseClasses\"\n style=\"cursor: pointer;\">\n </i>\n </ng-container>\n </a>\n\n <div *ngIf=\"subNavsOpen[i]\" [ngClass]=\"link.dropDownParentClasses\">\n <ng-container *ngFor=\"let sub of link.subNav\">\n <div>\n <a\n [routerLink]=\"sub.route\"\n [ngClass]=\"sub.cssClasses\">\n {{ sub.title }}\n </a>\n </div>\n </ng-container>\n </div>\n\n </div>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"screenType==='mobile'\">\n <!--\n drawerIcon bi bi-filter-right\n drawerIcon bi bi-filter-left\n -->\n <i (click)=\"updateDrawer(true)\" *ngIf=\"!isDrawerOpen\" [ngClass]=\"navRow.drawerIconOpen\"></i>\n <i (click)=\"updateDrawer(false)\" *ngIf=\"isDrawerOpen\" [ngClass]=\"navRow.drawerIconClosed\"></i>\n </ng-container>\n </div>\n","import { Component, Input } from '@angular/core';\n\nimport { NavItem, HeaderConfig } from \"../../models/headerConfig\";\nimport { NavDrawerComponent } from '../nav-drawer/nav-drawer.component';\nimport { CommonModule } from '@angular/common';\nimport { RouterLink } from '@angular/router';\n\n@Component({\n selector: 'ez-nav',\n standalone: true,\n imports: [ CommonModule, RouterLink, NavDrawerComponent ],\n templateUrl: './ez-nav.component.html',\n})\nexport class EzNavComponent { // Added OnInit\n @Input() header!: HeaderConfig;\n public isDrawerOpen: boolean = false;\n\n public subNavsOpen: boolean[] = [];\n\n ngOnInit(){\n this.subNavsOpen = this.header.navRow.items.map(item =>\n !!(item.subNav && item.subNav.length > 0) ? false : false\n );\n }\n\n public toggleSubNav(index: number): void {\n this.subNavsOpen[index] = !this.subNavsOpen[index];\n }\n\n public handleDrawerStatus( status: boolean ){\n this.isDrawerOpen = status;\n }\n}\n","<div [ngClass]=\"header.wrappingClass\">\n <div class=\"row\">\n <div [ngClass]=\"header.parentRowLogoClasses\">\n <img [src]=\"header.logo.src\" [alt]=\"header.logo.alt\" [ngClass]=\"header.logo.imageClassNames\" />\n </div>\n <div [ngClass]=\"header.parentNavItemsClasses\">\n <ez-nav-nav-drawer (drawerPosition)=\"handleDrawerStatus($event)\" [navRow]=\"header.navRow\"></ez-nav-nav-drawer>\n </div>\n </div>\n <div *ngIf=\"isDrawerOpen\">\n <ng-container *ngFor=\"let link of header.navRow.items; let i = index\">\n <div class=\"col-md-12 col-sm-12\" (click)=\"toggleSubNav(i); $event.preventDefault(); $event.stopPropagation();\">\n <a [ngClass]=\"link.anchorTagClassMobile\" [routerLink]=\"link.route\">\n {{ link.title }}\n <ng-container *ngIf=\"link.subNav?.length\">\n <i\n class=\"bi\"\n [ngClass]=\"subNavsOpen[i] ? link.subNavOpenClasses : link.subNavCloseClasses\">\n </i>\n </ng-container>\n </a>\n </div>\n <ng-container *ngIf=\"subNavsOpen[i] && link.subNav?.length\">\n <div class=\"row\">\n <a *ngFor=\"let sub of link.subNav\" [routerLink]=\"sub.route\" [ngClass]=\"sub.cssClasses\">\n {{ sub.title }}\n </a>\n </div>\n </ng-container>\n </ng-container>\n </div>\n</div>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { EzNavComponent } from \"./components/header/ez-nav.component\"\nimport { NavDrawerComponent } from './components/nav-drawer/nav-drawer.component';\nimport { RouterModule } from '@angular/router';\n\n@NgModule({\n declarations: [],\n imports: [CommonModule, RouterModule,EzNavComponent, NavDrawerComponent],\n exports: [EzNavComponent, NavDrawerComponent]\n})\nexport class NavbarModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.ScreenSizeService","i1"],"mappings":"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"}