{"version":3,"file":"mo-breadcrumb-manager.mjs","sources":["../../../projects/mo-breadcrumb-manager/src/lib/services/breadcrumb.ts","../../../projects/mo-breadcrumb-manager/src/lib/mo-breadcrumb-manager.ts","../../../projects/mo-breadcrumb-manager/src/public-api.ts","../../../projects/mo-breadcrumb-manager/src/mo-breadcrumb-manager.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { BreadcrumbItem } from '../interfaces/breadcrumb.interface';\nimport { BehaviorSubject, filter, Observable } from 'rxjs';\nimport {\n  ActivatedRoute,\n  ActivatedRouteSnapshot,\n  NavigationEnd,\n  Router,\n} from '@angular/router';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class Breadcrumb {\n  private breadcrumbSubject = new BehaviorSubject<BreadcrumbItem[]>([]);\n  private pageTitleSubject = new BehaviorSubject<string>('');\n\n  constructor(private router: Router, private activatedRoute: ActivatedRoute) {\n    this.router.events\n      .pipe(filter((event) => event instanceof NavigationEnd))\n      .subscribe(() => {\n        this.updateBreadcrumbs();\n      });\n  }\n\n  get breadcrumbs$(): Observable<BreadcrumbItem[]> {\n    return this.breadcrumbSubject.asObservable();\n  }\n\n  get pageTitle$(): Observable<string> {\n    return this.pageTitleSubject.asObservable();\n  }\n\n  private updateBreadcrumbs(): void {\n    const breadcrumbs = this.getBreadcrumbItems();\n    const pageTitle = this.getPageTitle();\n\n    this.breadcrumbSubject.next(breadcrumbs);\n    this.pageTitleSubject.next(pageTitle);\n  }\n\n  private getPageTitle(): string {\n    let route = this.activatedRoute.snapshot;\n    while (route.firstChild) {\n      route = route.firstChild;\n    }\n    return route.data['title'] || '';\n  }\n\n  private getBreadcrumbItems(): BreadcrumbItem[] {\n    const breadcrumbItems: BreadcrumbItem[] = [];\n    let route: ActivatedRouteSnapshot | null = this.activatedRoute.snapshot;\n    let url = '';\n\n    while (route) {\n      if (route.url.length > 0) {\n        url += '/' + route.url.map((segment) => segment.path).join('/');\n      }\n\n      if (route.data['breadcrumb']) {\n        const label = route.data['breadcrumb'];\n        const shouldExclude = (label.match(/-/g) || []).length >= 3;\n\n        if (!shouldExclude) {\n          breadcrumbItems.push({\n            label: label,\n            url: url,\n            isClickable: true,\n          });\n        }\n      }\n\n      route = route.firstChild;\n    }\n\n    return breadcrumbItems;\n  }\n\n  navigateTo(item: BreadcrumbItem): void {\n    if (item.isClickable && item.url) {\n      this.router.navigate([item.url]);\n    }\n  }\n}\n","import { Component, OnDestroy, OnInit } from '@angular/core';\nimport { Subject, takeUntil } from 'rxjs';\nimport { BreadcrumbItem } from './interfaces/breadcrumb.interface';\nimport { Breadcrumb } from './services/breadcrumb';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n  selector: 'mo-breadcrumb-manager',\n  imports: [CommonModule],\n  template: `\n    <div class=\"flex flex-col gap-1\">\n      <nav class=\"flex flex-col\" aria-label=\"Breadcrumb\">\n        @if (pageTitle) {\n        <p class=\"text-sm md:text-xl font-bold my-2\">{{ pageTitle }}</p>\n        }\n        <ol\n          class=\"inline-flex items-center space-x-1 md:space-x-2 rtl:space-x-reverse\"\n        >\n          @for (item of breadcrumbItems; track $index; let first = $first; let\n          last = $last) {\n          <li class=\"inline-flex items-center text-xs\">\n            <span\n              class=\"inline-flex items-center transition-colors duration-200\"\n              [ngClass]=\"{\n                '!text-primary cursor-pointer hover:text-primary-dark':\n                  first && item.isClickable,\n                'text-gray-600 cursor-pointer hover:text-gray-800':\n                  !first && item.isClickable && !last,\n                'text-black font-semibold cursor-default':\n                  !item.isClickable || last\n              }\"\n              (click)=\"onBreadcrumbClick(item)\"\n            >\n              {{ item.label }}\n            </span>\n            @if (!last) {\n            <svg\n              class=\"rtl:rotate-180 w-2 h-2 text-gray-700 mx-1\"\n              aria-hidden=\"true\"\n              xmlns=\"http://www.w3.org/2000/svg\"\n              fill=\"none\"\n              viewBox=\"0 0 6 10\"\n            >\n              <path\n                stroke=\"currentColor\"\n                stroke-linecap=\"round\"\n                stroke-linejoin=\"round\"\n                stroke-width=\"2\"\n                d=\"m1 9 4-4-4-4\"\n              />\n            </svg>\n            }\n          </li>\n          }\n        </ol>\n      </nav>\n    </div>\n  `,\n  styles: ``,\n})\nexport class MoBreadcumbManager implements OnInit, OnDestroy {\n  breadcrumbItems: BreadcrumbItem[] = [];\n  pageTitle: string = '';\n  private destroy$ = new Subject<void>();\n\n  constructor(private breadcrumbService: Breadcrumb) {}\n\n  ngOnInit(): void {\n    this.breadcrumbService.breadcrumbs$\n      .pipe(takeUntil(this.destroy$))\n      .subscribe((items) => (this.breadcrumbItems = items));\n\n    this.breadcrumbService.pageTitle$\n      .pipe(takeUntil(this.destroy$))\n      .subscribe((title) => (this.pageTitle = title));\n  }\n\n  ngOnDestroy(): void {\n    this.destroy$.next();\n    this.destroy$.complete();\n  }\n\n  onBreadcrumbClick(item: BreadcrumbItem): void {\n    this.breadcrumbService.navigateTo(item);\n  }\n}\n","/*\n * Public API Surface of mo-breadcrumb-manager\n */\n\n/*\n * Public API Surface of ng-dynamic-breadcrumb\n */\n\nexport * from './lib/interfaces/breadcrumb.interface';\nexport * from './lib/services/breadcrumb';\nexport * from './lib/mo-breadcrumb-manager';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.Breadcrumb"],"mappings":"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"}