@magmonium/one 0.3.11 → 0.3.14

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.
@@ -4047,6 +4047,20 @@ const navMenuOwnerId = (navId, navMap, hasOwnContent = false, dynamicRows = {},
4047
4047
  }
4048
4048
  return visible;
4049
4049
  };
4050
+ /**
4051
+ * Whether a menu row earns the chevron that Browses into it: a Url whose Nav
4052
+ * would draw rows of its own. A Murl row already opens its panel over the same
4053
+ * Page, so a chevron would only repeat the row (CONTEXT.md Browse).
4054
+ *
4055
+ * A row source counts as though still answering: its rows arrive whenever the
4056
+ * store behind it fills, and a chevron waiting on them would pop in late or
4057
+ * not at all. One that resolves nothing leaves the Browse on the empty state.
4058
+ */
4059
+ const isBrowsable = (navId, navMap, dynamicRows, instances, hidden) => navMap[navId]?.kind === 'url' &&
4060
+ menuChildIds(navId, navMap, Object.fromEntries(Object.entries(dynamicRows).map(([id, rows]) => [
4061
+ id,
4062
+ { ...rows, loading: true },
4063
+ ])), instances, hidden).length > 0;
4050
4064
  /**
4051
4065
  * The rows one panel draws. A `dynamic` child with a NavRowSource behind it is
4052
4066
  * **transparent** the way a Default Nav is: its resolved rows are spliced where
@@ -4067,12 +4081,21 @@ const buildNavMenus = (navId, navMap, anchor, dynamicRows = {}, routeParams, ins
4067
4081
  // the rows a source resolved: a panel drawn beneath a dynamic Nav is a
4068
4082
  // panel every entry in it routes behind.
4069
4083
  const inherited = navParamsFor(parentNavId(childId) ?? childId, navMap, routeParams);
4084
+ const browsable = isBrowsable(childId, navMap, dynamicRows, instances, hidden)
4085
+ ? { browsable: true }
4086
+ : {};
4070
4087
  if (!nav || nav.presentation !== 'dynamic' || !resolved) {
4071
4088
  return [
4072
- toTrailItem(childId, navMap, anchor, undefined, navParamsFor(childId, navMap, routeParams)),
4089
+ {
4090
+ ...toTrailItem(childId, navMap, anchor, undefined, navParamsFor(childId, navMap, routeParams)),
4091
+ ...browsable,
4092
+ },
4073
4093
  ];
4074
4094
  }
4075
- return resolved.rows.map((row) => navRowTrailItem(childId, nav, row, navMap, anchor, inherited));
4095
+ return resolved.rows.map((row) => ({
4096
+ ...navRowTrailItem(childId, nav, row, navMap, anchor, inherited),
4097
+ ...browsable,
4098
+ }));
4076
4099
  });
4077
4100
  /**
4078
4101
  * Merges a widget's emitted trail over the derived one, matching by depth.
@@ -4289,6 +4312,7 @@ const initialState$3 = {
4289
4312
  outlets: [],
4290
4313
  navOpenedByUser: false,
4291
4314
  menuNavId: undefined,
4315
+ menuParams: undefined,
4292
4316
  keepPanelOnPathChange: false,
4293
4317
  panelPushed: false,
4294
4318
  navScrolledDown: false,
@@ -4394,15 +4418,24 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
4394
4418
  * it: with nothing registered for `/page|search`, the global `root_search`
4395
4419
  * is what that address meant, and falling through to it beats leaving the
4396
4420
  * page's own menu up while a panel is addressed.
4421
+ *
4422
+ * A Browse is the one key: it names a Nav the map knows, not an Address,
4423
+ * and falling through to the Address's own panel would put back exactly
4424
+ * what the User browsed away from.
4397
4425
  */
