@mintplayer/ng-bootstrap 21.23.1 → 21.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -8,8 +8,10 @@ import { Color } from '@mintplayer/ng-bootstrap';
8
8
  import { SlideUpDownAnimation } from '@mintplayer/ng-animations';
9
9
  import { ClickOutsideDirective } from '@mintplayer/ng-click-outside';
10
10
  import { BsHasOverlayComponent } from '@mintplayer/ng-bootstrap/has-overlay';
11
- import { Router } from '@angular/router';
11
+ import { Router, NavigationEnd } from '@angular/router';
12
12
  import { DomPortal } from '@angular/cdk/portal';
13
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
14
+ import { filter } from 'rxjs/operators';
13
15
 
14
16
  class BsNavbarComponent {
15
17
  constructor() {
@@ -460,6 +462,58 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.11", ngImpo
460
462
  }]
461
463
  }], ctorParameters: () => [], propDecorators: { navbar: [{ type: i0.Input, args: [{ isSignal: true, alias: "bsNavbarContent", required: false }] }] } });
462
464
 
465
+ /**
466
+ * Marks a navbar dropdown trigger anchor. Replaces both `routerLink` and
467
+ * `routerLinkActive` on a trigger element: toggles the active CSS class when a
468
+ * sub-route under the bound URL is active, but does NOT navigate on click
469
+ * (which `routerLink` would do via its own host listener, even when other
470
+ * click handlers `preventDefault`).
471
+ *
472
+ * @example
473
+ * ```html
474
+ * <a bsNavbarTrigger="/overlays">Overlays</a>
475
+ * ```
476
+ *
477
+ * Items inside the dropdown panel still use real `[routerLink]`s for
478
+ * navigation. Use this directive only for the trigger anchor that opens the
479
+ * dropdown panel.
480
+ */
481
+ class BsNavbarTriggerDirective {
482
+ constructor() {
483
+ this.router = inject(Router);
484
+ this.bsNavbarTrigger = input.required(...(ngDevMode ? [{ debugName: "bsNavbarTrigger" }] : /* istanbul ignore next */ []));
485
+ this.currentUrl = signal(this.router.url, ...(ngDevMode ? [{ debugName: "currentUrl" }] : /* istanbul ignore next */ []));
486
+ this.targetUrl = computed(() => {
487
+ const v = this.bsNavbarTrigger();
488
+ if (Array.isArray(v)) {
489
+ // join with '/', collapse double slashes; ensure leading slash
490
+ const joined = v.join('/').replace(/\/+/g, '/');
491
+ return joined.startsWith('/') ? joined : '/' + joined;
492
+ }
493
+ return v;
494
+ }, ...(ngDevMode ? [{ debugName: "targetUrl" }] : /* istanbul ignore next */ []));
495
+ this.isActive = computed(() => {
496
+ const url = this.currentUrl();
497
+ const target = this.targetUrl();
498
+ return url === target || url.startsWith(target + '/');
499
+ }, ...(ngDevMode ? [{ debugName: "isActive" }] : /* istanbul ignore next */ []));
500
+ this.router.events.pipe(filter(ev => ev instanceof NavigationEnd), takeUntilDestroyed()).subscribe(() => this.currentUrl.set(this.router.url));
501
+ }
502
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: BsNavbarTriggerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
503
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.11", type: BsNavbarTriggerDirective, isStandalone: true, selector: "[bsNavbarTrigger]", inputs: { bsNavbarTrigger: { classPropertyName: "bsNavbarTrigger", publicName: "bsNavbarTrigger", isSignal: true, isRequired: true, transformFunction: null } }, host: { attributes: { "href": "javascript:void(0)" }, listeners: { "click": "$event.preventDefault()" }, properties: { "class.active": "isActive()" } }, ngImport: i0 }); }
504
+ }
505
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: BsNavbarTriggerDirective, decorators: [{
506
+ type: Directive,
507
+ args: [{
508
+ selector: '[bsNavbarTrigger]',
509
+ host: {
510
+ 'href': 'javascript:void(0)',
511
+ '[class.active]': 'isActive()',
512
+ '(click)': '$event.preventDefault()',
513
+ },
514
+ }]
515
+ }], ctorParameters: () => [], propDecorators: { bsNavbarTrigger: [{ type: i0.Input, args: [{ isSignal: true, alias: "bsNavbarTrigger", required: true }] }] } });
516
+
463
517
  class BsExpandButtonDirective {
464
518
  constructor() {
465
519
  const navbar = inject(BsNavbarComponent);
@@ -539,5 +593,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.11", ngImpo
539
593
  * Generated bundle index. Do not edit.
540
594
  */
541
595
 
542
- export { BsExpandButtonContext, BsExpandButtonDirective, BsNavbarBrandComponent, BsNavbarComponent, BsNavbarContentDirective, BsNavbarDropdownComponent, BsNavbarItemComponent, BsNavbarNavComponent, DropdownToggleDirective, NavLinkDirective };
596
+ export { BsExpandButtonContext, BsExpandButtonDirective, BsNavbarBrandComponent, BsNavbarComponent, BsNavbarContentDirective, BsNavbarDropdownComponent, BsNavbarItemComponent, BsNavbarNavComponent, BsNavbarTriggerDirective, DropdownToggleDirective, NavLinkDirective };
543
597
  //# sourceMappingURL=mintplayer-ng-bootstrap-navbar.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"mintplayer-ng-bootstrap-navbar.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar/navbar.component.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar/navbar.component.html","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-brand/navbar-brand.component.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-brand/navbar-brand.component.html","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-nav/navbar-nav.component.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-nav/navbar-nav.component.html","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-item/navbar-item.component.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-item/navbar-item.component.html","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-dropdown/navbar-dropdown.component.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-dropdown/navbar-dropdown.component.html","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-content/navbar-content.directive.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/expand-button/expand-button.directive.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/dropdown-toggle/dropdown-toggle.directive.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/nav-link/nav-link.directive.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/mintplayer-ng-bootstrap-navbar.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, ElementRef, input, signal, TemplateRef, viewChild } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { BsContainerComponent } from '@mintplayer/ng-bootstrap/container';\nimport { BsUserAgentDirective } from '@mintplayer/ng-bootstrap/user-agent';\nimport { BsNoNoscriptDirective } from '@mintplayer/ng-bootstrap/no-noscript';\nimport { Breakpoint, Color } from '@mintplayer/ng-bootstrap';\n\n@Component({\n selector: 'bs-navbar',\n templateUrl: './navbar.component.html',\n styleUrls: ['./navbar.component.scss'],\n imports: [NgTemplateOutlet, BsContainerComponent, BsUserAgentDirective, BsNoNoscriptDirective],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '(window:resize)': 'onWindowResize()',\n },\n})\nexport class BsNavbarComponent {\n\n private resizeTimeout: ReturnType<typeof setTimeout> | null = null;\n\n constructor() {\n this.onWindowResize();\n }\n\n onWindowResize() {\n this.isResizing.set(true);\n if (typeof window !== 'undefined') {\n this.windowWidth.set(window.innerWidth);\n }\n\n // Clear any existing timeout to debounce\n if (this.resizeTimeout) {\n clearTimeout(this.resizeTimeout);\n }\n\n // Reset isResizing after debounce period\n this.resizeTimeout = setTimeout(() => {\n this.isResizing.set(false);\n }, 300);\n }\n\n readonly nav = viewChild.required<ElementRef>('nav');\n autoclose = input(true);\n\n expandButtonTemplate = signal<TemplateRef<any> | null>(null);\n\n isExpanded = signal<boolean>(false);\n windowWidth = signal<number | null>(null);\n isResizing = signal<boolean>(false);\n\n color = input<Color | null>(null);\n breakpoint = input<Breakpoint | null>('md');\n\n expandAt = computed(() => {\n const breakpoint = this.breakpoint();\n switch (breakpoint) {\n case 'xxl': return 1400;\n case 'xl': return 1200;\n case 'lg': return 992;\n case 'md': return 768;\n case 'sm': return 576;\n case 'xs': return 0;\n default: return null;\n }\n });\n\n isSmallMode = computed(() => {\n const expandAt = this.expandAt();\n const windowWidth = this.windowWidth();\n if (windowWidth === null) {\n return true;\n } else if (!expandAt) {\n return true;\n } else if (windowWidth >= expandAt) {\n return false;\n } else {\n return true;\n }\n });\n\n expandClass = computed(() => {\n const breakpoint = this.breakpoint();\n if (breakpoint === null) {\n return null;\n } else {\n return `navbar-expand-${breakpoint}`;\n }\n });\n\n wAutoClass = computed(() => {\n const breakpoint = this.breakpoint();\n if (breakpoint === null) {\n return null;\n } else {\n return `w-${breakpoint}-auto`;\n }\n });\n\n dNoneClass = computed(() => {\n const breakpoint = this.breakpoint();\n if (breakpoint === null) {\n return null;\n } else {\n return `d-${breakpoint}-none`;\n }\n });\n\n backgroundColorClass = computed(() => {\n const color = this.color();\n switch (color) {\n case Color.light:\n case null:\n return ['navbar-light'];\n default:\n return ['navbar-dark', `bg-${Color[color]}`];\n }\n });\n\n navClassList = computed(() => {\n const expandClass = this.expandClass();\n const backgroundColorClass = this.backgroundColorClass();\n const result: string[] = [];\n return result.concat(expandClass ?? [], ...backgroundColorClass);\n });\n\n toggleExpanded() {\n this.isExpanded.update(v => !v);\n }\n}\n","<bs-container>\n <nav #nav class=\"navbar position-fixed\" [class]=\"navClassList()\" bsUserAgent bsNoNoscript aria-label=\"Main navigation\">\n <div class=\"container-fluid nav-wrapper\">\n <div class=\"d-flex w-100\" [class]=\"wAutoClass()\">\n <ng-content select=\"bs-navbar-brand\"></ng-content>\n <div class=\"flex-end d-flex tw\" [class]=\"dNoneClass()\">\n <button (click)=\"toggleExpanded()\"\n class=\"align-self-center\"\n [class.navbar-toggler]=\"!expandButtonTemplate()\"\n [class.bg-transparent]=\"expandButtonTemplate()\"\n [class.shadow-none]=\"expandButtonTemplate()\"\n [class.border-0]=\"expandButtonTemplate()\"\n type=\"button\"\n aria-label=\"Toggle navigation\"\n [attr.aria-expanded]=\"isExpanded()\"\n aria-controls=\"navbar-collapse\">\n <ng-container *ngTemplateOutlet=\"expandButtonTemplate() ?? defaultExpandButton; context: { $implicit: isExpanded() }\"></ng-container>\n </button>\n </div>\n </div>\n <ng-content></ng-content>\n </div>\n </nav>\n</bs-container>\n\n<ng-template #defaultExpandButton>\n <span class=\"navbar-toggler-icon\" aria-hidden=\"true\"></span>\n</ng-template>\n","import { AfterContentChecked, Component, ElementRef, inject, input, ChangeDetectionStrategy} from '@angular/core';\n\n@Component({\n selector: 'bs-navbar-brand',\n templateUrl: './navbar-brand.component.html',\n styleUrls: ['./navbar-brand.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class.mx-auto]': 'true',\n },\n})\nexport class BsNavbarBrandComponent implements AfterContentChecked {\n private element = inject(ElementRef);\n readonly routerLink = input<any[]>([]);\n\n ngAfterContentChecked() {\n const anchor = this.element.nativeElement.querySelector('a');\n if (anchor) {\n anchor.classList.add('nav-link');\n }\n }\n}\n","<span class=\"navbar-brand mx-auto mx-md-unset\">\n <ng-content></ng-content>\n</span>","import { ChangeDetectionStrategy, Component, computed, inject, input, signal } from '@angular/core';\nimport { SlideUpDownAnimation } from '@mintplayer/ng-animations';\nimport { BsNavbarComponent } from '../navbar/navbar.component';\n\n@Component({\n selector: 'bs-navbar-nav',\n templateUrl: './navbar-nav.component.html',\n styleUrls: ['./navbar-nav.component.scss'],\n animations: [SlideUpDownAnimation],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '(window:resize)': 'onWindowResize()',\n },\n})\nexport class BsNavbarNavComponent {\n\n bsNavbar = inject(BsNavbarComponent);\n\n windowWidth = signal<number | null>(null);\n isResizing = signal<boolean>(false);\n collapse = input<boolean>(true);\n\n private resizeTimeout: ReturnType<typeof setTimeout> | null = null;\n\n showNavs = computed(() => {\n const isExpanded = this.bsNavbar.isExpanded();\n const expandAt = this.bsNavbar.expandAt();\n const windowWidth = this.windowWidth();\n\n if (windowWidth === null) {\n return false;\n } else if (expandAt === null) {\n return isExpanded;\n } else if (windowWidth >= expandAt) {\n return true;\n } else {\n return isExpanded;\n }\n });\n\n constructor() {\n this.onWindowResize();\n }\n\n onWindowResize() {\n this.isResizing.set(true);\n if (typeof window !== 'undefined') {\n this.windowWidth.set(window.innerWidth);\n }\n\n // Clear any existing timeout to debounce\n if (this.resizeTimeout) {\n clearTimeout(this.resizeTimeout);\n }\n\n // Reset isResizing after debounce period\n this.resizeTimeout = setTimeout(() => {\n this.isResizing.set(false);\n }, 300);\n }\n}\n","<div class=\"navbar-collapse w-100 show\" [class.collapse]=\"collapse()\" [@slideUpDown]=\"showNavs()\" [@.disabled]=\"isResizing()\">\n <ul class=\"navbar-nav mr-auto\">\n <ng-content></ng-content>\n </ul>\n</div>\n","import { AfterContentChecked, AfterContentInit, ChangeDetectionStrategy, Component, computed, contentChildren, DestroyRef, effect, ElementRef, forwardRef, inject, PLATFORM_ID } from '@angular/core';\nimport { isPlatformServer } from '@angular/common';\nimport { Router } from '@angular/router';\nimport { BsNavbarComponent } from '../navbar/navbar.component';\nimport { BsNavbarDropdownComponent } from '../navbar-dropdown/navbar-dropdown.component';\n\n/** Duration of the navbar collapse animation in milliseconds */\nconst NAVBAR_ANIMATION_DURATION = 300;\n\n@Component({\n selector: 'bs-navbar-item',\n templateUrl: './navbar-item.component.html',\n styleUrls: ['./navbar-item.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BsNavbarItemComponent implements AfterContentInit, AfterContentChecked {\n\n private navbar = inject(BsNavbarComponent);\n element = inject(ElementRef);\n private destroy = inject(DestroyRef);\n private platformId = inject(PLATFORM_ID);\n private router = inject(Router);\n parentDropdown = inject(forwardRef(() => BsNavbarDropdownComponent), { optional: true });\n\n readonly hasDropdown = computed(() => this.dropdowns().length > 0);\n anchorTag: HTMLAnchorElement | null = null;\n readonly dropdowns = contentChildren<BsNavbarDropdownComponent>(forwardRef(() => BsNavbarDropdownComponent));\n\n constructor() {\n // Effect handles future isSmallMode changes after content is initialized\n effect(() => {\n const isSmallMode = this.navbar.isSmallMode();\n this.dropdowns().forEach((dropdown) => {\n dropdown.showInOverlay = !isSmallMode;\n });\n });\n }\n\n ngAfterContentInit() {\n // Set initial showInOverlay state after content children are resolved\n // This is needed because the effect runs before @ContentChildren is populated\n const isSmallMode = this.navbar.isSmallMode();\n this.dropdowns().forEach((dropdown) => {\n dropdown.showInOverlay = !isSmallMode;\n });\n }\n\n ngAfterContentChecked() {\n this.anchorTag = this.element.nativeElement.querySelector('li a');\n\n // Add nav-link or dropdown-item class (previously done by NavLinkDirective)\n if (this.anchorTag && !this.anchorTag.getAttribute('nav-link-class-added')) {\n if (this.parentDropdown === null) {\n this.anchorTag.classList.add('nav-link');\n } else {\n this.anchorTag.classList.add('dropdown-item');\n }\n this.anchorTag.classList.add('cursor-pointer');\n this.anchorTag.setAttribute('nav-link-class-added', 'true');\n }\n\n if (this.hasDropdown()) {\n if (this.anchorTag) {\n this.anchorTag.classList.add('dropdown-toggle');\n\n if (isPlatformServer(this.platformId)) {\n this.anchorTag.href = 'javascript:;';\n }\n\n if (!this.anchorTag.getAttribute('close-init-b')) {\n this.anchorTag.setAttribute('close-init-b', '1');\n this.anchorTag.addEventListener('click', (ev: MouseEvent) => {\n ev.preventDefault();\n this.dropdowns().forEach((dropdown) => {\n const newVisible = !dropdown.isVisible();\n dropdown.isVisible.set(newVisible);\n if (!newVisible) {\n dropdown.childDropdowns().forEach((child) => child.isVisible.set(false));\n }\n });\n return false;\n });\n }\n }\n } else {\n\n if ((this.dropdowns().length === 0) && this.anchorTag && !this.anchorTag.getAttribute('close-init-a')) {\n this.anchorTag.setAttribute('close-init-a', '1');\n this.anchorTag.addEventListener('click', (ev: MouseEvent) => {\n let d = this.parentDropdown;\n while (d && d.autoclose()) {\n d.isVisible.set(false);\n d = d.parentDropdown;\n }\n if (this.navbar.autoclose()) {\n // Get the fragment from the link's href\n const href = this.anchorTag?.getAttribute('href') ?? '';\n const fragmentMatch = href.match(/#(.+)$/);\n const fragment = fragmentMatch ? fragmentMatch[1] : null;\n\n // Always collapse the navbar\n this.navbar.isExpanded.set(false);\n\n // If in small mode with a fragment, prevent default navigation and\n // navigate after the collapse animation completes to avoid double scroll\n if (this.navbar.isSmallMode() && fragment) {\n ev.preventDefault();\n\n // After the collapse animation completes, navigate to the anchor\n // This ensures correct scroll position since navbar height is stable\n setTimeout(() => {\n this.router.navigateByUrl(href);\n }, NAVBAR_ANIMATION_DURATION);\n }\n }\n });\n }\n\n }\n }\n}\n","<li [class.nav-item]=\"parentDropdown === null\" [class.dropdown]=\"(dropdowns().length > 0) && (parentDropdown === null)\" [class.dropend]=\"(dropdowns().length > 0) && (parentDropdown !== null)\">\n <ng-content></ng-content>\n</li>","import { DOCUMENT, isPlatformServer } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, contentChildren, computed, DestroyRef, effect, ElementRef, forwardRef, inject, Injector, input, OnDestroy, PLATFORM_ID, signal, SkipSelf, viewChild } from '@angular/core';\nimport { ClickOutsideDirective } from '@mintplayer/ng-click-outside';\nimport { BsHasOverlayComponent } from '@mintplayer/ng-bootstrap/has-overlay';\nimport { BsNoNoscriptDirective } from '@mintplayer/ng-bootstrap/no-noscript';\nimport { BsNavbarComponent } from '../navbar/navbar.component';\nimport { BsNavbarItemComponent } from '../navbar-item/navbar-item.component';\nimport { DomPortal } from '@angular/cdk/portal';\nimport { OverlayRef } from '@angular/cdk/overlay';\n\n@Component({\n selector: 'bs-navbar-dropdown',\n templateUrl: './navbar-dropdown.component.html',\n styleUrls: ['./navbar-dropdown.component.scss'],\n imports: [BsHasOverlayComponent, BsNoNoscriptDirective, ClickOutsideDirective],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BsNavbarDropdownComponent implements OnDestroy {\n\n private navbar = inject(BsNavbarComponent);\n parentDropdown = inject(BsNavbarDropdownComponent, { skipSelf: true, optional: true });\n navbarItem = inject(forwardRef(() => BsNavbarItemComponent), { host: true });\n element = inject<ElementRef<HTMLElement>>(ElementRef);\n private injector = inject(Injector);\n private document = inject(DOCUMENT);\n private platformId = inject(PLATFORM_ID);\n\n private readonly isAttached = signal<boolean>(false);\n private readonly isDestroyed = signal<boolean>(false);\n private domPortal?: DomPortal;\n private overlay?: OverlayRef;\n private pendingShowInOverlay: boolean | null = null;\n\n autoclose = input(true);\n readonly dropdownElement = viewChild.required<ElementRef<HTMLDivElement>>('dd');\n isBrowser = !isPlatformServer(this.platformId);\n\n isVisible = signal<boolean>(false);\n topPos = signal<number | null>(null);\n\n maxHeight = computed(() => {\n const topPos = this.topPos();\n const w: Window | null = this.document.defaultView;\n if (!topPos) {\n return null;\n } else if (w && this.dropdownElement()) {\n const style = w.getComputedStyle(this.dropdownElement().nativeElement);\n return `calc(100vh - ${topPos}px - ${style.getPropertyValue('padding-top')} - ${style.getPropertyValue('padding-bottom')})`;\n } else {\n return null;\n }\n });\n\n maxHeightOrNull = computed(() => {\n const maxHeight = this.maxHeight();\n const isSmallMode = this.navbar.isSmallMode();\n if (isSmallMode) {\n return null;\n } else if (isPlatformServer(this.platformId)) {\n return this.parentDropdown ? null : maxHeight;\n } else {\n return maxHeight;\n }\n });\n\n constructor() {\n effect(() => {\n const isVisible = this.isVisible();\n if (isVisible) {\n setTimeout(() => {\n try { this.overlay?.updatePosition(); }\n catch (ex) { }\n }, 20);\n this.topPos.set(this.element.nativeElement.offsetTop);\n } else {\n this.topPos.set(null);\n }\n });\n\n if (!!this.parentDropdown && this.isBrowser) {\n import('@angular/cdk/overlay').then(({ Overlay }) => {\n // Guard against accessing injector after component is destroyed\n if (this.isDestroyed()) {\n return;\n }\n const overlayService = this.injector.get(Overlay);\n this.domPortal = new DomPortal(this.element);\n this.overlay = overlayService.create({\n positionStrategy: overlayService.position()\n .flexibleConnectedTo(this.navbarItem.element)\n .withPositions([\n { originX: 'end', originY: 'top', overlayX: 'start', overlayY: 'top', offsetX: -9, offsetY: -9 }\n ])\n });\n\n // Apply pending showInOverlay state if it was set before overlay was ready\n if (this.pendingShowInOverlay !== null) {\n const pending = this.pendingShowInOverlay;\n this.pendingShowInOverlay = null;\n this.showInOverlay = pending;\n }\n });\n }\n }\n\n ngOnDestroy() {\n this.isDestroyed.set(true);\n this.overlay?.dispose();\n }\n\n public set showInOverlay(value: boolean) {\n if (this.overlay && this.domPortal) {\n if (value && !this.isAttached()) {\n this.overlay.attach(this.domPortal);\n this.isAttached.set(true);\n }\n if (!value && this.isAttached()) {\n this.overlay.detach();\n this.isAttached.set(false);\n }\n } else {\n // Store the value to apply once the overlay is ready\n this.pendingShowInOverlay = value;\n }\n }\n\n get elementsToExclude() {\n return [this.navbarItem.anchorTag].filter((a) => a).map((a) => <HTMLElement>a);\n }\n\n readonly childDropdowns = contentChildren<BsNavbarDropdownComponent>(forwardRef(() => BsNavbarDropdownComponent), { descendants: true });\n}\n","<bs-has-overlay></bs-has-overlay>\n<ul #dd class=\"dropdown-menu me-3\" [class.show]=\"isVisible()\" [class.submenu]=\"!!parentDropdown\" [class.overflow-y-auto]=\"isBrowser\" [style.max-height]=\"maxHeightOrNull()\" bsNoNoscript (clickOutside)=\"isVisible.set(false)\" [exclude]=\"elementsToExclude\" aria-labelledby=\"navbarDropdown\">\n <ng-content></ng-content>\n</ul>\n\n<!--\n - Working demo: https://codepen.io/agop/pen/VwwMGR\n - Location must be set through javascript\n - bsNoScript => If noscript, 2nd-level submenus must be shown inside the 1st-level submenu\n -->\n <!--\n - Another option: https://stackblitz.com/edit/web-platform-vmsr4l?file=index.html\n - But this doesn't seem to work here\n -->\n","import { isPlatformServer } from '@angular/common';\nimport { AfterViewInit, Directive, effect, ElementRef, inject, input, OnDestroy, PLATFORM_ID, signal } from '@angular/core';\nimport { BsNavbarComponent } from '../navbar/navbar.component';\n\n@Directive({\n selector: '[bsNavbarContent]',\n})\nexport class BsNavbarContentDirective implements AfterViewInit, OnDestroy {\n\n private element = inject(ElementRef);\n private platformId = inject(PLATFORM_ID);\n\n navbar = input<BsNavbarComponent | undefined>(undefined, { alias: 'bsNavbarContent' });\n private viewInit = signal<boolean>(false);\n resizeObserver: ResizeObserver | null = null;\n initialPadding = 0;\n\n constructor() {\n effect(() => {\n const viewInit = this.viewInit();\n const navbar = this.navbar();\n\n if (viewInit && navbar) {\n if (isPlatformServer(this.platformId)) {\n this.element.nativeElement.style.paddingTop = (this.initialPadding + 58) + 'px';\n } else {\n this.resizeObserver = new ResizeObserver((entries) => {\n const height = navbar.nav().nativeElement.offsetHeight;\n this.element.nativeElement.style.paddingTop = (this.initialPadding + height) + 'px';\n });\n\n const px = getComputedStyle(this.element.nativeElement).getPropertyValue('padding-top');\n const pt = parseInt(px.replace(/px$/, ''));\n this.initialPadding = isNaN(pt) ? 0 : pt;\n if (this.resizeObserver && navbar) {\n this.resizeObserver.observe(navbar.nav().nativeElement);\n }\n }\n }\n });\n }\n\n ngAfterViewInit() {\n this.viewInit.set(true);\n }\n\n ngOnDestroy() {\n const navbar = this.navbar();\n if (navbar) {\n this.resizeObserver?.unobserve(navbar.nav().nativeElement);\n }\n }\n}\n","import { Directive, inject, TemplateRef } from '@angular/core';\nimport { BsNavbarComponent } from '../navbar/navbar.component';\n\n@Directive({\n selector: '[bsExpandButton]',\n})\nexport class BsExpandButtonDirective {\n\n constructor() {\n const navbar = inject(BsNavbarComponent);\n const templateRef = inject(TemplateRef);\n navbar.expandButtonTemplate.set(templateRef);\n }\n \n public static ngTemplateContextGuard(\n dir: BsExpandButtonDirective,\n ctx: any\n ): ctx is BsExpandButtonContext {\n return true;\n }\n\n}\n\nexport class BsExpandButtonContext {\n public $implicit: boolean = null!;\n}","import { ContentChildren, Directive, ElementRef, forwardRef, inject, QueryList } from '@angular/core';\nimport { BsNavbarItemComponent } from '../navbar-item/navbar-item.component';\nimport { BsNavbarDropdownComponent } from '../navbar-dropdown/navbar-dropdown.component';\n\n@Directive({\n // selector: 'bs-navbar-item > a[routerLink]',\n selector: 'bs-navbar-item',\n queries: {\n childDropdowns: new ContentChildren(forwardRef(() => BsNavbarDropdownComponent))\n },\n})\nexport class DropdownToggleDirective {\n\n private elementRef = inject<ElementRef<HTMLAnchorElement>>(ElementRef);\n private bsNavbarItem = inject<BsNavbarItemComponent>(forwardRef(() => BsNavbarItemComponent));\n\n childDropdowns!: QueryList<BsNavbarDropdownComponent>;\n}","import { Directive, ElementRef, forwardRef, inject } from '@angular/core';\nimport { BsNavbarDropdownComponent } from '../navbar-dropdown/navbar-dropdown.component';\nimport { BsNavbarComponent } from '../navbar/navbar.component';\n\n@Directive({\n selector: 'bs-navbar-item > li > a',\n // Below selector doesn't work well either (does not select the github link)\n // selector: 'bs-navbar-item > a[routerLink]'\n // Below selector seems to target other a's that aren't even remotely inside a bs-navbar-item\n // selector: 'bs-navbar-item:first-child > a'\n host: {\n '[class.cursor-pointer]': 'cursorPointer',\n },\n})\nexport class NavLinkDirective {\n\n private elementRef = inject<ElementRef<HTMLAnchorElement>>(ElementRef);\n private parentNavbar = inject(BsNavbarComponent, { optional: true });\n private parentDropdown = inject<BsNavbarDropdownComponent>(forwardRef(() => BsNavbarDropdownComponent), { optional: true });\n\n cursorPointer: boolean;\n\n constructor() {\n if (this.parentNavbar) {\n if (this.parentDropdown == null) {\n this.elementRef.nativeElement.classList.add('nav-link');\n } else {\n this.elementRef.nativeElement.classList.add('dropdown-item');\n }\n }\n this.cursorPointer = !!this.parentNavbar;\n }\n\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mintplayer-ng-bootstrap-navbar.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar/navbar.component.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar/navbar.component.html","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-brand/navbar-brand.component.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-brand/navbar-brand.component.html","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-nav/navbar-nav.component.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-nav/navbar-nav.component.html","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-item/navbar-item.component.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-item/navbar-item.component.html","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-dropdown/navbar-dropdown.component.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-dropdown/navbar-dropdown.component.html","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-content/navbar-content.directive.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/navbar-trigger/navbar-trigger.directive.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/expand-button/expand-button.directive.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/dropdown-toggle/dropdown-toggle.directive.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/src/nav-link/nav-link.directive.ts","../../../../libs/mintplayer-ng-bootstrap/navbar/mintplayer-ng-bootstrap-navbar.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, ElementRef, input, signal, TemplateRef, viewChild } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { BsContainerComponent } from '@mintplayer/ng-bootstrap/container';\nimport { BsUserAgentDirective } from '@mintplayer/ng-bootstrap/user-agent';\nimport { BsNoNoscriptDirective } from '@mintplayer/ng-bootstrap/no-noscript';\nimport { Breakpoint, Color } from '@mintplayer/ng-bootstrap';\n\n@Component({\n selector: 'bs-navbar',\n templateUrl: './navbar.component.html',\n styleUrls: ['./navbar.component.scss'],\n imports: [NgTemplateOutlet, BsContainerComponent, BsUserAgentDirective, BsNoNoscriptDirective],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '(window:resize)': 'onWindowResize()',\n },\n})\nexport class BsNavbarComponent {\n\n private resizeTimeout: ReturnType<typeof setTimeout> | null = null;\n\n constructor() {\n this.onWindowResize();\n }\n\n onWindowResize() {\n this.isResizing.set(true);\n if (typeof window !== 'undefined') {\n this.windowWidth.set(window.innerWidth);\n }\n\n // Clear any existing timeout to debounce\n if (this.resizeTimeout) {\n clearTimeout(this.resizeTimeout);\n }\n\n // Reset isResizing after debounce period\n this.resizeTimeout = setTimeout(() => {\n this.isResizing.set(false);\n }, 300);\n }\n\n readonly nav = viewChild.required<ElementRef>('nav');\n autoclose = input(true);\n\n expandButtonTemplate = signal<TemplateRef<any> | null>(null);\n\n isExpanded = signal<boolean>(false);\n windowWidth = signal<number | null>(null);\n isResizing = signal<boolean>(false);\n\n color = input<Color | null>(null);\n breakpoint = input<Breakpoint | null>('md');\n\n expandAt = computed(() => {\n const breakpoint = this.breakpoint();\n switch (breakpoint) {\n case 'xxl': return 1400;\n case 'xl': return 1200;\n case 'lg': return 992;\n case 'md': return 768;\n case 'sm': return 576;\n case 'xs': return 0;\n default: return null;\n }\n });\n\n isSmallMode = computed(() => {\n const expandAt = this.expandAt();\n const windowWidth = this.windowWidth();\n if (windowWidth === null) {\n return true;\n } else if (!expandAt) {\n return true;\n } else if (windowWidth >= expandAt) {\n return false;\n } else {\n return true;\n }\n });\n\n expandClass = computed(() => {\n const breakpoint = this.breakpoint();\n if (breakpoint === null) {\n return null;\n } else {\n return `navbar-expand-${breakpoint}`;\n }\n });\n\n wAutoClass = computed(() => {\n const breakpoint = this.breakpoint();\n if (breakpoint === null) {\n return null;\n } else {\n return `w-${breakpoint}-auto`;\n }\n });\n\n dNoneClass = computed(() => {\n const breakpoint = this.breakpoint();\n if (breakpoint === null) {\n return null;\n } else {\n return `d-${breakpoint}-none`;\n }\n });\n\n backgroundColorClass = computed(() => {\n const color = this.color();\n switch (color) {\n case Color.light:\n case null:\n return ['navbar-light'];\n default:\n return ['navbar-dark', `bg-${Color[color]}`];\n }\n });\n\n navClassList = computed(() => {\n const expandClass = this.expandClass();\n const backgroundColorClass = this.backgroundColorClass();\n const result: string[] = [];\n return result.concat(expandClass ?? [], ...backgroundColorClass);\n });\n\n toggleExpanded() {\n this.isExpanded.update(v => !v);\n }\n}\n","<bs-container>\n <nav #nav class=\"navbar position-fixed\" [class]=\"navClassList()\" bsUserAgent bsNoNoscript aria-label=\"Main navigation\">\n <div class=\"container-fluid nav-wrapper\">\n <div class=\"d-flex w-100\" [class]=\"wAutoClass()\">\n <ng-content select=\"bs-navbar-brand\"></ng-content>\n <div class=\"flex-end d-flex tw\" [class]=\"dNoneClass()\">\n <button (click)=\"toggleExpanded()\"\n class=\"align-self-center\"\n [class.navbar-toggler]=\"!expandButtonTemplate()\"\n [class.bg-transparent]=\"expandButtonTemplate()\"\n [class.shadow-none]=\"expandButtonTemplate()\"\n [class.border-0]=\"expandButtonTemplate()\"\n type=\"button\"\n aria-label=\"Toggle navigation\"\n [attr.aria-expanded]=\"isExpanded()\"\n aria-controls=\"navbar-collapse\">\n <ng-container *ngTemplateOutlet=\"expandButtonTemplate() ?? defaultExpandButton; context: { $implicit: isExpanded() }\"></ng-container>\n </button>\n </div>\n </div>\n <ng-content></ng-content>\n </div>\n </nav>\n</bs-container>\n\n<ng-template #defaultExpandButton>\n <span class=\"navbar-toggler-icon\" aria-hidden=\"true\"></span>\n</ng-template>\n","import { AfterContentChecked, Component, ElementRef, inject, input, ChangeDetectionStrategy} from '@angular/core';\n\n@Component({\n selector: 'bs-navbar-brand',\n templateUrl: './navbar-brand.component.html',\n styleUrls: ['./navbar-brand.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class.mx-auto]': 'true',\n },\n})\nexport class BsNavbarBrandComponent implements AfterContentChecked {\n private element = inject(ElementRef);\n readonly routerLink = input<any[]>([]);\n\n ngAfterContentChecked() {\n const anchor = this.element.nativeElement.querySelector('a');\n if (anchor) {\n anchor.classList.add('nav-link');\n }\n }\n}\n","<span class=\"navbar-brand mx-auto mx-md-unset\">\n <ng-content></ng-content>\n</span>","import { ChangeDetectionStrategy, Component, computed, inject, input, signal } from '@angular/core';\nimport { SlideUpDownAnimation } from '@mintplayer/ng-animations';\nimport { BsNavbarComponent } from '../navbar/navbar.component';\n\n@Component({\n selector: 'bs-navbar-nav',\n templateUrl: './navbar-nav.component.html',\n styleUrls: ['./navbar-nav.component.scss'],\n animations: [SlideUpDownAnimation],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '(window:resize)': 'onWindowResize()',\n },\n})\nexport class BsNavbarNavComponent {\n\n bsNavbar = inject(BsNavbarComponent);\n\n windowWidth = signal<number | null>(null);\n isResizing = signal<boolean>(false);\n collapse = input<boolean>(true);\n\n private resizeTimeout: ReturnType<typeof setTimeout> | null = null;\n\n showNavs = computed(() => {\n const isExpanded = this.bsNavbar.isExpanded();\n const expandAt = this.bsNavbar.expandAt();\n const windowWidth = this.windowWidth();\n\n if (windowWidth === null) {\n return false;\n } else if (expandAt === null) {\n return isExpanded;\n } else if (windowWidth >= expandAt) {\n return true;\n } else {\n return isExpanded;\n }\n });\n\n constructor() {\n this.onWindowResize();\n }\n\n onWindowResize() {\n this.isResizing.set(true);\n if (typeof window !== 'undefined') {\n this.windowWidth.set(window.innerWidth);\n }\n\n // Clear any existing timeout to debounce\n if (this.resizeTimeout) {\n clearTimeout(this.resizeTimeout);\n }\n\n // Reset isResizing after debounce period\n this.resizeTimeout = setTimeout(() => {\n this.isResizing.set(false);\n }, 300);\n }\n}\n","<div class=\"navbar-collapse w-100 show\" [class.collapse]=\"collapse()\" [@slideUpDown]=\"showNavs()\" [@.disabled]=\"isResizing()\">\n <ul class=\"navbar-nav mr-auto\">\n <ng-content></ng-content>\n </ul>\n</div>\n","import { AfterContentChecked, AfterContentInit, ChangeDetectionStrategy, Component, computed, contentChildren, DestroyRef, effect, ElementRef, forwardRef, inject, PLATFORM_ID } from '@angular/core';\nimport { isPlatformServer } from '@angular/common';\nimport { Router } from '@angular/router';\nimport { BsNavbarComponent } from '../navbar/navbar.component';\nimport { BsNavbarDropdownComponent } from '../navbar-dropdown/navbar-dropdown.component';\n\n/** Duration of the navbar collapse animation in milliseconds */\nconst NAVBAR_ANIMATION_DURATION = 300;\n\n@Component({\n selector: 'bs-navbar-item',\n templateUrl: './navbar-item.component.html',\n styleUrls: ['./navbar-item.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BsNavbarItemComponent implements AfterContentInit, AfterContentChecked {\n\n private navbar = inject(BsNavbarComponent);\n element = inject(ElementRef);\n private destroy = inject(DestroyRef);\n private platformId = inject(PLATFORM_ID);\n private router = inject(Router);\n parentDropdown = inject(forwardRef(() => BsNavbarDropdownComponent), { optional: true });\n\n readonly hasDropdown = computed(() => this.dropdowns().length > 0);\n anchorTag: HTMLAnchorElement | null = null;\n readonly dropdowns = contentChildren<BsNavbarDropdownComponent>(forwardRef(() => BsNavbarDropdownComponent));\n\n constructor() {\n // Effect handles future isSmallMode changes after content is initialized\n effect(() => {\n const isSmallMode = this.navbar.isSmallMode();\n this.dropdowns().forEach((dropdown) => {\n dropdown.showInOverlay = !isSmallMode;\n });\n });\n }\n\n ngAfterContentInit() {\n // Set initial showInOverlay state after content children are resolved\n // This is needed because the effect runs before @ContentChildren is populated\n const isSmallMode = this.navbar.isSmallMode();\n this.dropdowns().forEach((dropdown) => {\n dropdown.showInOverlay = !isSmallMode;\n });\n }\n\n ngAfterContentChecked() {\n this.anchorTag = this.element.nativeElement.querySelector('li a');\n\n // Add nav-link or dropdown-item class (previously done by NavLinkDirective)\n if (this.anchorTag && !this.anchorTag.getAttribute('nav-link-class-added')) {\n if (this.parentDropdown === null) {\n this.anchorTag.classList.add('nav-link');\n } else {\n this.anchorTag.classList.add('dropdown-item');\n }\n this.anchorTag.classList.add('cursor-pointer');\n this.anchorTag.setAttribute('nav-link-class-added', 'true');\n }\n\n if (this.hasDropdown()) {\n if (this.anchorTag) {\n this.anchorTag.classList.add('dropdown-toggle');\n\n if (isPlatformServer(this.platformId)) {\n this.anchorTag.href = 'javascript:;';\n }\n\n if (!this.anchorTag.getAttribute('close-init-b')) {\n this.anchorTag.setAttribute('close-init-b', '1');\n this.anchorTag.addEventListener('click', (ev: MouseEvent) => {\n ev.preventDefault();\n this.dropdowns().forEach((dropdown) => {\n const newVisible = !dropdown.isVisible();\n dropdown.isVisible.set(newVisible);\n if (!newVisible) {\n dropdown.childDropdowns().forEach((child) => child.isVisible.set(false));\n }\n });\n return false;\n });\n }\n }\n } else {\n\n if ((this.dropdowns().length === 0) && this.anchorTag && !this.anchorTag.getAttribute('close-init-a')) {\n this.anchorTag.setAttribute('close-init-a', '1');\n this.anchorTag.addEventListener('click', (ev: MouseEvent) => {\n let d = this.parentDropdown;\n while (d && d.autoclose()) {\n d.isVisible.set(false);\n d = d.parentDropdown;\n }\n if (this.navbar.autoclose()) {\n // Get the fragment from the link's href\n const href = this.anchorTag?.getAttribute('href') ?? '';\n const fragmentMatch = href.match(/#(.+)$/);\n const fragment = fragmentMatch ? fragmentMatch[1] : null;\n\n // Always collapse the navbar\n this.navbar.isExpanded.set(false);\n\n // If in small mode with a fragment, prevent default navigation and\n // navigate after the collapse animation completes to avoid double scroll\n if (this.navbar.isSmallMode() && fragment) {\n ev.preventDefault();\n\n // After the collapse animation completes, navigate to the anchor\n // This ensures correct scroll position since navbar height is stable\n setTimeout(() => {\n this.router.navigateByUrl(href);\n }, NAVBAR_ANIMATION_DURATION);\n }\n }\n });\n }\n\n }\n }\n}\n","<li [class.nav-item]=\"parentDropdown === null\" [class.dropdown]=\"(dropdowns().length > 0) && (parentDropdown === null)\" [class.dropend]=\"(dropdowns().length > 0) && (parentDropdown !== null)\">\n <ng-content></ng-content>\n</li>","import { DOCUMENT, isPlatformServer } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, contentChildren, computed, DestroyRef, effect, ElementRef, forwardRef, inject, Injector, input, OnDestroy, PLATFORM_ID, signal, SkipSelf, viewChild } from '@angular/core';\nimport { ClickOutsideDirective } from '@mintplayer/ng-click-outside';\nimport { BsHasOverlayComponent } from '@mintplayer/ng-bootstrap/has-overlay';\nimport { BsNoNoscriptDirective } from '@mintplayer/ng-bootstrap/no-noscript';\nimport { BsNavbarComponent } from '../navbar/navbar.component';\nimport { BsNavbarItemComponent } from '../navbar-item/navbar-item.component';\nimport { DomPortal } from '@angular/cdk/portal';\nimport { OverlayRef } from '@angular/cdk/overlay';\n\n@Component({\n selector: 'bs-navbar-dropdown',\n templateUrl: './navbar-dropdown.component.html',\n styleUrls: ['./navbar-dropdown.component.scss'],\n imports: [BsHasOverlayComponent, BsNoNoscriptDirective, ClickOutsideDirective],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BsNavbarDropdownComponent implements OnDestroy {\n\n private navbar = inject(BsNavbarComponent);\n parentDropdown = inject(BsNavbarDropdownComponent, { skipSelf: true, optional: true });\n navbarItem = inject(forwardRef(() => BsNavbarItemComponent), { host: true });\n element = inject<ElementRef<HTMLElement>>(ElementRef);\n private injector = inject(Injector);\n private document = inject(DOCUMENT);\n private platformId = inject(PLATFORM_ID);\n\n private readonly isAttached = signal<boolean>(false);\n private readonly isDestroyed = signal<boolean>(false);\n private domPortal?: DomPortal;\n private overlay?: OverlayRef;\n private pendingShowInOverlay: boolean | null = null;\n\n autoclose = input(true);\n readonly dropdownElement = viewChild.required<ElementRef<HTMLDivElement>>('dd');\n isBrowser = !isPlatformServer(this.platformId);\n\n isVisible = signal<boolean>(false);\n topPos = signal<number | null>(null);\n\n maxHeight = computed(() => {\n const topPos = this.topPos();\n const w: Window | null = this.document.defaultView;\n if (!topPos) {\n return null;\n } else if (w && this.dropdownElement()) {\n const style = w.getComputedStyle(this.dropdownElement().nativeElement);\n return `calc(100vh - ${topPos}px - ${style.getPropertyValue('padding-top')} - ${style.getPropertyValue('padding-bottom')})`;\n } else {\n return null;\n }\n });\n\n maxHeightOrNull = computed(() => {\n const maxHeight = this.maxHeight();\n const isSmallMode = this.navbar.isSmallMode();\n if (isSmallMode) {\n return null;\n } else if (isPlatformServer(this.platformId)) {\n return this.parentDropdown ? null : maxHeight;\n } else {\n return maxHeight;\n }\n });\n\n constructor() {\n effect(() => {\n const isVisible = this.isVisible();\n if (isVisible) {\n setTimeout(() => {\n try { this.overlay?.updatePosition(); }\n catch (ex) { }\n }, 20);\n this.topPos.set(this.element.nativeElement.offsetTop);\n } else {\n this.topPos.set(null);\n }\n });\n\n if (!!this.parentDropdown && this.isBrowser) {\n import('@angular/cdk/overlay').then(({ Overlay }) => {\n // Guard against accessing injector after component is destroyed\n if (this.isDestroyed()) {\n return;\n }\n const overlayService = this.injector.get(Overlay);\n this.domPortal = new DomPortal(this.element);\n this.overlay = overlayService.create({\n positionStrategy: overlayService.position()\n .flexibleConnectedTo(this.navbarItem.element)\n .withPositions([\n { originX: 'end', originY: 'top', overlayX: 'start', overlayY: 'top', offsetX: -9, offsetY: -9 }\n ])\n });\n\n // Apply pending showInOverlay state if it was set before overlay was ready\n if (this.pendingShowInOverlay !== null) {\n const pending = this.pendingShowInOverlay;\n this.pendingShowInOverlay = null;\n this.showInOverlay = pending;\n }\n });\n }\n }\n\n ngOnDestroy() {\n this.isDestroyed.set(true);\n this.overlay?.dispose();\n }\n\n public set showInOverlay(value: boolean) {\n if (this.overlay && this.domPortal) {\n if (value && !this.isAttached()) {\n this.overlay.attach(this.domPortal);\n this.isAttached.set(true);\n }\n if (!value && this.isAttached()) {\n this.overlay.detach();\n this.isAttached.set(false);\n }\n } else {\n // Store the value to apply once the overlay is ready\n this.pendingShowInOverlay = value;\n }\n }\n\n get elementsToExclude() {\n return [this.navbarItem.anchorTag].filter((a) => a).map((a) => <HTMLElement>a);\n }\n\n readonly childDropdowns = contentChildren<BsNavbarDropdownComponent>(forwardRef(() => BsNavbarDropdownComponent), { descendants: true });\n}\n","<bs-has-overlay></bs-has-overlay>\n<ul #dd class=\"dropdown-menu me-3\" [class.show]=\"isVisible()\" [class.submenu]=\"!!parentDropdown\" [class.overflow-y-auto]=\"isBrowser\" [style.max-height]=\"maxHeightOrNull()\" bsNoNoscript (clickOutside)=\"isVisible.set(false)\" [exclude]=\"elementsToExclude\" aria-labelledby=\"navbarDropdown\">\n <ng-content></ng-content>\n</ul>\n\n<!--\n - Working demo: https://codepen.io/agop/pen/VwwMGR\n - Location must be set through javascript\n - bsNoScript => If noscript, 2nd-level submenus must be shown inside the 1st-level submenu\n -->\n <!--\n - Another option: https://stackblitz.com/edit/web-platform-vmsr4l?file=index.html\n - But this doesn't seem to work here\n -->\n","import { isPlatformServer } from '@angular/common';\nimport { AfterViewInit, Directive, effect, ElementRef, inject, input, OnDestroy, PLATFORM_ID, signal } from '@angular/core';\nimport { BsNavbarComponent } from '../navbar/navbar.component';\n\n@Directive({\n selector: '[bsNavbarContent]',\n})\nexport class BsNavbarContentDirective implements AfterViewInit, OnDestroy {\n\n private element = inject(ElementRef);\n private platformId = inject(PLATFORM_ID);\n\n navbar = input<BsNavbarComponent | undefined>(undefined, { alias: 'bsNavbarContent' });\n private viewInit = signal<boolean>(false);\n resizeObserver: ResizeObserver | null = null;\n initialPadding = 0;\n\n constructor() {\n effect(() => {\n const viewInit = this.viewInit();\n const navbar = this.navbar();\n\n if (viewInit && navbar) {\n if (isPlatformServer(this.platformId)) {\n this.element.nativeElement.style.paddingTop = (this.initialPadding + 58) + 'px';\n } else {\n this.resizeObserver = new ResizeObserver((entries) => {\n const height = navbar.nav().nativeElement.offsetHeight;\n this.element.nativeElement.style.paddingTop = (this.initialPadding + height) + 'px';\n });\n\n const px = getComputedStyle(this.element.nativeElement).getPropertyValue('padding-top');\n const pt = parseInt(px.replace(/px$/, ''));\n this.initialPadding = isNaN(pt) ? 0 : pt;\n if (this.resizeObserver && navbar) {\n this.resizeObserver.observe(navbar.nav().nativeElement);\n }\n }\n }\n });\n }\n\n ngAfterViewInit() {\n this.viewInit.set(true);\n }\n\n ngOnDestroy() {\n const navbar = this.navbar();\n if (navbar) {\n this.resizeObserver?.unobserve(navbar.nav().nativeElement);\n }\n }\n}\n","import { Directive, computed, inject, input, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { filter } from 'rxjs/operators';\n\n/**\n * Marks a navbar dropdown trigger anchor. Replaces both `routerLink` and\n * `routerLinkActive` on a trigger element: toggles the active CSS class when a\n * sub-route under the bound URL is active, but does NOT navigate on click\n * (which `routerLink` would do via its own host listener, even when other\n * click handlers `preventDefault`).\n *\n * @example\n * ```html\n * <a bsNavbarTrigger=\"/overlays\">Overlays</a>\n * ```\n *\n * Items inside the dropdown panel still use real `[routerLink]`s for\n * navigation. Use this directive only for the trigger anchor that opens the\n * dropdown panel.\n */\n@Directive({\n selector: '[bsNavbarTrigger]',\n host: {\n 'href': 'javascript:void(0)',\n '[class.active]': 'isActive()',\n '(click)': '$event.preventDefault()',\n },\n})\nexport class BsNavbarTriggerDirective {\n private router = inject(Router);\n\n readonly bsNavbarTrigger = input.required<string | readonly string[]>();\n\n private currentUrl = signal(this.router.url);\n\n private targetUrl = computed(() => {\n const v = this.bsNavbarTrigger();\n if (Array.isArray(v)) {\n // join with '/', collapse double slashes; ensure leading slash\n const joined = (v as readonly string[]).join('/').replace(/\\/+/g, '/');\n return joined.startsWith('/') ? joined : '/' + joined;\n }\n return v as string;\n });\n\n readonly isActive = computed(() => {\n const url = this.currentUrl();\n const target = this.targetUrl();\n return url === target || url.startsWith(target + '/');\n });\n\n constructor() {\n this.router.events.pipe(\n filter(ev => ev instanceof NavigationEnd),\n takeUntilDestroyed(),\n ).subscribe(() => this.currentUrl.set(this.router.url));\n }\n}\n","import { Directive, inject, TemplateRef } from '@angular/core';\nimport { BsNavbarComponent } from '../navbar/navbar.component';\n\n@Directive({\n selector: '[bsExpandButton]',\n})\nexport class BsExpandButtonDirective {\n\n constructor() {\n const navbar = inject(BsNavbarComponent);\n const templateRef = inject(TemplateRef);\n navbar.expandButtonTemplate.set(templateRef);\n }\n \n public static ngTemplateContextGuard(\n dir: BsExpandButtonDirective,\n ctx: any\n ): ctx is BsExpandButtonContext {\n return true;\n }\n\n}\n\nexport class BsExpandButtonContext {\n public $implicit: boolean = null!;\n}","import { ContentChildren, Directive, ElementRef, forwardRef, inject, QueryList } from '@angular/core';\nimport { BsNavbarItemComponent } from '../navbar-item/navbar-item.component';\nimport { BsNavbarDropdownComponent } from '../navbar-dropdown/navbar-dropdown.component';\n\n@Directive({\n // selector: 'bs-navbar-item > a[routerLink]',\n selector: 'bs-navbar-item',\n queries: {\n childDropdowns: new ContentChildren(forwardRef(() => BsNavbarDropdownComponent))\n },\n})\nexport class DropdownToggleDirective {\n\n private elementRef = inject<ElementRef<HTMLAnchorElement>>(ElementRef);\n private bsNavbarItem = inject<BsNavbarItemComponent>(forwardRef(() => BsNavbarItemComponent));\n\n childDropdowns!: QueryList<BsNavbarDropdownComponent>;\n}","import { Directive, ElementRef, forwardRef, inject } from '@angular/core';\nimport { BsNavbarDropdownComponent } from '../navbar-dropdown/navbar-dropdown.component';\nimport { BsNavbarComponent } from '../navbar/navbar.component';\n\n@Directive({\n selector: 'bs-navbar-item > li > a',\n // Below selector doesn't work well either (does not select the github link)\n // selector: 'bs-navbar-item > a[routerLink]'\n // Below selector seems to target other a's that aren't even remotely inside a bs-navbar-item\n // selector: 'bs-navbar-item:first-child > a'\n host: {\n '[class.cursor-pointer]': 'cursorPointer',\n },\n})\nexport class NavLinkDirective {\n\n private elementRef = inject<ElementRef<HTMLAnchorElement>>(ElementRef);\n private parentNavbar = inject(BsNavbarComponent, { optional: true });\n private parentDropdown = inject<BsNavbarDropdownComponent>(forwardRef(() => BsNavbarDropdownComponent), { optional: true });\n\n cursorPointer: boolean;\n\n constructor() {\n if (this.parentNavbar) {\n if (this.parentDropdown == null) {\n this.elementRef.nativeElement.classList.add('nav-link');\n } else {\n this.elementRef.nativeElement.classList.add('dropdown-item');\n }\n }\n this.cursorPointer = !!this.parentNavbar;\n }\n\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,103 +1,205 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Injectable, inject, DestroyRef, input, Directive } from '@angular/core';
3
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
4
- import { Router, ActivatedRoute } from '@angular/router';
5
- import { take } from 'rxjs';
2
+ import { InjectionToken, inject, PLATFORM_ID, DestroyRef, isDevMode, Injectable, input, Directive, makeEnvironmentProviders } from '@angular/core';
3
+ import { isPlatformBrowser } from '@angular/common';
4
+ import { ROUTER_CONFIGURATION, provideRouter, withRouterConfig } from '@angular/router';
5
+ import { isObservable, firstValueFrom, take, defaultIfEmpty } from 'rxjs';
6
6
 
7
- class BsNavigationLockGuard {
8
- canDeactivate(component, currentRoute, currentState, nextState) {
9
- if (component.navigationLock()) {
10
- return component.navigationLock().requestCanExit();
7
+ /** Confirm hook used by the directive's fallback path (canExit undefined + exitMessage set). */
8
+ const BS_NAVIGATION_LOCK_CONFIRM = new InjectionToken('BS_NAVIGATION_LOCK_CONFIRM', {
9
+ providedIn: 'root',
10
+ factory: () => (message) => typeof window === 'undefined' ? true : window.confirm(message),
11
+ });
12
+ class BsNavigationLockService {
13
+ constructor() {
14
+ this.platformId = inject(PLATFORM_ID);
15
+ this.destroy = inject(DestroyRef);
16
+ this.locks = new Set();
17
+ this.pending = null;
18
+ if (isDevMode()) {
19
+ // canceledNavigationResolution is needed to restore the history stack
20
+ // on popstate-cancel. Default 'replace' loses the popped entry. The
21
+ // value is set via ROUTER_CONFIGURATION (typically through
22
+ // withRouterConfig in provideRouter); read it directly from the token
23
+ // since Router.options is private in the public type.
24
+ const config = inject(ROUTER_CONFIGURATION, { optional: true });
25
+ if (config?.canceledNavigationResolution !== 'computed') {
26
+ console.warn('[BsNavigationLockService] Router.canceledNavigationResolution is not "computed". ' +
27
+ 'Pass withRouterConfig({ canceledNavigationResolution: "computed" }) to provideRouter ' +
28
+ 'so popstate cancellations restore the history stack correctly.');
29
+ }
30
+ }
31
+ if (isPlatformBrowser(this.platformId)) {
32
+ const handler = (ev) => this.onBeforeUnload(ev);
33
+ window.addEventListener('beforeunload', handler);
34
+ this.destroy.onDestroy(() => window.removeEventListener('beforeunload', handler));
11
35
  }
12
- else {
13
- console.warn('When using <bs-navigation-lock>, you should implement BsHasNavigationLock and add "readonly navigationLock = viewChild.required<BsNavigationLockDirective>(\'navigationLock\');" to your page');
14
- return new Promise(resolve => resolve(false));
36
+ }
37
+ /** Internal called by directive on init. */
38
+ register(lock) {
39
+ this.locks.add(lock);
40
+ }
41
+ /** Internal — called by directive on destroy. */
42
+ unregister(lock) {
43
+ this.locks.delete(lock);
44
+ }
45
+ /**
46
+ * Programmatic check: ask every active lock if exit is OK.
47
+ * Resolves true only when every lock allows exit. Short-circuits on first false.
48
+ *
49
+ * Re-entrant calls while a check is already in flight return the same Promise
50
+ * — only the first `reason` is consulted. This dedups both router-driven
51
+ * fires (e.g. `canMatch` running once) and programmatic call sites that
52
+ * might invoke `requestExit` multiple times in the same tick.
53
+ */
54
+ requestExit(reason) {
55
+ if (this.pending)
56
+ return this.pending;
57
+ this.pending = this.doRequestExit(reason);
58
+ return this.pending;
59
+ }
60
+ async doRequestExit(reason) {
61
+ try {
62
+ for (const lock of this.locks) {
63
+ const ok = await this.normalise(lock.requestCanExit(reason));
64
+ if (!ok)
65
+ return false;
66
+ }
67
+ return true;
68
+ }
69
+ finally {
70
+ this.pending = null;
71
+ }
72
+ }
73
+ onBeforeUnload(ev) {
74
+ // PRD §5.4 — sync-first, browser does NOT await async results.
75
+ for (const lock of this.locks) {
76
+ const result = lock.requestCanExit();
77
+ if (typeof result === 'boolean') {
78
+ if (!result) {
79
+ ev.preventDefault();
80
+ ev.returnValue = '';
81
+ return;
82
+ }
83
+ continue;
84
+ }
85
+ // Promise / Observable — safe default: prompt the browser confirm.
86
+ ev.preventDefault();
87
+ ev.returnValue = '';
88
+ return;
15
89
  }
16
90
  }
17
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: BsNavigationLockGuard, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
18
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: BsNavigationLockGuard, providedIn: 'root' }); }
91
+ normalise(r) {
92
+ if (typeof r === 'boolean')
93
+ return Promise.resolve(r);
94
+ if (isObservable(r))
95
+ return firstValueFrom(r.pipe(take(1), defaultIfEmpty(true)));
96
+ return r;
97
+ }
98
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: BsNavigationLockService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
99
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: BsNavigationLockService, providedIn: 'root' }); }
19
100
  }
