@magmonium/one 0.4.18 → 0.4.20

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,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, signal, inject, Injectable, DestroyRef, linkedSignal, computed, DOCUMENT, ApplicationRef, RendererFactory2, createComponent, EnvironmentInjector, Pipe, ChangeDetectorRef, untracked, ElementRef, afterNextRender, input, ChangeDetectionStrategy, Component, effect, Injector, reflectComponentType, inputBinding, model, HostListener, Renderer2, Directive, output, viewChild, ViewEncapsulation, forwardRef, Input, booleanAttribute, afterRenderEffect, outputBinding, twoWayBinding, runInInjectionContext, contentChild, TemplateRef, contentChildren, ViewContainerRef, HostAttributeToken, viewChildren, afterEveryRender, EventEmitter, Output, ViewChild, ContentChild, provideZonelessChangeDetection, makeEnvironmentProviders, HostBinding, provideAppInitializer, provideBrowserGlobalErrorListeners, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
2
+ import { InjectionToken, signal, inject, Injectable, DestroyRef, linkedSignal, computed, DOCUMENT, ApplicationRef, RendererFactory2, createComponent, EnvironmentInjector, Pipe, ChangeDetectorRef, untracked, ElementRef, afterNextRender, input, ChangeDetectionStrategy, Component, effect, Injector, reflectComponentType, inputBinding, model, HostListener, Renderer2, Directive, output, viewChild, ViewEncapsulation, forwardRef, Input, booleanAttribute, afterRenderEffect, outputBinding, twoWayBinding, runInInjectionContext, contentChild, TemplateRef, contentChildren, ViewContainerRef, HostAttributeToken, viewChildren, afterEveryRender, EventEmitter, Output, ViewChild, numberAttribute, ContentChild, provideZonelessChangeDetection, makeEnvironmentProviders, HostBinding, provideAppInitializer, provideBrowserGlobalErrorListeners, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
3
3
  import { HttpClient, HttpParams, HttpErrorResponse, provideHttpClient, withFetch, withInterceptors } from '@angular/common/http';
4
4
  import { firstValueFrom, of, tap, catchError, throwError, shareReplay, finalize, forkJoin, map, Observable, pipe, interval, fromEvent, switchMap as switchMap$1, filter, Subject, EMPTY, from, combineLatest, race, take, startWith } from 'rxjs';
5
5
  import { rxResource, toObservable, toSignal, takeUntilDestroyed } from '@angular/core/rxjs-interop';
@@ -109,6 +109,12 @@ const APP_CONTEXT_REF = new InjectionToken('APP_CONTEXT_REF');
109
109
  * 0007) and init asks for Agreement to it.
110
110
  */
111
111
  const APP_LINK = new InjectionToken('APP_LINK', { providedIn: 'root', factory: () => signal(undefined) });
112
+ /**
113
+ * The loading counter this application's requests move, ahead of the host's
114
+ * shared one. A Plugin provides its own so its requests never turn the host's
115
+ * `busy` on (libs/one CONTEXT.md Plugin); unset, the host's counter is used.
116
+ */
117
+ const LOADING_ACTIONS_REF = new InjectionToken('LOADING_ACTIONS_REF');
112
118
  const IS_SIDE_PANEL = new InjectionToken('IS_SIDE_PANEL');
113
119
  // SVG markup supplied by name from memory instead of fetched as an asset.
114
120
  // `m-icon` reads it before its own resource, so a glyph that exists only in a
@@ -190,6 +196,32 @@ function setWcTier(remoteId, tier) {
190
196
  delete tiers[remoteId];
191
197
  win.__MAGMONIUM_WC_TIERS__ = tiers;
192
198
  }
199
+ /** Pins an AppLink's `local` tier to a dev-server port, or unpins it. */
200
+ function setWcLocalPort(remoteId, port) {
201
+ const win = tierWindow();
202
+ if (!win)
203
+ return;
204
+ const ports = { ...(win.__MAGMONIUM_WC_LOCAL_PORTS__ ?? {}) };
205
+ if (port)
206
+ ports[remoteId] = port;
207
+ else
208
+ delete ports[remoteId];
209
+ win.__MAGMONIUM_WC_LOCAL_PORTS__ = ports;
210
+ }
211
+ /**
212
+ * Where an AppLink pinned to `local` is served: the app's own dev server, whose
213
+ * `assets/` holds `remote/app-wc.json`, the bundle and every asset. Undefined
214
+ * when it is not pinned there, or has no usable port.
215
+ */
216
+ function wcLocalBaseOf(remoteId) {
217
+ const win = tierWindow();
218
+ if (win?.__MAGMONIUM_WC_TIERS__?.[remoteId] !== 'local')
219
+ return undefined;
220
+ const port = win.__MAGMONIUM_WC_LOCAL_PORTS__?.[remoteId];
221
+ return port && Number.isInteger(port) && port > 0 && port < 65536
222
+ ? `http://localhost:${port}/assets`
223
+ : undefined;
224
+ }
193
225
  function wcTierOf(remoteId) {
194
226
  return tierWindow()?.__MAGMONIUM_WC_TIERS__?.[remoteId];
195
227
  }
@@ -207,6 +239,10 @@ function recordDefinedWcTier(selector, tier) {
207
239
  };
208
240
  }
209
241
  function buildWcBaseUrl(apiUrl, remoteId) {
242
+ // Asked for by name, so it wins over every guess below.
243
+ const local = wcLocalBaseOf(remoteId);
244
+ if (local)
245
+ return local;
210
246
  if (tierWindow()?.__MAGMONIUM_STANDALONE__) {
211
247
  return '/assets';
212
248
  }
@@ -214,7 +250,7 @@ function buildWcBaseUrl(apiUrl, remoteId) {
214
250
  return `/local-dist/m-${remoteId}-wc`;
215
251
  }
216
252
  const tier = wcTierOf(remoteId);
217
- return `${apiUrl}/store/v1/wc/${remoteId}${tier ? `/${tier}` : ''}`;
253
+ return `${apiUrl}/store/v1/wc/${remoteId}${tier === 'beta' ? '/beta' : ''}`;
218
254
  }
219
255
 
220
256
  /** Access domains — routed to Auth URL when it differs from Backend URL (ADR 0012). */
@@ -306,11 +342,14 @@ class HttpService {
306
342
  return this.http.get(url, { responseType: 'text' });
307
343
  }
308
344
  wc(link, filePath) {
345
+ const local = wcLocalBaseOf(link);
346
+ if (local)
347
+ return this.http.get(`${local}/${filePath.join('/')}`);
309
348
  if (isLocalhost) {
310
349
  return this.http.get(`/local-dist/m-${link}-wc/${filePath.join('/')}`);
311
350
  }
312
351
  const tier = wcTierOf(link);
313
- return this.get('store', ['wc', link, ...(tier ? [tier] : []), ...filePath]);
352
+ return this.get('store', ['wc', link, ...(tier === 'beta' ? [tier] : []), ...filePath]);
314
353
  }
315
354
  buildWcUrl(link) {
316
355
  return buildWcBaseUrl(this.url, link);
@@ -2869,13 +2908,23 @@ const GRID_BREAKPOINTS = {
2869
2908
  xxl: 1400,
2870
2909
  };
2871
2910
 
2872
- const loadingSignal = signal({
2873
- requestCount: 0,
2874
- }, ...(ngDevMode ? [{ debugName: "loadingSignal" }] : /* istanbul ignore next */ []));
2875
- const isLoadingComputed = computed(() => loadingSignal().requestCount > 0, ...(ngDevMode ? [{ debugName: "isLoadingComputed" }] : /* istanbul ignore next */ []));
2876
- const hasErrorComputed = computed(() => !!loadingSignal().error, ...(ngDevMode ? [{ debugName: "hasErrorComputed" }] : /* istanbul ignore next */ []));
2877
- const isCancelledComputed = computed(() => !!loadingSignal().cancelled, ...(ngDevMode ? [{ debugName: "isCancelledComputed" }] : /* istanbul ignore next */ []));
2878
- const loadingActions = {
2911
+ /**
2912
+ * One loading counter and the actions that move it. The module's own is the
2913
+ * app-wide one every Screen's `busy` reads; a Plugin makes another so its
2914
+ * requests never move it (libs/one CONTEXT.md Plugin).
2915
+ */
2916
+ function createLoadingState() {
2917
+ const loadingSignal = signal({
2918
+ requestCount: 0,
2919
+ }, ...(ngDevMode ? [{ debugName: "loadingSignal" }] : /* istanbul ignore next */ []));
2920
+ return {
2921
+ isLoading: computed(() => loadingSignal().requestCount > 0),
2922
+ hasError: computed(() => !!loadingSignal().error),
2923
+ isCancelled: computed(() => !!loadingSignal().cancelled),
2924
+ actions: createLoadingActions(loadingSignal),
2925
+ };
2926
+ }
2927
+ const createLoadingActions = (loadingSignal) => ({
2879
2928
  // Synchronous, where stopLoading is deferred. Deferring both collapsed a fast
2880
2929
  // or cached response into one microtask batch — the count went 0 → 1 → 0 with
2881
2930
  // no change detection in between, so the overlay never rendered a frame. The
@@ -2944,7 +2993,12 @@ const loadingActions = {
2944
2993
  });
2945
2994
  });
2946
2995
  },
2947
- };
2996
+ });
2997
+ const appLoading = createLoadingState();
2998
+ const isLoadingComputed = appLoading.isLoading;
2999
+ const hasErrorComputed = appLoading.hasError;
3000
+ const isCancelledComputed = appLoading.isCancelled;
3001
+ const loadingActions = appLoading.actions;
2948
3002
 