4398
- const widgetNavIds = computed(() => {
4399
- const anchored = id();
4426
+ const lookupKeys = (anchored) => {
4400
4427
  const murl = store.murl();
4401
4428
  if (!murl.length)
4402
4429
  return [anchored];
4403
4430
  const rooted = navIdFor(ROOT_NAV$1, murl);
4404
4431
  return anchored === rooted ? [anchored] : [anchored, rooted];
4432
+ };
4433
+ const widgetNavIds = computed(() => {
4434
+ const browsed = store.menuNavId();
4435
+ return browsed ? [browsed] : lookupKeys(id());
4405
4436
  }, ...(ngDevMode ? [{ debugName: "widgetNavIds" }] : /* istanbul ignore next */ []));
4437
+ /** The keys the Address alone names, whatever a Browse is showing. */
4438
+ const addressNavIds = computed(() => lookupKeys(navIdFor(anchorRouteNavId(), store.murl())), ...(ngDevMode ? [{ debugName: "addressNavIds" }] : /* istanbul ignore next */ []));
4406
4439
  /** The m-ui slot first, then every named mount (ADR 0036). */
4407
4440
  const allMounts = computed(() => {
4408
4441
  const appLink = store.appLink();
@@ -4424,25 +4457,42 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
4424
4457
  .filter((m) => m.createMenu &&
4425
4458
  (m.urlMode === 'tail' ||
4426
4459
  (m.urlMode === 'outlet' && outlets.includes(m.name))))
4427
- .map((m) => ({ name: m.name, appNavId: m.appNavId, link: m.link }));
4460
+ .map((m) => ({
4461
+ name: m.name,
4462
+ appNavId: m.appNavId,
4463
+ link: m.link,
4464
+ urlMode: m.urlMode,
4465
+ }));
4428
4466
  const unclaimed = outlets
4429
4467
  .filter((name) => !store.mounts()[name])
4430
4468
  .map((name) => ({
4431
4469
  name,
4432
4470
  appNavId: `root_app_${name}`,
4433
4471
  link: undefined,
4472
+ urlMode: 'outlet',
4434
4473
  }));
4435
4474
  return [...listed, ...unclaimed];
4436
4475
  }, ...(ngDevMode ? [{ debugName: "menuMounts" }] : /* istanbul ignore next */ []));
4437
- /** The map the menu reads: the tree, with each listed side app under root. */
4476
+ /**
4477
+ * The map the menu reads: the tree, with each listed app hung where the
4478
+ * User reaches it. A `tail` app stands on the Nav that routes its AppLink —
4479
+ * `root_app` for `/app/<link>` — so its node is that Nav's child; listing it
4480
+ * at root too drew one app twice. A side app's segment belongs to no Nav,
4481
+ * and neither does a tail app whose host Nav the tree does not hold, so
4482
+ * those hang under root (ADR 0038).
4483
+ */
4438
4484
  const menuNavMap = computed(() => {
4439
4485
  const navMap = store.navMap();
4440
4486
  const listed = menuMounts();
4441
4487
  if (!listed.length)
4442
4488
  return navMap;
4443
4489
  const configs = store.wcConfigMap();
4444
- const root = navMap[ROOT_NAV$1];
4445
- const extra = listed.map(({ name, appNavId, link }) => {
4490
+ const parentOf = ({ appNavId, urlMode, }) => {
4491
+ const host = parentNavId(appNavId);
4492
+ return urlMode === 'tail' && host && navMap[host] ? host : ROOT_NAV$1;
4493
+ };
4494
+ const extra = listed.map((mount) => {
4495
+ const { name, appNavId, link } = mount;
4446
4496
  const fetched = navMap[appNavId];
4447
4497
  const config = link ? configs[link] : undefined;
4448
4498
  const node = {
@@ -4451,18 +4501,31 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
4451
4501
  title: config?.app ?? fetched?.title ?? name,
4452
4502
  ...(config?.logo ? { logo: config.logo } : {}),
4453
4503
  };
4454
- return node;
4504
+ return { node, parent: parentOf(mount) };
4455
4505
  });
4506
+ // A host Nav that declares no children lists its own by NavId prefix,
4507
+ // which already finds the node — declaring it alone would hide every
4508
+ // sibling that prefix found. Root always declares.
4509
+ const parents = [...new Set(extra.map(({ parent }) => parent))].filter((id) => id === ROOT_NAV$1 || !!navMap[id]?.children?.length);
4456
4510
  return {
4457
4511
  ...navMap,
4458
- ...Object.fromEntries(extra.map((node) => [node.navId, node])),
4459
- [ROOT_NAV$1]: {
4460
- ...root,
4461
- children: [
4462
- ...(root?.children ?? []).filter((id) => !extra.some((node) => node.navId === id)),
4463
- ...extra.map((node) => node.navId),
4464
- ],
4465
- },
4512
+ ...Object.fromEntries(extra.map(({ node }) => [node.navId, node])),
4513
+ ...Object.fromEntries(parents.map((parentId) => {
4514
+ const parent = navMap[parentId];
4515
+ const hung = extra
4516
+ .filter(({ parent: p }) => p === parentId)
4517
+ .map(({ node }) => node.navId);
4518
+ return [
4519
+ parentId,
4520
+ {
4521
+ ...parent,
4522
+ children: [
4523
+ ...(parent?.children ?? []).filter((id) => !hung.includes(id)),
4524
+ ...hung,
4525
+ ],
4526
+ },
4527
+ ];
4528
+ })),
4466
4529
  };
4467
4530
  }, ...(ngDevMode ? [{ debugName: "menuNavMap" }] : /* istanbul ignore next */ []));
4468
4531
  const hasMurl = computed(() => store.murl().length > 0, ...(ngDevMode ? [{ debugName: "hasMurl" }] : /* istanbul ignore next */ []));
@@ -4510,14 +4573,15 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
4510
4573
  }
4511
4574
  return undefined;
4512
4575
  };
4513
- const widgetEntry = computed(() => {
4514
- for (const candidate of widgetNavIds()) {
4576
+ const firstEntry = (keys) => {
4577
+ for (const candidate of keys) {
4515
4578
  const hit = entryAt(candidate);
4516
4579
  if (hit)
4517
4580
  return { ...hit, navId: candidate };
4518
4581
  }
4519
4582
  return undefined;
4520
- }, ...(ngDevMode ? [{ debugName: "widgetEntry" }] : /* istanbul ignore next */ []));
4583
+ };
4584
+ const widgetEntry = computed(() => firstEntry(widgetNavIds()), ...(ngDevMode ? [{ debugName: "widgetEntry" }] : /* istanbul ignore next */ []));
4521
4585
  /**
4522
4586
  * Every `dynamic` Nav with a NavRowSource behind it, resolved. Walks the
4523
4587
  * whole map rather than the open panel's own descent: the rows are drawn by
@@ -4539,10 +4603,22 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
4539
4603
  }
4540
4604
  return out;
4541
4605
  }, ...(ngDevMode ? [{ debugName: "dynamicRows" }] : /* istanbul ignore next */ []));
4606
+ /**
4607
+ * The instances the panel is drawn for: the Browse's while one is open —
4608
+ * the Router still describes the Page behind the panel, not the Nav the
4609
+ * User is looking into — and the Router's otherwise (CONTEXT.md Browse).
4610
+ */
4611
+ const panelParams = computed(() => store.menuNavId()
4612
+ ? Object.fromEntries(Object.entries(store.menuParams() ?? {}).map(([name, value]) => [
4613
+ name,
4614
+ String(value),
4615
+ ]))
4616
+ : store.routeParams(), ...(ngDevMode ? [{ debugName: "panelParams" }] : /* istanbul ignore next */ []));
4542
4617
  /**
4543
4618
  * Every `dynamic` Nav with a NavInstanceSource behind it, resolved against
4544
- * the parameters the Router currently holds (ADR 0030). The whole
4545
- * `routeParams` record goes in, not just this Nav's own value: a resolver
4619
+ * the parameters the panel is drawn for (ADR 0030) — a Browse's own, so the
4620
+ * trail names the book being looked into rather than the Page's. The whole
4621
+ * parameter record goes in, not just this Nav's own value: a resolver
4546
4622
  * for an issue is routinely a lookup keyed by the book above it, and the
4547
4623
  * design tool binds arguments by parameter name.
4548
4624
  *
@@ -4553,7 +4629,7 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
4553
4629
  */
4554
4630
  const dynamicInstances = computed(() => {
4555
4631
  const out = {};
4556
- const params = store.routeParams();
4632
+ const params = panelParams();
4557
4633
  for (const nav of Object.values(store.navMap())) {
4558
4634
  if (nav.presentation !== 'dynamic')
4559
4635
  continue;
@@ -4577,7 +4653,9 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
4577
4653
  * here is what makes the menu recompute when the store behind it fills.
4578
4654
  */
4579
4655
  const visibilityReads = computed(() => {
4580
- const params = store.routeParams();
4656
+ // The panel's instances: a gate is a question about the book the User
4657
+ // is looking into, which a Browse may have moved off the Page's.
4658
+ const params = panelParams();
4581
4659
  const out = [];
4582
4660
  for (const nav of Object.values(store.navMap())) {
4583
4661
  const hit = entryAt(nav.navId);
@@ -4603,7 +4681,7 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
4603
4681
  * missing would make the trigger depend on the thing it triggers.
4604
4682
  */
4605
4683
  const visibilityLoaders = computed(() => {
4606
- const params = store.routeParams();
4684
+ const params = panelParams();
4607
4685
  const out = [];
4608
4686
  for (const nav of Object.values(store.navMap())) {
4609
4687
  const hit = entryAt(nav.navId);
@@ -4715,8 +4793,7 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
4715
4793
  * the anchored key would title the global panel after the page it opened
4716
4794
  * over.
4717
4795
  */
4718
- const panelNavId = computed(() => {
4719
- const hit = widgetEntry();
4796
+ const answeringNavId = (candidates, hit) => {
4720
4797
  if (hit)
4721
4798
  return hit.navId;
4722
4799
  // Nothing registered under either key, so the panel is a *menu*: the
@@ -4724,7 +4801,6 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
4724
4801
  // global settings list, and reading it off the anchored key — a NavId no
4725
4802
  // asset holds — left the page's own menu up under its own header.
4726
4803
  const map = store.navMap();
4727
- const candidates = widgetNavIds();
4728
4804
  const rows = dynamicRows();
4729
4805
  return (candidates.find((c) => menuChildIds(c, map, rows, dynamicInstances(), hiddenNavIds())
4730
4806
  .length) ??
@@ -4733,8 +4809,18 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
4733
4809
  // the panel back to *settings*, whose row it is, rather than climbing
4734
4810
  // an anchored key the map has never heard of all the way to root.
4735
4811
  candidates.find((c) => !!map[c]) ??
4736
- id());
4737
- }, ...(ngDevMode ? [{ debugName: "panelNavId" }] : /* istanbul ignore next */ []));
4812
+ candidates[0]);
4813
+ };
4814
+ const panelNavId = computed(() => answeringNavId(widgetNavIds(), widgetEntry()), ...(ngDevMode ? [{ debugName: "panelNavId" }] : /* istanbul ignore next */ []));
4815
+ /**
4816
+ * The Nav the User stands on as the panel reads it — `panelNavId` with any
4817
+ * Browse left out. The panel is where the User looks and the Address where
4818
+ * they stand (CONTEXT.md Browse): a row marks itself against this, so the
4819
+ * row they came through stays marked however far they Browse.
4820
+ */
4821
+ const standingNavId = computed(() => store.menuNavId()
4822
+ ? answeringNavId(addressNavIds(), firstEntry(addressNavIds()))
4823
+ : panelNavId(), ...(ngDevMode ? [{ debugName: "standingNavId" }] : /* istanbul ignore next */ []));
4738
4824
  const breadcrumbResult = computed(() => {
4739
4825
  const menuConfig = resolvedNavMenuConfig();
4740
4826
  const widgetConfig = resolvedWidget();
@@ -4746,7 +4832,7 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
4746
4832
  dynamicRows: dynamicRows(),
4747
4833
  instances: dynamicInstances(),
4748
4834
  hidden: hiddenNavIds(),
4749
- routeParams: store.routeParams(),
4835
+ routeParams: panelParams(),
4750
4836
  breadcrumb: menuConfig?.breadcramb?.() ??
4751
4837
  (typeof widgetConfig?.breadcramb === 'function'
4752
4838
  ? widgetConfig.breadcramb()
@@ -4784,6 +4870,8 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
4784
4870
  allMounts,
4785
4871
  menuMounts,
4786
4872
  panelNavId,
4873
+ standingNavId,
4874
+ panelParams,
4787
4875
  hasMurl,
4788
4876
  isNavOpened,
4789
4877
  isMNavOpened,
@@ -4965,7 +5053,17 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
4965
5053
  });
4966
5054
  });
4967
5055
  })));
4968
- const setSelected = (navId, params) => (navId ? goToNav(navId, params) : closePanel());
5056
+ /**
5057
+ * Whether following `navId` would land on the Page already stood on. The
5058
+ * Router ignores a navigation to the URL it is on, so following it left the
5059
+ * panel up over a Page that never moved (CONTEXT.md Browse).
5060
+ */
5061
+ const standsOn = (navId, params) => !untracked(() => splitNavId(navId, store.navMap())).murl.length &&
5062
+ untracked(() => addressFor(navId, params)) ===
5063
+ untracked(() => store.path());
5064
+ const setSelected = (navId, params) => navId && !standsOn(navId, params)
5065
+ ? goToNav(navId, params)
5066
+ : closePanel();
4969
5067
  /**
4970
5068
  * The one click that derives its own target instead of naming one. With no
4971
5069
  * default Murl it opens the panel without touching the address — that state
@@ -5046,45 +5144,29 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
5046
5144
  }));
5047
5145
  };
5048
5146
  /**
5049
- * In-panel "up". Murl steps replace the Address, so
5050
- * the browser back button still closes the whole panel. Leaving Murl
5051
- * space (or stepping while icon-opened) keeps the panel open so the menu
5052
- * follows the trail instead of closing (same exception as AppLogo).
5147
+ * In-panel "up", and a Browse like the trail's: it steps above the menu
5148
+ * actually shown — a leaf may already be showing its ancestor's rows, and
5149
+ * a Browse may already have moved the panel off the Address — and never
5150
+ * writes the Address, in menu space as in route space (CONTEXT.md Browse).
5151
+ * With no history entry of its own, the browser back button still closes
5152
+ * the whole panel.
5053
5153
  */
5054
5154
  const back = () => {
5055
5155
  if (!untracked(() => store.isNavOpened()))
5056
5156
  return;
5057
- const murl = untracked(() => store.murl());
5058
- // One Murl segment off the Address we are on, keeping the Anchor. Read
5059
- // from the Address rather than resolved through the map: an anchored
5060
- // panel's NavId (`root_page_settings_user`) names no node, so asking the
5061
- // map whether the parent is still a Murl answered no and sent a route
5062
- // path nothing matched — the `**` redirect then landed on home.
5063
- if (murl.length > 1) {
5064
- const path = untracked(() => store.path());
5065
- const base = path === URL_SEP ? URL_SEP : path.replace(/\/$/, '');
5066
- router.navigateByUrl(`${base}${MURL_SEP}${murl.slice(0, -1).join(MURL_SEP)}`, { replaceUrl: true });
5067
- return;
5068
- }
5069
- // The last Murl closes menu space and leaves the page we opened over,
5070
- // panel still up so the menu follows the trail instead of vanishing.
5071
- if (murl.length === 1) {
5072
- patchState(store, {
5073
- navOpenedByUser: true,
5074
- keepPanelOnPathChange: true,
5075
- });
5076
- router.navigateByUrl(untracked(() => store.path()), {
5077
- replaceUrl: true,
5078
- });
5079
- return;
5080
- }
5081
- // Start above the menu actually shown: a leaf may already be showing
5082
- // its ancestor's rows. Browsing that menu leaves the page in place.
5083
5157
  const owner = untracked(() => store.breadcrumb().header?.id);
5084
5158
  const parent = owner ? parentNavId(owner) : undefined;
5085
5159
  if (!parent)
5086
5160
  return;
5087
- patchState(store, { menuNavId: visibleNavId(parent) });
5161
+ browse(visibleNavId(parent), untracked(() => store.panelParams()));
5162
+ };
5163
+ /**
5164
+ * Moves the open panel onto another Nav and never the User: the Address,
5165
+ * and the Page behind the panel, stay put (CONTEXT.md Browse). What the
5166
+ * trail and a row's chevron call — only following a menu row moves.
5167
+ */
5168
+ const browse = (navId, params) => {
5169
+ patchState(store, { menuNavId: navId, menuParams: params });
5088
5170
  };
5089
5171
  const loadNav = rxMethod(pipe(filter((req) => !!req.navId), tap(() => untracked(() => patchState(store, { navLoading: true }))), switchMap$1(({ navId, appNavId }) => getNavService
5090
5172
  .getNav(navId, untracked(() => store.navMap()), {
@@ -5131,6 +5213,7 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
5131
5213
  loadNav,
5132
5214
  registerWidgets,
5133
5215
  back,
5216
+ browse,
5134
5217
  resolveUrl,
5135
5218
  setNavScrolledDown,
5136
5219
  routePathFor: (navId) => navIdToRoutePath(navId, store.navMap()),
@@ -6496,9 +6579,10 @@ class MRefDirective {
6496
6579
  #renderer = inject(Renderer2);
6497
6580
  #elementRef = inject(ElementRef);
6498
6581
  /**
6499
- * Where the User stands as the panel reads it — the Nav that answered the
6500
- * address rather than the address's own key, so a row still knows itself
6501
- * when the panel was opened over a page (`/page|settings` → `root_settings`).
6582
+ * The Nav the panel shows — the one that answered the address rather than
6583
+ * the address's own key, so a row still knows itself when the panel was
6584
+ * opened over a page (`/page|settings` → `root_settings`), or the one a
6585
+ * Browse moved it onto.
6502
6586
  */
6503
6587
  #currentNavId = computed(() => this.#navRef?.panelNavId?.() ?? this.#navRef?.id(), ...(ngDevMode ? [{ debugName: "#currentNavId" }] : /* istanbul ignore next */ []));
6504
6588
  /**
@@ -6518,6 +6602,12 @@ class MRefDirective {
6518
6602
  }, ...(ngDevMode ? [{ debugName: "#paramsMatch" }] : /* istanbul ignore next */ []));
6519
6603
  /** Exact hit only — what a toggle re-clicks, and never an ancestor. */
6520
6604
  #currentlySelected = computed(() => this.mRef() === this.#currentNavId() && this.#paramsMatch(), ...(ngDevMode ? [{ debugName: "#currentlySelected" }] : /* istanbul ignore next */ []));
6605
+ /**
6606
+ * Where the User stands, which a Browse does not move: the panel may be
6607
+ * showing root's rows while the Address still stands under one of them, and
6608
+ * that row stays marked (CONTEXT.md Browse).
6609
+ */
6610
+ #standingNavId = computed(() => this.#navRef?.standingNavId?.() ?? this.#currentNavId(), ...(ngDevMode ? [{ debugName: "#standingNavId" }] : /* istanbul ignore next */ []));
6521
6611
  /**
6522
6612
  * The row the open Nav came through. A menu lists the Nav Menu Owner's
6523
6613
  * children, and the User may be standing deeper than a row — on a leaf that
@@ -6527,7 +6617,7 @@ class MRefDirective {
6527
6617
  */
6528
6618
  #currentlyActive = computed(() => {
6529
6619
  const target = this.mRef();
6530
- const current = this.#currentNavId();
6620
+ const current = this.#standingNavId();
6531
6621
  if (!target || !current)
6532
6622
  return false;
6533
6623
  if (current !== target && !current.startsWith(`${target}_`))
@@ -7691,7 +7781,7 @@ class SectionFormItemComponent extends ConfigComponent {
7691
7781
  break;
7692
7782
  }
7693
7783
  case InputType.TOGGLE: {
7694
- const { ToggleInputComponent } = await import('./magmonium-one-toggle-CkbYy8Pd.mjs');
7784
+ const { ToggleInputComponent } = await import('./magmonium-one-toggle-atjxl_R_.mjs');
7695
7785
  this.createDynamicComponent(seq, ToggleInputComponent, [], true);
7696
7786
  break;
7697
7787
  }
@@ -7703,12 +7793,12 @@ class SectionFormItemComponent extends ConfigComponent {
7703
7793
  break;
7704
7794
  }
7705
7795
  case InputType.PASSWORD: {
7706
- const { PasswordInputComponent } = await import('./magmonium-one-password-DFVMbkqp.mjs');
7796
+ const { PasswordInputComponent } = await import('./magmonium-one-password-yXiSYlMS.mjs');
7707
7797
  this.createDynamicComponent(seq, PasswordInputComponent);
7708
7798
  break;
7709
7799
  }
7710
7800
  case InputType.OTP: {
7711
- const { OtpInputComponent } = await import('./magmonium-one-otp-BdLmLccY.mjs');
7801
+ const { OtpInputComponent } = await import('./magmonium-one-otp-B-NBB6PF.mjs');
7712
7802
  this.createDynamicComponent(seq, OtpInputComponent);
7713
7803
  break;
7714
7804
  }
@@ -22446,7 +22536,7 @@ class WrapperInputComponent extends ConfigComponent {
22446
22536
  break;
22447
22537
  }
22448
22538
  case InputType.TOGGLE: {
22449
- const { ToggleInputComponent } = await import('./magmonium-one-toggle-CkbYy8Pd.mjs');
22539
+ const { ToggleInputComponent } = await import('./magmonium-one-toggle-atjxl_R_.mjs');
22450
22540
  this.createDynamicComponent(seq, ToggleInputComponent, [], true);
22451
22541
  break;
22452
22542
  }
@@ -22458,12 +22548,12 @@ class WrapperInputComponent extends ConfigComponent {
22458
22548
  break;
22459
22549
  }
22460
22550
  case InputType.PASSWORD: {
22461
- const { PasswordInputComponent } = await import('./magmonium-one-password-DFVMbkqp.mjs');
22551
+ const { PasswordInputComponent } = await import('./magmonium-one-password-yXiSYlMS.mjs');
22462
22552
  this.createDynamicComponent(seq, PasswordInputComponent);
22463
22553
  break;
22464
22554
  }
22465
22555
  case InputType.OTP: {
22466
- const { OtpInputComponent } = await import('./magmonium-one-otp-BdLmLccY.mjs');
22556
+ const { OtpInputComponent } = await import('./magmonium-one-otp-B-NBB6PF.mjs');
22467
22557
  this.createDynamicComponent(seq, OtpInputComponent);
22468
22558
  break;
22469
22559
  }
@@ -24170,7 +24260,7 @@ class FileUploadInputComponent extends BaseInputComponent {
24170
24260
  const modalStore = this.modalStore;
24171
24261
  if (!modalStore)
24172
24262
  return undefined;
24173
- const { ImageEditorComponent } = await import('./magmonium-one-image-editor-CTLKPEYj.mjs');
24263
+ const { ImageEditorComponent } = await import('./magmonium-one-image-editor-CurYe_Mb.mjs');
24174
24264
  const ratio = String(this.config()?.ratio ?? '');
24175
24265
  return new Promise((resolve) => {
24176
24266
  const modalRef = new ModalRef();
@@ -33578,6 +33668,11 @@ class NavTrailComponent {
33578
33668
  navStore = inject(NavStore);
33579
33669
  headerColor = computed(() => this.themeStore.color()?.mm ?? '#fff', ...(ngDevMode ? [{ debugName: "headerColor" }] : /* istanbul ignore next */ []));
33580
33670
  fromUrl = computed(() => !!this.navStore.id(), ...(ngDevMode ? [{ debugName: "fromUrl" }] : /* istanbul ignore next */ []));
33671
+ /**
33672
+ * Moves the panel onto the entry's Nav and leaves the Address, and the Page
33673
+ * behind the panel, where they are (CONTEXT.md Browse).
33674
+ */
33675
+ browse = (navId, params) => this.navStore.browse(navId, params);
33581
33676
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: NavTrailComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
33582
33677
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: NavTrailComponent, isStandalone: true, selector: "m-nav-trail", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null } }, host: { classAttribute: "m-nav-trail" }, ngImport: i0, template: `
33583
33678
  @if (config(); as trail) {
@@ -33585,7 +33680,14 @@ class NavTrailComponent {
33585
33680
  @for (item of trail; track item.id; let i = $index; let last = $last) {
33586
33681
  <div class="trail-item" [style.animation-delay.ms]="i * 50">
33587
33682
  @if (item.nav; as nav) {
33588
- <a [mRef]="nav" [mRefParams]="item.navParams" class="trail-link">
33683
+ <!-- Browses: the trail moves the panel, never the User. -->
33684
+ <a
33685
+ class="trail-link"
33686
+ role="button"
33687
+ tabindex="0"
33688
+ (click)="browse(nav, item.navParams)"
33689
+ (keydown.enter)="browse(nav, item.navParams)"
33690
+ >
33589
33691
  {{ item.label | translate }}
33590
33692
  </a>
33591
33693
  } @else if (item.href; as href) {
@@ -33602,7 +33704,7 @@ class NavTrailComponent {
33602
33704
  }
33603
33705
  </nav>
33604
33706
  }
33605
- `, isInline: true, styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}.m-nav-trail{display:block;flex:1;min-width:0}.nav-trail{display:flex;align-items:center;gap:.6rem;font-size:.725rem;letter-spacing:.04em;color:var(--m-text-tertiary);-webkit-user-select:none;user-select:none;font-weight:600}.trail-item{display:flex;align-items:center;gap:.6rem;animation:slide-in-trail .5s cubic-bezier(.16,1,.3,1)}.trail-link{color:inherit;text-decoration:none;padding:.25rem .6rem;border-radius:6px;transition:all .3s cubic-bezier(.16,1,.3,1);cursor:pointer;white-space:nowrap}.trail-link:hover{color:var(--m-mm);background:color-mix(in srgb,var(--m-mm) 6%,transparent);transform:translateY(-1px)}.trail-link:active{transform:scale(.96) translateY(0)}.trail-separator{display:flex;align-items:center;justify-content:center;opacity:.35;color:var(--m-text-tertiary);pointer-events:none;font-size:.625rem}.trail-separator .m-icon{--m-icon-size: .625rem;display:flex;align-items:center;justify-content:center}@keyframes slide-in-trail{0%{opacity:0;transform:translate(-10px)}to{opacity:1;transform:translate(0)}}\n"], dependencies: [{ kind: "directive", type: MRefDirective, selector: "[mRef]", inputs: ["mRef", "mRefLinkActive", "mRefToggle", "mRefParams"] }, { kind: "component", type: IconComponent, selector: "m-icon, m-one-icon", inputs: ["config", "name", "color", "size", "one", "baseUrl", "remote"], outputs: ["configChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
33707
+ `, isInline: true, styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}.m-nav-trail{display:block;flex:1;min-width:0}.nav-trail{display:flex;align-items:center;gap:.6rem;font-size:.725rem;letter-spacing:.04em;color:var(--m-text-tertiary);-webkit-user-select:none;user-select:none;font-weight:600}.trail-item{display:flex;align-items:center;gap:.6rem;animation:slide-in-trail .5s cubic-bezier(.16,1,.3,1)}.trail-link{color:inherit;text-decoration:none;padding:.25rem .6rem;border-radius:6px;transition:all .3s cubic-bezier(.16,1,.3,1);cursor:pointer;white-space:nowrap}.trail-link:hover{color:var(--m-mm);background:color-mix(in srgb,var(--m-mm) 6%,transparent);transform:translateY(-1px)}.trail-link:active{transform:scale(.96) translateY(0)}.trail-separator{display:flex;align-items:center;justify-content:center;opacity:.35;color:var(--m-text-tertiary);pointer-events:none;font-size:.625rem}.trail-separator .m-icon{--m-icon-size: .625rem;display:flex;align-items:center;justify-content:center}@keyframes slide-in-trail{0%{opacity:0;transform:translate(-10px)}to{opacity:1;transform:translate(0)}}\n"], dependencies: [{ kind: "component", type: IconComponent, selector: "m-icon, m-one-icon", inputs: ["config", "name", "color", "size", "one", "baseUrl", "remote"], outputs: ["configChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
33606
33708
  }
33607
33709
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: NavTrailComponent, decorators: [{
33608
33710
  type: Component,
@@ -33612,7 +33714,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
33612
33714
  @for (item of trail; track item.id; let i = $index; let last = $last) {
33613
33715
  <div class="trail-item" [style.animation-delay.ms]="i * 50">
33614
33716
  @if (item.nav; as nav) {
33615
- <a [mRef]="nav" [mRefParams]="item.navParams" class="trail-link">
33717
+ <!-- Browses: the trail moves the panel, never the User. -->
33718
+ <a
33719
+ class="trail-link"
33720
+ role="button"
33721
+ tabindex="0"
33722
+ (click)="browse(nav, item.navParams)"
33723
+ (keydown.enter)="browse(nav, item.navParams)"
33724
+ >
33616
33725
  {{ item.label | translate }}
33617
33726
  </a>
33618
33727
  } @else if (item.href; as href) {
@@ -33629,7 +33738,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
33629
33738
  }
33630
33739
  </nav>
33631
33740
  }
33632
- `, imports: [MRefDirective, TranslatePipe, IconComponent], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
33741
+ `, imports: [TranslatePipe, IconComponent], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
33633
33742
  class: 'm-nav-trail',
33634
33743
  }, styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}.m-nav-trail{display:block;flex:1;min-width:0}.nav-trail{display:flex;align-items:center;gap:.6rem;font-size:.725rem;letter-spacing:.04em;color:var(--m-text-tertiary);-webkit-user-select:none;user-select:none;font-weight:600}.trail-item{display:flex;align-items:center;gap:.6rem;animation:slide-in-trail .5s cubic-bezier(.16,1,.3,1)}.trail-link{color:inherit;text-decoration:none;padding:.25rem .6rem;border-radius:6px;transition:all .3s cubic-bezier(.16,1,.3,1);cursor:pointer;white-space:nowrap}.trail-link:hover{color:var(--m-mm);background:color-mix(in srgb,var(--m-mm) 6%,transparent);transform:translateY(-1px)}.trail-link:active{transform:scale(.96) translateY(0)}.trail-separator{display:flex;align-items:center;justify-content:center;opacity:.35;color:var(--m-text-tertiary);pointer-events:none;font-size:.625rem}.trail-separator .m-icon{--m-icon-size: .625rem;display:flex;align-items:center;justify-content:center}@keyframes slide-in-trail{0%{opacity:0;transform:translate(-10px)}to{opacity:1;transform:translate(0)}}\n"] }]
33635
33744
  }], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: true }] }] } });
@@ -33773,6 +33882,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
33773
33882
  */
33774
33883
  class NavMenuComponent {
33775
33884
  _settingsSearch = inject(SettingsSearchService);
33885
+ _navRef = inject(NAV_STORE_REF, { optional: true });
33776
33886
  items = input(...(ngDevMode ? [undefined, { debugName: "items" }] : /* istanbul ignore next */ []));
33777
33887
  baseUrl = input(...(ngDevMode ? [undefined, { debugName: "baseUrl" }] : /* istanbul ignore next */ []));
33778
33888
  filterBySearch = input(false, ...(ngDevMode ? [{ debugName: "filterBySearch" }] : /* istanbul ignore next */ []));
@@ -33788,6 +33898,11 @@ class NavMenuComponent {
33788
33898
  return rawList;
33789
33899
  return rawList.filter((item) => item.label?.toLowerCase().includes(q));
33790
33900
  }, ...(ngDevMode ? [{ debugName: "navList" }] : /* istanbul ignore next */ []));
33901
+ /** Looks inside the row's Nav without following it (CONTEXT.md Browse). */
33902
+ browse = (item) => {
33903
+ if (item.nav)
33904
+ this._navRef?.browse?.(item.nav, item.navParams);
33905
+ };
33791
33906
  // A List draws rows it was handed as ListItems; a NavRef reaches the row
33792
33907
  // body through `row`, which is what the template reads through `let-item`.
33793
33908
  rows = computed(() => (this.navList() ?? []).map((item, index) => ({
@@ -33815,6 +33930,17 @@ class NavMenuComponent {
33815
33930
  </span>
33816
33931
  <span class="nav-menu__label">{{ item.label | translate }}</span>
33817
33932
  </a>
33933
+ <!-- The row follows the Nav; the chevron only Browses into it. -->
33934
+ @if (item.browsable) {
33935
+ <m-button
33936
+ class="nav-menu__browse"
33937
+ icon="chevron-right"
33938
+ iconOnly
33939
+ variant="ghost"
33940
+ label="nav-browse-into"
33941
+ (clicked)="browse(item)"
33942
+ />
33943
+ }
33818
33944
  } @else if (item.href; as href) {
33819
33945
  <a [href]="href" class="nav-menu__link">
33820
33946
  <span class="nav-menu__icon">
@@ -33835,7 +33961,7 @@ class NavMenuComponent {
33835
33961
  <div class="nav-menu">
33836
33962
  <m-list variant="menu" [data]="rows()" [template]="menuTemplate" />
33837
33963
  </div>
33838
- `, isInline: true, styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}:host{display:block;width:100%}.nav-menu{padding:0;margin:0}.nav-menu ul{display:flex;flex-direction:column;gap:0;padding:0;margin:0}.nav-menu li{padding:0;list-style:none;width:100%;border-bottom:1px solid rgba(0,0,0,.02)}.nav-menu li:last-child{border-bottom:none}.nav-menu__item{display:flex;align-items:center;gap:.75rem;width:100%;position:relative;color:var(--m-text-secondary);background:transparent}.nav-menu__item:not(:has(.nav-menu__link)){padding:.625rem 1rem}.nav-menu__link{display:flex;align-items:center;gap:.75rem;padding:.625rem 1rem;border-radius:0;transition:all .15s cubic-bezier(.4,0,.2,1);cursor:pointer;width:100%;color:inherit;text-decoration:none}.nav-menu__link:hover{background:#00000008;color:var(--m-text)}.nav-menu__link:hover .nav-menu__icon{color:var(--m-text)}.nav-menu__link:hover .nav-menu__label{color:var(--m-text);font-weight:600}.nav-menu__icon{display:flex;align-items:center;justify-content:center;color:var(--m-text-tertiary);transition:color .15s ease;width:1.15rem;height:1.15rem}.nav-menu__icon .m-icon{display:flex;align-items:center}.nav-menu__label{flex:1;display:block;width:100%;font-size:.8125rem;font-weight:500;letter-spacing:.01em;color:inherit;text-decoration:none}.nav-menu__item:has(.active){background:linear-gradient(90deg,color-mix(in srgb,var(--m-mm) 6%,transparent) 0%,color-mix(in srgb,var(--m-mm) 2%,transparent) 60%,transparent 100%);color:var(--m-mm);border-radius:0}.nav-menu__item:has(.active):after{content:\"\";position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,rgba(255,255,255,.3) 0%,rgba(255,255,255,.05) 50%,transparent 100%);z-index:3}.nav-menu__item:has(.active) .nav-menu__icon{color:var(--m-mm);filter:drop-shadow(0 0 3px color-mix(in srgb,var(--m-mm) 20%,transparent))}.nav-menu__item:has(.active) .nav-menu__label{color:var(--m-mm);font-weight:700;letter-spacing:.015em}\n"], dependencies: [{ kind: "component", type: IconComponent, selector: "m-icon, m-one-icon", inputs: ["config", "name", "color", "size", "one", "baseUrl", "remote"], outputs: ["configChange"] }, { kind: "directive", type: MRefDirective, selector: "[mRef]", inputs: ["mRef", "mRefLinkActive", "mRefToggle", "mRefParams"] }, { kind: "component", type: ListComponent, selector: "m-list, m-one-list", inputs: ["data", "element", "template", "variant", "orientation", "gap", "startIcon", "items", "noTranslate"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
33964
+ `, isInline: true, styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}:host{display:block;width:100%}.nav-menu{padding:0;margin:0}.nav-menu ul{display:flex;flex-direction:column;gap:0;padding:0;margin:0}.nav-menu li{padding:0;list-style:none;width:100%;border-bottom:1px solid rgba(0,0,0,.02)}.nav-menu li:last-child{border-bottom:none}.nav-menu__item{display:flex;align-items:center;gap:.75rem;width:100%;position:relative;color:var(--m-text-secondary);background:transparent}.nav-menu__item:not(:has(.nav-menu__link)){padding:.625rem 1rem}.nav-menu__link{display:flex;align-items:center;gap:.75rem;padding:.625rem 1rem;border-radius:0;transition:all .15s cubic-bezier(.4,0,.2,1);cursor:pointer;width:100%;color:inherit;text-decoration:none}.nav-menu__link:hover{background:#00000008;color:var(--m-text)}.nav-menu__link:hover .nav-menu__icon{color:var(--m-text)}.nav-menu__link:hover .nav-menu__label{color:var(--m-text);font-weight:600}.nav-menu__browse{flex:none;margin-inline-end:.5rem;color:var(--m-text-tertiary)}.nav-menu__icon{display:flex;align-items:center;justify-content:center;color:var(--m-text-tertiary);transition:color .15s ease;width:1.15rem;height:1.15rem}.nav-menu__icon .m-icon{display:flex;align-items:center}.nav-menu__label{flex:1;display:block;width:100%;font-size:.8125rem;font-weight:500;letter-spacing:.01em;color:inherit;text-decoration:none}.nav-menu__item:has(.active){background:linear-gradient(90deg,color-mix(in srgb,var(--m-mm) 6%,transparent) 0%,color-mix(in srgb,var(--m-mm) 2%,transparent) 60%,transparent 100%);color:var(--m-mm);border-radius:0}.nav-menu__item:has(.active):after{content:\"\";position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,rgba(255,255,255,.3) 0%,rgba(255,255,255,.05) 50%,transparent 100%);z-index:3}.nav-menu__item:has(.active) .nav-menu__icon{color:var(--m-mm);filter:drop-shadow(0 0 3px color-mix(in srgb,var(--m-mm) 20%,transparent))}.nav-menu__item:has(.active) .nav-menu__label{color:var(--m-mm);font-weight:700;letter-spacing:.015em}\n"], dependencies: [{ kind: "component", type: IconComponent, selector: "m-icon, m-one-icon", inputs: ["config", "name", "color", "size", "one", "baseUrl", "remote"], outputs: ["configChange"] }, { kind: "directive", type: MRefDirective, selector: "[mRef]", inputs: ["mRef", "mRefLinkActive", "mRefToggle", "mRefParams"] }, { kind: "component", type: ListComponent, selector: "m-list, m-one-list", inputs: ["data", "element", "template", "variant", "orientation", "gap", "startIcon", "items", "noTranslate"] }, { kind: "component", type: ButtonComponent, selector: "m-button,m-one-button", inputs: ["config", "color", "labelClass", "fullWidth", "nav", "navParams", "href", "disabled", "variant", "name", "baseUrl", "one", "remote", "label", "noTranslate", "params", "noNative", "icon", "isRightIcon", "iconOnly", "stacked", "imgSrc", "nonClickable", "inverted", "isSubmit", "tabindex"], outputs: ["configChange", "clicked"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
33839
33965
  }
33840
33966
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: NavMenuComponent, decorators: [{
33841
33967
  type: Component,
@@ -33857,6 +33983,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
33857
33983
  </span>
33858
33984
  <span class="nav-menu__label">{{ item.label | translate }}</span>
33859
33985
  </a>
33986
+ <!-- The row follows the Nav; the chevron only Browses into it. -->
33987
+ @if (item.browsable) {
33988
+ <m-button
33989
+ class="nav-menu__browse"
33990
+ icon="chevron-right"
33991
+ iconOnly
33992
+ variant="ghost"
33993
+ label="nav-browse-into"
33994
+ (clicked)="browse(item)"
33995
+ />
33996
+ }
33860
33997
  } @else if (item.href; as href) {
33861
33998
  <a [href]="href" class="nav-menu__link">
33862
33999
  <span class="nav-menu__icon">
@@ -33877,7 +34014,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
33877
34014
  <div class="nav-menu">
33878
34015
  <m-list variant="menu" [data]="rows()" [template]="menuTemplate" />
33879
34016
  </div>
33880
- `, changeDetection: ChangeDetectionStrategy.OnPush, imports: [IconComponent, MRefDirective, TranslatePipe, ListComponent], styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}:host{display:block;width:100%}.nav-menu{padding:0;margin:0}.nav-menu ul{display:flex;flex-direction:column;gap:0;padding:0;margin:0}.nav-menu li{padding:0;list-style:none;width:100%;border-bottom:1px solid rgba(0,0,0,.02)}.nav-menu li:last-child{border-bottom:none}.nav-menu__item{display:flex;align-items:center;gap:.75rem;width:100%;position:relative;color:var(--m-text-secondary);background:transparent}.nav-menu__item:not(:has(.nav-menu__link)){padding:.625rem 1rem}.nav-menu__link{display:flex;align-items:center;gap:.75rem;padding:.625rem 1rem;border-radius:0;transition:all .15s cubic-bezier(.4,0,.2,1);cursor:pointer;width:100%;color:inherit;text-decoration:none}.nav-menu__link:hover{background:#00000008;color:var(--m-text)}.nav-menu__link:hover .nav-menu__icon{color:var(--m-text)}.nav-menu__link:hover .nav-menu__label{color:var(--m-text);font-weight:600}.nav-menu__icon{display:flex;align-items:center;justify-content:center;color:var(--m-text-tertiary);transition:color .15s ease;width:1.15rem;height:1.15rem}.nav-menu__icon .m-icon{display:flex;align-items:center}.nav-menu__label{flex:1;display:block;width:100%;font-size:.8125rem;font-weight:500;letter-spacing:.01em;color:inherit;text-decoration:none}.nav-menu__item:has(.active){background:linear-gradient(90deg,color-mix(in srgb,var(--m-mm) 6%,transparent) 0%,color-mix(in srgb,var(--m-mm) 2%,transparent) 60%,transparent 100%);color:var(--m-mm);border-radius:0}.nav-menu__item:has(.active):after{content:\"\";position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,rgba(255,255,255,.3) 0%,rgba(255,255,255,.05) 50%,transparent 100%);z-index:3}.nav-menu__item:has(.active) .nav-menu__icon{color:var(--m-mm);filter:drop-shadow(0 0 3px color-mix(in srgb,var(--m-mm) 20%,transparent))}.nav-menu__item:has(.active) .nav-menu__label{color:var(--m-mm);font-weight:700;letter-spacing:.015em}\n"] }]
34017
+ `, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
34018
+ IconComponent,
34019
+ MRefDirective,
34020
+ TranslatePipe,
34021
+ ListComponent,
34022
+ ButtonComponent,
34023
+ ], styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}:host{display:block;width:100%}.nav-menu{padding:0;margin:0}.nav-menu ul{display:flex;flex-direction:column;gap:0;padding:0;margin:0}.nav-menu li{padding:0;list-style:none;width:100%;border-bottom:1px solid rgba(0,0,0,.02)}.nav-menu li:last-child{border-bottom:none}.nav-menu__item{display:flex;align-items:center;gap:.75rem;width:100%;position:relative;color:var(--m-text-secondary);background:transparent}.nav-menu__item:not(:has(.nav-menu__link)){padding:.625rem 1rem}.nav-menu__link{display:flex;align-items:center;gap:.75rem;padding:.625rem 1rem;border-radius:0;transition:all .15s cubic-bezier(.4,0,.2,1);cursor:pointer;width:100%;color:inherit;text-decoration:none}.nav-menu__link:hover{background:#00000008;color:var(--m-text)}.nav-menu__link:hover .nav-menu__icon{color:var(--m-text)}.nav-menu__link:hover .nav-menu__label{color:var(--m-text);font-weight:600}.nav-menu__browse{flex:none;margin-inline-end:.5rem;color:var(--m-text-tertiary)}.nav-menu__icon{display:flex;align-items:center;justify-content:center;color:var(--m-text-tertiary);transition:color .15s ease;width:1.15rem;height:1.15rem}.nav-menu__icon .m-icon{display:flex;align-items:center}.nav-menu__label{flex:1;display:block;width:100%;font-size:.8125rem;font-weight:500;letter-spacing:.01em;color:inherit;text-decoration:none}.nav-menu__item:has(.active){background:linear-gradient(90deg,color-mix(in srgb,var(--m-mm) 6%,transparent) 0%,color-mix(in srgb,var(--m-mm) 2%,transparent) 60%,transparent 100%);color:var(--m-mm);border-radius:0}.nav-menu__item:has(.active):after{content:\"\";position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,rgba(255,255,255,.3) 0%,rgba(255,255,255,.05) 50%,transparent 100%);z-index:3}.nav-menu__item:has(.active) .nav-menu__icon{color:var(--m-mm);filter:drop-shadow(0 0 3px color-mix(in srgb,var(--m-mm) 20%,transparent))}.nav-menu__item:has(.active) .nav-menu__label{color:var(--m-mm);font-weight:700;letter-spacing:.015em}\n"] }]
33881
34024
  }], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], baseUrl: [{ type: i0.Input, args: [{ isSignal: true, alias: "baseUrl", required: false }] }], filterBySearch: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterBySearch", required: false }] }] } });
33882
34025
 
33883
34026
  class SettingsSearchBarComponent {
@@ -39513,4 +39656,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
39513
39656
  */
39514
39657
 
39515
39658
  export { ClipboardService as $, ACCESS_DOMAINS as A, ButtonComponent as B, Assets as C, AuthActivityPageComponent as D, AuthApiService as E, AuthStore as F, AutosizeDirective as G, HeaderComponent$1 as H, InputType as I, BadgeComponent as J, BandingComponent as K, LabelComponent as L, MODAL_REF as M, BaseArrayInputComponent as N, BaseRootWebComponent as O, BaseWebComponent as P, ButtonGroupComponent as Q, RangeInputComponent as R, COMPONENT_INPUT_REGISTRY as S, TranslatePipe as T, CardComponent as U, CardWrapperComponent as V, CarouselComponent as W, ChartComponent as X, ChatBubbleComponent as Y, CheckboxInputComponent as Z, ClearableInputComponent as _, MIN_ZOOM as a, ImgComponent as a$, ColComponent as a0, ColorPickerInputComponent as a1, CommentItemComponent as a2, CommentsApiService as a3, CommentsComponent as a4, CommentsStore as a5, CompactNumberPipe as a6, ComponentInputComponent as a7, ComponentStepperComponent as a8, ConfigComponent as a9, Domain as aA, DotGridComponent as aB, DragListDirective as aC, DragListItemDirective as aD, DraggableDirective as aE, DropdownInputComponent as aF, FILTER_GROUP_CONTEXT as aG, FILTER_RANGE_MODES as aH, FILTER_VARIANTS as aI, FLEX_VARIANTS as aJ, FOLDER_PICK_LISTENER as aK, FORM_ASSET_FOLDER as aL, FileService as aM, FileUploadDirective as aN, FileUploadInputComponent as aO, FlexComponent as aP, FlexItemComponent as aQ, FormGroupComponent as aR, FrameComponent as aS, FreezeService as aT, GRID_BREAKPOINTS as aU, GetNavService as aV, HighlightDirective as aW, HttpService as aX, ICON_SOURCE as aY, IS_SIDE_PANEL as aZ, IconComponent as a_, ConfirmComponent as aa, ContextMenuComponent as ab, CustomIconClass as ac, CustomIconEditComponent as ad, DEFAULT_DENIAL as ae, DEFAULT_DOC_DENSITY as af, DEFAULT_DOC_VARIANT as ag, DEFAULT_FILTER_RANGE_MODE as ah, DEFAULT_FILTER_VARIANT as ai, DEFAULT_NAV_PARAM as aj, DEFAULT_NAV_SEGMENT as ak, DEFAULT_SIZE as al, DOCK_MIN_PAGE_REMAINDER as am, DOCS_FOLDER as an, DOC_ACTION_ICONS as ao, DOC_DENSITIES as ap, DOC_EDIT_ACTIONS as aq, DOC_TOOLBAR_GROUPS as ar, DOC_VARIANTS as as, DashboardCardComponent as at, DateInputComponent as au, DatePickerComponent as av, DeviceService as aw, DocComponent as ax, DocEditorComponent as ay, DomService as az, MAX_ZOOM as b, PercentagePipe as b$, InstrumentScoreComponent as b0, InterceptorObservables as b1, JumbotronComponent as b2, KeyValueComponent as b3, LAYOUT_ASSET_FOLDER as b4, LOGIN_COMPONENT as b5, LOGIN_STORE as b6, LanguageComponent as b7, ListComponent as b8, LogoComponent as b9, NavDetailsComponent as bA, NavHeaderComponent as bB, NavMenuComponent as bC, NavStore as bD, NavTrailComponent as bE, NothingComponent as bF, NotificationElementComponent as bG, NotificationGroupComponent as bH, NotificationPopupComponent as bI, NotificationService as bJ, NotificationStore as bK, NotificationType as bL, NotificationWidgetComponent as bM, ONE_ASSET_BASE_URL as bN, OPTIONS_SOURCE as bO, OVERLAY_WIDGETS as bP, OneApp as bQ, OptionsSourceDirective as bR, OverlayBodyComponent as bS, OverlayRef as bT, OverlayService as bU, PLATFORM_BUTTON_NAV_IDS as bV, PLATFORM_EXTENSIBLE_NAV_IDS as bW, PLATFORM_NAV_MAP as bX, PLATFORM_ROOT_CHILDREN as bY, PaginationComponent as bZ, PanelComponent as b_, MAG_SOCKET_EVENT as ba, MHeroColorDirective as bb, MHeroComponent as bc, MODAL_STORE_REF as bd, MOUNT_STATIC_SEGMENT as be, MOUNT_TOKEN as bf, MRefDirective as bg, MStepComponent as bh, MURL_PARAM as bi, MURL_SEP as bj, ManifestEnrichmentService as bk, MenuComponent as bl, ModalDirective as bm, ModalRef as bn, ModalStore as bo, MoneyPipe as bp, MultiRangeInputComponent as bq, MurlUrlSerializer as br, NAV_DEFAULT_MURL as bs, NAV_ID_SEP as bt, NAV_MAIN_BUTTONS as bu, NAV_SEGMENT_RE as bv, NAV_STORE_REF as bw, NAV_WC_COMPONENTS as bx, NAV_WIDGET_MAP as by, NavComponent as bz, cropRect as c, SocketStore as c$, PlaygroundComponent as c0, PositionDirective as c1, PwaInstallComponent as c2, REMOTE_PAGE_RELOAD as c3, ROOT_NAV$1 as c4, RadioGroupComponent as c5, RadioInputComponent as c6, RatingInputComponent as c7, ReactiveElementComponent as c8, RemoteComponent as c9, SectionFilterGroupComponent as cA, SectionFilterMenuComponent as cB, SectionFilterPanelComponent as cC, SectionFilterRangePanelComponent as cD, SectionFooterComponent as cE, SectionFormComponent as cF, SectionFormItemComponent as cG, SectionHeaderComponent as cH, SectionHeroComponent as cI, SectionPaginationComponent as cJ, SectionSearchComponent as cK, SectionStepperComponent as cL, SectionTableCellComponent as cM, SectionTableComponent as cN, SectionTableRowComponent as cO, SectionTableSortPipe as cP, SectionTabsComponent as cQ, SectionToggleComponent as cR, SectionToggleItemDirective as cS, SelectableCardInputComponent as cT, SelectorDirective as cU, SettingsSearchBarComponent as cV, SettingsSearchService as cW, ShapeComponent as cX, SharedStoreRegistry as cY, SidePanelDirective as cZ, Size as c_, RemoteLoaderService as ca, ResizeElementComponent as cb, RouteContainer as cc, RowComponent as cd, SEARCH_QUERY as ce, SEARCH_RESULTS_EVENT as cf, SECTION_ACCORDION_GROUP as cg, SECTION_FORM_CONTEXT as ch, SECTION_TABLE_VARIANTS as ci, SHARED_ICONS as cj, SIZE_CONTEXT as ck, ScoreComponent as cl, ScrollComponent as cm, ScrollService as cn, SearchPanelComponent as co, SearchStore as cp, SearchUserPanelComponent as cq, SectionAccordionDirective as cr, SectionAccordionGroupDirective as cs, SectionBackComponent as ct, SectionBadgesComponent as cu, SectionButtonGroupComponent as cv, SectionCardComponent as cw, SectionCarouselComponent as cx, SectionComponent as cy, SectionFilterComponent as cz, drawFramed as d, childNavId as d$, SortComponent as d0, StatComponent as d1, StepComponent as d2, StepperComponent as d3, StepsComponent as d4, StorageService as d5, StrokeLinecap as d6, StrokeLinejoin as d7, SummaryComponent as d8, SvgGeneratorComponent as d9, UserApiService as dA, UserAvatarComponent as dB, UserComponent as dC, UserNavComponent as dD, UserSettingsComponent as dE, UserStore as dF, WC_BUNDLE as dG, WC_NAVIGATE_EVENT as dH, WC_ROUTE_CHANGED_EVENT as dI, WC_SEARCH_GROUPS as dJ, WIN_USER_TAB_HOOK as dK, WIN_USER_TAB_KEY as dL, WatermarkComponent as dM, WcRouterStore as dN, WrapperInputComponent as dO, anchorNavId as dP, applyColorsToElement as dQ, applyDocEdit as dR, assetOptions as dS, bootstrapMagApp as dT, bootstrapPwaInstall as dU, buildWcBaseUrl as dV, calculateLuminance as dW, calculateRanks as dX, cellText as dY, checkDoc as dZ, checkFilterCondition as d_, SvgGeneratorService as da, SvgService as db, TOTAL_COLUMNS as dc, TRANSLATION_SOURCE as dd, TableComponent as de, TechnicalMeterComponent as df, TextInputComponent as dg, TextareaInputComponent as dh, ThemeComponent as di, ThemeDataService as dj, ThemeService as dk, ThemeStore as dl, TimeAgoPipe as dm, TimelineComponent as dn, ToggleButtonComponent as dp, ToggleInputComponent as dq, ToggleRadioInputComponent as dr, ToolTipDirective as ds, TooltipComponent as dt, TranslateService as du, TreeGridComponent as dv, URL_SEP as dw, USER_STORE_REF as dx, USER_TAB_MAP as dy, UniverseComponent as dz, encodeFramed as e, isExtensiblePlatformNavId as e$, claimDenial as e0, classListSignal as e1, coerceSize as e2, cornerEdge as e3, cornerSide as e4, createMap as e5, createPlatformNavMap as e6, definedWcTierOf as e7, deriveAvatarGradient as e8, deriveContrastColor as e9, flattenTreeGridRows as eA, formatBadgeCount as eB, fullName as eC, generateClipPath as eD, generateTransform as eE, getClassList as eF, getProperty as eG, getScrollParent as eH, getTierFromPreviewPath as eI, getTreeGridRow as eJ, getUniqueId as eK, getValue as eL, hasErrorComputed as eM, hexToRgb as eN, hslToRgb$1 as eO, initMagmoniumApp as eP, initialNotificationState as eQ, initialState$2 as eR, initials as eS, injectAuthenticate as eT, injectDefaultDenial as eU, injectInstallApp as eV, injectParentSize as eW, injectScrollSticky as eX, isBootRedirect as eY, isButtonName as eZ, isCancelledComputed as e_, deriveOppositeColor as ea, derivePropertyName as eb, docActionKey as ec, docAssetCandidates as ed, docProblemKey as ee, docRemotePath as ef, emailValidation as eg, evaluate as eh, evaluateBool as ei, fieldBoolean as ej, fieldNumber as ek, fieldString as el, filterHoldsList as em, filterHoldsOneBound as en, filterHoldsOptions as eo, filterHoldsRange as ep, filterList as eq, filterNumber as er, filterNumberList as es, filterOne as et, filterPanelOf as eu, filterPanelWidth as ev, filterRange as ew, filterTreeGridRows as ex, filterValueList as ey, filterValues as ez, clampFraming as f, provideModalComponents as f$, isJson as f0, isLoadingComputed as f1, isLocalhost as f2, isNavInstanceConfig as f3, isNavMenuConfig as f4, isNavRowsConfig as f5, isNavVisibilityConfig as f6, isPlatformNavId as f7, isSize as f8, isTierPreview as f9, navIdChain as fA, navIdFor as fB, navIdSegment as fC, navIdToRoutePath as fD, navIdToSegments as fE, navParamOf as fF, navTailMatcher as fG, navToId as fH, navVisibilityGuard as fI, nextSectionTableSort as fJ, normalizeAssetOptions as fK, offsetOfLine as fL, parentNavId as fM, parseAddress as fN, parseColor as fO, parseMountPattern as fP, parsePatternNames as fQ, patternValidation as fR, patternsValidation as fS, permissionRefusal as fT, platformNavWidgets as fU, privateGuard as fV, processImageToSvg as fW, provideAppContext as fX, provideMagAppConfig as fY, provideMagWcConfig as fZ, provideMagWcRoutes as f_, isUrlLocalhost as fa, isValidNavId as fb, isValidNavSegment as fc, isWebComponent as fd, linkToId as fe, linkToNav as ff, loadingActions as fg, mInterceptor as fh, manualValidation as fi, matchFieldValidation as fj, matchMount as fk, maxLengthValidation as fl, maxValidation as fm, mergePlatformNav as fn, mergeUnique as fo, mergeUniqueBy as fp, mergeUniqueWith as fq, minAgeValidation as fr, minLengthValidation as fs, minValidation as ft, miniMarkToHtml as fu, mountFor as fv, mountPatternProblem as fw, mountPatternText as fx, mountSegmentOf as fy, mountTokenOf as fz, BaseInputComponent as g, provideMurlUrlSerializer as g0, provideNavWidgets as g1, provideOverlayWidgets as g2, providePlatformNavWidgets as g3, provideSearch as g4, provideSizeContext as g5, provideUserTabs as g6, publicGuard as g7, readFieldPatterns as g8, recordDefinedWcTier as g9, toAttrBool as gA, toAttrNumber as gB, toCssLength as gC, toHostNavId as gD, toLength$1 as gE, toLocalNavId as gF, toggleTreeGridRow as gG, unfetchedPlatformNav as gH, ungroupedDocActions as gI, urlValidation as gJ, wcTierOf as gK, remoteOutletRoute as ga, renderAddress as gb, renderDocument as gc, requiredValidation as gd, resolveConfigAsset as ge, resolveIconSize as gf, resolvePallet as gg, resolvePatternRules as gh, resolveSize as gi, rgbToHex as gj, rgbToHsl as gk, rowHasChildren as gl, samePatterns as gm, sectionTableColumnId as gn, sectionTableColumnWidths as go, sectionTableFrozenCount as gp, segmentsToNavId as gq, setProperty as gr, setTreeGridChildren as gs, setWcTier as gt, settingsWidgets as gu, shouldShowBadge as gv, sortSectionTableRows as gw, splitNavId as gx, splitOnMatch as gy, stringToColor as gz, BaseTextInputComponent as h, initialFraming as i, TextOutputComponent as j, IS_DESIGN_MODE as k, APP_CONTEXT_REF as l, ASSET_BASE_URL as m, AccordionBodyDirective as n, outputSize as o, parseRatio as p, AccordionComponent as q, renameForType as r, AccordionGroupComponent as s, ActionComponent as t, AnimatedGraphsComponent as u, AppCardComponent as v, AppRelationType as w, AppTileComponent as x, AssetStore as y, AssetUrlPipe as z };
39516
- //# sourceMappingURL=magmonium-one-magmonium-one-BgAGVxz7.mjs.map
39659
+ //# sourceMappingURL=magmonium-one-magmonium-one-Dr2fBHOB.mjs.map