20
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: BsNavigationLockGuard, decorators: [{
101
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: BsNavigationLockService, decorators: [{
21
102
  type: Injectable,
22
- args: [{
23
- providedIn: 'root'
24
- }]
25
- }] });
103
+ args: [{ providedIn: 'root' }]
104
+ }], ctorParameters: () => [] });
26
105
 
27
106
  /**
28
- * Places a navigation lock on this page.
107
+ * Marks the host as a navigation-blocker. Drop `[bsNavigationLock]` on a real
108
+ * element (typically the form). Set `[canExit]` to a boolean, function, or
109
+ * Observable. The service consults every active lock on Router navigation
110
+ * (via `bsNavigationLockGuard` registered at the root) and on `beforeunload`.
29
111
  *
30
- * Don't forget to add the following to your route:
31
- *
32
- * ```ts
33
- * canDeactivate: [BsNavigationLockGuard]
34
- * ```
35
- *
36
- * and implement the `BsHasNavigationLock` on the page:
37
- *
38
- * ```ts
39
- * ViewChild('navigationLock') navigationLock!: BsNavigationLockDirective;
40
- * ```
41
- *
42
- **/
112
+ * Fallback: if `canExit` is not set but `exitMessage` is, the directive uses
113
+ * the injected `BS_NAVIGATION_LOCK_CONFIRM` hook with that message.
114
+ */
43
115
  class BsNavigationLockDirective {
44
116
  constructor() {
45
- this.router = inject(Router);
46
- this.route = inject(ActivatedRoute);
47
117
  this.destroy = inject(DestroyRef);
118
+ this.service = inject(BsNavigationLockService);
119
+ this.confirmFn = inject(BS_NAVIGATION_LOCK_CONFIRM);
48
120
  this.canExit = input(undefined, ...(ngDevMode ? [{ debugName: "canExit" }] : /* istanbul ignore next */ []));
49
121
  this.exitMessage = input(undefined, ...(ngDevMode ? [{ debugName: "exitMessage" }] : /* istanbul ignore next */ []));
122
+ this.service.register(this);
123
+ this.destroy.onDestroy(() => this.service.unregister(this));
50
124
  }
51
- requestCanExit() {
125
+ requestCanExit(reason) {
52
126
  const canExit = this.canExit();
53
- return new Promise((resolve, reject) => {
54
- if (typeof canExit === 'undefined') {
55
- resolve(true);
56
- }
57
- else if (typeof canExit === 'boolean') {
58
- resolve(canExit);
59
- }
60
- else if (typeof canExit === 'function') {
61
- const result = canExit();
62
- resolve(result);
63
- }
64
- else {
65
- canExit.pipe(take(1), takeUntilDestroyed(this.destroy))
66
- .subscribe((result) => resolve(result));
67
- }
68
- });
69
- }
70
- async onBeforeUnload(ev) {
71
- const canExit = await this.requestCanExit();
72
- if (!canExit) {
73
- ev.preventDefault();
74
- ev.returnValue = false;
75
- return 'Are you sure?';
76
- }
77
- else {
78
- return undefined;
127
+ if (canExit === undefined) {
128
+ const msg = this.exitMessage();
129
+ if (msg)
130
+ return Promise.resolve(this.confirmFn(msg));
131
+ return true;
79
132
  }
80
- }
81
- onUnload(ev) {
133
+ if (typeof canExit === 'boolean')
134
+ return canExit;
135
+ if (typeof canExit === 'function')
136
+ return canExit(reason);
137
+ return canExit; // Observable<boolean>
82
138
  }
83
139
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: BsNavigationLockDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
84
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.11", type: BsNavigationLockDirective, isStandalone: true, selector: "[bsNavigationLock]", inputs: { canExit: { classPropertyName: "canExit", publicName: "canExit", isSignal: true, isRequired: false, transformFunction: null }, exitMessage: { classPropertyName: "exitMessage", publicName: "exitMessage", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "window:beforeunload": "onBeforeUnload($event)", "window:unload": "onUnload($event)" } }, exportAs: ["bsNavigationLock"], ngImport: i0 }); }
140
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.11", type: BsNavigationLockDirective, isStandalone: true, selector: "[bsNavigationLock]", inputs: { canExit: { classPropertyName: "canExit", publicName: "canExit", isSignal: true, isRequired: false, transformFunction: null }, exitMessage: { classPropertyName: "exitMessage", publicName: "exitMessage", isSignal: true, isRequired: false, transformFunction: null } }, exportAs: ["bsNavigationLock"], ngImport: i0 }); }
85
141
  }
86
142
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: BsNavigationLockDirective, decorators: [{
87
143
  type: Directive,
88
144
  args: [{
89
145
  selector: '[bsNavigationLock]',
90
146
  exportAs: 'bsNavigationLock',
91
- host: {
92
- '(window:beforeunload)': 'onBeforeUnload($event)',
93
- '(window:unload)': 'onUnload($event)',
94
- },
95
147
  }]
96
- }], propDecorators: { canExit: [{ type: i0.Input, args: [{ isSignal: true, alias: "canExit", required: false }] }], exitMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "exitMessage", required: false }] }] } });
148
+ }], ctorParameters: () => [], propDecorators: { canExit: [{ type: i0.Input, args: [{ isSignal: true, alias: "canExit", required: false }] }], exitMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "exitMessage", required: false }] }] } });
149
+
150
+ /**
151
+ * Functional `canMatch` guard the consumer registers ONCE at the root route:
152
+ *
153
+ * ```ts
154
+ * { path: '', canMatch: [bsNavigationLockGuard], children: [...] }
155
+ * ```
156
+ *
157
+ * `canMatch` is the right Angular guard for "should this navigation be allowed
158
+ * to start": it runs once per route-match attempt, regardless of how deeply
159
+ * nested the destination is. (`canActivateChild` would fire once per descendant
160
+ * activation — N prompts for an N-deep destination.)
161
+ *
162
+ * Note: when `canMatch` returns false the router treats the route as not
163
+ * matching; if a sibling route or wildcard fallback matches the destination URL,
164
+ * the user lands there instead of staying put. Most apps don't have a `**`
165
+ * redirect that conflicts; if yours does, additionally guard the wildcard.
166
+ *
167
+ * Programmatic call sites that need a `reason` argument should call
168
+ * `BsNavigationLockService.requestExit(reason)` directly.
169
+ */
170
+ const bsNavigationLockGuard = () => {
171
+ return inject(BsNavigationLockService).requestExit();
172
+ };
173
+
174
+ /**
175
+ * Optional provider. Without it, the service is still root-provided and
176
+ * uses `window.confirm` as the default fallback confirm UI.
177
+ */
178
+ function provideNavigationLock(opts) {
179
+ return makeEnvironmentProviders([
180
+ ...(opts?.confirm
181
+ ? [{ provide: BS_NAVIGATION_LOCK_CONFIRM, useValue: opts.confirm }]
182
+ : []),
183
+ ]);
184
+ }
185
+ /**
186
+ * One-call router setup for navigation-lock. Wraps `routes` in a root
187
+ * `{ path: '', canMatch: [bsNavigationLockGuard], children }` entry and
188
+ * applies `canceledNavigationResolution: 'computed'` (required for
189
+ * popstate-cancel to restore the history stack). Pass any additional router
190
+ * features (`withPreloading`, `withInMemoryScrolling`, …) as extra arguments.
191
+ *
192
+ * If you also pass your own `withRouterConfig`, make sure it includes
193
+ * `canceledNavigationResolution: 'computed'` — the dev-mode warning from
194
+ * `BsNavigationLockService` will fire otherwise.
195
+ */
196
+ function provideNavigationLockRouter(routes, ...features) {
197
+ return provideRouter([{ path: '', canMatch: [bsNavigationLockGuard], children: routes }], withRouterConfig({ canceledNavigationResolution: 'computed' }), ...features);
198
+ }
97
199
 
