@mmstack/router-core 21.0.7 → 22.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -268,15 +268,16 @@ function leafRoutes() {
268
268
  const leafRoutes = computed(() => {
269
269
  currentUrl();
270
270
  return getLeafRoutes(router.routerState.snapshot);
271
- }, ...(ngDevMode ? [{ debugName: "leafRoutes" }] : /* istanbul ignore next */ []));
271
+ }, /* @ts-ignore */
272
+ ...(ngDevMode ? [{ debugName: "leafRoutes" }] : /* istanbul ignore next */ []));
272
273
  return leafRoutes;
273
274
  }
274
275
  class RouteLeafStore {
275
276
  leaves = leafRoutes();
276
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: RouteLeafStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
277
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: RouteLeafStore, providedIn: 'root' });
277
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: RouteLeafStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
278
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: RouteLeafStore, providedIn: 'root' });
278
279
  }
279
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: RouteLeafStore, decorators: [{
280
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: RouteLeafStore, decorators: [{
280
281
  type: Injectable,
281
282
  args: [{
282
283
  providedIn: 'root',
@@ -402,7 +403,8 @@ function generateLabel(leaf) {
402
403
  return parsePathSegment(leaf.segment.path);
403
404
  }
404
405
  function autoGenerateBreadcrumb(id, leaf, autoGenerateFn) {
405
- const label = computed(() => autoGenerateFn()(leaf()), ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
406
+ const label = computed(() => autoGenerateFn()(leaf()), /* @ts-ignore */
407
+ ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
406
408
  return createInternalBreadcrumb({
407
409
  id,
408
410
  label,
@@ -450,7 +452,8 @@ class BreadcrumbStore {
450
452
  autoGenerateLabelFn = injectGenerateLabelFn();
451
453
  leafRoutes = injectLeafRoutes();
452
454
  all = mapArray(this.leafRoutes, (leaf) => {
453
- const stableId = computed(() => leaf().path, ...(ngDevMode ? [{ debugName: "stableId" }] : /* istanbul ignore next */ []));
455
+ const stableId = computed(() => leaf().path, /* @ts-ignore */
456
+ ...(ngDevMode ? [{ debugName: "stableId" }] : /* istanbul ignore next */ []));
454
457
  return exposeActiveSignal(computed(() => {
455
458
  const id = stableId();
456
459
  const found = this.map().get(id);
@@ -468,15 +471,17 @@ class BreadcrumbStore {
468
471
  }, {
469
472
  equal: (a, b) => a.link === b.link,
470
473
  });
471
- crumbs = computed(() => this.all().filter((c) => c.active()), ...(ngDevMode ? [{ debugName: "crumbs" }] : /* istanbul ignore next */ []));
472
- unwrapped = computed(() => this.crumbs().map((c) => c()), ...(ngDevMode ? [{ debugName: "unwrapped" }] : /* istanbul ignore next */ []));
474
+ crumbs = computed(() => this.all().filter((c) => c.active()), /* @ts-ignore */
475
+ ...(ngDevMode ? [{ debugName: "crumbs" }] : /* istanbul ignore next */ []));
476
+ unwrapped = computed(() => this.crumbs().map((c) => c()), /* @ts-ignore */
477
+ ...(ngDevMode ? [{ debugName: "unwrapped" }] : /* istanbul ignore next */ []));
473
478
  register(breadcrumb) {
474
479
  this.map.inline((m) => m.set(breadcrumb.id, breadcrumb));
475
480
  }
476
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: BreadcrumbStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
477
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: BreadcrumbStore, providedIn: 'root' });
481
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: BreadcrumbStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
482
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: BreadcrumbStore, providedIn: 'root' });
478
483
  }
479
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: BreadcrumbStore, decorators: [{
484
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: BreadcrumbStore, decorators: [{
480
485
  type: Injectable,
481
486
  args: [{
482
487
  providedIn: 'root',
@@ -574,7 +579,8 @@ function createBreadcrumb(factoryOrValue) {
574
579
  const fp = resolver(route);
575
580
  const tree = createUrlTreeFromSnapshot(route, [], route.queryParams, route.fragment);
576
581
  const provided = factory();
577
- const link = computed(() => router.serializeUrl(tree), ...(ngDevMode ? [{ debugName: "link" }] : /* istanbul ignore next */ []));
582
+ const link = computed(() => router.serializeUrl(tree), /* @ts-ignore */
583
+ ...(ngDevMode ? [{ debugName: "link" }] : /* istanbul ignore next */ []));
578
584
  const { label, ariaLabel = label } = provided;
579
585
  const bc = {
580
586
  id: fp,
@@ -597,10 +603,10 @@ class PreloadRequester {
597
603
  startPreload(routePath) {
598
604
  this.preloadOnDemand$.next(routePath);
599
605
  }
600
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: PreloadRequester, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
601
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: PreloadRequester, providedIn: 'root' });
606
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: PreloadRequester, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
607
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: PreloadRequester, providedIn: 'root' });
602
608
  }
603
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: PreloadRequester, decorators: [{
609
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: PreloadRequester, decorators: [{
604
610
  type: Injectable,
605
611
  args: [{ providedIn: 'root' }]
606
612
  }] });
@@ -678,10 +684,10 @@ class PreloadStrategy {
678
684
  const predicate = createRoutePredicate(fp);
679
685
  return this.req.preloadRequested$.pipe(filter$1((path) => path === fp || predicate(path)), take(1), switchMap(() => load()), finalize(() => this.loading.delete(fp)));
680
686
  }
681
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: PreloadStrategy, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
682
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: PreloadStrategy, providedIn: 'root' });
687
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: PreloadStrategy, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
688
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: PreloadStrategy, providedIn: 'root' });
683
689
  }
684
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: PreloadStrategy, decorators: [{
690
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: PreloadStrategy, decorators: [{
685
691
  type: Injectable,
686
692
  args: [{
687
693
  providedIn: 'root',
@@ -827,26 +833,38 @@ class Link {
827
833
  }) ?? inject(RouterLinkWithHref, { self: true, optional: true });
828
834
  req = inject(PreloadRequester);
829
835
  router = inject(Router);
830
- target = input(...(ngDevMode ? [undefined, { debugName: "target" }] : /* istanbul ignore next */ []));
831
- queryParams = input(...(ngDevMode ? [undefined, { debugName: "queryParams" }] : /* istanbul ignore next */ []));
832
- fragment = input(...(ngDevMode ? [undefined, { debugName: "fragment" }] : /* istanbul ignore next */ []));
833
- queryParamsHandling = input(...(ngDevMode ? [undefined, { debugName: "queryParamsHandling" }] : /* istanbul ignore next */ []));
834
- state = input(...(ngDevMode ? [undefined, { debugName: "state" }] : /* istanbul ignore next */ []));
835
- info = input(...(ngDevMode ? [undefined, { debugName: "info" }] : /* istanbul ignore next */ []));
836
- relativeTo = input(...(ngDevMode ? [undefined, { debugName: "relativeTo" }] : /* istanbul ignore next */ []));
836
+ target = input(/* @ts-ignore */
837
+ ...(ngDevMode ? [undefined, { debugName: "target" }] : /* istanbul ignore next */ []));
838
+ queryParams = input(/* @ts-ignore */
839
+ ...(ngDevMode ? [undefined, { debugName: "queryParams" }] : /* istanbul ignore next */ []));
840
+ fragment = input(/* @ts-ignore */
841
+ ...(ngDevMode ? [undefined, { debugName: "fragment" }] : /* istanbul ignore next */ []));
842
+ queryParamsHandling = input(/* @ts-ignore */
843
+ ...(ngDevMode ? [undefined, { debugName: "queryParamsHandling" }] : /* istanbul ignore next */ []));
844
+ state = input(/* @ts-ignore */
845
+ ...(ngDevMode ? [undefined, { debugName: "state" }] : /* istanbul ignore next */ []));
846
+ info = input(/* @ts-ignore */
847
+ ...(ngDevMode ? [undefined, { debugName: "info" }] : /* istanbul ignore next */ []));
848
+ relativeTo = input(/* @ts-ignore */
849
+ ...(ngDevMode ? [undefined, { debugName: "relativeTo" }] : /* istanbul ignore next */ []));
837
850
  skipLocationChange = input(false, { ...(ngDevMode ? { debugName: "skipLocationChange" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
838
851
  replaceUrl = input(false, { ...(ngDevMode ? { debugName: "replaceUrl" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
839
- mmLink = input(null, ...(ngDevMode ? [{ debugName: "mmLink" }] : /* istanbul ignore next */ []));
840
- preloadOn = input(injectConfig().preloadOn, ...(ngDevMode ? [{ debugName: "preloadOn" }] : /* istanbul ignore next */ []));
852
+ mmLink = input(null, /* @ts-ignore */
853
+ ...(ngDevMode ? [{ debugName: "mmLink" }] : /* istanbul ignore next */ []));
854
+ preloadOn = input(injectConfig().preloadOn, /* @ts-ignore */
855
+ ...(ngDevMode ? [{ debugName: "preloadOn" }] : /* istanbul ignore next */ []));
841
856
  useMouseDown = input(injectConfig().useMouseDown, { ...(ngDevMode ? { debugName: "useMouseDown" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
842
- beforeNavigate = input(...(ngDevMode ? [undefined, { debugName: "beforeNavigate" }] : /* istanbul ignore next */ []));
857
+ beforeNavigate = input(/* @ts-ignore */
858
+ ...(ngDevMode ? [undefined, { debugName: "beforeNavigate" }] : /* istanbul ignore next */ []));
843
859
  preloading = output();
844
860
  urlTree = computed(() => {
845
861
  return inputToUrlTree(this.router, this.mmLink(), this.relativeTo(), this.queryParams(), this.fragment(), this.queryParamsHandling(), this.routerLink?.urlTree);
846
- }, ...(ngDevMode ? [{ debugName: "urlTree" }] : /* istanbul ignore next */ []));
862
+ }, /* @ts-ignore */
863
+ ...(ngDevMode ? [{ debugName: "urlTree" }] : /* istanbul ignore next */ []));
847
864
  fullPath = computed(() => {
848
865
  return treeToSerializedUrl(this.router, this.urlTree());
849
- }, ...(ngDevMode ? [{ debugName: "fullPath" }] : /* istanbul ignore next */ []));
866
+ }, /* @ts-ignore */
867
+ ...(ngDevMode ? [{ debugName: "fullPath" }] : /* istanbul ignore next */ []));
850
868
  onHover() {
851
869
  if (untracked(this.preloadOn) !== 'hover')
852
870
  return;
@@ -882,10 +900,10 @@ class Link {
882
900
  untracked(this.beforeNavigate)?.();
883
901
  return this.routerLink?.onClick(button, ctrlKey, shiftKey, altKey, metaKey);
884
902
  }
885
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: Link, deps: [], target: i0.ɵɵFactoryTarget.Directive });
886
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.12", type: Link, isStandalone: true, selector: "[mmLink]", inputs: { target: { classPropertyName: "target", publicName: "target", isSignal: true, isRequired: false, transformFunction: null }, queryParams: { classPropertyName: "queryParams", publicName: "queryParams", isSignal: true, isRequired: false, transformFunction: null }, fragment: { classPropertyName: "fragment", publicName: "fragment", isSignal: true, isRequired: false, transformFunction: null }, queryParamsHandling: { classPropertyName: "queryParamsHandling", publicName: "queryParamsHandling", isSignal: true, isRequired: false, transformFunction: null }, state: { classPropertyName: "state", publicName: "state", isSignal: true, isRequired: false, transformFunction: null }, info: { classPropertyName: "info", publicName: "info", isSignal: true, isRequired: false, transformFunction: null }, relativeTo: { classPropertyName: "relativeTo", publicName: "relativeTo", isSignal: true, isRequired: false, transformFunction: null }, skipLocationChange: { classPropertyName: "skipLocationChange", publicName: "skipLocationChange", isSignal: true, isRequired: false, transformFunction: null }, replaceUrl: { classPropertyName: "replaceUrl", publicName: "replaceUrl", isSignal: true, isRequired: false, transformFunction: null }, mmLink: { classPropertyName: "mmLink", publicName: "mmLink", isSignal: true, isRequired: false, transformFunction: null }, preloadOn: { classPropertyName: "preloadOn", publicName: "preloadOn", isSignal: true, isRequired: false, transformFunction: null }, useMouseDown: { classPropertyName: "useMouseDown", publicName: "useMouseDown", isSignal: true, isRequired: false, transformFunction: null }, beforeNavigate: { classPropertyName: "beforeNavigate", publicName: "beforeNavigate", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { preloading: "preloading" }, host: { listeners: { "mouseenter": "onHover()", "mousedown": "onMouseDown($event.button,$event.ctrlKey,$event.shiftKey,$event.altKey,$event.metaKey)", "click": "onClick($event.button,$event.ctrlKey,$event.shiftKey,$event.altKey,$event.metaKey)" } }, exportAs: ["mmLink"], hostDirectives: [{ directive: i1.RouterLink, inputs: ["routerLink", "mmLink", "target", "target", "queryParams", "queryParams", "fragment", "fragment", "queryParamsHandling", "queryParamsHandling", "state", "state", "relativeTo", "relativeTo", "skipLocationChange", "skipLocationChange", "replaceUrl", "replaceUrl"] }], ngImport: i0 });
903
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: Link, deps: [], target: i0.ɵɵFactoryTarget.Directive });
904
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.0", type: Link, isStandalone: true, selector: "[mmLink]", inputs: { target: { classPropertyName: "target", publicName: "target", isSignal: true, isRequired: false, transformFunction: null }, queryParams: { classPropertyName: "queryParams", publicName: "queryParams", isSignal: true, isRequired: false, transformFunction: null }, fragment: { classPropertyName: "fragment", publicName: "fragment", isSignal: true, isRequired: false, transformFunction: null }, queryParamsHandling: { classPropertyName: "queryParamsHandling", publicName: "queryParamsHandling", isSignal: true, isRequired: false, transformFunction: null }, state: { classPropertyName: "state", publicName: "state", isSignal: true, isRequired: false, transformFunction: null }, info: { classPropertyName: "info", publicName: "info", isSignal: true, isRequired: false, transformFunction: null }, relativeTo: { classPropertyName: "relativeTo", publicName: "relativeTo", isSignal: true, isRequired: false, transformFunction: null }, skipLocationChange: { classPropertyName: "skipLocationChange", publicName: "skipLocationChange", isSignal: true, isRequired: false, transformFunction: null }, replaceUrl: { classPropertyName: "replaceUrl", publicName: "replaceUrl", isSignal: true, isRequired: false, transformFunction: null }, mmLink: { classPropertyName: "mmLink", publicName: "mmLink", isSignal: true, isRequired: false, transformFunction: null }, preloadOn: { classPropertyName: "preloadOn", publicName: "preloadOn", isSignal: true, isRequired: false, transformFunction: null }, useMouseDown: { classPropertyName: "useMouseDown", publicName: "useMouseDown", isSignal: true, isRequired: false, transformFunction: null }, beforeNavigate: { classPropertyName: "beforeNavigate", publicName: "beforeNavigate", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { preloading: "preloading" }, host: { listeners: { "mouseenter": "onHover()", "mousedown": "onMouseDown($event.button,$event.ctrlKey,$event.shiftKey,$event.altKey,$event.metaKey)", "click": "onClick($event.button,$event.ctrlKey,$event.shiftKey,$event.altKey,$event.metaKey)" } }, exportAs: ["mmLink"], hostDirectives: [{ directive: i1.RouterLink, inputs: ["routerLink", "mmLink", "target", "target", "queryParams", "queryParams", "fragment", "fragment", "queryParamsHandling", "queryParamsHandling", "state", "state", "relativeTo", "relativeTo", "skipLocationChange", "skipLocationChange", "replaceUrl", "replaceUrl"] }], ngImport: i0 });
887
905
  }
888
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: Link, decorators: [{
906
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: Link, decorators: [{
889
907
  type: Directive,
890
908
  args: [{
891
909
  selector: '[mmLink]',
@@ -931,7 +949,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImpo
931
949
  }] } });
932
950
 
933
951
  /** @internal */
934
- const NEVER_TRUE = computed(() => false, ...(ngDevMode ? [{ debugName: "NEVER_TRUE" }] : /* istanbul ignore next */ []));
952
+ const NEVER_TRUE = computed(() => false, /* @ts-ignore */
953
+ ...(ngDevMode ? [{ debugName: "NEVER_TRUE" }] : /* istanbul ignore next */ []));
935
954
  function wrap(value, fallback) {
936
955
  if (value === undefined)
937
956
  return fallback ? fallback : computed(() => undefined);
@@ -976,22 +995,28 @@ function resolveMeta(input) {
976
995
  function createInternalNavItem(input, router, relativeTo, configActiveMatch, parentDisabled, parentHidden, fallbackId) {
977
996
  const label = wrap(input.label);
978
997
  const ariaLabel = input.ariaLabel ? wrap(input.ariaLabel) : label;
979
- const linkTree = computed(() => resolveLinkTree(input.link, router, relativeTo), ...(ngDevMode ? [{ debugName: "linkTree" }] : /* istanbul ignore next */ []));
998
+ const linkTree = computed(() => resolveLinkTree(input.link, router, relativeTo), /* @ts-ignore */
999
+ ...(ngDevMode ? [{ debugName: "linkTree" }] : /* istanbul ignore next */ []));
980
1000
  const link = computed(() => {
981
1001
  const tree = linkTree();
982
1002
  return tree ? router.serializeUrl(tree) : null;
983
- }, ...(ngDevMode ? [{ debugName: "link" }] : /* istanbul ignore next */ []));
1003
+ }, /* @ts-ignore */
1004
+ ...(ngDevMode ? [{ debugName: "link" }] : /* istanbul ignore next */ []));
984
1005
  const ownDisabled = wrap(input.disabled, NEVER_TRUE);
985
1006
  const ownHidden = wrap(input.hidden, NEVER_TRUE);
986
- const disabled = computed(() => parentDisabled() || ownDisabled(), ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
987
- const hidden = computed(() => parentHidden() || ownHidden(), ...(ngDevMode ? [{ debugName: "hidden" }] : /* istanbul ignore next */ []));
1007
+ const disabled = computed(() => parentDisabled() || ownDisabled(), /* @ts-ignore */
1008
+ ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
1009
+ const hidden = computed(() => parentHidden() || ownHidden(), /* @ts-ignore */
1010
+ ...(ngDevMode ? [{ debugName: "hidden" }] : /* istanbul ignore next */ []));
988
1011
  const metaInput = input.meta;
989
- const meta = computed(() => resolveMeta(metaInput), ...(ngDevMode ? [{ debugName: "meta" }] : /* istanbul ignore next */ []));
1012
+ const meta = computed(() => resolveMeta(metaInput), /* @ts-ignore */
1013
+ ...(ngDevMode ? [{ debugName: "meta" }] : /* istanbul ignore next */ []));
990
1014
  const id = input.id !== undefined
991
1015
  ? wrap(input.id)
992
1016
  : computed(() => link() ?? fallbackId);
993
1017
  const childItems = (input.children ?? []).map((childInput, i) => createInternalNavItem(childInput, router, relativeTo, configActiveMatch, disabled, hidden, `${fallbackId}.${i}`));
994
- const children = computed(() => childItems.filter((c) => !c.hidden()), ...(ngDevMode ? [{ debugName: "children" }] : /* istanbul ignore next */ []));
1018
+ const children = computed(() => childItems.filter((c) => !c.hidden()), /* @ts-ignore */
1019
+ ...(ngDevMode ? [{ debugName: "children" }] : /* istanbul ignore next */ []));
995
1020
  const mergedActiveMatch = {
996
1021
  ...configActiveMatch,
997
1022
  ...input.activeMatch,
@@ -1008,12 +1033,14 @@ function createInternalNavItem(input, router, relativeTo, configActiveMatch, par
1008
1033
  trackNavigation();
1009
1034
  const tree = linkTree();
1010
1035
  return tree ? router.isActive(tree, finalOptions) : false;
1011
- }, ...(ngDevMode ? [{ debugName: "ownActive" }] : /* istanbul ignore next */ []));
1036
+ }, /* @ts-ignore */
1037
+ ...(ngDevMode ? [{ debugName: "ownActive" }] : /* istanbul ignore next */ []));
1012
1038
  const orWithChildren = input.matchesWhenChildActive ?? input.activeMatch === undefined;
1013
1039
  const active = computed(() => ownActive() ||
1014
1040
  (orWithChildren &&
1015
1041
  !!childItems.length &&
1016
- childItems.some((c) => c.active())), ...(ngDevMode ? [{ debugName: "active" }] : /* istanbul ignore next */ []));
1042
+ childItems.some((c) => c.active())), /* @ts-ignore */
1043
+ ...(ngDevMode ? [{ debugName: "active" }] : /* istanbul ignore next */ []));
1017
1044
  return {
1018
1045
  id,
1019
1046
  label,
@@ -1154,10 +1181,10 @@ class NavStore {
1154
1181
  return inputs.map((input, i) => createInternalNavItem(input, this.router, rootSnapshot, this.config.activeMatch, NEVER_TRUE, NEVER_TRUE, `${prefix}#${i}`));
1155
1182
  }));
1156
1183
  }
1157
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: NavStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1158
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: NavStore, providedIn: 'root' });
1184
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NavStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1185
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NavStore, providedIn: 'root' });
1159
1186
  }
1160
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: NavStore, decorators: [{
1187
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NavStore, decorators: [{
1161
1188
  type: Injectable,
1162
1189
  args: [{ providedIn: 'root' }]
1163
1190
  }] });
@@ -1347,7 +1374,8 @@ function queryParam(key, route = inject(ActivatedRoute)) {
1347
1374
  const queryParams = toSignal(route.queryParams, {
1348
1375
  initialValue: route.snapshot.queryParams,
1349
1376
  });
1350
- const queryParam = computed(() => queryParamMap().get(keySignal()), ...(ngDevMode ? [{ debugName: "queryParam" }] : /* istanbul ignore next */ []));
1377
+ const queryParam = computed(() => queryParamMap().get(keySignal()), /* @ts-ignore */
1378
+ ...(ngDevMode ? [{ debugName: "queryParam" }] : /* istanbul ignore next */ []));
1351
1379
  const set = (newValue) => {
1352
1380
  const next = {
1353
1381
  ...untracked(queryParams),
@@ -1428,14 +1456,17 @@ class TitleStore {
1428
1456
  const leafRoutes = injectLeafRoutes();
1429
1457
  const title = inject(Title);
1430
1458
  const fallbackTitle = initialTitle || untracked(() => title.getTitle());
1431
- const reverseLeaves = computed(() => leafRoutes().toReversed(), ...(ngDevMode ? [{ debugName: "reverseLeaves" }] : /* istanbul ignore next */ []));
1459
+ const reverseLeaves = computed(() => leafRoutes().toReversed(), /* @ts-ignore */
1460
+ ...(ngDevMode ? [{ debugName: "reverseLeaves" }] : /* istanbul ignore next */ []));
1432
1461
  const currentResolvedTitles = computed(() => {
1433
1462
  const map = this.map();
1434
1463
  return reverseLeaves()
1435
1464
  .map((leaf) => map.get(leaf.path)?.() ?? leaf.route.title ?? null)
1436
1465
  .filter((v) => v !== null);
1437
- }, ...(ngDevMode ? [{ debugName: "currentResolvedTitles" }] : /* istanbul ignore next */ []));
1438
- const currentTitle = computed(() => currentResolvedTitles().at(0) ?? '', ...(ngDevMode ? [{ debugName: "currentTitle" }] : /* istanbul ignore next */ []));
1466
+ }, /* @ts-ignore */
1467
+ ...(ngDevMode ? [{ debugName: "currentResolvedTitles" }] : /* istanbul ignore next */ []));
1468
+ const currentTitle = computed(() => currentResolvedTitles().at(0) ?? '', /* @ts-ignore */
1469
+ ...(ngDevMode ? [{ debugName: "currentTitle" }] : /* istanbul ignore next */ []));
1439
1470
  const heldTitle = keepLastKnown
1440
1471
  ? linkedSignal({
1441
1472
  source: () => currentTitle(),
@@ -1453,10 +1484,10 @@ class TitleStore {
1453
1484
  register(id, titleFn) {
1454
1485
  this.map.inline((m) => m.set(id, titleFn));
1455
1486
  }
1456
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: TitleStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1457
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: TitleStore, providedIn: 'root' });
1487
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: TitleStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1488
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: TitleStore, providedIn: 'root' });
1458
1489
  }
1459
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: TitleStore, decorators: [{
1490
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: TitleStore, decorators: [{
1460
1491
  type: Injectable,
1461
1492
  args: [{
1462
1493
  providedIn: 'root',
@@ -1517,7 +1548,8 @@ function createTitle(factoryOrValue, awaitValue = false) {
1517
1548
  const titleSignal = typeof resolved === 'string'
1518
1549
  ? computed(() => resolved)
1519
1550
  : computed(resolved);
1520
- const parsedTitleSignal = computed(() => parser(titleSignal()), ...(ngDevMode ? [{ debugName: "parsedTitleSignal" }] : /* istanbul ignore next */ []));
1551
+ const parsedTitleSignal = computed(() => parser(titleSignal()), /* @ts-ignore */
1552
+ ...(ngDevMode ? [{ debugName: "parsedTitleSignal" }] : /* istanbul ignore next */ []));
1521
1553
  store.register(fp, parsedTitleSignal);
1522
1554
  if (awaitValue)
1523
1555
  await until(parsedTitleSignal, (v) => !!v);
@@ -1 +1 @@
1
- {"version":3,"file":"mmstack-router-core.mjs","sources":["../../../../../packages/router/core/src/lib/util/create-route-predicate.ts","../../../../../packages/router/core/src/lib/util/find-path.ts","../../../../../packages/router/core/src/lib/url.ts","../../../../../packages/router/core/src/lib/util/leaf.store.ts","../../../../../packages/router/core/src/lib/util/snapshot-path.ts","../../../../../packages/router/core/src/lib/breadcrumb/breadcrumb.ts","../../../../../packages/router/core/src/lib/breadcrumb/breadcrumb-config.ts","../../../../../packages/router/core/src/lib/breadcrumb/breadcrumb-store.ts","../../../../../packages/router/core/src/lib/breadcrumb/breadcrumb-resolver.ts","../../../../../packages/router/core/src/lib/preloading/preload-requester.ts","../../../../../packages/router/core/src/lib/preloading/preload-strategy.ts","../../../../../packages/router/core/src/lib/link.ts","../../../../../packages/router/core/src/lib/nav/nav.ts","../../../../../packages/router/core/src/lib/nav/nav-config.ts","../../../../../packages/router/core/src/lib/nav/nav-store.ts","../../../../../packages/router/core/src/lib/nav/nav-resolver.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":["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, type 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, type Signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport {\n type Event,\n EventType,\n type NavigationEnd,\n Router,\n} from '@angular/router';\nimport { filter, map } from 'rxjs/operators';\n\n/**\n * Type guard to check if a Router Event is a NavigationEnd event.\n * @internal\n */\nfunction isNavigationEnd(e: Event): e is NavigationEnd {\n return 'type' in e && e.type === EventType.NavigationEnd;\n}\n\n/**\n * Creates a Signal that tracks the current router URL.\n *\n * The signal emits the URL string reflecting the router state *after* redirects\n * have completed for each successful navigation. It initializes with the router's\n * current URL state.\n *\n * @returns {Signal<string>} A Signal emitting the `urlAfterRedirects` upon successful navigation.\n *\n * @example\n * ```ts\n * import { Component, effect } from '@angular/core';\n * import { url } from '@mmstack/router-core'; // Adjust import path\n *\n * @Component({\n * selector: 'app-root',\n * template: `Current URL: {{ currentUrl() }}`\n * })\n * export class AppComponent {\n * currentUrl = url();\n *\n * constructor() {\n * effect(() => {\n * console.log('Navigation ended. New URL:', this.currentUrl());\n * // e.g., track page view with analytics\n * });\n * }\n * }\n * ```\n */\nexport function url(router?: Router): Signal<string> {\n if (!router) router = inject(Router);\n\n return toSignal(\n router.events.pipe(\n filter(isNavigationEnd),\n map((e) => e.urlAfterRedirects),\n ),\n {\n initialValue: router.url,\n },\n );\n}\n","import { computed, inject, Injectable, type Signal } from '@angular/core';\nimport {\n type ActivatedRouteSnapshot,\n Router,\n type RouterStateSnapshot,\n} from '@angular/router';\nimport { url } from '../url';\n\n/**\n * A flattened view of one route in the active router chain, used by the\n * breadcrumb and title subsystems. Each `ResolvedLeafRoute` describes one\n * \"step\" in the chain from root to current leaf.\n *\n * Exposed publicly because custom breadcrumb generators (see\n * {@link BreadcrumbConfig}'s `generation` callback) receive instances of\n * this type and need to read its fields.\n *\n * - `route` — the underlying `ActivatedRouteSnapshot`.\n * - `segment.path` — the route config segment (e.g. `:userId`).\n * - `segment.resolved` — the resolved value of that segment (e.g. `'42'`).\n * - `path` — the full route-config path from root (with raw segments like `:userId`).\n * - `link` — the full resolved URL from root (with substituted values).\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 { inject } from '@angular/core';\nimport { type 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 { 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 { inject, InjectionToken } from '@angular/core';\nimport { type 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>(\n '@mmstack/router-core:breadcrumb-config',\n);\n\n/**\n * Provides configuration for the breadcrumb system.\n *\n * @param config A partial {@link BreadcrumbConfig}. The `generation` field controls\n * automatic label generation: `'manual'` disables it (breadcrumbs only show when\n * {@link createBreadcrumb} explicitly registers them); a function provides a\n * custom label generator instead of the default route-title-based one.\n * @returns A `Provider` to add to your app's providers array.\n *\n * @see BreadcrumbConfig\n *\n * @example\n * ```ts\n * // Disable automatic generation — breadcrumbs only appear when createBreadcrumb is used\n * bootstrapApplication(AppComponent, {\n * providers: [\n * provideRouter(routes),\n * provideBreadcrumbConfig({ generation: 'manual' }),\n * ],\n * });\n * ```\n *\n * @example\n * ```ts\n * // Custom label strategy — outer fn runs in injection context, inner is reactive\n * const customLabelStrategy = () => (leaf: ResolvedLeafRoute) =>\n * leaf.route.data?.['navTitle'] ?? leaf.route.title ?? 'Unnamed';\n *\n * provideBreadcrumbConfig({ generation: customLabelStrategy });\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 { computed, inject, Injectable, type Signal } from '@angular/core';\nimport { mapArray, mutable } from '@mmstack/primitives';\nimport { injectLeafRoutes, type ResolvedLeafRoute } from '../util/leaf.store';\nimport {\n type Breadcrumb,\n createInternalBreadcrumb,\n getBreadcrumbInternals,\n type InternalBreadcrumb,\n isInternalBreadcrumb,\n} from './breadcrumb';\nimport { injectBreadcrumbConfig } from './breadcrumb-config';\n\nfunction uppercaseFirst(str: string): string {\n const lcs = str.toLowerCase();\n return lcs.charAt(0).toUpperCase() + lcs.slice(1);\n}\n\nfunction removeMatrixAndQueryParams(path: string): string {\n const [cleanPath] = path.split(';');\n return cleanPath.split('?')[0];\n}\n\nfunction parsePathSegment(pathSegment: string): string {\n return pathSegment\n .split('/')\n .flatMap((part) => part.split('.'))\n .flatMap((part) => part.split('-'))\n .map((part) => uppercaseFirst(removeMatrixAndQueryParams(part)))\n .join(' ');\n}\n\nfunction generateLabel(leaf: ResolvedLeafRoute): string {\n const title = leaf.route.title ?? leaf.route.data?.['title'];\n\n if (title && typeof title === 'string') return title;\n if (leaf.segment.path.includes(':')) return leaf.segment.resolved;\n\n return parsePathSegment(leaf.segment.path);\n}\n\nfunction autoGenerateBreadcrumb(\n id: string,\n leaf: Signal<ResolvedLeafRoute>,\n autoGenerateFn: Signal<(leaf: ResolvedLeafRoute) => string>,\n): Breadcrumb {\n const label = computed(() => autoGenerateFn()(leaf()));\n\n return createInternalBreadcrumb(\n {\n id,\n label,\n ariaLabel: label,\n link: computed(() => leaf().link),\n },\n computed(\n () =>\n leaf().route.data?.['skipBreadcrumb'] !== true &&\n id !== '' &&\n id !== '/' &&\n leaf().segment.path !== '' &&\n leaf().segment.path !== '/' &&\n !leaf().segment.path.endsWith('/') &&\n !!label(),\n ),\n false,\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","import { computed, inject } from '@angular/core';\nimport {\n createUrlTreeFromSnapshot,\n Router,\n type ResolveFn,\n} from '@angular/router';\nimport { until } from '@mmstack/primitives';\nimport { injectSnapshotPathResolver } from '../util';\nimport { createInternalBreadcrumb, type Breadcrumb } from './breadcrumb';\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\n/**\n * Creates and registers a breadcrumb for a specific route. Designed to be used\n * as an Angular Route `ResolveFn` in the route's `resolve` map.\n *\n * Accepts a static label, a static options object, or a factory returning\n * either — use a factory when you need `inject()` to read dynamic data.\n *\n * @param factoryOrValue One of: a literal label string (shorthand for\n * `{ label: <string> }`), a static {@link CreateBreadcrumbOptions} object,\n * or a factory `() => string | CreateBreadcrumbOptions` invoked inside an\n * injection context (so it can use `inject()`).\n * @returns An Angular `ResolveFn<void>` to wire into a route's `resolve` map.\n * The resolver registers the breadcrumb as a side effect; the resolved value\n * itself is unused.\n *\n * @see CreateBreadcrumbOptions\n *\n * @example\n * ```ts\n * export const appRoutes: Routes = [\n * {\n * path: 'home',\n * component: HomeComponent,\n * resolve: {\n * // shorthand for { label: 'Home' }\n * breadcrumb: createBreadcrumb('Home'),\n * },\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 factoryOrValue:\n | (() => CreateBreadcrumbOptions | string)\n | string\n | CreateBreadcrumbOptions,\n): ResolveFn<void> {\n const factory =\n typeof factoryOrValue === 'string'\n ? (): CreateBreadcrumbOptions => ({ label: factoryOrValue })\n : typeof factoryOrValue === 'function'\n ? (): CreateBreadcrumbOptions => {\n const result = factoryOrValue();\n return typeof result === 'string' ? { label: result } : result;\n }\n : () => factoryOrValue;\n\n return async (route) => {\n const router = inject(Router);\n const store = inject(BreadcrumbStore);\n const resolver = injectSnapshotPathResolver();\n\n const fp = resolver(route);\n\n const tree = createUrlTreeFromSnapshot(\n route,\n [],\n route.queryParams,\n route.fragment,\n );\n\n const provided = factory();\n\n const link = computed(() => router.serializeUrl(tree));\n\n const { label, ariaLabel = label } = provided;\n\n const bc: Breadcrumb = {\n id: fp,\n ariaLabel:\n typeof ariaLabel === 'string'\n ? computed(() => ariaLabel)\n : computed(ariaLabel),\n label:\n typeof label === 'string' ? computed(() => label) : computed(label),\n link,\n };\n\n store.register(\n createInternalBreadcrumb(\n bc,\n computed(() => route.data?.['skipBreadcrumb'] !== true),\n ),\n );\n\n if (provided.awaitValue) await until(bc.label, (v) => !!v);\n\n return Promise.resolve();\n };\n}\n","import { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\n\n@Injectable({ providedIn: 'root' })\nexport class PreloadRequester {\n private readonly preloadOnDemand$ = new Subject<string>();\n readonly preloadRequested$ = this.preloadOnDemand$.asObservable();\n\n startPreload(routePath: string) {\n this.preloadOnDemand$.next(routePath);\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { type PreloadingStrategy, type Route, Router } from '@angular/router';\nimport { EMPTY, filter, finalize, type Observable, switchMap, take } from 'rxjs';\nimport { createRoutePredicate, findPath } from '../util';\nimport { PreloadRequester } from './preload-requester';\n\nfunction hasSlowConnection() {\n if (\n globalThis.window &&\n 'navigator' in globalThis.window &&\n 'connection' in globalThis.window.navigator &&\n typeof globalThis.window.navigator.connection === 'object' &&\n !!globalThis.window.navigator.connection\n ) {\n const is2g =\n 'effectiveType' in globalThis.window.navigator.connection &&\n typeof globalThis.window.navigator.connection.effectiveType ===\n 'string' &&\n globalThis.window.navigator.connection.effectiveType.endsWith('2g');\n if (is2g) return true;\n if (\n 'saveData' in globalThis.window.navigator.connection &&\n typeof globalThis.window.navigator.connection.saveData === 'boolean' &&\n globalThis.window.navigator.connection.saveData\n )\n return true;\n }\n\n return false;\n}\n\nfunction noPreload(route: Route) {\n return route.data && route.data['preload'] === false;\n}\n\n/**\n * Demand-driven preloading strategy for Angular's router. Unlike Angular's\n * built-in `PreloadAllModules`, this strategy preloads a lazy route only\n * when something explicitly requests it via {@link PreloadRequester} (e.g.\n * the `mmLink` directive on hover or visibility, or {@link injectTriggerPreload}\n * called imperatively).\n *\n * Skips preloading when:\n * - the route has `data.preload === false`\n * - the network is on `2g` or in `saveData` mode (cheap-data-mode users)\n * - a load for the same path is already in flight\n *\n * Wire this into `provideRouter` to enable the `mmLink` preload pipeline:\n *\n * @example\n * ```ts\n * import { PreloadStrategy } from '@mmstack/router-core';\n * import { provideRouter, withPreloading } from '@angular/router';\n *\n * bootstrapApplication(AppComponent, {\n * providers: [\n * provideRouter(routes, withPreloading(PreloadStrategy)),\n * ],\n * });\n *\n * // Then in templates, `mmLink` (or `injectTriggerPreload`) requests\n * // preloads that this strategy executes:\n * // <a [mmLink]=\"'/users'\">Users</a>\n * ```\n *\n * @example\n * ```ts\n * // Opt a route out of preloading:\n * export const routes: Routes = [\n * { path: 'admin', loadChildren: () => import('./admin'), data: { preload: false } },\n * ];\n * ```\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class PreloadStrategy implements PreloadingStrategy {\n private readonly loading = new Set<string>();\n private readonly router = inject(Router);\n private readonly req = inject(PreloadRequester);\n\n preload(route: Route, load: () => Observable<any>): Observable<any> {\n if (noPreload(route) || hasSlowConnection()) return EMPTY;\n\n const fp = findPath(this.router.config, route);\n\n if (this.loading.has(fp)) return EMPTY;\n\n const predicate = createRoutePredicate(fp);\n return this.req.preloadRequested$.pipe(\n filter((path) => path === fp || predicate(path)),\n take(1),\n switchMap(() => load()),\n finalize(() => this.loading.delete(fp)),\n );\n }\n}\n","import {\n booleanAttribute,\n computed,\n Directive,\n effect,\n HostListener,\n inject,\n InjectionToken,\n input,\n output,\n type Provider,\n untracked,\n} from '@angular/core';\nimport {\n type ActivatedRoute,\n type Params,\n Router,\n RouterLink,\n RouterLinkWithHref,\n UrlTree,\n} from '@angular/router';\nimport { elementVisibility } from '@mmstack/primitives';\nimport { PreloadRequester } from './preloading';\n\nfunction inputToUrlTree(\n router: Router,\n link: string | any[] | UrlTree | null,\n relativeTo?: ActivatedRoute,\n queryParams?: Params,\n fragment?: string,\n queryParamsHandling?: 'merge' | 'preserve' | '',\n routerLinkUrlTree?: UrlTree | null,\n): UrlTree | null {\n if (!link) return null;\n if (routerLinkUrlTree) return routerLinkUrlTree;\n\n if (link instanceof UrlTree) return link;\n\n const arr = Array.isArray(link) ? link : [link];\n\n return router.createUrlTree(arr, {\n relativeTo,\n queryParams,\n fragment,\n queryParamsHandling,\n });\n}\n\nfunction treeToSerializedUrl(\n router: Router,\n urlTree: UrlTree | null,\n): string | null {\n if (!urlTree) return null;\n return router.serializeUrl(urlTree);\n}\n\n/**\n * Returns an imperative function that triggers preloading for an arbitrary link, using\n * the same path resolution and {@link PreloadStrategy} pipeline as the {@link Link}\n * (`mmLink`) directive.\n *\n * Use this when the `Link` directive isn't a fit — for example, preloading a route from\n * an effect when a user opens a menu, hovers a non-link element, or reacts to a signal\n * change — and you don't want to render an `<a [mmLink]>` just to request the preload.\n *\n * Requires {@link PreloadStrategy} to be wired up via `provideRouter(routes, withPreloading(PreloadStrategy))`,\n * just like the directive.\n *\n * @returns A function accepting the same link descriptor shape as `mmLink` (`string`,\n * commands array, `UrlTree`, or `null`). Passing `null` or an unresolvable link is a no-op.\n *\n * @example\n * ```typescript\n * @Component({ ... })\n * export class CommandPaletteComponent {\n * private readonly triggerPreload = injectTriggerPreload();\n *\n * protected readonly highlighted = signal<string | null>(null);\n *\n * constructor() {\n * effect(() => {\n * const target = this.highlighted();\n * if (target) this.triggerPreload(target);\n * });\n * }\n * }\n * ```\n */\nexport function injectTriggerPreload() {\n const req = inject(PreloadRequester);\n const router = inject(Router);\n\n return (\n link: string | any[] | UrlTree | null,\n relativeTo?: ActivatedRoute,\n queryParams?: Params,\n fragment?: string,\n queryParamsHandling?: 'merge' | 'preserve' | '',\n ) => {\n const urlTree = inputToUrlTree(\n router,\n link,\n relativeTo,\n queryParams,\n fragment,\n queryParamsHandling,\n );\n const fullPath = treeToSerializedUrl(router, urlTree);\n if (!fullPath) return;\n\n req.startPreload(fullPath);\n };\n}\n\n/**\n * Configuration for the `mmLink` directive.\n */\ntype MMLinkConfig = {\n /**\n * The default preload behavior for links.\n * Can be 'hover', 'visible', or null (no preloading).\n * @default 'hover'\n */\n preloadOn: 'hover' | 'visible' | null;\n /**\n * Whether to use mouse down events for preloading.\n * @default false\n */\n useMouseDown: boolean;\n};\n\nconst configToken = new InjectionToken<MMLinkConfig>('MMSTACK_LINK_CONFIG');\n\n/**\n * Provide application-wide defaults for the `mmLink` directive. Each `[mmLink]`\n * instance can still override per-link via its own `preloadOn` / `useMouseDown`\n * inputs; this just shifts the default.\n *\n * @param config Partial override of `MMLinkConfig`. Unset keys fall back to:\n * - `preloadOn: 'hover'` — preload triggered when the user hovers a link\n * - `useMouseDown: false` — navigation triggered on click (not mousedown)\n * @returns A `Provider` to add to your app's providers array.\n *\n * @example\n * ```ts\n * bootstrapApplication(AppComponent, {\n * providers: [\n * provideMMLinkDefaultConfig({ preloadOn: 'visible', useMouseDown: true }),\n * ],\n * });\n * ```\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/**\n * Drop-in replacement for `[routerLink]` that adds preloading on hover or\n * visibility, optional mousedown-triggered navigation, and a `beforeNavigate`\n * hook. Composes with Angular's `RouterLink` via `hostDirectives`, so every\n * `RouterLink` input (`target`, `queryParams`, `fragment`, etc.) is forwarded.\n *\n * Preload behavior:\n * - `preloadOn: 'hover'` (default) — preload when the user hovers the link\n * - `preloadOn: 'visible'` — preload when the link scrolls into view\n * - `preloadOn: null` — disable preloading on this link\n *\n * Navigation timing:\n * - `useMouseDown: false` (default) — navigate on click\n * - `useMouseDown: true` — navigate on mousedown (shaves ~50ms but breaks if the user\n * moves off the link before mouseup)\n *\n * Requires {@link PreloadStrategy} to be wired via `provideRouter(routes, withComponentInputBinding(), withPreloading(PreloadStrategy))`.\n * Set app-wide defaults with {@link provideMMLinkDefaultConfig}.\n *\n * @example\n * ```html\n * <a [mmLink]=\"['/users', userId()]\">View profile</a>\n *\n * <!-- Override per-link -->\n * <a [mmLink]=\"'/heavy-page'\" preloadOn=\"visible\" useMouseDown>Heavy page</a>\n *\n * <!-- React to the preload starting -->\n * <a [mmLink]=\"'/checkout'\" (preloading)=\"onPreload()\">Checkout</a>\n * ```\n */\n@Directive({\n selector: '[mmLink]',\n exportAs: 'mmLink',\n host: {\n '(mouseenter)': 'onHover()',\n },\n hostDirectives: [\n {\n directive: RouterLink,\n inputs: [\n 'routerLink: mmLink',\n 'target',\n 'queryParams',\n 'fragment',\n 'queryParamsHandling',\n 'state',\n 'relativeTo',\n 'skipLocationChange',\n 'replaceUrl',\n ],\n },\n ],\n})\nexport class Link {\n private readonly routerLink =\n inject(RouterLink, {\n self: true,\n optional: true,\n }) ?? inject(RouterLinkWithHref, { self: true, optional: true });\n\n private readonly req = inject(PreloadRequester);\n private readonly router = inject(Router);\n\n readonly target = input<string>();\n readonly queryParams = input<Params>();\n readonly fragment = input<string>();\n readonly queryParamsHandling = input<'merge' | 'preserve' | ''>();\n readonly state = input<object>();\n readonly info = input<unknown>();\n readonly relativeTo = input<ActivatedRoute>();\n readonly skipLocationChange = input(false, { transform: booleanAttribute });\n readonly replaceUrl = input(false, { transform: booleanAttribute });\n readonly mmLink = input<string | any[] | UrlTree | null>(null);\n readonly preloadOn = input<'hover' | 'visible' | null>(\n injectConfig().preloadOn,\n );\n readonly useMouseDown = input(injectConfig().useMouseDown, {\n transform: booleanAttribute,\n });\n readonly beforeNavigate = input<() => void>();\n\n readonly preloading = output<void>();\n\n private readonly urlTree = computed(() => {\n return inputToUrlTree(\n this.router,\n this.mmLink(),\n this.relativeTo(),\n this.queryParams(),\n this.fragment(),\n this.queryParamsHandling(),\n this.routerLink?.urlTree,\n );\n });\n\n private readonly fullPath = computed(() => {\n return treeToSerializedUrl(this.router, this.urlTree());\n });\n\n onHover() {\n if (untracked(this.preloadOn) !== 'hover') return;\n this.requestPreload();\n }\n\n @HostListener('mousedown', [\n '$event.button',\n '$event.ctrlKey',\n '$event.shiftKey',\n '$event.altKey',\n '$event.metaKey',\n ])\n onMouseDown(\n button: number,\n ctrlKey: boolean,\n shiftKey: boolean,\n altKey: boolean,\n metaKey: boolean,\n ) {\n if (!untracked(this.useMouseDown)) return;\n return this.trigger(button, ctrlKey, shiftKey, altKey, metaKey);\n }\n\n @HostListener('click', [\n '$event.button',\n '$event.ctrlKey',\n '$event.shiftKey',\n '$event.altKey',\n '$event.metaKey',\n ])\n onClick(\n button: number,\n ctrlKey: boolean,\n shiftKey: boolean,\n altKey: boolean,\n metaKey: boolean,\n ) {\n if (untracked(this.useMouseDown)) return;\n return this.trigger(button, ctrlKey, shiftKey, altKey, metaKey);\n }\n\n constructor() {\n const intersection = elementVisibility();\n\n effect(() => {\n if (this.preloadOn() !== 'visible') return;\n if (intersection.visible()) this.requestPreload();\n });\n }\n\n private requestPreload() {\n const fp = untracked(this.fullPath);\n if (!this.routerLink || !fp) return;\n this.req.startPreload(fp);\n this.preloading.emit();\n }\n\n private trigger(\n button: number,\n ctrlKey: boolean,\n shiftKey: boolean,\n altKey: boolean,\n metaKey: boolean,\n ) {\n untracked(this.beforeNavigate)?.();\n return this.routerLink?.onClick(button, ctrlKey, shiftKey, altKey, metaKey);\n }\n}\n","import { computed, isSignal, type Signal } from '@angular/core';\nimport {\n type ActivatedRouteSnapshot,\n createUrlTreeFromSnapshot,\n type IsActiveMatchOptions,\n type Router,\n UrlTree,\n} from '@angular/router';\nimport { url as currentUrl } from '../url';\n\n/**\n * Description of a single navigation item.\n *\n * Reactive fields accept either a static value or a zero-arg function — the function\n * form is wrapped in a `computed` so reading signals inside it produces a reactive value.\n *\n * @typeParam TMeta Arbitrary consumer-defined metadata round-tripped to {@link NavItem.meta}.\n *\n * @see createNavItems\n * @see NavItem\n */\nexport type CreateNavItem<TMeta = Record<string, unknown>> = {\n /** Visible text. */\n label: string | (() => string);\n /**\n * The navigation target. Resolved relative to the route the resolver is attached to —\n * the same convention as Angular's `routerLink`:\n *\n * - `'a'` / `'a/b'` / `['a', 'b']` — relative segments, resolve to `${mount}/a` etc.\n * - `'/foo'` / `['/foo', 'bar']` — absolute, leading-slash escape hatch.\n * - A pre-built `UrlTree` is passed through unchanged.\n *\n * Omit (or return `null`) for a pure grouping header — `active` will then fall through\n * to the children-active check.\n */\n link?: string | any[] | (() => string | any[] | null) | null;\n /** Accessible label. Defaults to `label`. */\n ariaLabel?: string | (() => string);\n /** When true, the item is rendered but non-interactive. Cascades to descendants. */\n disabled?: boolean | (() => boolean);\n /** When true, the item (and its subtree) is filtered out of the consumer-facing array. */\n hidden?: boolean | (() => boolean);\n /** Arbitrary metadata round-tripped on the resulting `NavItem`. */\n meta?: TMeta | (() => TMeta);\n /**\n * Override the match options used to compute `active`. Merged on top of the global default\n * from `provideNavConfig`, which is in turn merged on top of `@angular/router`'s\n * `subsetMatchOptions` defaults.\n *\n * Setting this also implicitly disables the default child-active OR — see\n * {@link matchesWhenChildActive} to opt back in.\n */\n activeMatch?: Partial<IsActiveMatchOptions>;\n /**\n * Controls whether `active` ORs with descendant `active`.\n *\n * Default: `true` when `activeMatch` is omitted, `false` when `activeMatch` is set.\n * Explicit values override the default.\n */\n matchesWhenChildActive?: boolean;\n /** Optional stable id. Defaults to the serialized link when present. */\n id?: string | (() => string);\n /** Nested items. */\n children?: CreateNavItem<TMeta>[];\n};\n\n/**\n * A navigation item exposed by `injectNavItems`. All fields are signals so consumers can\n * read reactively without caring whether the source was static or signal-derived.\n *\n * @typeParam TMeta Same as the corresponding {@link CreateNavItem}.\n */\nexport type NavItem<TMeta = Record<string, unknown>> = {\n id: Signal<string>;\n label: Signal<string>;\n ariaLabel: Signal<string>;\n /** Serialized URL, or `null` for pure grouping items with no link. */\n link: Signal<string | null>;\n active: Signal<boolean>;\n disabled: Signal<boolean>;\n meta: Signal<TMeta>;\n /** Children that survive the hidden filter. */\n children: Signal<NavItem<TMeta>[]>;\n};\n\n/** @internal */\nexport type InternalNavItem<TMeta = Record<string, unknown>> =\n NavItem<TMeta> & {\n hidden: Signal<boolean>;\n };\n\n/** @internal */\nexport const NEVER_TRUE: Signal<boolean> = computed(() => false);\n\nfunction wrap<T>(): Signal<T | undefined>;\nfunction wrap<T>(value: T | (() => T)): Signal<T>;\nfunction wrap<T>(\n value: T | (() => T) | undefined,\n fallback: Signal<T>,\n): Signal<T>;\n\nfunction wrap<T>(\n value?: T | (() => T) | undefined,\n fallback?: Signal<T>,\n): Signal<T | undefined> {\n if (value === undefined)\n return fallback ? fallback : computed(() => undefined);\n if (typeof value === 'function')\n return isSignal(value) ? (value as Signal<T>) : computed(value as () => T);\n return computed(() => value);\n}\n\nfunction isAbsoluteCommandArray(commands: readonly unknown[]): boolean {\n return (\n commands.length > 0 &&\n typeof commands[0] === 'string' &&\n (commands[0] as string).startsWith('/')\n );\n}\n\nfunction resolveLinkTree(\n input: CreateNavItem['link'],\n router: Router,\n relativeTo: ActivatedRouteSnapshot,\n): UrlTree | null {\n const raw = typeof input === 'function' ? input() : input;\n if (raw === undefined || raw === null) return null;\n if (raw instanceof UrlTree) return raw;\n\n if (typeof raw === 'string') {\n if (raw.startsWith('/')) return router.parseUrl(raw);\n const parsed = router.parseUrl('/' + raw);\n const primary = parsed.root.children['primary'];\n const segments = primary ? primary.segments.map((s) => s.path) : [];\n return createUrlTreeFromSnapshot(\n relativeTo,\n segments,\n parsed.queryParams,\n parsed.fragment,\n );\n }\n\n if (isAbsoluteCommandArray(raw)) return router.createUrlTree(raw);\n return createUrlTreeFromSnapshot(relativeTo, raw);\n}\n\nfunction resolveMeta<TMeta>(input: CreateNavItem<TMeta>['meta']): TMeta {\n if (input === undefined) return {} as TMeta;\n return typeof input === 'function' ? (input as () => TMeta)() : input;\n}\n\n/**\n * @internal\n * Recursively builds an {@link InternalNavItem} tree from {@link CreateNavItem} input.\n * Cascades parent `disabled`/`hidden` to descendants and computes `active` against the\n * current router URL using `Router.isActive`.\n */\nexport function createInternalNavItem<TMeta = Record<string, unknown>>(\n input: CreateNavItem<TMeta>,\n router: Router,\n relativeTo: ActivatedRouteSnapshot,\n configActiveMatch: Partial<IsActiveMatchOptions> | undefined,\n parentDisabled: Signal<boolean>,\n parentHidden: Signal<boolean>,\n fallbackId: string,\n): InternalNavItem<TMeta> {\n const label = wrap(input.label);\n const ariaLabel = input.ariaLabel ? wrap(input.ariaLabel) : label;\n\n const linkTree = computed(() =>\n resolveLinkTree(input.link, router, relativeTo),\n );\n const link: Signal<string | null> = computed(() => {\n const tree = linkTree();\n return tree ? router.serializeUrl(tree) : null;\n });\n\n const ownDisabled = wrap(input.disabled, NEVER_TRUE);\n const ownHidden = wrap(input.hidden, NEVER_TRUE);\n\n const disabled = computed(() => parentDisabled() || ownDisabled());\n const hidden = computed(() => parentHidden() || ownHidden());\n\n const metaInput = input.meta;\n const meta: Signal<TMeta> = computed(() => resolveMeta<TMeta>(metaInput));\n\n const id: Signal<string> =\n input.id !== undefined\n ? wrap(input.id)\n : computed(() => link() ?? fallbackId);\n\n const childItems: InternalNavItem<TMeta>[] = (input.children ?? []).map(\n (childInput, i) =>\n createInternalNavItem<TMeta>(\n childInput,\n router,\n relativeTo,\n configActiveMatch,\n disabled,\n hidden,\n `${fallbackId}.${i}`,\n ),\n );\n\n const children: Signal<NavItem<TMeta>[]> = computed(() =>\n childItems.filter((c) => !c.hidden()),\n );\n\n const mergedActiveMatch: Partial<IsActiveMatchOptions> = {\n ...configActiveMatch,\n ...input.activeMatch,\n };\n\n const trackNavigation = currentUrl(router);\n const finalOptions: IsActiveMatchOptions = {\n paths: 'subset',\n fragment: 'ignored',\n matrixParams: 'ignored',\n queryParams: 'subset',\n ...mergedActiveMatch,\n };\n\n const ownActive = computed(() => {\n trackNavigation();\n const tree = linkTree();\n return tree ? router.isActive(tree, finalOptions) : false;\n });\n\n const orWithChildren =\n input.matchesWhenChildActive ?? input.activeMatch === undefined;\n\n const active = computed(\n () =>\n ownActive() ||\n (orWithChildren &&\n !!childItems.length &&\n childItems.some((c) => c.active())),\n );\n\n return {\n id,\n label,\n ariaLabel,\n link,\n active,\n disabled,\n hidden,\n meta,\n children,\n };\n}\n","import { inject, InjectionToken, type Provider } from '@angular/core';\nimport { type IsActiveMatchOptions } from '@angular/router';\nimport { type CreateNavItem } from './nav';\n\n/**\n * Per-scope fallback descriptor: a static array or a factory returning one.\n */\nexport type NavDefaultsForScope<TMeta = Record<string, unknown>> =\n | CreateNavItem<TMeta>[]\n | (() => CreateNavItem<TMeta>[]);\n\n/**\n * Global configuration for the nav system.\n * @see provideNavConfig\n */\nexport type NavConfig<TMeta = Record<string, unknown>> = {\n /**\n * Default match options used when computing `NavItem.active`. Per-item `activeMatch`\n * (and the router's built-in `subsetMatchOptions`) are still merged on top.\n */\n activeMatch?: Partial<IsActiveMatchOptions>;\n /**\n * Fallback nav items rendered when no route in the active chain has registered items\n * for the requested scope. Relative `link`s resolve from `/`.\n *\n * Forms:\n * - Array (or factory): fallback for the default (unnamed) scope.\n * - Record: keys match the `name` passed to `createNavItems`. The unnamed scope can\n * also be provided via this record using the empty-string key `''`.\n *\n * A route that wants to render an *empty* nav explicitly should register\n * `createNavItems([])`, which shadows these defaults via the normal deepest-wins rule.\n */\n defaults?:\n | NavDefaultsForScope<TMeta>\n | Record<string, NavDefaultsForScope<TMeta>>;\n};\n\n/** @internal */\nconst token = new InjectionToken<NavConfig>('@mmstack/router-core:nav-config');\n\n/**\n * Provides global configuration for the nav system. The factory form runs in\n * an injection context, so it can use `inject()` to build defaults from app\n * state.\n *\n * @param config Either a literal {@link NavConfig} object or a factory\n * `() => NavConfig`. Optional — without it, the nav system uses Angular's\n * default `activeMatch` options and renders nothing in scopes that have no\n * registered items.\n * @returns A `Provider` to add to your app's providers array.\n *\n * @example\n * ```ts\n * bootstrapApplication(AppComponent, {\n * providers: [\n * provideRouter(routes),\n * provideNavConfig({\n * activeMatch: { queryParams: 'ignored' },\n * defaults: [\n * { label: 'Home', link: '/' },\n * { label: 'Docs', link: '/docs' },\n * ],\n * }),\n * ],\n * });\n * ```\n *\n * @example\n * ```ts\n * // Factory form — read defaults from a service\n * provideNavConfig(() => {\n * const role = inject(AuthStore).role();\n * return {\n * defaults: {\n * main: role === 'admin' ? adminNav : guestNav,\n * },\n * };\n * });\n * ```\n */\nexport function provideNavConfig(\n config?: NavConfig | (() => NavConfig),\n): Provider {\n const fn = typeof config === 'function' ? config : () => ({ ...config });\n return {\n provide: token,\n useFactory: fn,\n };\n}\n\n/** @internal */\nexport function injectNavConfig(): NavConfig {\n return inject(token, { optional: true }) ?? {};\n}\n","import {\n computed,\n EnvironmentInjector,\n inject,\n Injectable,\n runInInjectionContext,\n type Signal,\n untracked,\n} from '@angular/core';\nimport { Router } from '@angular/router';\nimport { mutable } from '@mmstack/primitives';\nimport { injectLeafRoutes } from '../util';\nimport {\n createInternalNavItem,\n type CreateNavItem,\n type InternalNavItem,\n type NavItem,\n NEVER_TRUE,\n} from './nav';\nimport { injectNavConfig, type NavDefaultsForScope } from './nav-config';\n\n/** @internal */\nexport const DEFAULT_NAV_SCOPE: unique symbol = Symbol('mmstack.nav.default');\n\ntype ScopeName = string | typeof DEFAULT_NAV_SCOPE;\n\n// Map stores items with an unknown meta — the public read API re-asserts TMeta.\ntype AnyInternalNavItem = InternalNavItem<unknown>;\n\n@Injectable({ providedIn: 'root' })\nexport class NavStore {\n private readonly map = mutable<\n Map<ScopeName, Map<string, AnyInternalNavItem[]>>\n >(new Map());\n\n private readonly leafRoutes = injectLeafRoutes();\n private readonly router = inject(Router);\n private readonly config = injectNavConfig();\n private readonly injector = inject(EnvironmentInjector);\n private readonly defaultsCache = new Map<\n ScopeName,\n AnyInternalNavItem[] | null\n >();\n\n /** @internal */\n register(\n scope: ScopeName,\n routePath: string,\n items: AnyInternalNavItem[],\n ): void {\n this.map.inline((m) => {\n let scopeMap = m.get(scope);\n if (!scopeMap) {\n scopeMap = new Map();\n m.set(scope, scopeMap);\n }\n scopeMap.set(routePath, items);\n });\n }\n\n /** @internal */\n scope<TMeta = Record<string, unknown>>(\n name: ScopeName,\n ): Signal<NavItem<TMeta>[]> {\n return computed(() => {\n const scopeMap = this.map().get(name);\n if (scopeMap) {\n const leaves = this.leafRoutes();\n for (let i = leaves.length - 1; i >= 0; i--) {\n const items = scopeMap.get(leaves[i].path);\n if (items) {\n return items.filter((it) => !it.hidden()) as NavItem<TMeta>[];\n }\n }\n }\n\n const defaults = this.getDefaultItems(name);\n if (defaults) {\n return defaults.filter((it) => !it.hidden()) as NavItem<TMeta>[];\n }\n return [];\n });\n }\n\n private getDefaultItems(scope: ScopeName): AnyInternalNavItem[] | null {\n const cached = this.defaultsCache.get(scope);\n if (cached !== undefined) return cached;\n\n const built = this.buildDefaultItems(scope);\n this.defaultsCache.set(scope, built);\n return built;\n }\n\n private buildDefaultItems(scope: ScopeName): AnyInternalNavItem[] | null {\n const defaults = this.config.defaults;\n if (!defaults) return null;\n\n let entry: NavDefaultsForScope | undefined;\n if (Array.isArray(defaults) || typeof defaults === 'function') {\n if (scope === DEFAULT_NAV_SCOPE) entry = defaults;\n } else {\n const key = scope === DEFAULT_NAV_SCOPE ? '' : scope;\n entry = (defaults as Record<string, NavDefaultsForScope>)[key];\n }\n if (!entry) return null;\n const resolved = entry;\n\n return untracked(() =>\n runInInjectionContext(this.injector, () => {\n const inputs =\n typeof resolved === 'function' ? resolved() : resolved;\n const rootSnapshot = this.router.routerState.snapshot.root;\n const prefix =\n scope === DEFAULT_NAV_SCOPE\n ? '__defaults__'\n : `__defaults__:${scope}`;\n return inputs.map((input: CreateNavItem, i) =>\n createInternalNavItem(\n input,\n this.router,\n rootSnapshot,\n this.config.activeMatch,\n NEVER_TRUE,\n NEVER_TRUE,\n `${prefix}#${i}`,\n ),\n ) as AnyInternalNavItem[];\n }),\n );\n }\n}\n\n/**\n * Returns a reactive list of nav items for the requested scope.\n *\n * The returned signal reflects the nearest active ancestor route that registered items\n * for `name` via `createNavItems`. If no active route has registered items for the\n * scope, falls back to `NavConfig.defaults` (when provided via `provideNavConfig`).\n * Hidden items are filtered out.\n *\n * @typeParam TMeta The shape of `NavItem.meta` for the consuming code. Untyped at the\n * registration site — this is a consumer-side assertion.\n *\n * @example\n * ```typescript\n * @Component({\n * template: `\n * @for (item of items(); track item) {\n * <a [href]=\"item.link()\" [class.active]=\"item.active()\">{{ item.label() }}</a>\n * }\n * `,\n * })\n * export class TopBar {\n * protected readonly items = injectNavItems();\n * }\n * ```\n */\nexport function injectNavItems<TMeta = Record<string, unknown>>(\n name?: string,\n): Signal<NavItem<TMeta>[]> {\n const store = inject(NavStore);\n return store.scope<TMeta>(name ?? DEFAULT_NAV_SCOPE);\n}\n","import { inject } from '@angular/core';\nimport { type ResolveFn, Router } from '@angular/router';\nimport { injectSnapshotPathResolver } from '../util';\nimport {\n createInternalNavItem,\n type CreateNavItem,\n type InternalNavItem,\n NEVER_TRUE,\n} from './nav';\nimport { injectNavConfig } from './nav-config';\nimport { DEFAULT_NAV_SCOPE, NavStore } from './nav-store';\n\n/**\n * Registers a set of nav items for the activating route under the given scope.\n * Mirrors {@link createBreadcrumb} / {@link createTitle} — designed to be used\n * in a route's `resolve` map.\n *\n * Scope override semantics: when multiple routes in the active chain register\n * items under the same scope, the deepest active registration wins. Navigating\n * away restores the shallower registration. To explicitly render an empty nav\n * (shadowing a default), pass `[]`.\n *\n * @typeParam TMeta Optional per-item metadata type — flows through the\n * registered items so consumers reading via {@link injectNavItems} get\n * typed access to `item.meta`.\n * @param itemsOrFactory Either a static array of {@link CreateNavItem} or a\n * factory `() => CreateNavItem<TMeta>[]` invoked inside an injection\n * context (so it can use `inject()` for dynamic items).\n * @param options Optional `{ name }` for registering multiple scopes on a\n * single route. Omit to target the default (unnamed) scope.\n * @returns An Angular `ResolveFn<void>` to wire into a route's `resolve` map.\n * The resolver registers items as a side effect; the resolved value itself\n * is unused.\n *\n * @example\n * ```ts\n * // Single default-scope nav\n * {\n * path: 'app',\n * resolve: {\n * _nav: createNavItems([\n * { label: 'Dashboard', link: 'dashboard' },\n * { label: 'Reports', link: 'reports' },\n * ]),\n * },\n * }\n *\n * // Multiple scopes\n * {\n * path: 'app',\n * resolve: {\n * mainNav: createNavItems([...], { name: 'main' }),\n * sideNav: createNavItems([...], { name: 'side' }),\n * },\n * }\n *\n * // Factory using inject()\n * createNavItems(() => {\n * const auth = inject(AuthStore);\n * return auth.canAdmin() ? adminItems : userItems;\n * });\n * ```\n */\nexport function createNavItems<TMeta = Record<string, unknown>>(\n itemsOrFactory:\n | CreateNavItem<TMeta>[]\n | (() => CreateNavItem<TMeta>[]),\n options?: { name?: string },\n): ResolveFn<void> {\n const factory =\n typeof itemsOrFactory === 'function'\n ? itemsOrFactory\n : () => itemsOrFactory;\n\n return async (route) => {\n const router = inject(Router);\n const store = inject(NavStore);\n const resolveRoutePath = injectSnapshotPathResolver();\n const config = injectNavConfig();\n\n const routePath = resolveRoutePath(route);\n const scope = options?.name ?? DEFAULT_NAV_SCOPE;\n\n const items = factory().map((input, i) =>\n createInternalNavItem<TMeta>(\n input,\n router,\n route,\n config.activeMatch,\n NEVER_TRUE,\n NEVER_TRUE,\n `${routePath}#${i}`,\n ),\n );\n\n store.register(scope, routePath, items as InternalNavItem<unknown>[]);\n\n return Promise.resolve();\n };\n}\n","import {\n computed,\n inject,\n isSignal,\n untracked,\n type WritableSignal,\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { toWritable } from '@mmstack/primitives';\n\n/**\n * Creates a WritableSignal that synchronizes with a specific URL query parameter,\n * enabling two-way binding between the signal's state and the URL.\n *\n * Reading the signal provides the current value of the query parameter (or null if absent).\n * Setting the signal updates the URL query parameter using `Router.navigate`, triggering\n * navigation and causing the signal to update reactively if the navigation is successful.\n *\n * @param key The key of the query parameter to synchronize with.\n * Can be a static string (e.g., `'search'`) or a function/signal returning a string\n * for dynamic keys (e.g., `() => this.userId() + '_filter'` or `computed(() => this.category() + '_sort')`).\n * The signal will reactively update if the key returned by the function/signal changes.\n * @returns {WritableSignal<string | null>} A signal representing the query parameter's value.\n * - Reading returns the current value string, or `null` if the parameter is absent in the URL.\n * - Setting the signal to a string updates the query parameter in the URL (e.g., `signal.set('value')` results in `?key=value`).\n * - Setting the signal to `null` removes the query parameter from the URL (e.g., `signal.set(null)` results in `?otherParam=...`).\n * - Automatically reflects changes if the query parameters update due to external navigation.\n * @remarks\n * - Requires Angular's `ActivatedRoute` and `Router` to be available in the injection context.\n * - Uses `Router.navigate` with `queryParamsHandling: 'merge'` to preserve other existing query parameters during updates.\n * - Handles dynamic keys reactively. If the result of the `key` function/signal changes, the signal will start reflecting the value of the *new* query parameter key.\n * - During Server-Side Rendering (SSR), it reads the initial value from the route snapshot. Write operations (`set`) might have limited or no effect on the server depending on the platform configuration.\n *\n * @example\n * ```ts\n * import { Component, computed, effect, signal } from '@angular/core';\n * import { queryParam } from '@mmstack/router-core'; // Adjust import path as needed\n * // import { FormsModule } from '@angular/forms'; // If using ngModel\n *\n * @Component({\n * selector: 'app-product-list',\n * // imports: [FormsModule], // If using ngModel\n * template: `\n * <div>\n * Sort By:\n * <select [value]=\"sortSignal() ?? ''\" (change)=\"sortSignal.set($any($event.target).value || null)\">\n * <option value=\"\">Default</option>\n * <option value=\"price_asc\">Price Asc</option>\n * <option value=\"price_desc\">Price Desc</option>\n * <option value=\"name\">Name</option>\n * </select>\n * <button (click)=\"sortSignal.set(null)\" [disabled]=\"!sortSignal()\">Clear Sort</button>\n * </div>\n * <div>\n * Page:\n * <input type=\"number\" min=\"1\" [value]=\"pageSignal() ?? '1'\" #p (input)=\"setPage(p.value)\"/>\n * </div>\n * * `\n * })\n * export class ProductListComponent {\n * // Two-way bind the 'sort' query parameter (?sort=...)\n * // Defaults to null if param is missing\n * sortSignal = queryParam('sort');\n *\n * // Example with a different type (needs serialization or separate logic)\n * // For simplicity, we treat page as string | null here\n * pageSignal = queryParam('page');\n *\n * constructor() {\n * effect(() => {\n * const currentSort = this.sortSignal();\n * const currentPage = this.pageSignal(); // Read as string | null\n * console.log('Sort/Page changed, reloading products for:', { sort: currentSort, page: currentPage });\n * // --- Fetch data based on currentSort and currentPage ---\n * });\n * }\n *\n * setPage(value: string): void {\n * const pageNum = parseInt(value, 10);\n * // Set to null if page is 1 (to remove param), otherwise set string value\n * this.pageSignal.set(isNaN(pageNum) || pageNum <= 1 ? null : pageNum.toString());\n * }\n * }\n * ```\n */\nexport function queryParam(\n key: string | (() => string),\n route = inject(ActivatedRoute),\n): WritableSignal<string | null> {\n const router = inject(Router);\n\n const keySignal =\n typeof key === 'string'\n ? computed(() => key)\n : isSignal(key)\n ? key\n : computed(key);\n\n const queryParamMap = toSignal(route.queryParamMap, {\n initialValue: route.snapshot.queryParamMap,\n });\n\n const queryParams = toSignal(route.queryParams, {\n initialValue: route.snapshot.queryParams,\n });\n\n const queryParam = computed(() => queryParamMap().get(keySignal()));\n\n const set = (newValue: string | null) => {\n const next = {\n ...untracked(queryParams),\n };\n const key = untracked(keySignal);\n\n if (newValue === null) {\n delete next[key];\n } else {\n next[key] = newValue;\n }\n\n router.navigate([], {\n relativeTo: route,\n queryParams: next,\n queryParamsHandling: 'merge',\n });\n };\n\n return toWritable(queryParam, set);\n}\n","import { inject, InjectionToken, type 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 base title to fallback to, by default Title.getTitle() is called on instantiation and that is used as a fallback,\n * which in most cases should resolve to what is in index.html, unless you specifically call Title.setTitle() before any routes,\n * are initialized.\n */\n initialTitle?: string;\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 initialTitle: string;\n parser: (title: string) => string;\n keepLastKnown: boolean;\n};\n\nconst token = new InjectionToken<InternalTitleConfig>(\n '@mmstack/router-core:title-config',\n);\n\n/**\n * Provide application-wide configuration for the title subsystem. The config\n * is only consumed when at least one route uses a {@link createTitle} resolver;\n * routes without `createTitle` are unaffected.\n *\n * @param config Optional {@link TitleConfig}. All fields are optional — pass\n * `prefix` to namespace titles (e.g. `\"My App – \"`), `initialTitle` to\n * override the fallback (defaults to the `<title>` from `index.html`), and\n * `keepLastKnownTitle: false` to clear the title on navigations to routes\n * without a title (the default keeps the previous one).\n * @returns A `Provider` to add to your app's providers array.\n *\n * @example\n * ```ts\n * bootstrapApplication(AppComponent, {\n * providers: [\n * provideRouter(routes),\n * provideTitleConfig({\n * prefix: (title) => `${title} • My App`,\n * keepLastKnownTitle: true,\n * }),\n * ],\n * });\n * ```\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 initialTitle: config?.initialTitle ?? '',\n parser: prefixFn,\n keepLastKnown: config?.keepLastKnownTitle ?? true,\n } satisfies InternalTitleConfig,\n };\n}\n\nfunction identity(str: string) {\n return str;\n}\n\nexport function injectTitleConfig(): InternalTitleConfig {\n return (\n inject(token, {\n optional: true,\n }) ?? {\n initialTitle: '',\n parser: identity,\n keepLastKnown: true,\n }\n );\n}\n","import {\n computed,\n effect,\n inject,\n Injectable,\n linkedSignal,\n untracked,\n type Signal,\n} from '@angular/core';\nimport { Title } from '@angular/platform-browser';\nimport { type 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 map = mutable<Map<string, Signal<string>>>(new Map());\n\n constructor() {\n const { keepLastKnown, initialTitle } = injectTitleConfig();\n const leafRoutes = injectLeafRoutes();\n const title = inject(Title);\n const fallbackTitle = initialTitle || untracked(() => title.getTitle());\n\n const reverseLeaves = computed(() => 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 ?? null)\n .filter((v) => v !== null);\n });\n\n const currentTitle = computed(() => currentResolvedTitles().at(0) ?? '');\n\n const heldTitle = 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 title.setTitle(heldTitle() || fallbackTitle);\n });\n }\n\n register(id: string, titleFn: Signal<string>) {\n this.map.inline((m) => m.set(id, titleFn));\n }\n}\n\n/**\n * Creates an Angular router `ResolveFn<string>` that registers a title for the\n * route it's attached to. Titles can be static strings, factory functions\n * (called in an injection context, so they can use `inject()`), or signal\n * factories (for reactive titles that change when underlying data does).\n *\n * The resolved title flows through any `prefix` configured via\n * {@link provideTitleConfig}, and is wired into Angular's `Title` service\n * via an effect. Nested routes pick the most-specific leaf's title; if a\n * deeper route has no title and `keepLastKnownTitle` is `true` (default),\n * the previous title is preserved.\n *\n * @param factoryOrValue Either a literal string title, a `() => string`\n * factory, or a `() => Signal<string>` factory for reactive titles. Factory\n * callbacks run inside an injection context, so they can use `inject()`.\n * @param awaitValue When `true`, the resolver waits until the title signal\n * emits a truthy value before resolving — useful for SSR/SEO where the\n * resolved title should not be empty. Defaults to `false`.\n * @returns An Angular `ResolveFn<string>` to wire into a route's `title` field\n * (or any other `resolve` slot — the return value isn't usually consumed).\n *\n * @example\n * ```ts\n * // Static title\n * { path: 'about', component: AboutComponent, title: createTitle('About us') }\n *\n * // Factory using inject()\n * {\n * path: 'users/:id',\n * component: UserComponent,\n * title: createTitle(() => inject(ActivatedRoute).snapshot.params['id']),\n * }\n *\n * // Reactive title from a signal store\n * {\n * path: 'dashboard',\n * component: DashboardComponent,\n * title: createTitle(() => {\n * const user = inject(UserStore).current;\n * return computed(() => `Dashboard – ${user()?.name ?? 'Guest'}`);\n * }),\n * }\n * ```\n */\nexport function createTitle(\n factoryOrValue: (() => string | (() => string)) | string,\n awaitValue = false,\n): ResolveFn<string> {\n const factory =\n typeof factoryOrValue === 'string' ? () => factoryOrValue : factoryOrValue;\n\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 = factory();\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":["parsePathSegment","token","filter","currentUrl"],"mappings":"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"}
1
+ {"version":3,"file":"mmstack-router-core.mjs","sources":["../../../../../packages/router/core/src/lib/util/create-route-predicate.ts","../../../../../packages/router/core/src/lib/util/find-path.ts","../../../../../packages/router/core/src/lib/url.ts","../../../../../packages/router/core/src/lib/util/leaf.store.ts","../../../../../packages/router/core/src/lib/util/snapshot-path.ts","../../../../../packages/router/core/src/lib/breadcrumb/breadcrumb.ts","../../../../../packages/router/core/src/lib/breadcrumb/breadcrumb-config.ts","../../../../../packages/router/core/src/lib/breadcrumb/breadcrumb-store.ts","../../../../../packages/router/core/src/lib/breadcrumb/breadcrumb-resolver.ts","../../../../../packages/router/core/src/lib/preloading/preload-requester.ts","../../../../../packages/router/core/src/lib/preloading/preload-strategy.ts","../../../../../packages/router/core/src/lib/link.ts","../../../../../packages/router/core/src/lib/nav/nav.ts","../../../../../packages/router/core/src/lib/nav/nav-config.ts","../../../../../packages/router/core/src/lib/nav/nav-store.ts","../../../../../packages/router/core/src/lib/nav/nav-resolver.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":["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, type 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, type Signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport {\n type Event,\n EventType,\n type NavigationEnd,\n Router,\n} from '@angular/router';\nimport { filter, map } from 'rxjs/operators';\n\n/**\n * Type guard to check if a Router Event is a NavigationEnd event.\n * @internal\n */\nfunction isNavigationEnd(e: Event): e is NavigationEnd {\n return 'type' in e && e.type === EventType.NavigationEnd;\n}\n\n/**\n * Creates a Signal that tracks the current router URL.\n *\n * The signal emits the URL string reflecting the router state *after* redirects\n * have completed for each successful navigation. It initializes with the router's\n * current URL state.\n *\n * @returns {Signal<string>} A Signal emitting the `urlAfterRedirects` upon successful navigation.\n *\n * @example\n * ```ts\n * import { Component, effect } from '@angular/core';\n * import { url } from '@mmstack/router-core'; // Adjust import path\n *\n * @Component({\n * selector: 'app-root',\n * template: `Current URL: {{ currentUrl() }}`\n * })\n * export class AppComponent {\n * currentUrl = url();\n *\n * constructor() {\n * effect(() => {\n * console.log('Navigation ended. New URL:', this.currentUrl());\n * // e.g., track page view with analytics\n * });\n * }\n * }\n * ```\n */\nexport function url(router?: Router): Signal<string> {\n if (!router) router = inject(Router);\n\n return toSignal(\n router.events.pipe(\n filter(isNavigationEnd),\n map((e) => e.urlAfterRedirects),\n ),\n {\n initialValue: router.url,\n },\n );\n}\n","import { computed, inject, Injectable, type Signal } from '@angular/core';\nimport {\n type ActivatedRouteSnapshot,\n Router,\n type RouterStateSnapshot,\n} from '@angular/router';\nimport { url } from '../url';\n\n/**\n * A flattened view of one route in the active router chain, used by the\n * breadcrumb and title subsystems. Each `ResolvedLeafRoute` describes one\n * \"step\" in the chain from root to current leaf.\n *\n * Exposed publicly because custom breadcrumb generators (see\n * {@link BreadcrumbConfig}'s `generation` callback) receive instances of\n * this type and need to read its fields.\n *\n * - `route` — the underlying `ActivatedRouteSnapshot`.\n * - `segment.path` — the route config segment (e.g. `:userId`).\n * - `segment.resolved` — the resolved value of that segment (e.g. `'42'`).\n * - `path` — the full route-config path from root (with raw segments like `:userId`).\n * - `link` — the full resolved URL from root (with substituted values).\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 { inject } from '@angular/core';\nimport { type 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 { 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 { inject, InjectionToken } from '@angular/core';\nimport { type 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>(\n '@mmstack/router-core:breadcrumb-config',\n);\n\n/**\n * Provides configuration for the breadcrumb system.\n *\n * @param config A partial {@link BreadcrumbConfig}. The `generation` field controls\n * automatic label generation: `'manual'` disables it (breadcrumbs only show when\n * {@link createBreadcrumb} explicitly registers them); a function provides a\n * custom label generator instead of the default route-title-based one.\n * @returns A `Provider` to add to your app's providers array.\n *\n * @see BreadcrumbConfig\n *\n * @example\n * ```ts\n * // Disable automatic generation — breadcrumbs only appear when createBreadcrumb is used\n * bootstrapApplication(AppComponent, {\n * providers: [\n * provideRouter(routes),\n * provideBreadcrumbConfig({ generation: 'manual' }),\n * ],\n * });\n * ```\n *\n * @example\n * ```ts\n * // Custom label strategy — outer fn runs in injection context, inner is reactive\n * const customLabelStrategy = () => (leaf: ResolvedLeafRoute) =>\n * leaf.route.data?.['navTitle'] ?? leaf.route.title ?? 'Unnamed';\n *\n * provideBreadcrumbConfig({ generation: customLabelStrategy });\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 { computed, inject, Injectable, type Signal } from '@angular/core';\nimport { mapArray, mutable } from '@mmstack/primitives';\nimport { injectLeafRoutes, type ResolvedLeafRoute } from '../util/leaf.store';\nimport {\n type Breadcrumb,\n createInternalBreadcrumb,\n getBreadcrumbInternals,\n type InternalBreadcrumb,\n isInternalBreadcrumb,\n} from './breadcrumb';\nimport { injectBreadcrumbConfig } from './breadcrumb-config';\n\nfunction uppercaseFirst(str: string): string {\n const lcs = str.toLowerCase();\n return lcs.charAt(0).toUpperCase() + lcs.slice(1);\n}\n\nfunction removeMatrixAndQueryParams(path: string): string {\n const [cleanPath] = path.split(';');\n return cleanPath.split('?')[0];\n}\n\nfunction parsePathSegment(pathSegment: string): string {\n return pathSegment\n .split('/')\n .flatMap((part) => part.split('.'))\n .flatMap((part) => part.split('-'))\n .map((part) => uppercaseFirst(removeMatrixAndQueryParams(part)))\n .join(' ');\n}\n\nfunction generateLabel(leaf: ResolvedLeafRoute): string {\n const title = leaf.route.title ?? leaf.route.data?.['title'];\n\n if (title && typeof title === 'string') return title;\n if (leaf.segment.path.includes(':')) return leaf.segment.resolved;\n\n return parsePathSegment(leaf.segment.path);\n}\n\nfunction autoGenerateBreadcrumb(\n id: string,\n leaf: Signal<ResolvedLeafRoute>,\n autoGenerateFn: Signal<(leaf: ResolvedLeafRoute) => string>,\n): Breadcrumb {\n const label = computed(() => autoGenerateFn()(leaf()));\n\n return createInternalBreadcrumb(\n {\n id,\n label,\n ariaLabel: label,\n link: computed(() => leaf().link),\n },\n computed(\n () =>\n leaf().route.data?.['skipBreadcrumb'] !== true &&\n id !== '' &&\n id !== '/' &&\n leaf().segment.path !== '' &&\n leaf().segment.path !== '/' &&\n !leaf().segment.path.endsWith('/') &&\n !!label(),\n ),\n false,\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","import { computed, inject } from '@angular/core';\nimport {\n createUrlTreeFromSnapshot,\n Router,\n type ResolveFn,\n} from '@angular/router';\nimport { until } from '@mmstack/primitives';\nimport { injectSnapshotPathResolver } from '../util';\nimport { createInternalBreadcrumb, type Breadcrumb } from './breadcrumb';\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\n/**\n * Creates and registers a breadcrumb for a specific route. Designed to be used\n * as an Angular Route `ResolveFn` in the route's `resolve` map.\n *\n * Accepts a static label, a static options object, or a factory returning\n * either — use a factory when you need `inject()` to read dynamic data.\n *\n * @param factoryOrValue One of: a literal label string (shorthand for\n * `{ label: <string> }`), a static {@link CreateBreadcrumbOptions} object,\n * or a factory `() => string | CreateBreadcrumbOptions` invoked inside an\n * injection context (so it can use `inject()`).\n * @returns An Angular `ResolveFn<void>` to wire into a route's `resolve` map.\n * The resolver registers the breadcrumb as a side effect; the resolved value\n * itself is unused.\n *\n * @see CreateBreadcrumbOptions\n *\n * @example\n * ```ts\n * export const appRoutes: Routes = [\n * {\n * path: 'home',\n * component: HomeComponent,\n * resolve: {\n * // shorthand for { label: 'Home' }\n * breadcrumb: createBreadcrumb('Home'),\n * },\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 factoryOrValue:\n | (() => CreateBreadcrumbOptions | string)\n | string\n | CreateBreadcrumbOptions,\n): ResolveFn<void> {\n const factory =\n typeof factoryOrValue === 'string'\n ? (): CreateBreadcrumbOptions => ({ label: factoryOrValue })\n : typeof factoryOrValue === 'function'\n ? (): CreateBreadcrumbOptions => {\n const result = factoryOrValue();\n return typeof result === 'string' ? { label: result } : result;\n }\n : () => factoryOrValue;\n\n return async (route) => {\n const router = inject(Router);\n const store = inject(BreadcrumbStore);\n const resolver = injectSnapshotPathResolver();\n\n const fp = resolver(route);\n\n const tree = createUrlTreeFromSnapshot(\n route,\n [],\n route.queryParams,\n route.fragment,\n );\n\n const provided = factory();\n\n const link = computed(() => router.serializeUrl(tree));\n\n const { label, ariaLabel = label } = provided;\n\n const bc: Breadcrumb = {\n id: fp,\n ariaLabel:\n typeof ariaLabel === 'string'\n ? computed(() => ariaLabel)\n : computed(ariaLabel),\n label:\n typeof label === 'string' ? computed(() => label) : computed(label),\n link,\n };\n\n store.register(\n createInternalBreadcrumb(\n bc,\n computed(() => route.data?.['skipBreadcrumb'] !== true),\n ),\n );\n\n if (provided.awaitValue) await until(bc.label, (v) => !!v);\n\n return Promise.resolve();\n };\n}\n","import { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\n\n@Injectable({ providedIn: 'root' })\nexport class PreloadRequester {\n private readonly preloadOnDemand$ = new Subject<string>();\n readonly preloadRequested$ = this.preloadOnDemand$.asObservable();\n\n startPreload(routePath: string) {\n this.preloadOnDemand$.next(routePath);\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { type PreloadingStrategy, type Route, Router } from '@angular/router';\nimport { EMPTY, filter, finalize, type Observable, switchMap, take } from 'rxjs';\nimport { createRoutePredicate, findPath } from '../util';\nimport { PreloadRequester } from './preload-requester';\n\nfunction hasSlowConnection() {\n if (\n globalThis.window &&\n 'navigator' in globalThis.window &&\n 'connection' in globalThis.window.navigator &&\n typeof globalThis.window.navigator.connection === 'object' &&\n !!globalThis.window.navigator.connection\n ) {\n const is2g =\n 'effectiveType' in globalThis.window.navigator.connection &&\n typeof globalThis.window.navigator.connection.effectiveType ===\n 'string' &&\n globalThis.window.navigator.connection.effectiveType.endsWith('2g');\n if (is2g) return true;\n if (\n 'saveData' in globalThis.window.navigator.connection &&\n typeof globalThis.window.navigator.connection.saveData === 'boolean' &&\n globalThis.window.navigator.connection.saveData\n )\n return true;\n }\n\n return false;\n}\n\nfunction noPreload(route: Route) {\n return route.data && route.data['preload'] === false;\n}\n\n/**\n * Demand-driven preloading strategy for Angular's router. Unlike Angular's\n * built-in `PreloadAllModules`, this strategy preloads a lazy route only\n * when something explicitly requests it via {@link PreloadRequester} (e.g.\n * the `mmLink` directive on hover or visibility, or {@link injectTriggerPreload}\n * called imperatively).\n *\n * Skips preloading when:\n * - the route has `data.preload === false`\n * - the network is on `2g` or in `saveData` mode (cheap-data-mode users)\n * - a load for the same path is already in flight\n *\n * Wire this into `provideRouter` to enable the `mmLink` preload pipeline:\n *\n * @example\n * ```ts\n * import { PreloadStrategy } from '@mmstack/router-core';\n * import { provideRouter, withPreloading } from '@angular/router';\n *\n * bootstrapApplication(AppComponent, {\n * providers: [\n * provideRouter(routes, withPreloading(PreloadStrategy)),\n * ],\n * });\n *\n * // Then in templates, `mmLink` (or `injectTriggerPreload`) requests\n * // preloads that this strategy executes:\n * // <a [mmLink]=\"'/users'\">Users</a>\n * ```\n *\n * @example\n * ```ts\n * // Opt a route out of preloading:\n * export const routes: Routes = [\n * { path: 'admin', loadChildren: () => import('./admin'), data: { preload: false } },\n * ];\n * ```\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class PreloadStrategy implements PreloadingStrategy {\n private readonly loading = new Set<string>();\n private readonly router = inject(Router);\n private readonly req = inject(PreloadRequester);\n\n preload(route: Route, load: () => Observable<any>): Observable<any> {\n if (noPreload(route) || hasSlowConnection()) return EMPTY;\n\n const fp = findPath(this.router.config, route);\n\n if (this.loading.has(fp)) return EMPTY;\n\n const predicate = createRoutePredicate(fp);\n return this.req.preloadRequested$.pipe(\n filter((path) => path === fp || predicate(path)),\n take(1),\n switchMap(() => load()),\n finalize(() => this.loading.delete(fp)),\n );\n }\n}\n","import {\n booleanAttribute,\n computed,\n Directive,\n effect,\n HostListener,\n inject,\n InjectionToken,\n input,\n output,\n type Provider,\n untracked,\n} from '@angular/core';\nimport {\n type ActivatedRoute,\n type Params,\n Router,\n RouterLink,\n RouterLinkWithHref,\n UrlTree,\n} from '@angular/router';\nimport { elementVisibility } from '@mmstack/primitives';\nimport { PreloadRequester } from './preloading';\n\nfunction inputToUrlTree(\n router: Router,\n link: string | any[] | UrlTree | null,\n relativeTo?: ActivatedRoute,\n queryParams?: Params,\n fragment?: string,\n queryParamsHandling?: 'merge' | 'preserve' | '',\n routerLinkUrlTree?: UrlTree | null,\n): UrlTree | null {\n if (!link) return null;\n if (routerLinkUrlTree) return routerLinkUrlTree;\n\n if (link instanceof UrlTree) return link;\n\n const arr = Array.isArray(link) ? link : [link];\n\n return router.createUrlTree(arr, {\n relativeTo,\n queryParams,\n fragment,\n queryParamsHandling,\n });\n}\n\nfunction treeToSerializedUrl(\n router: Router,\n urlTree: UrlTree | null,\n): string | null {\n if (!urlTree) return null;\n return router.serializeUrl(urlTree);\n}\n\n/**\n * Returns an imperative function that triggers preloading for an arbitrary link, using\n * the same path resolution and {@link PreloadStrategy} pipeline as the {@link Link}\n * (`mmLink`) directive.\n *\n * Use this when the `Link` directive isn't a fit — for example, preloading a route from\n * an effect when a user opens a menu, hovers a non-link element, or reacts to a signal\n * change — and you don't want to render an `<a [mmLink]>` just to request the preload.\n *\n * Requires {@link PreloadStrategy} to be wired up via `provideRouter(routes, withPreloading(PreloadStrategy))`,\n * just like the directive.\n *\n * @returns A function accepting the same link descriptor shape as `mmLink` (`string`,\n * commands array, `UrlTree`, or `null`). Passing `null` or an unresolvable link is a no-op.\n *\n * @example\n * ```typescript\n * @Component({ ... })\n * export class CommandPaletteComponent {\n * private readonly triggerPreload = injectTriggerPreload();\n *\n * protected readonly highlighted = signal<string | null>(null);\n *\n * constructor() {\n * effect(() => {\n * const target = this.highlighted();\n * if (target) this.triggerPreload(target);\n * });\n * }\n * }\n * ```\n */\nexport function injectTriggerPreload() {\n const req = inject(PreloadRequester);\n const router = inject(Router);\n\n return (\n link: string | any[] | UrlTree | null,\n relativeTo?: ActivatedRoute,\n queryParams?: Params,\n fragment?: string,\n queryParamsHandling?: 'merge' | 'preserve' | '',\n ) => {\n const urlTree = inputToUrlTree(\n router,\n link,\n relativeTo,\n queryParams,\n fragment,\n queryParamsHandling,\n );\n const fullPath = treeToSerializedUrl(router, urlTree);\n if (!fullPath) return;\n\n req.startPreload(fullPath);\n };\n}\n\n/**\n * Configuration for the `mmLink` directive.\n */\ntype MMLinkConfig = {\n /**\n * The default preload behavior for links.\n * Can be 'hover', 'visible', or null (no preloading).\n * @default 'hover'\n */\n preloadOn: 'hover' | 'visible' | null;\n /**\n * Whether to use mouse down events for preloading.\n * @default false\n */\n useMouseDown: boolean;\n};\n\nconst configToken = new InjectionToken<MMLinkConfig>('MMSTACK_LINK_CONFIG');\n\n/**\n * Provide application-wide defaults for the `mmLink` directive. Each `[mmLink]`\n * instance can still override per-link via its own `preloadOn` / `useMouseDown`\n * inputs; this just shifts the default.\n *\n * @param config Partial override of `MMLinkConfig`. Unset keys fall back to:\n * - `preloadOn: 'hover'` — preload triggered when the user hovers a link\n * - `useMouseDown: false` — navigation triggered on click (not mousedown)\n * @returns A `Provider` to add to your app's providers array.\n *\n * @example\n * ```ts\n * bootstrapApplication(AppComponent, {\n * providers: [\n * provideMMLinkDefaultConfig({ preloadOn: 'visible', useMouseDown: true }),\n * ],\n * });\n * ```\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/**\n * Drop-in replacement for `[routerLink]` that adds preloading on hover or\n * visibility, optional mousedown-triggered navigation, and a `beforeNavigate`\n * hook. Composes with Angular's `RouterLink` via `hostDirectives`, so every\n * `RouterLink` input (`target`, `queryParams`, `fragment`, etc.) is forwarded.\n *\n * Preload behavior:\n * - `preloadOn: 'hover'` (default) — preload when the user hovers the link\n * - `preloadOn: 'visible'` — preload when the link scrolls into view\n * - `preloadOn: null` — disable preloading on this link\n *\n * Navigation timing:\n * - `useMouseDown: false` (default) — navigate on click\n * - `useMouseDown: true` — navigate on mousedown (shaves ~50ms but breaks if the user\n * moves off the link before mouseup)\n *\n * Requires {@link PreloadStrategy} to be wired via `provideRouter(routes, withComponentInputBinding(), withPreloading(PreloadStrategy))`.\n * Set app-wide defaults with {@link provideMMLinkDefaultConfig}.\n *\n * @example\n * ```html\n * <a [mmLink]=\"['/users', userId()]\">View profile</a>\n *\n * <!-- Override per-link -->\n * <a [mmLink]=\"'/heavy-page'\" preloadOn=\"visible\" useMouseDown>Heavy page</a>\n *\n * <!-- React to the preload starting -->\n * <a [mmLink]=\"'/checkout'\" (preloading)=\"onPreload()\">Checkout</a>\n * ```\n */\n@Directive({\n selector: '[mmLink]',\n exportAs: 'mmLink',\n host: {\n '(mouseenter)': 'onHover()',\n },\n hostDirectives: [\n {\n directive: RouterLink,\n inputs: [\n 'routerLink: mmLink',\n 'target',\n 'queryParams',\n 'fragment',\n 'queryParamsHandling',\n 'state',\n 'relativeTo',\n 'skipLocationChange',\n 'replaceUrl',\n ],\n },\n ],\n})\nexport class Link {\n private readonly routerLink =\n inject(RouterLink, {\n self: true,\n optional: true,\n }) ?? inject(RouterLinkWithHref, { self: true, optional: true });\n\n private readonly req = inject(PreloadRequester);\n private readonly router = inject(Router);\n\n readonly target = input<string>();\n readonly queryParams = input<Params>();\n readonly fragment = input<string>();\n readonly queryParamsHandling = input<'merge' | 'preserve' | ''>();\n readonly state = input<object>();\n readonly info = input<unknown>();\n readonly relativeTo = input<ActivatedRoute>();\n readonly skipLocationChange = input(false, { transform: booleanAttribute });\n readonly replaceUrl = input(false, { transform: booleanAttribute });\n readonly mmLink = input<string | any[] | UrlTree | null>(null);\n readonly preloadOn = input<'hover' | 'visible' | null>(\n injectConfig().preloadOn,\n );\n readonly useMouseDown = input(injectConfig().useMouseDown, {\n transform: booleanAttribute,\n });\n readonly beforeNavigate = input<() => void>();\n\n readonly preloading = output<void>();\n\n private readonly urlTree = computed(() => {\n return inputToUrlTree(\n this.router,\n this.mmLink(),\n this.relativeTo(),\n this.queryParams(),\n this.fragment(),\n this.queryParamsHandling(),\n this.routerLink?.urlTree,\n );\n });\n\n private readonly fullPath = computed(() => {\n return treeToSerializedUrl(this.router, this.urlTree());\n });\n\n onHover() {\n if (untracked(this.preloadOn) !== 'hover') return;\n this.requestPreload();\n }\n\n @HostListener('mousedown', [\n '$event.button',\n '$event.ctrlKey',\n '$event.shiftKey',\n '$event.altKey',\n '$event.metaKey',\n ])\n onMouseDown(\n button: number,\n ctrlKey: boolean,\n shiftKey: boolean,\n altKey: boolean,\n metaKey: boolean,\n ) {\n if (!untracked(this.useMouseDown)) return;\n return this.trigger(button, ctrlKey, shiftKey, altKey, metaKey);\n }\n\n @HostListener('click', [\n '$event.button',\n '$event.ctrlKey',\n '$event.shiftKey',\n '$event.altKey',\n '$event.metaKey',\n ])\n onClick(\n button: number,\n ctrlKey: boolean,\n shiftKey: boolean,\n altKey: boolean,\n metaKey: boolean,\n ) {\n if (untracked(this.useMouseDown)) return;\n return this.trigger(button, ctrlKey, shiftKey, altKey, metaKey);\n }\n\n constructor() {\n const intersection = elementVisibility();\n\n effect(() => {\n if (this.preloadOn() !== 'visible') return;\n if (intersection.visible()) this.requestPreload();\n });\n }\n\n private requestPreload() {\n const fp = untracked(this.fullPath);\n if (!this.routerLink || !fp) return;\n this.req.startPreload(fp);\n this.preloading.emit();\n }\n\n private trigger(\n button: number,\n ctrlKey: boolean,\n shiftKey: boolean,\n altKey: boolean,\n metaKey: boolean,\n ) {\n untracked(this.beforeNavigate)?.();\n return this.routerLink?.onClick(button, ctrlKey, shiftKey, altKey, metaKey);\n }\n}\n","import { computed, isSignal, type Signal } from '@angular/core';\nimport {\n type ActivatedRouteSnapshot,\n createUrlTreeFromSnapshot,\n type IsActiveMatchOptions,\n type Router,\n UrlTree,\n} from '@angular/router';\nimport { url as currentUrl } from '../url';\n\n/**\n * Description of a single navigation item.\n *\n * Reactive fields accept either a static value or a zero-arg function — the function\n * form is wrapped in a `computed` so reading signals inside it produces a reactive value.\n *\n * @typeParam TMeta Arbitrary consumer-defined metadata round-tripped to {@link NavItem.meta}.\n *\n * @see createNavItems\n * @see NavItem\n */\nexport type CreateNavItem<TMeta = Record<string, unknown>> = {\n /** Visible text. */\n label: string | (() => string);\n /**\n * The navigation target. Resolved relative to the route the resolver is attached to —\n * the same convention as Angular's `routerLink`:\n *\n * - `'a'` / `'a/b'` / `['a', 'b']` — relative segments, resolve to `${mount}/a` etc.\n * - `'/foo'` / `['/foo', 'bar']` — absolute, leading-slash escape hatch.\n * - A pre-built `UrlTree` is passed through unchanged.\n *\n * Omit (or return `null`) for a pure grouping header — `active` will then fall through\n * to the children-active check.\n */\n link?: string | any[] | (() => string | any[] | null) | null;\n /** Accessible label. Defaults to `label`. */\n ariaLabel?: string | (() => string);\n /** When true, the item is rendered but non-interactive. Cascades to descendants. */\n disabled?: boolean | (() => boolean);\n /** When true, the item (and its subtree) is filtered out of the consumer-facing array. */\n hidden?: boolean | (() => boolean);\n /** Arbitrary metadata round-tripped on the resulting `NavItem`. */\n meta?: TMeta | (() => TMeta);\n /**\n * Override the match options used to compute `active`. Merged on top of the global default\n * from `provideNavConfig`, which is in turn merged on top of `@angular/router`'s\n * `subsetMatchOptions` defaults.\n *\n * Setting this also implicitly disables the default child-active OR — see\n * {@link matchesWhenChildActive} to opt back in.\n */\n activeMatch?: Partial<IsActiveMatchOptions>;\n /**\n * Controls whether `active` ORs with descendant `active`.\n *\n * Default: `true` when `activeMatch` is omitted, `false` when `activeMatch` is set.\n * Explicit values override the default.\n */\n matchesWhenChildActive?: boolean;\n /** Optional stable id. Defaults to the serialized link when present. */\n id?: string | (() => string);\n /** Nested items. */\n children?: CreateNavItem<TMeta>[];\n};\n\n/**\n * A navigation item exposed by `injectNavItems`. All fields are signals so consumers can\n * read reactively without caring whether the source was static or signal-derived.\n *\n * @typeParam TMeta Same as the corresponding {@link CreateNavItem}.\n */\nexport type NavItem<TMeta = Record<string, unknown>> = {\n id: Signal<string>;\n label: Signal<string>;\n ariaLabel: Signal<string>;\n /** Serialized URL, or `null` for pure grouping items with no link. */\n link: Signal<string | null>;\n active: Signal<boolean>;\n disabled: Signal<boolean>;\n meta: Signal<TMeta>;\n /** Children that survive the hidden filter. */\n children: Signal<NavItem<TMeta>[]>;\n};\n\n/** @internal */\nexport type InternalNavItem<TMeta = Record<string, unknown>> =\n NavItem<TMeta> & {\n hidden: Signal<boolean>;\n };\n\n/** @internal */\nexport const NEVER_TRUE: Signal<boolean> = computed(() => false);\n\nfunction wrap<T>(): Signal<T | undefined>;\nfunction wrap<T>(value: T | (() => T)): Signal<T>;\nfunction wrap<T>(\n value: T | (() => T) | undefined,\n fallback: Signal<T>,\n): Signal<T>;\n\nfunction wrap<T>(\n value?: T | (() => T) | undefined,\n fallback?: Signal<T>,\n): Signal<T | undefined> {\n if (value === undefined)\n return fallback ? fallback : computed(() => undefined);\n if (typeof value === 'function')\n return isSignal(value) ? (value as Signal<T>) : computed(value as () => T);\n return computed(() => value);\n}\n\nfunction isAbsoluteCommandArray(commands: readonly unknown[]): boolean {\n return (\n commands.length > 0 &&\n typeof commands[0] === 'string' &&\n (commands[0] as string).startsWith('/')\n );\n}\n\nfunction resolveLinkTree(\n input: CreateNavItem['link'],\n router: Router,\n relativeTo: ActivatedRouteSnapshot,\n): UrlTree | null {\n const raw = typeof input === 'function' ? input() : input;\n if (raw === undefined || raw === null) return null;\n if (raw instanceof UrlTree) return raw;\n\n if (typeof raw === 'string') {\n if (raw.startsWith('/')) return router.parseUrl(raw);\n const parsed = router.parseUrl('/' + raw);\n const primary = parsed.root.children['primary'];\n const segments = primary ? primary.segments.map((s) => s.path) : [];\n return createUrlTreeFromSnapshot(\n relativeTo,\n segments,\n parsed.queryParams,\n parsed.fragment,\n );\n }\n\n if (isAbsoluteCommandArray(raw)) return router.createUrlTree(raw);\n return createUrlTreeFromSnapshot(relativeTo, raw);\n}\n\nfunction resolveMeta<TMeta>(input: CreateNavItem<TMeta>['meta']): TMeta {\n if (input === undefined) return {} as TMeta;\n return typeof input === 'function' ? (input as () => TMeta)() : input;\n}\n\n/**\n * @internal\n * Recursively builds an {@link InternalNavItem} tree from {@link CreateNavItem} input.\n * Cascades parent `disabled`/`hidden` to descendants and computes `active` against the\n * current router URL using `Router.isActive`.\n */\nexport function createInternalNavItem<TMeta = Record<string, unknown>>(\n input: CreateNavItem<TMeta>,\n router: Router,\n relativeTo: ActivatedRouteSnapshot,\n configActiveMatch: Partial<IsActiveMatchOptions> | undefined,\n parentDisabled: Signal<boolean>,\n parentHidden: Signal<boolean>,\n fallbackId: string,\n): InternalNavItem<TMeta> {\n const label = wrap(input.label);\n const ariaLabel = input.ariaLabel ? wrap(input.ariaLabel) : label;\n\n const linkTree = computed(() =>\n resolveLinkTree(input.link, router, relativeTo),\n );\n const link: Signal<string | null> = computed(() => {\n const tree = linkTree();\n return tree ? router.serializeUrl(tree) : null;\n });\n\n const ownDisabled = wrap(input.disabled, NEVER_TRUE);\n const ownHidden = wrap(input.hidden, NEVER_TRUE);\n\n const disabled = computed(() => parentDisabled() || ownDisabled());\n const hidden = computed(() => parentHidden() || ownHidden());\n\n const metaInput = input.meta;\n const meta: Signal<TMeta> = computed(() => resolveMeta<TMeta>(metaInput));\n\n const id: Signal<string> =\n input.id !== undefined\n ? wrap(input.id)\n : computed(() => link() ?? fallbackId);\n\n const childItems: InternalNavItem<TMeta>[] = (input.children ?? []).map(\n (childInput, i) =>\n createInternalNavItem<TMeta>(\n childInput,\n router,\n relativeTo,\n configActiveMatch,\n disabled,\n hidden,\n `${fallbackId}.${i}`,\n ),\n );\n\n const children: Signal<NavItem<TMeta>[]> = computed(() =>\n childItems.filter((c) => !c.hidden()),\n );\n\n const mergedActiveMatch: Partial<IsActiveMatchOptions> = {\n ...configActiveMatch,\n ...input.activeMatch,\n };\n\n const trackNavigation = currentUrl(router);\n const finalOptions: IsActiveMatchOptions = {\n paths: 'subset',\n fragment: 'ignored',\n matrixParams: 'ignored',\n queryParams: 'subset',\n ...mergedActiveMatch,\n };\n\n const ownActive = computed(() => {\n trackNavigation();\n const tree = linkTree();\n return tree ? router.isActive(tree, finalOptions) : false;\n });\n\n const orWithChildren =\n input.matchesWhenChildActive ?? input.activeMatch === undefined;\n\n const active = computed(\n () =>\n ownActive() ||\n (orWithChildren &&\n !!childItems.length &&\n childItems.some((c) => c.active())),\n );\n\n return {\n id,\n label,\n ariaLabel,\n link,\n active,\n disabled,\n hidden,\n meta,\n children,\n };\n}\n","import { inject, InjectionToken, type Provider } from '@angular/core';\nimport { type IsActiveMatchOptions } from '@angular/router';\nimport { type CreateNavItem } from './nav';\n\n/**\n * Per-scope fallback descriptor: a static array or a factory returning one.\n */\nexport type NavDefaultsForScope<TMeta = Record<string, unknown>> =\n | CreateNavItem<TMeta>[]\n | (() => CreateNavItem<TMeta>[]);\n\n/**\n * Global configuration for the nav system.\n * @see provideNavConfig\n */\nexport type NavConfig<TMeta = Record<string, unknown>> = {\n /**\n * Default match options used when computing `NavItem.active`. Per-item `activeMatch`\n * (and the router's built-in `subsetMatchOptions`) are still merged on top.\n */\n activeMatch?: Partial<IsActiveMatchOptions>;\n /**\n * Fallback nav items rendered when no route in the active chain has registered items\n * for the requested scope. Relative `link`s resolve from `/`.\n *\n * Forms:\n * - Array (or factory): fallback for the default (unnamed) scope.\n * - Record: keys match the `name` passed to `createNavItems`. The unnamed scope can\n * also be provided via this record using the empty-string key `''`.\n *\n * A route that wants to render an *empty* nav explicitly should register\n * `createNavItems([])`, which shadows these defaults via the normal deepest-wins rule.\n */\n defaults?:\n | NavDefaultsForScope<TMeta>\n | Record<string, NavDefaultsForScope<TMeta>>;\n};\n\n/** @internal */\nconst token = new InjectionToken<NavConfig>('@mmstack/router-core:nav-config');\n\n/**\n * Provides global configuration for the nav system. The factory form runs in\n * an injection context, so it can use `inject()` to build defaults from app\n * state.\n *\n * @param config Either a literal {@link NavConfig} object or a factory\n * `() => NavConfig`. Optional — without it, the nav system uses Angular's\n * default `activeMatch` options and renders nothing in scopes that have no\n * registered items.\n * @returns A `Provider` to add to your app's providers array.\n *\n * @example\n * ```ts\n * bootstrapApplication(AppComponent, {\n * providers: [\n * provideRouter(routes),\n * provideNavConfig({\n * activeMatch: { queryParams: 'ignored' },\n * defaults: [\n * { label: 'Home', link: '/' },\n * { label: 'Docs', link: '/docs' },\n * ],\n * }),\n * ],\n * });\n * ```\n *\n * @example\n * ```ts\n * // Factory form — read defaults from a service\n * provideNavConfig(() => {\n * const role = inject(AuthStore).role();\n * return {\n * defaults: {\n * main: role === 'admin' ? adminNav : guestNav,\n * },\n * };\n * });\n * ```\n */\nexport function provideNavConfig(\n config?: NavConfig | (() => NavConfig),\n): Provider {\n const fn = typeof config === 'function' ? config : () => ({ ...config });\n return {\n provide: token,\n useFactory: fn,\n };\n}\n\n/** @internal */\nexport function injectNavConfig(): NavConfig {\n return inject(token, { optional: true }) ?? {};\n}\n","import {\n computed,\n EnvironmentInjector,\n inject,\n Injectable,\n runInInjectionContext,\n type Signal,\n untracked,\n} from '@angular/core';\nimport { Router } from '@angular/router';\nimport { mutable } from '@mmstack/primitives';\nimport { injectLeafRoutes } from '../util';\nimport {\n createInternalNavItem,\n type CreateNavItem,\n type InternalNavItem,\n type NavItem,\n NEVER_TRUE,\n} from './nav';\nimport { injectNavConfig, type NavDefaultsForScope } from './nav-config';\n\n/** @internal */\nexport const DEFAULT_NAV_SCOPE: unique symbol = Symbol('mmstack.nav.default');\n\ntype ScopeName = string | typeof DEFAULT_NAV_SCOPE;\n\n// Map stores items with an unknown meta — the public read API re-asserts TMeta.\ntype AnyInternalNavItem = InternalNavItem<unknown>;\n\n@Injectable({ providedIn: 'root' })\nexport class NavStore {\n private readonly map = mutable<\n Map<ScopeName, Map<string, AnyInternalNavItem[]>>\n >(new Map());\n\n private readonly leafRoutes = injectLeafRoutes();\n private readonly router = inject(Router);\n private readonly config = injectNavConfig();\n private readonly injector = inject(EnvironmentInjector);\n private readonly defaultsCache = new Map<\n ScopeName,\n AnyInternalNavItem[] | null\n >();\n\n /** @internal */\n register(\n scope: ScopeName,\n routePath: string,\n items: AnyInternalNavItem[],\n ): void {\n this.map.inline((m) => {\n let scopeMap = m.get(scope);\n if (!scopeMap) {\n scopeMap = new Map();\n m.set(scope, scopeMap);\n }\n scopeMap.set(routePath, items);\n });\n }\n\n /** @internal */\n scope<TMeta = Record<string, unknown>>(\n name: ScopeName,\n ): Signal<NavItem<TMeta>[]> {\n return computed(() => {\n const scopeMap = this.map().get(name);\n if (scopeMap) {\n const leaves = this.leafRoutes();\n for (let i = leaves.length - 1; i >= 0; i--) {\n const items = scopeMap.get(leaves[i].path);\n if (items) {\n return items.filter((it) => !it.hidden()) as NavItem<TMeta>[];\n }\n }\n }\n\n const defaults = this.getDefaultItems(name);\n if (defaults) {\n return defaults.filter((it) => !it.hidden()) as NavItem<TMeta>[];\n }\n return [];\n });\n }\n\n private getDefaultItems(scope: ScopeName): AnyInternalNavItem[] | null {\n const cached = this.defaultsCache.get(scope);\n if (cached !== undefined) return cached;\n\n const built = this.buildDefaultItems(scope);\n this.defaultsCache.set(scope, built);\n return built;\n }\n\n private buildDefaultItems(scope: ScopeName): AnyInternalNavItem[] | null {\n const defaults = this.config.defaults;\n if (!defaults) return null;\n\n let entry: NavDefaultsForScope | undefined;\n if (Array.isArray(defaults) || typeof defaults === 'function') {\n if (scope === DEFAULT_NAV_SCOPE) entry = defaults;\n } else {\n const key = scope === DEFAULT_NAV_SCOPE ? '' : scope;\n entry = (defaults as Record<string, NavDefaultsForScope>)[key];\n }\n if (!entry) return null;\n const resolved = entry;\n\n return untracked(() =>\n runInInjectionContext(this.injector, () => {\n const inputs =\n typeof resolved === 'function' ? resolved() : resolved;\n const rootSnapshot = this.router.routerState.snapshot.root;\n const prefix =\n scope === DEFAULT_NAV_SCOPE\n ? '__defaults__'\n : `__defaults__:${scope}`;\n return inputs.map((input: CreateNavItem, i) =>\n createInternalNavItem(\n input,\n this.router,\n rootSnapshot,\n this.config.activeMatch,\n NEVER_TRUE,\n NEVER_TRUE,\n `${prefix}#${i}`,\n ),\n ) as AnyInternalNavItem[];\n }),\n );\n }\n}\n\n/**\n * Returns a reactive list of nav items for the requested scope.\n *\n * The returned signal reflects the nearest active ancestor route that registered items\n * for `name` via `createNavItems`. If no active route has registered items for the\n * scope, falls back to `NavConfig.defaults` (when provided via `provideNavConfig`).\n * Hidden items are filtered out.\n *\n * @typeParam TMeta The shape of `NavItem.meta` for the consuming code. Untyped at the\n * registration site — this is a consumer-side assertion.\n *\n * @example\n * ```typescript\n * @Component({\n * template: `\n * @for (item of items(); track item) {\n * <a [href]=\"item.link()\" [class.active]=\"item.active()\">{{ item.label() }}</a>\n * }\n * `,\n * })\n * export class TopBar {\n * protected readonly items = injectNavItems();\n * }\n * ```\n */\nexport function injectNavItems<TMeta = Record<string, unknown>>(\n name?: string,\n): Signal<NavItem<TMeta>[]> {\n const store = inject(NavStore);\n return store.scope<TMeta>(name ?? DEFAULT_NAV_SCOPE);\n}\n","import { inject } from '@angular/core';\nimport { type ResolveFn, Router } from '@angular/router';\nimport { injectSnapshotPathResolver } from '../util';\nimport {\n createInternalNavItem,\n type CreateNavItem,\n type InternalNavItem,\n NEVER_TRUE,\n} from './nav';\nimport { injectNavConfig } from './nav-config';\nimport { DEFAULT_NAV_SCOPE, NavStore } from './nav-store';\n\n/**\n * Registers a set of nav items for the activating route under the given scope.\n * Mirrors {@link createBreadcrumb} / {@link createTitle} — designed to be used\n * in a route's `resolve` map.\n *\n * Scope override semantics: when multiple routes in the active chain register\n * items under the same scope, the deepest active registration wins. Navigating\n * away restores the shallower registration. To explicitly render an empty nav\n * (shadowing a default), pass `[]`.\n *\n * @typeParam TMeta Optional per-item metadata type — flows through the\n * registered items so consumers reading via {@link injectNavItems} get\n * typed access to `item.meta`.\n * @param itemsOrFactory Either a static array of {@link CreateNavItem} or a\n * factory `() => CreateNavItem<TMeta>[]` invoked inside an injection\n * context (so it can use `inject()` for dynamic items).\n * @param options Optional `{ name }` for registering multiple scopes on a\n * single route. Omit to target the default (unnamed) scope.\n * @returns An Angular `ResolveFn<void>` to wire into a route's `resolve` map.\n * The resolver registers items as a side effect; the resolved value itself\n * is unused.\n *\n * @example\n * ```ts\n * // Single default-scope nav\n * {\n * path: 'app',\n * resolve: {\n * _nav: createNavItems([\n * { label: 'Dashboard', link: 'dashboard' },\n * { label: 'Reports', link: 'reports' },\n * ]),\n * },\n * }\n *\n * // Multiple scopes\n * {\n * path: 'app',\n * resolve: {\n * mainNav: createNavItems([...], { name: 'main' }),\n * sideNav: createNavItems([...], { name: 'side' }),\n * },\n * }\n *\n * // Factory using inject()\n * createNavItems(() => {\n * const auth = inject(AuthStore);\n * return auth.canAdmin() ? adminItems : userItems;\n * });\n * ```\n */\nexport function createNavItems<TMeta = Record<string, unknown>>(\n itemsOrFactory:\n | CreateNavItem<TMeta>[]\n | (() => CreateNavItem<TMeta>[]),\n options?: { name?: string },\n): ResolveFn<void> {\n const factory =\n typeof itemsOrFactory === 'function'\n ? itemsOrFactory\n : () => itemsOrFactory;\n\n return async (route) => {\n const router = inject(Router);\n const store = inject(NavStore);\n const resolveRoutePath = injectSnapshotPathResolver();\n const config = injectNavConfig();\n\n const routePath = resolveRoutePath(route);\n const scope = options?.name ?? DEFAULT_NAV_SCOPE;\n\n const items = factory().map((input, i) =>\n createInternalNavItem<TMeta>(\n input,\n router,\n route,\n config.activeMatch,\n NEVER_TRUE,\n NEVER_TRUE,\n `${routePath}#${i}`,\n ),\n );\n\n store.register(scope, routePath, items as InternalNavItem<unknown>[]);\n\n return Promise.resolve();\n };\n}\n","import {\n computed,\n inject,\n isSignal,\n untracked,\n type WritableSignal,\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { toWritable } from '@mmstack/primitives';\n\n/**\n * Creates a WritableSignal that synchronizes with a specific URL query parameter,\n * enabling two-way binding between the signal's state and the URL.\n *\n * Reading the signal provides the current value of the query parameter (or null if absent).\n * Setting the signal updates the URL query parameter using `Router.navigate`, triggering\n * navigation and causing the signal to update reactively if the navigation is successful.\n *\n * @param key The key of the query parameter to synchronize with.\n * Can be a static string (e.g., `'search'`) or a function/signal returning a string\n * for dynamic keys (e.g., `() => this.userId() + '_filter'` or `computed(() => this.category() + '_sort')`).\n * The signal will reactively update if the key returned by the function/signal changes.\n * @returns {WritableSignal<string | null>} A signal representing the query parameter's value.\n * - Reading returns the current value string, or `null` if the parameter is absent in the URL.\n * - Setting the signal to a string updates the query parameter in the URL (e.g., `signal.set('value')` results in `?key=value`).\n * - Setting the signal to `null` removes the query parameter from the URL (e.g., `signal.set(null)` results in `?otherParam=...`).\n * - Automatically reflects changes if the query parameters update due to external navigation.\n * @remarks\n * - Requires Angular's `ActivatedRoute` and `Router` to be available in the injection context.\n * - Uses `Router.navigate` with `queryParamsHandling: 'merge'` to preserve other existing query parameters during updates.\n * - Handles dynamic keys reactively. If the result of the `key` function/signal changes, the signal will start reflecting the value of the *new* query parameter key.\n * - During Server-Side Rendering (SSR), it reads the initial value from the route snapshot. Write operations (`set`) might have limited or no effect on the server depending on the platform configuration.\n *\n * @example\n * ```ts\n * import { Component, computed, effect, signal } from '@angular/core';\n * import { queryParam } from '@mmstack/router-core'; // Adjust import path as needed\n * // import { FormsModule } from '@angular/forms'; // If using ngModel\n *\n * @Component({\n * selector: 'app-product-list',\n * // imports: [FormsModule], // If using ngModel\n * template: `\n * <div>\n * Sort By:\n * <select [value]=\"sortSignal() ?? ''\" (change)=\"sortSignal.set($any($event.target).value || null)\">\n * <option value=\"\">Default</option>\n * <option value=\"price_asc\">Price Asc</option>\n * <option value=\"price_desc\">Price Desc</option>\n * <option value=\"name\">Name</option>\n * </select>\n * <button (click)=\"sortSignal.set(null)\" [disabled]=\"!sortSignal()\">Clear Sort</button>\n * </div>\n * <div>\n * Page:\n * <input type=\"number\" min=\"1\" [value]=\"pageSignal() ?? '1'\" #p (input)=\"setPage(p.value)\"/>\n * </div>\n * * `\n * })\n * export class ProductListComponent {\n * // Two-way bind the 'sort' query parameter (?sort=...)\n * // Defaults to null if param is missing\n * sortSignal = queryParam('sort');\n *\n * // Example with a different type (needs serialization or separate logic)\n * // For simplicity, we treat page as string | null here\n * pageSignal = queryParam('page');\n *\n * constructor() {\n * effect(() => {\n * const currentSort = this.sortSignal();\n * const currentPage = this.pageSignal(); // Read as string | null\n * console.log('Sort/Page changed, reloading products for:', { sort: currentSort, page: currentPage });\n * // --- Fetch data based on currentSort and currentPage ---\n * });\n * }\n *\n * setPage(value: string): void {\n * const pageNum = parseInt(value, 10);\n * // Set to null if page is 1 (to remove param), otherwise set string value\n * this.pageSignal.set(isNaN(pageNum) || pageNum <= 1 ? null : pageNum.toString());\n * }\n * }\n * ```\n */\nexport function queryParam(\n key: string | (() => string),\n route = inject(ActivatedRoute),\n): WritableSignal<string | null> {\n const router = inject(Router);\n\n const keySignal =\n typeof key === 'string'\n ? computed(() => key)\n : isSignal(key)\n ? key\n : computed(key);\n\n const queryParamMap = toSignal(route.queryParamMap, {\n initialValue: route.snapshot.queryParamMap,\n });\n\n const queryParams = toSignal(route.queryParams, {\n initialValue: route.snapshot.queryParams,\n });\n\n const queryParam = computed(() => queryParamMap().get(keySignal()));\n\n const set = (newValue: string | null) => {\n const next = {\n ...untracked(queryParams),\n };\n const key = untracked(keySignal);\n\n if (newValue === null) {\n delete next[key];\n } else {\n next[key] = newValue;\n }\n\n router.navigate([], {\n relativeTo: route,\n queryParams: next,\n queryParamsHandling: 'merge',\n });\n };\n\n return toWritable(queryParam, set);\n}\n","import { inject, InjectionToken, type 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 base title to fallback to, by default Title.getTitle() is called on instantiation and that is used as a fallback,\n * which in most cases should resolve to what is in index.html, unless you specifically call Title.setTitle() before any routes,\n * are initialized.\n */\n initialTitle?: string;\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 initialTitle: string;\n parser: (title: string) => string;\n keepLastKnown: boolean;\n};\n\nconst token = new InjectionToken<InternalTitleConfig>(\n '@mmstack/router-core:title-config',\n);\n\n/**\n * Provide application-wide configuration for the title subsystem. The config\n * is only consumed when at least one route uses a {@link createTitle} resolver;\n * routes without `createTitle` are unaffected.\n *\n * @param config Optional {@link TitleConfig}. All fields are optional — pass\n * `prefix` to namespace titles (e.g. `\"My App – \"`), `initialTitle` to\n * override the fallback (defaults to the `<title>` from `index.html`), and\n * `keepLastKnownTitle: false` to clear the title on navigations to routes\n * without a title (the default keeps the previous one).\n * @returns A `Provider` to add to your app's providers array.\n *\n * @example\n * ```ts\n * bootstrapApplication(AppComponent, {\n * providers: [\n * provideRouter(routes),\n * provideTitleConfig({\n * prefix: (title) => `${title} • My App`,\n * keepLastKnownTitle: true,\n * }),\n * ],\n * });\n * ```\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 initialTitle: config?.initialTitle ?? '',\n parser: prefixFn,\n keepLastKnown: config?.keepLastKnownTitle ?? true,\n } satisfies InternalTitleConfig,\n };\n}\n\nfunction identity(str: string) {\n return str;\n}\n\nexport function injectTitleConfig(): InternalTitleConfig {\n return (\n inject(token, {\n optional: true,\n }) ?? {\n initialTitle: '',\n parser: identity,\n keepLastKnown: true,\n }\n );\n}\n","import {\n computed,\n effect,\n inject,\n Injectable,\n linkedSignal,\n untracked,\n type Signal,\n} from '@angular/core';\nimport { Title } from '@angular/platform-browser';\nimport { type 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 map = mutable<Map<string, Signal<string>>>(new Map());\n\n constructor() {\n const { keepLastKnown, initialTitle } = injectTitleConfig();\n const leafRoutes = injectLeafRoutes();\n const title = inject(Title);\n const fallbackTitle = initialTitle || untracked(() => title.getTitle());\n\n const reverseLeaves = computed(() => 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 ?? null)\n .filter((v) => v !== null);\n });\n\n const currentTitle = computed(() => currentResolvedTitles().at(0) ?? '');\n\n const heldTitle = 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 title.setTitle(heldTitle() || fallbackTitle);\n });\n }\n\n register(id: string, titleFn: Signal<string>) {\n this.map.inline((m) => m.set(id, titleFn));\n }\n}\n\n/**\n * Creates an Angular router `ResolveFn<string>` that registers a title for the\n * route it's attached to. Titles can be static strings, factory functions\n * (called in an injection context, so they can use `inject()`), or signal\n * factories (for reactive titles that change when underlying data does).\n *\n * The resolved title flows through any `prefix` configured via\n * {@link provideTitleConfig}, and is wired into Angular's `Title` service\n * via an effect. Nested routes pick the most-specific leaf's title; if a\n * deeper route has no title and `keepLastKnownTitle` is `true` (default),\n * the previous title is preserved.\n *\n * @param factoryOrValue Either a literal string title, a `() => string`\n * factory, or a `() => Signal<string>` factory for reactive titles. Factory\n * callbacks run inside an injection context, so they can use `inject()`.\n * @param awaitValue When `true`, the resolver waits until the title signal\n * emits a truthy value before resolving — useful for SSR/SEO where the\n * resolved title should not be empty. Defaults to `false`.\n * @returns An Angular `ResolveFn<string>` to wire into a route's `title` field\n * (or any other `resolve` slot — the return value isn't usually consumed).\n *\n * @example\n * ```ts\n * // Static title\n * { path: 'about', component: AboutComponent, title: createTitle('About us') }\n *\n * // Factory using inject()\n * {\n * path: 'users/:id',\n * component: UserComponent,\n * title: createTitle(() => inject(ActivatedRoute).snapshot.params['id']),\n * }\n *\n * // Reactive title from a signal store\n * {\n * path: 'dashboard',\n * component: DashboardComponent,\n * title: createTitle(() => {\n * const user = inject(UserStore).current;\n * return computed(() => `Dashboard – ${user()?.name ?? 'Guest'}`);\n * }),\n * }\n * ```\n */\nexport function createTitle(\n factoryOrValue: (() => string | (() => string)) | string,\n awaitValue = false,\n): ResolveFn<string> {\n const factory =\n typeof factoryOrValue === 'string' ? () => factoryOrValue : factoryOrValue;\n\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 = factory();\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":["parsePathSegment","token","filter","currentUrl"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mmstack/router-core",
3
- "version": "21.0.7",
3
+ "version": "22.0.0",
4
4
  "keywords": [
5
5
  "angular",
6
6
  "signals",
@@ -21,13 +21,13 @@
21
21
  },
22
22
  "homepage": "https://github.com/mihajm/mmstack/blob/master/packages/router/core",
23
23
  "dependencies": {
24
- "@mmstack/primitives": "^21.0.0",
24
+ "@mmstack/primitives": "^22.0.0",
25
25
  "tslib": "^2.3.0"
26
26
  },
27
27
  "peerDependencies": {
28
- "@angular/core": ">=21 <22",
29
- "@angular/router": ">=21 <22",
30
- "@angular/platform-browser": ">=21 <22",
28
+ "@angular/core": ">=22 <23",
29
+ "@angular/router": ">=22 <23",
30
+ "@angular/platform-browser": ">=22 <23",
31
31
  "rxjs": "~7.8.2"
32
32
  },
33
33
  "sideEffects": false,