@magmonium/one 0.2.43 → 0.2.46

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.
@@ -3422,6 +3422,9 @@ function isNavMenuConfig(entry) {
3422
3422
  function isNavRowsConfig(entry) {
3423
3423
  return typeof entry === 'object' && 'navRows' in entry;
3424
3424
  }
3425
+ function isNavInstanceConfig(entry) {
3426
+ return typeof entry === 'object' && 'navInstance' in entry;
3427
+ }
3425
3428
  /**
3426
3429
  * Multi-provided, and resolved **last-wins**: the library provides its own
3427
3430
  * Platform Nav panels first so an app registering at the same NavId replaces
@@ -3649,15 +3652,18 @@ const emptyResult = () => ({
3649
3652
  * chooses a link kind (ADR 0014).
3650
3653
  */
3651
3654
  const toTrailItem = (navId, navMap, anchor,
3652
- /** A dynamic node standing on an instance reads that row's own label. */
3653
- label,
3655
+ /**
3656
+ * A dynamic node standing on an instance reads that instance's own label and
3657
+ * icon — resolved by a NavInstanceSource, or matched off the rows.
3658
+ */
3659
+ resolved,
3654
3660
  /** ...and carries that instance, so following the entry keeps it. */
3655
3661
  navParams) => {
3656
3662
  const nav = navMap[navId];
3657
3663
  return {
3658
3664
  id: navId,
3659
- label: label ?? nav?.title ?? navIdSegment(navId),
3660
- icon: nav?.icon,
3665
+ label: resolved?.label ?? nav?.title ?? navIdSegment(navId),
3666
+ icon: resolved?.icon ?? nav?.icon,
3661
3667
  nav: navId,
3662
3668
  ...(navParams ? { navParams } : {}),
3663
3669
  address: renderAddress(navId, navMap, anchor, navParams),
@@ -3669,8 +3675,12 @@ navParams) => {
3669
3675
  * rides alongside as the param this Nav declared, which is what `renderAddress`
3670
3676
  * fills. `id` carries the value only so the list has stable keys.
3671
3677
  */
3672
- const navRowTrailItem = (navId, nav, row, navMap, anchor) => {
3673
- const navParams = { [navParamOf(nav)]: row.value };
3678
+ const navRowTrailItem = (navId, nav, row, navMap, anchor,
3679
+ /** The instances the dynamic Navs *above* this one are standing on — a
3680
+ * dynamic Nav filed under another routes behind both params, and a row that
3681
+ * carried only its own left the one above it unfilled. */
3682
+ inherited) => {
3683
+ const navParams = { ...inherited, [navParamOf(nav)]: row.value };
3674
3684
  return {
3675
3685
  id: `${navId}${NAV_ID_SEP}${row.value}`,
3676
3686
  label: row.label,
@@ -3683,6 +3693,30 @@ const navRowTrailItem = (navId, nav, row, navMap, anchor) => {
3683
3693
  address: renderAddress(navId, navMap, anchor, navParams),
3684
3694
  };
3685
3695
  };
3696
+ /**
3697
+ * Every dynamic Nav on the way to `navId`, paired with the instance the Router
3698
+ * is standing on. A `static` Nav filed *under* a dynamic one is a real place —
3699
+ * `book/:isbn/reviews` — but its Address cannot be rendered from identity
3700
+ * alone: the segment above it is data, so the row would link at `:isbn`
3701
+ * unfilled and match no route. Read off the Router rather than the resolved
3702
+ * rows, the same reason `rowParams` is: the value is known before any source
3703
+ * has answered (CONTEXT.md NavPresentation).
3704
+ */
3705
+ const navParamsFor = (navId, navMap, routeParams) => {
3706
+ if (!routeParams)
3707
+ return undefined;
3708
+ const params = {};
3709
+ for (const id of navIdChain(navId)) {
3710
+ const nav = navMap[id];
3711
+ if (nav?.presentation !== 'dynamic')
3712
+ continue;
3713
+ const param = navParamOf(nav);
3714
+ const value = routeParams[param];
3715
+ if (value !== undefined)
3716
+ params[param] = value;
3717
+ }
3718
+ return Object.keys(params).length ? params : undefined;
3719
+ };
3686
3720
  /** A Nav that *is* its parent's own content rather than a place beside it. */
3687
3721
  const isDefaultNav = (navId) => navIdSegment(navId) === DEFAULT_NAV_SEGMENT;
3688
3722
  /**
@@ -3736,12 +3770,19 @@ const drawsRows = (childId, dynamicRows) => {
3736
3770
  const resolved = dynamicRows[childId];
3737
3771
  return !!resolved && (resolved.rows.length > 0 || !!resolved.loading);
3738
3772
  };
3739
- const menuChildIds = (navId, navMap, dynamicRows = {}) => childIdsOf(navId, navMap).flatMap((childId) => {
3773
+ const menuChildIds = (navId, navMap, dynamicRows = {}, instances = {}) => childIdsOf(navId, navMap).flatMap((childId) => {
3740
3774
  if (isDefaultNav(childId))
3741
- return menuChildIds(childId, navMap, dynamicRows);
3742
- if (navMap[childId]?.presentation === 'dynamic' &&
3743
- drawsRows(childId, dynamicRows)) {
3744
- return [childId];
3775
+ return menuChildIds(childId, navMap, dynamicRows, instances);
3776
+ if (navMap[childId]?.presentation === 'dynamic') {
3777
+ if (drawsRows(childId, dynamicRows))
3778
+ return [childId];
3779
+ // A NavInstanceSource and no rows is the fourth state (ADR 0030): the
3780
+ // node is resolved *while standing on it* and is not a place to be sent
3781
+ // to, because its own row could only link at `:<param>` unfilled — a
3782
+ // link that matches no route, which is the panel that looks correct and
3783
+ // is not.
3784
+ if (childId in instances)
3785
+ return [];
3745
3786
  }
3746
3787
  return navMap[childId]?.title ? [childId] : [];
3747
3788
  });
@@ -3752,9 +3793,10 @@ const menuChildIds = (navId, navMap, dynamicRows = {}) => childIdsOf(navId, navM
3752
3793
  * list the User moved through and the row they are on is the one marked
3753
3794
  * active. Root is the floor: its own children are the last list there is.
3754
3795
  */
3755
- const navMenuOwnerId = (navId, navMap, hasOwnContent = false, dynamicRows = {}) => {
3796
+ const navMenuOwnerId = (navId, navMap, hasOwnContent = false, dynamicRows = {}, instances = {}) => {
3756
3797
  const visible = visibleNavId(navId);
3757
- if (visible === ROOT_NAV$1 || menuChildIds(visible, navMap, dynamicRows).length) {
3798
+ if (visible === ROOT_NAV$1 ||
3799
+ menuChildIds(visible, navMap, dynamicRows, instances).length) {
3758
3800
  return visible;
3759
3801
  }
3760
3802
  // A panel that answers with a widget of its own keeps its own title —
@@ -3769,7 +3811,7 @@ const navMenuOwnerId = (navId, navMap, hasOwnContent = false, dynamicRows = {})
3769
3811
  // than the one we are on — a mistitled empty panel is worse than a titled one.
3770
3812
  for (let ancestor = parentNavId(visible); ancestor; ancestor = parentNavId(ancestor)) {
3771
3813
  const owner = visibleNavId(ancestor);
3772
- if (menuChildIds(owner, navMap, dynamicRows).length)
3814
+ if (menuChildIds(owner, navMap, dynamicRows, instances).length)
3773
3815
  return owner;
3774
3816
  if (owner === ROOT_NAV$1)
3775
3817
  break;
@@ -3789,13 +3831,19 @@ const navMenuOwnerId = (navId, navMap, hasOwnContent = false, dynamicRows = {})
3789
3831
  * falling through to the static siblings around it would show a panel that
3790
3832
  * looks correct and is not.
3791
3833
  */
3792
- const buildNavMenus = (navId, navMap, anchor, dynamicRows = {}) => menuChildIds(navId, navMap, dynamicRows).flatMap((childId) => {
3834
+ const buildNavMenus = (navId, navMap, anchor, dynamicRows = {}, routeParams, instances = {}) => menuChildIds(navId, navMap, dynamicRows, instances).flatMap((childId) => {
3793
3835
  const nav = navMap[childId];
3794
3836
  const resolved = nav && dynamicRows[childId];
3837
+ // The instances above this row, whether it is a row of its own or one of
3838
+ // the rows a source resolved: a panel drawn beneath a dynamic Nav is a
3839
+ // panel every entry in it routes behind.
3840
+ const inherited = navParamsFor(parentNavId(childId) ?? childId, navMap, routeParams);
3795
3841
  if (!nav || nav.presentation !== 'dynamic' || !resolved) {
3796
- return [toTrailItem(childId, navMap, anchor)];
3842
+ return [
3843
+ toTrailItem(childId, navMap, anchor, undefined, navParamsFor(childId, navMap, routeParams)),
3844
+ ];
3797
3845
  }
3798
- return resolved.rows.map((row) => navRowTrailItem(childId, nav, row, navMap, anchor));
3846
+ return resolved.rows.map((row) => navRowTrailItem(childId, nav, row, navMap, anchor, inherited));
3799
3847
  });
3800
3848
  /**
3801
3849
  * Merges a widget's emitted trail over the derived one, matching by depth.
@@ -3811,43 +3859,56 @@ const mergeTrail = (derived, override, derivedHeader) => {
3811
3859
  return { trail, header: override.header ?? derivedHeader };
3812
3860
  };
3813
3861
  function deriveBreadcrumb(params) {
3814
- const { navId, navMap, anchor, breadcrumb, navMenu, hasOwnContent, dynamicRows, routeParams, } = params;
3862
+ const { navId, navMap, anchor, breadcrumb, navMenu, hasOwnContent, dynamicRows, routeParams, instances, } = params;
3815
3863
  if (!navId)
3816
3864
  return emptyResult();
3817
3865
  /**
3818
- * The label a dynamic node wears while the User stands on one of its rows.
3819
- * Falls back to the node's own title when nothing matches — a deep link that
3820
- * arrived before the rows did, or a row that has since gone — because a raw
3821
- * segment is a worse answer than the node's name but a better one than a
3822
- * blank.
3866
+ * The instance a dynamic node wears while the User stands on one, and the
3867
+ * two ways it is answered.
3868
+ *
3869
+ * A **NavInstanceSource wins outright** where one is registered the key is
3870
+ * present in `instances` whether or not it resolved (ADR 0030). Letting a
3871
+ * row match win when the instance happened to be in the loaded page of rows
3872
+ * would label one node by two mechanisms depending on what the menu had
3873
+ * fetched, which is the panel that looks correct and is not.
3874
+ *
3875
+ * Unresolved under a source is the **raw parameter value**: an id names the
3876
+ * right thing badly, where the node's title (`app`) names the wrong thing
3877
+ * well, and the second is the answer a User cannot tell from a bug.
3878
+ *
3879
+ * With no source at all this is the row match it has always been, falling
3880
+ * through to the node's own title — a deep link that arrived before the rows
3881
+ * did, or a row since gone.
3823
3882
  */
3824
- const rowLabel = (id) => {
3883
+ const instanceOf = (id) => {
3825
3884
  const nav = navMap[id];
3826
3885
  if (nav?.presentation !== 'dynamic')
3827
3886
  return undefined;
3828
3887
  const value = routeParams?.[navParamOf(nav)];
3829
3888
  if (!value)
3830
3889
  return undefined;
3831
- return dynamicRows?.[id]?.rows.find((row) => row.value === value)?.label;
3890
+ if (instances && id in instances) {
3891
+ const resolved = instances[id];
3892
+ return resolved
3893
+ ? { label: resolved.label, icon: resolved.icon }
3894
+ : { label: value };
3895
+ }
3896
+ const row = dynamicRows?.[id]?.rows.find((r) => r.value === value);
3897
+ return row ? { label: row.label, icon: row.icon } : undefined;
3832
3898
  };
3833
3899
  /**
3834
- * The instance a dynamic node in the trail is standing on. Read off the
3835
- * Router rather than the rows: the entry has to keep pointing at the page the
3836
- * User is on even before a source has answered, and a NavRef with no param
3837
- * renders `:id` unfilled.
3900
+ * The instances an entry routes behind its own when it is a dynamic node,
3901
+ * and every dynamic ancestor's besides, so a `static` Nav filed under one
3902
+ * keeps the segment above it filled. Read off the Router rather than the
3903
+ * rows: the entry has to keep pointing at the page the User is on even
3904
+ * before a source has answered, and a NavRef with no param renders `:id`
3905
+ * unfilled.
3838
3906
  */
3839
- const rowParams = (id) => {
3840
- const nav = navMap[id];
3841
- if (nav?.presentation !== 'dynamic')
3842
- return undefined;
3843
- const param = navParamOf(nav);
3844
- const value = routeParams?.[param];
3845
- return value ? { [param]: value } : undefined;
3846
- };
3907
+ const rowParams = (id) => navParamsFor(id, navMap, routeParams);
3847
3908
  // The header and the trail belong to whichever Nav owns the menu below them:
3848
3909
  // on a leaf that is the parent, so the User reads the list they are in with
3849
3910
  // their own row marked, rather than a title over an empty panel.
3850
- const ownerId = navMenuOwnerId(navId, navMap, hasOwnContent, dynamicRows);
3911
+ const ownerId = navMenuOwnerId(navId, navMap, hasOwnContent, dynamicRows, instances);
3851
3912
  // An emitted breadcrumb names the panel it was emitted for. Once the panel
3852
3913
  // has been handed up to an ancestor it is no longer that panel, so the
3853
3914
  // override would title the ancestor's list after the leaf we left.
@@ -3856,15 +3917,16 @@ function deriveBreadcrumb(params) {
3856
3917
  const derivedTrail = chain
3857
3918
  .slice(0, -1)
3858
3919
  .filter((id) => !isDefaultNav(id))
3859
- .map((id) => toTrailItem(id, navMap, anchor, rowLabel(id), rowParams(id)));
3920
+ .map((id) => toTrailItem(id, navMap, anchor, instanceOf(id), rowParams(id)));
3860
3921
  const nav = navMap[ownerId];
3861
3922
  const ownerParams = rowParams(ownerId);
3923
+ const ownerInstance = instanceOf(ownerId);
3862
3924
  const derivedHeader = {
3863
3925
  id: ownerId,
3864
- label: rowLabel(ownerId) ??
3926
+ label: ownerInstance?.label ??
3865
3927
  nav?.title ??
3866
3928
  (ownerId === ROOT_NAV$1 ? '' : navIdSegment(ownerId)),
3867
- icon: nav?.icon,
3929
+ icon: ownerInstance?.icon ?? nav?.icon,
3868
3930
  nav: ownerId,
3869
3931
  ...(ownerParams ? { navParams: ownerParams } : {}),
3870
3932
  address: renderAddress(ownerId, navMap, anchor, ownerParams),
@@ -3876,7 +3938,7 @@ function deriveBreadcrumb(params) {
3876
3938
  breadcrumb: { trail, header },
3877
3939
  navMenus: navMenu?.length && ownPanel
3878
3940
  ? navMenu
3879
- : buildNavMenus(ownerId, navMap, anchor, dynamicRows),
3941
+ : buildNavMenus(ownerId, navMap, anchor, dynamicRows, routeParams, instances),
3880
3942
  };
3881
3943
  }
3882
3944
 
@@ -3980,6 +4042,7 @@ const initialState$3 = {
3980
4042
  appLink: undefined,
3981
4043
  appNavId: undefined,
3982
4044
  navOpenedByUser: false,
4045
+ menuNavId: undefined,
3983
4046
  keepPanelOnPathChange: false,
3984
4047
  panelPushed: false,
3985
4048
  navScrolledDown: false,
@@ -4034,7 +4097,7 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
4034
4097
  * chrome opened onto the page's own menu instead of onto itself.
4035
4098
  */
4036
4099
  const anchorRouteNavId = computed(() => visibleNavId(store.routeNavId() ?? ROOT_NAV$1), ...(ngDevMode ? [{ debugName: "anchorRouteNavId" }] : /* istanbul ignore next */ []));
4037
- const id = computed(() => navIdFor(anchorRouteNavId(), store.murl()), ...(ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []));
4100
+ const id = computed(() => store.menuNavId() ?? navIdFor(anchorRouteNavId(), store.murl()), ...(ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []));
4038
4101
  /**
4039
4102
  * The keys a panel is looked up under, nearest first: the anchored one, and
4040
4103
  * — while a Murl is open — the root-anchored one behind it. A Murl is a
@@ -4126,6 +4189,55 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
4126
4189
  }
4127
4190
  return out;
4128
4191
  }, ...(ngDevMode ? [{ debugName: "dynamicRows" }] : /* istanbul ignore next */ []));
4192
+ /**
4193
+ * Every `dynamic` Nav with a NavInstanceSource behind it, resolved against
4194
+ * the parameters the Router currently holds (ADR 0030). The whole
4195
+ * `routeParams` record goes in, not just this Nav's own value: a resolver
4196
+ * for an issue is routinely a lookup keyed by the book above it, and the
4197
+ * design tool binds arguments by parameter name.
4198
+ *
4199
+ * The **key is written whether or not the resolver answered**, because
4200
+ * presence of the key is the registration — it is what hides the node in
4201
+ * its parent's panel and what makes an unresolved instance render the raw
4202
+ * id rather than the node's title.
4203
+ */
4204
+ const dynamicInstances = computed(() => {
4205
+ const out = {};
4206
+ const params = store.routeParams();
4207
+ for (const nav of Object.values(store.navMap())) {
4208
+ if (nav.presentation !== 'dynamic')
4209
+ continue;
4210
+ const hit = entryAt(nav.navId);
4211
+ if (!hit || !isNavInstanceConfig(hit.entry))
4212
+ continue;
4213
+ out[nav.navId] = hit.entry.navInstance(params);
4214
+ }
4215
+ return out;
4216
+ }, ...(ngDevMode ? [{ debugName: "dynamicInstances" }] : /* istanbul ignore next */ []));
4217
+ /**
4218
+ * The load each registered NavInstanceSource offers, paired with the value
4219
+ * of the parameter it resolves. Exposed rather than fired here: calling a
4220
+ * store method from inside a `computed` writes state during a read, and
4221
+ * the re-fire rule is about a value *changing*, which a computed has no
4222
+ * way to say.
4223
+ */
4224
+ const instanceLoaders = computed(() => {
4225
+ const params = store.routeParams();
4226
+ const out = [];
4227
+ for (const nav of Object.values(store.navMap())) {
4228
+ if (nav.presentation !== 'dynamic')
4229
+ continue;
4230
+ const hit = entryAt(nav.navId);
4231
+ if (!hit || !isNavInstanceConfig(hit.entry))
4232
+ continue;
4233
+ const load = hit.entry.navInstanceLoad;
4234
+ const value = params[navParamOf(nav)];
4235
+ if (!load || !value)
4236
+ continue;
4237
+ out.push({ navId: nav.navId, value, params, load });
4238
+ }
4239
+ return out;
4240
+ }, ...(ngDevMode ? [{ debugName: "instanceLoaders" }] : /* istanbul ignore next */ []));
4129
4241
  const resolvedWidget = computed(() => {
4130
4242
  const hit = widgetEntry();
4131
4243
  // Neither of the two row-shaped entries fills a panel with a component:
@@ -4134,7 +4246,15 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
4134
4246
  // neither.
4135
4247
  if (!hit || isNavMenuConfig(hit.entry) || isNavRowsConfig(hit.entry))
4136
4248
  return null;
4137
- const config = normalizeNavWidgetEntry(hit.entry);
4249
+ // A NavInstanceConfig is not tested for the same way, because it is the
4250
+ // one entry that legitimately shares an object with a panel: a dynamic
4251
+ // Nav with a `screen` row source and an instance source registers both
4252
+ // keys at once. What disqualifies an entry is therefore having no
4253
+ // `content`, not having a `navInstance` (ADR 0030).
4254
+ const entry = hit.entry;
4255
+ if (typeof entry !== 'function' && !('content' in entry))
4256
+ return null;
4257
+ const config = normalizeNavWidgetEntry(entry);
4138
4258
  if (!config.content)
4139
4259
  return null;
4140
4260
  if (!hit.remote)
@@ -4168,7 +4288,7 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
4168
4288
  const map = store.navMap();
4169
4289
  const candidates = widgetNavIds();
4170
4290
  const rows = dynamicRows();
4171
- return (candidates.find((c) => menuChildIds(c, map, rows).length) ??
4291
+ return (candidates.find((c) => menuChildIds(c, map, rows, dynamicInstances()).length) ??
4172
4292
  // A leaf nothing is registered for is still a Nav the tree knows, and
4173
4293
  // that is where the panel belongs: `|settings|app` with no widget hands
4174
4294
  // the panel back to *settings*, whose row it is, rather than climbing
@@ -4185,6 +4305,7 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
4185
4305
  navMap: store.navMap(),
4186
4306
  anchor: { navId: store.routeNavId() ?? ROOT_NAV$1, path: store.path() },
4187
4307
  dynamicRows: dynamicRows(),
4308
+ instances: dynamicInstances(),
4188
4309
  routeParams: store.routeParams(),
4189
4310
  breadcrumb: menuConfig?.breadcramb?.() ??
4190
4311
  (typeof widgetConfig?.breadcramb === 'function'
@@ -4230,6 +4351,7 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
4230
4351
  navHasContent,
4231
4352
  currentWcConfig,
4232
4353
  resolvedNavMenuConfig,
4354
+ instanceLoaders,
4233
4355
  };
4234
4356
  }), withMethods((store) => {
4235
4357
  const getNavService = inject(GetNavService);
@@ -4249,6 +4371,7 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
4249
4371
  */
4250
4372
  const goToNav = (navId, params, options) => {
4251
4373
  const wasOpen = untracked(() => store.hasMurl());
4374
+ patchState(store, { menuNavId: undefined });
4252
4375
  const address = addressFor(navId, params);
4253
4376
  const willOpen = untracked(() => splitNavId(navId, store.navMap()).murl.length > 0);
4254
4377
  if (willOpen && !wasOpen) {
@@ -4264,7 +4387,7 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
4264
4387
  };
4265
4388
  /** Closes the panel, popping our own entry when we are the one who pushed it. */
4266
4389
  const closePanel = () => {
4267
- patchState(store, { navOpenedByUser: false });
4390
+ patchState(store, { navOpenedByUser: false, menuNavId: undefined });
4268
4391
  if (!untracked(() => store.hasMurl()))
4269
4392
  return;
4270
4393
  if (untracked(() => store.panelPushed())) {
@@ -4300,6 +4423,7 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
4300
4423
  routeNavId,
4301
4424
  routeParams,
4302
4425
  murl,
4426
+ menuNavId: undefined,
4303
4427
  // Address changes clear the icon-opened flag (ADR 0013), except
4304
4428
  // an explicit `keepPanel` goToNav (AppLogo while open).
4305
4429
  navOpenedByUser: pathChanged && !keepPanel ? false : store.navOpenedByUser(),
@@ -4356,7 +4480,7 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
4356
4480
  }));
4357
4481
  };
4358
4482
  /**
4359
- * In-panel "up". Always changes the Address to the parent. Replaces, so
4483
+ * In-panel "up". Murl steps replace the Address, so
4360
4484
  * the browser back button still closes the whole panel. Leaving Murl
4361
4485
  * space (or stepping while icon-opened) keeps the panel open so the menu
4362
4486
  * follows the trail instead of closing (same exception as AppLogo).
@@ -4388,15 +4512,13 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
4388
4512
  });
4389
4513
  return;
4390
4514
  }
4391
- // Icon-opened over a page: "up" is the Url tree's own step.
4392
- const parent = parentNavId(untracked(() => store.id()));
4515
+ // Start above the menu actually shown: a leaf may already be showing
4516
+ // its ancestor's rows. Browsing that menu leaves the page in place.
4517
+ const owner = untracked(() => store.breadcrumb().header?.id);
4518
+ const parent = owner ? parentNavId(owner) : undefined;
4393
4519
  if (!parent)
4394
4520
  return;
4395
- patchState(store, {
4396
- navOpenedByUser: true,
4397
- keepPanelOnPathChange: true,
4398
- });
4399
- router.navigateByUrl(addressFor(parent), { replaceUrl: true });
4521
+ patchState(store, { menuNavId: visibleNavId(parent) });
4400
4522
  };
4401
4523
  const loadNav = rxMethod(pipe(filter((req) => !!req.navId), tap(() => untracked(() => patchState(store, { navLoading: true }))), switchMap$1(({ navId, appNavId }) => getNavService
4402
4524
  .getNav(navId, untracked(() => store.navMap()), {
@@ -4445,6 +4567,29 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
4445
4567
  return {
4446
4568
  onInit() {
4447
4569
  store.syncFromRouter(store.navigationEnd);
4570
+ /**
4571
+ * Fires each NavInstanceSource's load when the value of the parameter
4572
+ * it resolves **changes**, and not otherwise (ADR 0030). Moving between
4573
+ * `/app/a1/about` and `/app/a1/settings` changes no instance, so it
4574
+ * fires nothing; `/app/a1` to `/app/a2` fires once.
4575
+ *
4576
+ * The last value is remembered per NavId rather than compared against
4577
+ * the resolver's own output: gating on "the resolver has not answered"
4578
+ * would never refresh a name that has gone stale, and would make the
4579
+ * trigger depend on the thing it triggers.
4580
+ */
4581
+ const firedFor = new Map();
4582
+ effect(() => {
4583
+ const loaders = store.instanceLoaders();
4584
+ untracked(() => {
4585
+ for (const { navId, value, params, load } of loaders) {
4586
+ if (firedFor.get(navId) === value)
4587
+ continue;
4588
+ firedFor.set(navId, value);
4589
+ load(params);
4590
+ }
4591
+ });
4592
+ });
4448
4593
  store.loadNav(computed(() => ({
4449
4594
  navId: store.id(),
4450
4595
  appNavId: store.appNavId(),
@@ -6831,7 +6976,7 @@ class SectionFormItemComponent extends ConfigComponent {
6831
6976
  break;
6832
6977
  }
6833
6978
  case InputType.TOGGLE: {
6834
- const { ToggleInputComponent } = await import('./magmonium-one-toggle-CFYMEJcZ.mjs');
6979
+ const { ToggleInputComponent } = await import('./magmonium-one-toggle-CItqq_8b.mjs');
6835
6980
  this.createDynamicComponent(seq, ToggleInputComponent, [], true);
6836
6981
  break;
6837
6982
  }
@@ -6843,12 +6988,12 @@ class SectionFormItemComponent extends ConfigComponent {
6843
6988
  break;
6844
6989
  }
6845
6990
  case InputType.PASSWORD: {
6846
- const { PasswordInputComponent } = await import('./magmonium-one-password-DUUhSEnp.mjs');
6991
+ const { PasswordInputComponent } = await import('./magmonium-one-password-CxT6pyYe.mjs');
6847
6992
  this.createDynamicComponent(seq, PasswordInputComponent);
6848
6993
  break;
6849
6994
  }
6850
6995
  case InputType.OTP: {
6851
- const { OtpInputComponent } = await import('./magmonium-one-otp-COwJYVW6.mjs');
6996
+ const { OtpInputComponent } = await import('./magmonium-one-otp-Dq_hcKQI.mjs');
6852
6997
  this.createDynamicComponent(seq, OtpInputComponent);
6853
6998
  break;
6854
6999
  }
@@ -20403,7 +20548,7 @@ class WrapperInputComponent extends ConfigComponent {
20403
20548
  break;
20404
20549
  }
20405
20550
  case InputType.TOGGLE: {
20406
- const { ToggleInputComponent } = await import('./magmonium-one-toggle-CFYMEJcZ.mjs');
20551
+ const { ToggleInputComponent } = await import('./magmonium-one-toggle-CItqq_8b.mjs');
20407
20552
  this.createDynamicComponent(seq, ToggleInputComponent, [], true);
20408
20553
  break;
20409
20554
  }
@@ -20415,12 +20560,12 @@ class WrapperInputComponent extends ConfigComponent {
20415
20560
  break;
20416
20561
  }
20417
20562
  case InputType.PASSWORD: {
20418
- const { PasswordInputComponent } = await import('./magmonium-one-password-DUUhSEnp.mjs');
20563
+ const { PasswordInputComponent } = await import('./magmonium-one-password-CxT6pyYe.mjs');
20419
20564
  this.createDynamicComponent(seq, PasswordInputComponent);
20420
20565
  break;
20421
20566
  }
20422
20567
  case InputType.OTP: {
20423
- const { OtpInputComponent } = await import('./magmonium-one-otp-COwJYVW6.mjs');
20568
+ const { OtpInputComponent } = await import('./magmonium-one-otp-Dq_hcKQI.mjs');
20424
20569
  this.createDynamicComponent(seq, OtpInputComponent);
20425
20570
  break;
20426
20571
  }
@@ -21074,7 +21219,7 @@ var toggleRadio = /*#__PURE__*/Object.freeze({
21074
21219
  // Stand-ins for a card list that has no options yet — DesignMode only. They
21075
21220
  // carry no label: nothing is mapped to them yet, and a name shown here would
21076
21221
  // read as a choice the Field offers. Bare boxes say the shape and no more.
21077
- const DESIGN_STUB_IDS$2 = ['stub-1', 'stub-2', 'stub-3'];
21222
+ const DESIGN_STUB_IDS$1 = ['stub-1', 'stub-2', 'stub-3'];
21078
21223
  class SelectableCardInputComponent extends BaseInputComponent {
21079
21224
  element = input(...(ngDevMode ? [undefined, { debugName: "element" }] : /* istanbul ignore next */ []));
21080
21225
  data = input([], ...(ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []));
@@ -21109,7 +21254,7 @@ class SelectableCardInputComponent extends BaseInputComponent {
21109
21254
  return data;
21110
21255
  const options = this.cardOptions();
21111
21256
  if (!options.length && this.isDesignMode) {
21112
- return DESIGN_STUB_IDS$2.map((id) => ({ id }));
21257
+ return DESIGN_STUB_IDS$1.map((id) => ({ id }));
21113
21258
  }
21114
21259
  return options.map((option) => ({
21115
21260
  id: option.value,
@@ -21724,10 +21869,17 @@ function getClassList$2(variant, orientation, config) {
21724
21869
  return classList.join(' ');
21725
21870
  }
21726
21871
 
21727
- // Stand-ins for a List whose collection is not bound yet — DesignMode only,
21728
- // the reason a SectionCarousel draws its own: an empty list has no height, and
21729
- // a Control with no rect cannot be selected or moved on a Canvas.
21730
- const DESIGN_STUB_IDS$1 = ['stub-1', 'stub-2', 'stub-3'];
21872
+ // The stand-in row a List draws on a Canvas — DesignMode only, and exactly
21873
+ // one however long the collection behind it will be. Every row of a List is
21874
+ // the same body drawn again, so a second stub shows nothing a first did not
21875
+ // and costs the author the vertical space they are laying out in (m-one-ui
21876
+ // CONTEXT.md ListControl).
21877
+ //
21878
+ // Drawn only once there is a body to draw. A List with no row template and no
21879
+ // row component is one the author has not filled yet, and it renders as the
21880
+ // empty box its own min-height gives it rather than as rows of invented text
21881
+ // — the state a RepeatControl is in before its source is picked.
21882
+ const DESIGN_STUB = { id: 'stub-1', label: 'Item 1' };
21731
21883
  // `toLength` only appends `em` to real numbers — a numeric string comes back
21732
21884
  // bare, yielding `gap: 2`. Design-editor text fields and YAML both hand over
21733
21885
  // strings, so narrow before converting (the FlexContainer's rule, ADR 0008:
@@ -21791,7 +21943,7 @@ class ListComponent extends ConfigComponent {
21791
21943
  return variant === 'ordered' ? 'counter' : 'bullet';
21792
21944
  }, ...(ngDevMode ? [{ debugName: "marker" }] : /* istanbul ignore next */ []));
21793
21945
  // A bound `data` wins over the authored `items`, and both win over the
21794
- // design stubs: what a caller passes at runtime is the more deliberate.
21946
+ // design stub: what a caller passes at runtime is the more deliberate.
21795
21947
  rows = computed(() => {
21796
21948
  const bound = this.data();
21797
21949
  if (bound?.length)
@@ -21801,26 +21953,36 @@ class ListComponent extends ConfigComponent {
21801
21953
  return authored.map(toItem);
21802
21954
  if (bound || authored)
21803
21955
  return [];
21804
- return this.isDesignMode
21805
- ? DESIGN_STUB_IDS$1.map((id, i) => ({ id, label: `Item ${i + 1}` }))
21806
- : [];
21956
+ // A body is what makes a stub worth drawing: without one the row would be
21957
+ // invented text standing in for nothing, where an empty box says exactly
21958
+ // what is true — this List has not been filled in yet.
21959
+ return this.isDesignMode && this.hasRowBody() ? [DESIGN_STUB] : [];
21807
21960
  }, ...(ngDevMode ? [{ debugName: "rows" }] : /* istanbul ignore next */ []));
21961
+ /** Whether a row has anything to render beyond its own `label`. */
21962
+ hasRowBody = computed(() => !!this.element() || !!this.rowTemplate(), ...(ngDevMode ? [{ debugName: "hasRowBody" }] : /* istanbul ignore next */ []));
21808
21963
  classNames = computed(() => getClassList$2(this.resolvedVariant(), this.resolvedOrientation(), this.config()), ...(ngDevMode ? [{ debugName: "classNames" }] : /* istanbul ignore next */ []));
21809
21964
  rowInputs = (item) => ({
21810
21965
  ...(item.inputs ?? {}),
21811
21966
  });
21812
21967
  projectedTemplate = contentChild((TemplateRef), ...(ngDevMode ? [{ debugName: "projectedTemplate" }] : /* istanbul ignore next */ []));
21813
21968
  rowTemplate = computed(() => this.template() ?? this.projectedTemplate(), ...(ngDevMode ? [{ debugName: "rowTemplate" }] : /* istanbul ignore next */ []));
21969
+ /**
21970
+ * What an inline row body reads. `row` falls back to the item itself, so a
21971
+ * row authored in the asset reaches the template the way a mapped one does:
21972
+ * an authored `ListItem` carries no `row` of its own, and a body reading
21973
+ * `undefined` would make the static source unusable to anything but a bare
21974
+ * label (m-one-ui CONTEXT.md ListControl).
21975
+ */
21814
21976
  rowContext = (item, index, first, last) => ({
21815
21977
  $implicit: item,
21816
21978
  item,
21817
- row: item.row,
21979
+ row: item.row ?? item,
21818
21980
  index,
21819
21981
  first,
21820
21982
  last,
21821
21983
  });
21822
21984
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ListComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
21823
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: ListComponent, isStandalone: true, selector: "m-list, m-one-list", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, element: { classPropertyName: "element", publicName: "element", isSignal: true, isRequired: false, transformFunction: null }, template: { classPropertyName: "template", publicName: "template", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, gap: { classPropertyName: "gap", publicName: "gap", isSignal: true, isRequired: false, transformFunction: null }, startIcon: { classPropertyName: "startIcon", publicName: "startIcon", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, noTranslate: { classPropertyName: "noTranslate", publicName: "noTranslate", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.--m-list-gap": "resolvedGap()" }, classAttribute: "m-list" }, queries: [{ propertyName: "projectedTemplate", first: true, predicate: (TemplateRef), descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: `
21985
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: ListComponent, isStandalone: true, selector: "m-list, m-one-list", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, element: { classPropertyName: "element", publicName: "element", isSignal: true, isRequired: false, transformFunction: null }, template: { classPropertyName: "template", publicName: "template", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, gap: { classPropertyName: "gap", publicName: "gap", isSignal: true, isRequired: false, transformFunction: null }, startIcon: { classPropertyName: "startIcon", publicName: "startIcon", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, noTranslate: { classPropertyName: "noTranslate", publicName: "noTranslate", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.is-design-mode": "isDesignMode", "style.--m-list-gap": "resolvedGap()" }, classAttribute: "m-list" }, queries: [{ propertyName: "projectedTemplate", first: true, predicate: (TemplateRef), descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: `
21824
21986
  <ng-template #rowList>
21825
21987
  @for (item of rows(); track item.id; let i = $index) {
21826
21988
  <li class="m-list__item">
@@ -21864,7 +22026,7 @@ class ListComponent extends ConfigComponent {
21864
22026
  <ng-container *ngTemplateOutlet="rowList" />
21865
22027
  </ul>
21866
22028
  }
21867
- `, 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%}.m-list__list{display:flex;gap:var(--m-list-gap, 0);margin:0;padding:0;list-style:none}.m-list__list--vertical{flex-direction:column}.m-list__list--horizontal{flex-direction:row;flex-wrap:wrap}.m-list__list.align-center{align-items:center}.m-list__list.align-right{align-items:flex-end}.m-list__item{display:flex;align-items:flex-start;gap:.5em;min-width:0}.m-list__marker{flex:0 0 auto;display:flex;align-items:center;color:var(--m-text-tertiary);line-height:inherit}.m-list__body{flex:1 1 auto;min-width:0}\n"], dependencies: [{ kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { 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 });
22029
+ `, 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%}:host(.is-design-mode){min-height:4em}.m-list__list{display:flex;gap:var(--m-list-gap, 0);margin:0;padding:0;list-style:none}.m-list__list--vertical{flex-direction:column}.m-list__list--horizontal{flex-direction:row;flex-wrap:wrap}.m-list__list.align-center{align-items:center}.m-list__list.align-right{align-items:flex-end}.m-list__item{display:flex;align-items:flex-start;gap:.5em;min-width:0}.m-list__marker{flex:0 0 auto;display:flex;align-items:center;color:var(--m-text-tertiary);line-height:inherit}.m-list__body{flex:1 1 auto;min-width:0}\n"], dependencies: [{ kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { 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 });
21868
22030
  }
21869
22031
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ListComponent, decorators: [{
21870
22032
  type: Component,
@@ -21914,8 +22076,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
21914
22076
  }
21915
22077
  `, changeDetection: ChangeDetectionStrategy.OnPush, host: {
21916
22078
  class: 'm-list',
22079
+ '[class.is-design-mode]': 'isDesignMode',
21917
22080
  '[style.--m-list-gap]': 'resolvedGap()',
21918
- }, 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%}.m-list__list{display:flex;gap:var(--m-list-gap, 0);margin:0;padding:0;list-style:none}.m-list__list--vertical{flex-direction:column}.m-list__list--horizontal{flex-direction:row;flex-wrap:wrap}.m-list__list.align-center{align-items:center}.m-list__list.align-right{align-items:flex-end}.m-list__item{display:flex;align-items:flex-start;gap:.5em;min-width:0}.m-list__marker{flex:0 0 auto;display:flex;align-items:center;color:var(--m-text-tertiary);line-height:inherit}.m-list__body{flex:1 1 auto;min-width:0}\n"] }]
22081
+ }, 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%}:host(.is-design-mode){min-height:4em}.m-list__list{display:flex;gap:var(--m-list-gap, 0);margin:0;padding:0;list-style:none}.m-list__list--vertical{flex-direction:column}.m-list__list--horizontal{flex-direction:row;flex-wrap:wrap}.m-list__list.align-center{align-items:center}.m-list__list.align-right{align-items:flex-end}.m-list__item{display:flex;align-items:flex-start;gap:.5em;min-width:0}.m-list__marker{flex:0 0 auto;display:flex;align-items:center;color:var(--m-text-tertiary);line-height:inherit}.m-list__body{flex:1 1 auto;min-width:0}\n"] }]
21919
22082
  }], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], element: [{ type: i0.Input, args: [{ isSignal: true, alias: "element", required: false }] }], template: [{ type: i0.Input, args: [{ isSignal: true, alias: "template", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], gap: [{ type: i0.Input, args: [{ isSignal: true, alias: "gap", required: false }] }], startIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "startIcon", required: false }] }], items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], noTranslate: [{ type: i0.Input, args: [{ isSignal: true, alias: "noTranslate", required: false }] }], projectedTemplate: [{ type: i0.ContentChild, args: [i0.forwardRef(() => TemplateRef), { isSignal: true }] }] } });
21920
22083
 
21921
22084
  const TOTAL_COLUMNS = 12;
@@ -29154,7 +29317,7 @@ class NavHeaderComponent {
29154
29317
  _searchStore = inject(SearchStore);
29155
29318
  _isUser = computed(() => this._navStore.id() === `${ROOT_NAV$1}_user`, ...(ngDevMode ? [{ debugName: "_isUser" }] : /* istanbul ignore next */ []));
29156
29319
  _isSearch = computed(() => this._navStore.id() === `${ROOT_NAV$1}_search`, ...(ngDevMode ? [{ debugName: "_isSearch" }] : /* istanbul ignore next */ []));
29157
- _hasParent = computed(() => this._navStore.id() !== ROOT_NAV$1, ...(ngDevMode ? [{ debugName: "_hasParent" }] : /* istanbul ignore next */ []));
29320
+ _hasParent = computed(() => this._navStore.breadcrumb().header?.id !== ROOT_NAV$1, ...(ngDevMode ? [{ debugName: "_hasParent" }] : /* istanbul ignore next */ []));
29158
29321
  _trail = computed(() => {
29159
29322
  const trail = this._navStore.breadcrumb().trail;
29160
29323
  return trail && trail.length > 0 ? trail : null;
@@ -34795,5 +34958,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
34795
34958
  * Generated bundle index. Do not edit.
34796
34959
  */
34797
34960
 
34798
- export { DEFAULT_NAV_PARAM as $, ACCESS_DOMAINS as A, BaseInputComponent as B, COMPONENT_INPUT_REGISTRY as C, CardComponent as D, CardWrapperComponent as E, CarouselComponent as F, ChartComponent as G, CheckboxInputComponent as H, IS_DESIGN_MODE as I, ClearableInputComponent as J, ColComponent as K, LabelComponent as L, ColorPickerInputComponent as M, CommentItemComponent as N, CommentsApiService as O, CommentsComponent as P, CommentsStore as Q, ComponentInputComponent as R, ComponentStepperComponent as S, TranslatePipe as T, ConfigComponent as U, ConfirmComponent as V, ContextMenuComponent as W, CustomIconClass as X, CustomIconEditComponent as Y, DEFAULT_FILTER_RANGE_MODE as Z, DEFAULT_FILTER_VARIANT as _, BaseTextInputComponent as a, MurlUrlSerializer as a$, DEFAULT_NAV_SEGMENT as a0, DEFAULT_SIZE as a1, DashboardCardComponent as a2, DateInputComponent as a3, DatePickerComponent as a4, DeviceService as a5, DomService as a6, Domain as a7, DotGridComponent as a8, DragListDirective as a9, InputType as aA, InstrumentScoreComponent as aB, InterceptorObservables as aC, JumbotronComponent as aD, KeyValueComponent as aE, LAYOUT_ASSET_FOLDER as aF, LOGIN_COMPONENT as aG, LOGIN_STORE as aH, LanguageComponent as aI, ListComponent as aJ, LogoComponent as aK, MAG_SOCKET_EVENT as aL, MHeroColorDirective as aM, MHeroComponent as aN, MODAL_REF as aO, MODAL_STORE_REF as aP, MRefDirective as aQ, MStepComponent as aR, MURL_PARAM as aS, MURL_SEP as aT, ManifestEnrichmentService as aU, MenuComponent as aV, ModalDirective as aW, ModalRef as aX, ModalStore as aY, MoneyPipe as aZ, MultiRangeInputComponent as a_, DragListItemDirective as aa, DraggableDirective as ab, DropdownInputComponent as ac, FILTER_GROUP_CONTEXT as ad, FILTER_RANGE_MODES as ae, FILTER_VARIANTS as af, FLEX_VARIANTS as ag, FOLDER_PICK_LISTENER as ah, FORM_ASSET_FOLDER as ai, FileService as aj, FileUploadDirective as ak, FileUploadInputComponent as al, FlexComponent as am, FlexItemComponent as an, FormGroupComponent as ao, FrameComponent as ap, FreezeService as aq, GRID_BREAKPOINTS as ar, GetNavService as as, HeaderComponent$1 as at, HighlightDirective as au, HttpService as av, ICON_SOURCE as aw, IS_SIDE_PANEL as ax, IconComponent as ay, ImgComponent as az, TextOutputComponent as b, SectionAccordionGroupDirective as b$, NAV_DEFAULT_MURL as b0, NAV_ID_SEP as b1, NAV_MAIN_BUTTONS as b2, NAV_SEGMENT_RE as b3, NAV_STORE_REF as b4, NAV_WC_COMPONENTS as b5, NAV_WIDGET_MAP as b6, NavComponent as b7, NavDetailsComponent as b8, NavHeaderComponent as b9, PlaygroundComponent as bA, PositionDirective as bB, PwaInstallComponent as bC, ROOT_NAV$1 as bD, RadioGroupComponent as bE, RadioInputComponent as bF, RangeInputComponent as bG, RatingInputComponent as bH, ReactiveElementComponent as bI, RemoteComponent as bJ, RemoteLoaderService as bK, ResizeElementComponent as bL, RouteContainer as bM, RowComponent as bN, SEARCH_QUERY as bO, SEARCH_RESULTS_EVENT as bP, SECTION_ACCORDION_GROUP as bQ, SECTION_FORM_CONTEXT as bR, SHARED_ICONS as bS, SIZE_CONTEXT as bT, ScoreComponent as bU, ScrollComponent as bV, ScrollService as bW, SearchPanelComponent as bX, SearchStore as bY, SearchUserPanelComponent as bZ, SectionAccordionDirective as b_, NavMenuComponent as ba, NavStore as bb, NavTrailComponent as bc, NothingComponent as bd, NotificationElementComponent as be, NotificationGroupComponent as bf, NotificationPopupComponent as bg, NotificationService as bh, NotificationStore as bi, NotificationType as bj, NotificationWidgetComponent as bk, ONE_ASSET_BASE_URL as bl, OPTIONS_SOURCE as bm, OVERLAY_WIDGETS as bn, OneApp as bo, OptionsSourceDirective as bp, OverlayBodyComponent as bq, OverlayRef as br, OverlayService as bs, PLATFORM_BUTTON_NAV_IDS as bt, PLATFORM_EXTENSIBLE_NAV_IDS as bu, PLATFORM_NAV_MAP as bv, PLATFORM_ROOT_CHILDREN as bw, PaginationComponent as bx, PanelComponent as by, PercentagePipe as bz, ButtonComponent as c, USER_STORE_REF as c$, SectionBackComponent as c0, SectionBadgesComponent as c1, SectionButtonGroupComponent as c2, SectionCardComponent as c3, SectionCarouselComponent as c4, SectionComponent as c5, SectionFilterComponent as c6, SectionFilterGroupComponent as c7, SectionFilterMenuComponent as c8, SectionFilterPanelComponent as c9, StorageService as cA, StrokeLinecap as cB, StrokeLinejoin as cC, SummaryComponent as cD, SvgGeneratorComponent as cE, SvgGeneratorService as cF, SvgService as cG, TOTAL_COLUMNS as cH, TRANSLATION_SOURCE as cI, TableComponent as cJ, TechnicalMeterComponent as cK, TextInputComponent as cL, TextareaInputComponent as cM, ThemeComponent as cN, ThemeDataService as cO, ThemeService as cP, ThemeStore as cQ, TimeAgoPipe as cR, TimelineComponent as cS, ToggleButtonComponent as cT, ToggleInputComponent as cU, ToggleRadioInputComponent as cV, ToolTipDirective as cW, TooltipComponent as cX, TranslateService as cY, TreeGridComponent as cZ, URL_SEP as c_, SectionFilterRangePanelComponent as ca, SectionFooterComponent as cb, SectionFormComponent as cc, SectionFormItemComponent as cd, SectionHeaderComponent as ce, SectionHeroComponent as cf, SectionPaginationComponent as cg, SectionSearchComponent as ch, SectionStepperComponent as ci, SectionTabsComponent as cj, SectionToggleComponent as ck, SectionToggleItemDirective as cl, SelectableCardInputComponent as cm, SelectorDirective as cn, SettingsSearchBarComponent as co, SettingsSearchService as cp, ShapeComponent as cq, SharedStoreRegistry as cr, SidePanelDirective as cs, Size as ct, SocketStore as cu, SortComponent as cv, StatComponent as cw, StepComponent as cx, StepperComponent as cy, StepsComponent as cz, APP_CONTEXT_REF as d, getTreeGridRow as d$, USER_TAB_MAP as d0, UniverseComponent as d1, UserApiService as d2, UserAvatarComponent as d3, UserComponent as d4, UserNavComponent as d5, UserSettingsComponent as d6, UserStore as d7, WC_ROUTE_CHANGED_EVENT as d8, WC_SEARCH_GROUPS as d9, derivePropertyName as dA, emailValidation as dB, evaluate as dC, evaluateBool as dD, filterHoldsList as dE, filterHoldsOneBound as dF, filterHoldsOptions as dG, filterHoldsRange as dH, filterList as dI, filterNumber as dJ, filterNumberList as dK, filterOne as dL, filterPanelOf as dM, filterPanelWidth as dN, filterRange as dO, filterTreeGridRows as dP, filterValueList as dQ, filterValues as dR, flattenTreeGridRows as dS, formatBadgeCount as dT, fullName as dU, generateClipPath as dV, generateTransform as dW, getClassList as dX, getProperty as dY, getScrollParent as dZ, getTierFromPreviewPath as d_, WIN_USER_TAB_HOOK as da, WIN_USER_TAB_KEY as db, WatermarkComponent as dc, WcRouterStore as dd, WrapperInputComponent as de, anchorNavId as df, applyColorsToElement as dg, assetOptions as dh, bootstrapMagApp as di, bootstrapPwaInstall as dj, buildWcBaseUrl as dk, calculateLuminance as dl, calculateRanks as dm, cellText as dn, checkFilterCondition as dp, childNavId as dq, classListSignal as dr, coerceSize as ds, cornerEdge as dt, cornerSide as du, createMap as dv, createPlatformNavMap as dw, deriveAvatarGradient as dx, deriveContrastColor as dy, deriveOppositeColor as dz, ASSET_BASE_URL as e, provideMagWcConfig as e$, getUniqueId as e0, getValue as e1, hasErrorComputed as e2, hexToRgb as e3, hslToRgb$1 as e4, initMagmoniumApp as e5, initialNotificationState as e6, initialState$2 as e7, initials as e8, injectAuthenticate as e9, mergePlatformNav as eA, mergeUnique as eB, mergeUniqueBy as eC, mergeUniqueWith as eD, minAgeValidation as eE, minLengthValidation as eF, minValidation as eG, miniMarkToHtml as eH, navIdChain as eI, navIdFor as eJ, navIdSegment as eK, navIdToRoutePath as eL, navIdToSegments as eM, navParamOf as eN, navToId as eO, normalizeAssetOptions as eP, parentNavId as eQ, parseAddress as eR, parseColor as eS, parsePatternNames as eT, patternValidation as eU, patternsValidation as eV, platformNavWidgets as eW, privateGuard as eX, processImageToSvg as eY, provideAppContext as eZ, provideMagAppConfig as e_, injectInstallApp as ea, injectParentSize as eb, injectScrollSticky as ec, isButtonName as ed, isCancelledComputed as ee, isExtensiblePlatformNavId as ef, isJson as eg, isLoadingComputed as eh, isLocalhost as ei, isNavMenuConfig as ej, isNavRowsConfig as ek, isPlatformNavId as el, isSize as em, isTierPreview as en, isUrlLocalhost as eo, isValidNavId as ep, isValidNavSegment as eq, isWebComponent as er, linkToId as es, linkToNav as et, loadingActions as eu, mInterceptor as ev, manualValidation as ew, matchFieldValidation as ex, maxLengthValidation as ey, maxValidation as ez, AccordionBodyDirective as f, provideMagWcRoutes as f0, provideModalComponents as f1, provideMurlUrlSerializer as f2, provideNavWidgets as f3, provideOverlayWidgets as f4, providePlatformNavWidgets as f5, provideSearch as f6, provideSizeContext as f7, provideUserTabs as f8, publicGuard as f9, toggleTreeGridRow as fA, unfetchedPlatformNav as fB, urlValidation as fC, readFieldPatterns as fa, renderAddress as fb, requiredValidation as fc, resolveConfigAsset as fd, resolveIconSize as fe, resolvePallet as ff, resolvePatternRules as fg, resolveSize as fh, rgbToHex as fi, rgbToHsl as fj, rowHasChildren as fk, samePatterns as fl, segmentsToNavId as fm, setProperty as fn, setTreeGridChildren as fo, settingsWidgets as fp, shouldShowBadge as fq, splitNavId as fr, splitOnMatch as fs, stringToColor as ft, toAttrBool as fu, toAttrNumber as fv, toCssLength as fw, toHostNavId as fx, toLength$1 as fy, toLocalNavId as fz, AccordionComponent as g, AccordionGroupComponent as h, ActionComponent as i, AnimatedGraphsComponent as j, AppCardComponent as k, AppRelationType as l, AppTileComponent as m, AssetStore as n, AssetUrlPipe as o, Assets as p, AuthActivityPageComponent as q, AuthApiService as r, AuthStore as s, AutosizeDirective as t, BadgeComponent as u, BandingComponent as v, BaseArrayInputComponent as w, BaseRootWebComponent as x, BaseWebComponent as y, ButtonGroupComponent as z };
34799
- //# sourceMappingURL=magmonium-one-magmonium-one-C5whWXef.mjs.map
34961
+ export { DEFAULT_NAV_PARAM as $, ACCESS_DOMAINS as A, BaseInputComponent as B, COMPONENT_INPUT_REGISTRY as C, CardComponent as D, CardWrapperComponent as E, CarouselComponent as F, ChartComponent as G, CheckboxInputComponent as H, IS_DESIGN_MODE as I, ClearableInputComponent as J, ColComponent as K, LabelComponent as L, ColorPickerInputComponent as M, CommentItemComponent as N, CommentsApiService as O, CommentsComponent as P, CommentsStore as Q, ComponentInputComponent as R, ComponentStepperComponent as S, TranslatePipe as T, ConfigComponent as U, ConfirmComponent as V, ContextMenuComponent as W, CustomIconClass as X, CustomIconEditComponent as Y, DEFAULT_FILTER_RANGE_MODE as Z, DEFAULT_FILTER_VARIANT as _, BaseTextInputComponent as a, MurlUrlSerializer as a$, DEFAULT_NAV_SEGMENT as a0, DEFAULT_SIZE as a1, DashboardCardComponent as a2, DateInputComponent as a3, DatePickerComponent as a4, DeviceService as a5, DomService as a6, Domain as a7, DotGridComponent as a8, DragListDirective as a9, InputType as aA, InstrumentScoreComponent as aB, InterceptorObservables as aC, JumbotronComponent as aD, KeyValueComponent as aE, LAYOUT_ASSET_FOLDER as aF, LOGIN_COMPONENT as aG, LOGIN_STORE as aH, LanguageComponent as aI, ListComponent as aJ, LogoComponent as aK, MAG_SOCKET_EVENT as aL, MHeroColorDirective as aM, MHeroComponent as aN, MODAL_REF as aO, MODAL_STORE_REF as aP, MRefDirective as aQ, MStepComponent as aR, MURL_PARAM as aS, MURL_SEP as aT, ManifestEnrichmentService as aU, MenuComponent as aV, ModalDirective as aW, ModalRef as aX, ModalStore as aY, MoneyPipe as aZ, MultiRangeInputComponent as a_, DragListItemDirective as aa, DraggableDirective as ab, DropdownInputComponent as ac, FILTER_GROUP_CONTEXT as ad, FILTER_RANGE_MODES as ae, FILTER_VARIANTS as af, FLEX_VARIANTS as ag, FOLDER_PICK_LISTENER as ah, FORM_ASSET_FOLDER as ai, FileService as aj, FileUploadDirective as ak, FileUploadInputComponent as al, FlexComponent as am, FlexItemComponent as an, FormGroupComponent as ao, FrameComponent as ap, FreezeService as aq, GRID_BREAKPOINTS as ar, GetNavService as as, HeaderComponent$1 as at, HighlightDirective as au, HttpService as av, ICON_SOURCE as aw, IS_SIDE_PANEL as ax, IconComponent as ay, ImgComponent as az, TextOutputComponent as b, SectionAccordionGroupDirective as b$, NAV_DEFAULT_MURL as b0, NAV_ID_SEP as b1, NAV_MAIN_BUTTONS as b2, NAV_SEGMENT_RE as b3, NAV_STORE_REF as b4, NAV_WC_COMPONENTS as b5, NAV_WIDGET_MAP as b6, NavComponent as b7, NavDetailsComponent as b8, NavHeaderComponent as b9, PlaygroundComponent as bA, PositionDirective as bB, PwaInstallComponent as bC, ROOT_NAV$1 as bD, RadioGroupComponent as bE, RadioInputComponent as bF, RangeInputComponent as bG, RatingInputComponent as bH, ReactiveElementComponent as bI, RemoteComponent as bJ, RemoteLoaderService as bK, ResizeElementComponent as bL, RouteContainer as bM, RowComponent as bN, SEARCH_QUERY as bO, SEARCH_RESULTS_EVENT as bP, SECTION_ACCORDION_GROUP as bQ, SECTION_FORM_CONTEXT as bR, SHARED_ICONS as bS, SIZE_CONTEXT as bT, ScoreComponent as bU, ScrollComponent as bV, ScrollService as bW, SearchPanelComponent as bX, SearchStore as bY, SearchUserPanelComponent as bZ, SectionAccordionDirective as b_, NavMenuComponent as ba, NavStore as bb, NavTrailComponent as bc, NothingComponent as bd, NotificationElementComponent as be, NotificationGroupComponent as bf, NotificationPopupComponent as bg, NotificationService as bh, NotificationStore as bi, NotificationType as bj, NotificationWidgetComponent as bk, ONE_ASSET_BASE_URL as bl, OPTIONS_SOURCE as bm, OVERLAY_WIDGETS as bn, OneApp as bo, OptionsSourceDirective as bp, OverlayBodyComponent as bq, OverlayRef as br, OverlayService as bs, PLATFORM_BUTTON_NAV_IDS as bt, PLATFORM_EXTENSIBLE_NAV_IDS as bu, PLATFORM_NAV_MAP as bv, PLATFORM_ROOT_CHILDREN as bw, PaginationComponent as bx, PanelComponent as by, PercentagePipe as bz, ButtonComponent as c, USER_STORE_REF as c$, SectionBackComponent as c0, SectionBadgesComponent as c1, SectionButtonGroupComponent as c2, SectionCardComponent as c3, SectionCarouselComponent as c4, SectionComponent as c5, SectionFilterComponent as c6, SectionFilterGroupComponent as c7, SectionFilterMenuComponent as c8, SectionFilterPanelComponent as c9, StorageService as cA, StrokeLinecap as cB, StrokeLinejoin as cC, SummaryComponent as cD, SvgGeneratorComponent as cE, SvgGeneratorService as cF, SvgService as cG, TOTAL_COLUMNS as cH, TRANSLATION_SOURCE as cI, TableComponent as cJ, TechnicalMeterComponent as cK, TextInputComponent as cL, TextareaInputComponent as cM, ThemeComponent as cN, ThemeDataService as cO, ThemeService as cP, ThemeStore as cQ, TimeAgoPipe as cR, TimelineComponent as cS, ToggleButtonComponent as cT, ToggleInputComponent as cU, ToggleRadioInputComponent as cV, ToolTipDirective as cW, TooltipComponent as cX, TranslateService as cY, TreeGridComponent as cZ, URL_SEP as c_, SectionFilterRangePanelComponent as ca, SectionFooterComponent as cb, SectionFormComponent as cc, SectionFormItemComponent as cd, SectionHeaderComponent as ce, SectionHeroComponent as cf, SectionPaginationComponent as cg, SectionSearchComponent as ch, SectionStepperComponent as ci, SectionTabsComponent as cj, SectionToggleComponent as ck, SectionToggleItemDirective as cl, SelectableCardInputComponent as cm, SelectorDirective as cn, SettingsSearchBarComponent as co, SettingsSearchService as cp, ShapeComponent as cq, SharedStoreRegistry as cr, SidePanelDirective as cs, Size as ct, SocketStore as cu, SortComponent as cv, StatComponent as cw, StepComponent as cx, StepperComponent as cy, StepsComponent as cz, APP_CONTEXT_REF as d, getTreeGridRow as d$, USER_TAB_MAP as d0, UniverseComponent as d1, UserApiService as d2, UserAvatarComponent as d3, UserComponent as d4, UserNavComponent as d5, UserSettingsComponent as d6, UserStore as d7, WC_ROUTE_CHANGED_EVENT as d8, WC_SEARCH_GROUPS as d9, derivePropertyName as dA, emailValidation as dB, evaluate as dC, evaluateBool as dD, filterHoldsList as dE, filterHoldsOneBound as dF, filterHoldsOptions as dG, filterHoldsRange as dH, filterList as dI, filterNumber as dJ, filterNumberList as dK, filterOne as dL, filterPanelOf as dM, filterPanelWidth as dN, filterRange as dO, filterTreeGridRows as dP, filterValueList as dQ, filterValues as dR, flattenTreeGridRows as dS, formatBadgeCount as dT, fullName as dU, generateClipPath as dV, generateTransform as dW, getClassList as dX, getProperty as dY, getScrollParent as dZ, getTierFromPreviewPath as d_, WIN_USER_TAB_HOOK as da, WIN_USER_TAB_KEY as db, WatermarkComponent as dc, WcRouterStore as dd, WrapperInputComponent as de, anchorNavId as df, applyColorsToElement as dg, assetOptions as dh, bootstrapMagApp as di, bootstrapPwaInstall as dj, buildWcBaseUrl as dk, calculateLuminance as dl, calculateRanks as dm, cellText as dn, checkFilterCondition as dp, childNavId as dq, classListSignal as dr, coerceSize as ds, cornerEdge as dt, cornerSide as du, createMap as dv, createPlatformNavMap as dw, deriveAvatarGradient as dx, deriveContrastColor as dy, deriveOppositeColor as dz, ASSET_BASE_URL as e, provideMagAppConfig as e$, getUniqueId as e0, getValue as e1, hasErrorComputed as e2, hexToRgb as e3, hslToRgb$1 as e4, initMagmoniumApp as e5, initialNotificationState as e6, initialState$2 as e7, initials as e8, injectAuthenticate as e9, maxValidation as eA, mergePlatformNav as eB, mergeUnique as eC, mergeUniqueBy as eD, mergeUniqueWith as eE, minAgeValidation as eF, minLengthValidation as eG, minValidation as eH, miniMarkToHtml as eI, navIdChain as eJ, navIdFor as eK, navIdSegment as eL, navIdToRoutePath as eM, navIdToSegments as eN, navParamOf as eO, navToId as eP, normalizeAssetOptions as eQ, parentNavId as eR, parseAddress as eS, parseColor as eT, parsePatternNames as eU, patternValidation as eV, patternsValidation as eW, platformNavWidgets as eX, privateGuard as eY, processImageToSvg as eZ, provideAppContext as e_, injectInstallApp as ea, injectParentSize as eb, injectScrollSticky as ec, isButtonName as ed, isCancelledComputed as ee, isExtensiblePlatformNavId as ef, isJson as eg, isLoadingComputed as eh, isLocalhost as ei, isNavInstanceConfig as ej, isNavMenuConfig as ek, isNavRowsConfig as el, isPlatformNavId as em, isSize as en, isTierPreview as eo, isUrlLocalhost as ep, isValidNavId as eq, isValidNavSegment as er, isWebComponent as es, linkToId as et, linkToNav as eu, loadingActions as ev, mInterceptor as ew, manualValidation as ex, matchFieldValidation as ey, maxLengthValidation as ez, AccordionBodyDirective as f, provideMagWcConfig as f0, provideMagWcRoutes as f1, provideModalComponents as f2, provideMurlUrlSerializer as f3, provideNavWidgets as f4, provideOverlayWidgets as f5, providePlatformNavWidgets as f6, provideSearch as f7, provideSizeContext as f8, provideUserTabs as f9, toLocalNavId as fA, toggleTreeGridRow as fB, unfetchedPlatformNav as fC, urlValidation as fD, publicGuard as fa, readFieldPatterns as fb, renderAddress as fc, requiredValidation as fd, resolveConfigAsset as fe, resolveIconSize as ff, resolvePallet as fg, resolvePatternRules as fh, resolveSize as fi, rgbToHex as fj, rgbToHsl as fk, rowHasChildren as fl, samePatterns as fm, segmentsToNavId as fn, setProperty as fo, setTreeGridChildren as fp, settingsWidgets as fq, shouldShowBadge as fr, splitNavId as fs, splitOnMatch as ft, stringToColor as fu, toAttrBool as fv, toAttrNumber as fw, toCssLength as fx, toHostNavId as fy, toLength$1 as fz, AccordionComponent as g, AccordionGroupComponent as h, ActionComponent as i, AnimatedGraphsComponent as j, AppCardComponent as k, AppRelationType as l, AppTileComponent as m, AssetStore as n, AssetUrlPipe as o, Assets as p, AuthActivityPageComponent as q, AuthApiService as r, AuthStore as s, AutosizeDirective as t, BadgeComponent as u, BandingComponent as v, BaseArrayInputComponent as w, BaseRootWebComponent as x, BaseWebComponent as y, ButtonGroupComponent as z };
34962
+ //# sourceMappingURL=magmonium-one-magmonium-one-5PPvzWJw.mjs.map