98
200
  /**
99
201
  * Generated bundle index. Do not edit.
100
202
  */
101
203
 
102
- export { BsNavigationLockDirective, BsNavigationLockGuard };
204
+ export { BS_NAVIGATION_LOCK_CONFIRM, BsNavigationLockDirective, BsNavigationLockService, bsNavigationLockGuard, provideNavigationLock, provideNavigationLockRouter };
103
205
  //# sourceMappingURL=mintplayer-ng-bootstrap-navigation-lock.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"mintplayer-ng-bootstrap-navigation-lock.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/navigation-lock/src/guard/navigation-lock.guard.ts","../../../../libs/mintplayer-ng-bootstrap/navigation-lock/src/directive/navigation-lock.directive.ts","../../../../libs/mintplayer-ng-bootstrap/navigation-lock/mintplayer-ng-bootstrap-navigation-lock.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree } from '@angular/router';\nimport { BsHasNavigationLock } from '../interface/has-navigation-lock';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class BsNavigationLockGuard {\n canDeactivate(\n component: BsHasNavigationLock,\n currentRoute: ActivatedRouteSnapshot,\n currentState: RouterStateSnapshot,\n nextState?: RouterStateSnapshot): Promise<boolean | UrlTree> {\n if (component.navigationLock()) {\n return component.navigationLock().requestCanExit();\n } else {\n console.warn('When using <bs-navigation-lock>, you should implement BsHasNavigationLock and add \"readonly navigationLock = viewChild.required<BsNavigationLockDirective>(\\'navigationLock\\');\" to your page');\n return new Promise<boolean>(resolve => resolve(false));\n }\n }\n \n}\n","import { DestroyRef, Directive, inject, input } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { take, Observable } from 'rxjs';\n\n\n/**\n * Places a navigation lock on this page.\n *\n * Don't forget to add the following to your route:\n *\n * ```ts\n * canDeactivate: [BsNavigationLockGuard]\n * ```\n *\n * and implement the `BsHasNavigationLock` on the page:\n *\n * ```ts\n * ViewChild('navigationLock') navigationLock!: BsNavigationLockDirective;\n * ```\n *\n **/\n@Directive({\n selector: '[bsNavigationLock]',\n exportAs: 'bsNavigationLock',\n host: {\n '(window:beforeunload)': 'onBeforeUnload($event)',\n '(window:unload)': 'onUnload($event)',\n },\n})\nexport class BsNavigationLockDirective {\n private router = inject(Router);\n private route = inject(ActivatedRoute);\n private destroy = inject(DestroyRef);\n\n readonly canExit = input<boolean | (() => boolean) | Observable<boolean> | undefined>(undefined);\n readonly exitMessage = input<string | undefined>(undefined);\n\n requestCanExit() {\n const canExit = this.canExit();\n return new Promise<boolean>((resolve, reject) => {\n if (typeof canExit === 'undefined') {\n resolve(true);\n } else if (typeof canExit === 'boolean') {\n resolve(canExit);\n } else if (typeof canExit === 'function') {\n const result = canExit();\n resolve(result);\n } else {\n canExit.pipe(take(1), takeUntilDestroyed(this.destroy))\n .subscribe((result) => resolve(result));\n }\n });\n }\n\n async onBeforeUnload(ev: BeforeUnloadEvent): Promise<string | undefined> {\n const canExit = await this.requestCanExit();\n if (!canExit) {\n ev.preventDefault();\n ev.returnValue = false;\n return 'Are you sure?';\n } else {\n return undefined;\n }\n }\n\n onUnload(ev: Event) {\n\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mintplayer-ng-bootstrap-navigation-lock.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/navigation-lock/src/service/navigation-lock.service.ts","../../../../libs/mintplayer-ng-bootstrap/navigation-lock/src/directive/navigation-lock.directive.ts","../../../../libs/mintplayer-ng-bootstrap/navigation-lock/src/guard/navigation-lock.guard.ts","../../../../libs/mintplayer-ng-bootstrap/navigation-lock/src/providers/navigation-lock.provider.ts","../../../../libs/mintplayer-ng-bootstrap/navigation-lock/mintplayer-ng-bootstrap-navigation-lock.ts"],"sourcesContent":["import { isPlatformBrowser } from '@angular/common';\nimport { DestroyRef, inject, Injectable, InjectionToken, isDevMode, PLATFORM_ID } from '@angular/core';\nimport { ROUTER_CONFIGURATION } from '@angular/router';\nimport { defaultIfEmpty, firstValueFrom, isObservable, Observable, take } from 'rxjs';\nimport { BsNavigationLockHandle } from './navigation-lock-handle';\n\n/** Confirm hook used by the directive's fallback path (canExit undefined + exitMessage set). */\nexport const BS_NAVIGATION_LOCK_CONFIRM = new InjectionToken<\n (message: string) => boolean | Promise<boolean>\n>('BS_NAVIGATION_LOCK_CONFIRM', {\n providedIn: 'root',\n factory: () => (message: string) =>\n typeof window === 'undefined' ? true : window.confirm(message),\n});\n\n@Injectable({ providedIn: 'root' })\nexport class BsNavigationLockService {\n private readonly platformId = inject(PLATFORM_ID);\n private readonly destroy = inject(DestroyRef);\n private readonly locks = new Set<BsNavigationLockHandle>();\n private pending: Promise<boolean> | null = null;\n\n constructor() {\n if (isDevMode()) {\n // canceledNavigationResolution is needed to restore the history stack\n // on popstate-cancel. Default 'replace' loses the popped entry. The\n // value is set via ROUTER_CONFIGURATION (typically through\n // withRouterConfig in provideRouter); read it directly from the token\n // since Router.options is private in the public type.\n const config = inject(ROUTER_CONFIGURATION, { optional: true });\n if (config?.canceledNavigationResolution !== 'computed') {\n console.warn(\n '[BsNavigationLockService] Router.canceledNavigationResolution is not \"computed\". ' +\n 'Pass withRouterConfig({ canceledNavigationResolution: \"computed\" }) to provideRouter ' +\n 'so popstate cancellations restore the history stack correctly.',\n );\n }\n }\n\n if (isPlatformBrowser(this.platformId)) {\n const handler = (ev: BeforeUnloadEvent) => this.onBeforeUnload(ev);\n window.addEventListener('beforeunload', handler);\n this.destroy.onDestroy(() => window.removeEventListener('beforeunload', handler));\n }\n }\n\n /** Internal — called by directive on init. */\n register(lock: BsNavigationLockHandle): void {\n this.locks.add(lock);\n }\n\n /** Internal — called by directive on destroy. */\n unregister(lock: BsNavigationLockHandle): void {\n this.locks.delete(lock);\n }\n\n /**\n * Programmatic check: ask every active lock if exit is OK.\n * Resolves true only when every lock allows exit. Short-circuits on first false.\n *\n * Re-entrant calls while a check is already in flight return the same Promise\n * — only the first `reason` is consulted. This dedups both router-driven\n * fires (e.g. `canMatch` running once) and programmatic call sites that\n * might invoke `requestExit` multiple times in the same tick.\n */\n requestExit(reason?: string): Promise<boolean> {\n if (this.pending) return this.pending;\n this.pending = this.doRequestExit(reason);\n return this.pending;\n }\n\n private async doRequestExit(reason?: string): Promise<boolean> {\n try {\n for (const lock of this.locks) {\n const ok = await this.normalise(lock.requestCanExit(reason));\n if (!ok) return false;\n }\n return true;\n } finally {\n this.pending = null;\n }\n }\n\n private onBeforeUnload(ev: BeforeUnloadEvent): void {\n // PRD §5.4 — sync-first, browser does NOT await async results.\n for (const lock of this.locks) {\n const result = lock.requestCanExit();\n if (typeof result === 'boolean') {\n if (!result) { ev.preventDefault(); ev.returnValue = ''; return; }\n continue;\n }\n // Promise / Observable — safe default: prompt the browser confirm.\n ev.preventDefault();\n ev.returnValue = '';\n return;\n }\n }\n\n private normalise(r: boolean | Promise<boolean> | Observable<boolean>): Promise<boolean> {\n if (typeof r === 'boolean') return Promise.resolve(r);\n if (isObservable(r)) return firstValueFrom(r.pipe(take(1), defaultIfEmpty(true)));\n return r;\n }\n}\n","import { DestroyRef, Directive, inject, input } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { BS_NAVIGATION_LOCK_CONFIRM, BsNavigationLockService } from '../service/navigation-lock.service';\nimport { BsNavigationLockHandle } from '../service/navigation-lock-handle';\n\n/**\n * Marks the host as a navigation-blocker. Drop `[bsNavigationLock]` on a real\n * element (typically the form). Set `[canExit]` to a boolean, function, or\n * Observable. The service consults every active lock on Router navigation\n * (via `bsNavigationLockGuard` registered at the root) and on `beforeunload`.\n *\n * Fallback: if `canExit` is not set but `exitMessage` is, the directive uses\n * the injected `BS_NAVIGATION_LOCK_CONFIRM` hook with that message.\n */\n@Directive({\n selector: '[bsNavigationLock]',\n exportAs: 'bsNavigationLock',\n})\nexport class BsNavigationLockDirective implements BsNavigationLockHandle {\n private readonly destroy = inject(DestroyRef);\n private readonly service = inject(BsNavigationLockService);\n private readonly confirmFn = inject(BS_NAVIGATION_LOCK_CONFIRM);\n\n readonly canExit = input<\n | boolean\n | ((reason?: string) => boolean | Promise<boolean> | Observable<boolean>)\n | Observable<boolean>\n | undefined\n >(undefined);\n readonly exitMessage = input<string | undefined>(undefined);\n\n constructor() {\n this.service.register(this);\n this.destroy.onDestroy(() => this.service.unregister(this));\n }\n\n requestCanExit(reason?: string): boolean | Promise<boolean> | Observable<boolean> {\n const canExit = this.canExit();\n if (canExit === undefined) {\n const msg = this.exitMessage();\n if (msg) return Promise.resolve(this.confirmFn(msg));\n return true;\n }\n if (typeof canExit === 'boolean') return canExit;\n if (typeof canExit === 'function') return canExit(reason);\n return canExit; // Observable<boolean>\n }\n}\n","import { inject } from '@angular/core';\nimport { CanMatchFn } from '@angular/router';\nimport { BsNavigationLockService } from '../service/navigation-lock.service';\n\n/**\n * Functional `canMatch` guard the consumer registers ONCE at the root route:\n *\n * ```ts\n * { path: '', canMatch: [bsNavigationLockGuard], children: [...] }\n * ```\n *\n * `canMatch` is the right Angular guard for \"should this navigation be allowed\n * to start\": it runs once per route-match attempt, regardless of how deeply\n * nested the destination is. (`canActivateChild` would fire once per descendant\n * activation — N prompts for an N-deep destination.)\n *\n * Note: when `canMatch` returns false the router treats the route as not\n * matching; if a sibling route or wildcard fallback matches the destination URL,\n * the user lands there instead of staying put. Most apps don't have a `**`\n * redirect that conflicts; if yours does, additionally guard the wildcard.\n *\n * Programmatic call sites that need a `reason` argument should call\n * `BsNavigationLockService.requestExit(reason)` directly.\n */\nexport const bsNavigationLockGuard: CanMatchFn = () => {\n return inject(BsNavigationLockService).requestExit();\n};\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { provideRouter, RouterFeatures, Routes, withRouterConfig } from '@angular/router';\nimport { bsNavigationLockGuard } from '../guard/navigation-lock.guard';\nimport { BS_NAVIGATION_LOCK_CONFIRM } from '../service/navigation-lock.service';\n\nexport interface NavigationLockOptions {\n confirm?: (message: string) => boolean | Promise<boolean>;\n}\n\n/**\n * Optional provider. Without it, the service is still root-provided and\n * uses `window.confirm` as the default fallback confirm UI.\n */\nexport function provideNavigationLock(opts?: NavigationLockOptions): EnvironmentProviders {\n return makeEnvironmentProviders([\n ...(opts?.confirm\n ? [{ provide: BS_NAVIGATION_LOCK_CONFIRM, useValue: opts.confirm }]\n : []),\n ]);\n}\n\n/**\n * One-call router setup for navigation-lock. Wraps `routes` in a root\n * `{ path: '', canMatch: [bsNavigationLockGuard], children }` entry and\n * applies `canceledNavigationResolution: 'computed'` (required for\n * popstate-cancel to restore the history stack). Pass any additional router\n * features (`withPreloading`, `withInMemoryScrolling`, …) as extra arguments.\n *\n * If you also pass your own `withRouterConfig`, make sure it includes\n * `canceledNavigationResolution: 'computed'` — the dev-mode warning from\n * `BsNavigationLockService` will fire otherwise.\n */\nexport function provideNavigationLockRouter(\n routes: Routes,\n ...features: RouterFeatures[]\n): EnvironmentProviders {\n return provideRouter(\n [{ path: '', canMatch: [bsNavigationLockGuard], children: routes }],\n withRouterConfig({ canceledNavigationResolution: 'computed' }),\n ...features,\n );\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;AAMA;MACa,0BAA0B,GAAG,IAAI,cAAc,CAE1D,4BAA4B,EAAE;AAC9B,IAAA,UAAU,EAAE,MAAM;IAClB,OAAO,EAAE,MAAM,CAAC,OAAe,KAC7B,OAAO,MAAM,KAAK,WAAW,GAAG,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;AACjE,CAAA;MAGY,uBAAuB,CAAA;AAMlC,IAAA,WAAA,GAAA;AALiB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;AAChC,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC;AAC5B,QAAA,IAAA,CAAA,KAAK,GAAG,IAAI,GAAG,EAA0B;QAClD,IAAA,CAAA,OAAO,GAA4B,IAAI;QAG7C,IAAI,SAAS,EAAE,EAAE;;;;;;AAMf,YAAA,MAAM,MAAM,GAAG,MAAM,CAAC,oBAAoB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC/D,YAAA,IAAI,MAAM,EAAE,4BAA4B,KAAK,UAAU,EAAE;gBACvD,OAAO,CAAC,IAAI,CACV,mFAAmF;oBACnF,uFAAuF;AACvF,oBAAA,gEAAgE,CACjE;YACH;QACF;AAEA,QAAA,IAAI,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;AACtC,YAAA,MAAM,OAAO,GAAG,CAAC,EAAqB,KAAK,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;AAClE,YAAA,MAAM,CAAC,gBAAgB,CAAC,cAAc,EAAE,OAAO,CAAC;AAChD,YAAA,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,mBAAmB,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QACnF;IACF;;AAGA,IAAA,QAAQ,CAAC,IAA4B,EAAA;AACnC,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;IACtB;;AAGA,IAAA,UAAU,CAAC,IAA4B,EAAA;AACrC,QAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;IACzB;AAEA;;;;;;;;AAQG;AACH,IAAA,WAAW,CAAC,MAAe,EAAA;QACzB,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC,OAAO;QACrC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;QACzC,OAAO,IAAI,CAAC,OAAO;IACrB;IAEQ,MAAM,aAAa,CAAC,MAAe,EAAA;AACzC,QAAA,IAAI;AACF,YAAA,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE;AAC7B,gBAAA,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;AAC5D,gBAAA,IAAI,CAAC,EAAE;AAAE,oBAAA,OAAO,KAAK;YACvB;AACA,YAAA,OAAO,IAAI;QACb;gBAAU;AACR,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI;QACrB;IACF;AAEQ,IAAA,cAAc,CAAC,EAAqB,EAAA;;AAE1C,QAAA,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE;AAC7B,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE;AACpC,YAAA,IAAI,OAAO,MAAM,KAAK,SAAS,EAAE;gBAC/B,IAAI,CAAC,MAAM,EAAE;oBAAE,EAAE,CAAC,cAAc,EAAE;AAAE,oBAAA,EAAE,CAAC,WAAW,GAAG,EAAE;oBAAE;gBAAQ;gBACjE;YACF;;YAEA,EAAE,CAAC,cAAc,EAAE;AACnB,YAAA,EAAE,CAAC,WAAW,GAAG,EAAE;YACnB;QACF;IACF;AAEQ,IAAA,SAAS,CAAC,CAAmD,EAAA;QACnE,IAAI,OAAO,CAAC,KAAK,SAAS;AAAE,YAAA,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QACrD,IAAI,YAAY,CAAC,CAAC,CAAC;AAAE,YAAA,OAAO,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;AACjF,QAAA,OAAO,CAAC;IACV;+GAtFW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAvB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,cADV,MAAM,EAAA,CAAA,CAAA;;4FACnB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBADnC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACVlC;;;;;;;;AAQG;MAKU,yBAAyB,CAAA;AAapC,IAAA,WAAA,GAAA;AAZiB,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC;AAC5B,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,uBAAuB,CAAC;AACzC,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,0BAA0B,CAAC;AAEtD,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAKtB,SAAS,8EAAC;AACH,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAqB,SAAS,kFAAC;AAGzD,QAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;AAC3B,QAAA,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC7D;AAEA,IAAA,cAAc,CAAC,MAAe,EAAA;AAC5B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;AAC9B,QAAA,IAAI,OAAO,KAAK,SAAS,EAAE;AACzB,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE;AAC9B,YAAA,IAAI,GAAG;gBAAE,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AACpD,YAAA,OAAO,IAAI;QACb;QACA,IAAI,OAAO,OAAO,KAAK,SAAS;AAAE,YAAA,OAAO,OAAO;QAChD,IAAI,OAAO,OAAO,KAAK,UAAU;AAAE,YAAA,OAAO,OAAO,CAAC,MAAM,CAAC;QACzD,OAAO,OAAO,CAAC;IACjB;+GA5BW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAzB,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAAzB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAJrC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,oBAAoB;AAC9B,oBAAA,QAAQ,EAAE,kBAAkB;AAC7B,iBAAA;;;ACbD;;;;;;;;;;;;;;;;;;;AAmBG;AACI,MAAM,qBAAqB,GAAe,MAAK;AACpD,IAAA,OAAO,MAAM,CAAC,uBAAuB,CAAC,CAAC,WAAW,EAAE;AACtD;;ACjBA;;;AAGG;AACG,SAAU,qBAAqB,CAAC,IAA4B,EAAA;AAChE,IAAA,OAAO,wBAAwB,CAAC;QAC9B,IAAI,IAAI,EAAE;AACR,cAAE,CAAC,EAAE,OAAO,EAAE,0BAA0B,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE;cAChE,EAAE,CAAC;AACR,KAAA,CAAC;AACJ;AAEA;;;;;;;;;;AAUG;SACa,2BAA2B,CACzC,MAAc,EACd,GAAG,QAA0B,EAAA;AAE7B,IAAA,OAAO,aAAa,CAClB,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,qBAAqB,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,EACnE,gBAAgB,CAAC,EAAE,4BAA4B,EAAE,UAAU,EAAE,CAAC,EAC9D,GAAG,QAAQ,CACZ;AACH;;ACzCA;;AAEG;;;;"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@mintplayer/ng-bootstrap",
