import { AfterContentInit, Directive, ElementRef, HostBinding, HostListener, Input, Renderer2 } from '@angular/core'; import { CollapseDirective } from '../../collapse'; @Directive({ selector: '[cNavbarToggler]', standalone: true }) export class NavbarTogglerDirective implements AfterContentInit { /** * Reference to navbar collapse element (via # template variable) . [docs] * @type string * @default 'button' */ @Input('cNavbarToggler') collapseRef?: CollapseDirective; @HostBinding('class.navbar-toggler') navbarToggler = true; /** * Default type for navbar-toggler. [docs] * @type string * @default 'button' */ @HostBinding('attr.type') @Input() type = 'button'; /** * Default aria-label attr for navbar-toggler. [docs] * @type string * @default 'Toggle navigation' */ @HostBinding('attr.aria-label') @Input() ariaLabel = 'Toggle navigation'; private hasContent!: boolean; constructor( private renderer: Renderer2, private hostElement: ElementRef ) { } @HostListener('click', ['$event']) handleClick() { this.collapseRef?.toggle(!this.collapseRef?.visible); } addDefaultIcon(): void { const span = this.renderer.createElement('span'); this.renderer.addClass(span, 'navbar-toggler-icon'); this.renderer.appendChild(this.hostElement.nativeElement, span); } ngAfterContentInit(): void { this.hasContent = this.hostElement.nativeElement.childNodes.length as boolean; if (!this.hasContent) { this.addDefaultIcon(); } } }