@mmstack/router-core 19.3.12 → 20.0.1

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: "20.0.3", ngImport: i0, type: RouteLeafStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
148
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.3", 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: "20.0.3", 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: "20.0.3", ngImport: i0, type: BreadcrumbStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
287
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.3", 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: "20.0.3", 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
  }
@@ -576,10 +577,10 @@ class PreloadService {
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: "20.0.3", ngImport: i0, type: PreloadService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
581
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.3", ngImport: i0, type: PreloadService, 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: "20.0.3", ngImport: i0, type: PreloadService, decorators: [{
583
584
  type: Injectable,
584
585
  args: [{ providedIn: 'root' }]
585
586
  }] });
@@ -619,10 +620,10 @@ class PreloadStrategy {
619
620
  const predicate = createRoutePredicate(fp);
620
621
  return this.svc.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: "20.0.3", ngImport: i0, type: PreloadStrategy, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
624
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.3", 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: "20.0.3", ngImport: i0, type: PreloadStrategy, decorators: [{
626
627
  type: Injectable,
627
628
  args: [{
628
629
  providedIn: 'root',
@@ -701,6 +702,7 @@ class LinkDirective {
701
702
  useMouseDown = input(injectConfig().useMouseDown, {
702
703
  transform: booleanAttribute,
703
704
  });
705
+ beforeNavigate = input();
704
706
  preloading = output();
705
707
  urlTree = computed(() => {
706
708
  return inputToUrlTree(this.router, this.mmLink(), this.relativeTo(), this.queryParams(), this.fragment(), this.queryParamsHandling(), this.routerLink?.urlTree);
@@ -740,12 +742,13 @@ class LinkDirective {
740
742
  this.preloading.emit();
741
743
  }
742
744
  trigger(button, ctrlKey, shiftKey, altKey, metaKey) {
745
+ untracked(this.beforeNavigate)?.();
743
746
  return this.routerLink?.onClick(button, ctrlKey, shiftKey, altKey, metaKey);
744
747
  }
745
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.3", ngImport: i0, type: LinkDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
746
- 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: "20.0.3", ngImport: i0, type: LinkDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
749
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.0.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 }, 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 });
747
750
  }
748
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.3", ngImport: i0, type: LinkDirective, decorators: [{
751
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.3", ngImport: i0, type: LinkDirective, decorators: [{
749
752
  type: Directive,
750
753
  args: [{
751
754
  selector: '[mmLink]',
@@ -952,10 +955,10 @@ class TitleStore {
952
955
  register(id, titleFn) {
953
956
  this.map.inline((m) => m.set(id, titleFn));
954
957
  }
955
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.3", ngImport: i0, type: TitleStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
956
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.3", ngImport: i0, type: TitleStore, providedIn: 'root' });
958
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.3", ngImport: i0, type: TitleStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
959
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.3", ngImport: i0, type: TitleStore, providedIn: 'root' });
957
960
  }
958
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.3", ngImport: i0, type: TitleStore, decorators: [{
961
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.3", ngImport: i0, type: TitleStore, decorators: [{
959
962
  type: Injectable,
960
963
  args: [{
961
964
  providedIn: 'root',
@@ -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\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 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 injectConfig().preloadOn,\n );\n readonly useMouseDown = input(injectConfig().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.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 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.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\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 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 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.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 untracked(this.beforeNavigate)?.();\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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"}
@@ -36,6 +36,7 @@ export declare class LinkDirective {
36
36
  readonly mmLink: import("@angular/core").InputSignal<string | any[] | UrlTree | null>;
37
37
  readonly preloadOn: import("@angular/core").InputSignal<"hover" | "visible" | null>;
38
38
  readonly useMouseDown: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
39
+ readonly beforeNavigate: import("@angular/core").InputSignal<(() => void) | undefined>;
39
40
  readonly preloading: import("@angular/core").OutputEmitterRef<void>;
40
41
  private readonly urlTree;
41
42
  private readonly fullPath;
@@ -46,6 +47,6 @@ export declare class LinkDirective {
46
47
  private requestPreload;
47
48
  private trigger;
48
49
  static ɵfac: i0.ɵɵFactoryDeclaration<LinkDirective, never>;
49
- static ɵdir: i0.ɵɵDirectiveDeclaration<LinkDirective, "[mmLink]", ["mmLink"], { "target": { "alias": "target"; "required": false; "isSignal": true; }; "queryParams": { "alias": "queryParams"; "required": false; "isSignal": true; }; "fragment": { "alias": "fragment"; "required": false; "isSignal": true; }; "queryParamsHandling": { "alias": "queryParamsHandling"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; "info": { "alias": "info"; "required": false; "isSignal": true; }; "relativeTo": { "alias": "relativeTo"; "required": false; "isSignal": true; }; "skipLocationChange": { "alias": "skipLocationChange"; "required": false; "isSignal": true; }; "replaceUrl": { "alias": "replaceUrl"; "required": false; "isSignal": true; }; "mmLink": { "alias": "mmLink"; "required": false; "isSignal": true; }; "preloadOn": { "alias": "preloadOn"; "required": false; "isSignal": true; }; "useMouseDown": { "alias": "useMouseDown"; "required": false; "isSignal": true; }; }, { "preloading": "preloading"; }, never, never, true, [{ directive: typeof i1.RouterLink; inputs: { "routerLink": "mmLink"; "target": "target"; "queryParams": "queryParams"; "fragment": "fragment"; "queryParamsHandling": "queryParamsHandling"; "state": "state"; "relativeTo": "relativeTo"; "skipLocationChange": "skipLocationChange"; "replaceUrl": "replaceUrl"; }; outputs: {}; }]>;
50
+ static ɵdir: i0.ɵɵDirectiveDeclaration<LinkDirective, "[mmLink]", ["mmLink"], { "target": { "alias": "target"; "required": false; "isSignal": true; }; "queryParams": { "alias": "queryParams"; "required": false; "isSignal": true; }; "fragment": { "alias": "fragment"; "required": false; "isSignal": true; }; "queryParamsHandling": { "alias": "queryParamsHandling"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; "info": { "alias": "info"; "required": false; "isSignal": true; }; "relativeTo": { "alias": "relativeTo"; "required": false; "isSignal": true; }; "skipLocationChange": { "alias": "skipLocationChange"; "required": false; "isSignal": true; }; "replaceUrl": { "alias": "replaceUrl"; "required": false; "isSignal": true; }; "mmLink": { "alias": "mmLink"; "required": false; "isSignal": true; }; "preloadOn": { "alias": "preloadOn"; "required": false; "isSignal": true; }; "useMouseDown": { "alias": "useMouseDown"; "required": false; "isSignal": true; }; "beforeNavigate": { "alias": "beforeNavigate"; "required": false; "isSignal": true; }; }, { "preloading": "preloading"; }, never, never, true, [{ directive: typeof i1.RouterLink; inputs: { "routerLink": "mmLink"; "target": "target"; "queryParams": "queryParams"; "fragment": "fragment"; "queryParamsHandling": "queryParamsHandling"; "state": "state"; "relativeTo": "relativeTo"; "skipLocationChange": "skipLocationChange"; "replaceUrl": "replaceUrl"; }; outputs: {}; }]>;
50
51
  }
51
52
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mmstack/router-core",
3
- "version": "19.3.12",
3
+ "version": "20.0.1",
4
4
  "keywords": [
5
5
  "angular",
6
6
  "signals",
@@ -20,12 +20,13 @@
20
20
  },
21
21
  "homepage": "https://github.com/mihajm/mmstack/blob/master/packages/router/core",
22
22
  "dependencies": {
23
- "@mmstack/primitives": "^19.2.3",
23
+ "@mmstack/primitives": "^20.0.0",
24
24
  "tslib": "^2.3.0"
25
25
  },
26
26
  "peerDependencies": {
27
- "@angular/core": "^19.2.3",
28
- "@angular/router": "^19.2.3",
27
+ "@angular/core": "~20.0.3",
28
+ "@angular/router": "~20.0.3",
29
+ "@angular/platform-browser": "~20.0.3",
29
30
  "rxjs": "~7.8.2"
30
31
  },
31
32
  "sideEffects": false,