3
3
  "private": false,
4
- "version": "21.23.1",
4
+ "version": "21.24.0",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "https://github.com/MintPlayer/mintplayer-ng-bootstrap",
@@ -107,6 +107,33 @@ declare class BsNavbarContentDirective implements AfterViewInit, OnDestroy {
107
107
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BsNavbarContentDirective, "[bsNavbarContent]", never, { "navbar": { "alias": "bsNavbarContent"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
108
108
  }
109
109
 
110
+ /**
111
+ * Marks a navbar dropdown trigger anchor. Replaces both `routerLink` and
112
+ * `routerLinkActive` on a trigger element: toggles the active CSS class when a
113
+ * sub-route under the bound URL is active, but does NOT navigate on click
114
+ * (which `routerLink` would do via its own host listener, even when other
115
+ * click handlers `preventDefault`).
116
+ *
117
+ * @example
118
+ * ```html
119
+ * <a bsNavbarTrigger="/overlays">Overlays</a>
120
+ * ```
121
+ *
122
+ * Items inside the dropdown panel still use real `[routerLink]`s for
123
+ * navigation. Use this directive only for the trigger anchor that opens the
124
+ * dropdown panel.
125
+ */
126
+ declare class BsNavbarTriggerDirective {
127
+ private router;
128
+ readonly bsNavbarTrigger: _angular_core.InputSignal<string | readonly string[]>;
129
+ private currentUrl;
130
+ private targetUrl;
131
+ readonly isActive: _angular_core.Signal<boolean>;
132
+ constructor();
133
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsNavbarTriggerDirective, never>;
134
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BsNavbarTriggerDirective, "[bsNavbarTrigger]", never, { "bsNavbarTrigger": { "alias": "bsNavbarTrigger"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
135
+ }
136
+
110
137
  declare class BsExpandButtonDirective {
111
138
  constructor();
112
139
  static ngTemplateContextGuard(dir: BsExpandButtonDirective, ctx: any): ctx is BsExpandButtonContext;
@@ -135,4 +162,4 @@ declare class NavLinkDirective {
135
162
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<NavLinkDirective, "bs-navbar-item > li > a", never, {}, {}, never, never, true, never>;
136
163
  }
137
164
 
138
- export { BsExpandButtonContext, BsExpandButtonDirective, BsNavbarBrandComponent, BsNavbarComponent, BsNavbarContentDirective, BsNavbarDropdownComponent, BsNavbarItemComponent, BsNavbarNavComponent, DropdownToggleDirective, NavLinkDirective };
165
+ export { BsExpandButtonContext, BsExpandButtonDirective, BsNavbarBrandComponent, BsNavbarComponent, BsNavbarContentDirective, BsNavbarDropdownComponent, BsNavbarItemComponent, BsNavbarNavComponent, BsNavbarTriggerDirective, DropdownToggleDirective, NavLinkDirective };
@@ -1,57 +1,117 @@
1
- import { ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree } from '@angular/router';
2
1
  import * as i0 from '@angular/core';
3
- import { Signal } from '@angular/core';
2
+ import { InjectionToken, EnvironmentProviders } from '@angular/core';
4
3
  import { Observable } from 'rxjs';
4
+ import { CanMatchFn, Routes, RouterFeatures } from '@angular/router';
5
5
 
6
6
  /**
7
- * Places a navigation lock on this page.
8
- *
9
- * Don't forget to add the following to your route:
10
- *
11
- * ```ts
12
- * canDeactivate: [BsNavigationLockGuard]
13
- * ```
14
- *
15
- * and implement the `BsHasNavigationLock` on the page:
16
- *
17
- * ```ts
18
- * ViewChild('navigationLock') navigationLock!: BsNavigationLockDirective;
19
- * ```
7
+ * Contract a navigation lock implements so the service can consult it.
8
+ * Implemented by `BsNavigationLockDirective`; consumers may also register
9
+ * arbitrary handles via `BsNavigationLockService.register(...)`.
10
+ */
11
+ interface BsNavigationLockHandle {
12
+ /**
13
+ * Returns whether this lock allows exit. May be sync, Promise, or Observable.
14
+ * `reason` is forwarded from `BsNavigationLockService.requestExit(reason)` for
15
+ * programmatic call sites (e.g. `'logout'`); the functional CanActivateChild
16
+ * guard passes `undefined`.
17
+ */
18
+ requestCanExit(reason?: string): boolean | Promise<boolean> | Observable<boolean>;
19
+ /** Optional message shown in the fallback confirm dialog when no `canExit` is set. */
20
+ exitMessage(): string | undefined;
21
+ }
22
+
23
+ /**
24
+ * Marks the host as a navigation-blocker. Drop `[bsNavigationLock]` on a real
25
+ * element (typically the form). Set `[canExit]` to a boolean, function, or
26
+ * Observable. The service consults every active lock on Router navigation
27
+ * (via `bsNavigationLockGuard` registered at the root) and on `beforeunload`.
20
28
  *
21
- **/
22
- declare class BsNavigationLockDirective {
23
- private router;
24
- private route;
25
- private destroy;
26
- readonly canExit: i0.InputSignal<boolean | Observable<boolean> | (() => boolean) | undefined>;
29
+ * Fallback: if `canExit` is not set but `exitMessage` is, the directive uses
30
+ * the injected `BS_NAVIGATION_LOCK_CONFIRM` hook with that message.
31
+ */
32
+ declare class BsNavigationLockDirective implements BsNavigationLockHandle {
33
+ private readonly destroy;
34
+ private readonly service;
35
+ private readonly confirmFn;
36
+ readonly canExit: i0.InputSignal<boolean | Observable<boolean> | ((reason?: string) => boolean | Promise<boolean> | Observable<boolean>) | undefined>;
27
37
  readonly exitMessage: i0.InputSignal<string | undefined>;
28
- requestCanExit(): Promise<boolean>;
29
- onBeforeUnload(ev: BeforeUnloadEvent): Promise<string | undefined>;
30
- onUnload(ev: Event): void;
38
+ constructor();
39
+ requestCanExit(reason?: string): boolean | Promise<boolean> | Observable<boolean>;
31
40
  static ɵfac: i0.ɵɵFactoryDeclaration<BsNavigationLockDirective, never>;
32
41
  static ɵdir: i0.ɵɵDirectiveDeclaration<BsNavigationLockDirective, "[bsNavigationLock]", ["bsNavigationLock"], { "canExit": { "alias": "canExit"; "required": false; "isSignal": true; }; "exitMessage": { "alias": "exitMessage"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
33
42
  }
34
43
 
35
44
  /**
36
- * Implement this interface on pages that use the `<... bsNavigationLock>` directive:
37
- *
38
- * @example
45
+ * Functional `canMatch` guard the consumer registers ONCE at the root route:
39
46
  *
40
47
  * ```ts
41
- * readonly navigationLock = viewChild.required<BsNavigationLockDirective>('navigationLock');
48
+ * { path: '', canMatch: [bsNavigationLockGuard], children: [...] }
42
49
  * ```
43
50
  *
44
- * Don't forget to add the `canDeactivate: [BsNavigationLockGuard]` guard to your page route.
51
+ * `canMatch` is the right Angular guard for "should this navigation be allowed
52
+ * to start": it runs once per route-match attempt, regardless of how deeply
53
+ * nested the destination is. (`canActivateChild` would fire once per descendant
54
+ * activation — N prompts for an N-deep destination.)
55
+ *
56
+ * Note: when `canMatch` returns false the router treats the route as not
57
+ * matching; if a sibling route or wildcard fallback matches the destination URL,
58
+ * the user lands there instead of staying put. Most apps don't have a `**`
59
+ * redirect that conflicts; if yours does, additionally guard the wildcard.
60
+ *
61
+ * Programmatic call sites that need a `reason` argument should call
62
+ * `BsNavigationLockService.requestExit(reason)` directly.
45
63
  */
46
- interface BsHasNavigationLock {
47
- navigationLock: Signal<BsNavigationLockDirective>;
64
+ declare const bsNavigationLockGuard: CanMatchFn;
65
+
66
+ /** Confirm hook used by the directive's fallback path (canExit undefined + exitMessage set). */
67
+ declare const BS_NAVIGATION_LOCK_CONFIRM: InjectionToken<(message: string) => boolean | Promise<boolean>>;
68
+ declare class BsNavigationLockService {
69
+ private readonly platformId;
70
+ private readonly destroy;
71
+ private readonly locks;
72
+ private pending;
73
+ constructor();
74
+ /** Internal — called by directive on init. */
75
+ register(lock: BsNavigationLockHandle): void;
76
+ /** Internal — called by directive on destroy. */
77
+ unregister(lock: BsNavigationLockHandle): void;
78
+ /**
79
+ * Programmatic check: ask every active lock if exit is OK.
80
+ * Resolves true only when every lock allows exit. Short-circuits on first false.
81
+ *
82
+ * Re-entrant calls while a check is already in flight return the same Promise
83
+ * — only the first `reason` is consulted. This dedups both router-driven
84
+ * fires (e.g. `canMatch` running once) and programmatic call sites that
85
+ * might invoke `requestExit` multiple times in the same tick.
86
+ */
87
+ requestExit(reason?: string): Promise<boolean>;
88
+ private doRequestExit;
89
+ private onBeforeUnload;
90
+ private normalise;
91
+ static ɵfac: i0.ɵɵFactoryDeclaration<BsNavigationLockService, never>;
92
+ static ɵprov: i0.ɵɵInjectableDeclaration<BsNavigationLockService>;
48
93
  }
49
94
 
50
- declare class BsNavigationLockGuard {
51
- canDeactivate(component: BsHasNavigationLock, currentRoute: ActivatedRouteSnapshot, currentState: RouterStateSnapshot, nextState?: RouterStateSnapshot): Promise<boolean | UrlTree>;
52
- static ɵfac: i0.ɵɵFactoryDeclaration<BsNavigationLockGuard, never>;
53
- static ɵprov: i0.ɵɵInjectableDeclaration<BsNavigationLockGuard>;
95
+ interface NavigationLockOptions {
96
+ confirm?: (message: string) => boolean | Promise<boolean>;
54
97
  }
98
+ /**
99
+ * Optional provider. Without it, the service is still root-provided and
100
+ * uses `window.confirm` as the default fallback confirm UI.
101
+ */
102
+ declare function provideNavigationLock(opts?: NavigationLockOptions): EnvironmentProviders;
103
+ /**
104
+ * One-call router setup for navigation-lock. Wraps `routes` in a root
105
+ * `{ path: '', canMatch: [bsNavigationLockGuard], children }` entry and
106
+ * applies `canceledNavigationResolution: 'computed'` (required for
107
+ * popstate-cancel to restore the history stack). Pass any additional router
108
+ * features (`withPreloading`, `withInMemoryScrolling`, …) as extra arguments.
109
+ *
110
+ * If you also pass your own `withRouterConfig`, make sure it includes
111
+ * `canceledNavigationResolution: 'computed'` — the dev-mode warning from
112
+ * `BsNavigationLockService` will fire otherwise.
113
+ */
114
+ declare function provideNavigationLockRouter(routes: Routes, ...features: RouterFeatures[]): EnvironmentProviders;
55
115
 
56
- export { BsNavigationLockDirective, BsNavigationLockGuard };
57
- export type { BsHasNavigationLock };
116
+ export { BS_NAVIGATION_LOCK_CONFIRM, BsNavigationLockDirective, BsNavigationLockService, bsNavigationLockGuard, provideNavigationLock, provideNavigationLockRouter };
117
+ export type { BsNavigationLockHandle, NavigationLockOptions };