@mmstack/router-core 19.3.11 → 19.3.13

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.
@@ -144,10 +144,10 @@ function leafRoutes() {
144
144
  }
145
145
  class RouteLeafStore {
146
146
  leaves = leafRoutes();
147
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.3", ngImport: i0, type: RouteLeafStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
148
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.3", ngImport: i0, type: RouteLeafStore, providedIn: 'root' });
147
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: RouteLeafStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
148
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: RouteLeafStore, providedIn: 'root' });
149
149
  }
150
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.3", ngImport: i0, type: RouteLeafStore, decorators: [{
150
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: RouteLeafStore, decorators: [{
151
151
  type: Injectable,
152
152
  args: [{
153
153
  providedIn: 'root',
@@ -283,10 +283,10 @@ class BreadcrumbStore {
283
283
  register(breadcrumb) {
284
284
  this.map.inline((m) => m.set(breadcrumb.id, breadcrumb));
285
285
  }
286
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.3", ngImport: i0, type: BreadcrumbStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
287
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.3", ngImport: i0, type: BreadcrumbStore, providedIn: 'root' });
286
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: BreadcrumbStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
287
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: BreadcrumbStore, providedIn: 'root' });
288
288
  }
289
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.3", ngImport: i0, type: BreadcrumbStore, decorators: [{
289
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: BreadcrumbStore, decorators: [{
290
290
  type: Injectable,
291
291
  args: [{
292
292
  providedIn: 'root',
@@ -359,7 +359,7 @@ function createBasePredicate(path) {
359
359
  if (!configSegmentHasMatrixParams) {
360
360
  return true;
361
361
  }
362
- return Object.entries(configMatrixParams).every(([key, value]) => linkMatrixParams.hasOwnProperty(key) &&
362
+ return Object.entries(configMatrixParams).every(([key, value]) => Object.prototype.hasOwnProperty.call(linkMatrixParams, key) &&
363
363
  linkMatrixParams[key] === value);
364
364
  };
365
365
  });
@@ -381,7 +381,8 @@ function createBasePredicate(path) {
381
381
  };
382
382
  }
383
383
  function singleSegmentMatches(configSegment, linkSegment) {
384
- if (configSegment.pathPart.startsWith(':')) {
384
+ if (configSegment.pathPart === ':') {
385
+ return true;
385
386
  }
386
387
  else if (configSegment.pathPart !== linkSegment.pathPart) {
387
388
  return false;
@@ -389,7 +390,7 @@ function singleSegmentMatches(configSegment, linkSegment) {
389
390
  const configMatrix = configSegment.matrixParams;
390
391
  const linkMatrix = linkSegment.matrixParams;
391
392
  for (const key in configMatrix) {
392
- if (!linkMatrix.hasOwnProperty(key) ||
393
+ if (!Object.prototype.hasOwnProperty.call(linkMatrix, key) ||
393
394
  linkMatrix[key] !== configMatrix[key]) {
394
395
  return false;
395
396
  }
@@ -570,16 +571,16 @@ function createBreadcrumb(factory) {
570
571
  };
571
572
  }
572
573
 
573
- class PreloadService {
574
+ class PreloadRequester {
574
575
  preloadOnDemand$ = new Subject();
575
576
  preloadRequested$ = this.preloadOnDemand$.asObservable();
576
577
  startPreload(routePath) {
577
578
  this.preloadOnDemand$.next(routePath);
578
579
  }
579
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.3", ngImport: i0, type: PreloadService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
580
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.3", ngImport: i0, type: PreloadService, providedIn: 'root' });
580
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: PreloadRequester, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
581
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: PreloadRequester, providedIn: 'root' });
581
582
  }
582
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.3", ngImport: i0, type: PreloadService, decorators: [{
583
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: PreloadRequester, decorators: [{
583
584
  type: Injectable,
584
585
  args: [{ providedIn: 'root' }]
585
586
  }] });
@@ -609,7 +610,7 @@ function noPreload(route) {
609
610
  class PreloadStrategy {
610
611
  loading = new Set();
611
612
  router = inject(Router);
612
- svc = inject(PreloadService);
613
+ req = inject(PreloadRequester);
613
614
  preload(route, load) {
614
615
  if (noPreload(route) || hasSlowConnection())
615
616
  return EMPTY;
@@ -617,12 +618,12 @@ class PreloadStrategy {
617
618
  if (this.loading.has(fp))
618
619
  return EMPTY;
619
620
  const predicate = createRoutePredicate(fp);
620
- return this.svc.preloadRequested$.pipe(filter$1((path) => path === fp || predicate(path)), take(1), switchMap(() => load()), finalize(() => this.loading.delete(fp)));
621
+ return this.req.preloadRequested$.pipe(filter$1((path) => path === fp || predicate(path)), take(1), switchMap(() => load()), finalize(() => this.loading.delete(fp)));
621
622
  }
622
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.3", ngImport: i0, type: PreloadStrategy, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
623
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.3", ngImport: i0, type: PreloadStrategy, providedIn: 'root' });
623
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: PreloadStrategy, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
624
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: PreloadStrategy, providedIn: 'root' });
624
625
  }
625
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.3", ngImport: i0, type: PreloadStrategy, decorators: [{
626
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: PreloadStrategy, decorators: [{
626
627
  type: Injectable,
627
628
  args: [{
628
629
  providedIn: 'root',
@@ -650,14 +651,14 @@ function treeToSerializedUrl(router, urlTree) {
650
651
  return router.serializeUrl(urlTree);
651
652
  }
652
653
  function injectTriggerPreload() {
653
- const svc = inject(PreloadService);
654
+ const req = inject(PreloadRequester);
654
655
  const router = inject(Router);
655
656
  return (link, relativeTo, queryParams, fragment, queryParamsHandling) => {
656
657
  const urlTree = inputToUrlTree(router, link, relativeTo, queryParams, fragment, queryParamsHandling);
657
658
  const fullPath = treeToSerializedUrl(router, urlTree);
658
659
  if (!fullPath)
659
660
  return;
660
- svc.startPreload(fullPath);
661
+ req.startPreload(fullPath);
661
662
  };
662
663
  }
663
664
  const configToken = new InjectionToken('MMSTACK_LINK_CONFIG');
@@ -672,12 +673,20 @@ function provideMMLinkDefaultConfig(config) {
672
673
  useValue: cfg,
673
674
  };
674
675
  }
675
- class LinkDirective {
676
+ function injectConfig() {
677
+ const cfg = inject(configToken, { optional: true });
678
+ return {
679
+ preloadOn: 'hover',
680
+ useMouseDown: false,
681
+ ...cfg,
682
+ };
683
+ }
684
+ class Link {
676
685
  routerLink = inject(RouterLink, {
677
686
  self: true,
678
687
  optional: true,
679
688
  }) ?? inject(RouterLinkWithHref, { self: true, optional: true });
680
- svc = inject(PreloadService);
689
+ req = inject(PreloadRequester);
681
690
  router = inject(Router);
682
691
  target = input();
683
692
  queryParams = input();
@@ -689,10 +698,11 @@ class LinkDirective {
689
698
  skipLocationChange = input(false, { transform: booleanAttribute });
690
699
  replaceUrl = input(false, { transform: booleanAttribute });
691
700
  mmLink = input(null);
692
- preloadOn = input(inject(configToken).preloadOn);
693
- useMouseDown = input(inject(configToken).useMouseDown, {
701
+ preloadOn = input(injectConfig().preloadOn);
702
+ useMouseDown = input(injectConfig().useMouseDown, {
694
703
  transform: booleanAttribute,
695
704
  });
705
+ beforeNavigate = input();
696
706
  preloading = output();
697
707
  urlTree = computed(() => {
698
708
  return inputToUrlTree(this.router, this.mmLink(), this.relativeTo(), this.queryParams(), this.fragment(), this.queryParamsHandling(), this.routerLink?.urlTree);
@@ -728,16 +738,17 @@ class LinkDirective {
728
738
  const fp = untracked(this.fullPath);
729
739
  if (!this.routerLink || !fp)
730
740
  return;
731
- this.svc.startPreload(fp);
741
+ this.req.startPreload(fp);
732
742
  this.preloading.emit();
733
743
  }
734
744
  trigger(button, ctrlKey, shiftKey, altKey, metaKey) {
745
+ untracked(this.beforeNavigate)?.();
735
746
  return this.routerLink?.onClick(button, ctrlKey, shiftKey, altKey, metaKey);
736
747
  }
737
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.3", ngImport: i0, type: LinkDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
738
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.2.3", type: LinkDirective, isStandalone: true, selector: "[mmLink]", inputs: { target: { classPropertyName: "target", publicName: "target", isSignal: true, isRequired: false, transformFunction: null }, queryParams: { classPropertyName: "queryParams", publicName: "queryParams", isSignal: true, isRequired: false, transformFunction: null }, fragment: { classPropertyName: "fragment", publicName: "fragment", isSignal: true, isRequired: false, transformFunction: null }, queryParamsHandling: { classPropertyName: "queryParamsHandling", publicName: "queryParamsHandling", isSignal: true, isRequired: false, transformFunction: null }, state: { classPropertyName: "state", publicName: "state", isSignal: true, isRequired: false, transformFunction: null }, info: { classPropertyName: "info", publicName: "info", isSignal: true, isRequired: false, transformFunction: null }, relativeTo: { classPropertyName: "relativeTo", publicName: "relativeTo", isSignal: true, isRequired: false, transformFunction: null }, skipLocationChange: { classPropertyName: "skipLocationChange", publicName: "skipLocationChange", isSignal: true, isRequired: false, transformFunction: null }, replaceUrl: { classPropertyName: "replaceUrl", publicName: "replaceUrl", isSignal: true, isRequired: false, transformFunction: null }, mmLink: { classPropertyName: "mmLink", publicName: "mmLink", isSignal: true, isRequired: false, transformFunction: null }, preloadOn: { classPropertyName: "preloadOn", publicName: "preloadOn", isSignal: true, isRequired: false, transformFunction: null }, useMouseDown: { classPropertyName: "useMouseDown", publicName: "useMouseDown", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { preloading: "preloading" }, host: { listeners: { "mouseenter": "onHover()", "mousedown": "onMouseDown($event.button,$event.ctrlKey,$event.shiftKey,$event.altKey,$event.metaKey)", "click": "onClick($event.button,$event.ctrlKey,$event.shiftKey,$event.altKey,$event.metaKey)" } }, exportAs: ["mmLink"], hostDirectives: [{ directive: i1.RouterLink, inputs: ["routerLink", "mmLink", "target", "target", "queryParams", "queryParams", "fragment", "fragment", "queryParamsHandling", "queryParamsHandling", "state", "state", "relativeTo", "relativeTo", "skipLocationChange", "skipLocationChange", "replaceUrl", "replaceUrl"] }], ngImport: i0 });
748
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: Link, deps: [], target: i0.ɵɵFactoryTarget.Directive });
749
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.2.19", type: Link, isStandalone: true, selector: "[mmLink]", inputs: { target: { classPropertyName: "target", publicName: "target", isSignal: true, isRequired: false, transformFunction: null }, queryParams: { classPropertyName: "queryParams", publicName: "queryParams", isSignal: true, isRequired: false, transformFunction: null }, fragment: { classPropertyName: "fragment", publicName: "fragment", isSignal: true, isRequired: false, transformFunction: null }, queryParamsHandling: { classPropertyName: "queryParamsHandling", publicName: "queryParamsHandling", isSignal: true, isRequired: false, transformFunction: null }, state: { classPropertyName: "state", publicName: "state", isSignal: true, isRequired: false, transformFunction: null }, info: { classPropertyName: "info", publicName: "info", isSignal: true, isRequired: false, transformFunction: null }, relativeTo: { classPropertyName: "relativeTo", publicName: "relativeTo", isSignal: true, isRequired: false, transformFunction: null }, skipLocationChange: { classPropertyName: "skipLocationChange", publicName: "skipLocationChange", isSignal: true, isRequired: false, transformFunction: null }, replaceUrl: { classPropertyName: "replaceUrl", publicName: "replaceUrl", isSignal: true, isRequired: false, transformFunction: null }, mmLink: { classPropertyName: "mmLink", publicName: "mmLink", isSignal: true, isRequired: false, transformFunction: null }, preloadOn: { classPropertyName: "preloadOn", publicName: "preloadOn", isSignal: true, isRequired: false, transformFunction: null }, useMouseDown: { classPropertyName: "useMouseDown", publicName: "useMouseDown", isSignal: true, isRequired: false, transformFunction: null }, beforeNavigate: { classPropertyName: "beforeNavigate", publicName: "beforeNavigate", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { preloading: "preloading" }, host: { listeners: { "mouseenter": "onHover()", "mousedown": "onMouseDown($event.button,$event.ctrlKey,$event.shiftKey,$event.altKey,$event.metaKey)", "click": "onClick($event.button,$event.ctrlKey,$event.shiftKey,$event.altKey,$event.metaKey)" } }, exportAs: ["mmLink"], hostDirectives: [{ directive: i1.RouterLink, inputs: ["routerLink", "mmLink", "target", "target", "queryParams", "queryParams", "fragment", "fragment", "queryParamsHandling", "queryParamsHandling", "state", "state", "relativeTo", "relativeTo", "skipLocationChange", "skipLocationChange", "replaceUrl", "replaceUrl"] }], ngImport: i0 });
739
750
  }
740
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.3", ngImport: i0, type: LinkDirective, decorators: [{
751
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: Link, decorators: [{
741
752
  type: Directive,
742
753
  args: [{
743
754
  selector: '[mmLink]',
@@ -858,8 +869,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.3", ngImpor
858
869
  * }
859
870
  * ```
860
871
  */
861
- function queryParam(key) {
862
- const route = inject(ActivatedRoute);
872
+ function queryParam(key, route = inject(ActivatedRoute)) {
863
873
  const router = inject(Router);
864
874
  const keySignal = typeof key === 'string'
865
875
  ? computed(() => key)
@@ -944,10 +954,10 @@ class TitleStore {
944
954
  register(id, titleFn) {
945
955
  this.map.inline((m) => m.set(id, titleFn));
946
956
  }
947
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.3", ngImport: i0, type: TitleStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
948
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.3", ngImport: i0, type: TitleStore, providedIn: 'root' });
957
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: TitleStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
958
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: TitleStore, providedIn: 'root' });
949
959
  }
950
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.3", ngImport: i0, type: TitleStore, decorators: [{
960
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: TitleStore, decorators: [{
951
961
  type: Injectable,
952
962
  args: [{
953
963
  providedIn: 'root',
@@ -985,5 +995,5 @@ function createTitle(fn, awaitValue = false) {
985
995
  * Generated bundle index. Do not edit.
986
996
  */
987
997
 
988
- export { LinkDirective, PreloadStrategy, createBreadcrumb, createTitle, injectBreadcrumbs, injectTriggerPreload, provideBreadcrumbConfig, provideMMLinkDefaultConfig, provideTitleConfig, queryParam, url };
998
+ export { Link, PreloadStrategy, createBreadcrumb, createTitle, injectBreadcrumbs, injectTriggerPreload, provideBreadcrumbConfig, provideMMLinkDefaultConfig, provideTitleConfig, queryParam, url };
989
999
  //# sourceMappingURL=mmstack-router-core.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"mmstack-router-core.mjs","sources":["../../../../../packages/router/core/src/lib/breadcrumb/breadcrumb.config.ts","../../../../../packages/router/core/src/lib/url.ts","../../../../../packages/router/core/src/lib/util/leaf.store.ts","../../../../../packages/router/core/src/lib/breadcrumb/breadcrumb.type.ts","../../../../../packages/router/core/src/lib/breadcrumb/breadcrumb.store.ts","../../../../../packages/router/core/src/lib/util/create-route-predicate.ts","../../../../../packages/router/core/src/lib/util/find-path.ts","../../../../../packages/router/core/src/lib/util/snapshot-path.ts","../../../../../packages/router/core/src/lib/breadcrumb/breadcrumb.resolver.ts","../../../../../packages/router/core/src/lib/preloading/preload.service.ts","../../../../../packages/router/core/src/lib/preloading/preload.strategy.ts","../../../../../packages/router/core/src/lib/link.directive.ts","../../../../../packages/router/core/src/lib/query-param.ts","../../../../../packages/router/core/src/lib/title/title.config.ts","../../../../../packages/router/core/src/lib/title/title.store.ts","../../../../../packages/router/core/src/mmstack-router-core.ts"],"sourcesContent":["import { inject, InjectionToken } from '@angular/core';\nimport { ResolvedLeafRoute } from '../util';\n\n/**\n * A function that returns a custom label generation function.\n * The outer function is called in a root injection context\n * The returned function takes a `ResolvedLeafRoute` and produces a string label for the breadcrumb.\n * As the inner function is wrapped in a computed, changes to signals called within it will update the breadcrumb label reactively.\n */\ntype GenerateBreadcrumbFn = () => (leaf: ResolvedLeafRoute) => string;\n\n/**\n * Configuration options for the breadcrumb system.\n * Use `provideBreadcrumbConfig` to supply these options to your application.\n */\n\nexport type BreadcrumbConfig = {\n /**\n * Defines how breadcrumb labels are generated.\n * - If set to `'manual'`, breadcrumbs will only be displayed if manually registered\n * via `createBreadcrumb`. Automatic generation based on routes is disabled.\n * - Alternatively provide a custom label generation function\n * If left undefined, the system will automatically generate labels based on the route's title, data, or path.\n * @see GenerateBreadcrumbFn\n * @example\n * ```typescript\n * // For custom label generation:\n * // const myCustomLabelGenerator = () => (leaf: ResolvedLeafRoute) => {\n * // return leaf.route.data?.['customTitle'] || leaf.route.routeConfig?.path || 'Default';\n * // };\n * //\n * // config: { generation: myCustomLabelGenerator }\n * ```\n */\n generation?: 'manual' | GenerateBreadcrumbFn;\n};\n\n/**\n * @internal\n */\nconst token = new InjectionToken<BreadcrumbConfig>('MMSTACK_BREADCRUMB_CONFIG');\n\n/**\n * Provides configuration for the breadcrumb system.\n * @param config - A partial `BreadcrumbConfig` object with the desired settings. *\n * @see BreadcrumbConfig\n * @example\n * ```typescript\n * // In your app.module.ts or a standalone component's providers:\n * // import { provideBreadcrumbConfig } from './breadcrumb.config'; // Adjust path\n * // import { ResolvedLeafRoute } from './breadcrumb.type'; // Adjust path\n *\n * // const customLabelStrategy: GenerateBreadcrumbFn = () => {\n * // return (leaf: ResolvedLeafRoute): string => {\n * // // Example: Prioritize a 'navTitle' data property\n * // if (leaf.route.data?.['navTitle']) {\n * // return leaf.route.data['navTitle'];\n * // }\n * // // Fallback to a default mechanism\n * // return leaf.route.title || leaf.segment.resolved || 'Unnamed';\n * // };\n * // };\n *\n * export const appConfig = [\n * // ...rest\n * provideBreadcrumbConfig({\n * generation: customLabelStrategy, // or 'manual' to disable auto-generation\n * }),\n * ]\n * ```\n */\nexport function provideBreadcrumbConfig(config: Partial<BreadcrumbConfig>) {\n return {\n provide: token,\n useValue: {\n ...config,\n },\n };\n}\n\n/**\n * @internal\n */\nexport function injectBreadcrumbConfig(): BreadcrumbConfig {\n return (\n inject(token, {\n optional: true,\n }) ?? {}\n );\n}\n","import { inject, type Signal } from '@angular/core';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport {\r\n type Event,\r\n EventType,\r\n type NavigationEnd,\r\n Router,\r\n} from '@angular/router';\r\nimport { filter, map } from 'rxjs/operators';\r\n\r\n/**\r\n * Type guard to check if a Router Event is a NavigationEnd event.\r\n * @internal\r\n */\r\nfunction isNavigationEnd(e: Event): e is NavigationEnd {\r\n return 'type' in e && e.type === EventType.NavigationEnd;\r\n}\r\n\r\n/**\r\n * Creates a Signal that tracks the current router URL.\r\n *\r\n * The signal emits the URL string reflecting the router state *after* redirects\r\n * have completed for each successful navigation. It initializes with the router's\r\n * current URL state.\r\n *\r\n * @returns {Signal<string>} A Signal emitting the `urlAfterRedirects` upon successful navigation.\r\n *\r\n * @example\r\n * ```ts\r\n * import { Component, effect } from '@angular/core';\r\n * import { url } from '@mmstack/router-core'; // Adjust import path\r\n *\r\n * @Component({\r\n * selector: 'app-root',\r\n * template: `Current URL: {{ currentUrl() }}`\r\n * })\r\n * export class AppComponent {\r\n * currentUrl = url();\r\n *\r\n * constructor() {\r\n * effect(() => {\r\n * console.log('Navigation ended. New URL:', this.currentUrl());\r\n * // e.g., track page view with analytics\r\n * });\r\n * }\r\n * }\r\n * ```\r\n */\r\nexport function url(): Signal<string> {\r\n const router = inject(Router);\r\n\r\n return toSignal(\r\n router.events.pipe(\r\n filter(isNavigationEnd),\r\n map((e) => e.urlAfterRedirects),\r\n ),\r\n {\r\n initialValue: router.url,\r\n },\r\n );\r\n}\r\n","import { computed, inject, Injectable, Signal } from '@angular/core';\nimport {\n ActivatedRouteSnapshot,\n Router,\n RouterStateSnapshot,\n} from '@angular/router';\nimport { url } from '../url';\n\n/**\n * @internal\n */\nexport type ResolvedLeafRoute = {\n route: ActivatedRouteSnapshot;\n segment: {\n path: string;\n resolved: string;\n };\n path: string;\n link: string;\n};\n\nfunction leafRoutes(): Signal<ResolvedLeafRoute[]> {\n const router = inject(Router);\n\n const getLeafRoutes = (\n snapshot: RouterStateSnapshot,\n ): ResolvedLeafRoute[] => {\n const routes: ResolvedLeafRoute[] = [];\n let route: ActivatedRouteSnapshot | null = snapshot.root;\n const processed = new Set<string>();\n\n while (route) {\n const allSegments = route.pathFromRoot.flatMap(\n (snap) => snap.routeConfig?.path ?? [],\n );\n\n const segments = allSegments.filter(Boolean);\n\n const path = router.serializeUrl(router.parseUrl(segments.join('/')));\n\n if (processed.has(path)) {\n route = route.firstChild;\n continue;\n }\n processed.add(path);\n\n const parts = route.pathFromRoot\n .flatMap((snap) => snap.url ?? [])\n .map((u) => u.path)\n .filter(Boolean);\n\n const link = router.serializeUrl(router.parseUrl(parts.join('/')));\n\n routes.push({\n route,\n segment: {\n path: segments.at(-1) ?? '',\n resolved: parts.at(-1) ?? '',\n },\n path,\n link,\n });\n route = route.firstChild;\n }\n\n return routes;\n };\n\n const currentUrl = url();\n\n const leafRoutes = computed(() => {\n currentUrl();\n return getLeafRoutes(router.routerState.snapshot);\n });\n\n return leafRoutes;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class RouteLeafStore {\n readonly leaves = leafRoutes();\n}\n\nexport function injectLeafRoutes() {\n const store = inject(RouteLeafStore);\n return store.leaves;\n}\n","import { type Signal } from '@angular/core';\n\n/**\n * Represents a single breadcrumb item within the navigation path.\n * All dynamic properties are represented as Angular Signals to enable reactivity.\n */\nexport type Breadcrumb = {\n /**\n * A unique identifier for the breadcrumb item. Generally the unresolved path for example `/posts/:id`.\n * Useful for `@for` tracking in templates.\n */\n id: string;\n /**\n * The visible text for the breadcrumb item.\n * Updated reactively as the url/link based on\n * either a provided definition, or the current route.\n */\n label: Signal<string>;\n /**\n * An accessible label for the breadcrumb item.\n * Defaults to the same value as `label` if not provided.\n */\n ariaLabel: Signal<string>;\n /**\n * The URL link for the breadcrumb item.\n * Updates as the route changes.\n */\n link: Signal<string>;\n};\n\n/**\n * @internal\n */\nconst INTERNAL_BREADCRUMB_SYMBOL = Symbol.for('MMSTACK_INTERNAL_BREADCRUMB');\n\n/**\n * @internal\n */\nexport type InternalBreadcrumb = Breadcrumb & {\n [INTERNAL_BREADCRUMB_SYMBOL]: {\n active: Signal<boolean>;\n registered: boolean;\n };\n};\n\n/**\n * @internal\n */\nexport function getBreadcrumbInternals(breadcrumb: InternalBreadcrumb) {\n return (breadcrumb as InternalBreadcrumb)[INTERNAL_BREADCRUMB_SYMBOL];\n}\n\n/**\n * @internal\n */\nexport function createInternalBreadcrumb(\n bc: Breadcrumb,\n active: Signal<boolean>,\n registered = true,\n): InternalBreadcrumb {\n return {\n ...bc,\n [INTERNAL_BREADCRUMB_SYMBOL]: {\n active,\n registered,\n },\n };\n}\n\n/**\n * @internal\n */\nexport function isInternalBreadcrumb(\n breadcrumb: Breadcrumb | InternalBreadcrumb,\n): breadcrumb is InternalBreadcrumb {\n return !!(breadcrumb as InternalBreadcrumb)[INTERNAL_BREADCRUMB_SYMBOL];\n}\n","import { computed, inject, Injectable, Signal } from '@angular/core';\nimport { mapArray, mutable } from '@mmstack/primitives';\nimport { injectLeafRoutes, ResolvedLeafRoute } from '../util/leaf.store';\nimport { injectBreadcrumbConfig } from './breadcrumb.config';\nimport {\n Breadcrumb,\n createInternalBreadcrumb,\n getBreadcrumbInternals,\n InternalBreadcrumb,\n isInternalBreadcrumb,\n} from './breadcrumb.type';\n\nfunction uppercaseFirst(str: string): string {\n const lcs = str.toLowerCase();\n return lcs.charAt(0).toUpperCase() + lcs.slice(1);\n}\n\nfunction removeMatrixAndQueryParams(path: string): string {\n const [cleanPath] = path.split(';');\n return cleanPath.split('?')[0];\n}\n\nfunction parsePathSegment(pathSegment: string): string {\n return pathSegment\n .split('/')\n .flatMap((part) => part.split('.'))\n .flatMap((part) => part.split('-'))\n .map((part) => uppercaseFirst(removeMatrixAndQueryParams(part)))\n .join(' ');\n}\n\nfunction generateLabel(leaf: ResolvedLeafRoute): string {\n const title = leaf.route.title ?? leaf.route.data?.['title'];\n\n if (title && typeof title === 'string') return title;\n if (leaf.segment.path.includes(':')) return leaf.segment.resolved;\n\n return parsePathSegment(leaf.segment.path);\n}\n\nfunction autoGenerateBreadcrumb(\n id: string,\n leaf: Signal<ResolvedLeafRoute>,\n autoGenerateFn: Signal<(leaf: ResolvedLeafRoute) => string>,\n): Breadcrumb {\n const label = computed(() => autoGenerateFn()(leaf()));\n\n return createInternalBreadcrumb(\n {\n id,\n label,\n ariaLabel: label,\n link: computed(() => leaf().link),\n },\n computed(\n () =>\n leaf().route.data?.['skipBreadcrumb'] !== true &&\n id !== '' &&\n id !== '/' &&\n leaf().segment.path !== '' &&\n leaf().segment.path !== '/' &&\n !leaf().segment.path.endsWith('/') &&\n !!label(),\n ),\n );\n}\n\nfunction injectGenerateLabelFn() {\n const { generation } = injectBreadcrumbConfig();\n\n if (typeof generation !== 'function') return computed(() => generateLabel);\n\n const provided = generation();\n return computed(() => provided);\n}\n\nfunction injectIsManual() {\n return injectBreadcrumbConfig().generation === 'manual';\n}\n\nfunction exposeActiveSignal(\n crumbSignal: Signal<Breadcrumb>,\n manual: boolean,\n): Signal<Breadcrumb> & {\n active: Signal<boolean>;\n} {\n const active = manual\n ? computed(() => {\n const crumb = crumbSignal();\n\n return (\n isInternalBreadcrumb(crumb) &&\n getBreadcrumbInternals(crumb).registered &&\n getBreadcrumbInternals(crumb).active()\n );\n })\n : computed(() => {\n const crumb = crumbSignal();\n if (!isInternalBreadcrumb(crumb)) return true;\n return getBreadcrumbInternals(crumb).active();\n });\n\n const sig = crumbSignal as Signal<Breadcrumb> & {\n active: Signal<boolean>;\n };\n\n sig.active = active;\n\n return sig;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class BreadcrumbStore {\n private readonly map = mutable<Map<string, InternalBreadcrumb>>(new Map());\n private readonly isManual = injectIsManual();\n private readonly autoGenerateLabelFn = injectGenerateLabelFn();\n private readonly leafRoutes = injectLeafRoutes();\n\n private readonly all = mapArray(\n this.leafRoutes,\n (leaf) => {\n const stableId = computed(() => leaf().path);\n\n return exposeActiveSignal(\n computed(\n () => {\n const id = stableId();\n\n const found = this.map().get(id);\n\n if (!found)\n return autoGenerateBreadcrumb(id, leaf, this.autoGenerateLabelFn);\n\n if (!id.includes(':')) return found;\n\n return {\n ...found,\n link: computed(() => leaf().link),\n };\n },\n {\n equal: (a, b) => a.id === b.id,\n },\n ),\n this.isManual,\n );\n },\n {\n equal: (a, b) => a.link === b.link,\n },\n );\n\n private readonly crumbs = computed((): Signal<Breadcrumb>[] =>\n this.all().filter((c) => c.active()),\n );\n\n readonly unwrapped = computed(() => this.crumbs().map((c) => c()));\n\n register(breadcrumb: InternalBreadcrumb) {\n this.map.inline((m) => m.set(breadcrumb.id, breadcrumb));\n }\n}\n\n/**\n * Injects and provides access to a reactive list of breadcrumbs.\n *\n * The breadcrumbs are ordered and reflect the current active navigation path.\n * @see Breadcrumb\n * @returns `Signal<Breadcrumb[]>`\n *\n * @example\n * ```typescript\n * @Component({\n * selector: 'app-breadcrumbs',\n * template: `\n * <nav aria-label=\"breadcrumb\">\n * <ol>\n * @for (crumb of breadcrumbs(); track crumb.id) {\n * <li>\n * <a [href]=\"crumb.link()\" [attr.aria-label]=\"crumb.ariaLabel()\">{{ crumb.label() }}</a>\n * </li>\n * }\n * </ol>\n * </nav>\n * `\n * })\n * export class MyBreadcrumbsComponent {\n * breadcrumbs = injectBreadcrumbs();\n * }\n * ```\n */\nexport function injectBreadcrumbs() {\n const store = inject(BreadcrumbStore);\n return store.unwrapped;\n}\n","function parsePathSegment(segmentString: string): {\n pathPart: string;\n matrixParams: Record<string, string>;\n} {\n const parts = segmentString.split(';');\n const pathPart = parts[0];\n const matrixParams: Record<string, string> = {};\n for (let i = 1; i < parts.length; i++) {\n const [key, value = 'true'] = parts[i].split('=');\n if (key) {\n matrixParams[key] = value;\n }\n }\n return { pathPart, matrixParams };\n}\n\nfunction createBasePredicate(path: string): (path: string) => boolean {\n const partPredicates = path\n .split('/')\n .filter((part) => !!part.trim())\n .map((configSegmentString) => {\n const { pathPart: configPathPart, matrixParams: configMatrixParams } =\n parsePathSegment(configSegmentString);\n\n let singlePathPartPredicate: (linkSegmentPathPart: string) => boolean;\n if (configPathPart.startsWith(':')) {\n singlePathPartPredicate = () => true;\n } else {\n singlePathPartPredicate = (linkSegmentPathPart: string) =>\n linkSegmentPathPart === configPathPart;\n }\n\n const configSegmentHasMatrixParams =\n Object.keys(configMatrixParams).length > 0;\n\n return (linkSegmentString: string) => {\n const { pathPart: linkPathPart, matrixParams: linkMatrixParams } =\n parsePathSegment(linkSegmentString);\n\n if (!singlePathPartPredicate(linkPathPart)) {\n return false;\n }\n\n if (!configSegmentHasMatrixParams) {\n return true;\n }\n\n return Object.entries(configMatrixParams).every(\n ([key, value]) =>\n linkMatrixParams.hasOwnProperty(key) &&\n linkMatrixParams[key] === value,\n );\n };\n });\n\n return (path: string) => {\n const linkPathOnly = path.split(/[?#]/).at(0) ?? '';\n if (!linkPathOnly && partPredicates.length > 0) return false;\n if (!linkPathOnly && partPredicates.length === 0) return true;\n\n const parts = linkPathOnly.split('/').filter((part) => !!part.trim());\n if (parts.length < partPredicates.length) return false;\n\n return parts.every((seg, idx) => {\n const pred = partPredicates.at(idx);\n if (!pred) return true;\n return pred(seg);\n });\n };\n}\n\ntype ParsedSegment = {\n pathPart: string;\n matrixParams: Record<string, string>;\n};\n\nfunction singleSegmentMatches(\n configSegment: ParsedSegment,\n linkSegment: ParsedSegment,\n): boolean {\n if (configSegment.pathPart.startsWith(':')) {\n } else if (configSegment.pathPart !== linkSegment.pathPart) {\n return false;\n }\n\n const configMatrix = configSegment.matrixParams;\n const linkMatrix = linkSegment.matrixParams;\n for (const key in configMatrix) {\n if (\n !linkMatrix.hasOwnProperty(key) ||\n linkMatrix[key] !== configMatrix[key]\n ) {\n return false;\n }\n }\n return true;\n}\n\nfunction matchSegmentsRecursive(\n configSegments: ParsedSegment[],\n linkSegments: ParsedSegment[],\n configIdx: number,\n linkIdx: number,\n): boolean {\n if (configIdx === configSegments.length) {\n return linkIdx === linkSegments.length;\n }\n\n if (linkIdx === linkSegments.length) {\n for (let i = configIdx; i < configSegments.length; i++) {\n if (configSegments[i].pathPart !== '**') {\n return false;\n }\n }\n return true;\n }\n\n const currentConfigSegment = configSegments[configIdx];\n\n if (currentConfigSegment.pathPart === '**') {\n if (\n matchSegmentsRecursive(\n configSegments,\n linkSegments,\n configIdx + 1,\n linkIdx,\n )\n ) {\n return true;\n }\n\n if (linkIdx < linkSegments.length) {\n if (\n matchSegmentsRecursive(\n configSegments,\n linkSegments,\n configIdx,\n linkIdx + 1,\n )\n ) {\n return true;\n }\n }\n\n return false;\n } else {\n if (\n linkIdx < linkSegments.length &&\n singleSegmentMatches(currentConfigSegment, linkSegments[linkIdx])\n ) {\n return matchSegmentsRecursive(\n configSegments,\n linkSegments,\n configIdx + 1,\n linkIdx + 1,\n );\n }\n\n return false;\n }\n}\n\nfunction createWildcardPredicate(path: string): (linkPath: string) => boolean {\n const configSegments = path\n .split('/')\n .filter((p) => !!p.trim())\n .map((segment) => parsePathSegment(segment));\n\n return (linkPath: string): boolean => {\n const linkPathOnly = linkPath.split(/[?#]/).at(0) ?? '';\n const linkSegments = linkPathOnly\n .split('/')\n .filter((p) => !!p.trim())\n .map((segment) => parsePathSegment(segment));\n\n return matchSegmentsRecursive(configSegments, linkSegments, 0, 0);\n };\n}\n\nexport function createRoutePredicate(\n path: string,\n): (linkPath: string) => boolean {\n return path.includes('**')\n ? createWildcardPredicate(path)\n : createBasePredicate(path);\n}\n","// The following functions are adapted from ngx-quicklink,\n// (https://github.com/mgechev/ngx-quicklink)\n// Copyright (c) Minko Gechev and contributors, licensed under the MIT License.\n\nimport { PRIMARY_OUTLET, Route } from '@angular/router';\n\nfunction isPrimaryRoute(route: Route): boolean {\n return route.outlet === PRIMARY_OUTLET || !route.outlet;\n}\n\nexport const findPath = (config: Route[], route: Route): string => {\n const configQueue = config.slice();\n const parent = new Map<Route, Route>();\n const visited = new Set<Route>();\n\n while (configQueue.length) {\n const el = configQueue.shift();\n if (!el) {\n continue;\n }\n\n visited.add(el);\n\n if (el === route) {\n break;\n }\n\n (el.children || []).forEach((childRoute: Route) => {\n if (!visited.has(childRoute)) {\n parent.set(childRoute, el);\n configQueue.push(childRoute);\n }\n });\n\n const lazyRoutes = (el as any)._loadedRoutes || [];\n if (Array.isArray(lazyRoutes)) {\n lazyRoutes.forEach((lazyRoute: Route) => {\n if (lazyRoute && !visited.has(lazyRoute)) {\n parent.set(lazyRoute, el);\n configQueue.push(lazyRoute);\n }\n });\n }\n }\n\n let path = '';\n let currentRoute: Route | undefined = route;\n\n while (currentRoute) {\n const currentPath = currentRoute.path || '';\n if (isPrimaryRoute(currentRoute)) {\n path = `/${currentPath}${path}`;\n } else {\n path = `/(${currentRoute.outlet}:${currentPath})${path}`;\n }\n currentRoute = parent.get(currentRoute);\n }\n\n let normalizedPath = path.replaceAll(/\\/+/g, '/');\n\n if (normalizedPath !== '/' && normalizedPath.endsWith('/')) {\n normalizedPath = normalizedPath.slice(0, -1);\n }\n\n return normalizedPath;\n};\n","import { inject } from '@angular/core';\nimport { ActivatedRouteSnapshot, Router } from '@angular/router';\n\nexport function injectSnapshotPathResolver() {\n const router = inject(Router);\n\n return (route: ActivatedRouteSnapshot) => {\n const segments = route.pathFromRoot.flatMap(\n (snap) => snap.routeConfig?.path ?? [],\n );\n\n const joinedSegments = segments.filter(Boolean).join('/');\n\n return router.serializeUrl(router.parseUrl(joinedSegments));\n };\n}\n","import { computed, inject } from '@angular/core';\nimport {\n createUrlTreeFromSnapshot,\n Router,\n type ResolveFn,\n} from '@angular/router';\nimport { BreadcrumbStore } from './breadcrumb.store';\n\n/**\n * Options for defining a breadcrumb.\n *\n */\ntype CreateBreadcrumbOptions = {\n /**\n * The visible text for the breadcrumb.\n * Can be a static string or a function for dynamic labels.\n */\n label: string | (() => string);\n /**\n * An accessible label for the breadcrumb item.\n * Defaults to the value of `label` if not provided.\n * Can be a static string or a function returning a string for dynamic ARIA labels.\n */\n ariaLabel?: string | (() => string);\n /**\n * If `true`, the route resolver will wait until the `label` signal has a value before `resolving`\n */\n awaitValue?: boolean;\n};\n\nimport { until } from '@mmstack/primitives';\nimport { injectSnapshotPathResolver } from '../util';\nimport { Breadcrumb, createInternalBreadcrumb } from './breadcrumb.type';\n\n/**\n * Creates and registers a breadcrumb for a specific route.\n * This function is designed to be used as an Angular Route `ResolveFn`.\n * It handles the registration of the breadcrumb with the `BreadcrumbStore`\n * and ensures automatic deregistration when the route is destroyed.\n *\n * @param factory A function that returns a `CreateBreadcrumbOptions` object.\n * @see CreateBreadcrumbOptions\n *\n * @example\n * ```typescript\n * export const appRoutes: Routes = [\n * {\n * path: 'home',\n * component: HomeComponent,\n * resolve: {\n * breadcrumb: createBreadcrumb(() => ({\n * label: 'Home',\n * });\n * },\n * path: 'users/:userId',\n * component: UserProfileComponent,\n * resolve: {\n * breadcrumb: createBreadcrumb(() => {\n * const userStore = inject(UserStore);\n * return {\n * label: () => userStore.user().name ?? 'Loading...\n * };\n * })\n * },\n * }\n * ];\n * ```\n */\nexport function createBreadcrumb(\n factory: () => CreateBreadcrumbOptions,\n): ResolveFn<void> {\n return async (route) => {\n const router = inject(Router);\n const store = inject(BreadcrumbStore);\n const resolver = injectSnapshotPathResolver();\n\n const fp = resolver(route);\n\n const tree = createUrlTreeFromSnapshot(\n route,\n [],\n route.queryParams,\n route.fragment,\n );\n\n const provided = factory();\n\n const link = computed(() => router.serializeUrl(tree));\n\n const { label, ariaLabel = label } = provided;\n\n const bc: Breadcrumb = {\n id: fp,\n ariaLabel:\n typeof ariaLabel === 'string'\n ? computed(() => ariaLabel)\n : computed(ariaLabel),\n label:\n typeof label === 'string' ? computed(() => label) : computed(label),\n link,\n };\n\n store.register(\n createInternalBreadcrumb(\n bc,\n computed(() => route.data?.['skipBreadcrumb'] !== true),\n ),\n );\n\n if (provided.awaitValue) await until(bc.label, (v) => !!v);\n\n return Promise.resolve();\n };\n}\n","import { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\n\n@Injectable({ providedIn: 'root' })\nexport class PreloadService {\n private readonly preloadOnDemand$ = new Subject<string>();\n readonly preloadRequested$ = this.preloadOnDemand$.asObservable();\n\n startPreload(routePath: string) {\n this.preloadOnDemand$.next(routePath);\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { PreloadingStrategy, type Route, Router } from '@angular/router';\nimport { EMPTY, filter, finalize, Observable, switchMap, take } from 'rxjs';\nimport { createRoutePredicate, findPath } from '../util';\nimport { PreloadService } from './preload.service';\n\nfunction hasSlowConnection() {\n if (\n globalThis.window &&\n 'navigator' in globalThis.window &&\n 'connection' in globalThis.window.navigator &&\n typeof globalThis.window.navigator.connection === 'object' &&\n !!globalThis.window.navigator.connection\n ) {\n const is2g =\n 'effectiveType' in globalThis.window.navigator.connection &&\n typeof globalThis.window.navigator.connection.effectiveType ===\n 'string' &&\n globalThis.window.navigator.connection.effectiveType.endsWith('2g');\n if (is2g) return true;\n if (\n 'saveData' in globalThis.window.navigator.connection &&\n typeof globalThis.window.navigator.connection.saveData === 'boolean' &&\n globalThis.window.navigator.connection.saveData\n )\n return true;\n }\n\n return false;\n}\n\nfunction noPreload(route: Route) {\n return route.data && route.data['preload'] === false;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class PreloadStrategy implements PreloadingStrategy {\n private readonly loading = new Set<string>();\n private readonly router = inject(Router);\n private readonly svc = inject(PreloadService);\n\n preload(route: Route, load: () => Observable<any>): Observable<any> {\n if (noPreload(route) || hasSlowConnection()) return EMPTY;\n\n const fp = findPath(this.router.config, route);\n\n if (this.loading.has(fp)) return EMPTY;\n\n const predicate = createRoutePredicate(fp);\n return this.svc.preloadRequested$.pipe(\n filter((path) => path === fp || predicate(path)),\n take(1),\n switchMap(() => load()),\n finalize(() => this.loading.delete(fp)),\n );\n }\n}\n","import {\n booleanAttribute,\n computed,\n Directive,\n effect,\n HostListener,\n inject,\n InjectionToken,\n input,\n output,\n Provider,\n untracked,\n} from '@angular/core';\nimport {\n type ActivatedRoute,\n type Params,\n Router,\n RouterLink,\n RouterLinkWithHref,\n UrlTree,\n} from '@angular/router';\nimport { elementVisibility } from '@mmstack/primitives';\nimport { PreloadService } from './preloading';\n\nfunction inputToUrlTree(\n router: Router,\n link: string | any[] | UrlTree | null,\n relativeTo?: ActivatedRoute,\n queryParams?: Params,\n fragment?: string,\n queryParamsHandling?: 'merge' | 'preserve' | '',\n routerLinkUrlTree?: UrlTree | null,\n): UrlTree | null {\n if (!link) return null;\n if (routerLinkUrlTree) return routerLinkUrlTree;\n\n if (link instanceof UrlTree) return link;\n\n const arr = Array.isArray(link) ? link : [link];\n\n return router.createUrlTree(arr, {\n relativeTo,\n queryParams,\n fragment,\n queryParamsHandling,\n });\n}\n\nfunction treeToSerializedUrl(\n router: Router,\n urlTree: UrlTree | null,\n): string | null {\n if (!urlTree) return null;\n return router.serializeUrl(urlTree);\n}\n\nexport function injectTriggerPreload() {\n const svc = inject(PreloadService);\n const router = inject(Router);\n\n return (\n link: string | any[] | UrlTree | null,\n relativeTo?: ActivatedRoute,\n queryParams?: Params,\n fragment?: string,\n queryParamsHandling?: 'merge' | 'preserve' | '',\n ) => {\n const urlTree = inputToUrlTree(\n router,\n link,\n relativeTo,\n queryParams,\n fragment,\n queryParamsHandling,\n );\n const fullPath = treeToSerializedUrl(router, urlTree);\n if (!fullPath) return;\n\n svc.startPreload(fullPath);\n };\n}\n\n/**\n * Configuration for the `mmLink` directive.\n */\ntype MMLinkConfig = {\n /**\n * The default preload behavior for links.\n * Can be 'hover', 'visible', or null (no preloading).\n * @default 'hover'\n */\n preloadOn: 'hover' | 'visible' | null;\n /**\n * Whether to use mouse down events for preloading.\n * @default false\n */\n useMouseDown: boolean;\n};\n\nconst configToken = new InjectionToken<MMLinkConfig>('MMSTACK_LINK_CONFIG');\n\nexport function provideMMLinkDefaultConfig(\n config: Partial<MMLinkConfig>,\n): Provider {\n const cfg: MMLinkConfig = {\n preloadOn: 'hover',\n useMouseDown: false,\n ...config,\n };\n\n return {\n provide: configToken,\n useValue: cfg,\n };\n}\n\n@Directive({\n selector: '[mmLink]',\n exportAs: 'mmLink',\n host: {\n '(mouseenter)': 'onHover()',\n },\n hostDirectives: [\n {\n directive: RouterLink,\n inputs: [\n 'routerLink: mmLink',\n 'target',\n 'queryParams',\n 'fragment',\n 'queryParamsHandling',\n 'state',\n 'relativeTo',\n 'skipLocationChange',\n 'replaceUrl',\n ],\n },\n ],\n})\nexport class LinkDirective {\n private readonly routerLink =\n inject(RouterLink, {\n self: true,\n optional: true,\n }) ?? inject(RouterLinkWithHref, { self: true, optional: true });\n\n private readonly svc = inject(PreloadService);\n private readonly router = inject(Router);\n\n readonly target = input<string>();\n readonly queryParams = input<Params>();\n readonly fragment = input<string>();\n readonly queryParamsHandling = input<'merge' | 'preserve' | ''>();\n readonly state = input<Record<string, any>>();\n readonly info = input<unknown>();\n readonly relativeTo = input<ActivatedRoute>();\n readonly skipLocationChange = input(false, { transform: booleanAttribute });\n readonly replaceUrl = input(false, { transform: booleanAttribute });\n readonly mmLink = input<string | any[] | UrlTree | null>(null);\n readonly preloadOn = input<'hover' | 'visible' | null>(\n inject(configToken).preloadOn,\n );\n readonly useMouseDown = input(inject(configToken).useMouseDown, {\n transform: booleanAttribute,\n });\n\n readonly preloading = output<void>();\n\n private readonly urlTree = computed(() => {\n return inputToUrlTree(\n this.router,\n this.mmLink(),\n this.relativeTo(),\n this.queryParams(),\n this.fragment(),\n this.queryParamsHandling(),\n this.routerLink?.urlTree,\n );\n });\n\n private readonly fullPath = computed(() => {\n return treeToSerializedUrl(this.router, this.urlTree());\n });\n\n onHover() {\n if (untracked(this.preloadOn) !== 'hover') return;\n this.requestPreload();\n }\n\n @HostListener('mousedown', [\n '$event.button',\n '$event.ctrlKey',\n '$event.shiftKey',\n '$event.altKey',\n '$event.metaKey',\n ])\n onMouseDown(\n button: number,\n ctrlKey: boolean,\n shiftKey: boolean,\n altKey: boolean,\n metaKey: boolean,\n ) {\n if (!untracked(this.useMouseDown)) return;\n return this.trigger(button, ctrlKey, shiftKey, altKey, metaKey);\n }\n\n @HostListener('click', [\n '$event.button',\n '$event.ctrlKey',\n '$event.shiftKey',\n '$event.altKey',\n '$event.metaKey',\n ])\n onClick(\n button: number,\n ctrlKey: boolean,\n shiftKey: boolean,\n altKey: boolean,\n metaKey: boolean,\n ) {\n if (untracked(this.useMouseDown)) return;\n return this.trigger(button, ctrlKey, shiftKey, altKey, metaKey);\n }\n\n constructor() {\n const intersection = elementVisibility();\n\n effect(() => {\n if (this.preloadOn() !== 'visible') return;\n if (intersection.visible()) this.requestPreload();\n });\n }\n\n private requestPreload() {\n const fp = untracked(this.fullPath);\n if (!this.routerLink || !fp) return;\n this.svc.startPreload(fp);\n this.preloading.emit();\n }\n\n private trigger(\n button: number,\n ctrlKey: boolean,\n shiftKey: boolean,\n altKey: boolean,\n metaKey: boolean,\n ) {\n return this.routerLink?.onClick(button, ctrlKey, shiftKey, altKey, metaKey);\n }\n}\n","import {\r\n computed,\r\n inject,\r\n isSignal,\r\n untracked,\r\n type WritableSignal,\r\n} from '@angular/core';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { toWritable } from '@mmstack/primitives';\r\n\r\n/**\r\n * Creates a WritableSignal that synchronizes with a specific URL query parameter,\r\n * enabling two-way binding between the signal's state and the URL.\r\n *\r\n * Reading the signal provides the current value of the query parameter (or null if absent).\r\n * Setting the signal updates the URL query parameter using `Router.navigate`, triggering\r\n * navigation and causing the signal to update reactively if the navigation is successful.\r\n *\r\n * @param key The key of the query parameter to synchronize with.\r\n * Can be a static string (e.g., `'search'`) or a function/signal returning a string\r\n * for dynamic keys (e.g., `() => this.userId() + '_filter'` or `computed(() => this.category() + '_sort')`).\r\n * The signal will reactively update if the key returned by the function/signal changes.\r\n * @returns {WritableSignal<string | null>} A signal representing the query parameter's value.\r\n * - Reading returns the current value string, or `null` if the parameter is absent in the URL.\r\n * - Setting the signal to a string updates the query parameter in the URL (e.g., `signal.set('value')` results in `?key=value`).\r\n * - Setting the signal to `null` removes the query parameter from the URL (e.g., `signal.set(null)` results in `?otherParam=...`).\r\n * - Automatically reflects changes if the query parameters update due to external navigation.\r\n * @remarks\r\n * - Requires Angular's `ActivatedRoute` and `Router` to be available in the injection context.\r\n * - Uses `Router.navigate` with `queryParamsHandling: 'merge'` to preserve other existing query parameters during updates.\r\n * - Handles dynamic keys reactively. If the result of the `key` function/signal changes, the signal will start reflecting the value of the *new* query parameter key.\r\n * - During Server-Side Rendering (SSR), it reads the initial value from the route snapshot. Write operations (`set`) might have limited or no effect on the server depending on the platform configuration.\r\n *\r\n * @example\r\n * ```ts\r\n * import { Component, computed, effect, signal } from '@angular/core';\r\n * import { queryParam } from '@mmstack/router-core'; // Adjust import path as needed\r\n * // import { FormsModule } from '@angular/forms'; // If using ngModel\r\n *\r\n * @Component({\r\n * selector: 'app-product-list',\r\n * standalone: true,\r\n * // imports: [FormsModule], // If using ngModel\r\n * template: `\r\n * <div>\r\n * Sort By:\r\n * <select [value]=\"sortSignal() ?? ''\" (change)=\"sortSignal.set($any($event.target).value || null)\">\r\n * <option value=\"\">Default</option>\r\n * <option value=\"price_asc\">Price Asc</option>\r\n * <option value=\"price_desc\">Price Desc</option>\r\n * <option value=\"name\">Name</option>\r\n * </select>\r\n * <button (click)=\"sortSignal.set(null)\" [disabled]=\"!sortSignal()\">Clear Sort</button>\r\n * </div>\r\n * <div>\r\n * Page:\r\n * <input type=\"number\" min=\"1\" [value]=\"pageSignal() ?? '1'\" #p (input)=\"setPage(p.value)\"/>\r\n * </div>\r\n * * `\r\n * })\r\n * export class ProductListComponent {\r\n * // Two-way bind the 'sort' query parameter (?sort=...)\r\n * // Defaults to null if param is missing\r\n * sortSignal = queryParam('sort');\r\n *\r\n * // Example with a different type (needs serialization or separate logic)\r\n * // For simplicity, we treat page as string | null here\r\n * pageSignal = queryParam('page');\r\n *\r\n * constructor() {\r\n * effect(() => {\r\n * const currentSort = this.sortSignal();\r\n * const currentPage = this.pageSignal(); // Read as string | null\r\n * console.log('Sort/Page changed, reloading products for:', { sort: currentSort, page: currentPage });\r\n * // --- Fetch data based on currentSort and currentPage ---\r\n * });\r\n * }\r\n *\r\n * setPage(value: string): void {\r\n * const pageNum = parseInt(value, 10);\r\n * // Set to null if page is 1 (to remove param), otherwise set string value\r\n * this.pageSignal.set(isNaN(pageNum) || pageNum <= 1 ? null : pageNum.toString());\r\n * }\r\n * }\r\n * ```\r\n */\r\nexport function queryParam(\r\n key: string | (() => string),\r\n): WritableSignal<string | null> {\r\n const route = inject(ActivatedRoute);\r\n const router = inject(Router);\r\n\r\n const keySignal =\r\n typeof key === 'string'\r\n ? computed(() => key)\r\n : isSignal(key)\r\n ? key\r\n : computed(key);\r\n\r\n const queryParamMap = toSignal(route.queryParamMap, {\r\n initialValue: route.snapshot.queryParamMap,\r\n });\r\n\r\n const queryParams = toSignal(route.queryParams, {\r\n initialValue: route.snapshot.queryParams,\r\n });\r\n\r\n const queryParam = computed(() => queryParamMap().get(keySignal()));\r\n\r\n const set = (newValue: string | null) => {\r\n const next = {\r\n ...untracked(queryParams),\r\n };\r\n const key = untracked(keySignal);\r\n\r\n if (newValue === null) {\r\n delete next[key];\r\n } else {\r\n next[key] = newValue;\r\n }\r\n\r\n router.navigate([], {\r\n relativeTo: route,\r\n queryParams: next,\r\n queryParamsHandling: 'merge',\r\n });\r\n };\r\n\r\n return toWritable(queryParam, set);\r\n}\r\n","import { inject, InjectionToken, Provider } from '@angular/core';\n\n/**\n * Title configuration interface.\n * Defines how createTitle should behave\n * @see {createTitle}\n */\nexport type TitleConfig = {\n /**\n * The title to be used when no title is set.\n * If not provided it defaults to an empty string\n * @default ''\n */\n prefix?: string | ((title: string) => string);\n /**\n * if false, the title will change to the url, otherwise default to true as that is standard behavior\n * @default true\n */\n keepLastKnownTitle?: boolean;\n};\n\n/**\n * @internal\n */\nexport type InternalTitleConfig = {\n parser: (title: string) => string;\n keepLastKnown: boolean;\n};\n\nconst token = new InjectionToken<InternalTitleConfig>('MMSTACK_TITLE_CONFIG');\n\n/**\n * used to provide the title configuration, will not be applied unless a `createTitle` resolver is used\n */\nexport function provideTitleConfig(config?: TitleConfig): Provider {\n const prefix = config?.prefix ?? '';\n\n const prefixFn =\n typeof prefix === 'function'\n ? prefix\n : (title: string) => `${prefix}${title}`;\n\n return {\n provide: token,\n useValue: {\n parser: prefixFn,\n keepLastKnown: config?.keepLastKnownTitle ?? true,\n },\n };\n}\n\nexport function injectTitleConfig(): InternalTitleConfig {\n return inject(token);\n}\n","import {\n computed,\n effect,\n inject,\n Injectable,\n linkedSignal,\n Signal,\n untracked,\n} from '@angular/core';\nimport { Title } from '@angular/platform-browser';\nimport { ResolveFn } from '@angular/router';\nimport { mutable, until } from '@mmstack/primitives';\nimport { injectLeafRoutes, injectSnapshotPathResolver } from '../util';\nimport { injectTitleConfig } from './title.config';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class TitleStore {\n private readonly title = inject(Title);\n private readonly map = mutable<Map<string, Signal<string>>>(new Map());\n private readonly leafRoutes = injectLeafRoutes();\n\n constructor() {\n const reverseLeaves = computed(() => this.leafRoutes().toReversed());\n\n const currentResolvedTitles = computed(() => {\n const map = this.map();\n return reverseLeaves()\n .map((leaf) => map.get(leaf.path)?.() ?? leaf.route.title)\n .filter((v): v is string => !!v);\n });\n\n const currentTitle = computed(() => currentResolvedTitles().at(0) ?? '');\n\n const heldTitle = injectTitleConfig().keepLastKnown\n ? linkedSignal<string, string>({\n source: () => currentTitle(),\n computation: (value, prev) => {\n if (!value) return prev?.value ?? '';\n return value;\n },\n })\n : currentTitle;\n\n effect(() => {\n this.title.setTitle(heldTitle());\n });\n }\n\n register(id: string, titleFn: Signal<string>) {\n this.map.inline((m) => m.set(id, titleFn));\n }\n}\n\n/**\n *\n * Creates a title resolver function that can be used in Angular's router.\n *\n * @param fn\n * A function that returns a string or a Signal<string> representing the title.\n * @param awaitValue\n * If `true`, the resolver will wait until the title signal has a value before resolving.\n * Defaults to `false`.\n */\nexport function createTitle(\n fn: () => string | (() => string),\n awaitValue = false,\n): ResolveFn<string> {\n return async (route): Promise<string> => {\n const store = inject(TitleStore);\n const resolver = injectSnapshotPathResolver();\n const fp = resolver(route);\n\n const { parser } = injectTitleConfig();\n\n const resolved = fn();\n\n const titleSignal =\n typeof resolved === 'string'\n ? computed(() => resolved)\n : computed(resolved);\n\n const parsedTitleSignal = computed(() => parser(titleSignal()));\n\n store.register(fp, parsedTitleSignal);\n\n if (awaitValue) await until(parsedTitleSignal, (v) => !!v);\n\n return Promise.resolve(untracked(parsedTitleSignal));\n };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["token","parsePathSegment","filter"],"mappings":"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"}
1
+ {"version":3,"file":"mmstack-router-core.mjs","sources":["../../../../../packages/router/core/src/lib/breadcrumb/breadcrumb-config.ts","../../../../../packages/router/core/src/lib/url.ts","../../../../../packages/router/core/src/lib/util/leaf.store.ts","../../../../../packages/router/core/src/lib/breadcrumb/breadcrumb.ts","../../../../../packages/router/core/src/lib/breadcrumb/breadcrumb-store.ts","../../../../../packages/router/core/src/lib/util/create-route-predicate.ts","../../../../../packages/router/core/src/lib/util/find-path.ts","../../../../../packages/router/core/src/lib/util/snapshot-path.ts","../../../../../packages/router/core/src/lib/breadcrumb/breadcrumb-resolver.ts","../../../../../packages/router/core/src/lib/preloading/preload-requester.ts","../../../../../packages/router/core/src/lib/preloading/preload-strategy.ts","../../../../../packages/router/core/src/lib/link.ts","../../../../../packages/router/core/src/lib/query-param.ts","../../../../../packages/router/core/src/lib/title/title-config.ts","../../../../../packages/router/core/src/lib/title/title-store.ts","../../../../../packages/router/core/src/mmstack-router-core.ts"],"sourcesContent":["import { inject, InjectionToken } from '@angular/core';\nimport { ResolvedLeafRoute } from '../util';\n\n/**\n * A function that returns a custom label generation function.\n * The outer function is called in a root injection context\n * The returned function takes a `ResolvedLeafRoute` and produces a string label for the breadcrumb.\n * As the inner function is wrapped in a computed, changes to signals called within it will update the breadcrumb label reactively.\n */\ntype GenerateBreadcrumbFn = () => (leaf: ResolvedLeafRoute) => string;\n\n/**\n * Configuration options for the breadcrumb system.\n * Use `provideBreadcrumbConfig` to supply these options to your application.\n */\n\nexport type BreadcrumbConfig = {\n /**\n * Defines how breadcrumb labels are generated.\n * - If set to `'manual'`, breadcrumbs will only be displayed if manually registered\n * via `createBreadcrumb`. Automatic generation based on routes is disabled.\n * - Alternatively provide a custom label generation function\n * If left undefined, the system will automatically generate labels based on the route's title, data, or path.\n * @see GenerateBreadcrumbFn\n * @example\n * ```typescript\n * // For custom label generation:\n * // const myCustomLabelGenerator = () => (leaf: ResolvedLeafRoute) => {\n * // return leaf.route.data?.['customTitle'] || leaf.route.routeConfig?.path || 'Default';\n * // };\n * //\n * // config: { generation: myCustomLabelGenerator }\n * ```\n */\n generation?: 'manual' | GenerateBreadcrumbFn;\n};\n\n/**\n * @internal\n */\nconst token = new InjectionToken<BreadcrumbConfig>('MMSTACK_BREADCRUMB_CONFIG');\n\n/**\n * Provides configuration for the breadcrumb system.\n * @param config - A partial `BreadcrumbConfig` object with the desired settings. *\n * @see BreadcrumbConfig\n * @example\n * ```typescript\n * // In your app.module.ts or a standalone component's providers:\n * // import { provideBreadcrumbConfig } from './breadcrumb.config'; // Adjust path\n * // import { ResolvedLeafRoute } from './breadcrumb.type'; // Adjust path\n *\n * // const customLabelStrategy: GenerateBreadcrumbFn = () => {\n * // return (leaf: ResolvedLeafRoute): string => {\n * // // Example: Prioritize a 'navTitle' data property\n * // if (leaf.route.data?.['navTitle']) {\n * // return leaf.route.data['navTitle'];\n * // }\n * // // Fallback to a default mechanism\n * // return leaf.route.title || leaf.segment.resolved || 'Unnamed';\n * // };\n * // };\n *\n * export const appConfig = [\n * // ...rest\n * provideBreadcrumbConfig({\n * generation: customLabelStrategy, // or 'manual' to disable auto-generation\n * }),\n * ]\n * ```\n */\nexport function provideBreadcrumbConfig(config: Partial<BreadcrumbConfig>) {\n return {\n provide: token,\n useValue: {\n ...config,\n },\n };\n}\n\n/**\n * @internal\n */\nexport function injectBreadcrumbConfig(): BreadcrumbConfig {\n return (\n inject(token, {\n optional: true,\n }) ?? {}\n );\n}\n","import { inject, type Signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport {\n type Event,\n EventType,\n type NavigationEnd,\n Router,\n} from '@angular/router';\nimport { filter, map } from 'rxjs/operators';\n\n/**\n * Type guard to check if a Router Event is a NavigationEnd event.\n * @internal\n */\nfunction isNavigationEnd(e: Event): e is NavigationEnd {\n return 'type' in e && e.type === EventType.NavigationEnd;\n}\n\n/**\n * Creates a Signal that tracks the current router URL.\n *\n * The signal emits the URL string reflecting the router state *after* redirects\n * have completed for each successful navigation. It initializes with the router's\n * current URL state.\n *\n * @returns {Signal<string>} A Signal emitting the `urlAfterRedirects` upon successful navigation.\n *\n * @example\n * ```ts\n * import { Component, effect } from '@angular/core';\n * import { url } from '@mmstack/router-core'; // Adjust import path\n *\n * @Component({\n * selector: 'app-root',\n * template: `Current URL: {{ currentUrl() }}`\n * })\n * export class AppComponent {\n * currentUrl = url();\n *\n * constructor() {\n * effect(() => {\n * console.log('Navigation ended. New URL:', this.currentUrl());\n * // e.g., track page view with analytics\n * });\n * }\n * }\n * ```\n */\nexport function url(): Signal<string> {\n const router = inject(Router);\n\n return toSignal(\n router.events.pipe(\n filter(isNavigationEnd),\n map((e) => e.urlAfterRedirects),\n ),\n {\n initialValue: router.url,\n },\n );\n}\n","import { computed, inject, Injectable, Signal } from '@angular/core';\nimport {\n ActivatedRouteSnapshot,\n Router,\n RouterStateSnapshot,\n} from '@angular/router';\nimport { url } from '../url';\n\n/**\n * @internal\n */\nexport type ResolvedLeafRoute = {\n route: ActivatedRouteSnapshot;\n segment: {\n path: string;\n resolved: string;\n };\n path: string;\n link: string;\n};\n\nfunction leafRoutes(): Signal<ResolvedLeafRoute[]> {\n const router = inject(Router);\n\n const getLeafRoutes = (\n snapshot: RouterStateSnapshot,\n ): ResolvedLeafRoute[] => {\n const routes: ResolvedLeafRoute[] = [];\n let route: ActivatedRouteSnapshot | null = snapshot.root;\n const processed = new Set<string>();\n\n while (route) {\n const allSegments = route.pathFromRoot.flatMap(\n (snap) => snap.routeConfig?.path ?? [],\n );\n\n const segments = allSegments.filter(Boolean);\n\n const path = router.serializeUrl(router.parseUrl(segments.join('/')));\n\n if (processed.has(path)) {\n route = route.firstChild;\n continue;\n }\n processed.add(path);\n\n const parts = route.pathFromRoot\n .flatMap((snap) => snap.url ?? [])\n .map((u) => u.path)\n .filter(Boolean);\n\n const link = router.serializeUrl(router.parseUrl(parts.join('/')));\n\n routes.push({\n route,\n segment: {\n path: segments.at(-1) ?? '',\n resolved: parts.at(-1) ?? '',\n },\n path,\n link,\n });\n route = route.firstChild;\n }\n\n return routes;\n };\n\n const currentUrl = url();\n\n const leafRoutes = computed(() => {\n currentUrl();\n return getLeafRoutes(router.routerState.snapshot);\n });\n\n return leafRoutes;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class RouteLeafStore {\n readonly leaves = leafRoutes();\n}\n\nexport function injectLeafRoutes() {\n const store = inject(RouteLeafStore);\n return store.leaves;\n}\n","import { type Signal } from '@angular/core';\n\n/**\n * Represents a single breadcrumb item within the navigation path.\n * All dynamic properties are represented as Angular Signals to enable reactivity.\n */\nexport type Breadcrumb = {\n /**\n * A unique identifier for the breadcrumb item. Generally the unresolved path for example `/posts/:id`.\n * Useful for `@for` tracking in templates.\n */\n id: string;\n /**\n * The visible text for the breadcrumb item.\n * Updated reactively as the url/link based on\n * either a provided definition, or the current route.\n */\n label: Signal<string>;\n /**\n * An accessible label for the breadcrumb item.\n * Defaults to the same value as `label` if not provided.\n */\n ariaLabel: Signal<string>;\n /**\n * The URL link for the breadcrumb item.\n * Updates as the route changes.\n */\n link: Signal<string>;\n};\n\n/**\n * @internal\n */\nconst INTERNAL_BREADCRUMB_SYMBOL = Symbol.for('MMSTACK_INTERNAL_BREADCRUMB');\n\n/**\n * @internal\n */\nexport type InternalBreadcrumb = Breadcrumb & {\n [INTERNAL_BREADCRUMB_SYMBOL]: {\n active: Signal<boolean>;\n registered: boolean;\n };\n};\n\n/**\n * @internal\n */\nexport function getBreadcrumbInternals(breadcrumb: InternalBreadcrumb) {\n return (breadcrumb as InternalBreadcrumb)[INTERNAL_BREADCRUMB_SYMBOL];\n}\n\n/**\n * @internal\n */\nexport function createInternalBreadcrumb(\n bc: Breadcrumb,\n active: Signal<boolean>,\n registered = true,\n): InternalBreadcrumb {\n return {\n ...bc,\n [INTERNAL_BREADCRUMB_SYMBOL]: {\n active,\n registered,\n },\n };\n}\n\n/**\n * @internal\n */\nexport function isInternalBreadcrumb(\n breadcrumb: Breadcrumb | InternalBreadcrumb,\n): breadcrumb is InternalBreadcrumb {\n return !!(breadcrumb as InternalBreadcrumb)[INTERNAL_BREADCRUMB_SYMBOL];\n}\n","import { computed, inject, Injectable, Signal } from '@angular/core';\nimport { mapArray, mutable } from '@mmstack/primitives';\nimport { injectLeafRoutes, ResolvedLeafRoute } from '../util/leaf.store';\nimport {\n Breadcrumb,\n createInternalBreadcrumb,\n getBreadcrumbInternals,\n InternalBreadcrumb,\n isInternalBreadcrumb,\n} from './breadcrumb';\nimport { injectBreadcrumbConfig } from './breadcrumb-config';\n\nfunction uppercaseFirst(str: string): string {\n const lcs = str.toLowerCase();\n return lcs.charAt(0).toUpperCase() + lcs.slice(1);\n}\n\nfunction removeMatrixAndQueryParams(path: string): string {\n const [cleanPath] = path.split(';');\n return cleanPath.split('?')[0];\n}\n\nfunction parsePathSegment(pathSegment: string): string {\n return pathSegment\n .split('/')\n .flatMap((part) => part.split('.'))\n .flatMap((part) => part.split('-'))\n .map((part) => uppercaseFirst(removeMatrixAndQueryParams(part)))\n .join(' ');\n}\n\nfunction generateLabel(leaf: ResolvedLeafRoute): string {\n const title = leaf.route.title ?? leaf.route.data?.['title'];\n\n if (title && typeof title === 'string') return title;\n if (leaf.segment.path.includes(':')) return leaf.segment.resolved;\n\n return parsePathSegment(leaf.segment.path);\n}\n\nfunction autoGenerateBreadcrumb(\n id: string,\n leaf: Signal<ResolvedLeafRoute>,\n autoGenerateFn: Signal<(leaf: ResolvedLeafRoute) => string>,\n): Breadcrumb {\n const label = computed(() => autoGenerateFn()(leaf()));\n\n return createInternalBreadcrumb(\n {\n id,\n label,\n ariaLabel: label,\n link: computed(() => leaf().link),\n },\n computed(\n () =>\n leaf().route.data?.['skipBreadcrumb'] !== true &&\n id !== '' &&\n id !== '/' &&\n leaf().segment.path !== '' &&\n leaf().segment.path !== '/' &&\n !leaf().segment.path.endsWith('/') &&\n !!label(),\n ),\n );\n}\n\nfunction injectGenerateLabelFn() {\n const { generation } = injectBreadcrumbConfig();\n\n if (typeof generation !== 'function') return computed(() => generateLabel);\n\n const provided = generation();\n return computed(() => provided);\n}\n\nfunction injectIsManual() {\n return injectBreadcrumbConfig().generation === 'manual';\n}\n\nfunction exposeActiveSignal(\n crumbSignal: Signal<Breadcrumb>,\n manual: boolean,\n): Signal<Breadcrumb> & {\n active: Signal<boolean>;\n} {\n const active = manual\n ? computed(() => {\n const crumb = crumbSignal();\n\n return (\n isInternalBreadcrumb(crumb) &&\n getBreadcrumbInternals(crumb).registered &&\n getBreadcrumbInternals(crumb).active()\n );\n })\n : computed(() => {\n const crumb = crumbSignal();\n if (!isInternalBreadcrumb(crumb)) return true;\n return getBreadcrumbInternals(crumb).active();\n });\n\n const sig = crumbSignal as Signal<Breadcrumb> & {\n active: Signal<boolean>;\n };\n\n sig.active = active;\n\n return sig;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class BreadcrumbStore {\n private readonly map = mutable<Map<string, InternalBreadcrumb>>(new Map());\n private readonly isManual = injectIsManual();\n private readonly autoGenerateLabelFn = injectGenerateLabelFn();\n private readonly leafRoutes = injectLeafRoutes();\n\n private readonly all = mapArray(\n this.leafRoutes,\n (leaf) => {\n const stableId = computed(() => leaf().path);\n\n return exposeActiveSignal(\n computed(\n () => {\n const id = stableId();\n\n const found = this.map().get(id);\n\n if (!found)\n return autoGenerateBreadcrumb(id, leaf, this.autoGenerateLabelFn);\n\n if (!id.includes(':')) return found;\n\n return {\n ...found,\n link: computed(() => leaf().link),\n };\n },\n {\n equal: (a, b) => a.id === b.id,\n },\n ),\n this.isManual,\n );\n },\n {\n equal: (a, b) => a.link === b.link,\n },\n );\n\n private readonly crumbs = computed((): Signal<Breadcrumb>[] =>\n this.all().filter((c) => c.active()),\n );\n\n readonly unwrapped = computed(() => this.crumbs().map((c) => c()));\n\n register(breadcrumb: InternalBreadcrumb) {\n this.map.inline((m) => m.set(breadcrumb.id, breadcrumb));\n }\n}\n\n/**\n * Injects and provides access to a reactive list of breadcrumbs.\n *\n * The breadcrumbs are ordered and reflect the current active navigation path.\n * @see Breadcrumb\n * @returns `Signal<Breadcrumb[]>`\n *\n * @example\n * ```typescript\n * @Component({\n * selector: 'app-breadcrumbs',\n * template: `\n * <nav aria-label=\"breadcrumb\">\n * <ol>\n * @for (crumb of breadcrumbs(); track crumb.id) {\n * <li>\n * <a [href]=\"crumb.link()\" [attr.aria-label]=\"crumb.ariaLabel()\">{{ crumb.label() }}</a>\n * </li>\n * }\n * </ol>\n * </nav>\n * `\n * })\n * export class MyBreadcrumbsComponent {\n * breadcrumbs = injectBreadcrumbs();\n * }\n * ```\n */\nexport function injectBreadcrumbs() {\n const store = inject(BreadcrumbStore);\n return store.unwrapped;\n}\n","function parsePathSegment(segmentString: string): {\n pathPart: string;\n matrixParams: Record<string, string>;\n} {\n const parts = segmentString.split(';');\n const pathPart = parts[0];\n const matrixParams: Record<string, string> = {};\n for (let i = 1; i < parts.length; i++) {\n const [key, value = 'true'] = parts[i].split('=');\n if (key) {\n matrixParams[key] = value;\n }\n }\n return { pathPart, matrixParams };\n}\n\nfunction createBasePredicate(path: string): (path: string) => boolean {\n const partPredicates = path\n .split('/')\n .filter((part) => !!part.trim())\n .map((configSegmentString) => {\n const { pathPart: configPathPart, matrixParams: configMatrixParams } =\n parsePathSegment(configSegmentString);\n\n let singlePathPartPredicate: (linkSegmentPathPart: string) => boolean;\n if (configPathPart.startsWith(':')) {\n singlePathPartPredicate = () => true;\n } else {\n singlePathPartPredicate = (linkSegmentPathPart: string) =>\n linkSegmentPathPart === configPathPart;\n }\n\n const configSegmentHasMatrixParams =\n Object.keys(configMatrixParams).length > 0;\n\n return (linkSegmentString: string) => {\n const { pathPart: linkPathPart, matrixParams: linkMatrixParams } =\n parsePathSegment(linkSegmentString);\n\n if (!singlePathPartPredicate(linkPathPart)) {\n return false;\n }\n\n if (!configSegmentHasMatrixParams) {\n return true;\n }\n\n return Object.entries(configMatrixParams).every(\n ([key, value]) =>\n Object.prototype.hasOwnProperty.call(linkMatrixParams, key) &&\n linkMatrixParams[key] === value,\n );\n };\n });\n\n return (path: string) => {\n const linkPathOnly = path.split(/[?#]/).at(0) ?? '';\n if (!linkPathOnly && partPredicates.length > 0) return false;\n if (!linkPathOnly && partPredicates.length === 0) return true;\n\n const parts = linkPathOnly.split('/').filter((part) => !!part.trim());\n if (parts.length < partPredicates.length) return false;\n\n return parts.every((seg, idx) => {\n const pred = partPredicates.at(idx);\n if (!pred) return true;\n return pred(seg);\n });\n };\n}\n\ntype ParsedSegment = {\n pathPart: string;\n matrixParams: Record<string, string>;\n};\n\nfunction singleSegmentMatches(\n configSegment: ParsedSegment,\n linkSegment: ParsedSegment,\n): boolean {\n if (configSegment.pathPart === ':') {\n return true;\n } else if (configSegment.pathPart !== linkSegment.pathPart) {\n return false;\n }\n\n const configMatrix = configSegment.matrixParams;\n const linkMatrix = linkSegment.matrixParams;\n for (const key in configMatrix) {\n if (\n !Object.prototype.hasOwnProperty.call(linkMatrix, key) ||\n linkMatrix[key] !== configMatrix[key]\n ) {\n return false;\n }\n }\n return true;\n}\n\nfunction matchSegmentsRecursive(\n configSegments: ParsedSegment[],\n linkSegments: ParsedSegment[],\n configIdx: number,\n linkIdx: number,\n): boolean {\n if (configIdx === configSegments.length) {\n return linkIdx === linkSegments.length;\n }\n\n if (linkIdx === linkSegments.length) {\n for (let i = configIdx; i < configSegments.length; i++) {\n if (configSegments[i].pathPart !== '**') {\n return false;\n }\n }\n return true;\n }\n\n const currentConfigSegment = configSegments[configIdx];\n\n if (currentConfigSegment.pathPart === '**') {\n if (\n matchSegmentsRecursive(\n configSegments,\n linkSegments,\n configIdx + 1,\n linkIdx,\n )\n ) {\n return true;\n }\n\n if (linkIdx < linkSegments.length) {\n if (\n matchSegmentsRecursive(\n configSegments,\n linkSegments,\n configIdx,\n linkIdx + 1,\n )\n ) {\n return true;\n }\n }\n\n return false;\n } else {\n if (\n linkIdx < linkSegments.length &&\n singleSegmentMatches(currentConfigSegment, linkSegments[linkIdx])\n ) {\n return matchSegmentsRecursive(\n configSegments,\n linkSegments,\n configIdx + 1,\n linkIdx + 1,\n );\n }\n\n return false;\n }\n}\n\nfunction createWildcardPredicate(path: string): (linkPath: string) => boolean {\n const configSegments = path\n .split('/')\n .filter((p) => !!p.trim())\n .map((segment) => parsePathSegment(segment));\n\n return (linkPath: string): boolean => {\n const linkPathOnly = linkPath.split(/[?#]/).at(0) ?? '';\n const linkSegments = linkPathOnly\n .split('/')\n .filter((p) => !!p.trim())\n .map((segment) => parsePathSegment(segment));\n\n return matchSegmentsRecursive(configSegments, linkSegments, 0, 0);\n };\n}\n\nexport function createRoutePredicate(\n path: string,\n): (linkPath: string) => boolean {\n return path.includes('**')\n ? createWildcardPredicate(path)\n : createBasePredicate(path);\n}\n","// The following functions are adapted from ngx-quicklink,\n// (https://github.com/mgechev/ngx-quicklink)\n// Copyright (c) Minko Gechev and contributors, licensed under the MIT License.\n\nimport { PRIMARY_OUTLET, Route } from '@angular/router';\n\nfunction isPrimaryRoute(route: Route): boolean {\n return route.outlet === PRIMARY_OUTLET || !route.outlet;\n}\n\nexport const findPath = (config: Route[], route: Route): string => {\n const configQueue = config.slice();\n const parent = new Map<Route, Route>();\n const visited = new Set<Route>();\n\n while (configQueue.length) {\n const el = configQueue.shift();\n if (!el) {\n continue;\n }\n\n visited.add(el);\n\n if (el === route) {\n break;\n }\n\n (el.children || []).forEach((childRoute: Route) => {\n if (!visited.has(childRoute)) {\n parent.set(childRoute, el);\n configQueue.push(childRoute);\n }\n });\n\n const lazyRoutes = (el as any)._loadedRoutes || [];\n if (Array.isArray(lazyRoutes)) {\n lazyRoutes.forEach((lazyRoute: Route) => {\n if (lazyRoute && !visited.has(lazyRoute)) {\n parent.set(lazyRoute, el);\n configQueue.push(lazyRoute);\n }\n });\n }\n }\n\n let path = '';\n let currentRoute: Route | undefined = route;\n\n while (currentRoute) {\n const currentPath = currentRoute.path || '';\n if (isPrimaryRoute(currentRoute)) {\n path = `/${currentPath}${path}`;\n } else {\n path = `/(${currentRoute.outlet}:${currentPath})${path}`;\n }\n currentRoute = parent.get(currentRoute);\n }\n\n let normalizedPath = path.replaceAll(/\\/+/g, '/');\n\n if (normalizedPath !== '/' && normalizedPath.endsWith('/')) {\n normalizedPath = normalizedPath.slice(0, -1);\n }\n\n return normalizedPath;\n};\n","import { inject } from '@angular/core';\nimport { ActivatedRouteSnapshot, Router } from '@angular/router';\n\nexport function injectSnapshotPathResolver() {\n const router = inject(Router);\n\n return (route: ActivatedRouteSnapshot) => {\n const segments = route.pathFromRoot.flatMap(\n (snap) => snap.routeConfig?.path ?? [],\n );\n\n const joinedSegments = segments.filter(Boolean).join('/');\n\n return router.serializeUrl(router.parseUrl(joinedSegments));\n };\n}\n","import { computed, inject } from '@angular/core';\nimport {\n createUrlTreeFromSnapshot,\n Router,\n type ResolveFn,\n} from '@angular/router';\nimport { BreadcrumbStore } from './breadcrumb-store';\n\n/**\n * Options for defining a breadcrumb.\n *\n */\ntype CreateBreadcrumbOptions = {\n /**\n * The visible text for the breadcrumb.\n * Can be a static string or a function for dynamic labels.\n */\n label: string | (() => string);\n /**\n * An accessible label for the breadcrumb item.\n * Defaults to the value of `label` if not provided.\n * Can be a static string or a function returning a string for dynamic ARIA labels.\n */\n ariaLabel?: string | (() => string);\n /**\n * If `true`, the route resolver will wait until the `label` signal has a value before `resolving`\n */\n awaitValue?: boolean;\n};\n\nimport { until } from '@mmstack/primitives';\nimport { injectSnapshotPathResolver } from '../util';\nimport { Breadcrumb, createInternalBreadcrumb } from './breadcrumb';\n\n/**\n * Creates and registers a breadcrumb for a specific route.\n * This function is designed to be used as an Angular Route `ResolveFn`.\n * It handles the registration of the breadcrumb with the `BreadcrumbStore`\n * and ensures automatic deregistration when the route is destroyed.\n *\n * @param factory A function that returns a `CreateBreadcrumbOptions` object.\n * @see CreateBreadcrumbOptions\n *\n * @example\n * ```typescript\n * export const appRoutes: Routes = [\n * {\n * path: 'home',\n * component: HomeComponent,\n * resolve: {\n * breadcrumb: createBreadcrumb(() => ({\n * label: 'Home',\n * });\n * },\n * path: 'users/:userId',\n * component: UserProfileComponent,\n * resolve: {\n * breadcrumb: createBreadcrumb(() => {\n * const userStore = inject(UserStore);\n * return {\n * label: () => userStore.user().name ?? 'Loading...\n * };\n * })\n * },\n * }\n * ];\n * ```\n */\nexport function createBreadcrumb(\n factory: () => CreateBreadcrumbOptions,\n): ResolveFn<void> {\n return async (route) => {\n const router = inject(Router);\n const store = inject(BreadcrumbStore);\n const resolver = injectSnapshotPathResolver();\n\n const fp = resolver(route);\n\n const tree = createUrlTreeFromSnapshot(\n route,\n [],\n route.queryParams,\n route.fragment,\n );\n\n const provided = factory();\n\n const link = computed(() => router.serializeUrl(tree));\n\n const { label, ariaLabel = label } = provided;\n\n const bc: Breadcrumb = {\n id: fp,\n ariaLabel:\n typeof ariaLabel === 'string'\n ? computed(() => ariaLabel)\n : computed(ariaLabel),\n label:\n typeof label === 'string' ? computed(() => label) : computed(label),\n link,\n };\n\n store.register(\n createInternalBreadcrumb(\n bc,\n computed(() => route.data?.['skipBreadcrumb'] !== true),\n ),\n );\n\n if (provided.awaitValue) await until(bc.label, (v) => !!v);\n\n return Promise.resolve();\n };\n}\n","import { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\n\n@Injectable({ providedIn: 'root' })\nexport class PreloadRequester {\n private readonly preloadOnDemand$ = new Subject<string>();\n readonly preloadRequested$ = this.preloadOnDemand$.asObservable();\n\n startPreload(routePath: string) {\n this.preloadOnDemand$.next(routePath);\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { PreloadingStrategy, type Route, Router } from '@angular/router';\nimport { EMPTY, filter, finalize, Observable, switchMap, take } from 'rxjs';\nimport { createRoutePredicate, findPath } from '../util';\nimport { PreloadRequester } from './preload-requester';\n\nfunction hasSlowConnection() {\n if (\n globalThis.window &&\n 'navigator' in globalThis.window &&\n 'connection' in globalThis.window.navigator &&\n typeof globalThis.window.navigator.connection === 'object' &&\n !!globalThis.window.navigator.connection\n ) {\n const is2g =\n 'effectiveType' in globalThis.window.navigator.connection &&\n typeof globalThis.window.navigator.connection.effectiveType ===\n 'string' &&\n globalThis.window.navigator.connection.effectiveType.endsWith('2g');\n if (is2g) return true;\n if (\n 'saveData' in globalThis.window.navigator.connection &&\n typeof globalThis.window.navigator.connection.saveData === 'boolean' &&\n globalThis.window.navigator.connection.saveData\n )\n return true;\n }\n\n return false;\n}\n\nfunction noPreload(route: Route) {\n return route.data && route.data['preload'] === false;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class PreloadStrategy implements PreloadingStrategy {\n private readonly loading = new Set<string>();\n private readonly router = inject(Router);\n private readonly req = inject(PreloadRequester);\n\n preload(route: Route, load: () => Observable<any>): Observable<any> {\n if (noPreload(route) || hasSlowConnection()) return EMPTY;\n\n const fp = findPath(this.router.config, route);\n\n if (this.loading.has(fp)) return EMPTY;\n\n const predicate = createRoutePredicate(fp);\n return this.req.preloadRequested$.pipe(\n filter((path) => path === fp || predicate(path)),\n take(1),\n switchMap(() => load()),\n finalize(() => this.loading.delete(fp)),\n );\n }\n}\n","import {\n booleanAttribute,\n computed,\n Directive,\n effect,\n HostListener,\n inject,\n InjectionToken,\n input,\n output,\n Provider,\n untracked,\n} from '@angular/core';\nimport {\n type ActivatedRoute,\n type Params,\n Router,\n RouterLink,\n RouterLinkWithHref,\n UrlTree,\n} from '@angular/router';\nimport { elementVisibility } from '@mmstack/primitives';\nimport { PreloadRequester } from './preloading';\n\nfunction inputToUrlTree(\n router: Router,\n link: string | any[] | UrlTree | null,\n relativeTo?: ActivatedRoute,\n queryParams?: Params,\n fragment?: string,\n queryParamsHandling?: 'merge' | 'preserve' | '',\n routerLinkUrlTree?: UrlTree | null,\n): UrlTree | null {\n if (!link) return null;\n if (routerLinkUrlTree) return routerLinkUrlTree;\n\n if (link instanceof UrlTree) return link;\n\n const arr = Array.isArray(link) ? link : [link];\n\n return router.createUrlTree(arr, {\n relativeTo,\n queryParams,\n fragment,\n queryParamsHandling,\n });\n}\n\nfunction treeToSerializedUrl(\n router: Router,\n urlTree: UrlTree | null,\n): string | null {\n if (!urlTree) return null;\n return router.serializeUrl(urlTree);\n}\n\nexport function injectTriggerPreload() {\n const req = inject(PreloadRequester);\n const router = inject(Router);\n\n return (\n link: string | any[] | UrlTree | null,\n relativeTo?: ActivatedRoute,\n queryParams?: Params,\n fragment?: string,\n queryParamsHandling?: 'merge' | 'preserve' | '',\n ) => {\n const urlTree = inputToUrlTree(\n router,\n link,\n relativeTo,\n queryParams,\n fragment,\n queryParamsHandling,\n );\n const fullPath = treeToSerializedUrl(router, urlTree);\n if (!fullPath) return;\n\n req.startPreload(fullPath);\n };\n}\n\n/**\n * Configuration for the `mmLink` directive.\n */\ntype MMLinkConfig = {\n /**\n * The default preload behavior for links.\n * Can be 'hover', 'visible', or null (no preloading).\n * @default 'hover'\n */\n preloadOn: 'hover' | 'visible' | null;\n /**\n * Whether to use mouse down events for preloading.\n * @default false\n */\n useMouseDown: boolean;\n};\n\nconst configToken = new InjectionToken<MMLinkConfig>('MMSTACK_LINK_CONFIG');\n\nexport function provideMMLinkDefaultConfig(\n config: Partial<MMLinkConfig>,\n): Provider {\n const cfg: MMLinkConfig = {\n preloadOn: 'hover',\n useMouseDown: false,\n ...config,\n };\n\n return {\n provide: configToken,\n useValue: cfg,\n };\n}\n\nfunction injectConfig() {\n const cfg = inject(configToken, { optional: true });\n return {\n preloadOn: 'hover' as const,\n useMouseDown: false,\n ...cfg,\n };\n}\n\n@Directive({\n selector: '[mmLink]',\n exportAs: 'mmLink',\n host: {\n '(mouseenter)': 'onHover()',\n },\n hostDirectives: [\n {\n directive: RouterLink,\n inputs: [\n 'routerLink: mmLink',\n 'target',\n 'queryParams',\n 'fragment',\n 'queryParamsHandling',\n 'state',\n 'relativeTo',\n 'skipLocationChange',\n 'replaceUrl',\n ],\n },\n ],\n})\nexport class Link {\n private readonly routerLink =\n inject(RouterLink, {\n self: true,\n optional: true,\n }) ?? inject(RouterLinkWithHref, { self: true, optional: true });\n\n private readonly req = inject(PreloadRequester);\n private readonly router = inject(Router);\n\n readonly target = input<string>();\n readonly queryParams = input<Params>();\n readonly fragment = input<string>();\n readonly queryParamsHandling = input<'merge' | 'preserve' | ''>();\n readonly state = input<Record<string, any>>();\n readonly info = input<unknown>();\n readonly relativeTo = input<ActivatedRoute>();\n readonly skipLocationChange = input(false, { transform: booleanAttribute });\n readonly replaceUrl = input(false, { transform: booleanAttribute });\n readonly mmLink = input<string | any[] | UrlTree | null>(null);\n readonly preloadOn = input<'hover' | 'visible' | null>(\n injectConfig().preloadOn,\n );\n readonly useMouseDown = input(injectConfig().useMouseDown, {\n transform: booleanAttribute,\n });\n readonly beforeNavigate = input<() => void>();\n\n readonly preloading = output<void>();\n\n private readonly urlTree = computed(() => {\n return inputToUrlTree(\n this.router,\n this.mmLink(),\n this.relativeTo(),\n this.queryParams(),\n this.fragment(),\n this.queryParamsHandling(),\n this.routerLink?.urlTree,\n );\n });\n\n private readonly fullPath = computed(() => {\n return treeToSerializedUrl(this.router, this.urlTree());\n });\n\n onHover() {\n if (untracked(this.preloadOn) !== 'hover') return;\n this.requestPreload();\n }\n\n @HostListener('mousedown', [\n '$event.button',\n '$event.ctrlKey',\n '$event.shiftKey',\n '$event.altKey',\n '$event.metaKey',\n ])\n onMouseDown(\n button: number,\n ctrlKey: boolean,\n shiftKey: boolean,\n altKey: boolean,\n metaKey: boolean,\n ) {\n if (!untracked(this.useMouseDown)) return;\n return this.trigger(button, ctrlKey, shiftKey, altKey, metaKey);\n }\n\n @HostListener('click', [\n '$event.button',\n '$event.ctrlKey',\n '$event.shiftKey',\n '$event.altKey',\n '$event.metaKey',\n ])\n onClick(\n button: number,\n ctrlKey: boolean,\n shiftKey: boolean,\n altKey: boolean,\n metaKey: boolean,\n ) {\n if (untracked(this.useMouseDown)) return;\n return this.trigger(button, ctrlKey, shiftKey, altKey, metaKey);\n }\n\n constructor() {\n const intersection = elementVisibility();\n\n effect(() => {\n if (this.preloadOn() !== 'visible') return;\n if (intersection.visible()) this.requestPreload();\n });\n }\n\n private requestPreload() {\n const fp = untracked(this.fullPath);\n if (!this.routerLink || !fp) return;\n this.req.startPreload(fp);\n this.preloading.emit();\n }\n\n private trigger(\n button: number,\n ctrlKey: boolean,\n shiftKey: boolean,\n altKey: boolean,\n metaKey: boolean,\n ) {\n untracked(this.beforeNavigate)?.();\n return this.routerLink?.onClick(button, ctrlKey, shiftKey, altKey, metaKey);\n }\n}\n","import {\n computed,\n inject,\n isSignal,\n untracked,\n type WritableSignal,\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { toWritable } from '@mmstack/primitives';\n\n/**\n * Creates a WritableSignal that synchronizes with a specific URL query parameter,\n * enabling two-way binding between the signal's state and the URL.\n *\n * Reading the signal provides the current value of the query parameter (or null if absent).\n * Setting the signal updates the URL query parameter using `Router.navigate`, triggering\n * navigation and causing the signal to update reactively if the navigation is successful.\n *\n * @param key The key of the query parameter to synchronize with.\n * Can be a static string (e.g., `'search'`) or a function/signal returning a string\n * for dynamic keys (e.g., `() => this.userId() + '_filter'` or `computed(() => this.category() + '_sort')`).\n * The signal will reactively update if the key returned by the function/signal changes.\n * @returns {WritableSignal<string | null>} A signal representing the query parameter's value.\n * - Reading returns the current value string, or `null` if the parameter is absent in the URL.\n * - Setting the signal to a string updates the query parameter in the URL (e.g., `signal.set('value')` results in `?key=value`).\n * - Setting the signal to `null` removes the query parameter from the URL (e.g., `signal.set(null)` results in `?otherParam=...`).\n * - Automatically reflects changes if the query parameters update due to external navigation.\n * @remarks\n * - Requires Angular's `ActivatedRoute` and `Router` to be available in the injection context.\n * - Uses `Router.navigate` with `queryParamsHandling: 'merge'` to preserve other existing query parameters during updates.\n * - Handles dynamic keys reactively. If the result of the `key` function/signal changes, the signal will start reflecting the value of the *new* query parameter key.\n * - During Server-Side Rendering (SSR), it reads the initial value from the route snapshot. Write operations (`set`) might have limited or no effect on the server depending on the platform configuration.\n *\n * @example\n * ```ts\n * import { Component, computed, effect, signal } from '@angular/core';\n * import { queryParam } from '@mmstack/router-core'; // Adjust import path as needed\n * // import { FormsModule } from '@angular/forms'; // If using ngModel\n *\n * @Component({\n * selector: 'app-product-list',\n * standalone: true,\n * // imports: [FormsModule], // If using ngModel\n * template: `\n * <div>\n * Sort By:\n * <select [value]=\"sortSignal() ?? ''\" (change)=\"sortSignal.set($any($event.target).value || null)\">\n * <option value=\"\">Default</option>\n * <option value=\"price_asc\">Price Asc</option>\n * <option value=\"price_desc\">Price Desc</option>\n * <option value=\"name\">Name</option>\n * </select>\n * <button (click)=\"sortSignal.set(null)\" [disabled]=\"!sortSignal()\">Clear Sort</button>\n * </div>\n * <div>\n * Page:\n * <input type=\"number\" min=\"1\" [value]=\"pageSignal() ?? '1'\" #p (input)=\"setPage(p.value)\"/>\n * </div>\n * * `\n * })\n * export class ProductListComponent {\n * // Two-way bind the 'sort' query parameter (?sort=...)\n * // Defaults to null if param is missing\n * sortSignal = queryParam('sort');\n *\n * // Example with a different type (needs serialization or separate logic)\n * // For simplicity, we treat page as string | null here\n * pageSignal = queryParam('page');\n *\n * constructor() {\n * effect(() => {\n * const currentSort = this.sortSignal();\n * const currentPage = this.pageSignal(); // Read as string | null\n * console.log('Sort/Page changed, reloading products for:', { sort: currentSort, page: currentPage });\n * // --- Fetch data based on currentSort and currentPage ---\n * });\n * }\n *\n * setPage(value: string): void {\n * const pageNum = parseInt(value, 10);\n * // Set to null if page is 1 (to remove param), otherwise set string value\n * this.pageSignal.set(isNaN(pageNum) || pageNum <= 1 ? null : pageNum.toString());\n * }\n * }\n * ```\n */\nexport function queryParam(\n key: string | (() => string),\n route = inject(ActivatedRoute),\n): WritableSignal<string | null> {\n const router = inject(Router);\n\n const keySignal =\n typeof key === 'string'\n ? computed(() => key)\n : isSignal(key)\n ? key\n : computed(key);\n\n const queryParamMap = toSignal(route.queryParamMap, {\n initialValue: route.snapshot.queryParamMap,\n });\n\n const queryParams = toSignal(route.queryParams, {\n initialValue: route.snapshot.queryParams,\n });\n\n const queryParam = computed(() => queryParamMap().get(keySignal()));\n\n const set = (newValue: string | null) => {\n const next = {\n ...untracked(queryParams),\n };\n const key = untracked(keySignal);\n\n if (newValue === null) {\n delete next[key];\n } else {\n next[key] = newValue;\n }\n\n router.navigate([], {\n relativeTo: route,\n queryParams: next,\n queryParamsHandling: 'merge',\n });\n };\n\n return toWritable(queryParam, set);\n}\n","import { inject, InjectionToken, Provider } from '@angular/core';\n\n/**\n * Title configuration interface.\n * Defines how createTitle should behave\n * @see {createTitle}\n */\nexport type TitleConfig = {\n /**\n * The title to be used when no title is set.\n * If not provided it defaults to an empty string\n * @default ''\n */\n prefix?: string | ((title: string) => string);\n /**\n * if false, the title will change to the url, otherwise default to true as that is standard behavior\n * @default true\n */\n keepLastKnownTitle?: boolean;\n};\n\n/**\n * @internal\n */\nexport type InternalTitleConfig = {\n parser: (title: string) => string;\n keepLastKnown: boolean;\n};\n\nconst token = new InjectionToken<InternalTitleConfig>('MMSTACK_TITLE_CONFIG');\n\n/**\n * used to provide the title configuration, will not be applied unless a `createTitle` resolver is used\n */\nexport function provideTitleConfig(config?: TitleConfig): Provider {\n const prefix = config?.prefix ?? '';\n\n const prefixFn =\n typeof prefix === 'function'\n ? prefix\n : (title: string) => `${prefix}${title}`;\n\n return {\n provide: token,\n useValue: {\n parser: prefixFn,\n keepLastKnown: config?.keepLastKnownTitle ?? true,\n },\n };\n}\n\nexport function injectTitleConfig(): InternalTitleConfig {\n return inject(token);\n}\n","import {\n computed,\n effect,\n inject,\n Injectable,\n linkedSignal,\n Signal,\n untracked,\n} from '@angular/core';\nimport { Title } from '@angular/platform-browser';\nimport { ResolveFn } from '@angular/router';\nimport { mutable, until } from '@mmstack/primitives';\nimport { injectLeafRoutes, injectSnapshotPathResolver } from '../util';\nimport { injectTitleConfig } from './title-config';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class TitleStore {\n private readonly title = inject(Title);\n private readonly map = mutable<Map<string, Signal<string>>>(new Map());\n private readonly leafRoutes = injectLeafRoutes();\n\n constructor() {\n const reverseLeaves = computed(() => this.leafRoutes().toReversed());\n\n const currentResolvedTitles = computed(() => {\n const map = this.map();\n return reverseLeaves()\n .map((leaf) => map.get(leaf.path)?.() ?? leaf.route.title)\n .filter((v): v is string => !!v);\n });\n\n const currentTitle = computed(() => currentResolvedTitles().at(0) ?? '');\n\n const heldTitle = injectTitleConfig().keepLastKnown\n ? linkedSignal<string, string>({\n source: () => currentTitle(),\n computation: (value, prev) => {\n if (!value) return prev?.value ?? '';\n return value;\n },\n })\n : currentTitle;\n\n effect(() => {\n this.title.setTitle(heldTitle());\n });\n }\n\n register(id: string, titleFn: Signal<string>) {\n this.map.inline((m) => m.set(id, titleFn));\n }\n}\n\n/**\n *\n * Creates a title resolver function that can be used in Angular's router.\n *\n * @param fn\n * A function that returns a string or a Signal<string> representing the title.\n * @param awaitValue\n * If `true`, the resolver will wait until the title signal has a value before resolving.\n * Defaults to `false`.\n */\nexport function createTitle(\n fn: () => string | (() => string),\n awaitValue = false,\n): ResolveFn<string> {\n return async (route): Promise<string> => {\n const store = inject(TitleStore);\n const resolver = injectSnapshotPathResolver();\n const fp = resolver(route);\n\n const { parser } = injectTitleConfig();\n\n const resolved = fn();\n\n const titleSignal =\n typeof resolved === 'string'\n ? computed(() => resolved)\n : computed(resolved);\n\n const parsedTitleSignal = computed(() => parser(titleSignal()));\n\n store.register(fp, parsedTitleSignal);\n\n if (awaitValue) await until(parsedTitleSignal, (v) => !!v);\n\n return Promise.resolve(untracked(parsedTitleSignal));\n };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["token","parsePathSegment","filter"],"mappings":"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"}
package/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export * from './lib/breadcrumb/public_api';
2
- export * from './lib/link.directive';
2
+ export * from './lib/link';
3
3
  export * from './lib/preloading/public_api';
4
4
  export * from './lib/query-param';
5
5
  export * from './lib/title/public_api';
@@ -1,5 +1,5 @@
1
1
  import { Signal } from '@angular/core';
2
- import { Breadcrumb, InternalBreadcrumb } from './breadcrumb.type';
2
+ import { Breadcrumb, InternalBreadcrumb } from './breadcrumb';
3
3
  import * as i0 from "@angular/core";
4
4
  export declare class BreadcrumbStore {
5
5
  private readonly map;
@@ -1,4 +1,4 @@
1
- export { provideBreadcrumbConfig } from './breadcrumb.config';
2
- export { createBreadcrumb } from './breadcrumb.resolver';
3
- export { injectBreadcrumbs } from './breadcrumb.store';
4
- export { Breadcrumb } from './breadcrumb.type';
1
+ export { Breadcrumb } from './breadcrumb';
2
+ export { provideBreadcrumbConfig } from './breadcrumb-config';
3
+ export { createBreadcrumb } from './breadcrumb-resolver';
4
+ export { injectBreadcrumbs } from './breadcrumb-store';