2949
3003
  function classListSignal(element) {
2950
3004
  const classSignal = signal(Array.from(element.classList), ...(ngDevMode ? [{ debugName: "classSignal" }] : /* istanbul ignore next */ []));
@@ -4036,9 +4090,9 @@ const isDefaultNav = (navId) => navIdSegment(navId) === DEFAULT_NAV_SEGMENT;
4036
4090
  * landing on `root_app_default` is standing on `root_app`, and the panel says
4037
4091
  * so rather than naming a segment that is on no menu.
4038
4092
  */
4039
- const visibleNavId = (navId) => {
4093
+ const visibleNavId = (navId, transparent = EMPTY_HIDDEN) => {
4040
4094
  let id = navId;
4041
- while (id !== ROOT_NAV$1 && isDefaultNav(id))
4095
+ while (id !== ROOT_NAV$1 && (isDefaultNav(id) || transparent.has(id)))
4042
4096
  id = parentNavId(id) ?? ROOT_NAV$1;
4043
4097
  return id;
4044
4098
  };
@@ -4059,6 +4113,12 @@ const childIdsOf = (navId, navMap) => {
4059
4113
  return declared;
4060
4114
  return Object.keys(navMap).filter((id) => parentNavId(id) === navId && !PLATFORM_BUTTON_NAV_IDS.includes(id));
4061
4115
  };
4116
+ /**
4117
+ * Whether `navId` is one of the Platform Navs a mounted app brings under its
4118
+ * own root (`<root>_settings`, …). An Open App draws as part of its host, so
4119
+ * the host's chrome is the only chrome — the app's own is never a row.
4120
+ */
4121
+ const isOwnChrome = (navId, appRootId) => PLATFORM_BUTTON_NAV_IDS.some((platformId) => navId === appRootId + platformId.slice(ROOT_NAV$1.length));
4062
4122
  /**
4063
4123
  * The children a menu may draw. A Nav needs a title to be a row at all, and a
4064
4124
  * `default` node is not a row: it is its parent's own content, so it is
@@ -4086,15 +4146,17 @@ const menuChildIds = (navId, navMap, dynamicRows = {}, instances = {},
4086
4146
  // A set rather than a predicate: the answers are resolved once per read of
4087
4147
  // the widget maps, and this walk is called from four places that would
4088
4148
  // otherwise each resolve them again.
4089
- hidden = EMPTY_HIDDEN) => childIdsOf(navId, navMap).flatMap((childId) => {
4149
+ hidden = EMPTY_HIDDEN,
4150
+ // Default Navs by role rather than by name (DeriveBreadcrumbParams).
4151
+ transparent = EMPTY_HIDDEN) => childIdsOf(navId, navMap).flatMap((childId) => {
4090
4152
  // Hidden first, and before the Default Nav descent: a hidden parent takes
4091
4153
  // its children with it, which is the same cascade the route guard walks —
4092
4154
  // a row spliced out of a panel whose children still listed beneath it
4093
4155
  // would be the panel that looks correct and is not.
4094
4156
  if (hidden.has(childId))
4095
4157
  return [];
4096
- if (isDefaultNav(childId))
4097
- return menuChildIds(childId, navMap, dynamicRows, instances, hidden);
4158
+ if (isDefaultNav(childId) || transparent.has(childId))
4159
+ return menuChildIds(childId, navMap, dynamicRows, instances, hidden, transparent).filter((id) => !transparent.has(childId) || !isOwnChrome(id, childId));
4098
4160
  if (navMap[childId]?.presentation === 'dynamic') {
4099
4161
  if (drawsRows(childId, dynamicRows))
4100
4162
  return [childId];
@@ -4115,10 +4177,11 @@ hidden = EMPTY_HIDDEN) => childIdsOf(navId, navMap).flatMap((childId) => {
4115
4177
  * list the User moved through and the row they are on is the one marked
4116
4178
  * active. Root is the floor: its own children are the last list there is.
4117
4179
  */
4118
- const navMenuOwnerId = (navId, navMap, hasOwnContent = false, dynamicRows = {}, instances = {}, hidden = EMPTY_HIDDEN) => {
4119
- const visible = visibleNavId(navId);
4180
+ const navMenuOwnerId = (navId, navMap, hasOwnContent = false, dynamicRows = {}, instances = {}, hidden = EMPTY_HIDDEN, transparent = EMPTY_HIDDEN) => {
4181
+ const visible = visibleNavId(navId, transparent);
4120
4182
  if (visible === ROOT_NAV$1 ||
4121
- menuChildIds(visible, navMap, dynamicRows, instances, hidden).length) {
4183
+ menuChildIds(visible, navMap, dynamicRows, instances, hidden, transparent)
4184
+ .length) {
4122
4185
  return visible;
4123
4186
  }
4124
4187
  // A panel that answers with a widget of its own keeps its own title —
@@ -4132,8 +4195,9 @@ const navMenuOwnerId = (navId, navMap, hasOwnContent = false, dynamicRows = {},
4132
4195
  // own row marked. Where no ancestor lists anything there is no better title
4133
4196
  // than the one we are on — a mistitled empty panel is worse than a titled one.
4134
4197
  for (let ancestor = parentNavId(visible); ancestor; ancestor = parentNavId(ancestor)) {
4135
- const owner = visibleNavId(ancestor);
4136
- if (menuChildIds(owner, navMap, dynamicRows, instances, hidden).length)
4198
+ const owner = visibleNavId(ancestor, transparent);
4199
+ if (menuChildIds(owner, navMap, dynamicRows, instances, hidden, transparent)
4200
+ .length)
4137
4201
  return owner;
4138
4202
  if (owner === ROOT_NAV$1)
4139
4203
  break;
@@ -4149,11 +4213,11 @@ const navMenuOwnerId = (navId, navMap, hasOwnContent = false, dynamicRows = {},
4149
4213
  * store behind it fills, and a chevron waiting on them would pop in late or
4150
4214
  * not at all. One that resolves nothing leaves the Browse on the empty state.
4151
4215
  */
4152
- const isBrowsable = (navId, navMap, dynamicRows, instances, hidden) => navMap[navId]?.kind === 'url' &&
4216
+ const isBrowsable = (navId, navMap, dynamicRows, instances, hidden, transparent) => navMap[navId]?.kind === 'url' &&
4153
4217
  menuChildIds(navId, navMap, Object.fromEntries(Object.entries(dynamicRows).map(([id, rows]) => [
4154
4218
  id,
4155
4219
  { ...rows, loading: true },
4156
- ])), instances, hidden).length > 0;
4220
+ ])), instances, hidden, transparent).length > 0;
4157
4221
  /**
4158
4222
  * The rows one panel draws. A `dynamic` child with a NavRowSource behind it is
4159
4223
  * **transparent** the way a Default Nav is: its resolved rows are spliced where
@@ -4167,14 +4231,14 @@ const isBrowsable = (navId, navMap, dynamicRows, instances, hidden) => navMap[na
4167
4231
  * falling through to the static siblings around it would show a panel that
4168
4232
  * looks correct and is not.
4169
4233
  */
4170
- const buildNavMenus = (navId, navMap, anchor, dynamicRows = {}, routeParams, instances = {}, hidden = EMPTY_HIDDEN) => menuChildIds(navId, navMap, dynamicRows, instances, hidden).flatMap((childId) => {
4234
+ const buildNavMenus = (navId, navMap, anchor, dynamicRows = {}, routeParams, instances = {}, hidden = EMPTY_HIDDEN, transparent = EMPTY_HIDDEN) => menuChildIds(navId, navMap, dynamicRows, instances, hidden, transparent).flatMap((childId) => {
4171
4235
  const nav = navMap[childId];
4172
4236
  const resolved = nav && dynamicRows[childId];
4173
4237
  // The instances above this row, whether it is a row of its own or one of
4174
4238
  // the rows a source resolved: a panel drawn beneath a dynamic Nav is a
4175
4239
  // panel every entry in it routes behind.
4176
4240
  const inherited = navParamsFor(parentNavId(childId) ?? childId, navMap, routeParams);
4177
- const browsable = isBrowsable(childId, navMap, dynamicRows, instances, hidden)
4241
+ const browsable = isBrowsable(childId, navMap, dynamicRows, instances, hidden, transparent)
4178
4242
  ? { browsable: true }
4179
4243
  : {};
4180
4244
  if (!nav || nav.presentation !== 'dynamic' || !resolved) {
@@ -4204,7 +4268,7 @@ const mergeTrail = (derived, override, derivedHeader) => {
4204
4268
  return { trail, header: override.header ?? derivedHeader };
4205
4269
  };
4206
4270
  function deriveBreadcrumb(params) {
4207
- const { navId, navMap, anchor, breadcrumb, navMenu, hasOwnContent, dynamicRows, routeParams, instances, hidden = EMPTY_HIDDEN, } = params;
4271
+ const { navId, navMap, anchor, breadcrumb, navMenu, hasOwnContent, dynamicRows, routeParams, instances, hidden = EMPTY_HIDDEN, transparent = EMPTY_HIDDEN, } = params;
4208
4272
  if (!navId)
4209
4273
  return emptyResult();
4210
4274
  /**
@@ -4253,15 +4317,15 @@ function deriveBreadcrumb(params) {
4253
4317
  // The header and the trail belong to whichever Nav owns the menu below them:
4254
4318
  // on a leaf that is the parent, so the User reads the list they are in with
4255
4319
  // their own row marked, rather than a title over an empty panel.
4256
- const ownerId = navMenuOwnerId(navId, navMap, hasOwnContent, dynamicRows, instances, hidden);
4320
+ const ownerId = navMenuOwnerId(navId, navMap, hasOwnContent, dynamicRows, instances, hidden, transparent);
4257
4321
  // An emitted breadcrumb names the panel it was emitted for. Once the panel
4258
4322
  // has been handed up to an ancestor it is no longer that panel, so the
4259
4323
  // override would title the ancestor's list after the leaf we left.
4260
- const ownPanel = ownerId === visibleNavId(navId);
4324
+ const ownPanel = ownerId === visibleNavId(navId, transparent);
4261
4325
  const chain = navIdChain(ownerId);
4262
4326
  const derivedTrail = chain
4263
4327
  .slice(0, -1)
4264
- .filter((id) => !isDefaultNav(id))
4328
+ .filter((id) => !isDefaultNav(id) && !transparent.has(id))
4265
4329
  .map((id) => toTrailItem(id, navMap, anchor, instanceOf(id), rowParams(id)));
4266
4330
  const nav = navMap[ownerId];
4267
4331
  const ownerParams = rowParams(ownerId);
@@ -4283,7 +4347,7 @@ function deriveBreadcrumb(params) {
4283
4347
  breadcrumb: { trail, header },
4284
4348
  navMenus: navMenu?.length && ownPanel
4285
4349
  ? navMenu
4286
- : buildNavMenus(ownerId, navMap, anchor, dynamicRows, routeParams, instances, hidden),
4350
+ : buildNavMenus(ownerId, navMap, anchor, dynamicRows, routeParams, instances, hidden, transparent),
4287
4351
  };
4288
4352
  }
4289
4353
 
@@ -4562,6 +4626,15 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
4562
4626
  ? [{ name: appLink, link: appLink, appNavId }, ...mounts]
4563
4627
  : mounts;
4564
4628
  }, ...(ngDevMode ? [{ debugName: "allMounts" }] : /* istanbul ignore next */ []));
4629
+ /**
4630
+ * Each mounted Open App's root (store CONTEXT.md): the host draws the app
4631
+ * as its own, so its root is a Default Nav by role — its rows are the
4632
+ * host's rows, and it is never a trail entry, a header or a node with the
4633
+ * app's logo.
4634
+ */
4635
+ const transparentNavIds = computed(() => new Set(allMounts()
4636
+ .filter(({ link }) => store.wcConfigMap()[link]?.open)
4637
+ .map(({ appNavId }) => appNavId)), ...(ngDevMode ? [{ debugName: "transparentNavIds" }] : /* istanbul ignore next */ []));
4565
4638
  /**
4566
4639
  * The side apps the menu lists, in mount order: a registered mount whose
4567
4640
  * segment the URL holds, then any segment no mount has claimed yet —
@@ -4903,10 +4976,15 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
4903
4976
  const hit = widgetEntry();
4904
4977
  return hit && isNavMenuConfig(hit.entry) ? hit.entry : null;
4905
4978
  }, ...(ngDevMode ? [{ debugName: "resolvedNavMenuConfig" }] : /* istanbul ignore next */ []));
4906
- const currentWcConfig = computed(() => {
4979
+ /** The active app's config as fetched, Open App or not. */
4980
+ const activeWcConfig = computed(() => {
4907
4981
  const appLink = store.appLink();
4908
4982
  return appLink ? store.wcConfigMap()[appLink] : undefined;
4909
- }, ...(ngDevMode ? [{ debugName: "currentWcConfig" }] : /* istanbul ignore next */ []));
4983
+ }, ...(ngDevMode ? [{ debugName: "activeWcConfig" }] : /* istanbul ignore next */ []));
4984
+ /** The active app draws as part of the host: no logo, footer or settings of its own. */
4985
+ const activeAppOpen = computed(() => !!activeWcConfig()?.open, ...(ngDevMode ? [{ debugName: "activeAppOpen" }] : /* istanbul ignore next */ []));
4986
+ /** The active app as the chrome shows it — none while it is an Open App. */
4987
+ const currentWcConfig = computed(() => activeAppOpen() ? undefined : activeWcConfig(), ...(ngDevMode ? [{ debugName: "currentWcConfig" }] : /* istanbul ignore next */ []));
4910
4988
  /**
4911
4989
  * The Nav the open panel *is*, which is the key its content answered to.
4912
4990
  * A Murl that fell through to its root-anchored panel is showing that
@@ -4923,8 +5001,7 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
4923
5001
  // asset holds — left the page's own menu up under its own header.
4924
5002
  const map = store.navMap();
4925
5003
  const rows = dynamicRows();
4926
- return (candidates.find((c) => menuChildIds(c, map, rows, dynamicInstances(), hiddenNavIds())
4927
- .length) ??
5004
+ return (candidates.find((c) => menuChildIds(c, map, rows, dynamicInstances(), hiddenNavIds(), transparentNavIds()).length) ??
4928
5005
  // A leaf nothing is registered for is still a Nav the tree knows, and
4929
5006
  // that is where the panel belongs: `|settings|app` with no widget hands
4930
5007
  // the panel back to *settings*, whose row it is, rather than climbing
@@ -4953,6 +5030,7 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
4953
5030
  dynamicRows: dynamicRows(),
4954
5031
  instances: dynamicInstances(),
4955
5032
  hidden: hiddenNavIds(),
5033
+ transparent: transparentNavIds(),
4956
5034
  routeParams: panelParams(),
4957
5035
  breadcrumb: menuConfig?.breadcramb?.() ??
4958
5036
  (typeof widgetConfig?.breadcramb === 'function'
@@ -5001,6 +5079,8 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
5001
5079
  navMenus,
5002
5080
  navHasContent,
5003
5081
  currentWcConfig,
5082
+ activeAppOpen,
5083
+ transparentNavIds,
5004
5084
  resolvedNavMenuConfig,
5005
5085
  instanceLoaders,
5006
5086
  hiddenNavIds,
@@ -5362,7 +5442,7 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
5362
5442
  const parent = owner ? parentNavId(owner) : undefined;
5363
5443
  if (!parent)
5364
5444
  return;
5365
- browse(visibleNavId(parent), untracked(() => store.panelParams()));
5445
+ browse(visibleNavId(parent, untracked(() => store.transparentNavIds())), untracked(() => store.panelParams()));
5366
5446
  };
5367
5447
  /**
5368
5448
  * Moves the open panel onto another Nav and never the User: the Address,
@@ -10599,6 +10679,9 @@ class AgreementGate {
10599
10679
  catch {
10600
10680
  return;
10601
10681
  }
10682
+ // An Open App needs no Relation: nothing to install, agree to or refuse.
10683
+ if (view.open)
10684
+ return;
10602
10685
  const app = { id: view.app, link, name };
10603
10686
  if (view.countryBlocked) {
10604
10687
  await this.#countryBlocked(name ?? link);
@@ -11370,7 +11453,7 @@ class SectionFormItemComponent extends ConfigComponent {
11370
11453
  break;
11371
11454
  }
11372
11455
  case InputType.TOGGLE: {
11373
- const { ToggleInputComponent } = await import('./magmonium-one-toggle-BcNgKeU8.mjs');
11456
+ const { ToggleInputComponent } = await import('./magmonium-one-toggle-BeNbv_Ox.mjs');
11374
11457
  this.createDynamicComponent(seq, ToggleInputComponent, [], true);
11375
11458
  break;
11376
11459
  }
@@ -11382,12 +11465,12 @@ class SectionFormItemComponent extends ConfigComponent {
11382
11465
  break;
11383
11466
  }
11384
11467
  case InputType.PASSWORD: {
11385
- const { PasswordInputComponent } = await import('./magmonium-one-password-C-4aA16X.mjs');
11468
+ const { PasswordInputComponent } = await import('./magmonium-one-password-C1VDuH8J.mjs');
11386
11469
  this.createDynamicComponent(seq, PasswordInputComponent);
11387
11470
  break;
11388
11471
  }
11389
11472
  case InputType.OTP: {
11390
- const { OtpInputComponent } = await import('./magmonium-one-otp-BDzRVFz5.mjs');
11473
+ const { OtpInputComponent } = await import('./magmonium-one-otp-Kcns6JtV.mjs');
11391
11474
  this.createDynamicComponent(seq, OtpInputComponent);
11392
11475
  break;
11393
11476
  }
@@ -19322,7 +19405,9 @@ const mInterceptor = (incoming, next) => {
19322
19405
  const isAuth = request.url.includes(`${authBaseUrl}/auth/`);
19323
19406
  const isInitCall = request.url === httpService.buildUrl('auth', ['init']);
19324
19407
  const isRefreshCall = request.url === httpService.buildUrl('auth', ['refresh']);
19325
- const actions = SharedStoreRegistry.getLoadingActions() ?? loadingActions;
19408
+ const actions = inject(LOADING_ACTIONS_REF, { optional: true }) ??
19409
+ SharedStoreRegistry.getLoadingActions() ??
19410
+ loadingActions;
19326
19411
  const notificationService = inject(NotificationService);
19327
19412
  const defaultDenial = injectDefaultDenial();
19328
19413
  /**
@@ -23639,7 +23724,7 @@ class WrapperInputComponent extends ConfigComponent {
23639
23724
  break;
23640
23725
  }
23641
23726
  case InputType.TOGGLE: {
23642
- const { ToggleInputComponent } = await import('./magmonium-one-toggle-BcNgKeU8.mjs');
23727
+ const { ToggleInputComponent } = await import('./magmonium-one-toggle-BeNbv_Ox.mjs');
23643
23728
  this.createDynamicComponent(seq, ToggleInputComponent, [], true);
23644
23729
  break;
23645
23730
  }
@@ -23651,12 +23736,12 @@ class WrapperInputComponent extends ConfigComponent {
23651
23736
  break;
23652
23737
  }
23653
23738
  case InputType.PASSWORD: {
23654
- const { PasswordInputComponent } = await import('./magmonium-one-password-C-4aA16X.mjs');
23739
+ const { PasswordInputComponent } = await import('./magmonium-one-password-C1VDuH8J.mjs');
23655
23740
  this.createDynamicComponent(seq, PasswordInputComponent);
23656
23741
  break;
23657
23742
  }
23658
23743
  case InputType.OTP: {
23659
- const { OtpInputComponent } = await import('./magmonium-one-otp-BDzRVFz5.mjs');
23744
+ const { OtpInputComponent } = await import('./magmonium-one-otp-Kcns6JtV.mjs');
23660
23745
  this.createDynamicComponent(seq, OtpInputComponent);
23661
23746
  break;
23662
23747
  }
@@ -25385,7 +25470,7 @@ class FileUploadInputComponent extends BaseInputComponent {
25385
25470
  const modalStore = this.modalStore;
25386
25471
  if (!modalStore)
25387
25472
  return undefined;
25388
- const { ImageEditorComponent } = await import('./magmonium-one-image-editor-BbFlj-1H.mjs');
25473
+ const { ImageEditorComponent } = await import('./magmonium-one-image-editor-B2079TFM.mjs');
25389
25474
  const ratio = String(this.config()?.ratio ?? '');
25390
25475
  return new Promise((resolve) => {
25391
25476
  const modalRef = new ModalRef();
@@ -25721,12 +25806,16 @@ class ListComponent extends ConfigComponent {
25721
25806
  orientation = input(undefined, ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
25722
25807
  gap = input(undefined, ...(ngDevMode ? [{ debugName: "gap" }] : /* istanbul ignore next */ []));
25723
25808
  startIcon = input(undefined, ...(ngDevMode ? [{ debugName: "startIcon" }] : /* istanbul ignore next */ []));
25809
+ iconColor = input(undefined, ...(ngDevMode ? [{ debugName: "iconColor" }] : /* istanbul ignore next */ []));
25724
25810
  items = input(undefined, ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
25725
25811
  noTranslate = input(undefined, ...(ngDevMode ? [{ debugName: "noTranslate" }] : /* istanbul ignore next */ []));
25726
25812
  resolvedVariant = computed(() => this.variant() ?? this.config()?.variant ?? 'unordered', ...(ngDevMode ? [{ debugName: "resolvedVariant" }] : /* istanbul ignore next */ []));
25727
25813
  isOrdered = computed(() => this.resolvedVariant() === 'ordered', ...(ngDevMode ? [{ debugName: "isOrdered" }] : /* istanbul ignore next */ []));
25728
25814
  resolvedOrientation = computed(() => this.orientation() ?? this.config()?.orientation ?? 'vertical', ...(ngDevMode ? [{ debugName: "resolvedOrientation" }] : /* istanbul ignore next */ []));
25729
25815
  resolvedStartIcon = computed(() => this.startIcon() ?? this.config()?.startIcon, ...(ngDevMode ? [{ debugName: "resolvedStartIcon" }] : /* istanbul ignore next */ []));
25816
+ // Undefined leaves the Icon on its own default — the brand colour — rather
25817
+ // than pinning one here.
25818
+ resolvedIconColor = computed(() => this.iconColor() ?? this.config()?.iconColor, ...(ngDevMode ? [{ debugName: "resolvedIconColor" }] : /* istanbul ignore next */ []));
25730
25819
  resolvedGap = computed(() => resolveGap(this.gap() ?? this.config()?.gap), ...(ngDevMode ? [{ debugName: "resolvedGap" }] : /* istanbul ignore next */ []));
25731
25820
  /**
25732
25821
  * What sits before a row, or nothing at all. A `menu` carries its glyphs
@@ -25783,7 +25872,7 @@ class ListComponent extends ConfigComponent {
25783
25872
  last,
25784
25873
  });
25785
25874
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ListComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
25786
- 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()", "style.--m-list-counter-digits": "counterDigits()" }, classAttribute: "m-list" }, queries: [{ propertyName: "projectedTemplate", first: true, predicate: (TemplateRef), descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: `
25875
+ 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 }, iconColor: { classPropertyName: "iconColor", publicName: "iconColor", 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()", "style.--m-list-counter-digits": "counterDigits()" }, classAttribute: "m-list" }, queries: [{ propertyName: "projectedTemplate", first: true, predicate: (TemplateRef), descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: `
25787
25876
  <ng-template #rowList>
25788
25877
  @for (item of rows(); track item.id; let i = $index) {
25789
25878
  <li class="m-list__item">
@@ -25795,7 +25884,11 @@ class ListComponent extends ConfigComponent {
25795
25884
  aria-hidden="true"
25796
25885
  >
25797
25886
  @if (kind === 'icon') {
25798
- <m-icon [name]="resolvedStartIcon()!" [baseUrl]="baseUrl()" />
25887
+ <m-icon
25888
+ [name]="resolvedStartIcon()!"
25889
+ [color]="resolvedIconColor()"
25890
+ [baseUrl]="baseUrl()"
25891
+ />
25799
25892
  } @else if (kind === 'counter') {
25800
25893
  {{ i + 1 }}.
25801
25894
  } @else {
@@ -25832,7 +25925,7 @@ class ListComponent extends ConfigComponent {
25832
25925
  <ng-container *ngTemplateOutlet="rowList" />
25833
25926
  </ul>
25834
25927
  }
25835
- `, 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:baseline;gap:.5em;min-width:0}.m-list__item:has(>.m-list__marker--icon){align-items:flex-start}.m-list__marker{flex:0 0 auto;display:flex;align-items:center;color:var(--m-text-tertiary);line-height:inherit}.m-list__marker--counter{justify-content:flex-end;min-width:calc(var(--m-list-counter-digits, 1) * 1ch + .5ch);font-variant-numeric:tabular-nums}.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 });
25928
+ `, isInline: true, styles: ["@charset \"UTF-8\";@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:baseline;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__marker--icon:before{content:\"\\200b\"}.m-list__marker--counter{justify-content:flex-end;min-width:calc(var(--m-list-counter-digits, 1) * 1ch + .5ch);font-variant-numeric:tabular-nums}.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 });
25836
25929
  }
25837
25930
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ListComponent, decorators: [{
25838
25931
  type: Component,
@@ -25848,7 +25941,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
25848
25941
  aria-hidden="true"
25849
25942
  >
25850
25943
  @if (kind === 'icon') {
25851
- <m-icon [name]="resolvedStartIcon()!" [baseUrl]="baseUrl()" />
25944
+ <m-icon
25945
+ [name]="resolvedStartIcon()!"
25946
+ [color]="resolvedIconColor()"
25947
+ [baseUrl]="baseUrl()"
25948
+ />
25852
25949
  } @else if (kind === 'counter') {
25853
25950
  {{ i + 1 }}.
25854
25951
  } @else {
@@ -25890,8 +25987,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
25890
25987
  '[class.is-design-mode]': 'isDesignMode',
25891
25988
  '[style.--m-list-gap]': 'resolvedGap()',
25892
25989
  '[style.--m-list-counter-digits]': 'counterDigits()',
25893
- }, 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:baseline;gap:.5em;min-width:0}.m-list__item:has(>.m-list__marker--icon){align-items:flex-start}.m-list__marker{flex:0 0 auto;display:flex;align-items:center;color:var(--m-text-tertiary);line-height:inherit}.m-list__marker--counter{justify-content:flex-end;min-width:calc(var(--m-list-counter-digits, 1) * 1ch + .5ch);font-variant-numeric:tabular-nums}.m-list__body{flex:1 1 auto;min-width:0}\n"] }]
25894
- }], 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 }] }] } });
25990
+ }, styles: ["@charset \"UTF-8\";@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:baseline;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__marker--icon:before{content:\"\\200b\"}.m-list__marker--counter{justify-content:flex-end;min-width:calc(var(--m-list-counter-digits, 1) * 1ch + .5ch);font-variant-numeric:tabular-nums}.m-list__body{flex:1 1 auto;min-width:0}\n"] }]
25991
+ }], 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 }] }], iconColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconColor", 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 }] }] } });
25895
25992
 
25896
25993
  const TOTAL_COLUMNS = 12;
25897
25994
 
@@ -27870,6 +27967,156 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
27870
27967
  }, styles: [":host{display:block;width:100%}.m-section-carousel{display:flex;flex-direction:column;gap:.75rem;width:100%}.m-section-carousel__viewport{position:relative;flex:1;min-width:0;overflow:hidden;max-height:var(--m-section-carousel-max-height, none);touch-action:pan-y}.m-section-carousel__track{display:flex;width:100%;transition:transform .35s cubic-bezier(.4,0,.2,1)}.m-section-carousel__track--dragging{transition:none}.m-section-carousel__slide{flex:0 0 100%;min-width:0;max-height:var(--m-section-carousel-max-height, none);overflow:hidden}.m-section-carousel__indicators{display:flex;align-items:center;justify-content:center;gap:.5rem;flex-wrap:wrap}.m-section-carousel__indicator{appearance:none;border:none;padding:0;cursor:pointer;width:.5rem;height:.5rem;border-radius:50%;background:var(--m-section-carousel-indicator, currentColor);opacity:.35;transition:opacity .2s ease,width .2s ease,background .2s ease}.m-section-carousel__indicator--capsule{width:1.25rem;height:.375rem;border-radius:999px}.m-section-carousel__indicator--active{opacity:1}.m-section-carousel__indicator--capsule.m-section-carousel__indicator--active{width:2rem}.m-section-carousel--indicator-top{flex-direction:column-reverse}.m-section-carousel--indicator-left{flex-direction:row-reverse;align-items:center}.m-section-carousel--indicator-right{flex-direction:row;align-items:center}.m-section-carousel--indicator-left .m-section-carousel__indicators,.m-section-carousel--indicator-right .m-section-carousel__indicators{flex-direction:column}\n"] }]
27871
27968
  }], ctorParameters: () => [], 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 }] }], maxHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxHeight", required: false }] }], indicator: [{ type: i0.Input, args: [{ isSignal: true, alias: "indicator", required: false }] }], indicatorShape: [{ type: i0.Input, args: [{ isSignal: true, alias: "indicatorShape", required: false }] }], autoPlay: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoPlay", required: false }] }], interval: [{ type: i0.Input, args: [{ isSignal: true, alias: "interval", required: false }] }], loop: [{ type: i0.Input, args: [{ isSignal: true, alias: "loop", required: false }] }], pauseOnHover: [{ type: i0.Input, args: [{ isSignal: true, alias: "pauseOnHover", required: false }] }], drag: [{ type: i0.Input, args: [{ isSignal: true, alias: "drag", required: false }] }], slideChange: [{ type: i0.Output, args: ["slideChange"] }], itemChange: [{ type: i0.Output, args: ["itemChange"] }], projectedTemplate: [{ type: i0.ContentChild, args: [i0.forwardRef(() => TemplateRef), { isSignal: true }] }] } });
27872
27969
 
27970
+ /** What a Plugin element dispatches for every output its Screen emits. */
27971
+ const PLUGIN_OUTPUT_EVENT = 'plugin-output';
27972
+ /**
27973
+ * The language a Plugin's keys fall back to when its app ships none for the
27974
+ * host's — the app's Default Language, which is `en` for every app today.
27975
+ */
27976
+ const PLUGIN_FALLBACK_LANG = 'en';
27977
+ const PLUGIN_SCREENS = new InjectionToken('PLUGIN_SCREENS');
27978
+ /**
27979
+ * Offers Screens to other apps as Plugins (libs/one CONTEXT.md). Listed in the
27980
+ * app's providers; its wc bundle defines one element per Screen at load,
27981
+ * without booting the app's root.
27982
+ */
27983
+ function exposeScreens(screens) {
27984
+ return { provide: PLUGIN_SCREENS, useValue: screens, multi: true };
27985
+ }
27986
+ /** Every Screen the app exposes, however many `exposeScreens` calls list them. */
27987
+ function exposedScreensOf(injector) {
27988
+ return Object.assign({}, ...(injector.get(PLUGIN_SCREENS, null, { optional: true }) ?? []));
27989
+ }
27990
+ /**
27991
+ * The element tag of an Exposed Screen: under the app's own root selector, so
27992
+ * two apps exposing one name never clash, and derivable by a host that holds
27993
+ * only the app's config and the Screen's name.
27994
+ */
27995
+ const pluginTag = (selector, screen) => `${selector}--${screen}`;
27996
+ /**
27997
+ * The application a Plugin runs in, beside its app's root rather than inside
27998
+ * it: own HttpService, own translations, own loading counter. Spread last over
27999
+ * the app's providers so these win.
28000
+ */
28001
+ function providePluginRuntime() {
28002
+ return [
28003
+ // Its own counter: neither the host's `busy` nor its app root's freeze
28004
+ // overlay moves for a Plugin's requests.
28005
+ { provide: LOADING_ACTIONS_REF, useFactory: () => createLoadingState().actions },
28006
+ {
28007
+ provide: TranslateService,
28008
+ useFactory: () => {
28009
+ const own = new TranslateService();
28010
+ own.init();
28011
+ own.remoteFallbackLang.set(PLUGIN_FALLBACK_LANG);
28012
+ return own;
28013
+ },
28014
+ },
28015
+ // The nearest host's AppLink, set by the element when it connects (api ADR 0008).
28016
+ { provide: APP_LINK, useFactory: () => signal(undefined) },
28017
+ ];
28018
+ }
28019
+ /**
28020
+ * The custom element one Exposed Screen mounts as. Inputs are element
28021
+ * properties, outputs one `plugin-output` event each; `lang`, `pluginLink`
28022
+ * and `hostLink` are set by the host's `m-plugin` before it connects.
28023
+ */
28024
+ function createPluginElement(component, pluginApp) {
28025
+ const mirror = reflectComponentType(component);
28026
+ const inputs = mirror?.inputs.map((i) => i.templateName) ?? [];
28027
+ const outputs = mirror?.outputs ?? [];
28028
+ class PluginElement extends HTMLElement {
28029
+ pluginLink;
28030
+ hostLink;
28031
+ ref;
28032
+ app;
28033
+ mounting = false;
28034
+ language;
28035
+ values = new Map();
28036
+ subscriptions = [];
28037
+ get lang() {
28038
+ return this.language ?? '';
28039
+ }
28040
+ set lang(value) {
28041
+ this.language = value;
28042
+ if (value)
28043
+ this.app?.injector.get(TranslateService).setLang(value);
28044
+ }
28045
+ connectedCallback() {
28046
+ void this.mount();
28047
+ }
28048
+ disconnectedCallback() {
28049
+ this.subscriptions.forEach((s) => s.unsubscribe());
28050
+ this.subscriptions = [];
28051
+ this.ref?.destroy();
28052
+ this.ref = undefined;
28053
+ this.replaceChildren();
28054
+ }
28055
+ setInput(name, value) {
28056
+ this.values.set(name, value);
28057
+ this.ref?.setInput(name, value);
28058
+ }
28059
+ async mount() {
28060
+ if (this.ref || this.mounting)
28061
+ return;
28062
+ this.mounting = true;
28063
+ try {
28064
+ this.app ??= await pluginApp();
28065
+ }
28066
+ finally {
28067
+ this.mounting = false;
28068
+ }
28069
+ if (!this.isConnected || this.ref)
28070
+ return;
28071
+ const injector = this.app.injector;
28072
+ if (this.hostLink)
28073
+ injector.get(APP_LINK).set(this.hostLink);
28074
+ const translate = injector.get(TranslateService);
28075
+ if (this.pluginLink)
28076
+ translate.remoteAppId.set(this.pluginLink);
28077
+ if (this.language)
28078
+ translate.setLang(this.language);
28079
+ const hostElement = document.createElement('div');
28080
+ this.appendChild(hostElement);
28081
+ const ref = createComponent(component, {
28082
+ environmentInjector: injector,
28083
+ hostElement,
28084
+ });
28085
+ this.values.forEach((value, name) => ref.setInput(name, value));
28086
+ this.subscriptions = outputs.map(({ propName, templateName }) => ref.instance[propName].subscribe((value) => this.dispatchEvent(new CustomEvent(PLUGIN_OUTPUT_EVENT, {
28087
+ detail: { name: templateName, value },
28088
+ }))));
28089
+ this.app.attachView(ref.hostView);
28090
+ this.ref = ref;
28091
+ }
28092
+ }
28093
+ for (const name of inputs) {
28094
+ Object.defineProperty(PluginElement.prototype, name, {
28095
+ configurable: true,
28096
+ get() {
28097
+ return this.values.get(name);
28098
+ },
28099
+ set(value) {
28100
+ this.setInput(name, value);
28101
+ },
28102
+ });
28103
+ }
28104
+ return PluginElement;
28105
+ }
28106
+ /**
28107
+ * Defines every Exposed Screen's element. The Plugin application is created
28108
+ * once, on the first mount, so an app nobody mounts a Plugin of pays nothing.
28109
+ */
28110
+ function definePluginScreens(selector, screens, createPluginApp) {
28111
+ let app;
28112
+ const pluginApp = () => (app ??= createPluginApp());
28113
+ for (const [name, component] of Object.entries(screens)) {
28114
+ const tag = pluginTag(selector, name);
28115
+ if (!customElements.get(tag))
28116
+ customElements.define(tag, createPluginElement(component, pluginApp));
28117
+ }
28118
+ }
28119
+
27873
28120
  /** The Store's own link rule (m-api `LINK_SLUG_PATTERN`) — ADR 0037. */
27874
28121
  const LINK_SLUG = /^[a-z0-9-]+$/;
27875
28122
  const ELEMENT_TIMEOUT_MS = 15_000;
@@ -27937,11 +28184,40 @@ class RemoteLoaderService {
27937
28184
  * fetched, because the link is concatenated into a module-script URL.
27938
28185
  */
27939
28186
  loadFromLink = async (link, useShadow = false, props, children) => {
28187
+ const config = await this.configOf(link);
28188
+ return config.reason
28189
+ ? config
28190
+ : this.mount(config.config, useShadow, props, children);
28191
+ };
28192
+ /**
28193
+ * Loads one Exposed Screen of the app a Store link names, as a Plugin: the
28194
+ * app's bundle, then the Screen's own element, never the app's root.
28195
+ */
28196
+ loadPluginFromLink = async (link, screen, props) => {
28197
+ const loaded = await this.configOf(link);
28198
+ if (loaded.reason)
28199
+ return loaded;
28200
+ const config = loaded.config;
28201
+ const bundle = await this.loadBundle(config);
28202
+ if (bundle !== true)
28203
+ return bundle;
28204
+ const tag = pluginTag(config.selector, screen);
28205
+ // The bundle defines its Plugins before its root, so a tag still missing
28206
+ // once the root is defined is a Screen the app does not expose.
28207
+ if (!customElements.get(tag))
28208
+ return { reason: 'screen-not-found' };
28209
+ const element = this.create(tag, props || {});
28210
+ const { assetBaseUrl } = this.resolveUrls(config);
28211
+ return element ? { element, assetBaseUrl, config } : { reason: 'element-timeout' };
28212
+ };
28213
+ /** The app's config, fetched by a link checked first — it is concatenated into a script URL. */
28214
+ configOf = async (link) => {
27940
28215
  if (!LINK_SLUG.test(link))
27941
28216
  return { reason: 'invalid-link' };
27942
- let config;
27943
28217
  try {
27944
- config = await firstValueFrom(this.httpService.wc(link, ['remote', 'app-wc.json']));
28218
+ const config = await firstValueFrom(this.httpService.wc(link, ['remote', 'app-wc.json']));
28219
+ // The validated link, never the answer's own: the script URL is built from it.
28220
+ return { config: { ...config, link } };
27945
28221
  }
27946
28222
  catch (error) {
27947
28223
  const status = error instanceof HttpErrorResponse ? error.status : 0;
@@ -27949,20 +28225,29 @@ class RemoteLoaderService {
27949
28225
  ? { reason: 'config-not-found', status }
27950
28226
  : { reason: 'offline' };
27951
28227
  }
27952
- // The validated link, never the answer's own: the script URL is built from it.
27953
- return this.mount({ ...config, link }, useShadow, props, children);
27954
28228
  };
27955
28229
  loadComponentFromConfig = async (config, useShadow = false, props, children) => {
27956
28230
  const { element, assetBaseUrl } = await this.mount(config, useShadow, props, children);
27957
28231
  return element ? { element, assetBaseUrl: assetBaseUrl ?? '' } : undefined;
27958
28232
  };
27959
- /** Logged out answers nothing at all — not a failure, the login effect reloads. */
27960
28233
  mount = async (config, useShadow, props, children) => {
28234
+ const bundle = await this.loadBundle(config);
28235
+ if (bundle !== true)
28236
+ return bundle;
28237
+ const { assetBaseUrl } = this.resolveUrls(config);
28238
+ const element = this.create(config.selector, props || {}, children || [], useShadow);
28239
+ return element ? { element, assetBaseUrl, config } : { reason: 'element-timeout' };
28240
+ };
28241
+ /**
28242
+ * The app's bundle loaded and its root element defined — `true`, or why not.
28243
+ * Logged out answers nothing at all: not a failure, the login effect reloads.
28244
+ */
28245
+ loadBundle = async (config) => {
27961
28246
  if (this.loginStore && !this.loginStore.isLoggedIn()) {
27962
28247
  console.warn(`Attempted to load component ${config.selector} without authentication`);
27963
28248
  return {};
27964
28249
  }
27965
- const { scriptUrl, assetBaseUrl } = this.resolveUrls(config);
28250
+ const { scriptUrl } = this.resolveUrls(config);
27966
28251
  if (!scriptUrl)
27967
28252
  return { reason: 'script-failed' };
27968
28253
  // A tag already defined by another tier's bundle would hand back that
@@ -27991,8 +28276,7 @@ class RemoteLoaderService {
27991
28276
  return { reason: 'element-timeout' };
27992
28277
  if (!wasDefined)
27993
28278
  recordDefinedWcTier(config.selector, tier);
27994
- const element = this.create(config.selector, props || {}, children || [], useShadow);
27995
- return element ? { element, assetBaseUrl, config } : { reason: 'element-timeout' };
28279
+ return true;
27996
28280
  };
27997
28281
  async loadScript(url) {
27998
28282
  if (document.querySelector(`script[data-wc-src="${url}"]`)) {
@@ -28627,6 +28911,208 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
28627
28911
  `, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, 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-remote{display:block;width:100%;min-height:100%;flex:1;isolation:isolate}.m-remote__loading,.m-remote__broken{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:24px}.m-remote__spinner{width:20px;height:20px;border:2px solid var(--m-backdrop-border);border-top-color:var(--m-mm);border-radius:50%;animation:m-remote-spin .8s linear infinite}.m-remote__broken{color:var(--m-text-secondary)}.m-remote__detail{font-size:.85em}@keyframes m-remote-spin{to{transform:rotate(360deg)}}\n"] }]
28628
28912
  }], ctorParameters: () => [], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: false }] }], link: [{ type: i0.Input, args: [{ isSignal: true, alias: "link", required: false }] }], useShadow: [{ type: i0.Input, args: [{ isSignal: true, alias: "useShadow", required: false }] }], props: [{ type: i0.Input, args: [{ isSignal: true, alias: "props", required: false }] }], children: [{ type: i0.Input, args: [{ isSignal: true, alias: "children", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], urlMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "urlMode", required: false }] }], path: [{ type: i0.Input, args: [{ isSignal: true, alias: "path", required: false }] }], tail: [{ type: i0.Input, args: [{ isSignal: true, alias: "tail", required: false }] }], out: [{ type: i0.Input, args: [{ isSignal: true, alias: "out", required: false }] }], createMenu: [{ type: i0.Input, args: [{ isSignal: true, alias: "createMenu", required: false }] }], mount: [{ type: i0.Input, args: [{ isSignal: true, alias: "mount", required: false }] }], beta: [{ type: i0.Input, args: [{ isSignal: true, alias: "beta", required: false }] }], loaded: [{ type: i0.Output, args: ["loaded"] }], failed: [{ type: i0.Output, args: ["failed"] }] } });
28629
28913
 
28914
+ /**
28915
+ * One input of a Plugin's Exposed Screen, written as a child of `m-plugin`:
28916
+ * the input's name on the tag and its value as a binding, so a template never
28917
+ * spells the inputs as an object literal. Renders nothing.
28918
+ */
28919
+ class PluginInputComponent {
28920
+ name = input.required(...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
28921
+ value = input(...(ngDevMode ? [undefined, { debugName: "value" }] : /* istanbul ignore next */ []));
28922
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: PluginInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
28923
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.9", type: PluginInputComponent, isStandalone: true, selector: "m-plugin-input", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: true, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, host: { styleAttribute: "display: none" }, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
28924
+ }
28925
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: PluginInputComponent, decorators: [{
28926
+ type: Component,
28927
+ args: [{
28928
+ selector: 'm-plugin-input',
28929
+ template: '',
28930
+ host: { style: 'display: none' },
28931
+ changeDetection: ChangeDetectionStrategy.OnPush,
28932
+ }]
28933
+ }], propDecorators: { name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: true }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }] } });
28934
+
28935
+ /**
28936
+ * One output of a Plugin's Exposed Screen, written as a child of `m-plugin`:
28937
+ * the output's name on the tag and `(fired)` carrying each value it emits, so
28938
+ * a template handles it like any other event. Renders nothing.
28939
+ */
28940
+ class PluginOutputComponent {
28941
+ name = input.required(...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
28942
+ fired = output();
28943
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: PluginOutputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
28944
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.9", type: PluginOutputComponent, isStandalone: true, selector: "m-plugin-output", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { fired: "fired" }, host: { styleAttribute: "display: none" }, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
28945
+ }
28946
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: PluginOutputComponent, decorators: [{
28947
+ type: Component,
28948
+ args: [{
28949
+ selector: 'm-plugin-output',
28950
+ template: '',
28951
+ host: { style: 'display: none' },
28952
+ changeDetection: ChangeDetectionStrategy.OnPush,
28953
+ }]
28954
+ }], propDecorators: { name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: true }] }], fired: [{ type: i0.Output, args: ["fired"] }] } });
28955
+
28956
+ /**
28957
+ * Mounts another app's Exposed Screen as a Plugin (libs/one CONTEXT.md): an
28958
+ * AppLink, the Screen's name, a value per input and one `output` event per
28959
+ * output the Screen emits. Never a whole app and never an address — that is
28960
+ * `m-remote`.
28961
+ */
28962
+ class PluginComponent {
28963
+ /** The AppLink of the app exposing the Screen. */
28964
+ link = input.required(...(ngDevMode ? [{ debugName: "link" }] : /* istanbul ignore next */ []));
28965
+ /** The Exposed Screen's name. */
28966
+ screen = input.required(...(ngDevMode ? [{ debugName: "screen" }] : /* istanbul ignore next */ []));
28967
+ /** Where the app is loaded from; `published` unless asked otherwise. */
28968
+ source = input('published', ...(ngDevMode ? [{ debugName: "source" }] : /* istanbul ignore next */ []));
28969
+ /** The dev-server port a `local` source is served from — `port="4300"` reads as a number. */
28970
+ port = input(undefined, { ...(ngDevMode ? { debugName: "port" } : /* istanbul ignore next */ {}), transform: (value) => value === undefined || value === null || value === ''
28971
+ ? undefined
28972
+ : numberAttribute(value) });
28973
+ /** A value per input of the Exposed Screen, by its name. */
28974
+ inputs = input({}, ...(ngDevMode ? [{ debugName: "inputs" }] : /* istanbul ignore next */ []));
28975
+ /** The same, written as `m-plugin-input` children — these win over `inputs`. */
28976
+ inputChildren = contentChildren(PluginInputComponent, ...(ngDevMode ? [{ debugName: "inputChildren" }] : /* istanbul ignore next */ []));
28977
+ /** `m-plugin-output` children, each handed the values of the output it names. */
28978
+ outputChildren = contentChildren(PluginOutputComponent, ...(ngDevMode ? [{ debugName: "outputChildren" }] : /* istanbul ignore next */ []));
28979
+ values = computed(() => ({
28980
+ ...this.inputs(),
28981
+ ...Object.fromEntries(this.inputChildren().map((child) => [child.name(), child.value()])),
28982
+ }), ...(ngDevMode ? [{ debugName: "values" }] : /* istanbul ignore next */ []));
28983
+ /** One per output the Exposed Screen emits, named as the Screen names it. */
28984
+ output = output();
28985
+ /** Why a load drew the broken state. */
28986
+ failed = output();
28987
+ loader = inject(RemoteLoaderService);
28988
+ translateService = inject(TranslateService);
28989
+ loginStore = inject(LOGIN_STORE, { optional: true });
28990
+ hostLink = inject(APP_LINK);
28991
+ elementRef = inject(ElementRef);
28992
+ loadedElement;
28993
+ /** Bumped per load, so an answer for a link since replaced is dropped. */
28994
+ loadId = 0;
28995
+ state = signal('idle', ...(ngDevMode ? [{ debugName: "state" }] : /* istanbul ignore next */ []));
28996
+ failure = signal({}, ...(ngDevMode ? [{ debugName: "failure" }] : /* istanbul ignore next */ []));
28997
+ constructor() {
28998
+ effect(() => {
28999
+ this.loginStore?.isLoggedIn();
29000
+ const link = this.link();
29001
+ const screen = this.screen();
29002
+ const source = this.source();
29003
+ const port = this.port();
29004
+ untracked(() => {
29005
+ // Pinned for the link as a whole: the manifest, the bundle and every
29006
+ // asset the Plugin asks for are all built from it.
29007
+ setWcTier(link, source === 'published' ? undefined : source);
29008
+ setWcLocalPort(link, source === 'local' ? port : undefined);
29009
+ void this.load(link, screen);
29010
+ });
29011
+ });
29012
+ // Inputs reach the Screen without reloading it.
29013
+ effect(() => {
29014
+ const inputs = this.values();
29015
+ const el = this.loadedElement;
29016
+ if (!el)
29017
+ return;
29018
+ Object.entries(inputs).forEach(([key, value]) => {
29019
+ el[key] = value;
29020
+ });
29021
+ });
29022
+ // The Plugin speaks the host's language, from its own translations.
29023
+ effect(() => {
29024
+ const lang = this.translateService.lang();
29025
+ if (this.loadedElement)
29026
+ this.loadedElement.lang = lang;
29027
+ });
29028
+ }
29029
+ ngOnDestroy() {
29030
+ this.dismount();
29031
+ }
29032
+ load = async (link, screen) => {
29033
+ const id = ++this.loadId;
29034
+ this.dismount();
29035
+ this.state.set('loading');
29036
+ const result = await this.loader.loadPluginFromLink(link, screen, {
29037
+ ...untracked(() => this.values()),
29038
+ lang: untracked(() => this.translateService.lang()),
29039
+ pluginLink: link,
29040
+ hostLink: this.hostLink(),
29041
+ });
29042
+ if (id !== this.loadId)
29043
+ return;
29044
+ if (!result.element) {
29045
+ this.failure.set(result);
29046
+ if (result.reason)
29047
+ this.failed.emit(result);
29048
+ return this.state.set(result.reason ? 'failed' : 'idle');
29049
+ }
29050
+ this.loadedElement = result.element;
29051
+ result.element.style.display = 'block';
29052
+ result.element.addEventListener(PLUGIN_OUTPUT_EVENT, this.onOutput);
29053
+ this.elementRef.nativeElement.appendChild(result.element);
29054
+ this.state.set('loaded');
29055
+ };
29056
+ onOutput = (event) => {
29057
+ const detail = event.detail;
29058
+ this.output.emit(detail);
29059
+ this.outputChildren()
29060
+ .filter((child) => child.name() === detail.name)
29061
+ .forEach((child) => child.fired.emit(detail.value));
29062
+ };
29063
+ dismount = () => {
29064
+ this.loadedElement?.removeEventListener(PLUGIN_OUTPUT_EVENT, this.onOutput);
29065
+ this.loadedElement?.remove();
29066
+ this.loadedElement = undefined;
29067
+ };
29068
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: PluginComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
29069
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: PluginComponent, isStandalone: true, selector: "m-plugin", inputs: { link: { classPropertyName: "link", publicName: "link", isSignal: true, isRequired: true, transformFunction: null }, screen: { classPropertyName: "screen", publicName: "screen", isSignal: true, isRequired: true, transformFunction: null }, source: { classPropertyName: "source", publicName: "source", isSignal: true, isRequired: false, transformFunction: null }, port: { classPropertyName: "port", publicName: "port", isSignal: true, isRequired: false, transformFunction: null }, inputs: { classPropertyName: "inputs", publicName: "inputs", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { output: "output", failed: "failed" }, host: { classAttribute: "m-plugin" }, queries: [{ propertyName: "inputChildren", predicate: PluginInputComponent, isSignal: true }, { propertyName: "outputChildren", predicate: PluginOutputComponent, isSignal: true }], ngImport: i0, template: `
29070
+ @if (state() === 'loading') {
29071
+ <div class="m-plugin__loading"><div class="m-plugin__spinner"></div></div>
29072
+ } @else if (state() === 'failed') {
29073
+ <div class="m-plugin__broken">
29074
+ <m-icon name="link-broken" color="currentColor" />
29075
+ <span class="m-plugin__reason">
29076
+ @switch (failure().reason) {
29077
+ @case ('invalid-link') { {{ 'remote-invalid-link' | translate }} }
29078
+ @case ('config-not-found') { {{ 'remote-config-not-found' | translate }} }
29079
+ @case ('script-failed') { {{ 'remote-script-failed' | translate }} }
29080
+ @case ('element-timeout') { {{ 'remote-element-timeout' | translate }} }
29081
+ @case ('offline') { {{ 'remote-offline' | translate }} }
29082
+ @case ('tier-conflict') { {{ 'remote-tier-conflict' | translate }} }
29083
+ @case ('screen-not-found') { {{ 'plugin-screen-not-found' | translate }} }
29084
+ }
29085
+ </span>
29086
+ <span class="m-plugin__detail">{{ link() }} · {{ screen() }}</span>
29087
+ </div>
29088
+ }
29089
+ `, isInline: true, styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}.m-plugin{display:block}.m-plugin__loading,.m-plugin__broken{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:16px}.m-plugin__spinner{width:20px;height:20px;border:2px solid var(--m-backdrop-border);border-top-color:var(--m-mm);border-radius:50%;animation:plugin-spin .8s linear infinite}.m-plugin__broken{color:var(--m-text-secondary)}.m-plugin__detail{font-size:.85em}@keyframes plugin-spin{to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "component", type: IconComponent, selector: "m-icon, m-one-icon", inputs: ["config", "name", "color", "size", "one", "baseUrl", "remote"], outputs: ["configChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
29090
+ }
29091
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: PluginComponent, decorators: [{
29092
+ type: Component,
29093
+ args: [{ selector: 'm-plugin', imports: [TranslatePipe, IconComponent], host: { class: 'm-plugin' }, template: `
29094
+ @if (state() === 'loading') {
29095
+ <div class="m-plugin__loading"><div class="m-plugin__spinner"></div></div>
29096
+ } @else if (state() === 'failed') {
29097
+ <div class="m-plugin__broken">
29098
+ <m-icon name="link-broken" color="currentColor" />
29099
+ <span class="m-plugin__reason">
29100
+ @switch (failure().reason) {
29101
+ @case ('invalid-link') { {{ 'remote-invalid-link' | translate }} }
29102
+ @case ('config-not-found') { {{ 'remote-config-not-found' | translate }} }
29103
+ @case ('script-failed') { {{ 'remote-script-failed' | translate }} }
29104
+ @case ('element-timeout') { {{ 'remote-element-timeout' | translate }} }
29105
+ @case ('offline') { {{ 'remote-offline' | translate }} }
29106
+ @case ('tier-conflict') { {{ 'remote-tier-conflict' | translate }} }
29107
+ @case ('screen-not-found') { {{ 'plugin-screen-not-found' | translate }} }
29108
+ }
29109
+ </span>
29110
+ <span class="m-plugin__detail">{{ link() }} · {{ screen() }}</span>
29111
+ </div>
29112
+ }
29113
+ `, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, 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-plugin{display:block}.m-plugin__loading,.m-plugin__broken{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:16px}.m-plugin__spinner{width:20px;height:20px;border:2px solid var(--m-backdrop-border);border-top-color:var(--m-mm);border-radius:50%;animation:plugin-spin .8s linear infinite}.m-plugin__broken{color:var(--m-text-secondary)}.m-plugin__detail{font-size:.85em}@keyframes plugin-spin{to{transform:rotate(360deg)}}\n"] }]
29114
+ }], ctorParameters: () => [], propDecorators: { link: [{ type: i0.Input, args: [{ isSignal: true, alias: "link", required: true }] }], screen: [{ type: i0.Input, args: [{ isSignal: true, alias: "screen", required: true }] }], source: [{ type: i0.Input, args: [{ isSignal: true, alias: "source", required: false }] }], port: [{ type: i0.Input, args: [{ isSignal: true, alias: "port", required: false }] }], inputs: [{ type: i0.Input, args: [{ isSignal: true, alias: "inputs", required: false }] }], inputChildren: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => PluginInputComponent), { isSignal: true }] }], outputChildren: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => PluginOutputComponent), { isSignal: true }] }], output: [{ type: i0.Output, args: ["output"] }], failed: [{ type: i0.Output, args: ["failed"] }] } });
29115
+
28630
29116
  class TooltipComponent {
28631
29117
  text = input(...(ngDevMode ? [undefined, { debugName: "text" }] : /* istanbul ignore next */ []));
28632
29118
  template = input(...(ngDevMode ? [undefined, { debugName: "template" }] : /* istanbul ignore next */ []));
@@ -35303,7 +35789,7 @@ class NavMenuComponent {
35303
35789
  <div class="nav-menu">
35304
35790
  <m-list variant="menu" [data]="rows()" [template]="menuTemplate" />
35305
35791
  </div>
35306
- `, isInline: true, styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}:host{display:block;width:100%}.nav-menu{padding:0;margin:0}.nav-menu ul{display:flex;flex-direction:column;gap:0;padding:0;margin:0}.nav-menu li{padding:0;list-style:none;width:100%;border-bottom:1px solid rgba(0,0,0,.02)}.nav-menu li:last-child{border-bottom:none}.nav-menu__item{display:flex;align-items:center;gap:.75rem;width:100%;position:relative;color:var(--m-text-secondary);background:transparent}.nav-menu__item:not(:has(.nav-menu__link)){padding:.625rem 1rem}.nav-menu__link{display:flex;align-items:center;gap:.75rem;padding:.625rem 1rem;border-radius:0;transition:all .15s cubic-bezier(.4,0,.2,1);cursor:pointer;width:100%;color:inherit;text-decoration:none}.nav-menu__link:hover{background:#00000008;color:var(--m-text)}.nav-menu__link:hover .nav-menu__icon{color:var(--m-text)}.nav-menu__link:hover .nav-menu__label{color:var(--m-text);font-weight:600}.nav-menu__browse{flex:none;margin-inline-end:.5rem;color:var(--m-text-tertiary)}.nav-menu__icon{display:flex;align-items:center;justify-content:center;color:var(--m-text-tertiary);transition:color .15s ease;width:1.15rem;height:1.15rem}.nav-menu__icon .m-icon{display:flex;align-items:center}.nav-menu__label{flex:1;display:block;width:100%;font-size:.8125rem;font-weight:500;letter-spacing:.01em;color:inherit;text-decoration:none}.nav-menu__item:has(.active){background:linear-gradient(90deg,color-mix(in srgb,var(--m-mm) 6%,transparent) 0%,color-mix(in srgb,var(--m-mm) 2%,transparent) 60%,transparent 100%);color:var(--m-mm);border-radius:0}.nav-menu__item:has(.active):after{content:\"\";position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,rgba(255,255,255,.3) 0%,rgba(255,255,255,.05) 50%,transparent 100%);z-index:3}.nav-menu__item:has(.active) .nav-menu__icon{color:var(--m-mm);filter:drop-shadow(0 0 3px color-mix(in srgb,var(--m-mm) 20%,transparent))}.nav-menu__item:has(.active) .nav-menu__label{color:var(--m-mm);font-weight:700;letter-spacing:.015em}\n"], dependencies: [{ kind: "component", type: IconComponent, selector: "m-icon, m-one-icon", inputs: ["config", "name", "color", "size", "one", "baseUrl", "remote"], outputs: ["configChange"] }, { kind: "directive", type: MRefDirective, selector: "[mRef]", inputs: ["mRef", "mRefLinkActive", "mRefToggle", "mRefParams"] }, { kind: "component", type: ListComponent, selector: "m-list, m-one-list", inputs: ["data", "element", "template", "variant", "orientation", "gap", "startIcon", "items", "noTranslate"] }, { kind: "component", type: ButtonComponent, selector: "m-button,m-one-button", inputs: ["config", "color", "labelClass", "fullWidth", "nav", "navParams", "href", "disabled", "variant", "name", "baseUrl", "one", "remote", "label", "noTranslate", "params", "noNative", "icon", "isRightIcon", "iconOnly", "stacked", "imgSrc", "nonClickable", "inverted", "isSubmit", "tabindex"], outputs: ["configChange", "clicked"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
35792
+ `, isInline: true, styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}:host{display:block;width:100%}.nav-menu{padding:0;margin:0}.nav-menu ul{display:flex;flex-direction:column;gap:0;padding:0;margin:0}.nav-menu li{padding:0;list-style:none;width:100%;border-bottom:1px solid rgba(0,0,0,.02)}.nav-menu li:last-child{border-bottom:none}.nav-menu__item{display:flex;align-items:center;gap:.75rem;width:100%;position:relative;color:var(--m-text-secondary);background:transparent}.nav-menu__item:not(:has(.nav-menu__link)){padding:.625rem 1rem}.nav-menu__link{display:flex;align-items:center;gap:.75rem;padding:.625rem 1rem;border-radius:0;transition:all .15s cubic-bezier(.4,0,.2,1);cursor:pointer;width:100%;color:inherit;text-decoration:none}.nav-menu__link:hover{background:#00000008;color:var(--m-text)}.nav-menu__link:hover .nav-menu__icon{color:var(--m-text)}.nav-menu__link:hover .nav-menu__label{color:var(--m-text);font-weight:600}.nav-menu__browse{flex:none;margin-inline-end:.5rem;color:var(--m-text-tertiary)}.nav-menu__icon{display:flex;align-items:center;justify-content:center;color:var(--m-text-tertiary);transition:color .15s ease;width:1.15rem;height:1.15rem}.nav-menu__icon .m-icon{display:flex;align-items:center}.nav-menu__label{flex:1;display:block;width:100%;font-size:.8125rem;font-weight:500;letter-spacing:.01em;color:inherit;text-decoration:none}.nav-menu__item:has(.active){background:linear-gradient(90deg,color-mix(in srgb,var(--m-mm) 6%,transparent) 0%,color-mix(in srgb,var(--m-mm) 2%,transparent) 60%,transparent 100%);color:var(--m-mm);border-radius:0}.nav-menu__item:has(.active):after{content:\"\";position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,rgba(255,255,255,.3) 0%,rgba(255,255,255,.05) 50%,transparent 100%);z-index:3}.nav-menu__item:has(.active) .nav-menu__icon{color:var(--m-mm);filter:drop-shadow(0 0 3px color-mix(in srgb,var(--m-mm) 20%,transparent))}.nav-menu__item:has(.active) .nav-menu__label{color:var(--m-mm);font-weight:700;letter-spacing:.015em}\n"], dependencies: [{ kind: "component", type: IconComponent, selector: "m-icon, m-one-icon", inputs: ["config", "name", "color", "size", "one", "baseUrl", "remote"], outputs: ["configChange"] }, { kind: "directive", type: MRefDirective, selector: "[mRef]", inputs: ["mRef", "mRefLinkActive", "mRefToggle", "mRefParams"] }, { kind: "component", type: ListComponent, selector: "m-list, m-one-list", inputs: ["data", "element", "template", "variant", "orientation", "gap", "startIcon", "iconColor", "items", "noTranslate"] }, { kind: "component", type: ButtonComponent, selector: "m-button,m-one-button", inputs: ["config", "color", "labelClass", "fullWidth", "nav", "navParams", "href", "disabled", "variant", "name", "baseUrl", "one", "remote", "label", "noTranslate", "params", "noNative", "icon", "isRightIcon", "iconOnly", "stacked", "imgSrc", "nonClickable", "inverted", "isSubmit", "tabindex"], outputs: ["configChange", "clicked"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
35307
35793
  }
35308
35794
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: NavMenuComponent, decorators: [{
35309
35795
  type: Component,
@@ -35611,7 +36097,12 @@ class NavComponent {
35611
36097
  isNavOpened = computed(() => this.#navStore.isNavOpened(), ...(ngDevMode ? [{ debugName: "isNavOpened" }] : /* istanbul ignore next */ []));
35612
36098
  currentWcConfig = computed(() => this.#navStore.currentWcConfig(), ...(ngDevMode ? [{ debugName: "currentWcConfig" }] : /* istanbul ignore next */ []));
35613
36099
  appLink = computed(() => this.#navStore.appLink(), ...(ngDevMode ? [{ debugName: "appLink" }] : /* istanbul ignore next */ []));
35614
- logoPending = computed(() => !this.isHost() && !!this.appLink() && !this.currentWcConfig(), ...(ngDevMode ? [{ debugName: "logoPending" }] : /* istanbul ignore next */ []));
36100
+ /** An Open App draws as part of the host: the host's logo, no apps button. */
36101
+ activeAppOpen = computed(() => this.#navStore.activeAppOpen(), ...(ngDevMode ? [{ debugName: "activeAppOpen" }] : /* istanbul ignore next */ []));
36102
+ logoPending = computed(() => !this.isHost() &&
36103
+ !!this.appLink() &&
36104
+ !this.currentWcConfig() &&
36105
+ !this.activeAppOpen(), ...(ngDevMode ? [{ debugName: "logoPending" }] : /* istanbul ignore next */ []));
35615
36106
  logo = computed(() => {
35616
36107
  if (this.logoPending())
35617
36108
  return undefined;
@@ -35687,7 +36178,7 @@ class NavComponent {
35687
36178
  };
35688
36179
  return { ...common, apps: appsButton };
35689
36180
  }
35690
- else if (appLink) {
36181
+ else if (appLink && !this.activeAppOpen()) {
35691
36182
  const appsButton = {
35692
36183
  icon: 'apps',
35693
36184
  iconOnly: true,
@@ -41030,5 +41521,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
41030
41521
  * Generated bundle index. Do not edit.
41031
41522
  */
41032
41523
 
41033
- export { ChatBubbleComponent as $, ACCESS_DOMAINS as A, ButtonComponent as B, AssetUrlPipe as C, Assets as D, AuthActivityPageComponent as E, AuthApiService as F, AuthStore as G, HeaderComponent$1 as H, InputType as I, AutosizeDirective as J, BadgeComponent as K, LabelComponent as L, MODAL_REF as M, BandingComponent as N, BaseArrayInputComponent as O, BaseRootWebComponent as P, BaseWebComponent as Q, RangeInputComponent as R, BrowserLocaleService as S, TranslatePipe as T, ButtonGroupComponent as U, CALLING_APP_HEADER as V, COMPONENT_INPUT_REGISTRY as W, CardComponent as X, CardWrapperComponent as Y, CarouselComponent as Z, ChartComponent as _, MIN_ZOOM as a, HttpService as a$, CheckboxGroupComponent as a0, CheckboxInputComponent as a1, ClearableInputComponent as a2, ClipboardService as a3, ColComponent as a4, ColorPickerInputComponent as a5, CommentItemComponent as a6, CommentsApiService as a7, CommentsComponent as a8, CommentsStore as a9, DeviceService as aA, DocComponent as aB, DocEditorComponent as aC, DomService as aD, Domain as aE, DotGridComponent as aF, DragListDirective as aG, DragListItemDirective as aH, DraggableDirective as aI, DropdownInputComponent as aJ, FILTER_GROUP_CONTEXT as aK, FILTER_RANGE_MODES as aL, FILTER_VARIANTS as aM, FLEX_VARIANTS as aN, FOLDER_PICK_LISTENER as aO, FORM_ASSET_FOLDER as aP, FileService as aQ, FileUploadDirective as aR, FileUploadInputComponent as aS, FlexComponent as aT, FlexItemComponent as aU, FormGroupComponent as aV, FrameComponent as aW, FreezeService as aX, GRID_BREAKPOINTS as aY, GetNavService as aZ, HighlightDirective as a_, CompactNumberPipe as aa, ComponentInputComponent as ab, ComponentStepperComponent as ac, ConfigComponent as ad, ConfirmComponent as ae, ContextMenuComponent as af, CustomIconClass as ag, CustomIconEditComponent as ah, DEFAULT_DENIAL as ai, DEFAULT_DOC_DENSITY as aj, DEFAULT_DOC_VARIANT as ak, DEFAULT_FILTER_RANGE_MODE as al, DEFAULT_FILTER_VARIANT as am, DEFAULT_NAV_PARAM as an, DEFAULT_NAV_SEGMENT as ao, DEFAULT_SIZE as ap, DOCK_MIN_PAGE_REMAINDER as aq, DOCS_FOLDER as ar, DOC_ACTION_ICONS as as, DOC_DENSITIES as at, DOC_EDIT_ACTIONS as au, DOC_TOOLBAR_GROUPS as av, DOC_VARIANTS as aw, DashboardCardComponent as ax, DateInputComponent as ay, DatePickerComponent as az, MAX_ZOOM as b, PLATFORM_BUTTON_NAV_IDS as b$, ICON_SOURCE as b0, IS_SIDE_PANEL as b1, IconComponent as b2, ImgComponent as b3, InstrumentScoreComponent as b4, InterceptorObservables as b5, JumbotronComponent as b6, KeyValueComponent as b7, LAYOUT_ASSET_FOLDER as b8, LOGIN_COMPONENT as b9, NAV_MAIN_BUTTONS as bA, NAV_SEGMENT_RE as bB, NAV_STORE_REF as bC, NAV_WC_COMPONENTS as bD, NAV_WIDGET_MAP as bE, NavComponent as bF, NavDetailsComponent as bG, NavHeaderComponent as bH, NavMenuComponent as bI, NavStore as bJ, NavTrailComponent as bK, NothingComponent as bL, NotificationElementComponent as bM, NotificationGroupComponent as bN, NotificationPopupComponent as bO, NotificationService as bP, NotificationStore as bQ, NotificationType as bR, NotificationWidgetComponent as bS, ONE_ASSET_BASE_URL as bT, OPTIONS_SOURCE as bU, OVERLAY_WIDGETS as bV, OneApp as bW, OptionsSourceDirective as bX, OverlayBodyComponent as bY, OverlayRef as bZ, OverlayService as b_, LOGIN_STORE as ba, LanguageComponent as bb, ListComponent as bc, LogoComponent as bd, MAG_SOCKET_EVENT as be, MHeroColorDirective as bf, MHeroComponent as bg, MODAL_STORE_REF as bh, MOUNT_STATIC_SEGMENT as bi, MOUNT_TOKEN as bj, MRefDirective as bk, MStepComponent as bl, MURL_PARAM as bm, MURL_SEP as bn, ManifestEnrichmentService as bo, MarginDirective as bp, MenuComponent as bq, ModalDirective as br, ModalRef as bs, ModalStore as bt, MoneyPipe as bu, MultiRangeInputComponent as bv, MultiselectInputComponent as bw, MurlUrlSerializer as bx, NAV_DEFAULT_MURL as by, NAV_ID_SEP as bz, cropRect as c, SectionToggleItemDirective as c$, PLATFORM_EXTENSIBLE_NAV_IDS as c0, PLATFORM_NAV_MAP as c1, PLATFORM_ROOT_CHILDREN as c2, PaddingDirective as c3, PaginationComponent as c4, PanelComponent as c5, PercentagePipe as c6, PlaygroundComponent as c7, PositionDirective as c8, PwaInstallComponent as c9, SectionAccordionDirective as cA, SectionAccordionGroupDirective as cB, SectionBackComponent as cC, SectionBadgesComponent as cD, SectionButtonGroupComponent as cE, SectionCardComponent as cF, SectionCarouselComponent as cG, SectionComponent as cH, SectionFilterComponent as cI, SectionFilterGroupComponent as cJ, SectionFilterMenuComponent as cK, SectionFilterPanelComponent as cL, SectionFilterRangePanelComponent as cM, SectionFooterComponent as cN, SectionFormComponent as cO, SectionFormItemComponent as cP, SectionHeaderComponent as cQ, SectionHeroComponent as cR, SectionPaginationComponent as cS, SectionSearchComponent as cT, SectionStepperComponent as cU, SectionTableCellComponent as cV, SectionTableComponent as cW, SectionTableRowComponent as cX, SectionTableSortPipe as cY, SectionTabsComponent as cZ, SectionToggleComponent as c_, RECENT_SEARCH_LIMIT as ca, REMOTE_PAGE_RELOAD as cb, ROOT_NAV$1 as cc, RadioGroupComponent as cd, RadioInputComponent as ce, RatingInputComponent as cf, ReactiveElementComponent as cg, RemoteComponent as ch, RemoteLoaderService as ci, ResizeElementComponent as cj, RouteContainer as ck, RowComponent as cl, SEARCH_QUERY as cm, SEARCH_RESULTS_EVENT as cn, SECTION_ACCORDION_GROUP as co, SECTION_FORM_CONTEXT as cp, SECTION_TABLE_VARIANTS as cq, SHARED_ICONS as cr, SIZE_CONTEXT as cs, SPACING_INWARD as ct, ScoreComponent as cu, ScrollComponent as cv, ScrollService as cw, SearchPanelComponent as cx, SearchStore as cy, SearchUserPanelComponent as cz, drawFramed as d, applyDocEdit as d$, SelectableCardInputComponent as d0, SelectorDirective as d1, SettingsSearchBarComponent as d2, SettingsSearchService as d3, ShapeComponent as d4, SharedStoreRegistry as d5, SidePanelDirective as d6, Size as d7, SocketStore as d8, SortComponent as d9, ToggleRadioInputComponent as dA, ToolTipDirective as dB, TooltipComponent as dC, TranslateService as dD, TreeGridComponent as dE, URL_SEP as dF, USER_STORE_REF as dG, USER_TAB_MAP as dH, UniverseComponent as dI, UserApiService as dJ, UserAvatarComponent as dK, UserComponent as dL, UserNavComponent as dM, UserSettingsComponent as dN, UserStore as dO, WC_BUNDLE as dP, WC_NAVIGATE_EVENT as dQ, WC_ROUTE_CHANGED_EVENT as dR, WC_SEARCH_GROUPS as dS, WIN_USER_TAB_HOOK as dT, WIN_USER_TAB_KEY as dU, WatermarkComponent as dV, WcRouterStore as dW, WrapperInputComponent as dX, allowedCodes as dY, anchorNavId as dZ, applyColorsToElement as d_, StatComponent as da, StepComponent as db, StepperComponent as dc, StepsComponent as dd, StorageService as de, StrokeLinecap as df, StrokeLinejoin as dg, SummaryComponent as dh, SvgGeneratorComponent as di, SvgGeneratorService as dj, SvgService as dk, TOTAL_COLUMNS as dl, TRANSLATION_SOURCE as dm, TableComponent as dn, TechnicalMeterComponent as dp, TextInputComponent as dq, TextareaInputComponent as dr, ThemeComponent as ds, ThemeDataService as dt, ThemeService as du, ThemeStore as dv, TimeAgoPipe as dw, TimelineComponent as dx, ToggleButtonComponent as dy, ToggleInputComponent as dz, encodeFramed as e, initialNotificationState as e$, assetOptions as e0, bootstrapMagApp as e1, bootstrapPwaInstall as e2, browserLocale as e3, buildWcBaseUrl as e4, calculateLuminance as e5, calculateRanks as e6, cellText as e7, checkDoc as e8, checkFilterCondition as e9, filterHoldsRange as eA, filterList as eB, filterNumber as eC, filterNumberList as eD, filterOne as eE, filterPanelOf as eF, filterPanelWidth as eG, filterRange as eH, filterTreeGridRows as eI, filterValueList as eJ, filterValues as eK, flattenTreeGridRows as eL, formatBadgeCount as eM, fullName as eN, generateClipPath as eO, generateTransform as eP, getClassList as eQ, getProperty as eR, getScrollParent as eS, getTierFromPreviewPath as eT, getTreeGridRow as eU, getUniqueId as eV, getValue as eW, hasErrorComputed as eX, hexToRgb as eY, hslToRgb$1 as eZ, initMagmoniumApp as e_, childNavId as ea, claimDenial as eb, classListSignal as ec, coerceSize as ed, cornerEdge as ee, cornerSide as ef, createMap as eg, createPlatformNavMap as eh, definedWcTierOf as ei, deriveAvatarGradient as ej, deriveContrastColor as ek, deriveOppositeColor as el, derivePropertyName as em, docActionKey as en, docAssetCandidates as eo, docProblemKey as ep, docRemotePath as eq, emailValidation as er, evaluate as es, evaluateBool as et, fieldBoolean as eu, fieldNumber as ev, fieldString as ew, filterHoldsList as ex, filterHoldsOneBound as ey, filterHoldsOptions as ez, clampFraming as f, parsePatternNames as f$, initialState$2 as f0, initials as f1, injectAuthenticate as f2, injectDefaultDenial as f3, injectInstallApp as f4, injectParentSize as f5, injectScrollSticky as f6, isBootRedirect as f7, isButtonName as f8, isCancelledComputed as f9, mergeUniqueBy as fA, mergeUniqueWith as fB, minAgeValidation as fC, minLengthValidation as fD, minValidation as fE, miniMarkToHtml as fF, mountFor as fG, mountPatternProblem as fH, mountPatternText as fI, mountSegmentOf as fJ, mountTokenOf as fK, navIdChain as fL, navIdFor as fM, navIdSegment as fN, navIdToRoutePath as fO, navIdToSegments as fP, navParamOf as fQ, navTailMatcher as fR, navToId as fS, navVisibilityGuard as fT, nextSectionTableSort as fU, normalizeAssetOptions as fV, offsetOfLine as fW, parentNavId as fX, parseAddress as fY, parseColor as fZ, parseMountPattern as f_, isExtensiblePlatformNavId as fa, isJson as fb, isLoadingComputed as fc, isLocalhost as fd, isNavInstanceConfig as fe, isNavMenuConfig as ff, isNavRowsConfig as fg, isNavVisibilityConfig as fh, isPlatformNavId as fi, isSize as fj, isTierPreview as fk, isUrlLocalhost as fl, isValidNavId as fm, isValidNavSegment as fn, isWebComponent as fo, linkToId as fp, linkToNav as fq, loadingActions as fr, mInterceptor as fs, manualValidation as ft, matchFieldValidation as fu, matchMount as fv, maxLengthValidation as fw, maxValidation as fx, mergePlatformNav as fy, mergeUnique as fz, BaseInputComponent as g, patternValidation as g0, patternsValidation as g1, permissionRefusal as g2, pickSupportedLanguage as g3, platformNavWidgets as g4, presetDefaultOption as g5, privateGuard as g6, processImageToSvg as g7, provideAppContext as g8, provideMagAppConfig as g9, samePatterns as gA, sectionTableColumnId as gB, sectionTableColumnWidths as gC, sectionTableFrozenCount as gD, segmentsToNavId as gE, setProperty as gF, setTreeGridChildren as gG, setWcTier as gH, settingsWidgets as gI, shouldShowBadge as gJ, sortSectionTableRows as gK, splitNavId as gL, splitOnMatch as gM, stringToColor as gN, tailRouteOf as gO, toAttrBool as gP, toAttrNumber as gQ, toCssLength as gR, toHostNavId as gS, toLength$1 as gT, toLocalNavId as gU, toggleTreeGridRow as gV, unfetchedPlatformNav as gW, ungroupedDocActions as gX, urlValidation as gY, wcTierOf as gZ, provideMagWcConfig as ga, provideMagWcRoutes as gb, provideModalComponents as gc, provideMurlUrlSerializer as gd, provideNavWidgets as ge, provideOverlayWidgets as gf, providePlatformNavWidgets as gg, provideSearch as gh, provideSizeContext as gi, provideUserTabs as gj, publicGuard as gk, readFieldPatterns as gl, recordDefinedWcTier as gm, remoteOutletRoute as gn, renderAddress as go, renderDocument as gp, requiredValidation as gq, resolveConfigAsset as gr, resolveIconSize as gs, resolvePallet as gt, resolvePatternRules as gu, resolveSize as gv, resolveSpacing as gw, rgbToHex as gx, rgbToHsl as gy, rowHasChildren as gz, BaseTextInputComponent as h, initialFraming as i, TextOutputComponent as j, IS_DESIGN_MODE as k, APP_CONTEXT_REF as l, APP_LINK as m, ASSET_BASE_URL as n, outputSize as o, parseRatio as p, AccordionBodyDirective as q, renameForType as r, AccordionComponent as s, AccordionGroupComponent as t, ActionComponent as u, AnimatedGraphsComponent as v, AppCardComponent as w, AppRelationType as x, AppTileComponent as y, AssetStore as z };
41034
- //# sourceMappingURL=magmonium-one-magmonium-one-xCRWlG4J.mjs.map
41524
+ export { ChatBubbleComponent as $, ACCESS_DOMAINS as A, ButtonComponent as B, AssetUrlPipe as C, Assets as D, AuthActivityPageComponent as E, AuthApiService as F, AuthStore as G, HeaderComponent$1 as H, InputType as I, AutosizeDirective as J, BadgeComponent as K, LabelComponent as L, MODAL_REF as M, BandingComponent as N, BaseArrayInputComponent as O, BaseRootWebComponent as P, BaseWebComponent as Q, RangeInputComponent as R, BrowserLocaleService as S, TranslatePipe as T, ButtonGroupComponent as U, CALLING_APP_HEADER as V, COMPONENT_INPUT_REGISTRY as W, CardComponent as X, CardWrapperComponent as Y, CarouselComponent as Z, ChartComponent as _, MIN_ZOOM as a, HttpService as a$, CheckboxGroupComponent as a0, CheckboxInputComponent as a1, ClearableInputComponent as a2, ClipboardService as a3, ColComponent as a4, ColorPickerInputComponent as a5, CommentItemComponent as a6, CommentsApiService as a7, CommentsComponent as a8, CommentsStore as a9, DeviceService as aA, DocComponent as aB, DocEditorComponent as aC, DomService as aD, Domain as aE, DotGridComponent as aF, DragListDirective as aG, DragListItemDirective as aH, DraggableDirective as aI, DropdownInputComponent as aJ, FILTER_GROUP_CONTEXT as aK, FILTER_RANGE_MODES as aL, FILTER_VARIANTS as aM, FLEX_VARIANTS as aN, FOLDER_PICK_LISTENER as aO, FORM_ASSET_FOLDER as aP, FileService as aQ, FileUploadDirective as aR, FileUploadInputComponent as aS, FlexComponent as aT, FlexItemComponent as aU, FormGroupComponent as aV, FrameComponent as aW, FreezeService as aX, GRID_BREAKPOINTS as aY, GetNavService as aZ, HighlightDirective as a_, CompactNumberPipe as aa, ComponentInputComponent as ab, ComponentStepperComponent as ac, ConfigComponent as ad, ConfirmComponent as ae, ContextMenuComponent as af, CustomIconClass as ag, CustomIconEditComponent as ah, DEFAULT_DENIAL as ai, DEFAULT_DOC_DENSITY as aj, DEFAULT_DOC_VARIANT as ak, DEFAULT_FILTER_RANGE_MODE as al, DEFAULT_FILTER_VARIANT as am, DEFAULT_NAV_PARAM as an, DEFAULT_NAV_SEGMENT as ao, DEFAULT_SIZE as ap, DOCK_MIN_PAGE_REMAINDER as aq, DOCS_FOLDER as ar, DOC_ACTION_ICONS as as, DOC_DENSITIES as at, DOC_EDIT_ACTIONS as au, DOC_TOOLBAR_GROUPS as av, DOC_VARIANTS as aw, DashboardCardComponent as ax, DateInputComponent as ay, DatePickerComponent as az, MAX_ZOOM as b, OverlayService as b$, ICON_SOURCE as b0, IS_SIDE_PANEL as b1, IconComponent as b2, ImgComponent as b3, InstrumentScoreComponent as b4, InterceptorObservables as b5, JumbotronComponent as b6, KeyValueComponent as b7, LAYOUT_ASSET_FOLDER as b8, LOADING_ACTIONS_REF as b9, NAV_ID_SEP as bA, NAV_MAIN_BUTTONS as bB, NAV_SEGMENT_RE as bC, NAV_STORE_REF as bD, NAV_WC_COMPONENTS as bE, NAV_WIDGET_MAP as bF, NavComponent as bG, NavDetailsComponent as bH, NavHeaderComponent as bI, NavMenuComponent as bJ, NavStore as bK, NavTrailComponent as bL, NothingComponent as bM, NotificationElementComponent as bN, NotificationGroupComponent as bO, NotificationPopupComponent as bP, NotificationService as bQ, NotificationStore as bR, NotificationType as bS, NotificationWidgetComponent as bT, ONE_ASSET_BASE_URL as bU, OPTIONS_SOURCE as bV, OVERLAY_WIDGETS as bW, OneApp as bX, OptionsSourceDirective as bY, OverlayBodyComponent as bZ, OverlayRef as b_, LOGIN_COMPONENT as ba, LOGIN_STORE as bb, LanguageComponent as bc, ListComponent as bd, LogoComponent as be, MAG_SOCKET_EVENT as bf, MHeroColorDirective as bg, MHeroComponent as bh, MODAL_STORE_REF as bi, MOUNT_STATIC_SEGMENT as bj, MOUNT_TOKEN as bk, MRefDirective as bl, MStepComponent as bm, MURL_PARAM as bn, MURL_SEP as bo, ManifestEnrichmentService as bp, MarginDirective as bq, MenuComponent as br, ModalDirective as bs, ModalRef as bt, ModalStore as bu, MoneyPipe as bv, MultiRangeInputComponent as bw, MultiselectInputComponent as bx, MurlUrlSerializer as by, NAV_DEFAULT_MURL as bz, cropRect as c, SectionStepperComponent as c$, PLATFORM_BUTTON_NAV_IDS as c0, PLATFORM_EXTENSIBLE_NAV_IDS as c1, PLATFORM_NAV_MAP as c2, PLATFORM_ROOT_CHILDREN as c3, PLUGIN_FALLBACK_LANG as c4, PLUGIN_OUTPUT_EVENT as c5, PLUGIN_SCREENS as c6, PaddingDirective as c7, PaginationComponent as c8, PanelComponent as c9, SPACING_INWARD as cA, ScoreComponent as cB, ScrollComponent as cC, ScrollService as cD, SearchPanelComponent as cE, SearchStore as cF, SearchUserPanelComponent as cG, SectionAccordionDirective as cH, SectionAccordionGroupDirective as cI, SectionBackComponent as cJ, SectionBadgesComponent as cK, SectionButtonGroupComponent as cL, SectionCardComponent as cM, SectionCarouselComponent as cN, SectionComponent as cO, SectionFilterComponent as cP, SectionFilterGroupComponent as cQ, SectionFilterMenuComponent as cR, SectionFilterPanelComponent as cS, SectionFilterRangePanelComponent as cT, SectionFooterComponent as cU, SectionFormComponent as cV, SectionFormItemComponent as cW, SectionHeaderComponent as cX, SectionHeroComponent as cY, SectionPaginationComponent as cZ, SectionSearchComponent as c_, PercentagePipe as ca, PlaygroundComponent as cb, PluginComponent as cc, PluginInputComponent as cd, PluginOutputComponent as ce, PositionDirective as cf, PwaInstallComponent as cg, RECENT_SEARCH_LIMIT as ch, REMOTE_PAGE_RELOAD as ci, ROOT_NAV$1 as cj, RadioGroupComponent as ck, RadioInputComponent as cl, RatingInputComponent as cm, ReactiveElementComponent as cn, RemoteComponent as co, RemoteLoaderService as cp, ResizeElementComponent as cq, RouteContainer as cr, RowComponent as cs, SEARCH_QUERY as ct, SEARCH_RESULTS_EVENT as cu, SECTION_ACCORDION_GROUP as cv, SECTION_FORM_CONTEXT as cw, SECTION_TABLE_VARIANTS as cx, SHARED_ICONS as cy, SIZE_CONTEXT as cz, drawFramed as d, WIN_USER_TAB_KEY as d$, SectionTableCellComponent as d0, SectionTableComponent as d1, SectionTableRowComponent as d2, SectionTableSortPipe as d3, SectionTabsComponent as d4, SectionToggleComponent as d5, SectionToggleItemDirective as d6, SelectableCardInputComponent as d7, SelectorDirective as d8, SettingsSearchBarComponent as d9, ThemeDataService as dA, ThemeService as dB, ThemeStore as dC, TimeAgoPipe as dD, TimelineComponent as dE, ToggleButtonComponent as dF, ToggleInputComponent as dG, ToggleRadioInputComponent as dH, ToolTipDirective as dI, TooltipComponent as dJ, TranslateService as dK, TreeGridComponent as dL, URL_SEP as dM, USER_STORE_REF as dN, USER_TAB_MAP as dO, UniverseComponent as dP, UserApiService as dQ, UserAvatarComponent as dR, UserComponent as dS, UserNavComponent as dT, UserSettingsComponent as dU, UserStore as dV, WC_BUNDLE as dW, WC_NAVIGATE_EVENT as dX, WC_ROUTE_CHANGED_EVENT as dY, WC_SEARCH_GROUPS as dZ, WIN_USER_TAB_HOOK as d_, SettingsSearchService as da, ShapeComponent as db, SharedStoreRegistry as dc, SidePanelDirective as dd, Size as de, SocketStore as df, SortComponent as dg, StatComponent as dh, StepComponent as di, StepperComponent as dj, StepsComponent as dk, StorageService as dl, StrokeLinecap as dm, StrokeLinejoin as dn, SummaryComponent as dp, SvgGeneratorComponent as dq, SvgGeneratorService as dr, SvgService as ds, TOTAL_COLUMNS as dt, TRANSLATION_SOURCE as du, TableComponent as dv, TechnicalMeterComponent as dw, TextInputComponent as dx, TextareaInputComponent as dy, ThemeComponent as dz, encodeFramed as e, generateTransform as e$, WatermarkComponent as e0, WcRouterStore as e1, WrapperInputComponent as e2, allowedCodes as e3, anchorNavId as e4, applyColorsToElement as e5, applyDocEdit as e6, assetOptions as e7, bootstrapMagApp as e8, bootstrapPwaInstall as e9, docRemotePath as eA, emailValidation as eB, evaluate as eC, evaluateBool as eD, exposeScreens as eE, exposedScreensOf as eF, fieldBoolean as eG, fieldNumber as eH, fieldString as eI, filterHoldsList as eJ, filterHoldsOneBound as eK, filterHoldsOptions as eL, filterHoldsRange as eM, filterList as eN, filterNumber as eO, filterNumberList as eP, filterOne as eQ, filterPanelOf as eR, filterPanelWidth as eS, filterRange as eT, filterTreeGridRows as eU, filterValueList as eV, filterValues as eW, flattenTreeGridRows as eX, formatBadgeCount as eY, fullName as eZ, generateClipPath as e_, browserLocale as ea, buildWcBaseUrl as eb, calculateLuminance as ec, calculateRanks as ed, cellText as ee, checkDoc as ef, checkFilterCondition as eg, childNavId as eh, claimDenial as ei, classListSignal as ej, coerceSize as ek, cornerEdge as el, cornerSide as em, createLoadingState as en, createMap as eo, createPlatformNavMap as ep, createPluginElement as eq, definePluginScreens as er, definedWcTierOf as es, deriveAvatarGradient as et, deriveContrastColor as eu, deriveOppositeColor as ev, derivePropertyName as ew, docActionKey as ex, docAssetCandidates as ey, docProblemKey as ez, clampFraming as f, navIdToSegments as f$, getClassList as f0, getProperty as f1, getScrollParent as f2, getTierFromPreviewPath as f3, getTreeGridRow as f4, getUniqueId as f5, getValue as f6, hasErrorComputed as f7, hexToRgb as f8, hslToRgb$1 as f9, isWebComponent as fA, linkToId as fB, linkToNav as fC, loadingActions as fD, mInterceptor as fE, manualValidation as fF, matchFieldValidation as fG, matchMount as fH, maxLengthValidation as fI, maxValidation as fJ, mergePlatformNav as fK, mergeUnique as fL, mergeUniqueBy as fM, mergeUniqueWith as fN, minAgeValidation as fO, minLengthValidation as fP, minValidation as fQ, miniMarkToHtml as fR, mountFor as fS, mountPatternProblem as fT, mountPatternText as fU, mountSegmentOf as fV, mountTokenOf as fW, navIdChain as fX, navIdFor as fY, navIdSegment as fZ, navIdToRoutePath as f_, initMagmoniumApp as fa, initialNotificationState as fb, initialState$2 as fc, initials as fd, injectAuthenticate as fe, injectDefaultDenial as ff, injectInstallApp as fg, injectParentSize as fh, injectScrollSticky as fi, isBootRedirect as fj, isButtonName as fk, isCancelledComputed as fl, isExtensiblePlatformNavId as fm, isJson as fn, isLoadingComputed as fo, isLocalhost as fp, isNavInstanceConfig as fq, isNavMenuConfig as fr, isNavRowsConfig as fs, isNavVisibilityConfig as ft, isPlatformNavId as fu, isSize as fv, isTierPreview as fw, isUrlLocalhost as fx, isValidNavId as fy, isValidNavSegment as fz, BaseInputComponent as g, splitOnMatch as g$, navParamOf as g0, navTailMatcher as g1, navToId as g2, navVisibilityGuard as g3, nextSectionTableSort as g4, normalizeAssetOptions as g5, offsetOfLine as g6, parentNavId as g7, parseAddress as g8, parseColor as g9, recordDefinedWcTier as gA, remoteOutletRoute as gB, renderAddress as gC, renderDocument as gD, requiredValidation as gE, resolveConfigAsset as gF, resolveIconSize as gG, resolvePallet as gH, resolvePatternRules as gI, resolveSize as gJ, resolveSpacing as gK, rgbToHex as gL, rgbToHsl as gM, rowHasChildren as gN, samePatterns as gO, sectionTableColumnId as gP, sectionTableColumnWidths as gQ, sectionTableFrozenCount as gR, segmentsToNavId as gS, setProperty as gT, setTreeGridChildren as gU, setWcLocalPort as gV, setWcTier as gW, settingsWidgets as gX, shouldShowBadge as gY, sortSectionTableRows as gZ, splitNavId as g_, parseMountPattern as ga, parsePatternNames as gb, patternValidation as gc, patternsValidation as gd, permissionRefusal as ge, pickSupportedLanguage as gf, platformNavWidgets as gg, pluginTag as gh, presetDefaultOption as gi, privateGuard as gj, processImageToSvg as gk, provideAppContext as gl, provideMagAppConfig as gm, provideMagWcConfig as gn, provideMagWcRoutes as go, provideModalComponents as gp, provideMurlUrlSerializer as gq, provideNavWidgets as gr, provideOverlayWidgets as gs, providePlatformNavWidgets as gt, providePluginRuntime as gu, provideSearch as gv, provideSizeContext as gw, provideUserTabs as gx, publicGuard as gy, readFieldPatterns as gz, BaseTextInputComponent as h, stringToColor as h0, tailRouteOf as h1, toAttrBool as h2, toAttrNumber as h3, toCssLength as h4, toHostNavId as h5, toLength$1 as h6, toLocalNavId as h7, toggleTreeGridRow as h8, unfetchedPlatformNav as h9, ungroupedDocActions as ha, urlValidation as hb, wcLocalBaseOf as hc, wcTierOf as hd, initialFraming as i, TextOutputComponent as j, IS_DESIGN_MODE as k, APP_CONTEXT_REF as l, APP_LINK as m, ASSET_BASE_URL as n, outputSize as o, parseRatio as p, AccordionBodyDirective as q, renameForType as r, AccordionComponent as s, AccordionGroupComponent as t, ActionComponent as u, AnimatedGraphsComponent as v, AppCardComponent as w, AppRelationType as x, AppTileComponent as y, AssetStore as z };
41525
+ //# sourceMappingURL=magmonium-one-magmonium-one-BLuMt3bj.mjs.map