@magmonium/one 0.2.37 → 0.2.38

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.
@@ -1,7 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { InjectionToken, inject, Injectable, signal, computed, DestroyRef, DOCUMENT, ApplicationRef, RendererFactory2, createComponent, EnvironmentInjector, Pipe, ChangeDetectorRef, untracked, ElementRef, afterNextRender, input, ChangeDetectionStrategy, Component, effect, Injector, reflectComponentType, model, HostListener, Renderer2, Directive, output, viewChild, ViewEncapsulation, forwardRef, contentChild, TemplateRef, ViewContainerRef, inputBinding, outputBinding, linkedSignal, afterRenderEffect, runInInjectionContext, Input, booleanAttribute, HostAttributeToken, EventEmitter, Output, ViewChild, ContentChild, provideZonelessChangeDetection, makeEnvironmentProviders, HostBinding, provideAppInitializer, provideBrowserGlobalErrorListeners, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
3
3
  import { HttpClient, HttpParams, provideHttpClient, withFetch, withInterceptors } from '@angular/common/http';
4
- import { firstValueFrom, of, tap, catchError, throwError, shareReplay, finalize, map, forkJoin, Observable, pipe, interval, fromEvent, switchMap as switchMap$1, filter, EMPTY, combineLatest, Subject, race, take, from } from 'rxjs';
4
+ import { firstValueFrom, of, tap, catchError, throwError, shareReplay, finalize, map, forkJoin, Observable, pipe, interval, fromEvent, switchMap as switchMap$1, filter, EMPTY, Subject, combineLatest, race, take, from } from 'rxjs';
5
5
  import { rxResource, toObservable, toSignal, takeUntilDestroyed } from '@angular/core/rxjs-interop';
6
6
  import { signalStore, withState, withMethods, patchState, withHooks, withComputed, withProps } from '@ngrx/signals';
7
7
  import { rxMethod } from '@ngrx/signals/rxjs-interop';
@@ -3172,6 +3172,14 @@ const NotificationStore = signalStore({ providedIn: 'root' }, withState(initialN
3172
3172
  * Nav model — see libs/one/CONTEXT.md (NavId, NavKind, Address, Anchor, NavRef)
3173
3173
  * and docs/adr/0014.
3174
3174
  */
3175
+ /**
3176
+ * The parameter name a `dynamic` Nav carries when it authored none. One
3177
+ * constant because the emitted route, the Address a NavRef renders and the row
3178
+ * that fills it are the same string.
3179
+ */
3180
+ const DEFAULT_NAV_PARAM = 'id';
3181
+ /** The parameter a `dynamic` Nav contributes, authored or defaulted. */
3182
+ const navParamOf = (nav) => nav?.param ?? DEFAULT_NAV_PARAM;
3175
3183
  const ROOT_NAV$1 = 'root';
3176
3184
  /**
3177
3185
  * The segment a Nav carries when it *is* its parent's own content — the route
@@ -3248,8 +3256,9 @@ const splitNavId = (navId, navMap) => {
3248
3256
  const anchorNavId = (navId, navMap) => splitNavId(navId, navMap).url.join(NAV_ID_SEP) || ROOT_NAV$1;
3249
3257
  /**
3250
3258
  * Route path for the Url part of a NavId. `root` -> `/`. A `dynamic` Nav
3251
- * contributes `<segment>/:id`, which is why a concrete path can only be
3252
- * rendered against a live location (see `renderAddress`).
3259
+ * contributes `:id` alone — its own segment is a name, not an address — which
3260
+ * is why a concrete path can only be rendered against a live location (see
3261
+ * `renderAddress`).
3253
3262
  */
3254
3263
  const navIdToRoutePath = (navId, navMap) => {
3255
3264
  const segments = navIdToSegments(navId).slice(1);
@@ -3263,12 +3272,11 @@ const navIdToRoutePath = (navId, navMap) => {
3263
3272
  // no segment of its own — `app → default → trending` is `/app/trending`,
3264
3273
  // the address the generated route table already answers at.
3265
3274
  const path = segment === DEFAULT_NAV_SEGMENT ? '' : (nav?.path ?? segment);
3266
- return nav?.presentation === 'dynamic'
3267
- ? `${path}/:${nav.param ?? 'id'}`
3268
- : path;
3275
+ // A dynamic Nav *is* the parameter: it contributes `:id` and no segment
3276
+ // of its own, so `comics → issue` (dynamic) is `/comics/:issueId`. The
3277
+ // Nav's own name stays a name — it never reaches the URL.
3278
+ return nav?.presentation === 'dynamic' ? `:${navParamOf(nav)}` : path;
3269
3279
  })
3270
- // A dynamic Nav mounted at its app's own root declares `path: ''` — it
3271
- // contributes `:id` and no segment of its own.
3272
3280
  .flatMap((part) => part.split(URL_SEP).filter(Boolean));
3273
3281
  return parts.length ? URL_SEP + parts.join(URL_SEP) : URL_SEP;
3274
3282
  };
@@ -3410,6 +3418,9 @@ const NAV_MAIN_BUTTONS = new InjectionToken('NAV_MAIN_BUTTONS');
3410
3418
  function isNavMenuConfig(entry) {
3411
3419
  return typeof entry === 'object' && 'navMenu' in entry;
3412
3420
  }
3421
+ function isNavRowsConfig(entry) {
3422
+ return typeof entry === 'object' && 'navRows' in entry;
3423
+ }
3413
3424
  /**
3414
3425
  * Multi-provided, and resolved **last-wins**: the library provides its own
3415
3426
  * Platform Nav panels first so an app registering at the same NavId replaces
@@ -3636,16 +3647,33 @@ const emptyResult = () => ({
3636
3647
  * target decides whether following it routes or opens a panel, so nothing here
3637
3648
  * chooses a link kind (ADR 0014).
3638
3649
  */
3639
- const toTrailItem = (navId, navMap, anchor) => {
3650
+ const toTrailItem = (navId, navMap, anchor,
3651
+ /** A dynamic node standing on an instance reads that row's own label. */
3652
+ label) => {
3640
3653
  const nav = navMap[navId];
3641
3654
  return {
3642
3655
  id: navId,
3643
- label: nav?.title ?? navIdSegment(navId),
3656
+ label: label ?? nav?.title ?? navIdSegment(navId),
3644
3657
  icon: nav?.icon,
3645
3658
  nav: navId,
3646
3659
  address: renderAddress(navId, navMap, anchor),
3647
3660
  };
3648
3661
  };
3662
+ /**
3663
+ * One resolved NavRow as a menu row. `nav` is the dynamic **node**, never a
3664
+ * per-instance id nothing registers — a NavRef names a node and the instance
3665
+ * rides alongside as the param this Nav declared, which is what `renderAddress`
3666
+ * fills. `id` carries the value only so the list has stable keys.
3667
+ */
3668
+ const navRowTrailItem = (navId, nav, row, navMap, anchor) => ({
3669
+ id: `${navId}${NAV_ID_SEP}${row.value}`,
3670
+ label: row.label,
3671
+ icon: row.icon ?? nav.icon,
3672
+ nav: navId,
3673
+ address: renderAddress(navId, navMap, anchor, {
3674
+ [navParamOf(nav)]: row.value,
3675
+ }),
3676
+ });
3649
3677
  /** A Nav that *is* its parent's own content rather than a place beside it. */
3650
3678
  const isDefaultNav = (navId) => navIdSegment(navId) === DEFAULT_NAV_SEGMENT;
3651
3679
  /**
@@ -3722,7 +3750,27 @@ const navMenuOwnerId = (navId, navMap, hasOwnContent = false) => {
3722
3750
  }
3723
3751
  return visible;
3724
3752
  };
3725
- const buildNavMenus = (navId, navMap, anchor) => menuChildIds(navId, navMap).map((childId) => toTrailItem(childId, navMap, anchor));
3753
+ /**
3754
+ * The rows one panel draws. A `dynamic` child with a NavRowSource behind it is
3755
+ * **transparent** the way a Default Nav is: its resolved rows are spliced where
3756
+ * its own row stood, so the User reads the categories rather than a row named
3757
+ * after the node that lists them.
3758
+ *
3759
+ * Three states and not two. Rows: splice them. No source registered at all:
3760
+ * the Nav is an ordinary row, which is what a `dynamic` Nav was before a source
3761
+ * could be authored. A source that resolved *nothing*: splice nothing — falling
3762
+ * back to the node's own row would draw a link into a list that is empty, and
3763
+ * falling through to the static siblings around it would show a panel that
3764
+ * looks correct and is not.
3765
+ */
3766
+ const buildNavMenus = (navId, navMap, anchor, dynamicRows = {}) => menuChildIds(navId, navMap).flatMap((childId) => {
3767
+ const nav = navMap[childId];
3768
+ const resolved = nav && dynamicRows[childId];
3769
+ if (!nav || nav.presentation !== 'dynamic' || !resolved) {
3770
+ return [toTrailItem(childId, navMap, anchor)];
3771
+ }
3772
+ return resolved.rows.map((row) => navRowTrailItem(childId, nav, row, navMap, anchor));
3773
+ });
3726
3774
  /**
3727
3775
  * Merges a widget's emitted trail over the derived one, matching by depth.
3728
3776
  * With a single keyspace there is nothing to translate — an emitted entry is
@@ -3737,9 +3785,25 @@ const mergeTrail = (derived, override, derivedHeader) => {
3737
3785
  return { trail, header: override.header ?? derivedHeader };
3738
3786
  };
3739
3787
  function deriveBreadcrumb(params) {
3740
- const { navId, navMap, anchor, breadcrumb, navMenu, hasOwnContent } = params;
3788
+ const { navId, navMap, anchor, breadcrumb, navMenu, hasOwnContent, dynamicRows, routeParams, } = params;
3741
3789
  if (!navId)
3742
3790
  return emptyResult();
3791
+ /**
3792
+ * The label a dynamic node wears while the User stands on one of its rows.
3793
+ * Falls back to the node's own title when nothing matches — a deep link that
3794
+ * arrived before the rows did, or a row that has since gone — because a raw
3795
+ * segment is a worse answer than the node's name but a better one than a
3796
+ * blank.
3797
+ */
3798
+ const rowLabel = (id) => {
3799
+ const nav = navMap[id];
3800
+ if (nav?.presentation !== 'dynamic')
3801
+ return undefined;
3802
+ const value = routeParams?.[navParamOf(nav)];
3803
+ if (!value)
3804
+ return undefined;
3805
+ return dynamicRows?.[id]?.rows.find((row) => row.value === value)?.label;
3806
+ };
3743
3807
  // The header and the trail belong to whichever Nav owns the menu below them:
3744
3808
  // on a leaf that is the parent, so the User reads the list they are in with
3745
3809
  // their own row marked, rather than a title over an empty panel.
@@ -3752,11 +3816,13 @@ function deriveBreadcrumb(params) {
3752
3816
  const derivedTrail = chain
3753
3817
  .slice(0, -1)
3754
3818
  .filter((id) => !isDefaultNav(id))
3755
- .map((id) => toTrailItem(id, navMap, anchor));
3819
+ .map((id) => toTrailItem(id, navMap, anchor, rowLabel(id)));
3756
3820
  const nav = navMap[ownerId];
3757
3821
  const derivedHeader = {
3758
3822
  id: ownerId,
3759
- label: nav?.title ?? (ownerId === ROOT_NAV$1 ? '' : navIdSegment(ownerId)),
3823
+ label: rowLabel(ownerId) ??
3824
+ nav?.title ??
3825
+ (ownerId === ROOT_NAV$1 ? '' : navIdSegment(ownerId)),
3760
3826
  icon: nav?.icon,
3761
3827
  nav: ownerId,
3762
3828
  address: renderAddress(ownerId, navMap, anchor),
@@ -3768,7 +3834,7 @@ function deriveBreadcrumb(params) {
3768
3834
  breadcrumb: { trail, header },
3769
3835
  navMenus: navMenu?.length && ownPanel
3770
3836
  ? navMenu
3771
- : buildNavMenus(ownerId, navMap, anchor),
3837
+ : buildNavMenus(ownerId, navMap, anchor, dynamicRows),
3772
3838
  };
3773
3839
  }
3774
3840
 
@@ -3867,6 +3933,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
3867
3933
  const initialState$3 = {
3868
3934
  path: '/',
3869
3935
  routeNavId: undefined,
3936
+ routeParams: {},
3870
3937
  murl: [],
3871
3938
  appLink: undefined,
3872
3939
  appNavId: undefined,
@@ -3889,6 +3956,21 @@ const routeNavIdOf = (root) => {
3889
3956
  }
3890
3957
  return navId;
3891
3958
  };
3959
+ /**
3960
+ * Every path parameter on the matched chain, deepest last. Merged rather than
3961
+ * read off the leaf: two dynamic Navs on one path each contribute their own
3962
+ * (`:id/:issueId`), and only the chain holds both.
3963
+ */
3964
+ const routeParamsOf = (root) => {
3965
+ const params = {};
3966
+ for (let r = root; r; r = r.firstChild) {
3967
+ for (const [key, value] of Object.entries(r.params ?? {})) {
3968
+ if (typeof value === 'string')
3969
+ params[key] = value;
3970
+ }
3971
+ }
3972
+ return params;
3973
+ };
3892
3974
  const murlOf = (root) => {
3893
3975
  const raw = root.queryParams?.[MURL_PARAM];
3894
3976
  return typeof raw === 'string' ? raw.split(MURL_SEP).filter(Boolean) : [];
@@ -3946,32 +4028,69 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
3946
4028
  * selector from the Angular tag used to create an unregistered custom
3947
4029
  * element and leave theme / language blank.
3948
4030
  */
3949
- const widgetEntry = computed(() => {
4031
+ /**
4032
+ * One NavId against every registered map, Remote first. Split out of
4033
+ * `widgetEntry` because a `dynamic` Nav's rows are looked up by *its own*
4034
+ * id while the User stands on its parent — the rows draw in the parent's
4035
+ * panel, so the candidate list the open panel walks would never reach them.
4036
+ */
4037
+ const entryAt = (candidate) => {
3950
4038
  const appNavId = store.appNavId();
3951
4039
  const appLink = store.appLink();
3952
4040
  const maps = navWidgetMaps ?? [];
3953
- for (const candidate of widgetNavIds()) {
3954
- const navId = candidate;
3955
- if (appLink && appNavId) {
3956
- const registered = store.remoteWidgets()[appLink];
3957
- const localId = toLocalNavId(navId, appNavId);
3958
- if (registered && localId) {
3959
- const entry = registered.widgetMap()[localId];
3960
- if (entry)
3961
- return { entry, remote: true, navId: candidate };
3962
- }
3963
- }
3964
- for (let i = maps.length - 1; i >= 0; i--) {
3965
- const entry = maps[i]()[navId];
3966
- if (entry !== undefined)
3967
- return { entry, remote: false, navId: candidate };
4041
+ const navId = candidate;
4042
+ if (appLink && appNavId) {
4043
+ const registered = store.remoteWidgets()[appLink];
4044
+ const localId = toLocalNavId(navId, appNavId);
4045
+ if (registered && localId) {
4046
+ const entry = registered.widgetMap()[localId];
4047
+ if (entry)
4048
+ return { entry, remote: true };
3968
4049
  }
3969
4050
  }
4051
+ for (let i = maps.length - 1; i >= 0; i--) {
4052
+ const entry = maps[i]()[navId];
4053
+ if (entry !== undefined)
4054
+ return { entry, remote: false };
4055
+ }
4056
+ return undefined;
4057
+ };
4058
+ const widgetEntry = computed(() => {
4059
+ for (const candidate of widgetNavIds()) {
4060
+ const hit = entryAt(candidate);
4061
+ if (hit)
4062
+ return { ...hit, navId: candidate };
4063
+ }
3970
4064
  return undefined;
3971
4065
  }, ...(ngDevMode ? [{ debugName: "widgetEntry" }] : /* istanbul ignore next */ []));
4066
+ /**
4067
+ * Every `dynamic` Nav with a NavRowSource behind it, resolved. Walks the
4068
+ * whole map rather than the open panel's own descent: the rows are drawn by
4069
+ * whichever ancestor owns the panel, and reading each source's signal here
4070
+ * is what makes the panel recompute when the store behind it fills.
4071
+ */
4072
+ const dynamicRows = computed(() => {
4073
+ const out = {};
4074
+ for (const nav of Object.values(store.navMap())) {
4075
+ if (nav.presentation !== 'dynamic')
4076
+ continue;
4077
+ const hit = entryAt(nav.navId);
4078
+ if (!hit || !isNavRowsConfig(hit.entry))
4079
+ continue;
4080
+ out[nav.navId] = {
4081
+ rows: hit.entry.navRows() ?? [],
4082
+ loading: hit.entry.loading?.(),
4083
+ };
4084
+ }
4085
+ return out;
4086
+ }, ...(ngDevMode ? [{ debugName: "dynamicRows" }] : /* istanbul ignore next */ []));
3972
4087
  const resolvedWidget = computed(() => {
3973
4088
  const hit = widgetEntry();
3974
- if (!hit || isNavMenuConfig(hit.entry))
4089
+ // Neither of the two row-shaped entries fills a panel with a component:
4090
+ // one replaces a panel's rows, the other contributes rows to its
4091
+ // parent's, and `normalizeNavWidgetEntry` would read a `content` off
4092
+ // neither.
4093
+ if (!hit || isNavMenuConfig(hit.entry) || isNavRowsConfig(hit.entry))
3975
4094
  return null;
3976
4095
  const config = normalizeNavWidgetEntry(hit.entry);
3977
4096
  if (!config.content)
@@ -4022,6 +4141,8 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
4022
4141
  navId: panelNavId(),
4023
4142
  navMap: store.navMap(),
4024
4143
  anchor: { navId: store.routeNavId() ?? ROOT_NAV$1, path: store.path() },
4144
+ dynamicRows: dynamicRows(),
4145
+ routeParams: store.routeParams(),
4025
4146
  breadcrumb: menuConfig?.breadcramb?.() ??
4026
4147
  (typeof widgetConfig?.breadcramb === 'function'
4027
4148
  ? widgetConfig.breadcramb()
@@ -4125,6 +4246,7 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
4125
4246
  */
4126
4247
  const syncFromRouter = rxMethod(pipe(filter((s) => !!s), tap((snapshot) => {
4127
4248
  const routeNavId = routeNavIdOf(snapshot.root);
4249
+ const routeParams = routeParamsOf(snapshot.root);
4128
4250
  const murl = murlOf(snapshot.root);
4129
4251
  const path = router.url.split(MURL_SEP)[0].split('?')[0];
4130
4252
  untracked(() => {
@@ -4133,6 +4255,7 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
4133
4255
  patchState(store, {
4134
4256
  path,
4135
4257
  routeNavId,
4258
+ routeParams,
4136
4259
  murl,
4137
4260
  // Address changes clear the icon-opened flag (ADR 0013), except
4138
4261
  // an explicit `keepPanel` goToNav (AppLogo while open).
@@ -6648,7 +6771,7 @@ class SectionFormItemComponent extends ConfigComponent {
6648
6771
  break;
6649
6772
  }
6650
6773
  case InputType.TOGGLE: {
6651
- const { ToggleInputComponent } = await import('./magmonium-one-toggle-xObigfCF.mjs');
6774
+ const { ToggleInputComponent } = await import('./magmonium-one-toggle-wEeMiUQz.mjs');
6652
6775
  this.createDynamicComponent(seq, ToggleInputComponent, [], true);
6653
6776
  break;
6654
6777
  }
@@ -6660,12 +6783,12 @@ class SectionFormItemComponent extends ConfigComponent {
6660
6783
  break;
6661
6784
  }
6662
6785
  case InputType.PASSWORD: {
6663
- const { PasswordInputComponent } = await import('./magmonium-one-password-CIGsSlR_.mjs');
6786
+ const { PasswordInputComponent } = await import('./magmonium-one-password-DmEMAVca.mjs');
6664
6787
  this.createDynamicComponent(seq, PasswordInputComponent);
6665
6788
  break;
6666
6789
  }
6667
6790
  case InputType.OTP: {
6668
- const { OtpInputComponent } = await import('./magmonium-one-otp-ozxzDST4.mjs');
6791
+ const { OtpInputComponent } = await import('./magmonium-one-otp-JmUyDNPb.mjs');
6669
6792
  this.createDynamicComponent(seq, OtpInputComponent);
6670
6793
  break;
6671
6794
  }
@@ -8110,28 +8233,31 @@ class MenuComponent {
8110
8233
  const hide = this.hide();
8111
8234
  const extra = this.extra();
8112
8235
  const isAdmin = this.isAdmin();
8113
- let result = [];
8114
- if (back) {
8115
- result = back.options ?? async ?? [];
8116
- }
8117
- else {
8118
- result = async ?? config ?? [];
8119
- }
8120
- if (!isAdmin) {
8121
- result = result.map((group) => group.filter((item) => !item.adminOnly));
8122
- }
8123
- if (hide?.length) {
8124
- result = result.map((group) => group.filter((item) => !hide.includes(item.id)));
8125
- }
8126
8236
  const vRule = this.visibilityRule();
8127
8237
  const data = this.extraData();
8128
- if (vRule) {
8129
- result = result.map((group) => group.filter((item) => vRule(item.visibilityKey ?? item.id, data)));
8130
- }
8131
- if (extra?.length && !back) {
8132
- result = [...result, extra];
8133
- }
8134
- return result.filter((group) => group.length > 0);
8238
+ // Filtering recurses so a parent is judged by what survives under it: a row
8239
+ // whose every child was hidden would open an empty box, which reads as a
8240
+ // broken menu rather than an unavailable one. A `file` parent is exempt —
8241
+ // its options are fetched on drill and there is nothing here to count.
8242
+ const filterGroups = (groups) => groups
8243
+ .map((group) => group.filter((item) => {
8244
+ if (!isAdmin && item.adminOnly)
8245
+ return false;
8246
+ if (hide?.length && hide.includes(item.id))
8247
+ return false;
8248
+ if (vRule && !vRule(item.visibilityKey ?? item.id, data)) {
8249
+ return false;
8250
+ }
8251
+ if (item.options)
8252
+ return filterGroups(item.options).length > 0;
8253
+ return true;
8254
+ }))
8255
+ .filter((group) => group.length > 0);
8256
+ const source = back
8257
+ ? back.options ?? async ?? []
8258
+ : async ?? config ?? [];
8259
+ const result = filterGroups(source);
8260
+ return extra?.length && !back ? [...result, extra] : result;
8135
8261
  }, ...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
8136
8262
  isLoading = computed(() => this.#asyncOptions.isLoading(), ...(ngDevMode ? [{ debugName: "isLoading" }] : /* istanbul ignore next */ []));
8137
8263
  // --- Handlers ---
@@ -8191,6 +8317,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
8191
8317
 
8192
8318
  class ContextMenuBoxComponent {
8193
8319
  options = input([], ...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
8320
+ hide = input(...(ngDevMode ? [undefined, { debugName: "hide" }] : /* istanbul ignore next */ []));
8194
8321
  file = input(...(ngDevMode ? [undefined, { debugName: "file" }] : /* istanbul ignore next */ []));
8195
8322
  width = input('250px', ...(ngDevMode ? [{ debugName: "width" }] : /* istanbul ignore next */ []));
8196
8323
  height = input('auto', ...(ngDevMode ? [{ debugName: "height" }] : /* istanbul ignore next */ []));
@@ -8203,12 +8330,12 @@ class ContextMenuBoxComponent {
8203
8330
  this.action.emit(item);
8204
8331
  };
8205
8332
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ContextMenuBoxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8206
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.9", type: ContextMenuBoxComponent, isStandalone: true, selector: "m-context-menu-box", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, file: { classPropertyName: "file", publicName: "file", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, isAdmin: { classPropertyName: "isAdmin", publicName: "isAdmin", isSignal: true, isRequired: false, transformFunction: null }, visibilityRule: { classPropertyName: "visibilityRule", publicName: "visibilityRule", isSignal: true, isRequired: false, transformFunction: null }, disableRule: { classPropertyName: "disableRule", publicName: "disableRule", isSignal: true, isRequired: false, transformFunction: null }, extraData: { classPropertyName: "extraData", publicName: "extraData", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { action: "action" }, ngImport: i0, template: "<div class=\"m-context-menu-box\" [style.width]=\"width()\" [style.max-height]=\"height()\">\n <m-menu\n [config]=\"options()\"\n [file]=\"file()\"\n [isAdmin]=\"isAdmin()\"\n [visibilityRule]=\"visibilityRule()\"\n [disableRule]=\"disableRule()\"\n [extraData]=\"extraData()\"\n (action)=\"emitAction($event)\"\n />\n</div>\n", 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-context-menu-box{overflow-y:auto;border-radius:0;border:1px solid var(--m-mm);background:var(--m-background);animation:context-menu-in .2s ease-out}@keyframes context-menu-in{0%{opacity:0;transform:scale(.95) translateY(-4px)}to{opacity:1;transform:scale(1) translateY(0)}}:host-context(.align-bottom){display:block;width:100%!important;max-width:100%!important}:host-context(.align-bottom) .m-context-menu-box{width:100%!important;max-width:100%!important;max-height:70vh!important;border-left:none;border-right:none;border-bottom:none}\n"], dependencies: [{ kind: "component", type: MenuComponent, selector: "m-menu", inputs: ["config", "file", "root", "url", "extra", "hide", "hideLink", "isAdmin", "visibilityRule", "disableRule", "extraData"], outputs: ["action"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
8333
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.9", type: ContextMenuBoxComponent, isStandalone: true, selector: "m-context-menu-box", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, hide: { classPropertyName: "hide", publicName: "hide", isSignal: true, isRequired: false, transformFunction: null }, file: { classPropertyName: "file", publicName: "file", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, isAdmin: { classPropertyName: "isAdmin", publicName: "isAdmin", isSignal: true, isRequired: false, transformFunction: null }, visibilityRule: { classPropertyName: "visibilityRule", publicName: "visibilityRule", isSignal: true, isRequired: false, transformFunction: null }, disableRule: { classPropertyName: "disableRule", publicName: "disableRule", isSignal: true, isRequired: false, transformFunction: null }, extraData: { classPropertyName: "extraData", publicName: "extraData", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { action: "action" }, ngImport: i0, template: "<div class=\"m-context-menu-box\" [style.width]=\"width()\" [style.max-height]=\"height()\">\n <m-menu\n [config]=\"options()\"\n [hide]=\"hide()\"\n [file]=\"file()\"\n [isAdmin]=\"isAdmin()\"\n [visibilityRule]=\"visibilityRule()\"\n [disableRule]=\"disableRule()\"\n [extraData]=\"extraData()\"\n (action)=\"emitAction($event)\"\n />\n</div>\n", 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-context-menu-box{overflow-y:auto;border-radius:0;border:1px solid var(--m-mm);background:var(--m-background);animation:context-menu-in .2s ease-out}@keyframes context-menu-in{0%{opacity:0;transform:scale(.95) translateY(-4px)}to{opacity:1;transform:scale(1) translateY(0)}}:host-context(.align-bottom){display:block;width:100%!important;max-width:100%!important}:host-context(.align-bottom) .m-context-menu-box{width:100%!important;max-width:100%!important;max-height:70vh!important;border-left:none;border-right:none;border-bottom:none}\n"], dependencies: [{ kind: "component", type: MenuComponent, selector: "m-menu", inputs: ["config", "file", "root", "url", "extra", "hide", "hideLink", "isAdmin", "visibilityRule", "disableRule", "extraData"], outputs: ["action"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
8207
8334
  }
8208
8335
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ContextMenuBoxComponent, decorators: [{
8209
8336
  type: Component,
8210
- args: [{ selector: 'm-context-menu-box', imports: [MenuComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"m-context-menu-box\" [style.width]=\"width()\" [style.max-height]=\"height()\">\n <m-menu\n [config]=\"options()\"\n [file]=\"file()\"\n [isAdmin]=\"isAdmin()\"\n [visibilityRule]=\"visibilityRule()\"\n [disableRule]=\"disableRule()\"\n [extraData]=\"extraData()\"\n (action)=\"emitAction($event)\"\n />\n</div>\n", 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-context-menu-box{overflow-y:auto;border-radius:0;border:1px solid var(--m-mm);background:var(--m-background);animation:context-menu-in .2s ease-out}@keyframes context-menu-in{0%{opacity:0;transform:scale(.95) translateY(-4px)}to{opacity:1;transform:scale(1) translateY(0)}}:host-context(.align-bottom){display:block;width:100%!important;max-width:100%!important}:host-context(.align-bottom) .m-context-menu-box{width:100%!important;max-width:100%!important;max-height:70vh!important;border-left:none;border-right:none;border-bottom:none}\n"] }]
8211
- }], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], file: [{ type: i0.Input, args: [{ isSignal: true, alias: "file", required: false }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], isAdmin: [{ type: i0.Input, args: [{ isSignal: true, alias: "isAdmin", required: false }] }], action: [{ type: i0.Output, args: ["action"] }], visibilityRule: [{ type: i0.Input, args: [{ isSignal: true, alias: "visibilityRule", required: false }] }], disableRule: [{ type: i0.Input, args: [{ isSignal: true, alias: "disableRule", required: false }] }], extraData: [{ type: i0.Input, args: [{ isSignal: true, alias: "extraData", required: false }] }] } });
8337
+ args: [{ selector: 'm-context-menu-box', imports: [MenuComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"m-context-menu-box\" [style.width]=\"width()\" [style.max-height]=\"height()\">\n <m-menu\n [config]=\"options()\"\n [hide]=\"hide()\"\n [file]=\"file()\"\n [isAdmin]=\"isAdmin()\"\n [visibilityRule]=\"visibilityRule()\"\n [disableRule]=\"disableRule()\"\n [extraData]=\"extraData()\"\n (action)=\"emitAction($event)\"\n />\n</div>\n", 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-context-menu-box{overflow-y:auto;border-radius:0;border:1px solid var(--m-mm);background:var(--m-background);animation:context-menu-in .2s ease-out}@keyframes context-menu-in{0%{opacity:0;transform:scale(.95) translateY(-4px)}to{opacity:1;transform:scale(1) translateY(0)}}:host-context(.align-bottom){display:block;width:100%!important;max-width:100%!important}:host-context(.align-bottom) .m-context-menu-box{width:100%!important;max-width:100%!important;max-height:70vh!important;border-left:none;border-right:none;border-bottom:none}\n"] }]
8338
+ }], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], hide: [{ type: i0.Input, args: [{ isSignal: true, alias: "hide", required: false }] }], file: [{ type: i0.Input, args: [{ isSignal: true, alias: "file", required: false }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], isAdmin: [{ type: i0.Input, args: [{ isSignal: true, alias: "isAdmin", required: false }] }], action: [{ type: i0.Output, args: ["action"] }], visibilityRule: [{ type: i0.Input, args: [{ isSignal: true, alias: "visibilityRule", required: false }] }], disableRule: [{ type: i0.Input, args: [{ isSignal: true, alias: "disableRule", required: false }] }], extraData: [{ type: i0.Input, args: [{ isSignal: true, alias: "extraData", required: false }] }] } });
8212
8339
 
8213
8340
  class ContextMenuComponent extends ConfigComponent {
8214
8341
  toggle = model(...(ngDevMode ? [undefined, { debugName: "toggle" }] : /* istanbul ignore next */ []));
@@ -8237,15 +8364,11 @@ class ContextMenuComponent extends ConfigComponent {
8237
8364
  label: 'actions',
8238
8365
  inverted: this.inverted() ?? this.contextMenuConfig().inverted,
8239
8366
  }), ...(ngDevMode ? [{ debugName: "triggerButtonConfig" }] : /* istanbul ignore next */ []));
8240
- contextMenuOptions = computed(() => {
8241
- const options = this.contextMenuConfig().options;
8242
- const exclude = this.exclude();
8243
- if (!options)
8244
- return [];
8245
- if (!exclude || !exclude.length)
8246
- return options;
8247
- return options.map((group) => group.filter((item) => !exclude.includes(item.id)));
8248
- }, ...(ngDevMode ? [{ debugName: "contextMenuOptions" }] : /* istanbul ignore next */ []));
8367
+ // `exclude` is not applied here: a menu nests, and a filter run once over the
8368
+ // root groups cannot reach an item a layer down, nor one a `file` parent has
8369
+ // not fetched yet. It is handed to the menu as `hide` instead, which the menu
8370
+ // re-applies at whatever depth is on screen.
8371
+ contextMenuOptions = computed(() => this.contextMenuConfig().options ?? [], ...(ngDevMode ? [{ debugName: "contextMenuOptions" }] : /* istanbul ignore next */ []));
8249
8372
  selectorConfig = computed(() => ({
8250
8373
  component: ContextMenuBoxComponent,
8251
8374
  base: 'm-context-menu',
@@ -8255,6 +8378,7 @@ class ContextMenuComponent extends ConfigComponent {
8255
8378
  toggle: true,
8256
8379
  bindings: [
8257
8380
  inputBinding('options', this.contextMenuOptions),
8381
+ inputBinding('hide', this.exclude),
8258
8382
  inputBinding('visibilityRule', this.visibilityRule),
8259
8383
  inputBinding('disableRule', this.disableRule),
8260
8384
  inputBinding('extraData', this.extraData),
@@ -15470,6 +15594,11 @@ const initialModalState = {
15470
15594
  activePanel: undefined,
15471
15595
  };
15472
15596
  const ModalStore = signalStore({ providedIn: 'root' }, withState(initialModalState), withMethods((state, domService = inject(DomService), deviceService = inject(DeviceService)) => {
15597
+ // Every modal that has gone, by id. A modal is dismissed from two places —
15598
+ // its own close affordance and this store — and only one of those runs
15599
+ // through a ModalRef, so a caller waiting on an answer would otherwise wait
15600
+ // forever on the other.
15601
+ const closed = new Subject();
15473
15602
  const modalComp = inject(MODAL_COMPONENT);
15474
15603
  const panelComp = inject(PANEL_COMPONENT);
15475
15604
  const confirmComp = inject(CONFIRM_COMPONENT);
@@ -15521,6 +15650,7 @@ const ModalStore = signalStore({ providedIn: 'root' }, withState(initialModalSta
15521
15650
  ? remaining[remaining.length - 1]
15522
15651
  : undefined,
15523
15652
  });
15653
+ closed.next(modalId);
15524
15654
  };
15525
15655
  /**
15526
15656
  * The panel a dock request would displace: whatever currently holds the edge.
@@ -15657,26 +15787,69 @@ const ModalStore = signalStore({ providedIn: 'root' }, withState(initialModalSta
15657
15787
  const cleanupPanelsOnClose = rxMethod(pipe(filter((panelMap) => !Object.keys(panelMap).length), tap(() => {
15658
15788
  domService.cleanup(state.panelParentClassName());
15659
15789
  })));
15660
- const confirm = (opts, onConfirm) => {
15790
+ /**
15791
+ * The question as a value: subscribing asks it, and the single emission is
15792
+ * the answer — `true` for the commit, `false` for a refusal and for a
15793
+ * dismissal, which is a refusal by another route. Completes with that
15794
+ * emission, so a `switchMap` over it moves on rather than holding the
15795
+ * modal's answer open.
15796
+ *
15797
+ * Unsubscribing before it answers takes the modal away with it: the caller
15798
+ * that asked is gone, and a dialog nothing is waiting on is a dialog whose
15799
+ * answer lands nowhere.
15800
+ */
15801
+ const ask = (opts) => new Observable((subscriber) => {
15661
15802
  const modalRef = new ModalRef();
15662
- const id = open({
15803
+ let settled = false;
15804
+ let id = '';
15805
+ const settle = (result, dismiss) => {
15806
+ if (settled)
15807
+ return;
15808
+ settled = true;
15809
+ watch.unsubscribe();
15810
+ if (dismiss)
15811
+ close(id);
15812
+ subscriber.next(result);
15813
+ subscriber.complete();
15814
+ };
15815
+ const watch = closed
15816
+ .pipe(filter((closedId) => closedId === id))
15817
+ .subscribe(() => settle(false, false));
15818
+ id = open({
15663
15819
  component: confirmComp,
15664
15820
  providers: [{ provide: MODAL_REF, useValue: modalRef }],
15665
15821
  bindings: [
15666
15822
  inputBinding('header', () => opts.header ?? ''),
15667
15823
  inputBinding('body', () => opts.body ?? ''),
15824
+ inputBinding('params', () => opts.params ?? {}),
15668
15825
  inputBinding('type', () => opts.type ?? 'info'),
15826
+ inputBinding('kind', () => opts.kind ?? 'yes'),
15827
+ inputBinding('confirmLabel', () => opts.confirmLabel ?? ''),
15828
+ inputBinding('cancelLabel', () => opts.cancelLabel ?? ''),
15669
15829
  ],
15670
15830
  });
15671
- modalRef.onClose((result) => {
15831
+ modalRef.onClose((result) => settle(!!result, true));
15832
+ return () => {
15833
+ if (settled)
15834
+ return;
15835
+ settled = true;
15836
+ watch.unsubscribe();
15837
+ close(id);
15838
+ };
15839
+ });
15840
+ // The callback form, kept for every caller drawn against it. One
15841
+ // implementation underneath: a refusal runs nothing, which is what an
15842
+ // `onConfirm` that never fires already meant.
15843
+ const confirm = (opts, onConfirm) => {
15844
+ ask(opts).subscribe((result) => {
15672
15845
  if (result)
15673
15846
  onConfirm();
15674
- close(id);
15675
15847
  });
15676
15848
  };
15677
15849
  return {
15678
15850
  open,
15679
15851
  close,
15852
+ ask,
15680
15853
  confirm,
15681
15854
  openPanel,
15682
15855
  closePanel,
@@ -16075,16 +16248,41 @@ function injectAuthenticate() {
16075
16248
  class ConfirmComponent {
16076
16249
  header = input('', ...(ngDevMode ? [{ debugName: "header" }] : /* istanbul ignore next */ []));
16077
16250
  body = input('', ...(ngDevMode ? [{ debugName: "body" }] : /* istanbul ignore next */ []));
16251
+ /**
16252
+ * The MessageVariable values the two keys above name — a row's name or id the
16253
+ * asker knows and the message asks about. Values and never text: they reach
16254
+ * `TranslatePipe` as params rather than spliced into the key, so the message
16255
+ * still resolves per language. Empty is a message with no slots, which is
16256
+ * every confirmation drawn before this.
16257
+ */
16258
+ params = input({}, ...(ngDevMode ? [{ debugName: "params" }] : /* istanbul ignore next */ []));
16078
16259
  type = input('info', ...(ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []));
16260
+ /**
16261
+ * Whether the question can be refused. `yes` is an acknowledgement — the one
16262
+ * button commits and there is nothing else to press — and stays the default,
16263
+ * which is what every ConfirmComponent drawn before this was.
16264
+ */
16265
+ kind = input('yes', ...(ngDevMode ? [{ debugName: "kind" }] : /* istanbul ignore next */ []));
16266
+ /**
16267
+ * The wording of each button, as a TranslationAsset key. Empty falls back to
16268
+ * the library's own — derived from `type` for the commit, `cancel` for the
16269
+ * refusal — so a caller that has nothing to say about the buttons says
16270
+ * nothing.
16271
+ */
16272
+ confirmLabel = input('', ...(ngDevMode ? [{ debugName: "confirmLabel" }] : /* istanbul ignore next */ []));
16273
+ cancelLabel = input('', ...(ngDevMode ? [{ debugName: "cancelLabel" }] : /* istanbul ignore next */ []));
16079
16274
  #modalRef = inject(MODAL_REF);
16080
- confirmLabel = computed(() => {
16275
+ confirmText = computed(() => {
16276
+ if (this.confirmLabel())
16277
+ return this.confirmLabel();
16081
16278
  switch (this.type()) {
16082
16279
  case 'danger':
16083
16280
  return 'delete';
16084
16281
  default:
16085
16282
  return 'okay';
16086
16283
  }
16087
- }, ...(ngDevMode ? [{ debugName: "confirmLabel" }] : /* istanbul ignore next */ []));
16284
+ }, ...(ngDevMode ? [{ debugName: "confirmText" }] : /* istanbul ignore next */ []));
16285
+ cancelText = computed(() => this.cancelLabel() || 'cancel', ...(ngDevMode ? [{ debugName: "cancelText" }] : /* istanbul ignore next */ []));
16088
16286
  iconName = computed(() => {
16089
16287
  switch (this.type()) {
16090
16288
  case 'danger':
@@ -16100,26 +16298,39 @@ class ConfirmComponent {
16100
16298
  accept() {
16101
16299
  this.#modalRef.close(true);
16102
16300
  }
16301
+ // The refusal is a result like any other, so it closes with `false` rather
16302
+ // than dismissing: a caller waiting on the answer gets one either way.
16303
+ decline() {
16304
+ this.#modalRef.close(false);
16305
+ }
16103
16306
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ConfirmComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
16104
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: ConfirmComponent, isStandalone: true, selector: "m-confirm", inputs: { header: { classPropertyName: "header", publicName: "header", isSignal: true, isRequired: false, transformFunction: null }, body: { classPropertyName: "body", publicName: "body", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
16307
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: ConfirmComponent, isStandalone: true, selector: "m-confirm", inputs: { header: { classPropertyName: "header", publicName: "header", isSignal: true, isRequired: false, transformFunction: null }, body: { classPropertyName: "body", publicName: "body", isSignal: true, isRequired: false, transformFunction: null }, params: { classPropertyName: "params", publicName: "params", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, kind: { classPropertyName: "kind", publicName: "kind", isSignal: true, isRequired: false, transformFunction: null }, confirmLabel: { classPropertyName: "confirmLabel", publicName: "confirmLabel", isSignal: true, isRequired: false, transformFunction: null }, cancelLabel: { classPropertyName: "cancelLabel", publicName: "cancelLabel", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
16105
16308
  <div class="confirm confirm--{{ type() }}">
16106
16309
  <div class="confirm__header">
16107
16310
  <div class="confirm__icon">
16108
16311
  <m-icon [name]="iconName()" />
16109
16312
  </div>
16110
16313
  @if (header()) {
16111
- <m-header [level]="3">{{ header() | translate }}</m-header>
16314
+ <!-- The heading takes the key and its values rather than projected
16315
+ text: m-header translates its own label, and a MessageVariable
16316
+ fills the same way it does everywhere else. -->
16317
+ <m-header [level]="3" [label]="header()" [params]="params()" />
16112
16318
  }
16113
16319
  </div>
16114
16320
 
16115
16321
  <div class="confirm__content">
16116
16322
  @if (body()) {
16117
- <p class="confirm__body" [innerHTML]="body() | translate"></p>
16323
+ <p class="confirm__body" [innerHTML]="body() | translate: params()"></p>
16118
16324
  }
16119
16325
  </div>
16120
16326
 
16121
16327
  <div class="confirm__actions">
16122
- <m-one-button name="okay" (clicked)="accept()" />
16328
+ @if (kind() === 'yes-no') {
16329
+ <!-- asset: buttons/confirm_cancel.yml -->
16330
+ <m-one-button name="confirm_cancel" [label]="cancelText()" (clicked)="decline()" />
16331
+ }
16332
+ <!-- asset: buttons/okay.yml -->
16333
+ <m-one-button name="okay" [label]="confirmText()" (clicked)="accept()" />
16123
16334
  </div>
16124
16335
  </div>
16125
16336
  `, 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)}}.confirm{display:flex;flex-direction:column;min-width:320px;max-width:440px;padding:2.5rem;background:var(--m-backdrop-modal, rgba(255, 255, 255, .85));backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border:0;position:relative;overflow:hidden}.confirm__header{display:flex;flex-direction:column;align-items:center;text-align:center;gap:.9375rem;margin-bottom:1.5rem}.confirm__icon{width:64px;height:64px;border-radius:1.6rem;display:flex;align-items:center;justify-content:center;font-size:2rem;background:var(--m-backdrop-mm, rgba(65, 105, 225, .1));color:var(--m-mm, #4169e1)}.confirm__icon .m-icon{width:32px;height:32px}.confirm__title{margin:0;font-size:1.375rem;font-weight:700;color:var(--m-text-900);letter-spacing:-.02em}.confirm__content{text-align:center;margin-bottom:2rem}.confirm__body{margin:0;font-size:1rem;line-height:1.6;color:var(--m-text-600)}.confirm__actions{width:100%;margin-top:auto;display:flex;justify-content:center;gap:1rem}.confirm--danger .confirm__icon{background:var(--m-backdrop-error, rgba(235, 25, 26, .1));color:var(--m-error, #EB191A)}.confirm--warning .confirm__icon{background:var(--m-backdrop-warning, rgba(247, 122, 2, .1));color:var(--m-warning, #F77A02)}.confirm--success .confirm__icon{background:var(--m-backdrop-success, rgba(109, 168, 47, .1));color:var(--m-success, #6da82f)}.confirm--info .confirm__icon{background:var(--m-info-lite, rgba(3, 102, 214, .1));color:var(--m-info, #0366d6)}\n"], dependencies: [{ 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: "component", type: IconComponent, selector: "m-icon, m-one-icon", inputs: ["config", "name", "color", "size", "one", "baseUrl", "remote"], outputs: ["configChange"] }, { kind: "component", type: HeaderComponent$1, selector: "m-header", inputs: ["level", "label", "actionButton", "actionLabel", "noTranslate", "params"], outputs: ["actionClick"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
@@ -16133,22 +16344,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
16133
16344
  <m-icon [name]="iconName()" />
16134
16345
  </div>
16135
16346
  @if (header()) {
16136
- <m-header [level]="3">{{ header() | translate }}</m-header>
16347
+ <!-- The heading takes the key and its values rather than projected
16348
+ text: m-header translates its own label, and a MessageVariable
16349
+ fills the same way it does everywhere else. -->
16350
+ <m-header [level]="3" [label]="header()" [params]="params()" />
16137
16351
  }
16138
16352
  </div>
16139
16353
 
16140
16354
  <div class="confirm__content">
16141
16355
  @if (body()) {
16142
- <p class="confirm__body" [innerHTML]="body() | translate"></p>
16356
+ <p class="confirm__body" [innerHTML]="body() | translate: params()"></p>
16143
16357
  }
16144
16358
  </div>
16145
16359
 
16146
16360
  <div class="confirm__actions">
16147
- <m-one-button name="okay" (clicked)="accept()" />
16361
+ @if (kind() === 'yes-no') {
16362
+ <!-- asset: buttons/confirm_cancel.yml -->
16363
+ <m-one-button name="confirm_cancel" [label]="cancelText()" (clicked)="decline()" />
16364
+ }
16365
+ <!-- asset: buttons/okay.yml -->
16366
+ <m-one-button name="okay" [label]="confirmText()" (clicked)="accept()" />
16148
16367
  </div>
16149
16368
  </div>
16150
16369
  `, changeDetection: ChangeDetectionStrategy.OnPush, 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)}}.confirm{display:flex;flex-direction:column;min-width:320px;max-width:440px;padding:2.5rem;background:var(--m-backdrop-modal, rgba(255, 255, 255, .85));backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border:0;position:relative;overflow:hidden}.confirm__header{display:flex;flex-direction:column;align-items:center;text-align:center;gap:.9375rem;margin-bottom:1.5rem}.confirm__icon{width:64px;height:64px;border-radius:1.6rem;display:flex;align-items:center;justify-content:center;font-size:2rem;background:var(--m-backdrop-mm, rgba(65, 105, 225, .1));color:var(--m-mm, #4169e1)}.confirm__icon .m-icon{width:32px;height:32px}.confirm__title{margin:0;font-size:1.375rem;font-weight:700;color:var(--m-text-900);letter-spacing:-.02em}.confirm__content{text-align:center;margin-bottom:2rem}.confirm__body{margin:0;font-size:1rem;line-height:1.6;color:var(--m-text-600)}.confirm__actions{width:100%;margin-top:auto;display:flex;justify-content:center;gap:1rem}.confirm--danger .confirm__icon{background:var(--m-backdrop-error, rgba(235, 25, 26, .1));color:var(--m-error, #EB191A)}.confirm--warning .confirm__icon{background:var(--m-backdrop-warning, rgba(247, 122, 2, .1));color:var(--m-warning, #F77A02)}.confirm--success .confirm__icon{background:var(--m-backdrop-success, rgba(109, 168, 47, .1));color:var(--m-success, #6da82f)}.confirm--info .confirm__icon{background:var(--m-info-lite, rgba(3, 102, 214, .1));color:var(--m-info, #0366d6)}\n"] }]
16151
- }], propDecorators: { header: [{ type: i0.Input, args: [{ isSignal: true, alias: "header", required: false }] }], body: [{ type: i0.Input, args: [{ isSignal: true, alias: "body", required: false }] }], type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }] } });
16370
+ }], propDecorators: { header: [{ type: i0.Input, args: [{ isSignal: true, alias: "header", required: false }] }], body: [{ type: i0.Input, args: [{ isSignal: true, alias: "body", required: false }] }], params: [{ type: i0.Input, args: [{ isSignal: true, alias: "params", required: false }] }], type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }], kind: [{ type: i0.Input, args: [{ isSignal: true, alias: "kind", required: false }] }], confirmLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "confirmLabel", required: false }] }], cancelLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "cancelLabel", required: false }] }] } });
16152
16371
 
16153
16372
  function injectInstallApp() {
16154
16373
  const modalStore = inject(ModalStore);
@@ -20068,7 +20287,7 @@ class WrapperInputComponent extends ConfigComponent {
20068
20287
  break;
20069
20288
  }
20070
20289
  case InputType.TOGGLE: {
20071
- const { ToggleInputComponent } = await import('./magmonium-one-toggle-xObigfCF.mjs');
20290
+ const { ToggleInputComponent } = await import('./magmonium-one-toggle-wEeMiUQz.mjs');
20072
20291
  this.createDynamicComponent(seq, ToggleInputComponent, [], true);
20073
20292
  break;
20074
20293
  }
@@ -20080,12 +20299,12 @@ class WrapperInputComponent extends ConfigComponent {
20080
20299
  break;
20081
20300
  }
20082
20301
  case InputType.PASSWORD: {
20083
- const { PasswordInputComponent } = await import('./magmonium-one-password-CIGsSlR_.mjs');
20302
+ const { PasswordInputComponent } = await import('./magmonium-one-password-DmEMAVca.mjs');
20084
20303
  this.createDynamicComponent(seq, PasswordInputComponent);
20085
20304
  break;
20086
20305
  }
20087
20306
  case InputType.OTP: {
20088
- const { OtpInputComponent } = await import('./magmonium-one-otp-ozxzDST4.mjs');
20307
+ const { OtpInputComponent } = await import('./magmonium-one-otp-JmUyDNPb.mjs');
20089
20308
  this.createDynamicComponent(seq, OtpInputComponent);
20090
20309
  break;
20091
20310
  }
@@ -34304,5 +34523,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
34304
34523
  * Generated bundle index. Do not edit.
34305
34524
  */
34306
34525
 
34307
- export { DEFAULT_NAV_SEGMENT 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, NAV_ID_SEP as a$, DEFAULT_SIZE as a0, DashboardCardComponent as a1, DateInputComponent as a2, DatePickerComponent as a3, DeviceService as a4, DomService as a5, Domain as a6, DotGridComponent as a7, DragListDirective as a8, DragListItemDirective as a9, InstrumentScoreComponent as aA, InterceptorObservables as aB, JumbotronComponent as aC, KeyValueComponent as aD, LAYOUT_ASSET_FOLDER as aE, LOGIN_COMPONENT as aF, LOGIN_STORE as aG, LanguageComponent as aH, LogoComponent as aI, MAG_SOCKET_EVENT as aJ, MHeroColorDirective as aK, MHeroComponent as aL, MODAL_REF as aM, MODAL_STORE_REF as aN, MRefDirective as aO, MStepComponent as aP, MURL_PARAM as aQ, MURL_SEP as aR, ManifestEnrichmentService as aS, MenuComponent as aT, ModalDirective as aU, ModalRef as aV, ModalStore as aW, MoneyPipe as aX, MultiRangeInputComponent as aY, MurlUrlSerializer as aZ, NAV_DEFAULT_MURL as a_, DraggableDirective as aa, DropdownInputComponent as ab, FILTER_GROUP_CONTEXT as ac, FILTER_RANGE_MODES as ad, FILTER_VARIANTS as ae, FLEX_VARIANTS as af, FOLDER_PICK_LISTENER as ag, FORM_ASSET_FOLDER as ah, FileService as ai, FileUploadDirective as aj, FileUploadInputComponent as ak, FlexComponent as al, FlexItemComponent as am, FormGroupComponent as an, FrameComponent as ao, FreezeService as ap, GRID_BREAKPOINTS as aq, GetNavService as ar, HeaderComponent$1 as as, HighlightDirective as at, HttpService as au, ICON_SOURCE as av, IS_SIDE_PANEL as aw, IconComponent as ax, ImgComponent as ay, InputType as az, TextOutputComponent as b, SectionBadgesComponent as b$, NAV_MAIN_BUTTONS as b0, NAV_SEGMENT_RE as b1, NAV_STORE_REF as b2, NAV_WC_COMPONENTS as b3, NAV_WIDGET_MAP as b4, NavComponent as b5, NavDetailsComponent as b6, NavHeaderComponent as b7, NavMenuComponent as b8, NavStore as b9, PwaInstallComponent as bA, ROOT_NAV$1 as bB, RadioGroupComponent as bC, RadioInputComponent as bD, RangeInputComponent as bE, RatingInputComponent as bF, ReactiveElementComponent as bG, RemoteComponent as bH, RemoteLoaderService as bI, ResizeElementComponent as bJ, RouteContainer as bK, RowComponent as bL, SEARCH_QUERY as bM, SEARCH_RESULTS_EVENT as bN, SECTION_ACCORDION_GROUP as bO, SECTION_FORM_CONTEXT as bP, SHARED_ICONS as bQ, SIZE_CONTEXT as bR, ScoreComponent as bS, ScrollComponent as bT, ScrollService as bU, SearchPanelComponent as bV, SearchStore as bW, SearchUserPanelComponent as bX, SectionAccordionDirective as bY, SectionAccordionGroupDirective as bZ, SectionBackComponent as b_, NavTrailComponent as ba, NothingComponent as bb, NotificationElementComponent as bc, NotificationGroupComponent as bd, NotificationPopupComponent as be, NotificationService as bf, NotificationStore as bg, NotificationType as bh, NotificationWidgetComponent as bi, ONE_ASSET_BASE_URL as bj, OPTIONS_SOURCE as bk, OVERLAY_WIDGETS as bl, OneApp as bm, OptionsSourceDirective as bn, OverlayBodyComponent as bo, OverlayRef as bp, OverlayService as bq, PLATFORM_BUTTON_NAV_IDS as br, PLATFORM_EXTENSIBLE_NAV_IDS as bs, PLATFORM_NAV_MAP as bt, PLATFORM_ROOT_CHILDREN as bu, PaginationComponent as bv, PanelComponent as bw, PercentagePipe as bx, PlaygroundComponent as by, PositionDirective as bz, ButtonComponent as c, UlComponent as c$, SectionButtonGroupComponent as c0, SectionCardComponent as c1, SectionCarouselComponent as c2, SectionComponent as c3, SectionFilterComponent as c4, SectionFilterGroupComponent as c5, SectionFilterMenuComponent as c6, SectionFilterPanelComponent as c7, SectionFilterRangePanelComponent as c8, SectionFooterComponent as c9, StrokeLinejoin as cA, SummaryComponent as cB, SvgGeneratorComponent as cC, SvgGeneratorService as cD, SvgService as cE, TOTAL_COLUMNS as cF, TRANSLATION_SOURCE as cG, TableComponent as cH, TechnicalMeterComponent as cI, TextInputComponent as cJ, TextareaInputComponent as cK, ThemeComponent as cL, ThemeDataService as cM, ThemeService as cN, ThemeStore as cO, TimeAgoPipe as cP, TimelineComponent as cQ, ToggleButtonComponent as cR, ToggleInputComponent as cS, ToggleRadioInputComponent as cT, ToolTipDirective as cU, TooltipComponent as cV, TranslateService as cW, TreeGridComponent as cX, URL_SEP as cY, USER_STORE_REF as cZ, USER_TAB_MAP as c_, SectionFormComponent as ca, SectionFormItemComponent as cb, SectionHeaderComponent as cc, SectionHeroComponent as cd, SectionPaginationComponent as ce, SectionSearchComponent as cf, SectionStepperComponent as cg, SectionTabsComponent as ch, SectionToggleComponent as ci, SectionToggleItemDirective as cj, SelectableCardInputComponent as ck, SelectorDirective as cl, SettingsSearchBarComponent as cm, SettingsSearchService as cn, ShapeComponent as co, SharedStoreRegistry as cp, SidePanelDirective as cq, Size as cr, SocketStore as cs, SortComponent as ct, StatComponent as cu, StepComponent as cv, StepperComponent as cw, StepsComponent as cx, StorageService as cy, StrokeLinecap as cz, APP_CONTEXT_REF as d, hexToRgb as d$, UniverseComponent as d0, UserApiService as d1, UserAvatarComponent as d2, UserComponent as d3, UserNavComponent as d4, UserSettingsComponent as d5, UserStore as d6, WC_ROUTE_CHANGED_EVENT as d7, WC_SEARCH_GROUPS as d8, WIN_USER_TAB_HOOK as d9, evaluate as dA, evaluateBool as dB, filterHoldsList as dC, filterHoldsOneBound as dD, filterHoldsOptions as dE, filterHoldsRange as dF, filterList as dG, filterOne as dH, filterPanelOf as dI, filterPanelWidth as dJ, filterRange as dK, filterTreeGridRows as dL, filterValueList as dM, filterValues as dN, flattenTreeGridRows as dO, formatBadgeCount as dP, fullName as dQ, generateClipPath as dR, generateTransform as dS, getClassList as dT, getProperty as dU, getScrollParent as dV, getTierFromPreviewPath as dW, getTreeGridRow as dX, getUniqueId as dY, getValue as dZ, hasErrorComputed as d_, WIN_USER_TAB_KEY as da, WatermarkComponent as db, WcRouterStore as dc, WrapperInputComponent as dd, anchorNavId as de, applyColorsToElement as df, bootstrapMagApp as dg, bootstrapPwaInstall as dh, buildWcBaseUrl as di, calculateLuminance as dj, calculateRanks as dk, cellText as dl, checkFilterCondition as dm, childNavId as dn, classListSignal as dp, coerceSize as dq, cornerEdge as dr, cornerSide as ds, createMap as dt, createPlatformNavMap as du, deriveAvatarGradient as dv, deriveContrastColor as dw, deriveOppositeColor as dx, derivePropertyName as dy, emailValidation as dz, ASSET_BASE_URL as e, provideSizeContext as e$, hslToRgb$1 as e0, initMagmoniumApp as e1, initialNotificationState as e2, initialState$2 as e3, initials as e4, injectAuthenticate as e5, injectInstallApp as e6, injectParentSize as e7, injectScrollSticky as e8, isButtonName as e9, minValidation as eA, miniMarkToHtml as eB, navIdChain as eC, navIdFor as eD, navIdSegment as eE, navIdToRoutePath as eF, navIdToSegments as eG, navToId as eH, parentNavId as eI, parseAddress as eJ, parseColor as eK, parsePatternNames as eL, patternValidation as eM, patternsValidation as eN, platformNavWidgets as eO, privateGuard as eP, processImageToSvg as eQ, provideAppContext as eR, provideMagAppConfig as eS, provideMagWcConfig as eT, provideMagWcRoutes as eU, provideModalComponents as eV, provideMurlUrlSerializer as eW, provideNavWidgets as eX, provideOverlayWidgets as eY, providePlatformNavWidgets as eZ, provideSearch as e_, isCancelledComputed as ea, isExtensiblePlatformNavId as eb, isJson as ec, isLoadingComputed as ed, isLocalhost as ee, isPlatformNavId as ef, isSize as eg, isTierPreview as eh, isUrlLocalhost as ei, isValidNavId as ej, isValidNavSegment as ek, isWebComponent as el, linkToId as em, linkToNav as en, loadingActions as eo, mInterceptor as ep, manualValidation as eq, matchFieldValidation as er, maxLengthValidation as es, maxValidation as et, mergePlatformNav as eu, mergeUnique as ev, mergeUniqueBy as ew, mergeUniqueWith as ex, minAgeValidation as ey, minLengthValidation as ez, AccordionBodyDirective as f, provideUserTabs as f0, publicGuard as f1, readFieldPatterns as f2, renderAddress as f3, requiredValidation as f4, resolveConfigAsset as f5, resolveIconSize as f6, resolvePallet as f7, resolvePatternRules as f8, resolveSize as f9, rgbToHex as fa, rgbToHsl as fb, rowHasChildren as fc, samePatterns as fd, segmentsToNavId as fe, setProperty as ff, setTreeGridChildren as fg, settingsWidgets as fh, shouldShowBadge as fi, splitNavId as fj, splitOnMatch as fk, stringToColor as fl, toAttrBool as fm, toAttrNumber as fn, toCssLength as fo, toHostNavId as fp, toLength$1 as fq, toLocalNavId as fr, toggleTreeGridRow as fs, unfetchedPlatformNav as ft, urlValidation as fu, 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 };
34308
- //# sourceMappingURL=magmonium-one-magmonium-one-Byxgogqv.mjs.map
34526
+ 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, NAV_DEFAULT_MURL 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, LogoComponent as aJ, MAG_SOCKET_EVENT as aK, MHeroColorDirective as aL, MHeroComponent as aM, MODAL_REF as aN, MODAL_STORE_REF as aO, MRefDirective as aP, MStepComponent as aQ, MURL_PARAM as aR, MURL_SEP as aS, ManifestEnrichmentService as aT, MenuComponent as aU, ModalDirective as aV, ModalRef as aW, ModalStore as aX, MoneyPipe as aY, MultiRangeInputComponent as aZ, MurlUrlSerializer 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, SectionBackComponent as b$, NAV_ID_SEP as b0, NAV_MAIN_BUTTONS as b1, NAV_SEGMENT_RE as b2, NAV_STORE_REF as b3, NAV_WC_COMPONENTS as b4, NAV_WIDGET_MAP as b5, NavComponent as b6, NavDetailsComponent as b7, NavHeaderComponent as b8, NavMenuComponent as b9, PositionDirective as bA, PwaInstallComponent as bB, ROOT_NAV$1 as bC, RadioGroupComponent as bD, RadioInputComponent as bE, RangeInputComponent as bF, RatingInputComponent as bG, ReactiveElementComponent as bH, RemoteComponent as bI, RemoteLoaderService as bJ, ResizeElementComponent as bK, RouteContainer as bL, RowComponent as bM, SEARCH_QUERY as bN, SEARCH_RESULTS_EVENT as bO, SECTION_ACCORDION_GROUP as bP, SECTION_FORM_CONTEXT as bQ, SHARED_ICONS as bR, SIZE_CONTEXT as bS, ScoreComponent as bT, ScrollComponent as bU, ScrollService as bV, SearchPanelComponent as bW, SearchStore as bX, SearchUserPanelComponent as bY, SectionAccordionDirective as bZ, SectionAccordionGroupDirective as b_, NavStore as ba, NavTrailComponent as bb, NothingComponent as bc, NotificationElementComponent as bd, NotificationGroupComponent as be, NotificationPopupComponent as bf, NotificationService as bg, NotificationStore as bh, NotificationType as bi, NotificationWidgetComponent as bj, ONE_ASSET_BASE_URL as bk, OPTIONS_SOURCE as bl, OVERLAY_WIDGETS as bm, OneApp as bn, OptionsSourceDirective as bo, OverlayBodyComponent as bp, OverlayRef as bq, OverlayService as br, PLATFORM_BUTTON_NAV_IDS as bs, PLATFORM_EXTENSIBLE_NAV_IDS as bt, PLATFORM_NAV_MAP as bu, PLATFORM_ROOT_CHILDREN as bv, PaginationComponent as bw, PanelComponent as bx, PercentagePipe as by, PlaygroundComponent as bz, ButtonComponent as c, USER_TAB_MAP as c$, SectionBadgesComponent as c0, SectionButtonGroupComponent as c1, SectionCardComponent as c2, SectionCarouselComponent as c3, SectionComponent as c4, SectionFilterComponent as c5, SectionFilterGroupComponent as c6, SectionFilterMenuComponent as c7, SectionFilterPanelComponent as c8, SectionFilterRangePanelComponent as c9, StrokeLinecap as cA, StrokeLinejoin as cB, SummaryComponent as cC, SvgGeneratorComponent as cD, SvgGeneratorService as cE, SvgService as cF, TOTAL_COLUMNS as cG, TRANSLATION_SOURCE as cH, TableComponent as cI, TechnicalMeterComponent as cJ, TextInputComponent as cK, TextareaInputComponent as cL, ThemeComponent as cM, ThemeDataService as cN, ThemeService as cO, ThemeStore as cP, TimeAgoPipe as cQ, TimelineComponent as cR, ToggleButtonComponent as cS, ToggleInputComponent as cT, ToggleRadioInputComponent as cU, ToolTipDirective as cV, TooltipComponent as cW, TranslateService as cX, TreeGridComponent as cY, URL_SEP as cZ, USER_STORE_REF as c_, SectionFooterComponent as ca, SectionFormComponent as cb, SectionFormItemComponent as cc, SectionHeaderComponent as cd, SectionHeroComponent as ce, SectionPaginationComponent as cf, SectionSearchComponent as cg, SectionStepperComponent as ch, SectionTabsComponent as ci, SectionToggleComponent as cj, SectionToggleItemDirective as ck, SelectableCardInputComponent as cl, SelectorDirective as cm, SettingsSearchBarComponent as cn, SettingsSearchService as co, ShapeComponent as cp, SharedStoreRegistry as cq, SidePanelDirective as cr, Size as cs, SocketStore as ct, SortComponent as cu, StatComponent as cv, StepComponent as cw, StepperComponent as cx, StepsComponent as cy, StorageService as cz, APP_CONTEXT_REF as d, hasErrorComputed as d$, UlComponent 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, emailValidation as dA, evaluate as dB, evaluateBool as dC, filterHoldsList as dD, filterHoldsOneBound as dE, filterHoldsOptions as dF, filterHoldsRange as dG, filterList as dH, filterOne as dI, filterPanelOf as dJ, filterPanelWidth as dK, filterRange as dL, filterTreeGridRows as dM, filterValueList as dN, filterValues as dO, flattenTreeGridRows as dP, formatBadgeCount as dQ, fullName as dR, generateClipPath as dS, generateTransform as dT, getClassList as dU, getProperty as dV, getScrollParent as dW, getTierFromPreviewPath as dX, getTreeGridRow as dY, getUniqueId as dZ, getValue 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, bootstrapMagApp as dh, bootstrapPwaInstall as di, buildWcBaseUrl as dj, calculateLuminance as dk, calculateRanks as dl, cellText as dm, checkFilterCondition as dn, childNavId as dp, classListSignal as dq, coerceSize as dr, cornerEdge as ds, cornerSide as dt, createMap as du, createPlatformNavMap as dv, deriveAvatarGradient as dw, deriveContrastColor as dx, deriveOppositeColor as dy, derivePropertyName as dz, ASSET_BASE_URL as e, provideNavWidgets as e$, hexToRgb as e0, hslToRgb$1 as e1, initMagmoniumApp as e2, initialNotificationState as e3, initialState$2 as e4, initials as e5, injectAuthenticate as e6, injectInstallApp as e7, injectParentSize as e8, injectScrollSticky as e9, mergeUniqueWith as eA, minAgeValidation as eB, minLengthValidation as eC, minValidation as eD, miniMarkToHtml as eE, navIdChain as eF, navIdFor as eG, navIdSegment as eH, navIdToRoutePath as eI, navIdToSegments as eJ, navParamOf as eK, navToId as eL, parentNavId as eM, parseAddress as eN, parseColor as eO, parsePatternNames as eP, patternValidation as eQ, patternsValidation as eR, platformNavWidgets as eS, privateGuard as eT, processImageToSvg as eU, provideAppContext as eV, provideMagAppConfig as eW, provideMagWcConfig as eX, provideMagWcRoutes as eY, provideModalComponents as eZ, provideMurlUrlSerializer as e_, isButtonName as ea, isCancelledComputed as eb, isExtensiblePlatformNavId as ec, isJson as ed, isLoadingComputed as ee, isLocalhost as ef, isNavMenuConfig as eg, isNavRowsConfig as eh, isPlatformNavId as ei, isSize as ej, isTierPreview as ek, isUrlLocalhost as el, isValidNavId as em, isValidNavSegment as en, isWebComponent as eo, linkToId as ep, linkToNav as eq, loadingActions as er, mInterceptor as es, manualValidation as et, matchFieldValidation as eu, maxLengthValidation as ev, maxValidation as ew, mergePlatformNav as ex, mergeUnique as ey, mergeUniqueBy as ez, AccordionBodyDirective as f, provideOverlayWidgets as f0, providePlatformNavWidgets as f1, provideSearch as f2, provideSizeContext as f3, provideUserTabs as f4, publicGuard as f5, readFieldPatterns as f6, renderAddress as f7, requiredValidation as f8, resolveConfigAsset as f9, resolveIconSize as fa, resolvePallet as fb, resolvePatternRules as fc, resolveSize as fd, rgbToHex as fe, rgbToHsl as ff, rowHasChildren as fg, samePatterns as fh, segmentsToNavId as fi, setProperty as fj, setTreeGridChildren as fk, settingsWidgets as fl, shouldShowBadge as fm, splitNavId as fn, splitOnMatch as fo, stringToColor as fp, toAttrBool as fq, toAttrNumber as fr, toCssLength as fs, toHostNavId as ft, toLength$1 as fu, toLocalNavId as fv, toggleTreeGridRow as fw, unfetchedPlatformNav as fx, urlValidation as fy, 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 };
34527
+ //# sourceMappingURL=magmonium-one-magmonium-one-BOkBE_Fl.mjs.map