@magmonium/one 0.3.14 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (21) hide show
  1. package/assets/button_groups/notification_actions.json +5 -0
  2. package/assets/buttons/accept_notification.json +4 -0
  3. package/assets/buttons/login_new_user.json +4 -0
  4. package/assets/buttons/search_result.json +4 -0
  5. package/assets/fields/comment_text.json +6 -0
  6. package/assets/i18n/en.json +23 -0
  7. package/assets/index.json +1 -1
  8. package/fesm2022/{magmonium-one-image-editor-CurYe_Mb.mjs → magmonium-one-image-editor-BjCvZ9rH.mjs} +2 -2
  9. package/fesm2022/{magmonium-one-image-editor-CurYe_Mb.mjs.map → magmonium-one-image-editor-BjCvZ9rH.mjs.map} +1 -1
  10. package/fesm2022/{magmonium-one-magmonium-one-Dr2fBHOB.mjs → magmonium-one-magmonium-one-B5qzsrNB.mjs} +1698 -1096
  11. package/fesm2022/magmonium-one-magmonium-one-B5qzsrNB.mjs.map +1 -0
  12. package/fesm2022/{magmonium-one-otp-B-NBB6PF.mjs → magmonium-one-otp-BwXKEaEg.mjs} +2 -2
  13. package/fesm2022/{magmonium-one-otp-B-NBB6PF.mjs.map → magmonium-one-otp-BwXKEaEg.mjs.map} +1 -1
  14. package/fesm2022/{magmonium-one-password-yXiSYlMS.mjs → magmonium-one-password-CyHOns1l.mjs} +2 -2
  15. package/fesm2022/{magmonium-one-password-yXiSYlMS.mjs.map → magmonium-one-password-CyHOns1l.mjs.map} +1 -1
  16. package/fesm2022/{magmonium-one-toggle-atjxl_R_.mjs → magmonium-one-toggle-CpMURu38.mjs} +2 -2
  17. package/fesm2022/{magmonium-one-toggle-atjxl_R_.mjs.map → magmonium-one-toggle-CpMURu38.mjs.map} +1 -1
  18. package/fesm2022/magmonium-one.mjs +1 -1
  19. package/package.json +1 -1
  20. package/types/magmonium-one.d.ts +184 -56
  21. package/fesm2022/magmonium-one-magmonium-one-Dr2fBHOB.mjs.map +0 -1
@@ -1,7 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, inject, Injectable, signal, computed, DestroyRef, DOCUMENT, ApplicationRef, RendererFactory2, createComponent, EnvironmentInjector, Pipe, ChangeDetectorRef, untracked, ElementRef, afterNextRender, input, ChangeDetectionStrategy, Component, effect, Injector, reflectComponentType, model, HostListener, Renderer2, Directive, output, viewChild, ViewEncapsulation, forwardRef, contentChild, TemplateRef, ViewContainerRef, inputBinding, outputBinding, linkedSignal, afterRenderEffect, runInInjectionContext, Input, booleanAttribute, HostAttributeToken, viewChildren, afterEveryRender, EventEmitter, Output, ViewChild, ContentChild, provideZonelessChangeDetection, makeEnvironmentProviders, HostBinding, provideAppInitializer, provideBrowserGlobalErrorListeners, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
2
+ import { InjectionToken, signal, inject, Injectable, computed, DestroyRef, 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, runInInjectionContext, contentChild, TemplateRef, ViewContainerRef, outputBinding, linkedSignal, afterRenderEffect, Input, booleanAttribute, HostAttributeToken, viewChildren, afterEveryRender, EventEmitter, Output, ViewChild, 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
- import { firstValueFrom, of, tap, catchError, throwError, shareReplay, finalize, forkJoin, map, Observable, pipe, interval, fromEvent, switchMap as switchMap$1, filter, EMPTY, Subject, combineLatest, race, take, from, startWith } from 'rxjs';
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';
6
6
  import { signalStore, withState, withMethods, patchState, withHooks, withComputed, withProps } from '@ngrx/signals';
7
7
  import { rxMethod } from '@ngrx/signals/rxjs-interop';
@@ -102,6 +102,13 @@ const NAV_STORE_REF = new InjectionToken('NAV_STORE_REF');
102
102
  const MODAL_STORE_REF = new InjectionToken('MODAL_STORE_REF');
103
103
  const USER_STORE_REF = new InjectionToken('USER_STORE_REF');
104
104
  const APP_CONTEXT_REF = new InjectionToken('APP_CONTEXT_REF');
105
+ /**
106
+ * This application's own AppLink. `root` is per bootstrapped app, so a Remote
107
+ * never reads its host's — unlike NavStore's `appLink`, which is the host's
108
+ * active app. The interceptor names the App in `X-Mag-App` with it (api ADR
109
+ * 0007) and init asks for Agreement to it.
110
+ */
111
+ const APP_LINK = new InjectionToken('APP_LINK', { providedIn: 'root', factory: () => signal(undefined) });
105
112
  const IS_SIDE_PANEL = new InjectionToken('IS_SIDE_PANEL');
106
113
  // SVG markup supplied by name from memory instead of fetched as an asset.
107
114
  // `m-icon` reads it before its own resource, so a glyph that exists only in a
@@ -3212,8 +3219,15 @@ const NotificationStore = signalStore({ providedIn: 'root' }, withState(initialN
3212
3219
  },
3213
3220
  notify: (notification) => {
3214
3221
  const id = notification.id ?? generateId();
3215
- const newNotification = { ...notification, id };
3216
- const exists = !!state.notificationMap()[id];
3222
+ const existing = state.notificationMap()[id];
3223
+ const exists = !!existing;
3224
+ // An upsert keeps what the User did to the row unless the caller says
3225
+ // otherwise: a re-raised Violation stays read (ADR 0157).
3226
+ const newNotification = {
3227
+ ...notification,
3228
+ id,
3229
+ read: notification.read ?? existing?.read,
3230
+ };
3217
3231
  patchState(state, {
3218
3232
  notifications: exists
3219
3233
  ? state.notifications()
@@ -3222,7 +3236,7 @@ const NotificationStore = signalStore({ providedIn: 'root' }, withState(initialN
3222
3236
  ...state.notificationMap(),
3223
3237
  [id]: newNotification,
3224
3238
  },
3225
- popupNotifications: exists
3239
+ popupNotifications: exists || notification.silent
3226
3240
  ? state.popupNotifications()
3227
3241
  : [id, ...state.popupNotifications()],
3228
3242
  });
@@ -3261,7 +3275,9 @@ const NotificationStore = signalStore({ providedIn: 'root' }, withState(initialN
3261
3275
  state.notifications().forEach((id) => {
3262
3276
  const notification = updatedMap[id];
3263
3277
  if (notification) {
3264
- if (notification.severity === 'error') {
3278
+ // A persistent error stands until what raised it withdraws it — a
3279
+ // blocking Violation (ADR 0157) — so it is read, not cleared.
3280
+ if (notification.severity === 'error' && !notification.persistent) {
3265
3281
  toRemove.push(id);
3266
3282
  }
3267
3283
  else {
@@ -3505,7 +3521,7 @@ params) => {
3505
3521
  (murl.length > 0 &&
3506
3522
  anchor.navId.startsWith(`${urlNavId}${NAV_ID_SEP}`)))
3507
3523
  ? anchor.path
3508
- : fillParams(navIdToRoutePath(urlNavId, navMap), params);
3524
+ : fillRoutePath(urlNavId, navMap, params);
3509
3525
  // Always keeps the leading `/`: a bare `|search` is a *relative* URL and
3510
3526
  // would resolve against the current directory (ADR 0013).
3511
3527
  const base = path === URL_SEP ? URL_SEP : path.replace(/\/$/, '');
@@ -3515,6 +3531,22 @@ params) => {
3515
3531
  const fillParams = (path, params) => params
3516
3532
  ? path.replace(/:([a-zA-Z0-9_]+)/g, (match, name) => params[name] !== undefined ? String(params[name]) : match)
3517
3533
  : path;
3534
+ /**
3535
+ * A Url NavId's route path with its params filled — and, for a NavTail, the
3536
+ * rest appended as its tail value names it, separators kept, since the tail is
3537
+ * every segment below the Nav and not one (m-one-ui CONTEXT.md NavTail). No
3538
+ * tail value is no rest: the Nav's own address.
3539
+ */
3540
+ const fillRoutePath = (navId, navMap, params) => {
3541
+ const path = fillParams(navIdToRoutePath(navId, navMap), params);
3542
+ const tailName = navMap[navId]?.tail;
3543
+ const rest = tailName && params?.[tailName] !== undefined
3544
+ ? String(params[tailName]).replace(/^\/+/, '')
3545
+ : '';
3546
+ if (!rest)
3547
+ return path;
3548
+ return path === URL_SEP ? `${URL_SEP}${rest}` : `${path}${URL_SEP}${rest}`;
3549
+ };
3518
3550
  /**
3519
3551
  * Splits a location into its route path and its Murl segments. Accepts the
3520
3552
  * percent-encoded form too, because `|` is not URL-unreserved and any encoder
@@ -4582,6 +4614,17 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
4582
4614
  return undefined;
4583
4615
  };
4584
4616
  const widgetEntry = computed(() => firstEntry(widgetNavIds()), ...(ngDevMode ? [{ debugName: "widgetEntry" }] : /* istanbul ignore next */ []));
4617
+ /**
4618
+ * The instances the panel is drawn for: the Browse's while one is open —
4619
+ * the Router still describes the Page behind the panel, not the Nav the
4620
+ * User is looking into — and the Router's otherwise (CONTEXT.md Browse).
4621
+ */
4622
+ const panelParams = computed(() => store.menuNavId()
4623
+ ? Object.fromEntries(Object.entries(store.menuParams() ?? {}).map(([name, value]) => [
4624
+ name,
4625
+ String(value),
4626
+ ]))
4627
+ : store.routeParams(), ...(ngDevMode ? [{ debugName: "panelParams" }] : /* istanbul ignore next */ []));
4585
4628
  /**
4586
4629
  * Every `dynamic` Nav with a NavRowSource behind it, resolved. Walks the
4587
4630
  * whole map rather than the open panel's own descent: the rows are drawn by
@@ -4590,30 +4633,23 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
4590
4633
  */
4591
4634
  const dynamicRows = computed(() => {
4592
4635
  const out = {};
4636
+ const params = panelParams();
4593
4637
  for (const nav of Object.values(store.navMap())) {
4594
4638
  if (nav.presentation !== 'dynamic')
4595
4639
  continue;
4596
4640
  const hit = entryAt(nav.navId);
4597
4641
  if (!hit || !isNavRowsConfig(hit.entry))
4598
4642
  continue;
4643
+ const rows = hit.entry.navRowsFor
4644
+ ? hit.entry.navRowsFor(params)
4645
+ : hit.entry.navRows();
4599
4646
  out[nav.navId] = {
4600
- rows: hit.entry.navRows() ?? [],
4647
+ rows: rows ?? [],
4601
4648
  loading: hit.entry.loading?.(),
4602
4649
  };
4603
4650
  }
4604
4651
  return out;
4605
4652
  }, ...(ngDevMode ? [{ debugName: "dynamicRows" }] : /* istanbul ignore next */ []));
4606
- /**
4607
- * The instances the panel is drawn for: the Browse's while one is open —
4608
- * the Router still describes the Page behind the panel, not the Nav the
4609
- * User is looking into — and the Router's otherwise (CONTEXT.md Browse).
4610
- */
4611
- const panelParams = computed(() => store.menuNavId()
4612
- ? Object.fromEntries(Object.entries(store.menuParams() ?? {}).map(([name, value]) => [
4613
- name,
4614
- String(value),
4615
- ]))
4616
- : store.routeParams(), ...(ngDevMode ? [{ debugName: "panelParams" }] : /* istanbul ignore next */ []));
4617
4653
  /**
4618
4654
  * Every `dynamic` Nav with a NavInstanceSource behind it, resolved against
4619
4655
  * the parameters the panel is drawn for (ADR 0030) — a Browse's own, so the
@@ -4902,32 +4938,37 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
4902
4938
  * page rather than stepping out one Murl at a time (ADR 0013).
4903
4939
  *
4904
4940
  * `keepPanel` is for the AppLogo: home navigation while the menu is open
4905
- * must not clear `navOpenedByUser`, so the panel stays up on root.
4941
+ * must not clear `navOpenedByUser`, so the panel stays up on root. It also
4942
+ * raises a closed panel — a gesture whose landing is read from its panel,
4943
+ * as the editor's CodeTree is. Applied ahead of a mount's own move too:
4944
+ * the host's path changes all the same once the mount reports.
4906
4945
  */
4907
4946
  const goToNav = (navId, params, options) => {
4947
+ const willOpen = untracked(() => splitNavId(navId, store.navMap()).murl.length > 0);
4948
+ if (options?.keepPanel && !willOpen) {
4949
+ patchState(store, {
4950
+ navOpenedByUser: true,
4951
+ keepPanelOnPathChange: true,
4952
+ });
4953
+ }
4908
4954
  // A side app's own Nav moves that app; it reports, and its m-remote
4909
4955
  // writes the URL through `out` — one write path, not two.
4910
4956
  const mount = mountOf(navId);
4911
4957
  if (mount?.navigate) {
4912
4958
  const map = untracked(() => store.navMap());
4913
4959
  const own = navIdToRoutePath(mount.appNavId, map);
4914
- const full = navIdToRoutePath(navId, map);
4915
- mount.navigate(full.slice(own === URL_SEP ? 1 : own.length + 1));
4960
+ const full = fillRoutePath(navId, map, params);
4961
+ mount.navigate(full.slice(own === URL_SEP ? 1 : own.length + 1), {
4962
+ replaceUrl: !!options?.replaceUrl,
4963
+ });
4916
4964
  return;
4917
4965
  }
4918
4966
  const wasOpen = untracked(() => store.hasMurl());
4919
4967
  patchState(store, { menuNavId: undefined });
4920
4968
  const address = addressFor(navId, params);
4921
- const willOpen = untracked(() => splitNavId(navId, store.navMap()).murl.length > 0);
4922
4969
  if (willOpen && !wasOpen) {
4923
4970
  patchState(store, { panelPushed: true });
4924
4971
  }
4925
- if (options?.keepPanel && !willOpen) {
4926
- patchState(store, {
4927
- navOpenedByUser: true,
4928
- keepPanelOnPathChange: true,
4929
- });
4930
- }
4931
4972
  router.navigateByUrl(address, {
4932
4973
  replaceUrl: !!options?.replaceUrl || (wasOpen && willOpen),
4933
4974
  });
@@ -4947,20 +4988,55 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
4947
4988
  }
4948
4989
  return navId;
4949
4990
  };
4950
- /** The route parameter one Nav contributes, read off the map. */
4951
- const paramNameOf = (navId) => navParamOf(untracked(() => store.navMap())[knownNavId(navId)]);
4991
+ /**
4992
+ * The route parameter one Nav contributes, read off the map — a static
4993
+ * NavTail's being its tail, the only value it carries.
4994
+ */
4995
+ const paramNameOf = (navId) => {
4996
+ const nav = untracked(() => store.navMap())[knownNavId(navId)];
4997
+ return nav?.tail && nav.presentation !== 'dynamic'
4998
+ ? nav.tail
4999
+ : navParamOf(nav);
5000
+ };
4952
5001
  /**
4953
5002
  * Follows a NavRef whose dynamic segments are keyed by the *Nav* that
4954
5003
  * contributes each one rather than by its parameter name (m-one-ui
4955
5004
  * CONTEXT.md OutcomeNav). The map is what knows the names, so a NavParam
4956
5005
  * renamed after the caller was emitted still fills the right segment.
5006
+ *
5007
+ * The map holds only the Nav stood on, its chain and its children, so a
5008
+ * target further down is fetched first: addressed from a partial map, an
5009
+ * unknown Nav contributes its own segment where its value belongs.
4957
5010
  */
4958
5011
  const followNav = (navId, byNav, options) => {
4959
- const entries = Object.entries(byNav ?? {});
4960
- const params = entries.length
4961
- ? Object.fromEntries(entries.map(([id, value]) => [paramNameOf(id), value]))
4962
- : undefined;
4963
- goToNav(knownNavId(navId), params, options);
5012
+ const follow = () => {
5013
+ const entries = Object.entries(byNav ?? {});
5014
+ const params = entries.length
5015
+ ? Object.fromEntries(entries.map(([id, value]) => [paramNameOf(id), value]))
5016
+ : undefined;
5017
+ goToNav(knownNavId(navId), params, options);
5018
+ };
5019
+ const target = knownNavId(navId);
5020
+ const map = untracked(() => store.navMap());
5021
+ if (navIdChain(target).every((id) => map[id]))
5022
+ return follow();
5023
+ getNavService
5024
+ .getNav(target, map, {
5025
+ appNavId: untracked(() => store.appNavId()),
5026
+ appLink: untracked(() => store.appLink()),
5027
+ mounts: untracked(() => store.allMounts()),
5028
+ })
5029
+ .subscribe({
5030
+ next: (delta) => {
5031
+ if (!Object.keys(delta).length)
5032
+ return;
5033
+ patchState(store, (state) => ({
5034
+ navMap: { ...state.navMap, ...delta },
5035
+ }));
5036
+ },
5037
+ complete: follow,
5038
+ error: follow,
5039
+ });
4964
5040
  };
4965
5041
  /** The current value of the parameter one dynamic Nav contributes. */
4966
5042
  const routeParamOf = (navId) => untracked(() => store.routeParams())[paramNameOf(navId)];
@@ -5061,9 +5137,19 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
5061
5137
  const standsOn = (navId, params) => !untracked(() => splitNavId(navId, store.navMap())).murl.length &&
5062
5138
  untracked(() => addressFor(navId, params)) ===
5063
5139
  untracked(() => store.path());
5064
- const setSelected = (navId, params) => navId && !standsOn(navId, params)
5065
- ? goToNav(navId, params)
5066
- : closePanel();
5140
+ /**
5141
+ * A row naming the Page already stood on only closes the panel — unless it
5142
+ * asks to keep it, when the panel is what it came for and is raised.
5143
+ */
5144
+ const setSelected = (navId, params, options) => {
5145
+ if (!navId)
5146
+ return closePanel();
5147
+ if (!standsOn(navId, params))
5148
+ return goToNav(navId, params, options);
5149
+ if (!options?.keepPanel)
5150
+ return closePanel();
5151
+ patchState(store, { navOpenedByUser: true, menuNavId: undefined });
5152
+ };
5067
5153
  /**
5068
5154
  * The one click that derives its own target instead of naming one. With no
5069
5155
  * default Murl it opens the panel without touching the address — that state
@@ -5098,9 +5184,11 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
5098
5184
  const setAppLink = (appLink, appNavId) => {
5099
5185
  patchState(store, {
5100
5186
  appLink,
5101
- appNavId: appLink
5102
- ? (appNavId ?? untracked(() => store.routeNavId()) ?? undefined)
5103
- : undefined,
5187
+ // Only a host names where the app is mounted (m-ui's slot). A
5188
+ // standalone app sets its link for its WC config alone: defaulting to
5189
+ // the route made it a Remote mounted at `root`, and every Nav fetched
5190
+ // after that went to the WC bundle rather than to its own assets.
5191
+ appNavId: appLink ? appNavId : undefined,
5104
5192
  });
5105
5193
  loadWcConfig(appLink);
5106
5194
  };
@@ -5352,78 +5440,457 @@ const NavStore = signalStore({ providedIn: 'root' }, withState(initialState$3),
5352
5440
  };
5353
5441
  }));
5354
5442
 
5355
- function initMagmoniumApp({ backend, authUrl, socketUrl, }) {
5356
- return () => {
5357
- inject(FreezeService); // ensure the loading effect is always active
5358
- const httpService = inject(HttpService);
5359
- const translateService = inject(TranslateService);
5360
- const themeStore = inject(ThemeStore);
5361
- const loginStore = inject(LOGIN_STORE);
5362
- const navStore = inject(NavStore, { optional: true });
5363
- translateService.init();
5364
- SharedStoreRegistry.setThemeStore(themeStore);
5365
- SharedStoreRegistry.setTranslateService(translateService);
5366
- SharedStoreRegistry.setLoadingActions(loadingActions);
5367
- SharedStoreRegistry.setNotificationStore(inject(NotificationStore));
5368
- if (navStore) {
5369
- SharedStoreRegistry.setNavStore(navStore);
5443
+ function getUniqueId() {
5444
+ return Date.now().toString(36) + Math.random().toString(36).substr(2);
5445
+ }
5446
+
5447
+ const MODAL_COMPONENT = new InjectionToken('MODAL_COMPONENT');
5448
+ const PANEL_COMPONENT = new InjectionToken('PANEL_COMPONENT');
5449
+ const CONFIRM_COMPONENT = new InjectionToken('CONFIRM_COMPONENT');
5450
+ /**
5451
+ * The body an overlay opened by name is filled with — what `mModal` and
5452
+ * `mSidePanel` already build by hand, reached through a token here so
5453
+ * `ModalStore.openScreen` can build the same thing without importing the
5454
+ * component into the store (the reason the three above are tokens).
5455
+ */
5456
+ const OVERLAY_BODY_COMPONENT = new InjectionToken('OVERLAY_BODY_COMPONENT');
5457
+
5458
+ const MODAL_REF = new InjectionToken('MODAL_REF');
5459
+ class ModalRef {
5460
+ closeCallback;
5461
+ changeCallback;
5462
+ /** Commit a result and dismiss (single-pick, confirm, …). */
5463
+ close(result) {
5464
+ this.closeCallback?.(result);
5465
+ }
5466
+ /**
5467
+ * Commit a result without dismissing. Multi-pick panels use this so each
5468
+ * tick updates the field while the panel stays open.
5469
+ */
5470
+ change(result) {
5471
+ this.changeCallback?.(result);
5472
+ }
5473
+ onClose(callback) {
5474
+ this.closeCallback = callback;
5475
+ }
5476
+ onChange(callback) {
5477
+ this.changeCallback = callback;
5478
+ }
5479
+ }
5480
+
5481
+ /**
5482
+ * A DockedPanel takes the viewport edge and displaces the older SidePanel inboard.
5483
+ * Docking is desktop-only and requires the page to stay readable behind both panels.
5484
+ * See ADR 0004.
5485
+ */
5486
+ const DOCK_MIN_PAGE_REMAINDER = 320;
5487
+ const DOCK_TRANSITION = '300ms cubic-bezier(0.2, 0, 0, 1)';
5488
+ const DEFAULT_PANEL_WIDTH = '400px';
5489
+ /**
5490
+ * Reads a px panel width. Any other unit is undockable — the displacement offset
5491
+ * must be known before the panel exists in the DOM.
5492
+ */
5493
+ const parsePanelWidth = (width) => {
5494
+ if (!width?.endsWith('px')) {
5495
+ return undefined;
5496
+ }
5497
+ const value = Number.parseFloat(width);
5498
+ return Number.isFinite(value) ? value : undefined;
5499
+ };
5500
+ /**
5501
+ * A CSS length as a panel needs it. An authored width is free text — the
5502
+ * Screen editor takes `400` as readily as `400px` — and a unitless number is
5503
+ * not a length: the browser drops the declaration and the panel collapses to
5504
+ * its content. A bare number means px, which is what every other authored
5505
+ * dimension in the library already assumes; anything carrying a unit, a
5506
+ * percentage or a `calc()` is passed through untouched.
5507
+ */
5508
+ const panelCssLength = (value) => {
5509
+ const trimmed = value?.trim();
5510
+ if (!trimmed)
5511
+ return undefined;
5512
+ return /^-?\d*\.?\d+$/.test(trimmed) ? `${trimmed}px` : trimmed;
5513
+ };
5514
+ const hasRoomToDock = (baseWidth, panelWidth, viewportWidth) => {
5515
+ const base = parsePanelWidth(baseWidth);
5516
+ const panel = parsePanelWidth(panelWidth);
5517
+ if (base === undefined || panel === undefined) {
5518
+ return false;
5519
+ }
5520
+ return viewportWidth - (base + panel) >= DOCK_MIN_PAGE_REMAINDER;
5521
+ };
5522
+
5523
+ const initialModalState = {
5524
+ modalTriggerMap: {},
5525
+ className: 'modal',
5526
+ parentClassName: 'modals',
5527
+ activeModal: undefined,
5528
+ panelTriggerMap: {},
5529
+ panelClassName: 'panel',
5530
+ panelParentClassName: 'panels',
5531
+ activePanel: undefined,
5532
+ };
5533
+ const ModalStore = signalStore({ providedIn: 'root' }, withState(initialModalState), withMethods((state, domService = inject(DomService), deviceService = inject(DeviceService)) => {
5534
+ // Every modal that has gone, by id. A modal is dismissed from two places —
5535
+ // its own close affordance and this store — and only one of those runs
5536
+ // through a ModalRef, so a caller waiting on an answer would otherwise wait
5537
+ // forever on the other.
5538
+ const closed = new Subject();
5539
+ const modalComp = inject(MODAL_COMPONENT);
5540
+ const panelComp = inject(PANEL_COMPONENT);
5541
+ const confirmComp = inject(CONFIRM_COMPONENT);
5542
+ const overlayBodyComp = inject(OVERLAY_BODY_COMPONENT);
5543
+ const open = (modalTrigger) => {
5544
+ const id = modalTrigger.id ?? getUniqueId();
5545
+ const modalComponentRef = domService.create({
5546
+ component: modalComp,
5547
+ className: state.className(),
5548
+ id,
5549
+ parentClassName: state.parentClassName(),
5550
+ bindings: [
5551
+ inputBinding('name', () => modalTrigger.name),
5552
+ inputBinding('component', () => modalTrigger.component),
5553
+ inputBinding('bindings', () => modalTrigger.bindings),
5554
+ inputBinding('providers', () => modalTrigger.providers),
5555
+ inputBinding('one', () => modalTrigger.one ?? false),
5556
+ inputBinding('instanceId', () => id),
5557
+ inputBinding('config', () => modalTrigger.config),
5558
+ ],
5559
+ });
5560
+ patchState(state, {
5561
+ modalTriggerMap: {
5562
+ ...state.modalTriggerMap(),
5563
+ [id]: {
5564
+ ...modalTrigger,
5565
+ ref: modalComponentRef,
5566
+ },
5567
+ },
5568
+ activeModal: id,
5569
+ });
5570
+ return id;
5571
+ };
5572
+ const close = (id) => {
5573
+ const modalId = id ?? state.activeModal();
5574
+ const modalTriggerMap = state.modalTriggerMap();
5575
+ if (!modalId) {
5576
+ return;
5370
5577
  }
5371
- if (loginStore) {
5372
- SharedStoreRegistry.setLoginStore(loginStore);
5578
+ // A modal that has already gone. Closing it again is what a body and its
5579
+ // own close affordance both doing their job looks like (ADR 0031), and
5580
+ // the state patch below would hand `activeModal` to somebody else's
5581
+ // overlay, so the second call answers nothing.
5582
+ if (id && !modalTriggerMap[id]) {
5583
+ return;
5373
5584
  }
5374
- const effectiveBackend = backend || 'http://localhost:8000';
5375
- if (!backend) {
5376
- console.warn('initMagmoniumApp: No backend URL provided, defaulting to http://localhost:8000. ' +
5377
- 'Check your environment configuration if this is unexpected.');
5585
+ domService.destroy({
5586
+ componentRef: modalTriggerMap[modalId]?.ref,
5587
+ parentClassName: state.parentClassName(),
5588
+ id: modalId,
5589
+ });
5590
+ delete modalTriggerMap[modalId];
5591
+ const remaining = Object.keys(modalTriggerMap);
5592
+ patchState(state, {
5593
+ modalTriggerMap: { ...modalTriggerMap },
5594
+ activeModal: remaining.length
5595
+ ? remaining[remaining.length - 1]
5596
+ : undefined,
5597
+ });
5598
+ closed.next(modalId);
5599
+ };
5600
+ /**
5601
+ * The panel a dock request would displace: whatever currently holds the edge.
5602
+ * Docking is decided once, at open — never re-evaluated on resize (ADR 0004).
5603
+ */
5604
+ const resolveDockTarget = (side, width) => {
5605
+ if (!deviceService.isDesktop()) {
5606
+ return undefined;
5378
5607
  }
5379
- // Auth URL defaults to Backend URL so single-host apps stay unchanged (ADR 0012).
5380
- const effectiveAuth = authUrl || effectiveBackend;
5381
- httpService.setUrl(effectiveBackend);
5382
- httpService.setAuthUrl(effectiveAuth);
5383
- themeStore.init();
5384
- if (socketUrl) {
5385
- const socketStore = inject(SocketStore);
5386
- let lastToken;
5387
- effect(() => {
5388
- const tokens = loginStore?.tokens();
5389
- const currentToken = tokens?.auth;
5390
- if (!currentToken) {
5391
- socketStore.disconnect();
5392
- lastToken = undefined;
5393
- return;
5394
- }
5395
- // If we already connected with this exact token, skip
5396
- if (lastToken === currentToken)
5397
- return;
5398
- // If another instance (e.g. host app) has already established a socket,
5399
- // and we are a new instance (e.g. WC) that hasn't connected yet, skip.
5400
- if (SharedStoreRegistry.isHostSocketActive() &&
5401
- lastToken === undefined) {
5402
- return;
5403
- }
5404
- // Connect (or reconnect if lastToken was different)
5405
- socketStore.connect(`${socketUrl}?token=${currentToken}`);
5406
- SharedStoreRegistry.setSocketUrl(socketUrl);
5407
- lastToken = currentToken;
5608
+ const baseId = state.activePanel();
5609
+ const base = baseId ? state.panelTriggerMap()[baseId] : undefined;
5610
+ if (!baseId || !base || (base.side ?? 'right') !== side) {
5611
+ return undefined;
5612
+ }
5613
+ const viewportWidth = typeof window === 'undefined' ? 0 : window.innerWidth;
5614
+ return hasRoomToDock(base.width, width, viewportWidth)
5615
+ ? baseId
5616
+ : undefined;
5617
+ };
5618
+ const openPanel = (panelTrigger) => {
5619
+ const id = panelTrigger.id ?? getUniqueId();
5620
+ const side = panelTrigger.side ?? 'right';
5621
+ // Authored free text, made a CSS length: a unitless `400` is dropped by
5622
+ // the browser and the panel opens at the width of its own content.
5623
+ const width = panelCssLength(panelTrigger.width) ?? DEFAULT_PANEL_WIDTH;
5624
+ const height = panelCssLength(panelTrigger.height);
5625
+ const isMobile = deviceService.isMobile();
5626
+ if (panelTrigger.dock) {
5627
+ const activeId = state.activePanel();
5628
+ // Max two panels: a further dock request replaces the current DockedPanel,
5629
+ // which restores the panel underneath to the edge before we displace it again.
5630
+ if (activeId && state.panelTriggerMap()[activeId]?.dockedOver) {
5631
+ closePanel(activeId);
5632
+ }
5633
+ }
5634
+ const dockedOver = panelTrigger.dock
5635
+ ? resolveDockTarget(side, width)
5636
+ : undefined;
5637
+ const styles = isMobile
5638
+ ? {
5639
+ position: 'fixed',
5640
+ bottom: '0',
5641
+ left: '0',
5642
+ width: '100%',
5643
+ height: '90%',
5644
+ zIndex: '1000',
5645
+ }
5646
+ : {
5647
+ position: 'fixed',
5648
+ top: '0',
5649
+ bottom: '0',
5650
+ [side]: '0',
5651
+ width,
5652
+ zIndex: '1000',
5653
+ transition: `${side} ${DOCK_TRANSITION}`,
5654
+ };
5655
+ const panelComponentRef = domService.create({
5656
+ component: panelComp,
5657
+ className: `${state.panelClassName()} panel--${side}`,
5658
+ id,
5659
+ parentClassName: state.panelParentClassName(),
5660
+ styles,
5661
+ bindings: [
5662
+ inputBinding('component', () => panelTrigger.component),
5663
+ inputBinding('bindings', () => panelTrigger.bindings),
5664
+ inputBinding('providers', () => panelTrigger.providers),
5665
+ inputBinding('side', () => side),
5666
+ inputBinding('instanceId', () => id),
5667
+ inputBinding('docked', () => !!state.panelTriggerMap()[id]?.dockedOver),
5668
+ inputBinding('height', () => height),
5669
+ inputBinding('closeProhibited', () => !!panelTrigger.closeProhibited),
5670
+ ],
5671
+ });
5672
+ if (dockedOver) {
5673
+ domService.updateStyleById({
5674
+ id: dockedOver,
5675
+ parentClassName: state.panelParentClassName(),
5676
+ styles: { [side]: width },
5408
5677
  });
5409
5678
  }
5410
- if (!loginStore)
5411
- return EMPTY;
5412
- // Load saved login IDs before init so the modal shows them if it opens
5413
- if (!loginStore.tokens()) {
5414
- loginStore.loadSavedLoginIds();
5679
+ patchState(state, {
5680
+ panelTriggerMap: {
5681
+ ...state.panelTriggerMap(),
5682
+ [id]: {
5683
+ ...panelTrigger,
5684
+ side,
5685
+ width,
5686
+ dockedOver,
5687
+ ref: panelComponentRef,
5688
+ },
5689
+ },
5690
+ activePanel: id,
5691
+ });
5692
+ return id;
5693
+ };
5694
+ const closePanel = (id) => {
5695
+ const panelId = id ?? state.activePanel();
5696
+ const panelTriggerMap = state.panelTriggerMap();
5697
+ if (!panelId) {
5698
+ return;
5415
5699
  }
5416
- // Always call init — interceptor handles no-token case via authenticate()
5417
- return httpService
5418
- .put('auth', ['init'])
5419
- .pipe(tap(({ navs, tokens, user }) => {
5420
- loginStore.initApp({ navs, tokens, user });
5421
- }), catchError(() => {
5422
- loginStore.loadSavedLoginIds();
5423
- return EMPTY;
5424
- }));
5700
+ // A panel that has already gone — `close`'s reason, and here it would
5701
+ // also promote a DockedPanel a second time.
5702
+ if (id && !panelTriggerMap[id]) {
5703
+ return;
5704
+ }
5705
+ const closing = panelTriggerMap[panelId];
5706
+ domService.destroy({
5707
+ componentRef: closing?.ref,
5708
+ parentClassName: state.panelParentClassName(),
5709
+ id: panelId,
5710
+ });
5711
+ delete panelTriggerMap[panelId];
5712
+ // Closing a DockedPanel returns the panel it displaced to the edge.
5713
+ if (closing?.dockedOver && panelTriggerMap[closing.dockedOver]) {
5714
+ domService.updateStyleById({
5715
+ id: closing.dockedOver,
5716
+ parentClassName: state.panelParentClassName(),
5717
+ styles: { [closing.side ?? 'right']: '0' },
5718
+ });
5719
+ }
5720
+ // Closing a displaced panel promotes its DockedPanel: already at the edge,
5721
+ // so nothing moves — its seam just goes dashed -> solid.
5722
+ const promotedId = Object.keys(panelTriggerMap).find((key) => panelTriggerMap[key]?.dockedOver === panelId);
5723
+ if (promotedId) {
5724
+ panelTriggerMap[promotedId] = {
5725
+ ...panelTriggerMap[promotedId],
5726
+ dockedOver: undefined,
5727
+ };
5728
+ }
5729
+ const remaining = Object.keys(panelTriggerMap);
5730
+ patchState(state, {
5731
+ panelTriggerMap: { ...panelTriggerMap },
5732
+ activePanel: remaining.length
5733
+ ? remaining[remaining.length - 1]
5734
+ : undefined,
5735
+ });
5425
5736
  };
5426
- }
5737
+ const cleanupOnClose = rxMethod(pipe(filter((modalMap) => !Object.keys(modalMap).length), tap(() => {
5738
+ domService.cleanup(state.parentClassName());
5739
+ })));
5740
+ const cleanupPanelsOnClose = rxMethod(pipe(filter((panelMap) => !Object.keys(panelMap).length), tap(() => {
5741
+ domService.cleanup(state.panelParentClassName());
5742
+ })));
5743
+ /**
5744
+ * The question as a value: subscribing asks it, and the single emission is
5745
+ * the answer — `true` for the commit, `false` for a refusal and for a
5746
+ * dismissal, which is a refusal by another route. Completes with that
5747
+ * emission, so a `switchMap` over it moves on rather than holding the
5748
+ * modal's answer open.
5749
+ *
5750
+ * Unsubscribing before it answers takes the modal away with it: the caller
5751
+ * that asked is gone, and a dialog nothing is waiting on is a dialog whose
5752
+ * answer lands nowhere.
5753
+ */
5754
+ const ask = (opts) => new Observable((subscriber) => {
5755
+ const modalRef = new ModalRef();
5756
+ let settled = false;
5757
+ let id = '';
5758
+ const settle = (result, dismiss) => {
5759
+ if (settled)
5760
+ return;
5761
+ settled = true;
5762
+ watch.unsubscribe();
5763
+ if (dismiss)
5764
+ close(id);
5765
+ subscriber.next(result);
5766
+ subscriber.complete();
5767
+ };
5768
+ const watch = closed
5769
+ .pipe(filter((closedId) => closedId === id))
5770
+ .subscribe(() => settle(false, false));
5771
+ id = open({
5772
+ component: confirmComp,
5773
+ providers: [{ provide: MODAL_REF, useValue: modalRef }],
5774
+ bindings: [
5775
+ inputBinding('header', () => opts.header ?? ''),
5776
+ inputBinding('body', () => opts.body ?? ''),
5777
+ inputBinding('params', () => opts.params ?? {}),
5778
+ inputBinding('type', () => opts.type ?? 'info'),
5779
+ inputBinding('kind', () => opts.kind ?? 'yes'),
5780
+ inputBinding('confirmLabel', () => opts.confirmLabel ?? ''),
5781
+ inputBinding('cancelLabel', () => opts.cancelLabel ?? ''),
5782
+ ],
5783
+ });
5784
+ modalRef.onClose((result) => settle(!!result, true));
5785
+ return () => {
5786
+ if (settled)
5787
+ return;
5788
+ settled = true;
5789
+ watch.unsubscribe();
5790
+ close(id);
5791
+ };
5792
+ });
5793
+ /**
5794
+ * Opens one Screen as an overlay and hands it its inputs — what a
5795
+ * generated FeatureStore calls where a Control's `mModal` would be the
5796
+ * drawn answer (m-one-ui OpenScreen).
5797
+ *
5798
+ * The same body the two directives build, reached the same way: the widget
5799
+ * is loaded on first open, so nothing it names is in the initial bundle.
5800
+ * Returns the overlay's own id and waits for nothing — the caller is a
5801
+ * `tap` inside a request pipe, and a store that held its emission open
5802
+ * until a panel closed would be answering for a gesture nobody made.
5803
+ */
5804
+ const openScreen = (trigger) => {
5805
+ const bindings = [
5806
+ inputBinding('widget', () => trigger.widget),
5807
+ inputBinding('inputs', () => trigger.inputs ?? {}),
5808
+ // The body binds these onto the Screen it creates (ADR 0033). A
5809
+ // Screen the opener listens to nothing of hands an empty record,
5810
+ // which binds nothing at all.
5811
+ inputBinding('outputs', () => trigger.outputs ?? {}),
5812
+ ];
5813
+ // Its own ModalRef, the way each directive mints one: the body closes
5814
+ // itself through this. Nothing here listens for the *result* — a store
5815
+ // has nowhere to put a panel's answer — but the close dismisses, which is
5816
+ // the whole of what a body opened this way can ask for (ADR 0031).
5817
+ const modalRef = new ModalRef();
5818
+ // What the body answered reaches the caller either way (ADR 0031): a
5819
+ // `change` reports and the overlay stays, a `close` reports and then it
5820
+ // goes. The order on a close is deliberate — a handler that reads the
5821
+ // Screen it opened must run while that Screen is still there.
5822
+ modalRef.onChange((result) => trigger.onResult?.(result));
5823
+ const providers = [{ provide: MODAL_REF, useValue: modalRef }];
5824
+ if (trigger.as === 'side_panel') {
5825
+ const panelId = openPanel({
5826
+ component: overlayBodyComp,
5827
+ bindings,
5828
+ providers,
5829
+ side: trigger.side,
5830
+ width: trigger.width,
5831
+ height: trigger.height,
5832
+ dock: trigger.dock,
5833
+ closeProhibited: trigger.closeProhibited,
5834
+ });
5835
+ modalRef.onClose((result) => {
5836
+ trigger.onResult?.(result);
5837
+ closePanel(panelId);
5838
+ });
5839
+ return panelId;
5840
+ }
5841
+ const modalId = open({
5842
+ component: overlayBodyComp,
5843
+ bindings,
5844
+ providers,
5845
+ config: trigger.config,
5846
+ });
5847
+ modalRef.onClose((result) => {
5848
+ trigger.onResult?.(result);
5849
+ close(modalId);
5850
+ });
5851
+ return modalId;
5852
+ };
5853
+ /**
5854
+ * Closes the overlay with this id, whichever kind it is — what a caller
5855
+ * holding only what `openScreen` returned can say (ADR 0031). Nothing for
5856
+ * an id nothing answers to, which is what a body that already closed itself
5857
+ * leaves behind.
5858
+ */
5859
+ const dismiss = (id) => {
5860
+ if (state.modalTriggerMap()[id]) {
5861
+ close(id);
5862
+ return;
5863
+ }
5864
+ if (state.panelTriggerMap()[id])
5865
+ closePanel(id);
5866
+ };
5867
+ // The callback form, kept for every caller drawn against it. One
5868
+ // implementation underneath: a refusal runs nothing, which is what an
5869
+ // `onConfirm` that never fires already meant.
5870
+ const confirm = (opts, onConfirm) => {
5871
+ ask(opts).subscribe((result) => {
5872
+ if (result)
5873
+ onConfirm();
5874
+ });
5875
+ };
5876
+ return {
5877
+ open,
5878
+ close,
5879
+ dismiss,
5880
+ ask,
5881
+ confirm,
5882
+ openScreen,
5883
+ openPanel,
5884
+ closePanel,
5885
+ cleanupOnClose,
5886
+ cleanupPanelsOnClose,
5887
+ };
5888
+ }), withHooks({
5889
+ onInit({ cleanupOnClose, modalTriggerMap, cleanupPanelsOnClose, panelTriggerMap, }) {
5890
+ cleanupOnClose(modalTriggerMap);
5891
+ cleanupPanelsOnClose(panelTriggerMap);
5892
+ },
5893
+ }));
5427
5894
 
5428
5895
  const MAGMONIUM = `
5429
5896
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="-15 -15 120 165">
@@ -6969,124 +7436,810 @@ class ButtonComponent extends ReactiveElementComponent {
6969
7436
  if (isPrimary && color === 'inverseText') {
6970
7437
  return resolvePallet('mm', this.themeStore.color()).color;
6971
7438
  }
6972
- const pallet = resolvePallet(color, this.themeStore.color());
6973
- return isPrimary ? pallet.contrastColor : pallet.color;
6974
- }, ...(ngDevMode ? [{ debugName: "buttonColor" }] : /* istanbul ignore next */ []));
6975
- constructor() {
6976
- super();
6977
- effect(() => {
6978
- const isPrimary = this.isPrimary();
6979
- const colorInput = this.colorInput();
6980
- const el = this.elementRef.nativeElement;
6981
- if (isPrimary && colorInput === 'inverseText') {
6982
- el.style.setProperty('--m-button-color-contrast', this.buttonColor());
6983
- el.style.setProperty('--m-one-button-color-contrast', this.buttonColor());
6984
- }
6985
- });
7439
+ const pallet = resolvePallet(color, this.themeStore.color());
7440
+ return isPrimary ? pallet.contrastColor : pallet.color;
7441
+ }, ...(ngDevMode ? [{ debugName: "buttonColor" }] : /* istanbul ignore next */ []));
7442
+ constructor() {
7443
+ super();
7444
+ effect(() => {
7445
+ const isPrimary = this.isPrimary();
7446
+ const colorInput = this.colorInput();
7447
+ const el = this.elementRef.nativeElement;
7448
+ if (isPrimary && colorInput === 'inverseText') {
7449
+ el.style.setProperty('--m-button-color-contrast', this.buttonColor());
7450
+ el.style.setProperty('--m-one-button-color-contrast', this.buttonColor());
7451
+ }
7452
+ });
7453
+ }
7454
+ buttonIcon = computed(() => {
7455
+ const name = this.config()?.icon;
7456
+ if (!name) {
7457
+ return undefined;
7458
+ }
7459
+ return {
7460
+ name: this.config()?.icon,
7461
+ color: this.buttonColor(),
7462
+ baseUrl: this.baseUrl(),
7463
+ remote: this.remote() ?? this.config()?.remote,
7464
+ };
7465
+ }, ...(ngDevMode ? [{ debugName: "buttonIcon" }] : /* istanbul ignore next */ []));
7466
+ overrideProperty = computed(() => {
7467
+ const button = {};
7468
+ // The rest of what a `buttons/<name>.yml` carries, so a one-off Button
7469
+ // needs no file (ADR 0010). An omitted attribute is skipped rather than
7470
+ // written as undefined — writing it would blank whatever the asset set.
7471
+ const put = (key, value) => {
7472
+ if (value !== undefined)
7473
+ button[key] = value;
7474
+ };
7475
+ put('label', this.label());
7476
+ put('icon', this.icon());
7477
+ put('imgSrc', this.imgSrc());
7478
+ put('tabindex', toAttrNumber(this.tabindex()));
7479
+ put('noTranslate', toAttrBool(this.noTranslate()));
7480
+ put('params', this.params());
7481
+ put('isRightIcon', toAttrBool(this.isRightIcon()));
7482
+ put('iconOnly', toAttrBool(this.iconOnly()));
7483
+ put('stacked', toAttrBool(this.stacked()));
7484
+ put('nonClickable', toAttrBool(this.nonClickable()));
7485
+ put('inverted', toAttrBool(this.inverted()));
7486
+ put('isSubmit', toAttrBool(this.isSubmit()));
7487
+ if (this.color()) {
7488
+ button['color'] = this.color();
7489
+ }
7490
+ if (this.labelClass()) {
7491
+ button['labelClass'] = this.labelClass();
7492
+ }
7493
+ if (typeof this.fullWidth() !== 'undefined') {
7494
+ button['fullWidth'] = toAttrBool(this.fullWidth());
7495
+ }
7496
+ if (this.nav()) {
7497
+ button['nav'] = this.nav();
7498
+ }
7499
+ if (this.navParams()) {
7500
+ button['navParams'] = this.navParams();
7501
+ }
7502
+ if (this.href()) {
7503
+ button['href'] = this.href();
7504
+ }
7505
+ if (typeof this.disabled() !== 'undefined') {
7506
+ button['disabled'] = this.disabled();
7507
+ }
7508
+ if (this.variant()) {
7509
+ button['variant'] = this.variant();
7510
+ }
7511
+ // Force primary and clear ghost if the color is 'inverse' or 'inverseText', unless explicitly ghost or secondary
7512
+ const finalColor = button.color || this.config()?.color;
7513
+ const isExplicitGhost = button.variant === 'ghost' || this.config()?.variant === 'ghost';
7514
+ const isExplicitSecondary = button.variant === 'secondary' ||
7515
+ this.config()?.variant === 'secondary';
7516
+ if ((finalColor === 'inverse' || finalColor === 'inverseText') &&
7517
+ !isExplicitGhost &&
7518
+ !isExplicitSecondary) {
7519
+ button['color'] = 'inverseText';
7520
+ button['variant'] = 'primary';
7521
+ }
7522
+ else if (finalColor === 'inverse') {
7523
+ button['color'] = 'inverseText';
7524
+ }
7525
+ if (this.config()?.nav || this.nav()) {
7526
+ button['variant'] = this.isMurlActive() ? undefined : 'ghost';
7527
+ }
7528
+ return button;
7529
+ }, ...(ngDevMode ? [{ debugName: "overrideProperty" }] : /* istanbul ignore next */ []));
7530
+ resolveComponentOverrides() {
7531
+ return this.overrideProperty();
7532
+ }
7533
+ onClick() {
7534
+ if (this.isFormSubmit()) {
7535
+ // Called rather than left to a native `type="submit"`: the `<form>` is
7536
+ // only an ancestor while nothing re-projects this Button out of it.
7537
+ this.sectionForm?.submit();
7538
+ }
7539
+ this.clicked.emit(this.config());
7540
+ }
7541
+ formatBadgeCount = (count, max = 99) => formatBadgeCount(count, max);
7542
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
7543
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: ButtonComponent, isStandalone: true, selector: "m-button,m-one-button", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, labelClass: { classPropertyName: "labelClass", publicName: "labelClass", isSignal: true, isRequired: false, transformFunction: null }, fullWidth: { classPropertyName: "fullWidth", publicName: "fullWidth", isSignal: true, isRequired: false, transformFunction: null }, nav: { classPropertyName: "nav", publicName: "nav", isSignal: true, isRequired: false, transformFunction: null }, navParams: { classPropertyName: "navParams", publicName: "navParams", isSignal: true, isRequired: false, transformFunction: null }, href: { classPropertyName: "href", publicName: "href", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, baseUrl: { classPropertyName: "baseUrl", publicName: "baseUrl", isSignal: true, isRequired: false, transformFunction: null }, one: { classPropertyName: "one", publicName: "one", isSignal: true, isRequired: false, transformFunction: null }, remote: { classPropertyName: "remote", publicName: "remote", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, noTranslate: { classPropertyName: "noTranslate", publicName: "noTranslate", isSignal: true, isRequired: false, transformFunction: null }, params: { classPropertyName: "params", publicName: "params", isSignal: true, isRequired: false, transformFunction: null }, noNative: { classPropertyName: "noNative", publicName: "noNative", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, isRightIcon: { classPropertyName: "isRightIcon", publicName: "isRightIcon", isSignal: true, isRequired: false, transformFunction: null }, iconOnly: { classPropertyName: "iconOnly", publicName: "iconOnly", isSignal: true, isRequired: false, transformFunction: null }, stacked: { classPropertyName: "stacked", publicName: "stacked", isSignal: true, isRequired: false, transformFunction: null }, imgSrc: { classPropertyName: "imgSrc", publicName: "imgSrc", isSignal: true, isRequired: false, transformFunction: null }, nonClickable: { classPropertyName: "nonClickable", publicName: "nonClickable", isSignal: true, isRequired: false, transformFunction: null }, inverted: { classPropertyName: "inverted", publicName: "inverted", isSignal: true, isRequired: false, transformFunction: null }, isSubmit: { classPropertyName: "isSubmit", publicName: "isSubmit", isSignal: true, isRequired: false, transformFunction: null }, tabindex: { classPropertyName: "tabindex", publicName: "tabindex", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { config: "configChange", clicked: "clicked" }, viewQueries: [{ propertyName: "button", first: true, predicate: ["button"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "@if (config(); as config) {\n <!-- One branch for every in-app target: `mRef` names a NavId and the store\n reads the NavKind off that node to decide route vs panel (ADR 0014). -->\n @if (config.nav) {\n @if (!noNative()) {\n <button\n type=\"button\"\n class=\"{{ className() }}\"\n [attr.data-testid]=\"config.name + '-btn'\"\n [attr.tabindex]=\"config.tabindex\"\n [disabled]=\"config.disabled\"\n [mRef]=\"config.nav\"\n [mRefParams]=\"config.navParams\"\n [attr.aria-label]=\"config.noTranslate ? config.label : (config.label | translate: config.params)\"\n mRefLinkActive=\"tab\"\n (keydown.enter)=\"onClick()\"\n (click)=\"onClick()\"\n #button\n >\n <ng-container *ngTemplateOutlet=\"buttonContent; context: { button: config }\"></ng-container>\n </button>\n } @else {\n <div\n role=\"button\"\n [attr.tabindex]=\"config.tabindex ?? 0\"\n class=\"non-native {{ className() }}\"\n [attr.data-testid]=\"config.name + '-btn'\"\n [attr.aria-label]=\"config.noTranslate ? config.label : (config.label | translate: config.params)\"\n [attr.aria-disabled]=\"config.disabled ? 'true' : 'false'\"\n (keydown.enter)=\"onClick()\"\n (click)=\"onClick()\"\n #button\n >\n <ng-container *ngTemplateOutlet=\"buttonContent; context: { button: config }\"></ng-container>\n </div>\n }\n } @else if (config.href) {\n <a\n class=\"{{ className() }}\"\n [attr.data-testid]=\"config.name + '-btn'\"\n [attr.tabindex]=\"config.tabindex\"\n [href]=\"config.href\"\n [attr.aria-label]=\"config.noTranslate ? config.label : (config.label | translate: config.params)\"\n (click)=\"onClick()\"\n #button\n >\n <ng-container *ngTemplateOutlet=\"buttonContent; context: { button: config }\"></ng-container>\n </a>\n } @else {\n @if (!noNative()) {\n <button\n type=\"button\"\n class=\"{{ className() }}\"\n [attr.data-testid]=\"config.name + '-btn'\"\n [attr.tabindex]=\"config.tabindex\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"config.noTranslate ? config.label : (config.label | translate: config.params)\"\n (keydown.enter)=\"onClick()\"\n (click)=\"onClick()\"\n #button\n >\n <ng-container *ngTemplateOutlet=\"buttonContent; context: { button: config }\"></ng-container>\n </button>\n } @else {\n <div\n role=\"button\"\n [attr.tabindex]=\"config.tabindex ?? 0\"\n class=\"non-native {{ className() }}\"\n [attr.data-testid]=\"config.name + '-btn'\"\n [attr.aria-label]=\"config.noTranslate ? config.label : (config.label | translate: config.params)\"\n [attr.aria-disabled]=\"isDisabled() ? 'true' : 'false'\"\n (keydown.enter)=\"onClick()\"\n (click)=\"onClick()\"\n #button\n >\n <ng-container *ngTemplateOutlet=\"buttonContent; context: { button: config }\"></ng-container>\n </div>\n }\n }\n}\n\n<ng-template #buttonContent let-button=\"button\">\n @if (button.imgSrc) {\n <div class=\"button-icon button-icon--img\">\n <m-img [src]=\"button.imgSrc\" [remote]=\"button.remote\" [alt]=\"button.label || button.name || ''\" />\n @if (button.badge && button.badge.count) {\n <m-badge\n [config]=\"{ variant: button.badge.variant ?? 'danger', position: 'absolute' }\"\n >{{ formatBadgeCount(button.badge.count) }}</m-badge\n >\n }\n </div>\n } @else if (buttonIcon(); as icon) {\n <div class=\"button-icon\">\n @if (isFromOne()) {\n <m-one-icon [config]=\"icon\" />\n } @else {\n <m-icon [config]=\"icon\" />\n }\n @if (button.badge && button.badge.count) {\n <m-badge\n [config]=\"{ variant: button.badge.variant ?? 'danger', position: 'absolute' }\"\n >{{ formatBadgeCount(button.badge.count) }}</m-badge\n >\n }\n </div>\n }\n @if (button.label && !button.iconOnly) {\n <span class=\"button-label {{ button.labelClass || '' }}\">\n {{ button.noTranslate ? button.label : (button.label | translate: button.params) }}\n </span>\n }\n @if (!buttonIcon() && button.badge && button.badge.count) {\n <m-badge [config]=\"{ variant: button.badge.variant ?? 'danger', position: 'static' }\">{{\n formatBadgeCount(button.badge.count)\n }}</m-badge>\n }\n</ng-template>\n", styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}:host{display:inline-flex;align-items:center;justify-content:center;vertical-align:middle;box-sizing:border-box;overflow:hidden;transition:box-shadow .15s ease;--m-btn-size: var(--m-button-size, 1em);--m-btn-color: var(--m-button-color, var(--m-one-button-color, var(--m-mm)));--m-btn-color-contrast: var(--m-button-color-contrast, var(--m-one-button-color-contrast, #ffffff));--m-btn-color-opposite: var(--m-button-color-opposite, var(--m-one-button-color-opposite, #e1b941));--m-btn-h: calc(var(--m-btn-size) * 2.25);width:var(--m-button-width, var(--m-one-button-width, auto));min-width:0;height:var(--m-btn-h);font-size:var(--m-btn-size)}:host-context(.inverse),:host-context(.tabs-inverse),:host.inverse{--m-btn-color: var(--m-button-color, var(--m-one-button-color, var(--m-inverse-text)))}:host:has(.full-width){display:flex;width:100%}:host:has(.full-width) button .button-label{white-space:normal;overflow:visible;text-overflow:clip;word-break:break-word}:host:has(.only-icon),:host:has(.toggle){width:var(--m-btn-h);min-width:var(--m-btn-h)}:host:has(.has-badge){overflow:visible}:host:has(.stacked),:host:has(.toggle){height:auto}button:not(.get):not(.toggle){height:calc(var(--input-size, var(--m-btn-size)) * 2);min-height:calc(var(--input-size, var(--m-btn-size)) * 2);border-width:max(1px,var(--input-size, var(--m-btn-size)) * .0625);border-radius:calc(var(--input-size, var(--m-btn-size)) * .4);padding:calc(var(--input-size, var(--m-btn-size)) * .5) calc(var(--input-size, var(--m-btn-size)) * .5);gap:calc(var(--input-size, var(--m-btn-size)) * .375);font-size:var(--input-size, var(--m-btn-size));border-color:var(--m-btn-color);transition:border-color .2s ease,box-shadow .2s ease,background-color .2s ease,opacity .2s ease}button:not(.get):not(.toggle):hover:not(:disabled){background-color:color-mix(in srgb,var(--m-btn-color) 6%,transparent)}button:not(.get):not(.toggle):disabled{opacity:.6;cursor:not-allowed}button:not(.get):not(.toggle){height:auto;padding:calc(var(--m-btn-size) * .625) calc(var(--m-btn-size) * 1.25);gap:calc(var(--m-btn-size) * .375);border-style:solid;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;font-family:inherit;cursor:pointer;appearance:none;width:100%;height:100%;min-height:0;padding:0 calc(var(--m-btn-size) * 1.25);border-width:var(--m-button-border-width, 1px);border-radius:var(--m-button-radius, calc(var(--m-btn-size) * .5));color:var(--m-btn-color);font-weight:300;line-height:1;-webkit-user-select:none;user-select:none;position:relative;outline:none;box-shadow:var(--m-button-shadow, var(--m-one-button-shadow, none));transition:filter .15s ease,background .15s ease}button:not(.get):not(.toggle):hover:not(:disabled){filter:brightness(1.04)}button:not(.get):not(.toggle):focus-visible:not(:disabled){outline:2px solid color-mix(in srgb,var(--m-focus) 45%,transparent);outline-offset:-2px}button:not(.get):not(.toggle):active:not(:disabled){transform:scale(.97)}button:not(.get):not(.toggle):disabled{opacity:.35;cursor:not-allowed;pointer-events:none;filter:grayscale(80%)}button:not(.get):not(.toggle).read-only{pointer-events:none!important;cursor:default!important;transform:none!important;box-shadow:none!important;background:transparent!important;border-color:transparent!important;opacity:1!important}button:not(.get):not(.toggle).read-only .button-icon{transform:none!important;color:inherit!important}button:not(.get):not(.toggle).primary{background:var(--m-btn-color);border-color:var(--m-btn-color);color:var(--m-btn-color-contrast)}button:not(.get):not(.toggle).primary:hover:not(:disabled){filter:none;background:color-mix(in srgb,var(--m-btn-color) 88%,black);border-color:color-mix(in srgb,var(--m-btn-color) 88%,black)}button:not(.get):not(.toggle).primary:active:not(:disabled){filter:brightness(.94);transform:scale(.97)}button:not(.get):not(.toggle).ghost:not(.primary):not(.tab){background:transparent;border-color:transparent;color:var(--m-btn-color);box-shadow:none}button:not(.get):not(.toggle).ghost:not(.primary):not(.tab):hover:not(:disabled){filter:none;background:color-mix(in srgb,var(--m-btn-color) 8%,transparent)}button:not(.get):not(.toggle).ghost:not(.primary):not(.tab):active:not(:disabled){background:color-mix(in srgb,var(--m-btn-color) 14%,transparent);transform:scale(.97)}button:not(.get):not(.toggle).ghost:not(.primary):not(.tab).secondary{border:var(--m-button-border-width, 1px) solid color-mix(in srgb,var(--m-btn-color) 15%,transparent)}button:not(.get):not(.toggle).ghost:not(.primary):not(.tab).secondary:hover:not(:disabled){filter:none;border-color:color-mix(in srgb,var(--m-btn-color) 40%,transparent);background:color-mix(in srgb,var(--m-btn-color) 6%,transparent)}button:not(.get):not(.toggle).ghost:not(.primary):not(.tab).secondary:active:not(:disabled){border-color:color-mix(in srgb,var(--m-btn-color) 50%,transparent);background:color-mix(in srgb,var(--m-btn-color) 12%,transparent)}button:not(.get):not(.toggle).secondary:not(.primary):not(.ghost){background:transparent;border-color:var(--m-btn-color);color:var(--m-btn-color)}button:not(.get):not(.toggle).secondary:not(.primary):not(.ghost):hover:not(:disabled){filter:none;background:color-mix(in srgb,var(--m-btn-color) 8%,transparent)}button:not(.get):not(.toggle).secondary:not(.primary):not(.ghost):active:not(:disabled){background:color-mix(in srgb,var(--m-btn-color) 14%,transparent);transform:scale(.97)}button:not(.get):not(.toggle).tab{background:var(--m-backdrop-border);border-color:var(--m-backdrop-border);color:var(--m-btn-color)}button:not(.get):not(.toggle).tab:hover:not(:disabled){background:color-mix(in srgb,var(--m-backdrop-border) 82%,black);border-color:color-mix(in srgb,var(--m-backdrop-border) 82%,black);filter:none}button:not(.get):not(.toggle).tab:active:not(:disabled){background:color-mix(in srgb,var(--m-backdrop-border) 70%,black);border-color:color-mix(in srgb,var(--m-backdrop-border) 70%,black);transform:scale(.97)}button:not(.get):not(.toggle).segmented .button-icon,button:not(.get):not(.toggle).badge-accent .button-icon,button:not(.get):not(.toggle).with-right-icon .button-icon{display:inline-flex;align-items:center;justify-content:center;color:var(--m-btn-color-opposite);order:1}button:not(.get):not(.toggle).segmented .button-label,button:not(.get):not(.toggle).badge-accent .button-label,button:not(.get):not(.toggle).with-right-icon .button-label{order:-1}button:not(.get):not(.toggle).segmented.primary .button-icon,button:not(.get):not(.toggle).badge-accent.primary .button-icon,button:not(.get):not(.toggle).with-right-icon.primary .button-icon{color:var(--m-btn-color-opposite)}button:not(.get):not(.toggle).with-left-icon .button-icon{order:-1}button:not(.get):not(.toggle).with-left-icon .button-label{order:1}button:not(.get):not(.toggle).stacked{flex-direction:column;gap:calc(var(--m-btn-size) * .3);height:auto;min-height:var(--m-btn-h);padding:calc(var(--m-btn-size) * .625) calc(var(--m-btn-size) * .875)}button:not(.get):not(.toggle).stacked .button-label{font-size:calc(var(--m-btn-size) * .8)}button:not(.get):not(.toggle).only-icon{padding:0;border-width:var(--m-button-border-width, 1px);aspect-ratio:1;display:inline-flex;align-items:center;justify-content:center}button:not(.get):not(.toggle).only-icon m-icon,button:not(.get):not(.toggle).only-icon m-one-icon{display:inline-flex}m-badge{--m-badge-height: 1.5em;--m-badge-min-width: 1.5em;--m-badge-padding: 0 .3em;--m-badge-gap: .1em}.button-label{display:inline-flex;align-items:center;line-height:normal;font-size:inherit;min-width:0;max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.button-icon{position:relative;display:inline-flex;align-items:center;justify-content:center}.button-icon--img{width:calc(var(--m-btn-size) * 1.75);height:calc(var(--m-btn-size) * 1.75);overflow:hidden}.button-icon--img m-img{width:100%;height:100%;display:block}.get{appearance:none;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;height:var(--m-btn-h);padding:0 min(var(--m-btn-size) * 1.75,2rem);border-radius:4px;background:linear-gradient(135deg,var(--m-mm),var(--m-focus),var(--m-success),var(--m-mm));background-size:200% auto;color:#fff;font-size:calc(var(--m-btn-size) * .8);font-weight:300;letter-spacing:.06em;text-transform:uppercase;border:none;cursor:pointer;white-space:nowrap;line-height:1;transition:background-position .2s ease,transform .15s ease}.get:hover{background-position:right center}.get:focus-visible{outline:2px solid color-mix(in srgb,var(--m-focus) 45%,transparent);outline-offset:-2px}.get:active{transform:scale(.97)}.toggle{appearance:none;display:inline-flex;align-items:center;justify-content:center;width:100%;height:100%;border:none;background:transparent;padding:0 min(var(--m-btn-size),1.25rem);border-radius:var(--m-button-radius, calc(var(--m-btn-size) * .375));box-shadow:none;color:var(--m-btn-color, var(--m-text-secondary));opacity:.65;font-family:inherit;font-size:var(--m-btn-size);font-weight:300;cursor:pointer;box-sizing:border-box;-webkit-user-select:none;user-select:none;transition:background .15s ease,color .15s ease,opacity .15s ease;min-width:0}.toggle .button-icon{flex-shrink:0}.toggle .button-label{display:inline-block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;min-width:0}.toggle:hover:not(:disabled){background:var(--m-button-hover-background, color-mix(in srgb, var(--m-focus) 8%, transparent));color:var(--m-button-hover-color, var(--m-text));opacity:1}.toggle:focus-visible:not(:disabled){outline:2px solid color-mix(in srgb,var(--m-focus) 45%,transparent);outline-offset:-2px;opacity:1}.toggle.primary{background:var(--m-button-active-background, var(--m-mm));color:var(--m-button-active-color, #ffffff);opacity:1}.toggle.primary:hover:not(:disabled){background:var(--m-button-active-background, var(--m-mm));color:var(--m-button-active-color, #ffffff);opacity:1}.toggle.primary:active:not(:disabled){transform:scale(.97)}.non-native:not(.get):not(.toggle){appearance:none;display:inline-flex;align-items:center;justify-content:center;width:100%;height:100%;min-height:0;padding:0 calc(var(--m-btn-size) * 1.25);border-width:2px;border-radius:4px;color:var(--m-btn-color);font-weight:300;line-height:1;-webkit-user-select:none;user-select:none;position:relative;outline:none;box-shadow:var(--m-button-shadow, var(--m-one-button-shadow, none));transition:filter .15s ease,background .15s ease}.non-native:not(.get):not(.toggle):hover:not([aria-disabled=true]){filter:brightness(1.04)}.non-native:not(.get):not(.toggle):focus-visible:not([aria-disabled=true]){outline:2px solid color-mix(in srgb,var(--m-focus) 45%,transparent);outline-offset:-2px}.non-native:not(.get):not(.toggle):active:not([aria-disabled=true]){transform:scale(.97)}.non-native:not(.get):not(.toggle)[aria-disabled=true]{opacity:.35;cursor:not-allowed;pointer-events:none;filter:grayscale(80%)}.non-native:not(.get):not(.toggle).primary{background:var(--m-btn-color);border-color:var(--m-btn-color);color:var(--m-btn-color-contrast)}.non-native:not(.get):not(.toggle).primary:hover:not([aria-disabled=true]){filter:none;background:color-mix(in srgb,var(--m-btn-color) 88%,black);border-color:color-mix(in srgb,var(--m-btn-color) 88%,black)}.non-native:not(.get):not(.toggle).primary:active:not([aria-disabled=true]){filter:brightness(.94);transform:scale(.97)}.non-native:not(.get):not(.toggle).ghost:not(.primary):not(.tab){background:transparent;border-color:transparent;color:var(--m-btn-color);box-shadow:none}.non-native:not(.get):not(.toggle).ghost:not(.primary):not(.tab):hover:not([aria-disabled=true]){filter:none;background:color-mix(in srgb,var(--m-btn-color) 8%,transparent)}.non-native:not(.get):not(.toggle).ghost:not(.primary):not(.tab):active:not([aria-disabled=true]){background:color-mix(in srgb,var(--m-btn-color) 14%,transparent);transform:scale(.97)}.non-native:not(.get):not(.toggle):disabled{opacity:.3;cursor:not-allowed}@container togglegroup (max-width: 320px){.non-native:not(.get):not(.toggle).with-left-icon .button-label,.non-native:not(.get):not(.toggle).with-right-icon .button-label{display:none!important}}@media(max-width:600px){.non-native:not(.get):not(.toggle).with-left-icon .button-label,.non-native:not(.get):not(.toggle).with-right-icon .button-label{display:none!important}}\n"], dependencies: [{ kind: "component", type: i0.forwardRef(() => IconComponent), selector: "m-icon, m-one-icon", inputs: ["config", "name", "color", "size", "one", "baseUrl", "remote"], outputs: ["configChange"] }, { kind: "component", type: i0.forwardRef(() => BadgeComponent), selector: "m-badge", inputs: ["config"], outputs: ["configChange"] }, { kind: "ngmodule", type: i0.forwardRef(() => RouterModule) }, { kind: "directive", type: i0.forwardRef(() => MRefDirective), selector: "[mRef]", inputs: ["mRef", "mRefLinkActive", "mRefToggle", "mRefParams"] }, { kind: "directive", type: i0.forwardRef(() => NgTemplateOutlet), selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i0.forwardRef(() => ImgComponent), selector: "m-img", inputs: ["src", "data", "dataType", "alt", "priority", "fill", "width", "height", "remote", "ngSrcset", "sizes"] }, { kind: "pipe", type: i0.forwardRef(() => TranslatePipe), name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
7544
+ }
7545
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ButtonComponent, decorators: [{
7546
+ type: Component,
7547
+ args: [{ selector: 'm-button,m-one-button', imports: [
7548
+ forwardRef(() => TranslatePipe),
7549
+ forwardRef(() => IconComponent),
7550
+ forwardRef(() => BadgeComponent),
7551
+ RouterModule,
7552
+ MRefDirective,
7553
+ forwardRef(() => NgTemplateOutlet),
7554
+ forwardRef(() => ImgComponent),
7555
+ ], encapsulation: ViewEncapsulation.Emulated, changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (config(); as config) {\n <!-- One branch for every in-app target: `mRef` names a NavId and the store\n reads the NavKind off that node to decide route vs panel (ADR 0014). -->\n @if (config.nav) {\n @if (!noNative()) {\n <button\n type=\"button\"\n class=\"{{ className() }}\"\n [attr.data-testid]=\"config.name + '-btn'\"\n [attr.tabindex]=\"config.tabindex\"\n [disabled]=\"config.disabled\"\n [mRef]=\"config.nav\"\n [mRefParams]=\"config.navParams\"\n [attr.aria-label]=\"config.noTranslate ? config.label : (config.label | translate: config.params)\"\n mRefLinkActive=\"tab\"\n (keydown.enter)=\"onClick()\"\n (click)=\"onClick()\"\n #button\n >\n <ng-container *ngTemplateOutlet=\"buttonContent; context: { button: config }\"></ng-container>\n </button>\n } @else {\n <div\n role=\"button\"\n [attr.tabindex]=\"config.tabindex ?? 0\"\n class=\"non-native {{ className() }}\"\n [attr.data-testid]=\"config.name + '-btn'\"\n [attr.aria-label]=\"config.noTranslate ? config.label : (config.label | translate: config.params)\"\n [attr.aria-disabled]=\"config.disabled ? 'true' : 'false'\"\n (keydown.enter)=\"onClick()\"\n (click)=\"onClick()\"\n #button\n >\n <ng-container *ngTemplateOutlet=\"buttonContent; context: { button: config }\"></ng-container>\n </div>\n }\n } @else if (config.href) {\n <a\n class=\"{{ className() }}\"\n [attr.data-testid]=\"config.name + '-btn'\"\n [attr.tabindex]=\"config.tabindex\"\n [href]=\"config.href\"\n [attr.aria-label]=\"config.noTranslate ? config.label : (config.label | translate: config.params)\"\n (click)=\"onClick()\"\n #button\n >\n <ng-container *ngTemplateOutlet=\"buttonContent; context: { button: config }\"></ng-container>\n </a>\n } @else {\n @if (!noNative()) {\n <button\n type=\"button\"\n class=\"{{ className() }}\"\n [attr.data-testid]=\"config.name + '-btn'\"\n [attr.tabindex]=\"config.tabindex\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"config.noTranslate ? config.label : (config.label | translate: config.params)\"\n (keydown.enter)=\"onClick()\"\n (click)=\"onClick()\"\n #button\n >\n <ng-container *ngTemplateOutlet=\"buttonContent; context: { button: config }\"></ng-container>\n </button>\n } @else {\n <div\n role=\"button\"\n [attr.tabindex]=\"config.tabindex ?? 0\"\n class=\"non-native {{ className() }}\"\n [attr.data-testid]=\"config.name + '-btn'\"\n [attr.aria-label]=\"config.noTranslate ? config.label : (config.label | translate: config.params)\"\n [attr.aria-disabled]=\"isDisabled() ? 'true' : 'false'\"\n (keydown.enter)=\"onClick()\"\n (click)=\"onClick()\"\n #button\n >\n <ng-container *ngTemplateOutlet=\"buttonContent; context: { button: config }\"></ng-container>\n </div>\n }\n }\n}\n\n<ng-template #buttonContent let-button=\"button\">\n @if (button.imgSrc) {\n <div class=\"button-icon button-icon--img\">\n <m-img [src]=\"button.imgSrc\" [remote]=\"button.remote\" [alt]=\"button.label || button.name || ''\" />\n @if (button.badge && button.badge.count) {\n <m-badge\n [config]=\"{ variant: button.badge.variant ?? 'danger', position: 'absolute' }\"\n >{{ formatBadgeCount(button.badge.count) }}</m-badge\n >\n }\n </div>\n } @else if (buttonIcon(); as icon) {\n <div class=\"button-icon\">\n @if (isFromOne()) {\n <m-one-icon [config]=\"icon\" />\n } @else {\n <m-icon [config]=\"icon\" />\n }\n @if (button.badge && button.badge.count) {\n <m-badge\n [config]=\"{ variant: button.badge.variant ?? 'danger', position: 'absolute' }\"\n >{{ formatBadgeCount(button.badge.count) }}</m-badge\n >\n }\n </div>\n }\n @if (button.label && !button.iconOnly) {\n <span class=\"button-label {{ button.labelClass || '' }}\">\n {{ button.noTranslate ? button.label : (button.label | translate: button.params) }}\n </span>\n }\n @if (!buttonIcon() && button.badge && button.badge.count) {\n <m-badge [config]=\"{ variant: button.badge.variant ?? 'danger', position: 'static' }\">{{\n formatBadgeCount(button.badge.count)\n }}</m-badge>\n }\n</ng-template>\n", styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}:host{display:inline-flex;align-items:center;justify-content:center;vertical-align:middle;box-sizing:border-box;overflow:hidden;transition:box-shadow .15s ease;--m-btn-size: var(--m-button-size, 1em);--m-btn-color: var(--m-button-color, var(--m-one-button-color, var(--m-mm)));--m-btn-color-contrast: var(--m-button-color-contrast, var(--m-one-button-color-contrast, #ffffff));--m-btn-color-opposite: var(--m-button-color-opposite, var(--m-one-button-color-opposite, #e1b941));--m-btn-h: calc(var(--m-btn-size) * 2.25);width:var(--m-button-width, var(--m-one-button-width, auto));min-width:0;height:var(--m-btn-h);font-size:var(--m-btn-size)}:host-context(.inverse),:host-context(.tabs-inverse),:host.inverse{--m-btn-color: var(--m-button-color, var(--m-one-button-color, var(--m-inverse-text)))}:host:has(.full-width){display:flex;width:100%}:host:has(.full-width) button .button-label{white-space:normal;overflow:visible;text-overflow:clip;word-break:break-word}:host:has(.only-icon),:host:has(.toggle){width:var(--m-btn-h);min-width:var(--m-btn-h)}:host:has(.has-badge){overflow:visible}:host:has(.stacked),:host:has(.toggle){height:auto}button:not(.get):not(.toggle){height:calc(var(--input-size, var(--m-btn-size)) * 2);min-height:calc(var(--input-size, var(--m-btn-size)) * 2);border-width:max(1px,var(--input-size, var(--m-btn-size)) * .0625);border-radius:calc(var(--input-size, var(--m-btn-size)) * .4);padding:calc(var(--input-size, var(--m-btn-size)) * .5) calc(var(--input-size, var(--m-btn-size)) * .5);gap:calc(var(--input-size, var(--m-btn-size)) * .375);font-size:var(--input-size, var(--m-btn-size));border-color:var(--m-btn-color);transition:border-color .2s ease,box-shadow .2s ease,background-color .2s ease,opacity .2s ease}button:not(.get):not(.toggle):hover:not(:disabled){background-color:color-mix(in srgb,var(--m-btn-color) 6%,transparent)}button:not(.get):not(.toggle):disabled{opacity:.6;cursor:not-allowed}button:not(.get):not(.toggle){height:auto;padding:calc(var(--m-btn-size) * .625) calc(var(--m-btn-size) * 1.25);gap:calc(var(--m-btn-size) * .375);border-style:solid;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;font-family:inherit;cursor:pointer;appearance:none;width:100%;height:100%;min-height:0;padding:0 calc(var(--m-btn-size) * 1.25);border-width:var(--m-button-border-width, 1px);border-radius:var(--m-button-radius, calc(var(--m-btn-size) * .5));color:var(--m-btn-color);font-weight:300;line-height:1;-webkit-user-select:none;user-select:none;position:relative;outline:none;box-shadow:var(--m-button-shadow, var(--m-one-button-shadow, none));transition:filter .15s ease,background .15s ease}button:not(.get):not(.toggle):hover:not(:disabled){filter:brightness(1.04)}button:not(.get):not(.toggle):focus-visible:not(:disabled){outline:2px solid color-mix(in srgb,var(--m-focus) 45%,transparent);outline-offset:-2px}button:not(.get):not(.toggle):active:not(:disabled){transform:scale(.97)}button:not(.get):not(.toggle):disabled{opacity:.35;cursor:not-allowed;pointer-events:none;filter:grayscale(80%)}button:not(.get):not(.toggle).read-only{pointer-events:none!important;cursor:default!important;transform:none!important;box-shadow:none!important;background:transparent!important;border-color:transparent!important;opacity:1!important}button:not(.get):not(.toggle).read-only .button-icon{transform:none!important;color:inherit!important}button:not(.get):not(.toggle).primary{background:var(--m-btn-color);border-color:var(--m-btn-color);color:var(--m-btn-color-contrast)}button:not(.get):not(.toggle).primary:hover:not(:disabled){filter:none;background:color-mix(in srgb,var(--m-btn-color) 88%,black);border-color:color-mix(in srgb,var(--m-btn-color) 88%,black)}button:not(.get):not(.toggle).primary:active:not(:disabled){filter:brightness(.94);transform:scale(.97)}button:not(.get):not(.toggle).ghost:not(.primary):not(.tab){background:transparent;border-color:transparent;color:var(--m-btn-color);box-shadow:none}button:not(.get):not(.toggle).ghost:not(.primary):not(.tab):hover:not(:disabled){filter:none;background:color-mix(in srgb,var(--m-btn-color) 8%,transparent)}button:not(.get):not(.toggle).ghost:not(.primary):not(.tab):active:not(:disabled){background:color-mix(in srgb,var(--m-btn-color) 14%,transparent);transform:scale(.97)}button:not(.get):not(.toggle).ghost:not(.primary):not(.tab).secondary{border:var(--m-button-border-width, 1px) solid color-mix(in srgb,var(--m-btn-color) 15%,transparent)}button:not(.get):not(.toggle).ghost:not(.primary):not(.tab).secondary:hover:not(:disabled){filter:none;border-color:color-mix(in srgb,var(--m-btn-color) 40%,transparent);background:color-mix(in srgb,var(--m-btn-color) 6%,transparent)}button:not(.get):not(.toggle).ghost:not(.primary):not(.tab).secondary:active:not(:disabled){border-color:color-mix(in srgb,var(--m-btn-color) 50%,transparent);background:color-mix(in srgb,var(--m-btn-color) 12%,transparent)}button:not(.get):not(.toggle).secondary:not(.primary):not(.ghost){background:transparent;border-color:var(--m-btn-color);color:var(--m-btn-color)}button:not(.get):not(.toggle).secondary:not(.primary):not(.ghost):hover:not(:disabled){filter:none;background:color-mix(in srgb,var(--m-btn-color) 8%,transparent)}button:not(.get):not(.toggle).secondary:not(.primary):not(.ghost):active:not(:disabled){background:color-mix(in srgb,var(--m-btn-color) 14%,transparent);transform:scale(.97)}button:not(.get):not(.toggle).tab{background:var(--m-backdrop-border);border-color:var(--m-backdrop-border);color:var(--m-btn-color)}button:not(.get):not(.toggle).tab:hover:not(:disabled){background:color-mix(in srgb,var(--m-backdrop-border) 82%,black);border-color:color-mix(in srgb,var(--m-backdrop-border) 82%,black);filter:none}button:not(.get):not(.toggle).tab:active:not(:disabled){background:color-mix(in srgb,var(--m-backdrop-border) 70%,black);border-color:color-mix(in srgb,var(--m-backdrop-border) 70%,black);transform:scale(.97)}button:not(.get):not(.toggle).segmented .button-icon,button:not(.get):not(.toggle).badge-accent .button-icon,button:not(.get):not(.toggle).with-right-icon .button-icon{display:inline-flex;align-items:center;justify-content:center;color:var(--m-btn-color-opposite);order:1}button:not(.get):not(.toggle).segmented .button-label,button:not(.get):not(.toggle).badge-accent .button-label,button:not(.get):not(.toggle).with-right-icon .button-label{order:-1}button:not(.get):not(.toggle).segmented.primary .button-icon,button:not(.get):not(.toggle).badge-accent.primary .button-icon,button:not(.get):not(.toggle).with-right-icon.primary .button-icon{color:var(--m-btn-color-opposite)}button:not(.get):not(.toggle).with-left-icon .button-icon{order:-1}button:not(.get):not(.toggle).with-left-icon .button-label{order:1}button:not(.get):not(.toggle).stacked{flex-direction:column;gap:calc(var(--m-btn-size) * .3);height:auto;min-height:var(--m-btn-h);padding:calc(var(--m-btn-size) * .625) calc(var(--m-btn-size) * .875)}button:not(.get):not(.toggle).stacked .button-label{font-size:calc(var(--m-btn-size) * .8)}button:not(.get):not(.toggle).only-icon{padding:0;border-width:var(--m-button-border-width, 1px);aspect-ratio:1;display:inline-flex;align-items:center;justify-content:center}button:not(.get):not(.toggle).only-icon m-icon,button:not(.get):not(.toggle).only-icon m-one-icon{display:inline-flex}m-badge{--m-badge-height: 1.5em;--m-badge-min-width: 1.5em;--m-badge-padding: 0 .3em;--m-badge-gap: .1em}.button-label{display:inline-flex;align-items:center;line-height:normal;font-size:inherit;min-width:0;max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.button-icon{position:relative;display:inline-flex;align-items:center;justify-content:center}.button-icon--img{width:calc(var(--m-btn-size) * 1.75);height:calc(var(--m-btn-size) * 1.75);overflow:hidden}.button-icon--img m-img{width:100%;height:100%;display:block}.get{appearance:none;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;height:var(--m-btn-h);padding:0 min(var(--m-btn-size) * 1.75,2rem);border-radius:4px;background:linear-gradient(135deg,var(--m-mm),var(--m-focus),var(--m-success),var(--m-mm));background-size:200% auto;color:#fff;font-size:calc(var(--m-btn-size) * .8);font-weight:300;letter-spacing:.06em;text-transform:uppercase;border:none;cursor:pointer;white-space:nowrap;line-height:1;transition:background-position .2s ease,transform .15s ease}.get:hover{background-position:right center}.get:focus-visible{outline:2px solid color-mix(in srgb,var(--m-focus) 45%,transparent);outline-offset:-2px}.get:active{transform:scale(.97)}.toggle{appearance:none;display:inline-flex;align-items:center;justify-content:center;width:100%;height:100%;border:none;background:transparent;padding:0 min(var(--m-btn-size),1.25rem);border-radius:var(--m-button-radius, calc(var(--m-btn-size) * .375));box-shadow:none;color:var(--m-btn-color, var(--m-text-secondary));opacity:.65;font-family:inherit;font-size:var(--m-btn-size);font-weight:300;cursor:pointer;box-sizing:border-box;-webkit-user-select:none;user-select:none;transition:background .15s ease,color .15s ease,opacity .15s ease;min-width:0}.toggle .button-icon{flex-shrink:0}.toggle .button-label{display:inline-block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;min-width:0}.toggle:hover:not(:disabled){background:var(--m-button-hover-background, color-mix(in srgb, var(--m-focus) 8%, transparent));color:var(--m-button-hover-color, var(--m-text));opacity:1}.toggle:focus-visible:not(:disabled){outline:2px solid color-mix(in srgb,var(--m-focus) 45%,transparent);outline-offset:-2px;opacity:1}.toggle.primary{background:var(--m-button-active-background, var(--m-mm));color:var(--m-button-active-color, #ffffff);opacity:1}.toggle.primary:hover:not(:disabled){background:var(--m-button-active-background, var(--m-mm));color:var(--m-button-active-color, #ffffff);opacity:1}.toggle.primary:active:not(:disabled){transform:scale(.97)}.non-native:not(.get):not(.toggle){appearance:none;display:inline-flex;align-items:center;justify-content:center;width:100%;height:100%;min-height:0;padding:0 calc(var(--m-btn-size) * 1.25);border-width:2px;border-radius:4px;color:var(--m-btn-color);font-weight:300;line-height:1;-webkit-user-select:none;user-select:none;position:relative;outline:none;box-shadow:var(--m-button-shadow, var(--m-one-button-shadow, none));transition:filter .15s ease,background .15s ease}.non-native:not(.get):not(.toggle):hover:not([aria-disabled=true]){filter:brightness(1.04)}.non-native:not(.get):not(.toggle):focus-visible:not([aria-disabled=true]){outline:2px solid color-mix(in srgb,var(--m-focus) 45%,transparent);outline-offset:-2px}.non-native:not(.get):not(.toggle):active:not([aria-disabled=true]){transform:scale(.97)}.non-native:not(.get):not(.toggle)[aria-disabled=true]{opacity:.35;cursor:not-allowed;pointer-events:none;filter:grayscale(80%)}.non-native:not(.get):not(.toggle).primary{background:var(--m-btn-color);border-color:var(--m-btn-color);color:var(--m-btn-color-contrast)}.non-native:not(.get):not(.toggle).primary:hover:not([aria-disabled=true]){filter:none;background:color-mix(in srgb,var(--m-btn-color) 88%,black);border-color:color-mix(in srgb,var(--m-btn-color) 88%,black)}.non-native:not(.get):not(.toggle).primary:active:not([aria-disabled=true]){filter:brightness(.94);transform:scale(.97)}.non-native:not(.get):not(.toggle).ghost:not(.primary):not(.tab){background:transparent;border-color:transparent;color:var(--m-btn-color);box-shadow:none}.non-native:not(.get):not(.toggle).ghost:not(.primary):not(.tab):hover:not([aria-disabled=true]){filter:none;background:color-mix(in srgb,var(--m-btn-color) 8%,transparent)}.non-native:not(.get):not(.toggle).ghost:not(.primary):not(.tab):active:not([aria-disabled=true]){background:color-mix(in srgb,var(--m-btn-color) 14%,transparent);transform:scale(.97)}.non-native:not(.get):not(.toggle):disabled{opacity:.3;cursor:not-allowed}@container togglegroup (max-width: 320px){.non-native:not(.get):not(.toggle).with-left-icon .button-label,.non-native:not(.get):not(.toggle).with-right-icon .button-label{display:none!important}}@media(max-width:600px){.non-native:not(.get):not(.toggle).with-left-icon .button-label,.non-native:not(.get):not(.toggle).with-right-icon .button-label{display:none!important}}\n"] }]
7556
+ }], ctorParameters: () => [], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: false }] }, { type: i0.Output, args: ["configChange"] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], labelClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "labelClass", required: false }] }], fullWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "fullWidth", required: false }] }], nav: [{ type: i0.Input, args: [{ isSignal: true, alias: "nav", required: false }] }], navParams: [{ type: i0.Input, args: [{ isSignal: true, alias: "navParams", required: false }] }], href: [{ type: i0.Input, args: [{ isSignal: true, alias: "href", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], baseUrl: [{ type: i0.Input, args: [{ isSignal: true, alias: "baseUrl", required: false }] }], one: [{ type: i0.Input, args: [{ isSignal: true, alias: "one", required: false }] }], remote: [{ type: i0.Input, args: [{ isSignal: true, alias: "remote", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], noTranslate: [{ type: i0.Input, args: [{ isSignal: true, alias: "noTranslate", required: false }] }], params: [{ type: i0.Input, args: [{ isSignal: true, alias: "params", required: false }] }], noNative: [{ type: i0.Input, args: [{ isSignal: true, alias: "noNative", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], isRightIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "isRightIcon", required: false }] }], iconOnly: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconOnly", required: false }] }], stacked: [{ type: i0.Input, args: [{ isSignal: true, alias: "stacked", required: false }] }], imgSrc: [{ type: i0.Input, args: [{ isSignal: true, alias: "imgSrc", required: false }] }], nonClickable: [{ type: i0.Input, args: [{ isSignal: true, alias: "nonClickable", required: false }] }], inverted: [{ type: i0.Input, args: [{ isSignal: true, alias: "inverted", required: false }] }], isSubmit: [{ type: i0.Input, args: [{ isSignal: true, alias: "isSubmit", required: false }] }], tabindex: [{ type: i0.Input, args: [{ isSignal: true, alias: "tabindex", required: false }] }], clicked: [{ type: i0.Output, args: ["clicked"] }], button: [{ type: i0.ViewChild, args: ['button', { isSignal: true }] }] } });
7557
+
7558
+ let HeaderComponent$1 = class HeaderComponent {
7559
+ level = input(3, ...(ngDevMode ? [{ debugName: "level" }] : /* istanbul ignore next */ []));
7560
+ label = input(...(ngDevMode ? [undefined, { debugName: "label" }] : /* istanbul ignore next */ []));
7561
+ // Drawn inside the heading rather than beside it. A glyph placed as the
7562
+ // heading's sibling has no line box of its own to centre against — it ends
7563
+ // up centred on whatever column it sits next to, which is how a Canvas
7564
+ // header's icon came to line up with the label slot's drop rect instead of
7565
+ // with the label. Inside, the two share one line box at every level.
7566
+ icon = input(...(ngDevMode ? [undefined, { debugName: "icon" }] : /* istanbul ignore next */ []));
7567
+ actionButton = input(...(ngDevMode ? [undefined, { debugName: "actionButton" }] : /* istanbul ignore next */ []));
7568
+ // The action Button's accessible name. It renders icon-only, so the label is
7569
+ // the only thing a screen reader has to go on — without it the button reads
7570
+ // as nothing at all.
7571
+ actionLabel = input(...(ngDevMode ? [undefined, { debugName: "actionLabel" }] : /* istanbul ignore next */ []));
7572
+ // The label is authored text rather than a translation key. Needed for text
7573
+ // carrying angle brackets above all: `translate` reads `<...>` as link
7574
+ // markup, so a heading naming a MessageVariable — `<$app>` — resolves to
7575
+ // nothing at all rather than to itself.
7576
+ noTranslate = input(false, ...(ngDevMode ? [{ debugName: "noTranslate" }] : /* istanbul ignore next */ []));
7577
+ // A message's [MessageVariable] values, the same record `m-text-output`
7578
+ // takes: a heading naming `<$count>` is a sentence with a datum in it, and
7579
+ // splicing that datum into the key instead would be parsed as a query
7580
+ // string (m-one-ui ADR 0066).
7581
+ params = input(undefined, ...(ngDevMode ? [{ debugName: "params" }] : /* istanbul ignore next */ []));
7582
+ actionClick = output();
7583
+ translateService = inject(TranslateService);
7584
+ sizeContext = inject(SIZE_CONTEXT, { optional: true });
7585
+ // The action Button sits inside the heading, whose font-size is the level's
7586
+ // own — 2.25rem at h1 — so `em` inheritance would scale the Button to the
7587
+ // heading rather than to the Section it belongs to. It reads the Size in
7588
+ // force instead, the way Icon does, and lands at the same size as every
7589
+ // other Button on that Section (ADR 0008).
7590
+ actionSize = computed(() => resolveSize(this.sizeContext?.size()), ...(ngDevMode ? [{ debugName: "actionSize" }] : /* istanbul ignore next */ []));
7591
+ actionConfig = computed(() => {
7592
+ const icon = this.actionButton();
7593
+ if (!icon)
7594
+ return undefined;
7595
+ return {
7596
+ icon,
7597
+ label: this.actionLabel(),
7598
+ iconOnly: true,
7599
+ variant: 'ghost',
7600
+ };
7601
+ }, ...(ngDevMode ? [{ debugName: "actionConfig" }] : /* istanbul ignore next */ []));
7602
+ // A computed rather than the impure TranslatePipe repeated six times: one
7603
+ // lookup per label change instead of one per change-detection tick, and it
7604
+ // still repaints when the language or an in-memory translation moves.
7605
+ text = computed(() => this.noTranslate()
7606
+ ? (this.label() ?? '')
7607
+ : this.translateService.translate(this.label(), this.params()), ...(ngDevMode ? [{ debugName: "text" }] : /* istanbul ignore next */ []));
7608
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: HeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
7609
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: HeaderComponent, isStandalone: true, selector: "m-header", inputs: { level: { classPropertyName: "level", publicName: "level", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, actionButton: { classPropertyName: "actionButton", publicName: "actionButton", isSignal: true, isRequired: false, transformFunction: null }, actionLabel: { classPropertyName: "actionLabel", publicName: "actionLabel", isSignal: true, isRequired: false, transformFunction: null }, noTranslate: { classPropertyName: "noTranslate", publicName: "noTranslate", isSignal: true, isRequired: false, transformFunction: null }, params: { classPropertyName: "params", publicName: "params", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { actionClick: "actionClick" }, ngImport: i0, template: `
7610
+ @switch (level()) {
7611
+ @case (1) {
7612
+ <h1 class="header__heading">
7613
+ @if (icon(); as iconName) {
7614
+ <m-icon class="header__icon" [name]="iconName" />
7615
+ }
7616
+ <span>{{ text() }}</span>
7617
+ <ng-content />
7618
+ @if (actionConfig(); as action) {
7619
+ <m-button class="header__action" [config]="action" [style.--m-button-size]="actionSize()" (clicked)="actionClick.emit()" />
7620
+ }
7621
+ </h1>
7622
+ }
7623
+ @case (2) {
7624
+ <h2 class="header__heading">
7625
+ @if (icon(); as iconName) {
7626
+ <m-icon class="header__icon" [name]="iconName" />
7627
+ }
7628
+ <span>{{ text() }}</span>
7629
+ <ng-content />
7630
+ @if (actionConfig(); as action) {
7631
+ <m-button class="header__action" [config]="action" [style.--m-button-size]="actionSize()" (clicked)="actionClick.emit()" />
7632
+ }
7633
+ </h2>
7634
+ }
7635
+ @case (3) {
7636
+ <h3 class="header__heading">
7637
+ @if (icon(); as iconName) {
7638
+ <m-icon class="header__icon" [name]="iconName" />
7639
+ }
7640
+ <span>{{ text() }}</span>
7641
+ <ng-content />
7642
+ @if (actionConfig(); as action) {
7643
+ <m-button class="header__action" [config]="action" [style.--m-button-size]="actionSize()" (clicked)="actionClick.emit()" />
7644
+ }
7645
+ </h3>
7646
+ }
7647
+ @case (4) {
7648
+ <h4 class="header__heading">
7649
+ @if (icon(); as iconName) {
7650
+ <m-icon class="header__icon" [name]="iconName" />
7651
+ }
7652
+ <span>{{ text() }}</span>
7653
+ <ng-content />
7654
+ @if (actionConfig(); as action) {
7655
+ <m-button class="header__action" [config]="action" [style.--m-button-size]="actionSize()" (clicked)="actionClick.emit()" />
7656
+ }
7657
+ </h4>
7658
+ }
7659
+ @case (5) {
7660
+ <h5 class="header__heading">
7661
+ @if (icon(); as iconName) {
7662
+ <m-icon class="header__icon" [name]="iconName" />
7663
+ }
7664
+ <span>{{ text() }}</span>
7665
+ <ng-content />
7666
+ @if (actionConfig(); as action) {
7667
+ <m-button class="header__action" [config]="action" [style.--m-button-size]="actionSize()" (clicked)="actionClick.emit()" />
7668
+ }
7669
+ </h5>
7670
+ }
7671
+ @case (6) {
7672
+ <h6 class="header__heading">
7673
+ @if (icon(); as iconName) {
7674
+ <m-icon class="header__icon" [name]="iconName" />
7675
+ }
7676
+ <span>{{ text() }}</span>
7677
+ <ng-content />
7678
+ @if (actionConfig(); as action) {
7679
+ <m-button class="header__action" [config]="action" [style.--m-button-size]="actionSize()" (clicked)="actionClick.emit()" />
7680
+ }
7681
+ </h6>
7682
+ }
7683
+ }
7684
+ `, 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)}}.header__heading{display:flex;flex-direction:row;align-items:center;justify-content:var(--m-header-justify, flex-start);gap:.75rem;margin:0;padding:0;line-height:1.1;font-weight:800;letter-spacing:-.025em;color:var(--m-header-color, var(--m-text));transition:transform .2s cubic-bezier(.4,0,.2,1)}.header__heading:hover{transform:translate(2px)}.header__icon{flex-shrink:0}.header__action{margin-left:auto}.header__action span{display:inline-block;vertical-align:middle}h1.header__heading{font-size:var(--m-header-font-size, 2.25rem);font-weight:300;color:var(--m-text-quaternary);letter-spacing:-.035em;line-height:1.15}h2.header__heading{font-size:var(--m-header-font-size, 1.75rem);font-weight:300;color:var(--m-text-tertiary);letter-spacing:-.03em;line-height:1.2}h3.header__heading{font-size:var(--m-header-font-size, 1.375rem);font-weight:400;color:var(--m-text-secondary);letter-spacing:-.025em}h4.header__heading{font-size:var(--m-header-font-size, 1.125rem);font-weight:500;color:var(--m-text);letter-spacing:-.02em}h5.header__heading{font-size:var(--m-header-font-size, 1rem);font-weight:600;color:var(--m-text);letter-spacing:-.01em}h6.header__heading{font-size:var(--m-header-font-size, .875rem);font-weight:600;color:var(--m-text);letter-spacing:.05em;text-transform:uppercase}\n"], dependencies: [{ kind: "component", type: ButtonComponent, selector: "m-button,m-one-button", inputs: ["config", "color", "labelClass", "fullWidth", "nav", "navParams", "href", "disabled", "variant", "name", "baseUrl", "one", "remote", "label", "noTranslate", "params", "noNative", "icon", "isRightIcon", "iconOnly", "stacked", "imgSrc", "nonClickable", "inverted", "isSubmit", "tabindex"], outputs: ["configChange", "clicked"] }, { kind: "component", type: IconComponent, selector: "m-icon, m-one-icon", inputs: ["config", "name", "color", "size", "one", "baseUrl", "remote"], outputs: ["configChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
7685
+ };
7686
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: HeaderComponent$1, decorators: [{
7687
+ type: Component,
7688
+ args: [{ selector: 'm-header', imports: [ButtonComponent, IconComponent], template: `
7689
+ @switch (level()) {
7690
+ @case (1) {
7691
+ <h1 class="header__heading">
7692
+ @if (icon(); as iconName) {
7693
+ <m-icon class="header__icon" [name]="iconName" />
7694
+ }
7695
+ <span>{{ text() }}</span>
7696
+ <ng-content />
7697
+ @if (actionConfig(); as action) {
7698
+ <m-button class="header__action" [config]="action" [style.--m-button-size]="actionSize()" (clicked)="actionClick.emit()" />
7699
+ }
7700
+ </h1>
7701
+ }
7702
+ @case (2) {
7703
+ <h2 class="header__heading">
7704
+ @if (icon(); as iconName) {
7705
+ <m-icon class="header__icon" [name]="iconName" />
7706
+ }
7707
+ <span>{{ text() }}</span>
7708
+ <ng-content />
7709
+ @if (actionConfig(); as action) {
7710
+ <m-button class="header__action" [config]="action" [style.--m-button-size]="actionSize()" (clicked)="actionClick.emit()" />
7711
+ }
7712
+ </h2>
7713
+ }
7714
+ @case (3) {
7715
+ <h3 class="header__heading">
7716
+ @if (icon(); as iconName) {
7717
+ <m-icon class="header__icon" [name]="iconName" />
7718
+ }
7719
+ <span>{{ text() }}</span>
7720
+ <ng-content />
7721
+ @if (actionConfig(); as action) {
7722
+ <m-button class="header__action" [config]="action" [style.--m-button-size]="actionSize()" (clicked)="actionClick.emit()" />
7723
+ }
7724
+ </h3>
7725
+ }
7726
+ @case (4) {
7727
+ <h4 class="header__heading">
7728
+ @if (icon(); as iconName) {
7729
+ <m-icon class="header__icon" [name]="iconName" />
7730
+ }
7731
+ <span>{{ text() }}</span>
7732
+ <ng-content />
7733
+ @if (actionConfig(); as action) {
7734
+ <m-button class="header__action" [config]="action" [style.--m-button-size]="actionSize()" (clicked)="actionClick.emit()" />
7735
+ }
7736
+ </h4>
7737
+ }
7738
+ @case (5) {
7739
+ <h5 class="header__heading">
7740
+ @if (icon(); as iconName) {
7741
+ <m-icon class="header__icon" [name]="iconName" />
7742
+ }
7743
+ <span>{{ text() }}</span>
7744
+ <ng-content />
7745
+ @if (actionConfig(); as action) {
7746
+ <m-button class="header__action" [config]="action" [style.--m-button-size]="actionSize()" (clicked)="actionClick.emit()" />
7747
+ }
7748
+ </h5>
7749
+ }
7750
+ @case (6) {
7751
+ <h6 class="header__heading">
7752
+ @if (icon(); as iconName) {
7753
+ <m-icon class="header__icon" [name]="iconName" />
7754
+ }
7755
+ <span>{{ text() }}</span>
7756
+ <ng-content />
7757
+ @if (actionConfig(); as action) {
7758
+ <m-button class="header__action" [config]="action" [style.--m-button-size]="actionSize()" (clicked)="actionClick.emit()" />
7759
+ }
7760
+ </h6>
7761
+ }
7762
+ }
7763
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}.header__heading{display:flex;flex-direction:row;align-items:center;justify-content:var(--m-header-justify, flex-start);gap:.75rem;margin:0;padding:0;line-height:1.1;font-weight:800;letter-spacing:-.025em;color:var(--m-header-color, var(--m-text));transition:transform .2s cubic-bezier(.4,0,.2,1)}.header__heading:hover{transform:translate(2px)}.header__icon{flex-shrink:0}.header__action{margin-left:auto}.header__action span{display:inline-block;vertical-align:middle}h1.header__heading{font-size:var(--m-header-font-size, 2.25rem);font-weight:300;color:var(--m-text-quaternary);letter-spacing:-.035em;line-height:1.15}h2.header__heading{font-size:var(--m-header-font-size, 1.75rem);font-weight:300;color:var(--m-text-tertiary);letter-spacing:-.03em;line-height:1.2}h3.header__heading{font-size:var(--m-header-font-size, 1.375rem);font-weight:400;color:var(--m-text-secondary);letter-spacing:-.025em}h4.header__heading{font-size:var(--m-header-font-size, 1.125rem);font-weight:500;color:var(--m-text);letter-spacing:-.02em}h5.header__heading{font-size:var(--m-header-font-size, 1rem);font-weight:600;color:var(--m-text);letter-spacing:-.01em}h6.header__heading{font-size:var(--m-header-font-size, .875rem);font-weight:600;color:var(--m-text);letter-spacing:.05em;text-transform:uppercase}\n"] }]
7764
+ }], propDecorators: { level: [{ type: i0.Input, args: [{ isSignal: true, alias: "level", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], actionButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "actionButton", required: false }] }], actionLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "actionLabel", required: false }] }], noTranslate: [{ type: i0.Input, args: [{ isSignal: true, alias: "noTranslate", required: false }] }], params: [{ type: i0.Input, args: [{ isSignal: true, alias: "params", required: false }] }], actionClick: [{ type: i0.Output, args: ["actionClick"] }] } });
7765
+
7766
+ /**
7767
+ * Asks the user to agree to every Declared Permission of an App at once — no
7768
+ * subset (store ADR 0006). Closes `true` on agreement and `false` on the other
7769
+ * button, which is Cancel or, when the App cannot open without it, Back to
7770
+ * Store.
7771
+ */
7772
+ class AgreementComponent {
7773
+ header = input('', ...(ngDevMode ? [{ debugName: "header" }] : /* istanbul ignore next */ []));
7774
+ params = input({}, ...(ngDevMode ? [{ debugName: "params" }] : /* istanbul ignore next */ []));
7775
+ permissions = input([], ...(ngDevMode ? [{ debugName: "permissions" }] : /* istanbul ignore next */ []));
7776
+ confirmLabel = input('agree', ...(ngDevMode ? [{ debugName: "confirmLabel" }] : /* istanbul ignore next */ []));
7777
+ cancelLabel = input('cancel', ...(ngDevMode ? [{ debugName: "cancelLabel" }] : /* istanbul ignore next */ []));
7778
+ #modalRef = inject(MODAL_REF);
7779
+ accept() {
7780
+ this.#modalRef.close(true);
7781
+ }
7782
+ decline() {
7783
+ this.#modalRef.close(false);
7784
+ }
7785
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AgreementComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
7786
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AgreementComponent, isStandalone: true, selector: "m-agreement", inputs: { header: { classPropertyName: "header", publicName: "header", isSignal: true, isRequired: false, transformFunction: null }, params: { classPropertyName: "params", publicName: "params", isSignal: true, isRequired: false, transformFunction: null }, permissions: { classPropertyName: "permissions", publicName: "permissions", isSignal: true, isRequired: false, transformFunction: null }, confirmLabel: { classPropertyName: "confirmLabel", publicName: "confirmLabel", isSignal: true, isRequired: false, transformFunction: null }, cancelLabel: { classPropertyName: "cancelLabel", publicName: "cancelLabel", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
7787
+ <div class="agreement">
7788
+ <div class="agreement__header">
7789
+ <m-header [level]="3" [label]="header()" [params]="params()" />
7790
+ <p class="agreement__body">{{ 'agreement-body' | translate }}</p>
7791
+ </div>
7792
+
7793
+ <ul class="agreement__list">
7794
+ @for (permission of permissions(); track permission.id) {
7795
+ <li class="agreement__item">
7796
+ <span class="agreement__icon"><m-icon [name]="permission.icon" /></span>
7797
+ <span class="agreement__text">
7798
+ <span class="agreement__name">{{ permission.nameKey | translate }}</span>
7799
+ <span class="agreement__description">{{
7800
+ permission.descriptionKey | translate
7801
+ }}</span>
7802
+ </span>
7803
+ </li>
7804
+ }
7805
+ </ul>
7806
+
7807
+ <div class="agreement__actions">
7808
+ <!-- asset: buttons/confirm_cancel.yml -->
7809
+ <m-one-button name="confirm_cancel" [label]="cancelLabel()" (clicked)="decline()" />
7810
+ <!-- asset: buttons/okay.yml -->
7811
+ <m-one-button name="okay" [label]="confirmLabel()" (clicked)="accept()" />
7812
+ </div>
7813
+ </div>
7814
+ `, 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)}}.agreement{display:flex;flex-direction:column;min-width:320px;max-width:480px;padding:2.5rem;background:var(--m-backdrop-modal, rgba(255, 255, 255, .85));backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px)}.agreement__header{display:flex;flex-direction:column;align-items:center;text-align:center;gap:.9375rem;margin-bottom:1.5rem}.agreement__body{margin:0;font-size:1rem;line-height:1.6;color:var(--m-text-600)}.agreement__list{list-style:none;margin:0 0 2rem;padding:0;display:flex;flex-direction:column;gap:1rem}.agreement__item{display:flex;align-items:flex-start;gap:1rem}.agreement__icon{flex:0 0 40px;height:40px;display:flex;align-items:center;justify-content:center;border-radius:12px;background:var(--m-backdrop-mm, rgba(65, 105, 225, .1));color:var(--m-mm, #4169e1)}.agreement__text{display:flex;flex-direction:column;gap:.25rem}.agreement__name{font-weight:600;color:var(--m-text-900)}.agreement__description{font-size:.875rem;color:var(--m-text-600)}.agreement__actions{width:100%;display:flex;justify-content:center;gap:1rem}\n"], dependencies: [{ kind: "component", type: ButtonComponent, selector: "m-button,m-one-button", inputs: ["config", "color", "labelClass", "fullWidth", "nav", "navParams", "href", "disabled", "variant", "name", "baseUrl", "one", "remote", "label", "noTranslate", "params", "noNative", "icon", "isRightIcon", "iconOnly", "stacked", "imgSrc", "nonClickable", "inverted", "isSubmit", "tabindex"], outputs: ["configChange", "clicked"] }, { kind: "component", type: IconComponent, selector: "m-icon, m-one-icon", inputs: ["config", "name", "color", "size", "one", "baseUrl", "remote"], outputs: ["configChange"] }, { kind: "component", type: HeaderComponent$1, selector: "m-header", inputs: ["level", "label", "icon", "actionButton", "actionLabel", "noTranslate", "params"], outputs: ["actionClick"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
7815
+ }
7816
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AgreementComponent, decorators: [{
7817
+ type: Component,
7818
+ args: [{ selector: 'm-agreement', imports: [ButtonComponent, IconComponent, TranslatePipe, HeaderComponent$1], template: `
7819
+ <div class="agreement">
7820
+ <div class="agreement__header">
7821
+ <m-header [level]="3" [label]="header()" [params]="params()" />
7822
+ <p class="agreement__body">{{ 'agreement-body' | translate }}</p>
7823
+ </div>
7824
+
7825
+ <ul class="agreement__list">
7826
+ @for (permission of permissions(); track permission.id) {
7827
+ <li class="agreement__item">
7828
+ <span class="agreement__icon"><m-icon [name]="permission.icon" /></span>
7829
+ <span class="agreement__text">
7830
+ <span class="agreement__name">{{ permission.nameKey | translate }}</span>
7831
+ <span class="agreement__description">{{
7832
+ permission.descriptionKey | translate
7833
+ }}</span>
7834
+ </span>
7835
+ </li>
7836
+ }
7837
+ </ul>
7838
+
7839
+ <div class="agreement__actions">
7840
+ <!-- asset: buttons/confirm_cancel.yml -->
7841
+ <m-one-button name="confirm_cancel" [label]="cancelLabel()" (clicked)="decline()" />
7842
+ <!-- asset: buttons/okay.yml -->
7843
+ <m-one-button name="okay" [label]="confirmLabel()" (clicked)="accept()" />
7844
+ </div>
7845
+ </div>
7846
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}.agreement{display:flex;flex-direction:column;min-width:320px;max-width:480px;padding:2.5rem;background:var(--m-backdrop-modal, rgba(255, 255, 255, .85));backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px)}.agreement__header{display:flex;flex-direction:column;align-items:center;text-align:center;gap:.9375rem;margin-bottom:1.5rem}.agreement__body{margin:0;font-size:1rem;line-height:1.6;color:var(--m-text-600)}.agreement__list{list-style:none;margin:0 0 2rem;padding:0;display:flex;flex-direction:column;gap:1rem}.agreement__item{display:flex;align-items:flex-start;gap:1rem}.agreement__icon{flex:0 0 40px;height:40px;display:flex;align-items:center;justify-content:center;border-radius:12px;background:var(--m-backdrop-mm, rgba(65, 105, 225, .1));color:var(--m-mm, #4169e1)}.agreement__text{display:flex;flex-direction:column;gap:.25rem}.agreement__name{font-weight:600;color:var(--m-text-900)}.agreement__description{font-size:.875rem;color:var(--m-text-600)}.agreement__actions{width:100%;display:flex;justify-content:center;gap:1rem}\n"] }]
7847
+ }], propDecorators: { header: [{ type: i0.Input, args: [{ isSignal: true, alias: "header", required: false }] }], params: [{ type: i0.Input, args: [{ isSignal: true, alias: "params", required: false }] }], permissions: [{ type: i0.Input, args: [{ isSignal: true, alias: "permissions", required: false }] }], confirmLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "confirmLabel", required: false }] }], cancelLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "cancelLabel", required: false }] }] } });
7848
+
7849
+ // One modal per App at a time: init and every refused api call of the same
7850
+ // App wait on the same answer instead of stacking modals.
7851
+ const pending = new Map();
7852
+ /**
7853
+ * Asks the user to agree to every Declared Permission of an App (store ADR
7854
+ * 0006) and records it with `POST store/app/<id>/permission`. `hardStop` is
7855
+ * the init gate: the modal cannot be dismissed, and its other button leaves
7856
+ * for the Store.
7857
+ */
7858
+ function injectAgreeToApp() {
7859
+ const modalStore = inject(ModalStore);
7860
+ const httpService = inject(HttpService);
7861
+ return (app, permissions, hardStop = false) => {
7862
+ const appId = app.id ?? '';
7863
+ const existing = pending.get(appId);
7864
+ if (existing)
7865
+ return existing;
7866
+ const appName = app.name ?? app.link ?? '';
7867
+ const answer = new Promise((resolve, reject) => {
7868
+ const modalRef = new ModalRef();
7869
+ const id = modalStore.open({
7870
+ component: AgreementComponent,
7871
+ providers: [{ provide: MODAL_REF, useValue: modalRef }],
7872
+ bindings: [
7873
+ inputBinding('header', () => `agreement_title?appName=${appName}`),
7874
+ inputBinding('permissions', () => permissions),
7875
+ inputBinding('cancelLabel', () => (hardStop ? 'back-to-store' : 'cancel')),
7876
+ ],
7877
+ config: hardStop ? { closeProhibited: true, backdropClose: false } : undefined,
7878
+ });
7879
+ modalRef.onClose(async (agreed) => {
7880
+ modalStore.close(id);
7881
+ if (!agreed) {
7882
+ reject({
7883
+ type: hardStop ? 'back_to_store' : 'agreement_declined',
7884
+ });
7885
+ return;
7886
+ }
7887
+ try {
7888
+ await firstValueFrom(httpService.post('store', ['app', appId, 'permission'], {}));
7889
+ resolve();
7890
+ }
7891
+ catch (e) {
7892
+ reject(e);
7893
+ }
7894
+ });
7895
+ }).finally(() => pending.delete(appId));
7896
+ pending.set(appId, answer);
7897
+ return answer;
7898
+ };
7899
+ }
7900
+
7901
+ class ConfirmComponent {
7902
+ header = input('', ...(ngDevMode ? [{ debugName: "header" }] : /* istanbul ignore next */ []));
7903
+ body = input('', ...(ngDevMode ? [{ debugName: "body" }] : /* istanbul ignore next */ []));
7904
+ /**
7905
+ * The MessageVariable values the two keys above name — a row's name or id the
7906
+ * asker knows and the message asks about. Values and never text: they reach
7907
+ * `TranslatePipe` as params rather than spliced into the key, so the message
7908
+ * still resolves per language. Empty is a message with no slots, which is
7909
+ * every confirmation drawn before this.
7910
+ */
7911
+ params = input({}, ...(ngDevMode ? [{ debugName: "params" }] : /* istanbul ignore next */ []));
7912
+ type = input('info', ...(ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []));
7913
+ /**
7914
+ * Whether the question can be refused. `yes` is an acknowledgement — the one
7915
+ * button commits and there is nothing else to press — and stays the default,
7916
+ * which is what every ConfirmComponent drawn before this was.
7917
+ */
7918
+ kind = input('yes', ...(ngDevMode ? [{ debugName: "kind" }] : /* istanbul ignore next */ []));
7919
+ /**
7920
+ * The wording of each button, as a TranslationAsset key. Empty falls back to
7921
+ * the library's own — derived from `type` for the commit, `cancel` for the
7922
+ * refusal — so a caller that has nothing to say about the buttons says
7923
+ * nothing.
7924
+ */
7925
+ confirmLabel = input('', ...(ngDevMode ? [{ debugName: "confirmLabel" }] : /* istanbul ignore next */ []));
7926
+ cancelLabel = input('', ...(ngDevMode ? [{ debugName: "cancelLabel" }] : /* istanbul ignore next */ []));
7927
+ #modalRef = inject(MODAL_REF);
7928
+ confirmText = computed(() => {
7929
+ if (this.confirmLabel())
7930
+ return this.confirmLabel();
7931
+ switch (this.type()) {
7932
+ case 'danger':
7933
+ return 'delete';
7934
+ default:
7935
+ return 'okay';
7936
+ }
7937
+ }, ...(ngDevMode ? [{ debugName: "confirmText" }] : /* istanbul ignore next */ []));
7938
+ cancelText = computed(() => this.cancelLabel() || 'cancel', ...(ngDevMode ? [{ debugName: "cancelText" }] : /* istanbul ignore next */ []));
7939
+ iconName = computed(() => {
7940
+ switch (this.type()) {
7941
+ case 'danger':
7942
+ return 'trash';
7943
+ case 'warning':
7944
+ return 'exclamation-triangle';
7945
+ case 'success':
7946
+ return 'check-circle';
7947
+ default:
7948
+ return 'info';
7949
+ }
7950
+ }, ...(ngDevMode ? [{ debugName: "iconName" }] : /* istanbul ignore next */ []));
7951
+ accept() {
7952
+ this.#modalRef.close(true);
6986
7953
  }
6987
- buttonIcon = computed(() => {
6988
- const name = this.config()?.icon;
6989
- if (!name) {
6990
- return undefined;
7954
+ // The refusal is a result like any other, so it closes with `false` rather
7955
+ // than dismissing: a caller waiting on the answer gets one either way.
7956
+ decline() {
7957
+ this.#modalRef.close(false);
7958
+ }
7959
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ConfirmComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
7960
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: ConfirmComponent, isStandalone: true, selector: "m-confirm", inputs: { header: { classPropertyName: "header", publicName: "header", isSignal: true, isRequired: false, transformFunction: null }, body: { classPropertyName: "body", publicName: "body", isSignal: true, isRequired: false, transformFunction: null }, params: { classPropertyName: "params", publicName: "params", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, kind: { classPropertyName: "kind", publicName: "kind", isSignal: true, isRequired: false, transformFunction: null }, confirmLabel: { classPropertyName: "confirmLabel", publicName: "confirmLabel", isSignal: true, isRequired: false, transformFunction: null }, cancelLabel: { classPropertyName: "cancelLabel", publicName: "cancelLabel", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
7961
+ <div class="confirm confirm--{{ type() }}">
7962
+ <div class="confirm__header">
7963
+ <div class="confirm__icon">
7964
+ <m-icon [name]="iconName()" />
7965
+ </div>
7966
+ @if (header()) {
7967
+ <!-- The heading takes the key and its values rather than projected
7968
+ text: m-header translates its own label, and a MessageVariable
7969
+ fills the same way it does everywhere else. -->
7970
+ <m-header [level]="3" [label]="header()" [params]="params()" />
6991
7971
  }
6992
- return {
6993
- name: this.config()?.icon,
6994
- color: this.buttonColor(),
6995
- baseUrl: this.baseUrl(),
6996
- remote: this.remote() ?? this.config()?.remote,
6997
- };
6998
- }, ...(ngDevMode ? [{ debugName: "buttonIcon" }] : /* istanbul ignore next */ []));
6999
- overrideProperty = computed(() => {
7000
- const button = {};
7001
- // The rest of what a `buttons/<name>.yml` carries, so a one-off Button
7002
- // needs no file (ADR 0010). An omitted attribute is skipped rather than
7003
- // written as undefined — writing it would blank whatever the asset set.
7004
- const put = (key, value) => {
7005
- if (value !== undefined)
7006
- button[key] = value;
7007
- };
7008
- put('label', this.label());
7009
- put('icon', this.icon());
7010
- put('imgSrc', this.imgSrc());
7011
- put('tabindex', toAttrNumber(this.tabindex()));
7012
- put('noTranslate', toAttrBool(this.noTranslate()));
7013
- put('params', this.params());
7014
- put('isRightIcon', toAttrBool(this.isRightIcon()));
7015
- put('iconOnly', toAttrBool(this.iconOnly()));
7016
- put('stacked', toAttrBool(this.stacked()));
7017
- put('nonClickable', toAttrBool(this.nonClickable()));
7018
- put('inverted', toAttrBool(this.inverted()));
7019
- put('isSubmit', toAttrBool(this.isSubmit()));
7020
- if (this.color()) {
7021
- button['color'] = this.color();
7972
+ </div>
7973
+
7974
+ <div class="confirm__content">
7975
+ @if (body()) {
7976
+ <p class="confirm__body" [innerHTML]="body() | translate: params()"></p>
7022
7977
  }
7023
- if (this.labelClass()) {
7024
- button['labelClass'] = this.labelClass();
7978
+ </div>
7979
+
7980
+ <div class="confirm__actions">
7981
+ @if (kind() === 'yes-no') {
7982
+ <!-- asset: buttons/confirm_cancel.yml -->
7983
+ <m-one-button name="confirm_cancel" [label]="cancelText()" (clicked)="decline()" />
7025
7984
  }
7026
- if (typeof this.fullWidth() !== 'undefined') {
7027
- button['fullWidth'] = toAttrBool(this.fullWidth());
7985
+ <!-- asset: buttons/okay.yml -->
7986
+ <m-one-button name="okay" [label]="confirmText()" (clicked)="accept()" />
7987
+ </div>
7988
+ </div>
7989
+ `, isInline: true, styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}.confirm{display:flex;flex-direction:column;min-width:320px;max-width:440px;padding:2.5rem;background:var(--m-backdrop-modal, rgba(255, 255, 255, .85));backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border:0;position:relative;overflow:hidden}.confirm__header{display:flex;flex-direction:column;align-items:center;text-align:center;gap:.9375rem;margin-bottom:1.5rem}.confirm__icon{width:64px;height:64px;border-radius:1.6rem;display:flex;align-items:center;justify-content:center;font-size:2rem;background:var(--m-backdrop-mm, rgba(65, 105, 225, .1));color:var(--m-mm, #4169e1)}.confirm__icon .m-icon{width:32px;height:32px}.confirm__title{margin:0;font-size:1.375rem;font-weight:700;color:var(--m-text-900);letter-spacing:-.02em}.confirm__content{text-align:center;margin-bottom:2rem}.confirm__body{margin:0;font-size:1rem;line-height:1.6;color:var(--m-text-600)}.confirm__actions{width:100%;margin-top:auto;display:flex;justify-content:center;gap:1rem}.confirm--danger .confirm__icon{background:var(--m-backdrop-error, rgba(235, 25, 26, .1));color:var(--m-error, #EB191A)}.confirm--warning .confirm__icon{background:var(--m-backdrop-warning, rgba(247, 122, 2, .1));color:var(--m-warning, #F77A02)}.confirm--success .confirm__icon{background:var(--m-backdrop-success, rgba(109, 168, 47, .1));color:var(--m-success, #6da82f)}.confirm--info .confirm__icon{background:var(--m-info-lite, rgba(3, 102, 214, .1));color:var(--m-info, #0366d6)}\n"], dependencies: [{ kind: "component", type: ButtonComponent, selector: "m-button,m-one-button", inputs: ["config", "color", "labelClass", "fullWidth", "nav", "navParams", "href", "disabled", "variant", "name", "baseUrl", "one", "remote", "label", "noTranslate", "params", "noNative", "icon", "isRightIcon", "iconOnly", "stacked", "imgSrc", "nonClickable", "inverted", "isSubmit", "tabindex"], outputs: ["configChange", "clicked"] }, { kind: "component", type: IconComponent, selector: "m-icon, m-one-icon", inputs: ["config", "name", "color", "size", "one", "baseUrl", "remote"], outputs: ["configChange"] }, { kind: "component", type: HeaderComponent$1, selector: "m-header", inputs: ["level", "label", "icon", "actionButton", "actionLabel", "noTranslate", "params"], outputs: ["actionClick"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
7990
+ }
7991
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ConfirmComponent, decorators: [{
7992
+ type: Component,
7993
+ args: [{ selector: 'm-confirm', imports: [ButtonComponent, IconComponent, TranslatePipe, HeaderComponent$1], template: `
7994
+ <div class="confirm confirm--{{ type() }}">
7995
+ <div class="confirm__header">
7996
+ <div class="confirm__icon">
7997
+ <m-icon [name]="iconName()" />
7998
+ </div>
7999
+ @if (header()) {
8000
+ <!-- The heading takes the key and its values rather than projected
8001
+ text: m-header translates its own label, and a MessageVariable
8002
+ fills the same way it does everywhere else. -->
8003
+ <m-header [level]="3" [label]="header()" [params]="params()" />
7028
8004
  }
7029
- if (this.nav()) {
7030
- button['nav'] = this.nav();
8005
+ </div>
8006
+
8007
+ <div class="confirm__content">
8008
+ @if (body()) {
8009
+ <p class="confirm__body" [innerHTML]="body() | translate: params()"></p>
7031
8010
  }
7032
- if (this.navParams()) {
7033
- button['navParams'] = this.navParams();
8011
+ </div>
8012
+
8013
+ <div class="confirm__actions">
8014
+ @if (kind() === 'yes-no') {
8015
+ <!-- asset: buttons/confirm_cancel.yml -->
8016
+ <m-one-button name="confirm_cancel" [label]="cancelText()" (clicked)="decline()" />
7034
8017
  }
7035
- if (this.href()) {
7036
- button['href'] = this.href();
8018
+ <!-- asset: buttons/okay.yml -->
8019
+ <m-one-button name="okay" [label]="confirmText()" (clicked)="accept()" />
8020
+ </div>
8021
+ </div>
8022
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}.confirm{display:flex;flex-direction:column;min-width:320px;max-width:440px;padding:2.5rem;background:var(--m-backdrop-modal, rgba(255, 255, 255, .85));backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border:0;position:relative;overflow:hidden}.confirm__header{display:flex;flex-direction:column;align-items:center;text-align:center;gap:.9375rem;margin-bottom:1.5rem}.confirm__icon{width:64px;height:64px;border-radius:1.6rem;display:flex;align-items:center;justify-content:center;font-size:2rem;background:var(--m-backdrop-mm, rgba(65, 105, 225, .1));color:var(--m-mm, #4169e1)}.confirm__icon .m-icon{width:32px;height:32px}.confirm__title{margin:0;font-size:1.375rem;font-weight:700;color:var(--m-text-900);letter-spacing:-.02em}.confirm__content{text-align:center;margin-bottom:2rem}.confirm__body{margin:0;font-size:1rem;line-height:1.6;color:var(--m-text-600)}.confirm__actions{width:100%;margin-top:auto;display:flex;justify-content:center;gap:1rem}.confirm--danger .confirm__icon{background:var(--m-backdrop-error, rgba(235, 25, 26, .1));color:var(--m-error, #EB191A)}.confirm--warning .confirm__icon{background:var(--m-backdrop-warning, rgba(247, 122, 2, .1));color:var(--m-warning, #F77A02)}.confirm--success .confirm__icon{background:var(--m-backdrop-success, rgba(109, 168, 47, .1));color:var(--m-success, #6da82f)}.confirm--info .confirm__icon{background:var(--m-info-lite, rgba(3, 102, 214, .1));color:var(--m-info, #0366d6)}\n"] }]
8023
+ }], propDecorators: { header: [{ type: i0.Input, args: [{ isSignal: true, alias: "header", required: false }] }], body: [{ type: i0.Input, args: [{ isSignal: true, alias: "body", required: false }] }], params: [{ type: i0.Input, args: [{ isSignal: true, alias: "params", required: false }] }], type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }], kind: [{ type: i0.Input, args: [{ isSignal: true, alias: "kind", required: false }] }], confirmLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "confirmLabel", required: false }] }], cancelLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "cancelLabel", required: false }] }] } });
8024
+
8025
+ /**
8026
+ * Installs an App after asking. An App declaring Permissions is installed only
8027
+ * with Agreement (store ADR 0006), so its modal lists them and the request
8028
+ * carries `agree: true`; `declared` spares the lookup when the caller already
8029
+ * holds them. `hardStop` is the init gate: the modal cannot be dismissed and
8030
+ * refusing leaves for the Store.
8031
+ */
8032
+ function injectInstallApp() {
8033
+ const modalStore = inject(ModalStore);
8034
+ const httpService = inject(HttpService);
8035
+ return async (app, declared, hardStop = false) => {
8036
+ const appName = app.name ?? app.link ?? '';
8037
+ const appId = app.id ?? '';
8038
+ const permissions = declared ??
8039
+ (app.permissions?.length
8040
+ ? await firstValueFrom(httpService.get('store', ['app', appId, 'permission'])).catch(() => [])
8041
+ : []);
8042
+ return new Promise((resolve, reject) => {
8043
+ const modalRef = new ModalRef();
8044
+ const id = permissions.length
8045
+ ? modalStore.open({
8046
+ component: AgreementComponent,
8047
+ providers: [{ provide: MODAL_REF, useValue: modalRef }],
8048
+ bindings: [
8049
+ inputBinding('header', () => `install_app_title?appName=${appName}`),
8050
+ inputBinding('permissions', () => permissions),
8051
+ inputBinding('confirmLabel', () => 'install'),
8052
+ inputBinding('cancelLabel', () => hardStop ? 'back-to-store' : 'cancel'),
8053
+ ],
8054
+ config: hardStop
8055
+ ? { closeProhibited: true, backdropClose: false }
8056
+ : undefined,
8057
+ })
8058
+ : modalStore.open({
8059
+ component: ConfirmComponent,
8060
+ providers: [{ provide: MODAL_REF, useValue: modalRef }],
8061
+ bindings: [
8062
+ inputBinding('header', () => `install_app_title?appName=${appName}`),
8063
+ inputBinding('body', () => `install_app_body?appName=${appName}`),
8064
+ inputBinding('type', () => 'info'),
8065
+ ],
8066
+ });
8067
+ modalRef.onClose(async (confirmed) => {
8068
+ modalStore.close(id);
8069
+ if (!confirmed) {
8070
+ reject(hardStop ? { type: 'back_to_store' } : new Error('app_install_declined'));
8071
+ return;
8072
+ }
8073
+ try {
8074
+ const body = await firstValueFrom(httpService.post('store', ['request', appId], permissions.length ? { agree: true } : {}));
8075
+ if (body?.relation?.type === 5) {
8076
+ reject({ type: 'install_pending', appName });
8077
+ return;
8078
+ }
8079
+ resolve();
8080
+ }
8081
+ catch (e) {
8082
+ reject(e);
8083
+ }
8084
+ });
8085
+ });
8086
+ };
8087
+ }
8088
+
8089
+ /** Where refusing the hard stop goes — the host's Store. */
8090
+ const STORE_PATH = '/store';
8091
+ /**
8092
+ * The init step every App passes before it renders (store ADR 0006): its apis
8093
+ * refuse without a current Agreement, so the App asks first — Agreement to an
8094
+ * installed App whose Declared Permissions grew, install-with-Agreement for a
8095
+ * visitor. The modal cannot be dismissed; its other button leaves for the
8096
+ * Store. The Relation it reads is kept per AppLink and is what AppContext
8097
+ * reads too, so an App fetches it once.
8098
+ */
8099
+ class AgreementGate {
8100
+ #http = inject(HttpService);
8101
+ #injector = inject(Injector);
8102
+ #views = new Map();
8103
+ #revision = signal(0, ...(ngDevMode ? [{ debugName: "#revision" }] : /* istanbul ignore next */ []));
8104
+ /** Moves whenever a kept Relation is dropped, so a reader can read again. */
8105
+ revision = this.#revision.asReadonly();
8106
+ /** Refusing the hard stop leaves the App for the host's Store. */
8107
+ leaveForStore = () => window.location.assign(STORE_PATH);
8108
+ /** The caller's Relation to `link`, read once until `forget`. */
8109
+ view(link) {
8110
+ let view = this.#views.get(link);
8111
+ if (!view) {
8112
+ view = firstValueFrom(this.#http.get('store', ['app', link, 'relation']));
8113
+ view.catch(() => this.#views.delete(link));
8114
+ this.#views.set(link, view);
8115
+ }
8116
+ return view;
8117
+ }
8118
+ forget(link) {
8119
+ this.#views.delete(link);
8120
+ this.#revision.update((n) => n + 1);
8121
+ }
8122
+ /**
8123
+ * Resolves once the App may open. Never resolves when the user leaves for
8124
+ * the Store. A failed read lets the App open — its apis are the hard stop,
8125
+ * and they refuse on their own.
8126
+ */
8127
+ async ensure(link, name) {
8128
+ let view;
8129
+ try {
8130
+ view = await this.view(link);
7037
8131
  }
7038
- if (typeof this.disabled() !== 'undefined') {
7039
- button['disabled'] = this.disabled();
8132
+ catch {
8133
+ return;
7040
8134
  }
7041
- if (this.variant()) {
7042
- button['variant'] = this.variant();
8135
+ const app = { id: view.app, link, name };
8136
+ try {
8137
+ if (view.needsAgreement) {
8138
+ const agreeToApp = runInInjectionContext(this.#injector, injectAgreeToApp);
8139
+ await agreeToApp(app, view.permissions, true);
8140
+ this.forget(link);
8141
+ }
8142
+ else if (view.type === null && view.permissions.length) {
8143
+ const installApp = runInInjectionContext(this.#injector, injectInstallApp);
8144
+ await installApp(app, view.permissions, true);
8145
+ this.forget(link);
8146
+ }
7043
8147
  }
7044
- // Force primary and clear ghost if the color is 'inverse' or 'inverseText', unless explicitly ghost or secondary
7045
- const finalColor = button.color || this.config()?.color;
7046
- const isExplicitGhost = button.variant === 'ghost' || this.config()?.variant === 'ghost';
7047
- const isExplicitSecondary = button.variant === 'secondary' ||
7048
- this.config()?.variant === 'secondary';
7049
- if ((finalColor === 'inverse' || finalColor === 'inverseText') &&
7050
- !isExplicitGhost &&
7051
- !isExplicitSecondary) {
7052
- button['color'] = 'inverseText';
7053
- button['variant'] = 'primary';
8148
+ catch (refusal) {
8149
+ if (refusal?.type === 'back_to_store') {
8150
+ this.leaveForStore();
8151
+ return new Promise(() => undefined);
8152
+ }
7054
8153
  }
7055
- else if (finalColor === 'inverse') {
7056
- button['color'] = 'inverseText';
8154
+ }
8155
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AgreementGate, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
8156
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AgreementGate, providedIn: 'root' });
8157
+ }
8158
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AgreementGate, decorators: [{
8159
+ type: Injectable,
8160
+ args: [{ providedIn: 'root' }]
8161
+ }] });
8162
+
8163
+ function initMagmoniumApp({ backend, authUrl, socketUrl, }) {
8164
+ return () => {
8165
+ inject(FreezeService); // ensure the loading effect is always active
8166
+ const httpService = inject(HttpService);
8167
+ const translateService = inject(TranslateService);
8168
+ const themeStore = inject(ThemeStore);
8169
+ const loginStore = inject(LOGIN_STORE);
8170
+ const navStore = inject(NavStore, { optional: true });
8171
+ const appLink = inject(APP_LINK);
8172
+ const agreementGate = inject(AgreementGate);
8173
+ translateService.init();
8174
+ SharedStoreRegistry.setThemeStore(themeStore);
8175
+ SharedStoreRegistry.setTranslateService(translateService);
8176
+ SharedStoreRegistry.setLoadingActions(loadingActions);
8177
+ SharedStoreRegistry.setNotificationStore(inject(NotificationStore));
8178
+ if (navStore) {
8179
+ SharedStoreRegistry.setNavStore(navStore);
7057
8180
  }
7058
- if (this.config()?.nav || this.nav()) {
7059
- button['variant'] = this.isMurlActive() ? undefined : 'ghost';
8181
+ if (loginStore) {
8182
+ SharedStoreRegistry.setLoginStore(loginStore);
7060
8183
  }
7061
- return button;
7062
- }, ...(ngDevMode ? [{ debugName: "overrideProperty" }] : /* istanbul ignore next */ []));
7063
- resolveComponentOverrides() {
7064
- return this.overrideProperty();
7065
- }
7066
- onClick() {
7067
- if (this.isFormSubmit()) {
7068
- // Called rather than left to a native `type="submit"`: the `<form>` is
7069
- // only an ancestor while nothing re-projects this Button out of it.
7070
- this.sectionForm?.submit();
8184
+ const effectiveBackend = backend || 'http://localhost:8000';
8185
+ if (!backend) {
8186
+ console.warn('initMagmoniumApp: No backend URL provided, defaulting to http://localhost:8000. ' +
8187
+ 'Check your environment configuration if this is unexpected.');
7071
8188
  }
7072
- this.clicked.emit(this.config());
7073
- }
7074
- formatBadgeCount = (count, max = 99) => formatBadgeCount(count, max);
7075
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
7076
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: ButtonComponent, isStandalone: true, selector: "m-button,m-one-button", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, labelClass: { classPropertyName: "labelClass", publicName: "labelClass", isSignal: true, isRequired: false, transformFunction: null }, fullWidth: { classPropertyName: "fullWidth", publicName: "fullWidth", isSignal: true, isRequired: false, transformFunction: null }, nav: { classPropertyName: "nav", publicName: "nav", isSignal: true, isRequired: false, transformFunction: null }, navParams: { classPropertyName: "navParams", publicName: "navParams", isSignal: true, isRequired: false, transformFunction: null }, href: { classPropertyName: "href", publicName: "href", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, baseUrl: { classPropertyName: "baseUrl", publicName: "baseUrl", isSignal: true, isRequired: false, transformFunction: null }, one: { classPropertyName: "one", publicName: "one", isSignal: true, isRequired: false, transformFunction: null }, remote: { classPropertyName: "remote", publicName: "remote", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, noTranslate: { classPropertyName: "noTranslate", publicName: "noTranslate", isSignal: true, isRequired: false, transformFunction: null }, params: { classPropertyName: "params", publicName: "params", isSignal: true, isRequired: false, transformFunction: null }, noNative: { classPropertyName: "noNative", publicName: "noNative", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, isRightIcon: { classPropertyName: "isRightIcon", publicName: "isRightIcon", isSignal: true, isRequired: false, transformFunction: null }, iconOnly: { classPropertyName: "iconOnly", publicName: "iconOnly", isSignal: true, isRequired: false, transformFunction: null }, stacked: { classPropertyName: "stacked", publicName: "stacked", isSignal: true, isRequired: false, transformFunction: null }, imgSrc: { classPropertyName: "imgSrc", publicName: "imgSrc", isSignal: true, isRequired: false, transformFunction: null }, nonClickable: { classPropertyName: "nonClickable", publicName: "nonClickable", isSignal: true, isRequired: false, transformFunction: null }, inverted: { classPropertyName: "inverted", publicName: "inverted", isSignal: true, isRequired: false, transformFunction: null }, isSubmit: { classPropertyName: "isSubmit", publicName: "isSubmit", isSignal: true, isRequired: false, transformFunction: null }, tabindex: { classPropertyName: "tabindex", publicName: "tabindex", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { config: "configChange", clicked: "clicked" }, viewQueries: [{ propertyName: "button", first: true, predicate: ["button"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "@if (config(); as config) {\n <!-- One branch for every in-app target: `mRef` names a NavId and the store\n reads the NavKind off that node to decide route vs panel (ADR 0014). -->\n @if (config.nav) {\n @if (!noNative()) {\n <button\n type=\"button\"\n class=\"{{ className() }}\"\n [attr.data-testid]=\"config.name + '-btn'\"\n [attr.tabindex]=\"config.tabindex\"\n [disabled]=\"config.disabled\"\n [mRef]=\"config.nav\"\n [mRefParams]=\"config.navParams\"\n [attr.aria-label]=\"config.noTranslate ? config.label : (config.label | translate: config.params)\"\n mRefLinkActive=\"tab\"\n (keydown.enter)=\"onClick()\"\n (click)=\"onClick()\"\n #button\n >\n <ng-container *ngTemplateOutlet=\"buttonContent; context: { button: config }\"></ng-container>\n </button>\n } @else {\n <div\n role=\"button\"\n [attr.tabindex]=\"config.tabindex ?? 0\"\n class=\"non-native {{ className() }}\"\n [attr.data-testid]=\"config.name + '-btn'\"\n [attr.aria-label]=\"config.noTranslate ? config.label : (config.label | translate: config.params)\"\n [attr.aria-disabled]=\"config.disabled ? 'true' : 'false'\"\n (keydown.enter)=\"onClick()\"\n (click)=\"onClick()\"\n #button\n >\n <ng-container *ngTemplateOutlet=\"buttonContent; context: { button: config }\"></ng-container>\n </div>\n }\n } @else if (config.href) {\n <a\n class=\"{{ className() }}\"\n [attr.data-testid]=\"config.name + '-btn'\"\n [attr.tabindex]=\"config.tabindex\"\n [href]=\"config.href\"\n [attr.aria-label]=\"config.noTranslate ? config.label : (config.label | translate: config.params)\"\n (click)=\"onClick()\"\n #button\n >\n <ng-container *ngTemplateOutlet=\"buttonContent; context: { button: config }\"></ng-container>\n </a>\n } @else {\n @if (!noNative()) {\n <button\n type=\"button\"\n class=\"{{ className() }}\"\n [attr.data-testid]=\"config.name + '-btn'\"\n [attr.tabindex]=\"config.tabindex\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"config.noTranslate ? config.label : (config.label | translate: config.params)\"\n (keydown.enter)=\"onClick()\"\n (click)=\"onClick()\"\n #button\n >\n <ng-container *ngTemplateOutlet=\"buttonContent; context: { button: config }\"></ng-container>\n </button>\n } @else {\n <div\n role=\"button\"\n [attr.tabindex]=\"config.tabindex ?? 0\"\n class=\"non-native {{ className() }}\"\n [attr.data-testid]=\"config.name + '-btn'\"\n [attr.aria-label]=\"config.noTranslate ? config.label : (config.label | translate: config.params)\"\n [attr.aria-disabled]=\"isDisabled() ? 'true' : 'false'\"\n (keydown.enter)=\"onClick()\"\n (click)=\"onClick()\"\n #button\n >\n <ng-container *ngTemplateOutlet=\"buttonContent; context: { button: config }\"></ng-container>\n </div>\n }\n }\n}\n\n<ng-template #buttonContent let-button=\"button\">\n @if (button.imgSrc) {\n <div class=\"button-icon button-icon--img\">\n <m-img [src]=\"button.imgSrc\" [remote]=\"button.remote\" [alt]=\"button.label || button.name || ''\" />\n @if (button.badge && button.badge.count) {\n <m-badge\n [config]=\"{ variant: button.badge.variant ?? 'danger', position: 'absolute' }\"\n >{{ formatBadgeCount(button.badge.count) }}</m-badge\n >\n }\n </div>\n } @else if (buttonIcon(); as icon) {\n <div class=\"button-icon\">\n @if (isFromOne()) {\n <m-one-icon [config]=\"icon\" />\n } @else {\n <m-icon [config]=\"icon\" />\n }\n @if (button.badge && button.badge.count) {\n <m-badge\n [config]=\"{ variant: button.badge.variant ?? 'danger', position: 'absolute' }\"\n >{{ formatBadgeCount(button.badge.count) }}</m-badge\n >\n }\n </div>\n }\n @if (button.label && !button.iconOnly) {\n <span class=\"button-label {{ button.labelClass || '' }}\">\n {{ button.noTranslate ? button.label : (button.label | translate: button.params) }}\n </span>\n }\n @if (!buttonIcon() && button.badge && button.badge.count) {\n <m-badge [config]=\"{ variant: button.badge.variant ?? 'danger', position: 'static' }\">{{\n formatBadgeCount(button.badge.count)\n }}</m-badge>\n }\n</ng-template>\n", styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}:host{display:inline-flex;align-items:center;justify-content:center;vertical-align:middle;box-sizing:border-box;overflow:hidden;transition:box-shadow .15s ease;--m-btn-size: var(--m-button-size, 1em);--m-btn-color: var(--m-button-color, var(--m-one-button-color, var(--m-mm)));--m-btn-color-contrast: var(--m-button-color-contrast, var(--m-one-button-color-contrast, #ffffff));--m-btn-color-opposite: var(--m-button-color-opposite, var(--m-one-button-color-opposite, #e1b941));--m-btn-h: calc(var(--m-btn-size) * 2.25);width:var(--m-button-width, var(--m-one-button-width, auto));min-width:0;height:var(--m-btn-h);font-size:var(--m-btn-size)}:host-context(.inverse),:host-context(.tabs-inverse),:host.inverse{--m-btn-color: var(--m-button-color, var(--m-one-button-color, var(--m-inverse-text)))}:host:has(.full-width){display:flex;width:100%}:host:has(.full-width) button .button-label{white-space:normal;overflow:visible;text-overflow:clip;word-break:break-word}:host:has(.only-icon),:host:has(.toggle){width:var(--m-btn-h);min-width:var(--m-btn-h)}:host:has(.has-badge){overflow:visible}:host:has(.stacked),:host:has(.toggle){height:auto}button:not(.get):not(.toggle){height:calc(var(--input-size, var(--m-btn-size)) * 2);min-height:calc(var(--input-size, var(--m-btn-size)) * 2);border-width:max(1px,var(--input-size, var(--m-btn-size)) * .0625);border-radius:calc(var(--input-size, var(--m-btn-size)) * .4);padding:calc(var(--input-size, var(--m-btn-size)) * .5) calc(var(--input-size, var(--m-btn-size)) * .5);gap:calc(var(--input-size, var(--m-btn-size)) * .375);font-size:var(--input-size, var(--m-btn-size));border-color:var(--m-btn-color);transition:border-color .2s ease,box-shadow .2s ease,background-color .2s ease,opacity .2s ease}button:not(.get):not(.toggle):hover:not(:disabled){background-color:color-mix(in srgb,var(--m-btn-color) 6%,transparent)}button:not(.get):not(.toggle):disabled{opacity:.6;cursor:not-allowed}button:not(.get):not(.toggle){height:auto;padding:calc(var(--m-btn-size) * .625) calc(var(--m-btn-size) * 1.25);gap:calc(var(--m-btn-size) * .375);border-style:solid;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;font-family:inherit;cursor:pointer;appearance:none;width:100%;height:100%;min-height:0;padding:0 calc(var(--m-btn-size) * 1.25);border-width:var(--m-button-border-width, 1px);border-radius:var(--m-button-radius, calc(var(--m-btn-size) * .5));color:var(--m-btn-color);font-weight:300;line-height:1;-webkit-user-select:none;user-select:none;position:relative;outline:none;box-shadow:var(--m-button-shadow, var(--m-one-button-shadow, none));transition:filter .15s ease,background .15s ease}button:not(.get):not(.toggle):hover:not(:disabled){filter:brightness(1.04)}button:not(.get):not(.toggle):focus-visible:not(:disabled){outline:2px solid color-mix(in srgb,var(--m-focus) 45%,transparent);outline-offset:-2px}button:not(.get):not(.toggle):active:not(:disabled){transform:scale(.97)}button:not(.get):not(.toggle):disabled{opacity:.35;cursor:not-allowed;pointer-events:none;filter:grayscale(80%)}button:not(.get):not(.toggle).read-only{pointer-events:none!important;cursor:default!important;transform:none!important;box-shadow:none!important;background:transparent!important;border-color:transparent!important;opacity:1!important}button:not(.get):not(.toggle).read-only .button-icon{transform:none!important;color:inherit!important}button:not(.get):not(.toggle).primary{background:var(--m-btn-color);border-color:var(--m-btn-color);color:var(--m-btn-color-contrast)}button:not(.get):not(.toggle).primary:hover:not(:disabled){filter:none;background:color-mix(in srgb,var(--m-btn-color) 88%,black);border-color:color-mix(in srgb,var(--m-btn-color) 88%,black)}button:not(.get):not(.toggle).primary:active:not(:disabled){filter:brightness(.94);transform:scale(.97)}button:not(.get):not(.toggle).ghost:not(.primary):not(.tab){background:transparent;border-color:transparent;color:var(--m-btn-color);box-shadow:none}button:not(.get):not(.toggle).ghost:not(.primary):not(.tab):hover:not(:disabled){filter:none;background:color-mix(in srgb,var(--m-btn-color) 8%,transparent)}button:not(.get):not(.toggle).ghost:not(.primary):not(.tab):active:not(:disabled){background:color-mix(in srgb,var(--m-btn-color) 14%,transparent);transform:scale(.97)}button:not(.get):not(.toggle).ghost:not(.primary):not(.tab).secondary{border:var(--m-button-border-width, 1px) solid color-mix(in srgb,var(--m-btn-color) 15%,transparent)}button:not(.get):not(.toggle).ghost:not(.primary):not(.tab).secondary:hover:not(:disabled){filter:none;border-color:color-mix(in srgb,var(--m-btn-color) 40%,transparent);background:color-mix(in srgb,var(--m-btn-color) 6%,transparent)}button:not(.get):not(.toggle).ghost:not(.primary):not(.tab).secondary:active:not(:disabled){border-color:color-mix(in srgb,var(--m-btn-color) 50%,transparent);background:color-mix(in srgb,var(--m-btn-color) 12%,transparent)}button:not(.get):not(.toggle).secondary:not(.primary):not(.ghost){background:transparent;border-color:var(--m-btn-color);color:var(--m-btn-color)}button:not(.get):not(.toggle).secondary:not(.primary):not(.ghost):hover:not(:disabled){filter:none;background:color-mix(in srgb,var(--m-btn-color) 8%,transparent)}button:not(.get):not(.toggle).secondary:not(.primary):not(.ghost):active:not(:disabled){background:color-mix(in srgb,var(--m-btn-color) 14%,transparent);transform:scale(.97)}button:not(.get):not(.toggle).tab{background:var(--m-backdrop-border);border-color:var(--m-backdrop-border);color:var(--m-btn-color)}button:not(.get):not(.toggle).tab:hover:not(:disabled){background:color-mix(in srgb,var(--m-backdrop-border) 82%,black);border-color:color-mix(in srgb,var(--m-backdrop-border) 82%,black);filter:none}button:not(.get):not(.toggle).tab:active:not(:disabled){background:color-mix(in srgb,var(--m-backdrop-border) 70%,black);border-color:color-mix(in srgb,var(--m-backdrop-border) 70%,black);transform:scale(.97)}button:not(.get):not(.toggle).segmented .button-icon,button:not(.get):not(.toggle).badge-accent .button-icon,button:not(.get):not(.toggle).with-right-icon .button-icon{display:inline-flex;align-items:center;justify-content:center;color:var(--m-btn-color-opposite);order:1}button:not(.get):not(.toggle).segmented .button-label,button:not(.get):not(.toggle).badge-accent .button-label,button:not(.get):not(.toggle).with-right-icon .button-label{order:-1}button:not(.get):not(.toggle).segmented.primary .button-icon,button:not(.get):not(.toggle).badge-accent.primary .button-icon,button:not(.get):not(.toggle).with-right-icon.primary .button-icon{color:var(--m-btn-color-opposite)}button:not(.get):not(.toggle).with-left-icon .button-icon{order:-1}button:not(.get):not(.toggle).with-left-icon .button-label{order:1}button:not(.get):not(.toggle).stacked{flex-direction:column;gap:calc(var(--m-btn-size) * .3);height:auto;min-height:var(--m-btn-h);padding:calc(var(--m-btn-size) * .625) calc(var(--m-btn-size) * .875)}button:not(.get):not(.toggle).stacked .button-label{font-size:calc(var(--m-btn-size) * .8)}button:not(.get):not(.toggle).only-icon{padding:0;border-width:var(--m-button-border-width, 1px);aspect-ratio:1;display:inline-flex;align-items:center;justify-content:center}button:not(.get):not(.toggle).only-icon m-icon,button:not(.get):not(.toggle).only-icon m-one-icon{display:inline-flex}m-badge{--m-badge-height: 1.5em;--m-badge-min-width: 1.5em;--m-badge-padding: 0 .3em;--m-badge-gap: .1em}.button-label{display:inline-flex;align-items:center;line-height:normal;font-size:inherit;min-width:0;max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.button-icon{position:relative;display:inline-flex;align-items:center;justify-content:center}.button-icon--img{width:calc(var(--m-btn-size) * 1.75);height:calc(var(--m-btn-size) * 1.75);overflow:hidden}.button-icon--img m-img{width:100%;height:100%;display:block}.get{appearance:none;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;height:var(--m-btn-h);padding:0 min(var(--m-btn-size) * 1.75,2rem);border-radius:4px;background:linear-gradient(135deg,var(--m-mm),var(--m-focus),var(--m-success),var(--m-mm));background-size:200% auto;color:#fff;font-size:calc(var(--m-btn-size) * .8);font-weight:300;letter-spacing:.06em;text-transform:uppercase;border:none;cursor:pointer;white-space:nowrap;line-height:1;transition:background-position .2s ease,transform .15s ease}.get:hover{background-position:right center}.get:focus-visible{outline:2px solid color-mix(in srgb,var(--m-focus) 45%,transparent);outline-offset:-2px}.get:active{transform:scale(.97)}.toggle{appearance:none;display:inline-flex;align-items:center;justify-content:center;width:100%;height:100%;border:none;background:transparent;padding:0 min(var(--m-btn-size),1.25rem);border-radius:var(--m-button-radius, calc(var(--m-btn-size) * .375));box-shadow:none;color:var(--m-btn-color, var(--m-text-secondary));opacity:.65;font-family:inherit;font-size:var(--m-btn-size);font-weight:300;cursor:pointer;box-sizing:border-box;-webkit-user-select:none;user-select:none;transition:background .15s ease,color .15s ease,opacity .15s ease;min-width:0}.toggle .button-icon{flex-shrink:0}.toggle .button-label{display:inline-block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;min-width:0}.toggle:hover:not(:disabled){background:var(--m-button-hover-background, color-mix(in srgb, var(--m-focus) 8%, transparent));color:var(--m-button-hover-color, var(--m-text));opacity:1}.toggle:focus-visible:not(:disabled){outline:2px solid color-mix(in srgb,var(--m-focus) 45%,transparent);outline-offset:-2px;opacity:1}.toggle.primary{background:var(--m-button-active-background, var(--m-mm));color:var(--m-button-active-color, #ffffff);opacity:1}.toggle.primary:hover:not(:disabled){background:var(--m-button-active-background, var(--m-mm));color:var(--m-button-active-color, #ffffff);opacity:1}.toggle.primary:active:not(:disabled){transform:scale(.97)}.non-native:not(.get):not(.toggle){appearance:none;display:inline-flex;align-items:center;justify-content:center;width:100%;height:100%;min-height:0;padding:0 calc(var(--m-btn-size) * 1.25);border-width:2px;border-radius:4px;color:var(--m-btn-color);font-weight:300;line-height:1;-webkit-user-select:none;user-select:none;position:relative;outline:none;box-shadow:var(--m-button-shadow, var(--m-one-button-shadow, none));transition:filter .15s ease,background .15s ease}.non-native:not(.get):not(.toggle):hover:not([aria-disabled=true]){filter:brightness(1.04)}.non-native:not(.get):not(.toggle):focus-visible:not([aria-disabled=true]){outline:2px solid color-mix(in srgb,var(--m-focus) 45%,transparent);outline-offset:-2px}.non-native:not(.get):not(.toggle):active:not([aria-disabled=true]){transform:scale(.97)}.non-native:not(.get):not(.toggle)[aria-disabled=true]{opacity:.35;cursor:not-allowed;pointer-events:none;filter:grayscale(80%)}.non-native:not(.get):not(.toggle).primary{background:var(--m-btn-color);border-color:var(--m-btn-color);color:var(--m-btn-color-contrast)}.non-native:not(.get):not(.toggle).primary:hover:not([aria-disabled=true]){filter:none;background:color-mix(in srgb,var(--m-btn-color) 88%,black);border-color:color-mix(in srgb,var(--m-btn-color) 88%,black)}.non-native:not(.get):not(.toggle).primary:active:not([aria-disabled=true]){filter:brightness(.94);transform:scale(.97)}.non-native:not(.get):not(.toggle).ghost:not(.primary):not(.tab){background:transparent;border-color:transparent;color:var(--m-btn-color);box-shadow:none}.non-native:not(.get):not(.toggle).ghost:not(.primary):not(.tab):hover:not([aria-disabled=true]){filter:none;background:color-mix(in srgb,var(--m-btn-color) 8%,transparent)}.non-native:not(.get):not(.toggle).ghost:not(.primary):not(.tab):active:not([aria-disabled=true]){background:color-mix(in srgb,var(--m-btn-color) 14%,transparent);transform:scale(.97)}.non-native:not(.get):not(.toggle):disabled{opacity:.3;cursor:not-allowed}@container togglegroup (max-width: 320px){.non-native:not(.get):not(.toggle).with-left-icon .button-label,.non-native:not(.get):not(.toggle).with-right-icon .button-label{display:none!important}}@media(max-width:600px){.non-native:not(.get):not(.toggle).with-left-icon .button-label,.non-native:not(.get):not(.toggle).with-right-icon .button-label{display:none!important}}\n"], dependencies: [{ kind: "component", type: i0.forwardRef(() => IconComponent), selector: "m-icon, m-one-icon", inputs: ["config", "name", "color", "size", "one", "baseUrl", "remote"], outputs: ["configChange"] }, { kind: "component", type: i0.forwardRef(() => BadgeComponent), selector: "m-badge", inputs: ["config"], outputs: ["configChange"] }, { kind: "ngmodule", type: i0.forwardRef(() => RouterModule) }, { kind: "directive", type: i0.forwardRef(() => MRefDirective), selector: "[mRef]", inputs: ["mRef", "mRefLinkActive", "mRefToggle", "mRefParams"] }, { kind: "directive", type: i0.forwardRef(() => NgTemplateOutlet), selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i0.forwardRef(() => ImgComponent), selector: "m-img", inputs: ["src", "data", "dataType", "alt", "priority", "fill", "width", "height", "remote", "ngSrcset", "sizes"] }, { kind: "pipe", type: i0.forwardRef(() => TranslatePipe), name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
8189
+ // Auth URL defaults to Backend URL so single-host apps stay unchanged (ADR 0012).
8190
+ const effectiveAuth = authUrl || effectiveBackend;
8191
+ httpService.setUrl(effectiveBackend);
8192
+ httpService.setAuthUrl(effectiveAuth);
8193
+ themeStore.init();
8194
+ if (socketUrl) {
8195
+ const socketStore = inject(SocketStore);
8196
+ let lastToken;
8197
+ effect(() => {
8198
+ const tokens = loginStore?.tokens();
8199
+ const currentToken = tokens?.auth;
8200
+ if (!currentToken) {
8201
+ socketStore.disconnect();
8202
+ lastToken = undefined;
8203
+ return;
8204
+ }
8205
+ // If we already connected with this exact token, skip
8206
+ if (lastToken === currentToken)
8207
+ return;
8208
+ // If another instance (e.g. host app) has already established a socket,
8209
+ // and we are a new instance (e.g. WC) that hasn't connected yet, skip.
8210
+ if (SharedStoreRegistry.isHostSocketActive() &&
8211
+ lastToken === undefined) {
8212
+ return;
8213
+ }
8214
+ // Connect (or reconnect if lastToken was different)
8215
+ socketStore.connect(`${socketUrl}?token=${currentToken}`);
8216
+ SharedStoreRegistry.setSocketUrl(socketUrl);
8217
+ lastToken = currentToken;
8218
+ });
8219
+ }
8220
+ if (!loginStore)
8221
+ return EMPTY;
8222
+ // Load saved login IDs before init so the modal shows them if it opens
8223
+ if (!loginStore.tokens()) {
8224
+ loginStore.loadSavedLoginIds();
8225
+ }
8226
+ // Always call init — interceptor handles no-token case via authenticate()
8227
+ return httpService
8228
+ .put('auth', ['init'])
8229
+ .pipe(tap(({ navs, tokens, user }) => {
8230
+ loginStore.initApp({ navs, tokens, user });
8231
+ }), catchError(() => {
8232
+ loginStore.loadSavedLoginIds();
8233
+ return EMPTY;
8234
+ }),
8235
+ // The App's apis refuse without a current Agreement (store ADR 0006),
8236
+ // so init asks for it before the App renders.
8237
+ switchMap$1(() => {
8238
+ const link = appLink();
8239
+ return link ? from(agreementGate.ensure(link)) : of(undefined);
8240
+ }));
8241
+ };
7077
8242
  }
7078
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ButtonComponent, decorators: [{
7079
- type: Component,
7080
- args: [{ selector: 'm-button,m-one-button', imports: [
7081
- forwardRef(() => TranslatePipe),
7082
- forwardRef(() => IconComponent),
7083
- forwardRef(() => BadgeComponent),
7084
- RouterModule,
7085
- MRefDirective,
7086
- forwardRef(() => NgTemplateOutlet),
7087
- forwardRef(() => ImgComponent),
7088
- ], encapsulation: ViewEncapsulation.Emulated, changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (config(); as config) {\n <!-- One branch for every in-app target: `mRef` names a NavId and the store\n reads the NavKind off that node to decide route vs panel (ADR 0014). -->\n @if (config.nav) {\n @if (!noNative()) {\n <button\n type=\"button\"\n class=\"{{ className() }}\"\n [attr.data-testid]=\"config.name + '-btn'\"\n [attr.tabindex]=\"config.tabindex\"\n [disabled]=\"config.disabled\"\n [mRef]=\"config.nav\"\n [mRefParams]=\"config.navParams\"\n [attr.aria-label]=\"config.noTranslate ? config.label : (config.label | translate: config.params)\"\n mRefLinkActive=\"tab\"\n (keydown.enter)=\"onClick()\"\n (click)=\"onClick()\"\n #button\n >\n <ng-container *ngTemplateOutlet=\"buttonContent; context: { button: config }\"></ng-container>\n </button>\n } @else {\n <div\n role=\"button\"\n [attr.tabindex]=\"config.tabindex ?? 0\"\n class=\"non-native {{ className() }}\"\n [attr.data-testid]=\"config.name + '-btn'\"\n [attr.aria-label]=\"config.noTranslate ? config.label : (config.label | translate: config.params)\"\n [attr.aria-disabled]=\"config.disabled ? 'true' : 'false'\"\n (keydown.enter)=\"onClick()\"\n (click)=\"onClick()\"\n #button\n >\n <ng-container *ngTemplateOutlet=\"buttonContent; context: { button: config }\"></ng-container>\n </div>\n }\n } @else if (config.href) {\n <a\n class=\"{{ className() }}\"\n [attr.data-testid]=\"config.name + '-btn'\"\n [attr.tabindex]=\"config.tabindex\"\n [href]=\"config.href\"\n [attr.aria-label]=\"config.noTranslate ? config.label : (config.label | translate: config.params)\"\n (click)=\"onClick()\"\n #button\n >\n <ng-container *ngTemplateOutlet=\"buttonContent; context: { button: config }\"></ng-container>\n </a>\n } @else {\n @if (!noNative()) {\n <button\n type=\"button\"\n class=\"{{ className() }}\"\n [attr.data-testid]=\"config.name + '-btn'\"\n [attr.tabindex]=\"config.tabindex\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"config.noTranslate ? config.label : (config.label | translate: config.params)\"\n (keydown.enter)=\"onClick()\"\n (click)=\"onClick()\"\n #button\n >\n <ng-container *ngTemplateOutlet=\"buttonContent; context: { button: config }\"></ng-container>\n </button>\n } @else {\n <div\n role=\"button\"\n [attr.tabindex]=\"config.tabindex ?? 0\"\n class=\"non-native {{ className() }}\"\n [attr.data-testid]=\"config.name + '-btn'\"\n [attr.aria-label]=\"config.noTranslate ? config.label : (config.label | translate: config.params)\"\n [attr.aria-disabled]=\"isDisabled() ? 'true' : 'false'\"\n (keydown.enter)=\"onClick()\"\n (click)=\"onClick()\"\n #button\n >\n <ng-container *ngTemplateOutlet=\"buttonContent; context: { button: config }\"></ng-container>\n </div>\n }\n }\n}\n\n<ng-template #buttonContent let-button=\"button\">\n @if (button.imgSrc) {\n <div class=\"button-icon button-icon--img\">\n <m-img [src]=\"button.imgSrc\" [remote]=\"button.remote\" [alt]=\"button.label || button.name || ''\" />\n @if (button.badge && button.badge.count) {\n <m-badge\n [config]=\"{ variant: button.badge.variant ?? 'danger', position: 'absolute' }\"\n >{{ formatBadgeCount(button.badge.count) }}</m-badge\n >\n }\n </div>\n } @else if (buttonIcon(); as icon) {\n <div class=\"button-icon\">\n @if (isFromOne()) {\n <m-one-icon [config]=\"icon\" />\n } @else {\n <m-icon [config]=\"icon\" />\n }\n @if (button.badge && button.badge.count) {\n <m-badge\n [config]=\"{ variant: button.badge.variant ?? 'danger', position: 'absolute' }\"\n >{{ formatBadgeCount(button.badge.count) }}</m-badge\n >\n }\n </div>\n }\n @if (button.label && !button.iconOnly) {\n <span class=\"button-label {{ button.labelClass || '' }}\">\n {{ button.noTranslate ? button.label : (button.label | translate: button.params) }}\n </span>\n }\n @if (!buttonIcon() && button.badge && button.badge.count) {\n <m-badge [config]=\"{ variant: button.badge.variant ?? 'danger', position: 'static' }\">{{\n formatBadgeCount(button.badge.count)\n }}</m-badge>\n }\n</ng-template>\n", styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}:host{display:inline-flex;align-items:center;justify-content:center;vertical-align:middle;box-sizing:border-box;overflow:hidden;transition:box-shadow .15s ease;--m-btn-size: var(--m-button-size, 1em);--m-btn-color: var(--m-button-color, var(--m-one-button-color, var(--m-mm)));--m-btn-color-contrast: var(--m-button-color-contrast, var(--m-one-button-color-contrast, #ffffff));--m-btn-color-opposite: var(--m-button-color-opposite, var(--m-one-button-color-opposite, #e1b941));--m-btn-h: calc(var(--m-btn-size) * 2.25);width:var(--m-button-width, var(--m-one-button-width, auto));min-width:0;height:var(--m-btn-h);font-size:var(--m-btn-size)}:host-context(.inverse),:host-context(.tabs-inverse),:host.inverse{--m-btn-color: var(--m-button-color, var(--m-one-button-color, var(--m-inverse-text)))}:host:has(.full-width){display:flex;width:100%}:host:has(.full-width) button .button-label{white-space:normal;overflow:visible;text-overflow:clip;word-break:break-word}:host:has(.only-icon),:host:has(.toggle){width:var(--m-btn-h);min-width:var(--m-btn-h)}:host:has(.has-badge){overflow:visible}:host:has(.stacked),:host:has(.toggle){height:auto}button:not(.get):not(.toggle){height:calc(var(--input-size, var(--m-btn-size)) * 2);min-height:calc(var(--input-size, var(--m-btn-size)) * 2);border-width:max(1px,var(--input-size, var(--m-btn-size)) * .0625);border-radius:calc(var(--input-size, var(--m-btn-size)) * .4);padding:calc(var(--input-size, var(--m-btn-size)) * .5) calc(var(--input-size, var(--m-btn-size)) * .5);gap:calc(var(--input-size, var(--m-btn-size)) * .375);font-size:var(--input-size, var(--m-btn-size));border-color:var(--m-btn-color);transition:border-color .2s ease,box-shadow .2s ease,background-color .2s ease,opacity .2s ease}button:not(.get):not(.toggle):hover:not(:disabled){background-color:color-mix(in srgb,var(--m-btn-color) 6%,transparent)}button:not(.get):not(.toggle):disabled{opacity:.6;cursor:not-allowed}button:not(.get):not(.toggle){height:auto;padding:calc(var(--m-btn-size) * .625) calc(var(--m-btn-size) * 1.25);gap:calc(var(--m-btn-size) * .375);border-style:solid;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;font-family:inherit;cursor:pointer;appearance:none;width:100%;height:100%;min-height:0;padding:0 calc(var(--m-btn-size) * 1.25);border-width:var(--m-button-border-width, 1px);border-radius:var(--m-button-radius, calc(var(--m-btn-size) * .5));color:var(--m-btn-color);font-weight:300;line-height:1;-webkit-user-select:none;user-select:none;position:relative;outline:none;box-shadow:var(--m-button-shadow, var(--m-one-button-shadow, none));transition:filter .15s ease,background .15s ease}button:not(.get):not(.toggle):hover:not(:disabled){filter:brightness(1.04)}button:not(.get):not(.toggle):focus-visible:not(:disabled){outline:2px solid color-mix(in srgb,var(--m-focus) 45%,transparent);outline-offset:-2px}button:not(.get):not(.toggle):active:not(:disabled){transform:scale(.97)}button:not(.get):not(.toggle):disabled{opacity:.35;cursor:not-allowed;pointer-events:none;filter:grayscale(80%)}button:not(.get):not(.toggle).read-only{pointer-events:none!important;cursor:default!important;transform:none!important;box-shadow:none!important;background:transparent!important;border-color:transparent!important;opacity:1!important}button:not(.get):not(.toggle).read-only .button-icon{transform:none!important;color:inherit!important}button:not(.get):not(.toggle).primary{background:var(--m-btn-color);border-color:var(--m-btn-color);color:var(--m-btn-color-contrast)}button:not(.get):not(.toggle).primary:hover:not(:disabled){filter:none;background:color-mix(in srgb,var(--m-btn-color) 88%,black);border-color:color-mix(in srgb,var(--m-btn-color) 88%,black)}button:not(.get):not(.toggle).primary:active:not(:disabled){filter:brightness(.94);transform:scale(.97)}button:not(.get):not(.toggle).ghost:not(.primary):not(.tab){background:transparent;border-color:transparent;color:var(--m-btn-color);box-shadow:none}button:not(.get):not(.toggle).ghost:not(.primary):not(.tab):hover:not(:disabled){filter:none;background:color-mix(in srgb,var(--m-btn-color) 8%,transparent)}button:not(.get):not(.toggle).ghost:not(.primary):not(.tab):active:not(:disabled){background:color-mix(in srgb,var(--m-btn-color) 14%,transparent);transform:scale(.97)}button:not(.get):not(.toggle).ghost:not(.primary):not(.tab).secondary{border:var(--m-button-border-width, 1px) solid color-mix(in srgb,var(--m-btn-color) 15%,transparent)}button:not(.get):not(.toggle).ghost:not(.primary):not(.tab).secondary:hover:not(:disabled){filter:none;border-color:color-mix(in srgb,var(--m-btn-color) 40%,transparent);background:color-mix(in srgb,var(--m-btn-color) 6%,transparent)}button:not(.get):not(.toggle).ghost:not(.primary):not(.tab).secondary:active:not(:disabled){border-color:color-mix(in srgb,var(--m-btn-color) 50%,transparent);background:color-mix(in srgb,var(--m-btn-color) 12%,transparent)}button:not(.get):not(.toggle).secondary:not(.primary):not(.ghost){background:transparent;border-color:var(--m-btn-color);color:var(--m-btn-color)}button:not(.get):not(.toggle).secondary:not(.primary):not(.ghost):hover:not(:disabled){filter:none;background:color-mix(in srgb,var(--m-btn-color) 8%,transparent)}button:not(.get):not(.toggle).secondary:not(.primary):not(.ghost):active:not(:disabled){background:color-mix(in srgb,var(--m-btn-color) 14%,transparent);transform:scale(.97)}button:not(.get):not(.toggle).tab{background:var(--m-backdrop-border);border-color:var(--m-backdrop-border);color:var(--m-btn-color)}button:not(.get):not(.toggle).tab:hover:not(:disabled){background:color-mix(in srgb,var(--m-backdrop-border) 82%,black);border-color:color-mix(in srgb,var(--m-backdrop-border) 82%,black);filter:none}button:not(.get):not(.toggle).tab:active:not(:disabled){background:color-mix(in srgb,var(--m-backdrop-border) 70%,black);border-color:color-mix(in srgb,var(--m-backdrop-border) 70%,black);transform:scale(.97)}button:not(.get):not(.toggle).segmented .button-icon,button:not(.get):not(.toggle).badge-accent .button-icon,button:not(.get):not(.toggle).with-right-icon .button-icon{display:inline-flex;align-items:center;justify-content:center;color:var(--m-btn-color-opposite);order:1}button:not(.get):not(.toggle).segmented .button-label,button:not(.get):not(.toggle).badge-accent .button-label,button:not(.get):not(.toggle).with-right-icon .button-label{order:-1}button:not(.get):not(.toggle).segmented.primary .button-icon,button:not(.get):not(.toggle).badge-accent.primary .button-icon,button:not(.get):not(.toggle).with-right-icon.primary .button-icon{color:var(--m-btn-color-opposite)}button:not(.get):not(.toggle).with-left-icon .button-icon{order:-1}button:not(.get):not(.toggle).with-left-icon .button-label{order:1}button:not(.get):not(.toggle).stacked{flex-direction:column;gap:calc(var(--m-btn-size) * .3);height:auto;min-height:var(--m-btn-h);padding:calc(var(--m-btn-size) * .625) calc(var(--m-btn-size) * .875)}button:not(.get):not(.toggle).stacked .button-label{font-size:calc(var(--m-btn-size) * .8)}button:not(.get):not(.toggle).only-icon{padding:0;border-width:var(--m-button-border-width, 1px);aspect-ratio:1;display:inline-flex;align-items:center;justify-content:center}button:not(.get):not(.toggle).only-icon m-icon,button:not(.get):not(.toggle).only-icon m-one-icon{display:inline-flex}m-badge{--m-badge-height: 1.5em;--m-badge-min-width: 1.5em;--m-badge-padding: 0 .3em;--m-badge-gap: .1em}.button-label{display:inline-flex;align-items:center;line-height:normal;font-size:inherit;min-width:0;max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.button-icon{position:relative;display:inline-flex;align-items:center;justify-content:center}.button-icon--img{width:calc(var(--m-btn-size) * 1.75);height:calc(var(--m-btn-size) * 1.75);overflow:hidden}.button-icon--img m-img{width:100%;height:100%;display:block}.get{appearance:none;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;height:var(--m-btn-h);padding:0 min(var(--m-btn-size) * 1.75,2rem);border-radius:4px;background:linear-gradient(135deg,var(--m-mm),var(--m-focus),var(--m-success),var(--m-mm));background-size:200% auto;color:#fff;font-size:calc(var(--m-btn-size) * .8);font-weight:300;letter-spacing:.06em;text-transform:uppercase;border:none;cursor:pointer;white-space:nowrap;line-height:1;transition:background-position .2s ease,transform .15s ease}.get:hover{background-position:right center}.get:focus-visible{outline:2px solid color-mix(in srgb,var(--m-focus) 45%,transparent);outline-offset:-2px}.get:active{transform:scale(.97)}.toggle{appearance:none;display:inline-flex;align-items:center;justify-content:center;width:100%;height:100%;border:none;background:transparent;padding:0 min(var(--m-btn-size),1.25rem);border-radius:var(--m-button-radius, calc(var(--m-btn-size) * .375));box-shadow:none;color:var(--m-btn-color, var(--m-text-secondary));opacity:.65;font-family:inherit;font-size:var(--m-btn-size);font-weight:300;cursor:pointer;box-sizing:border-box;-webkit-user-select:none;user-select:none;transition:background .15s ease,color .15s ease,opacity .15s ease;min-width:0}.toggle .button-icon{flex-shrink:0}.toggle .button-label{display:inline-block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;min-width:0}.toggle:hover:not(:disabled){background:var(--m-button-hover-background, color-mix(in srgb, var(--m-focus) 8%, transparent));color:var(--m-button-hover-color, var(--m-text));opacity:1}.toggle:focus-visible:not(:disabled){outline:2px solid color-mix(in srgb,var(--m-focus) 45%,transparent);outline-offset:-2px;opacity:1}.toggle.primary{background:var(--m-button-active-background, var(--m-mm));color:var(--m-button-active-color, #ffffff);opacity:1}.toggle.primary:hover:not(:disabled){background:var(--m-button-active-background, var(--m-mm));color:var(--m-button-active-color, #ffffff);opacity:1}.toggle.primary:active:not(:disabled){transform:scale(.97)}.non-native:not(.get):not(.toggle){appearance:none;display:inline-flex;align-items:center;justify-content:center;width:100%;height:100%;min-height:0;padding:0 calc(var(--m-btn-size) * 1.25);border-width:2px;border-radius:4px;color:var(--m-btn-color);font-weight:300;line-height:1;-webkit-user-select:none;user-select:none;position:relative;outline:none;box-shadow:var(--m-button-shadow, var(--m-one-button-shadow, none));transition:filter .15s ease,background .15s ease}.non-native:not(.get):not(.toggle):hover:not([aria-disabled=true]){filter:brightness(1.04)}.non-native:not(.get):not(.toggle):focus-visible:not([aria-disabled=true]){outline:2px solid color-mix(in srgb,var(--m-focus) 45%,transparent);outline-offset:-2px}.non-native:not(.get):not(.toggle):active:not([aria-disabled=true]){transform:scale(.97)}.non-native:not(.get):not(.toggle)[aria-disabled=true]{opacity:.35;cursor:not-allowed;pointer-events:none;filter:grayscale(80%)}.non-native:not(.get):not(.toggle).primary{background:var(--m-btn-color);border-color:var(--m-btn-color);color:var(--m-btn-color-contrast)}.non-native:not(.get):not(.toggle).primary:hover:not([aria-disabled=true]){filter:none;background:color-mix(in srgb,var(--m-btn-color) 88%,black);border-color:color-mix(in srgb,var(--m-btn-color) 88%,black)}.non-native:not(.get):not(.toggle).primary:active:not([aria-disabled=true]){filter:brightness(.94);transform:scale(.97)}.non-native:not(.get):not(.toggle).ghost:not(.primary):not(.tab){background:transparent;border-color:transparent;color:var(--m-btn-color);box-shadow:none}.non-native:not(.get):not(.toggle).ghost:not(.primary):not(.tab):hover:not([aria-disabled=true]){filter:none;background:color-mix(in srgb,var(--m-btn-color) 8%,transparent)}.non-native:not(.get):not(.toggle).ghost:not(.primary):not(.tab):active:not([aria-disabled=true]){background:color-mix(in srgb,var(--m-btn-color) 14%,transparent);transform:scale(.97)}.non-native:not(.get):not(.toggle):disabled{opacity:.3;cursor:not-allowed}@container togglegroup (max-width: 320px){.non-native:not(.get):not(.toggle).with-left-icon .button-label,.non-native:not(.get):not(.toggle).with-right-icon .button-label{display:none!important}}@media(max-width:600px){.non-native:not(.get):not(.toggle).with-left-icon .button-label,.non-native:not(.get):not(.toggle).with-right-icon .button-label{display:none!important}}\n"] }]
7089
- }], ctorParameters: () => [], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: false }] }, { type: i0.Output, args: ["configChange"] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], labelClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "labelClass", required: false }] }], fullWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "fullWidth", required: false }] }], nav: [{ type: i0.Input, args: [{ isSignal: true, alias: "nav", required: false }] }], navParams: [{ type: i0.Input, args: [{ isSignal: true, alias: "navParams", required: false }] }], href: [{ type: i0.Input, args: [{ isSignal: true, alias: "href", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], baseUrl: [{ type: i0.Input, args: [{ isSignal: true, alias: "baseUrl", required: false }] }], one: [{ type: i0.Input, args: [{ isSignal: true, alias: "one", required: false }] }], remote: [{ type: i0.Input, args: [{ isSignal: true, alias: "remote", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], noTranslate: [{ type: i0.Input, args: [{ isSignal: true, alias: "noTranslate", required: false }] }], params: [{ type: i0.Input, args: [{ isSignal: true, alias: "params", required: false }] }], noNative: [{ type: i0.Input, args: [{ isSignal: true, alias: "noNative", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], isRightIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "isRightIcon", required: false }] }], iconOnly: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconOnly", required: false }] }], stacked: [{ type: i0.Input, args: [{ isSignal: true, alias: "stacked", required: false }] }], imgSrc: [{ type: i0.Input, args: [{ isSignal: true, alias: "imgSrc", required: false }] }], nonClickable: [{ type: i0.Input, args: [{ isSignal: true, alias: "nonClickable", required: false }] }], inverted: [{ type: i0.Input, args: [{ isSignal: true, alias: "inverted", required: false }] }], isSubmit: [{ type: i0.Input, args: [{ isSignal: true, alias: "isSubmit", required: false }] }], tabindex: [{ type: i0.Input, args: [{ isSignal: true, alias: "tabindex", required: false }] }], clicked: [{ type: i0.Output, args: ["clicked"] }], button: [{ type: i0.ViewChild, args: ['button', { isSignal: true }] }] } });
7090
8243
 
7091
8244
  /**
7092
8245
  * Sugar: a variant expands to a justify + align pair. Explicit `justify` /
@@ -7781,7 +8934,7 @@ class SectionFormItemComponent extends ConfigComponent {
7781
8934
  break;
7782
8935
  }
7783
8936
  case InputType.TOGGLE: {
7784
- const { ToggleInputComponent } = await import('./magmonium-one-toggle-atjxl_R_.mjs');
8937
+ const { ToggleInputComponent } = await import('./magmonium-one-toggle-CpMURu38.mjs');
7785
8938
  this.createDynamicComponent(seq, ToggleInputComponent, [], true);
7786
8939
  break;
7787
8940
  }
@@ -7793,12 +8946,12 @@ class SectionFormItemComponent extends ConfigComponent {
7793
8946
  break;
7794
8947
  }
7795
8948
  case InputType.PASSWORD: {
7796
- const { PasswordInputComponent } = await import('./magmonium-one-password-yXiSYlMS.mjs');
8949
+ const { PasswordInputComponent } = await import('./magmonium-one-password-CyHOns1l.mjs');
7797
8950
  this.createDynamicComponent(seq, PasswordInputComponent);
7798
8951
  break;
7799
8952
  }
7800
8953
  case InputType.OTP: {
7801
- const { OtpInputComponent } = await import('./magmonium-one-otp-B-NBB6PF.mjs');
8954
+ const { OtpInputComponent } = await import('./magmonium-one-otp-BwXKEaEg.mjs');
7802
8955
  this.createDynamicComponent(seq, OtpInputComponent);
7803
8956
  break;
7804
8957
  }
@@ -9430,6 +10583,11 @@ class MenuComponent {
9430
10583
  this.#focusPending = this.#hasFocus();
9431
10584
  return;
9432
10585
  }
10586
+ // A row naming a Nav goes there itself — the NavKind on that node decides
10587
+ // whether it routes or opens a panel, the answer `[mRef]` gives (CONTEXT.md
10588
+ // NavRef). Still emitted, so whatever holds the menu closes it.
10589
+ if (item.nav)
10590
+ this.#navRef?.setSelected(item.nav, undefined, item.keepPanel ? { keepPanel: true } : undefined);
9433
10591
  this.action.emit(item);
9434
10592
  }
9435
10593
  goBack() {
@@ -9600,214 +10758,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
9600
10758
  }]
9601
10759
  }], propDecorators: { toggle: [{ type: i0.Input, args: [{ isSignal: true, alias: "toggle", required: false }] }, { type: i0.Output, args: ["toggleChange"] }], remote: [{ type: i0.Input, args: [{ isSignal: true, alias: "remote", required: false }] }], exclude: [{ type: i0.Input, args: [{ isSignal: true, alias: "exclude", required: false }] }], visibilityRule: [{ type: i0.Input, args: [{ isSignal: true, alias: "visibilityRule", required: false }] }], disableRule: [{ type: i0.Input, args: [{ isSignal: true, alias: "disableRule", required: false }] }], extraData: [{ type: i0.Input, args: [{ isSignal: true, alias: "extraData", required: false }] }], inverted: [{ type: i0.Input, args: [{ isSignal: true, alias: "inverted", required: false }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], action: [{ type: i0.Output, args: ["action"] }], selectorDir: [{ type: i0.ViewChild, args: [i0.forwardRef(() => SelectorDirective), { isSignal: true }] }] } });
9602
10760
 
9603
- let HeaderComponent$1 = class HeaderComponent {
9604
- level = input(3, ...(ngDevMode ? [{ debugName: "level" }] : /* istanbul ignore next */ []));
9605
- label = input(...(ngDevMode ? [undefined, { debugName: "label" }] : /* istanbul ignore next */ []));
9606
- // Drawn inside the heading rather than beside it. A glyph placed as the
9607
- // heading's sibling has no line box of its own to centre against — it ends
9608
- // up centred on whatever column it sits next to, which is how a Canvas
9609
- // header's icon came to line up with the label slot's drop rect instead of
9610
- // with the label. Inside, the two share one line box at every level.
9611
- icon = input(...(ngDevMode ? [undefined, { debugName: "icon" }] : /* istanbul ignore next */ []));
9612
- actionButton = input(...(ngDevMode ? [undefined, { debugName: "actionButton" }] : /* istanbul ignore next */ []));
9613
- // The action Button's accessible name. It renders icon-only, so the label is
9614
- // the only thing a screen reader has to go on — without it the button reads
9615
- // as nothing at all.
9616
- actionLabel = input(...(ngDevMode ? [undefined, { debugName: "actionLabel" }] : /* istanbul ignore next */ []));
9617
- // The label is authored text rather than a translation key. Needed for text
9618
- // carrying angle brackets above all: `translate` reads `<...>` as link
9619
- // markup, so a heading naming a MessageVariable — `<$app>` — resolves to
9620
- // nothing at all rather than to itself.
9621
- noTranslate = input(false, ...(ngDevMode ? [{ debugName: "noTranslate" }] : /* istanbul ignore next */ []));
9622
- // A message's [MessageVariable] values, the same record `m-text-output`
9623
- // takes: a heading naming `<$count>` is a sentence with a datum in it, and
9624
- // splicing that datum into the key instead would be parsed as a query
9625
- // string (m-one-ui ADR 0066).
9626
- params = input(undefined, ...(ngDevMode ? [{ debugName: "params" }] : /* istanbul ignore next */ []));
9627
- actionClick = output();
9628
- translateService = inject(TranslateService);
9629
- sizeContext = inject(SIZE_CONTEXT, { optional: true });
9630
- // The action Button sits inside the heading, whose font-size is the level's
9631
- // own — 2.25rem at h1 — so `em` inheritance would scale the Button to the
9632
- // heading rather than to the Section it belongs to. It reads the Size in
9633
- // force instead, the way Icon does, and lands at the same size as every
9634
- // other Button on that Section (ADR 0008).
9635
- actionSize = computed(() => resolveSize(this.sizeContext?.size()), ...(ngDevMode ? [{ debugName: "actionSize" }] : /* istanbul ignore next */ []));
9636
- actionConfig = computed(() => {
9637
- const icon = this.actionButton();
9638
- if (!icon)
9639
- return undefined;
9640
- return {
9641
- icon,
9642
- label: this.actionLabel(),
9643
- iconOnly: true,
9644
- variant: 'ghost',
9645
- };
9646
- }, ...(ngDevMode ? [{ debugName: "actionConfig" }] : /* istanbul ignore next */ []));
9647
- // A computed rather than the impure TranslatePipe repeated six times: one
9648
- // lookup per label change instead of one per change-detection tick, and it
9649
- // still repaints when the language or an in-memory translation moves.
9650
- text = computed(() => this.noTranslate()
9651
- ? (this.label() ?? '')
9652
- : this.translateService.translate(this.label(), this.params()), ...(ngDevMode ? [{ debugName: "text" }] : /* istanbul ignore next */ []));
9653
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: HeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
9654
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: HeaderComponent, isStandalone: true, selector: "m-header", inputs: { level: { classPropertyName: "level", publicName: "level", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, actionButton: { classPropertyName: "actionButton", publicName: "actionButton", isSignal: true, isRequired: false, transformFunction: null }, actionLabel: { classPropertyName: "actionLabel", publicName: "actionLabel", isSignal: true, isRequired: false, transformFunction: null }, noTranslate: { classPropertyName: "noTranslate", publicName: "noTranslate", isSignal: true, isRequired: false, transformFunction: null }, params: { classPropertyName: "params", publicName: "params", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { actionClick: "actionClick" }, ngImport: i0, template: `
9655
- @switch (level()) {
9656
- @case (1) {
9657
- <h1 class="header__heading">
9658
- @if (icon(); as iconName) {
9659
- <m-icon class="header__icon" [name]="iconName" />
9660
- }
9661
- <span>{{ text() }}</span>
9662
- <ng-content />
9663
- @if (actionConfig(); as action) {
9664
- <m-button class="header__action" [config]="action" [style.--m-button-size]="actionSize()" (clicked)="actionClick.emit()" />
9665
- }
9666
- </h1>
9667
- }
9668
- @case (2) {
9669
- <h2 class="header__heading">
9670
- @if (icon(); as iconName) {
9671
- <m-icon class="header__icon" [name]="iconName" />
9672
- }
9673
- <span>{{ text() }}</span>
9674
- <ng-content />
9675
- @if (actionConfig(); as action) {
9676
- <m-button class="header__action" [config]="action" [style.--m-button-size]="actionSize()" (clicked)="actionClick.emit()" />
9677
- }
9678
- </h2>
9679
- }
9680
- @case (3) {
9681
- <h3 class="header__heading">
9682
- @if (icon(); as iconName) {
9683
- <m-icon class="header__icon" [name]="iconName" />
9684
- }
9685
- <span>{{ text() }}</span>
9686
- <ng-content />
9687
- @if (actionConfig(); as action) {
9688
- <m-button class="header__action" [config]="action" [style.--m-button-size]="actionSize()" (clicked)="actionClick.emit()" />
9689
- }
9690
- </h3>
9691
- }
9692
- @case (4) {
9693
- <h4 class="header__heading">
9694
- @if (icon(); as iconName) {
9695
- <m-icon class="header__icon" [name]="iconName" />
9696
- }
9697
- <span>{{ text() }}</span>
9698
- <ng-content />
9699
- @if (actionConfig(); as action) {
9700
- <m-button class="header__action" [config]="action" [style.--m-button-size]="actionSize()" (clicked)="actionClick.emit()" />
9701
- }
9702
- </h4>
9703
- }
9704
- @case (5) {
9705
- <h5 class="header__heading">
9706
- @if (icon(); as iconName) {
9707
- <m-icon class="header__icon" [name]="iconName" />
9708
- }
9709
- <span>{{ text() }}</span>
9710
- <ng-content />
9711
- @if (actionConfig(); as action) {
9712
- <m-button class="header__action" [config]="action" [style.--m-button-size]="actionSize()" (clicked)="actionClick.emit()" />
9713
- }
9714
- </h5>
9715
- }
9716
- @case (6) {
9717
- <h6 class="header__heading">
9718
- @if (icon(); as iconName) {
9719
- <m-icon class="header__icon" [name]="iconName" />
9720
- }
9721
- <span>{{ text() }}</span>
9722
- <ng-content />
9723
- @if (actionConfig(); as action) {
9724
- <m-button class="header__action" [config]="action" [style.--m-button-size]="actionSize()" (clicked)="actionClick.emit()" />
9725
- }
9726
- </h6>
9727
- }
9728
- }
9729
- `, 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)}}.header__heading{display:flex;flex-direction:row;align-items:center;justify-content:var(--m-header-justify, flex-start);gap:.75rem;margin:0;padding:0;line-height:1.1;font-weight:800;letter-spacing:-.025em;color:var(--m-header-color, var(--m-text));transition:transform .2s cubic-bezier(.4,0,.2,1)}.header__heading:hover{transform:translate(2px)}.header__icon{flex-shrink:0}.header__action{margin-left:auto}.header__action span{display:inline-block;vertical-align:middle}h1.header__heading{font-size:var(--m-header-font-size, 2.25rem);font-weight:300;color:var(--m-text-quaternary);letter-spacing:-.035em;line-height:1.15}h2.header__heading{font-size:var(--m-header-font-size, 1.75rem);font-weight:300;color:var(--m-text-tertiary);letter-spacing:-.03em;line-height:1.2}h3.header__heading{font-size:var(--m-header-font-size, 1.375rem);font-weight:400;color:var(--m-text-secondary);letter-spacing:-.025em}h4.header__heading{font-size:var(--m-header-font-size, 1.125rem);font-weight:500;color:var(--m-text);letter-spacing:-.02em}h5.header__heading{font-size:var(--m-header-font-size, 1rem);font-weight:600;color:var(--m-text);letter-spacing:-.01em}h6.header__heading{font-size:var(--m-header-font-size, .875rem);font-weight:600;color:var(--m-text);letter-spacing:.05em;text-transform:uppercase}\n"], dependencies: [{ kind: "component", type: ButtonComponent, selector: "m-button,m-one-button", inputs: ["config", "color", "labelClass", "fullWidth", "nav", "navParams", "href", "disabled", "variant", "name", "baseUrl", "one", "remote", "label", "noTranslate", "params", "noNative", "icon", "isRightIcon", "iconOnly", "stacked", "imgSrc", "nonClickable", "inverted", "isSubmit", "tabindex"], outputs: ["configChange", "clicked"] }, { kind: "component", type: IconComponent, selector: "m-icon, m-one-icon", inputs: ["config", "name", "color", "size", "one", "baseUrl", "remote"], outputs: ["configChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
9730
- };
9731
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: HeaderComponent$1, decorators: [{
9732
- type: Component,
9733
- args: [{ selector: 'm-header', imports: [ButtonComponent, IconComponent], template: `
9734
- @switch (level()) {
9735
- @case (1) {
9736
- <h1 class="header__heading">
9737
- @if (icon(); as iconName) {
9738
- <m-icon class="header__icon" [name]="iconName" />
9739
- }
9740
- <span>{{ text() }}</span>
9741
- <ng-content />
9742
- @if (actionConfig(); as action) {
9743
- <m-button class="header__action" [config]="action" [style.--m-button-size]="actionSize()" (clicked)="actionClick.emit()" />
9744
- }
9745
- </h1>
9746
- }
9747
- @case (2) {
9748
- <h2 class="header__heading">
9749
- @if (icon(); as iconName) {
9750
- <m-icon class="header__icon" [name]="iconName" />
9751
- }
9752
- <span>{{ text() }}</span>
9753
- <ng-content />
9754
- @if (actionConfig(); as action) {
9755
- <m-button class="header__action" [config]="action" [style.--m-button-size]="actionSize()" (clicked)="actionClick.emit()" />
9756
- }
9757
- </h2>
9758
- }
9759
- @case (3) {
9760
- <h3 class="header__heading">
9761
- @if (icon(); as iconName) {
9762
- <m-icon class="header__icon" [name]="iconName" />
9763
- }
9764
- <span>{{ text() }}</span>
9765
- <ng-content />
9766
- @if (actionConfig(); as action) {
9767
- <m-button class="header__action" [config]="action" [style.--m-button-size]="actionSize()" (clicked)="actionClick.emit()" />
9768
- }
9769
- </h3>
9770
- }
9771
- @case (4) {
9772
- <h4 class="header__heading">
9773
- @if (icon(); as iconName) {
9774
- <m-icon class="header__icon" [name]="iconName" />
9775
- }
9776
- <span>{{ text() }}</span>
9777
- <ng-content />
9778
- @if (actionConfig(); as action) {
9779
- <m-button class="header__action" [config]="action" [style.--m-button-size]="actionSize()" (clicked)="actionClick.emit()" />
9780
- }
9781
- </h4>
9782
- }
9783
- @case (5) {
9784
- <h5 class="header__heading">
9785
- @if (icon(); as iconName) {
9786
- <m-icon class="header__icon" [name]="iconName" />
9787
- }
9788
- <span>{{ text() }}</span>
9789
- <ng-content />
9790
- @if (actionConfig(); as action) {
9791
- <m-button class="header__action" [config]="action" [style.--m-button-size]="actionSize()" (clicked)="actionClick.emit()" />
9792
- }
9793
- </h5>
9794
- }
9795
- @case (6) {
9796
- <h6 class="header__heading">
9797
- @if (icon(); as iconName) {
9798
- <m-icon class="header__icon" [name]="iconName" />
9799
- }
9800
- <span>{{ text() }}</span>
9801
- <ng-content />
9802
- @if (actionConfig(); as action) {
9803
- <m-button class="header__action" [config]="action" [style.--m-button-size]="actionSize()" (clicked)="actionClick.emit()" />
9804
- }
9805
- </h6>
9806
- }
9807
- }
9808
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}.header__heading{display:flex;flex-direction:row;align-items:center;justify-content:var(--m-header-justify, flex-start);gap:.75rem;margin:0;padding:0;line-height:1.1;font-weight:800;letter-spacing:-.025em;color:var(--m-header-color, var(--m-text));transition:transform .2s cubic-bezier(.4,0,.2,1)}.header__heading:hover{transform:translate(2px)}.header__icon{flex-shrink:0}.header__action{margin-left:auto}.header__action span{display:inline-block;vertical-align:middle}h1.header__heading{font-size:var(--m-header-font-size, 2.25rem);font-weight:300;color:var(--m-text-quaternary);letter-spacing:-.035em;line-height:1.15}h2.header__heading{font-size:var(--m-header-font-size, 1.75rem);font-weight:300;color:var(--m-text-tertiary);letter-spacing:-.03em;line-height:1.2}h3.header__heading{font-size:var(--m-header-font-size, 1.375rem);font-weight:400;color:var(--m-text-secondary);letter-spacing:-.025em}h4.header__heading{font-size:var(--m-header-font-size, 1.125rem);font-weight:500;color:var(--m-text);letter-spacing:-.02em}h5.header__heading{font-size:var(--m-header-font-size, 1rem);font-weight:600;color:var(--m-text);letter-spacing:-.01em}h6.header__heading{font-size:var(--m-header-font-size, .875rem);font-weight:600;color:var(--m-text);letter-spacing:.05em;text-transform:uppercase}\n"] }]
9809
- }], propDecorators: { level: [{ type: i0.Input, args: [{ isSignal: true, alias: "level", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], actionButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "actionButton", required: false }] }], actionLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "actionLabel", required: false }] }], noTranslate: [{ type: i0.Input, args: [{ isSignal: true, alias: "noTranslate", required: false }] }], params: [{ type: i0.Input, args: [{ isSignal: true, alias: "params", required: false }] }], actionClick: [{ type: i0.Output, args: ["actionClick"] }] } });
9810
-
9811
10761
  const SECTION_CONTEXT = new InjectionToken('SECTION_CONTEXT');
9812
10762
 
9813
10763
  // The line box each heading level draws, straight from `header.sass`: its font
@@ -9923,7 +10873,7 @@ class SectionHeaderComponent {
9923
10873
  this.accordion()?.toggle();
9924
10874
  }
9925
10875
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SectionHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
9926
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: SectionHeaderComponent, isStandalone: true, selector: "m-section-header", inputs: { sticky: { classPropertyName: "sticky", publicName: "sticky", isSignal: true, isRequired: false, transformFunction: null }, level: { classPropertyName: "level", publicName: "level", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, subLabel: { classPropertyName: "subLabel", publicName: "subLabel", isSignal: true, isRequired: false, transformFunction: null }, noTranslate: { classPropertyName: "noTranslate", publicName: "noTranslate", isSignal: true, isRequired: false, transformFunction: null }, params: { classPropertyName: "params", publicName: "params", isSignal: true, isRequired: false, transformFunction: null }, reverse: { classPropertyName: "reverse", publicName: "reverse", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, menu: { classPropertyName: "menu", publicName: "menu", isSignal: true, isRequired: false, transformFunction: null }, menuName: { classPropertyName: "menuName", publicName: "menuName", isSignal: true, isRequired: false, transformFunction: null }, visibilityRule: { classPropertyName: "visibilityRule", publicName: "visibilityRule", isSignal: true, isRequired: false, transformFunction: null }, disableRule: { classPropertyName: "disableRule", publicName: "disableRule", isSignal: true, isRequired: false, transformFunction: null }, extraData: { classPropertyName: "extraData", publicName: "extraData", isSignal: true, isRequired: false, transformFunction: null }, align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, showBack: { classPropertyName: "showBack", publicName: "showBack", isSignal: true, isRequired: false, transformFunction: null }, actionButton: { classPropertyName: "actionButton", publicName: "actionButton", isSignal: true, isRequired: false, transformFunction: null }, actionLabel: { classPropertyName: "actionLabel", publicName: "actionLabel", isSignal: true, isRequired: false, transformFunction: null }, spacing: { classPropertyName: "spacing", publicName: "spacing", isSignal: true, isRequired: false, transformFunction: null }, maxWidth: { classPropertyName: "maxWidth", publicName: "maxWidth", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { actionClick: "actionClick", action: "action", back: "back" }, host: { properties: { "class.is-sticky-enabled": "sticky()", "class.is-sticky": "isSticky()", "class.has-menu": "hasMenu()", "class.align-left": "alignment() === \"left\"", "class.align-center": "alignment() === \"center\"", "class.align-right": "alignment() === \"right\"", "class.has-sidepanel": "sidepanel()", "class.no-border": "noBorder()", "class.spacing": "spacing()", "class.box-center": "boxAlign() === \"center\"", "class.box-right": "boxAlign() === \"right\"", "style.--m-section-header-max-width": "resolvedMaxWidth()", "style.--m-section-header-icon-box": "iconBox()" }, classAttribute: "m-section-header" }, ngImport: i0, template: "<!-- One declaration of the row, rendered by whichever branch `spacing` picks.\n Hoisted into a template rather than written twice: an `<ng-content>` may\n appear once per selector in a component, so the duplicated copy caught\n nothing and a header projecting a title rendered it in the `spacing`\n branch alone. -->\n<ng-template #body>\n @if (accordion(); as accordionRef) {\n <div\n class=\"section-header__toggle\"\n [class.section-header__toggle--rotate]=\"toggleRotates()\"\n [class.section-header__toggle--open]=\"accordionRef.isOpen()\"\n [id]=\"accordionRef.headerId\"\n [attr.aria-expanded]=\"accordionRef.isOpen()\"\n [attr.aria-controls]=\"accordionRef.bodyId\"\n >\n <m-button\n [config]=\"{ icon: toggleIconName(), iconOnly: true, variant: 'ghost' }\"\n (clicked)=\"onToggleClick()\" />\n </div>\n }\n @if (showBack()) {\n <div class=\"section-header__back\">\n <m-button\n [config]=\"{ icon: 'arrow_back', iconOnly: true }\"\n (clicked)=\"back.emit()\" />\n </div>\n } @else if (!label() && icon(); as iconName) {\n <!-- Only where no label is written. A header with one hands the icon to\n `m-header`, which draws it inside the heading's line box and so on the\n heading's own centre line. Beside a projected title there is no such\n box to borrow, so the glyph is boxed to the level's line box here and\n centred in it \u2014 otherwise it centres against the whole title column,\n which on the Canvas is the label slot's drop rect stacked above the\n heading. -->\n <div class=\"section-header__icon\">\n <m-icon [name]=\"iconName\" />\n </div>\n }\n <div\n class=\"section-header__title\"\n [class.section-header__title--reverse]=\"reverse()\"\n >\n <!-- The title slot is the catch-all rather than a `[label]` one: every\n header already projecting a heading writes it unselected, and a\n selector here would drop that content on the floor. What the design\n page emits \u2014 `<span label>` \u2014 is caught by it too, nothing else\n claiming the node. -->\n <ng-content />\n <!-- The written label, drawn beside the slot rather than as its\n `ng-content` fallback. A fallback renders only while *nothing* is\n projected, and the design Canvas always projects the slot span \u2014\n empty until a Control is dropped in it \u2014 so a fallback there would\n blank the label a header is still configured with. `label` answers\n instead, which no header projecting a title sets. -->\n @if (label()) {\n <m-header\n [level]=\"level()\"\n [label]=\"label()\"\n [icon]=\"icon()\"\n [params]=\"params()\"\n [noTranslate]=\"noTranslate()\" />\n }\n @if (subText(); as sub) {\n <span class=\"section-header__sub\">{{ sub }}</span>\n }\n </div>\n <!-- A FilterGroup projected into the header row, selected by tag rather than\n by an attribute \u2014 the same shape a Section catches its `m-action` with.\n A header has room for one icon and not for a row, so a group landing\n here is squeezed by placement (ADR 0025); nothing here enforces that,\n the caller binding `[squeeze]` on the tag it projects. -->\n <div class=\"section-header__filters\">\n <ng-content select=\"m-section-filter-group\" />\n </div>\n @if (actionConfig(); as action) {\n <div class=\"section-header__action\">\n <m-button [config]=\"action\" (clicked)=\"actionClick.emit()\" />\n </div>\n }\n @if (hasMenu()) {\n <div class=\"section-header__menu\">\n <m-context-menu\n [config]=\"menu()\"\n [name]=\"menuName()\"\n [visibilityRule]=\"visibilityRule()\"\n [disableRule]=\"disableRule()\"\n [extraData]=\"extraData()\"\n (action)=\"action.emit($event)\"\n />\n </div>\n }\n</ng-template>\n\n<!-- Always the same two boxes, whether or not a `maxWidth` is in force. The\n border and the sticky backdrop live on the host and keep spanning the\n Section's full width; only this container narrows and is placed by the\n Section's `align`, so the heading lines up with the body under it. -->\n<div class=\"section-header__container\">\n <div class=\"section-header__inner\">\n <ng-container [ngTemplateOutlet]=\"body\" />\n </div>\n</div>\n", styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}:host{display:flex;align-items:center;gap:.5rem;min-height:var(--section-header-min-height, calc(var(--section-header-py, .5rem) * 2 + 1.25rem));border-bottom:1px solid var(--m-backdrop-border);padding:var(--section-header-py, .85rem) var(--section-px, 1rem);width:100%;grid-column:1/-1}:host(.no-border){border-bottom:none}:host(.spacing){padding:0;width:100%}.section-header__container{width:100%;min-width:0;max-width:var(--m-section-header-max-width, none);margin-inline:0 auto}:host(.box-center) .section-header__container{margin-inline:auto}:host(.box-right) .section-header__container{margin-inline:auto 0}.section-header__inner{display:flex;align-items:center;gap:.5rem;width:100%;min-width:0}.section-header__inner .section-header__title{flex:1;min-width:0;gap:.5rem}:host(.spacing) .section-header__inner{padding:1rem 1.5rem}:host(.has-sidepanel){padding-right:50px}:host(.has-sidepanel.has-menu){padding-right:50px}:host(.spacing.has-sidepanel) .section-header__inner{padding-right:calc(1.5rem + 50px)}:host(.is-sticky-enabled){position:sticky;top:0;z-index:10}:host(.is-sticky-enabled){background:color-mix(in srgb,var(--m-background) 80%,transparent);backdrop-filter:blur(16px) saturate(180%);-webkit-backdrop-filter:blur(16px) saturate(180%)}.section-header__toggle{display:flex;flex-shrink:0}.section-header__toggle.section-header__toggle--rotate m-button{display:flex;transition:transform .3s cubic-bezier(.4,0,.2,1)}.section-header__toggle.section-header__toggle--rotate.section-header__toggle--open m-button{transform:rotate(180deg)}.section-header__title{flex:1;min-width:0;display:flex;flex-direction:column;gap:.1rem}m-header{min-width:0}.section-header__title--reverse{flex-direction:column-reverse}.section-header__sub{font-size:.8rem;color:var(--m-text-secondary);line-height:1.2}:host(.align-center){--m-header-justify: center}:host(.align-right){--m-header-justify: flex-end}:host(.has-menu){padding-right:0}:host(.spacing.has-menu) .section-header__inner{padding-right:0}.section-header__filters{display:contents}.section-header__filters m-section-filter-group{width:auto;flex-shrink:0;border-bottom:none}.section-header__back{display:flex;align-items:center;flex-shrink:0}.section-header__icon{display:flex;align-items:center;justify-content:center;flex-shrink:0;align-self:flex-start;height:var(--m-section-header-icon-box, 1.5125rem)}.section-header__menu,.section-header__action{margin-left:auto;flex-shrink:0;display:flex;align-items:center}.section-header__action+.section-header__menu{margin-left:0}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ContextMenuComponent, selector: "m-context-menu, m-one-context-menu", inputs: ["toggle", "remote", "exclude", "visibilityRule", "disableRule", "extraData", "inverted", "options"], outputs: ["toggleChange", "action"] }, { kind: "component", type: HeaderComponent$1, selector: "m-header", inputs: ["level", "label", "icon", "actionButton", "actionLabel", "noTranslate", "params"], outputs: ["actionClick"] }, { kind: "component", type: IconComponent, selector: "m-icon, m-one-icon", inputs: ["config", "name", "color", "size", "one", "baseUrl", "remote"], outputs: ["configChange"] }, { 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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
10876
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: SectionHeaderComponent, isStandalone: true, selector: "m-section-header", inputs: { sticky: { classPropertyName: "sticky", publicName: "sticky", isSignal: true, isRequired: false, transformFunction: null }, level: { classPropertyName: "level", publicName: "level", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, subLabel: { classPropertyName: "subLabel", publicName: "subLabel", isSignal: true, isRequired: false, transformFunction: null }, noTranslate: { classPropertyName: "noTranslate", publicName: "noTranslate", isSignal: true, isRequired: false, transformFunction: null }, params: { classPropertyName: "params", publicName: "params", isSignal: true, isRequired: false, transformFunction: null }, reverse: { classPropertyName: "reverse", publicName: "reverse", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, menu: { classPropertyName: "menu", publicName: "menu", isSignal: true, isRequired: false, transformFunction: null }, menuName: { classPropertyName: "menuName", publicName: "menuName", isSignal: true, isRequired: false, transformFunction: null }, visibilityRule: { classPropertyName: "visibilityRule", publicName: "visibilityRule", isSignal: true, isRequired: false, transformFunction: null }, disableRule: { classPropertyName: "disableRule", publicName: "disableRule", isSignal: true, isRequired: false, transformFunction: null }, extraData: { classPropertyName: "extraData", publicName: "extraData", isSignal: true, isRequired: false, transformFunction: null }, align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, showBack: { classPropertyName: "showBack", publicName: "showBack", isSignal: true, isRequired: false, transformFunction: null }, actionButton: { classPropertyName: "actionButton", publicName: "actionButton", isSignal: true, isRequired: false, transformFunction: null }, actionLabel: { classPropertyName: "actionLabel", publicName: "actionLabel", isSignal: true, isRequired: false, transformFunction: null }, spacing: { classPropertyName: "spacing", publicName: "spacing", isSignal: true, isRequired: false, transformFunction: null }, maxWidth: { classPropertyName: "maxWidth", publicName: "maxWidth", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { actionClick: "actionClick", action: "action", back: "back" }, host: { properties: { "class.is-sticky-enabled": "sticky()", "class.is-sticky": "isSticky()", "class.has-menu": "hasMenu()", "class.align-left": "alignment() === \"left\"", "class.align-center": "alignment() === \"center\"", "class.align-right": "alignment() === \"right\"", "class.has-sidepanel": "sidepanel()", "class.no-border": "noBorder()", "class.spacing": "spacing()", "class.box-center": "boxAlign() === \"center\"", "class.box-right": "boxAlign() === \"right\"", "style.--m-section-header-max-width": "resolvedMaxWidth()", "style.--m-section-header-icon-box": "iconBox()" }, classAttribute: "m-section-header" }, ngImport: i0, template: "<!-- One declaration of the row, rendered by whichever branch `spacing` picks.\n Hoisted into a template rather than written twice: an `<ng-content>` may\n appear once per selector in a component, so the duplicated copy caught\n nothing and a header projecting a title rendered it in the `spacing`\n branch alone. -->\n<ng-template #body>\n @if (accordion(); as accordionRef) {\n <div\n class=\"section-header__toggle\"\n [class.section-header__toggle--rotate]=\"toggleRotates()\"\n [class.section-header__toggle--open]=\"accordionRef.isOpen()\"\n [id]=\"accordionRef.headerId\"\n [attr.aria-expanded]=\"accordionRef.isOpen()\"\n [attr.aria-controls]=\"accordionRef.bodyId\"\n >\n <m-button\n [config]=\"{ icon: toggleIconName(), iconOnly: true, variant: 'ghost' }\"\n (clicked)=\"onToggleClick()\" />\n </div>\n }\n @if (showBack()) {\n <div class=\"section-header__back\">\n <m-button\n [config]=\"{ icon: 'chevron-left', iconOnly: true }\"\n (clicked)=\"back.emit()\" />\n </div>\n } @else if (!label() && icon(); as iconName) {\n <!-- Only where no label is written. A header with one hands the icon to\n `m-header`, which draws it inside the heading's line box and so on the\n heading's own centre line. Beside a projected title there is no such\n box to borrow, so the glyph is boxed to the level's line box here and\n centred in it \u2014 otherwise it centres against the whole title column,\n which on the Canvas is the label slot's drop rect stacked above the\n heading. -->\n <div class=\"section-header__icon\">\n <m-icon [name]=\"iconName\" />\n </div>\n }\n <div\n class=\"section-header__title\"\n [class.section-header__title--reverse]=\"reverse()\"\n >\n <!-- The title slot is the catch-all rather than a `[label]` one: every\n header already projecting a heading writes it unselected, and a\n selector here would drop that content on the floor. What the design\n page emits \u2014 `<span label>` \u2014 is caught by it too, nothing else\n claiming the node. -->\n <ng-content />\n <!-- The written label, drawn beside the slot rather than as its\n `ng-content` fallback. A fallback renders only while *nothing* is\n projected, and the design Canvas always projects the slot span \u2014\n empty until a Control is dropped in it \u2014 so a fallback there would\n blank the label a header is still configured with. `label` answers\n instead, which no header projecting a title sets. -->\n @if (label()) {\n <m-header\n [level]=\"level()\"\n [label]=\"label()\"\n [icon]=\"icon()\"\n [params]=\"params()\"\n [noTranslate]=\"noTranslate()\" />\n }\n @if (subText(); as sub) {\n <span class=\"section-header__sub\">{{ sub }}</span>\n }\n </div>\n <!-- A FilterGroup projected into the header row, selected by tag rather than\n by an attribute \u2014 the same shape a Section catches its `m-action` with.\n A header has room for one icon and not for a row, so a group landing\n here is squeezed by placement (ADR 0025); nothing here enforces that,\n the caller binding `[squeeze]` on the tag it projects. -->\n <div class=\"section-header__filters\">\n <ng-content select=\"m-section-filter-group\" />\n </div>\n @if (actionConfig(); as action) {\n <div class=\"section-header__action\">\n <m-button [config]=\"action\" (clicked)=\"actionClick.emit()\" />\n </div>\n }\n @if (hasMenu()) {\n <div class=\"section-header__menu\">\n <m-context-menu\n [config]=\"menu()\"\n [name]=\"menuName()\"\n [visibilityRule]=\"visibilityRule()\"\n [disableRule]=\"disableRule()\"\n [extraData]=\"extraData()\"\n (action)=\"action.emit($event)\"\n />\n </div>\n }\n</ng-template>\n\n<!-- Always the same two boxes, whether or not a `maxWidth` is in force. The\n border and the sticky backdrop live on the host and keep spanning the\n Section's full width; only this container narrows and is placed by the\n Section's `align`, so the heading lines up with the body under it. -->\n<div class=\"section-header__container\">\n <div class=\"section-header__inner\">\n <ng-container [ngTemplateOutlet]=\"body\" />\n </div>\n</div>\n", styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}:host{display:flex;align-items:center;gap:.5rem;min-height:var(--section-header-min-height, calc(var(--section-header-py, .5rem) * 2 + 1.25rem));border-bottom:1px solid var(--m-backdrop-border);padding:var(--section-header-py, .85rem) var(--section-px, 1rem);width:100%;grid-column:1/-1}:host(.no-border){border-bottom:none}:host(.spacing){padding:0;width:100%}.section-header__container{width:100%;min-width:0;max-width:var(--m-section-header-max-width, none);margin-inline:0 auto}:host(.box-center) .section-header__container{margin-inline:auto}:host(.box-right) .section-header__container{margin-inline:auto 0}.section-header__inner{display:flex;align-items:center;gap:.5rem;width:100%;min-width:0}.section-header__inner .section-header__title{flex:1;min-width:0;gap:.5rem}:host(.spacing) .section-header__inner{padding:1rem 1.5rem}:host(.has-sidepanel){padding-right:50px}:host(.has-sidepanel.has-menu){padding-right:50px}:host(.spacing.has-sidepanel) .section-header__inner{padding-right:calc(1.5rem + 50px)}:host(.is-sticky-enabled){position:sticky;top:0;z-index:10}:host(.is-sticky-enabled){background:color-mix(in srgb,var(--m-background) 80%,transparent);backdrop-filter:blur(16px) saturate(180%);-webkit-backdrop-filter:blur(16px) saturate(180%)}.section-header__toggle{display:flex;flex-shrink:0}.section-header__toggle.section-header__toggle--rotate m-button{display:flex;transition:transform .3s cubic-bezier(.4,0,.2,1)}.section-header__toggle.section-header__toggle--rotate.section-header__toggle--open m-button{transform:rotate(180deg)}.section-header__title{flex:1;min-width:0;display:flex;flex-direction:column;gap:.1rem}m-header{min-width:0}.section-header__title--reverse{flex-direction:column-reverse}.section-header__sub{font-size:.8rem;color:var(--m-text-secondary);line-height:1.2}:host(.align-center){--m-header-justify: center}:host(.align-right){--m-header-justify: flex-end}:host(.has-menu){padding-right:0}:host(.spacing.has-menu) .section-header__inner{padding-right:0}.section-header__filters{display:contents}.section-header__filters m-section-filter-group{width:auto;flex-shrink:0;border-bottom:none}.section-header__back{display:flex;align-items:center;flex-shrink:0}.section-header__icon{display:flex;align-items:center;justify-content:center;flex-shrink:0;align-self:flex-start;height:var(--m-section-header-icon-box, 1.5125rem)}.section-header__menu,.section-header__action{margin-left:auto;flex-shrink:0;display:flex;align-items:center}.section-header__action+.section-header__menu{margin-left:0}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ContextMenuComponent, selector: "m-context-menu, m-one-context-menu", inputs: ["toggle", "remote", "exclude", "visibilityRule", "disableRule", "extraData", "inverted", "options"], outputs: ["toggleChange", "action"] }, { kind: "component", type: HeaderComponent$1, selector: "m-header", inputs: ["level", "label", "icon", "actionButton", "actionLabel", "noTranslate", "params"], outputs: ["actionClick"] }, { kind: "component", type: IconComponent, selector: "m-icon, m-one-icon", inputs: ["config", "name", "color", "size", "one", "baseUrl", "remote"], outputs: ["configChange"] }, { 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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
9927
10877
  }
9928
10878
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SectionHeaderComponent, decorators: [{
9929
10879
  type: Component,
@@ -9948,11 +10898,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
9948
10898
  '[class.box-right]': 'boxAlign() === "right"',
9949
10899
  '[style.--m-section-header-max-width]': 'resolvedMaxWidth()',
9950
10900
  '[style.--m-section-header-icon-box]': 'iconBox()',
9951
- }, template: "<!-- One declaration of the row, rendered by whichever branch `spacing` picks.\n Hoisted into a template rather than written twice: an `<ng-content>` may\n appear once per selector in a component, so the duplicated copy caught\n nothing and a header projecting a title rendered it in the `spacing`\n branch alone. -->\n<ng-template #body>\n @if (accordion(); as accordionRef) {\n <div\n class=\"section-header__toggle\"\n [class.section-header__toggle--rotate]=\"toggleRotates()\"\n [class.section-header__toggle--open]=\"accordionRef.isOpen()\"\n [id]=\"accordionRef.headerId\"\n [attr.aria-expanded]=\"accordionRef.isOpen()\"\n [attr.aria-controls]=\"accordionRef.bodyId\"\n >\n <m-button\n [config]=\"{ icon: toggleIconName(), iconOnly: true, variant: 'ghost' }\"\n (clicked)=\"onToggleClick()\" />\n </div>\n }\n @if (showBack()) {\n <div class=\"section-header__back\">\n <m-button\n [config]=\"{ icon: 'arrow_back', iconOnly: true }\"\n (clicked)=\"back.emit()\" />\n </div>\n } @else if (!label() && icon(); as iconName) {\n <!-- Only where no label is written. A header with one hands the icon to\n `m-header`, which draws it inside the heading's line box and so on the\n heading's own centre line. Beside a projected title there is no such\n box to borrow, so the glyph is boxed to the level's line box here and\n centred in it \u2014 otherwise it centres against the whole title column,\n which on the Canvas is the label slot's drop rect stacked above the\n heading. -->\n <div class=\"section-header__icon\">\n <m-icon [name]=\"iconName\" />\n </div>\n }\n <div\n class=\"section-header__title\"\n [class.section-header__title--reverse]=\"reverse()\"\n >\n <!-- The title slot is the catch-all rather than a `[label]` one: every\n header already projecting a heading writes it unselected, and a\n selector here would drop that content on the floor. What the design\n page emits \u2014 `<span label>` \u2014 is caught by it too, nothing else\n claiming the node. -->\n <ng-content />\n <!-- The written label, drawn beside the slot rather than as its\n `ng-content` fallback. A fallback renders only while *nothing* is\n projected, and the design Canvas always projects the slot span \u2014\n empty until a Control is dropped in it \u2014 so a fallback there would\n blank the label a header is still configured with. `label` answers\n instead, which no header projecting a title sets. -->\n @if (label()) {\n <m-header\n [level]=\"level()\"\n [label]=\"label()\"\n [icon]=\"icon()\"\n [params]=\"params()\"\n [noTranslate]=\"noTranslate()\" />\n }\n @if (subText(); as sub) {\n <span class=\"section-header__sub\">{{ sub }}</span>\n }\n </div>\n <!-- A FilterGroup projected into the header row, selected by tag rather than\n by an attribute \u2014 the same shape a Section catches its `m-action` with.\n A header has room for one icon and not for a row, so a group landing\n here is squeezed by placement (ADR 0025); nothing here enforces that,\n the caller binding `[squeeze]` on the tag it projects. -->\n <div class=\"section-header__filters\">\n <ng-content select=\"m-section-filter-group\" />\n </div>\n @if (actionConfig(); as action) {\n <div class=\"section-header__action\">\n <m-button [config]=\"action\" (clicked)=\"actionClick.emit()\" />\n </div>\n }\n @if (hasMenu()) {\n <div class=\"section-header__menu\">\n <m-context-menu\n [config]=\"menu()\"\n [name]=\"menuName()\"\n [visibilityRule]=\"visibilityRule()\"\n [disableRule]=\"disableRule()\"\n [extraData]=\"extraData()\"\n (action)=\"action.emit($event)\"\n />\n </div>\n }\n</ng-template>\n\n<!-- Always the same two boxes, whether or not a `maxWidth` is in force. The\n border and the sticky backdrop live on the host and keep spanning the\n Section's full width; only this container narrows and is placed by the\n Section's `align`, so the heading lines up with the body under it. -->\n<div class=\"section-header__container\">\n <div class=\"section-header__inner\">\n <ng-container [ngTemplateOutlet]=\"body\" />\n </div>\n</div>\n", styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}:host{display:flex;align-items:center;gap:.5rem;min-height:var(--section-header-min-height, calc(var(--section-header-py, .5rem) * 2 + 1.25rem));border-bottom:1px solid var(--m-backdrop-border);padding:var(--section-header-py, .85rem) var(--section-px, 1rem);width:100%;grid-column:1/-1}:host(.no-border){border-bottom:none}:host(.spacing){padding:0;width:100%}.section-header__container{width:100%;min-width:0;max-width:var(--m-section-header-max-width, none);margin-inline:0 auto}:host(.box-center) .section-header__container{margin-inline:auto}:host(.box-right) .section-header__container{margin-inline:auto 0}.section-header__inner{display:flex;align-items:center;gap:.5rem;width:100%;min-width:0}.section-header__inner .section-header__title{flex:1;min-width:0;gap:.5rem}:host(.spacing) .section-header__inner{padding:1rem 1.5rem}:host(.has-sidepanel){padding-right:50px}:host(.has-sidepanel.has-menu){padding-right:50px}:host(.spacing.has-sidepanel) .section-header__inner{padding-right:calc(1.5rem + 50px)}:host(.is-sticky-enabled){position:sticky;top:0;z-index:10}:host(.is-sticky-enabled){background:color-mix(in srgb,var(--m-background) 80%,transparent);backdrop-filter:blur(16px) saturate(180%);-webkit-backdrop-filter:blur(16px) saturate(180%)}.section-header__toggle{display:flex;flex-shrink:0}.section-header__toggle.section-header__toggle--rotate m-button{display:flex;transition:transform .3s cubic-bezier(.4,0,.2,1)}.section-header__toggle.section-header__toggle--rotate.section-header__toggle--open m-button{transform:rotate(180deg)}.section-header__title{flex:1;min-width:0;display:flex;flex-direction:column;gap:.1rem}m-header{min-width:0}.section-header__title--reverse{flex-direction:column-reverse}.section-header__sub{font-size:.8rem;color:var(--m-text-secondary);line-height:1.2}:host(.align-center){--m-header-justify: center}:host(.align-right){--m-header-justify: flex-end}:host(.has-menu){padding-right:0}:host(.spacing.has-menu) .section-header__inner{padding-right:0}.section-header__filters{display:contents}.section-header__filters m-section-filter-group{width:auto;flex-shrink:0;border-bottom:none}.section-header__back{display:flex;align-items:center;flex-shrink:0}.section-header__icon{display:flex;align-items:center;justify-content:center;flex-shrink:0;align-self:flex-start;height:var(--m-section-header-icon-box, 1.5125rem)}.section-header__menu,.section-header__action{margin-left:auto;flex-shrink:0;display:flex;align-items:center}.section-header__action+.section-header__menu{margin-left:0}\n"] }]
10901
+ }, template: "<!-- One declaration of the row, rendered by whichever branch `spacing` picks.\n Hoisted into a template rather than written twice: an `<ng-content>` may\n appear once per selector in a component, so the duplicated copy caught\n nothing and a header projecting a title rendered it in the `spacing`\n branch alone. -->\n<ng-template #body>\n @if (accordion(); as accordionRef) {\n <div\n class=\"section-header__toggle\"\n [class.section-header__toggle--rotate]=\"toggleRotates()\"\n [class.section-header__toggle--open]=\"accordionRef.isOpen()\"\n [id]=\"accordionRef.headerId\"\n [attr.aria-expanded]=\"accordionRef.isOpen()\"\n [attr.aria-controls]=\"accordionRef.bodyId\"\n >\n <m-button\n [config]=\"{ icon: toggleIconName(), iconOnly: true, variant: 'ghost' }\"\n (clicked)=\"onToggleClick()\" />\n </div>\n }\n @if (showBack()) {\n <div class=\"section-header__back\">\n <m-button\n [config]=\"{ icon: 'chevron-left', iconOnly: true }\"\n (clicked)=\"back.emit()\" />\n </div>\n } @else if (!label() && icon(); as iconName) {\n <!-- Only where no label is written. A header with one hands the icon to\n `m-header`, which draws it inside the heading's line box and so on the\n heading's own centre line. Beside a projected title there is no such\n box to borrow, so the glyph is boxed to the level's line box here and\n centred in it \u2014 otherwise it centres against the whole title column,\n which on the Canvas is the label slot's drop rect stacked above the\n heading. -->\n <div class=\"section-header__icon\">\n <m-icon [name]=\"iconName\" />\n </div>\n }\n <div\n class=\"section-header__title\"\n [class.section-header__title--reverse]=\"reverse()\"\n >\n <!-- The title slot is the catch-all rather than a `[label]` one: every\n header already projecting a heading writes it unselected, and a\n selector here would drop that content on the floor. What the design\n page emits \u2014 `<span label>` \u2014 is caught by it too, nothing else\n claiming the node. -->\n <ng-content />\n <!-- The written label, drawn beside the slot rather than as its\n `ng-content` fallback. A fallback renders only while *nothing* is\n projected, and the design Canvas always projects the slot span \u2014\n empty until a Control is dropped in it \u2014 so a fallback there would\n blank the label a header is still configured with. `label` answers\n instead, which no header projecting a title sets. -->\n @if (label()) {\n <m-header\n [level]=\"level()\"\n [label]=\"label()\"\n [icon]=\"icon()\"\n [params]=\"params()\"\n [noTranslate]=\"noTranslate()\" />\n }\n @if (subText(); as sub) {\n <span class=\"section-header__sub\">{{ sub }}</span>\n }\n </div>\n <!-- A FilterGroup projected into the header row, selected by tag rather than\n by an attribute \u2014 the same shape a Section catches its `m-action` with.\n A header has room for one icon and not for a row, so a group landing\n here is squeezed by placement (ADR 0025); nothing here enforces that,\n the caller binding `[squeeze]` on the tag it projects. -->\n <div class=\"section-header__filters\">\n <ng-content select=\"m-section-filter-group\" />\n </div>\n @if (actionConfig(); as action) {\n <div class=\"section-header__action\">\n <m-button [config]=\"action\" (clicked)=\"actionClick.emit()\" />\n </div>\n }\n @if (hasMenu()) {\n <div class=\"section-header__menu\">\n <m-context-menu\n [config]=\"menu()\"\n [name]=\"menuName()\"\n [visibilityRule]=\"visibilityRule()\"\n [disableRule]=\"disableRule()\"\n [extraData]=\"extraData()\"\n (action)=\"action.emit($event)\"\n />\n </div>\n }\n</ng-template>\n\n<!-- Always the same two boxes, whether or not a `maxWidth` is in force. The\n border and the sticky backdrop live on the host and keep spanning the\n Section's full width; only this container narrows and is placed by the\n Section's `align`, so the heading lines up with the body under it. -->\n<div class=\"section-header__container\">\n <div class=\"section-header__inner\">\n <ng-container [ngTemplateOutlet]=\"body\" />\n </div>\n</div>\n", styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}:host{display:flex;align-items:center;gap:.5rem;min-height:var(--section-header-min-height, calc(var(--section-header-py, .5rem) * 2 + 1.25rem));border-bottom:1px solid var(--m-backdrop-border);padding:var(--section-header-py, .85rem) var(--section-px, 1rem);width:100%;grid-column:1/-1}:host(.no-border){border-bottom:none}:host(.spacing){padding:0;width:100%}.section-header__container{width:100%;min-width:0;max-width:var(--m-section-header-max-width, none);margin-inline:0 auto}:host(.box-center) .section-header__container{margin-inline:auto}:host(.box-right) .section-header__container{margin-inline:auto 0}.section-header__inner{display:flex;align-items:center;gap:.5rem;width:100%;min-width:0}.section-header__inner .section-header__title{flex:1;min-width:0;gap:.5rem}:host(.spacing) .section-header__inner{padding:1rem 1.5rem}:host(.has-sidepanel){padding-right:50px}:host(.has-sidepanel.has-menu){padding-right:50px}:host(.spacing.has-sidepanel) .section-header__inner{padding-right:calc(1.5rem + 50px)}:host(.is-sticky-enabled){position:sticky;top:0;z-index:10}:host(.is-sticky-enabled){background:color-mix(in srgb,var(--m-background) 80%,transparent);backdrop-filter:blur(16px) saturate(180%);-webkit-backdrop-filter:blur(16px) saturate(180%)}.section-header__toggle{display:flex;flex-shrink:0}.section-header__toggle.section-header__toggle--rotate m-button{display:flex;transition:transform .3s cubic-bezier(.4,0,.2,1)}.section-header__toggle.section-header__toggle--rotate.section-header__toggle--open m-button{transform:rotate(180deg)}.section-header__title{flex:1;min-width:0;display:flex;flex-direction:column;gap:.1rem}m-header{min-width:0}.section-header__title--reverse{flex-direction:column-reverse}.section-header__sub{font-size:.8rem;color:var(--m-text-secondary);line-height:1.2}:host(.align-center){--m-header-justify: center}:host(.align-right){--m-header-justify: flex-end}:host(.has-menu){padding-right:0}:host(.spacing.has-menu) .section-header__inner{padding-right:0}.section-header__filters{display:contents}.section-header__filters m-section-filter-group{width:auto;flex-shrink:0;border-bottom:none}.section-header__back{display:flex;align-items:center;flex-shrink:0}.section-header__icon{display:flex;align-items:center;justify-content:center;flex-shrink:0;align-self:flex-start;height:var(--m-section-header-icon-box, 1.5125rem)}.section-header__menu,.section-header__action{margin-left:auto;flex-shrink:0;display:flex;align-items:center}.section-header__action+.section-header__menu{margin-left:0}\n"] }]
9952
10902
  }], propDecorators: { sticky: [{ type: i0.Input, args: [{ isSignal: true, alias: "sticky", required: false }] }], level: [{ type: i0.Input, args: [{ isSignal: true, alias: "level", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], subLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "subLabel", required: false }] }], noTranslate: [{ type: i0.Input, args: [{ isSignal: true, alias: "noTranslate", required: false }] }], params: [{ type: i0.Input, args: [{ isSignal: true, alias: "params", required: false }] }], reverse: [{ type: i0.Input, args: [{ isSignal: true, alias: "reverse", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], menu: [{ type: i0.Input, args: [{ isSignal: true, alias: "menu", required: false }] }], menuName: [{ type: i0.Input, args: [{ isSignal: true, alias: "menuName", required: false }] }], visibilityRule: [{ type: i0.Input, args: [{ isSignal: true, alias: "visibilityRule", required: false }] }], disableRule: [{ type: i0.Input, args: [{ isSignal: true, alias: "disableRule", required: false }] }], extraData: [{ type: i0.Input, args: [{ isSignal: true, alias: "extraData", required: false }] }], align: [{ type: i0.Input, args: [{ isSignal: true, alias: "align", required: false }] }], showBack: [{ type: i0.Input, args: [{ isSignal: true, alias: "showBack", required: false }] }], actionButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "actionButton", required: false }] }], actionLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "actionLabel", required: false }] }], spacing: [{ type: i0.Input, args: [{ isSignal: true, alias: "spacing", required: false }] }], maxWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxWidth", required: false }] }], actionClick: [{ type: i0.Output, args: ["actionClick"] }], action: [{ type: i0.Output, args: ["action"] }], back: [{ type: i0.Output, args: ["back"] }] } });
9953
10903
 
9954
10904
  const BACK_BTN = {
9955
- icon: 'arrow-left',
10905
+ icon: 'chevron-left',
9956
10906
  iconOnly: true,
9957
10907
  variant: 'ghost',
9958
10908
  };
@@ -9992,7 +10942,7 @@ class SectionBackComponent {
9992
10942
  <m-header [level]="3" [label]="label() ?? 'magmonium'" />
9993
10943
  }
9994
10944
  }
9995
- `, 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:flex;align-items:center;gap:.75rem;min-height:var(--section-header-min-height, calc(var(--section-header-py, .5rem) * 2 + 1.25rem));border-bottom:1px solid var(--m-backdrop-border);width:100%;grid-column:1/-1}:host(.no-border){border-bottom:none}m-logo{flex-shrink:0;width:1.5rem;height:1.5rem}m-header{flex:1;min-width:0}:host>span{display:contents}:host.has-padding-x{padding-inline:var(--section-px, 1rem)}:host.has-padding-y{padding-block:var(--section-header-py, .85rem)}\n"], dependencies: [{ kind: "component", type: IconComponent, selector: "m-icon, m-one-icon", inputs: ["config", "name", "color", "size", "one", "baseUrl", "remote"], outputs: ["configChange"] }, { kind: "component", type: ButtonComponent, selector: "m-button,m-one-button", inputs: ["config", "color", "labelClass", "fullWidth", "nav", "navParams", "href", "disabled", "variant", "name", "baseUrl", "one", "remote", "label", "noTranslate", "params", "noNative", "icon", "isRightIcon", "iconOnly", "stacked", "imgSrc", "nonClickable", "inverted", "isSubmit", "tabindex"], outputs: ["configChange", "clicked"] }, { kind: "component", type: HeaderComponent$1, selector: "m-header", inputs: ["level", "label", "icon", "actionButton", "actionLabel", "noTranslate", "params"], outputs: ["actionClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
10945
+ `, 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:flex;align-items:center;gap:.25rem;min-height:var(--section-header-min-height, calc(var(--section-header-py, .5rem) * 2 + 1.25rem));border-bottom:1px solid var(--m-backdrop-border);width:100%;grid-column:1/-1;--section-back-size: .7rem;--section-back-seat: calc(var(--section-back-size) * 2.25)}:host(.no-border){border-bottom:none}m-button,m-icon{flex-shrink:0}m-button{--m-button-size: var(--section-back-size)}m-icon{display:inline-flex;justify-content:center;width:var(--section-back-seat)}m-logo{flex-shrink:0;width:1.5rem;height:1.5rem}m-header{flex:1;min-width:0}:host>span{display:contents}:host.has-padding-x{padding-inline:var(--section-px, 1rem)}:host.has-padding-y{padding-block:var(--section-header-py, .85rem)}\n"], dependencies: [{ kind: "component", type: IconComponent, selector: "m-icon, m-one-icon", inputs: ["config", "name", "color", "size", "one", "baseUrl", "remote"], outputs: ["configChange"] }, { kind: "component", type: ButtonComponent, selector: "m-button,m-one-button", inputs: ["config", "color", "labelClass", "fullWidth", "nav", "navParams", "href", "disabled", "variant", "name", "baseUrl", "one", "remote", "label", "noTranslate", "params", "noNative", "icon", "isRightIcon", "iconOnly", "stacked", "imgSrc", "nonClickable", "inverted", "isSubmit", "tabindex"], outputs: ["configChange", "clicked"] }, { kind: "component", type: HeaderComponent$1, selector: "m-header", inputs: ["level", "label", "icon", "actionButton", "actionLabel", "noTranslate", "params"], outputs: ["actionClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
9996
10946
  }
9997
10947
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SectionBackComponent, decorators: [{
9998
10948
  type: Component,
@@ -10016,7 +10966,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
10016
10966
  '[class.has-padding-x]': 'padding() || paddingX()',
10017
10967
  '[class.has-padding-y]': 'padding() || paddingY()',
10018
10968
  '[class.no-border]': 'noBorder()',
10019
- }, 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:flex;align-items:center;gap:.75rem;min-height:var(--section-header-min-height, calc(var(--section-header-py, .5rem) * 2 + 1.25rem));border-bottom:1px solid var(--m-backdrop-border);width:100%;grid-column:1/-1}:host(.no-border){border-bottom:none}m-logo{flex-shrink:0;width:1.5rem;height:1.5rem}m-header{flex:1;min-width:0}:host>span{display:contents}:host.has-padding-x{padding-inline:var(--section-px, 1rem)}:host.has-padding-y{padding-block:var(--section-header-py, .85rem)}\n"] }]
10969
+ }, 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:flex;align-items:center;gap:.25rem;min-height:var(--section-header-min-height, calc(var(--section-header-py, .5rem) * 2 + 1.25rem));border-bottom:1px solid var(--m-backdrop-border);width:100%;grid-column:1/-1;--section-back-size: .7rem;--section-back-seat: calc(var(--section-back-size) * 2.25)}:host(.no-border){border-bottom:none}m-button,m-icon{flex-shrink:0}m-button{--m-button-size: var(--section-back-size)}m-icon{display:inline-flex;justify-content:center;width:var(--section-back-seat)}m-logo{flex-shrink:0;width:1.5rem;height:1.5rem}m-header{flex:1;min-width:0}:host>span{display:contents}:host.has-padding-x{padding-inline:var(--section-px, 1rem)}:host.has-padding-y{padding-block:var(--section-header-py, .85rem)}\n"] }]
10020
10970
  }], ctorParameters: () => [], propDecorators: { back: [{ type: i0.Input, args: [{ isSignal: true, alias: "back", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], html: [{ type: i0.Input, args: [{ isSignal: true, alias: "html", required: false }] }], padding: [{ type: i0.Input, args: [{ isSignal: true, alias: "padding", required: false }] }], paddingX: [{ type: i0.Input, args: [{ isSignal: true, alias: "paddingX", required: false }] }], paddingY: [{ type: i0.Input, args: [{ isSignal: true, alias: "paddingY", required: false }] }], navigate: [{ type: i0.Output, args: ["navigate"] }], contentRef: [{ type: i0.ViewChild, args: ['content', { isSignal: true }] }] } });
10021
10971
 
10022
10972
  /**
@@ -10344,6 +11294,11 @@ class ActionComponent extends ButtonGroupComponent {
10344
11294
  // consumes the Buttons dropped on a SectionAction into `[buttons]` and writes
10345
11295
  // every other setting as an attribute (ADR 0010).
10346
11296
  variant = input(...(ngDevMode ? [undefined, { debugName: "variant" }] : /* istanbul ignore next */ []));
11297
+ // A toggle's lit Button, named by a host that also moves the pick from
11298
+ // outside the bar — a shortcut, a store. It wins over the last press, so a
11299
+ // host binding it follows `clicked` back into it, the way a controlled input
11300
+ // does. Unset leaves the bar keeping its own selection.
11301
+ active = input(...(ngDevMode ? [undefined, { debugName: "active" }] : /* istanbul ignore next */ []));
10347
11302
  // Design-mode only: Button name -> the id of the Control it was folded from.
10348
11303
  // The Canvas draws a folded Button through this bar rather than as a tag of
10349
11304
  // its own, so the `render-id` its ControlLayer measures has nowhere else to
@@ -10422,6 +11377,9 @@ class ActionComponent extends ButtonGroupComponent {
10422
11377
  }
10423
11378
  if (this.resolvedVariant() !== 'toggle')
10424
11379
  return this.config()?.primary;
11380
+ const named = this.active();
11381
+ if (named && buttons.some((b) => b.name === named))
11382
+ return named;
10425
11383
  const pressed = this.pressed();
10426
11384
  if (pressed && buttons.some((b) => b.name === pressed))
10427
11385
  return pressed;
@@ -10458,10 +11416,12 @@ class ActionComponent extends ButtonGroupComponent {
10458
11416
  }
10459
11417
  return undefined;
10460
11418
  }, ...(ngDevMode ? [{ debugName: "activeSqueeze" }] : /* istanbul ignore next */ []));
10461
- // Only where the icon can carry the Button on its own — a label dropped off
10462
- // a Button with no glyph behind it leaves an empty box to press.
11419
+ // Squeezed to icons, or asked for by the Button itself (`iconOnly`). Only
11420
+ // where the icon can carry the Button on its own — a label dropped off a
11421
+ // Button with no glyph behind it leaves an empty box to press.
10463
11422
  isLabelHidden(button) {
10464
- return this.activeSqueeze() === 'icon' && !!button.icon;
11423
+ return (!!button.icon &&
11424
+ (!!button.iconOnly || this.activeSqueeze() === 'icon'));
10465
11425
  }
10466
11426
  // Folded: the Button that speaks for the bar stays out, the rest go in the
10467
11427
  // menu. Below two Buttons there is nothing to fold, so the bar is left alone.
@@ -10629,6 +11589,9 @@ class ActionComponent extends ButtonGroupComponent {
10629
11589
  // A press announces itself through `select`; this speaks only for defaults.
10630
11590
  if (this.pressed() !== undefined)
10631
11591
  return;
11592
+ // A host that names the active Button already knows which one it is.
11593
+ if (this.active() !== undefined)
11594
+ return;
10632
11595
  const name = this.selected();
10633
11596
  if (!name || name === this.announcedDefault())
10634
11597
  return;
@@ -10641,7 +11604,7 @@ class ActionComponent extends ButtonGroupComponent {
10641
11604
  this.clicked.emit(button);
10642
11605
  };
10643
11606
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ActionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10644
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: ActionComponent, isStandalone: true, selector: "m-action, m-one-action", inputs: { sticky: { classPropertyName: "sticky", publicName: "sticky", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, renderIds: { classPropertyName: "renderIds", publicName: "renderIds", isSignal: true, isRequired: false, transformFunction: null }, squeezeAt: { classPropertyName: "squeezeAt", publicName: "squeezeAt", isSignal: true, isRequired: false, transformFunction: null }, squeezeMode: { classPropertyName: "squeezeMode", publicName: "squeezeMode", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.m-action--host-sticky": "sticky()" } }, usesInheritance: true, ngImport: i0, template: "@let buttons = actionButtons();\n<!-- No `config()` guard: a bar the Design editor folded its Buttons into has no\n `button_groups/<name>.yml` behind it \u2014 they ride on `[buttons]` instead\n (ADR 0009, ADR 0010) \u2014 so what decides whether the row exists is whether\n there are Buttons in it. Empty, it draws only on the Canvas, where it is\n the drop space a Button lands on. -->\n@if (buttons.length || isDesignMode) {\n <div\n class=\"m-action\"\n [class.m-action--stuck]=\"isStuck()\"\n [class.m-action--toggle]=\"resolvedVariant() === 'toggle'\"\n [class.m-action--icon-only]=\"activeSqueeze() === 'icon'\"\n >\n @for (button of visibleButtons(); track $index) {\n <!-- A routed Button is a real link, so the browser's own affordances \u2014\n a middle-click, open in new tab, the URL on hover \u2014 reach it. A\n disabled one stays a <button>: an <a> cannot be disabled, and a\n RouterLink on one would still navigate. -->\n @let link = isDisabled(button.name) ? undefined : linkOf(button);\n @if (link) {\n <a\n class=\"m-action__btn\"\n [routerLink]=\"link\"\n [attr.data-testid]=\"(button.name || '') + '-btn'\"\n [class.active]=\"isActive(button)\"\n [attr.aria-current]=\"isActive(button) ? 'page' : null\"\n [style.--m-action-color]=\"fillColor(button)\"\n [style.--m-action-color-contrast]=\"contrastColor(button)\"\n [style.--m-action-label]=\"labelColor(button)\"\n (click)=\"select(button)\"\n >\n <ng-container\n *ngTemplateOutlet=\"buttonContent; context: { $implicit: button }\"\n />\n </a>\n } @else {\n <button\n type=\"button\"\n class=\"m-action__btn\"\n [attr.data-testid]=\"(button.name || '') + '-btn'\"\n [attr.render-id]=\"renderIds()?.[button.name ?? '']\"\n [class.active]=\"isActive(button)\"\n [style.--m-action-color]=\"fillColor(button)\"\n [style.--m-action-color-contrast]=\"contrastColor(button)\"\n [style.--m-action-label]=\"labelColor(button)\"\n [disabled]=\"isDisabled(button.name)\"\n (click)=\"select(button)\"\n >\n <ng-container\n *ngTemplateOutlet=\"buttonContent; context: { $implicit: button }\"\n />\n </button>\n }\n }\n @if (menuButtons().length) {\n <!-- The Buttons the bar could not fit. Squeezed rather than dropped:\n an action the User can still reach behind one press beats an action\n that silently stopped existing at 400px. -->\n <m-context-menu\n class=\"m-action__overflow\"\n [config]=\"squeezeMenu()\"\n [remote]=\"remote() ?? config()?.remote\"\n (action)=\"onMenuAction($event)\"\n />\n }\n @if (!buttons.length) {\n <!-- A bar with nothing in it has no box, and a slot with no box is a slot\n nothing can be dropped on \u2014 the same rect an empty projected Card is\n given (m-one-ui `.card-drop-space`). -->\n <span class=\"m-action__drop\"></span>\n }\n </div>\n}\n\n<ng-template #buttonContent let-button>\n @if (button.icon) {\n <m-icon\n [name]=\"button.icon\"\n [color]=\"iconColor(button)\"\n [remote]=\"remote() ?? config()?.remote\"\n />\n }\n @if (button.label && !isLabelHidden(button)) {\n <span class=\"m-action__label\">{{ button.label | translate }}</span>\n }\n</ng-template>\n", styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}m-action,m-one-action{display:block;width:100%;grid-column:1/-1}m-action.m-action--host-sticky,m-one-action.m-action--host-sticky{position:sticky;top:0;z-index:50;background:#ffffffeb;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px)}.m-action{display:flex;flex-wrap:nowrap;background:transparent;width:100%;border-bottom:1px solid #f1f5f9;--m-action-color: var(--m-button-color, var(--m-one-button-color, var(--m-mm)));--m-action-color-contrast: var(--m-button-color-contrast, var(--m-one-button-color-contrast, #ffffff))}.m-action--stuck{border-bottom-color:#00000014;box-shadow:0 2px 10px #0000000f}.m-action__btn{flex:1;min-width:0;padding:1rem 2rem;border:none;background:transparent;text-decoration:none;color:var(--m-action-label, #1e293b);font-weight:300;font-size:.9rem;display:flex;align-items:center;justify-content:center;gap:.6rem;white-space:nowrap;overflow:hidden;cursor:pointer;border-right:1px solid #f1f5f9;transition:all .25s cubic-bezier(.4,0,.2,1)}.m-action__btn:last-child{border-right:none}.m-action__btn:hover{background:#f8fafc;color:var(--m-action-color)}.m-action__btn .m-icon{transition:transform .2s ease}.m-action__btn:hover .m-icon{transform:scale(1.1)}.m-action__btn:disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.m-action__btn.active{color:var(--m-action-color);font-weight:500}.m-action--toggle .m-action__btn{position:relative;filter:grayscale(100%);transition:all .25s cubic-bezier(.4,0,.2,1),filter .25s cubic-bezier(.4,0,.2,1)}.m-action--toggle .m-action__btn.active{filter:none}.m-action--toggle .m-action__btn.active:hover:not(:disabled){filter:none}.m-action--icon-only .m-action__btn{padding:1rem .5rem;gap:0}.m-action__overflow{display:flex;align-items:center;padding:0 .5rem;flex:0 0 auto}.m-action__drop{display:block;flex:1;min-height:3.5rem;margin:.5rem;border:1px dashed currentColor;border-radius:.25rem;opacity:.4;pointer-events:none}.m-action__label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}@container mag-grid (max-width: 767.98px){.m-action__btn{padding:1rem .75rem;gap:.4rem}}@container mag-grid (max-width: 575.98px){.m-action__btn{padding:.85rem .4rem;font-size:.8rem}}\n"], dependencies: [{ kind: "ngmodule", type: i0.forwardRef(() => CommonModule) }, { kind: "directive", type: i0.forwardRef(() => i1.NgTemplateOutlet), selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i0.forwardRef(() => IconComponent), selector: "m-icon, m-one-icon", inputs: ["config", "name", "color", "size", "one", "baseUrl", "remote"], outputs: ["configChange"] }, { kind: "component", type: i0.forwardRef(() => ContextMenuComponent), selector: "m-context-menu, m-one-context-menu", inputs: ["toggle", "remote", "exclude", "visibilityRule", "disableRule", "extraData", "inverted", "options"], outputs: ["toggleChange", "action"] }, { kind: "directive", type: i0.forwardRef(() => RouterLink), selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "pipe", type: i0.forwardRef(() => TranslatePipe), name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
11607
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: ActionComponent, isStandalone: true, selector: "m-action, m-one-action", inputs: { sticky: { classPropertyName: "sticky", publicName: "sticky", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, active: { classPropertyName: "active", publicName: "active", isSignal: true, isRequired: false, transformFunction: null }, renderIds: { classPropertyName: "renderIds", publicName: "renderIds", isSignal: true, isRequired: false, transformFunction: null }, squeezeAt: { classPropertyName: "squeezeAt", publicName: "squeezeAt", isSignal: true, isRequired: false, transformFunction: null }, squeezeMode: { classPropertyName: "squeezeMode", publicName: "squeezeMode", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.m-action--host-sticky": "sticky()" } }, usesInheritance: true, ngImport: i0, template: "@let buttons = actionButtons();\n<!-- No `config()` guard: a bar the Design editor folded its Buttons into has no\n `button_groups/<name>.yml` behind it \u2014 they ride on `[buttons]` instead\n (ADR 0009, ADR 0010) \u2014 so what decides whether the row exists is whether\n there are Buttons in it. Empty, it draws only on the Canvas, where it is\n the drop space a Button lands on. -->\n@if (buttons.length || isDesignMode) {\n <div\n class=\"m-action\"\n [class.m-action--stuck]=\"isStuck()\"\n [class.m-action--toggle]=\"resolvedVariant() === 'toggle'\"\n >\n @for (button of visibleButtons(); track $index) {\n <!-- A routed Button is a real link, so the browser's own affordances \u2014\n a middle-click, open in new tab, the URL on hover \u2014 reach it. A\n disabled one stays a <button>: an <a> cannot be disabled, and a\n RouterLink on one would still navigate. -->\n @let link = isDisabled(button.name) ? undefined : linkOf(button);\n @if (link) {\n <a\n class=\"m-action__btn\"\n [routerLink]=\"link\"\n [attr.data-testid]=\"(button.name || '') + '-btn'\"\n [class.active]=\"isActive(button)\"\n [class.m-action__btn--icon-only]=\"isLabelHidden(button)\"\n [attr.aria-label]=\"isLabelHidden(button) ? (button.label | translate) : null\"\n [attr.aria-current]=\"isActive(button) ? 'page' : null\"\n [style.--m-action-color]=\"fillColor(button)\"\n [style.--m-action-color-contrast]=\"contrastColor(button)\"\n [style.--m-action-label]=\"labelColor(button)\"\n (click)=\"select(button)\"\n >\n <ng-container\n *ngTemplateOutlet=\"buttonContent; context: { $implicit: button }\"\n />\n </a>\n } @else {\n <button\n type=\"button\"\n class=\"m-action__btn\"\n [attr.data-testid]=\"(button.name || '') + '-btn'\"\n [attr.render-id]=\"renderIds()?.[button.name ?? '']\"\n [class.active]=\"isActive(button)\"\n [class.m-action__btn--icon-only]=\"isLabelHidden(button)\"\n [attr.aria-label]=\"isLabelHidden(button) ? (button.label | translate) : null\"\n [style.--m-action-color]=\"fillColor(button)\"\n [style.--m-action-color-contrast]=\"contrastColor(button)\"\n [style.--m-action-label]=\"labelColor(button)\"\n [disabled]=\"isDisabled(button.name)\"\n (click)=\"select(button)\"\n >\n <ng-container\n *ngTemplateOutlet=\"buttonContent; context: { $implicit: button }\"\n />\n </button>\n }\n }\n @if (menuButtons().length) {\n <!-- The Buttons the bar could not fit. Squeezed rather than dropped:\n an action the User can still reach behind one press beats an action\n that silently stopped existing at 400px. -->\n <m-context-menu\n class=\"m-action__overflow\"\n [config]=\"squeezeMenu()\"\n [remote]=\"remote() ?? config()?.remote\"\n (action)=\"onMenuAction($event)\"\n />\n }\n @if (!buttons.length) {\n <!-- A bar with nothing in it has no box, and a slot with no box is a slot\n nothing can be dropped on \u2014 the same rect an empty projected Card is\n given (m-one-ui `.card-drop-space`). -->\n <span class=\"m-action__drop\"></span>\n }\n </div>\n}\n\n<ng-template #buttonContent let-button>\n @if (button.icon) {\n <m-icon\n [name]=\"button.icon\"\n [color]=\"iconColor(button)\"\n [remote]=\"remote() ?? config()?.remote\"\n />\n }\n @if (button.label && !isLabelHidden(button)) {\n <span class=\"m-action__label\">{{ button.label | translate }}</span>\n }\n</ng-template>\n", styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}m-action,m-one-action{display:block;width:100%;grid-column:1/-1}m-action.m-action--host-sticky,m-one-action.m-action--host-sticky{position:sticky;top:0;z-index:50;background:#ffffffeb;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px)}.m-action{display:flex;flex-wrap:nowrap;background:transparent;width:100%;border-bottom:1px solid #f1f5f9;--m-action-color: var(--m-button-color, var(--m-one-button-color, var(--m-mm)));--m-action-color-contrast: var(--m-button-color-contrast, var(--m-one-button-color-contrast, #ffffff))}.m-action--stuck{border-bottom-color:#00000014;box-shadow:0 2px 10px #0000000f}.m-action__btn{flex:1;min-width:0;padding:1rem 2rem;border:none;background:transparent;text-decoration:none;color:var(--m-action-label, #1e293b);font-weight:300;font-size:.9rem;display:flex;align-items:center;justify-content:center;gap:.6rem;white-space:nowrap;overflow:hidden;cursor:pointer;border-right:1px solid #f1f5f9;transition:all .25s cubic-bezier(.4,0,.2,1)}.m-action__btn:last-child{border-right:none}.m-action__btn:hover{background:#f8fafc;color:var(--m-action-color)}.m-action__btn .m-icon{transition:transform .2s ease}.m-action__btn:hover .m-icon{transform:scale(1.1)}.m-action__btn:disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.m-action__btn.active{color:var(--m-action-color);font-weight:500}.m-action__btn.m-action__btn--icon-only{padding:1rem .5rem;gap:0}.m-action--toggle .m-action__btn{position:relative;filter:grayscale(100%);transition:all .25s cubic-bezier(.4,0,.2,1),filter .25s cubic-bezier(.4,0,.2,1)}.m-action--toggle .m-action__btn.active{filter:none}.m-action--toggle .m-action__btn.active:hover:not(:disabled){filter:none}.m-action__overflow{display:flex;align-items:center;padding:0 .5rem;flex:0 0 auto}.m-action__drop{display:block;flex:1;min-height:3.5rem;margin:.5rem;border:1px dashed currentColor;border-radius:.25rem;opacity:.4;pointer-events:none}.m-action__label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}@container mag-grid (max-width: 767.98px){.m-action__btn{padding:1rem .75rem;gap:.4rem}}@container mag-grid (max-width: 575.98px){.m-action__btn{padding:.85rem .4rem;font-size:.8rem}}\n"], dependencies: [{ kind: "ngmodule", type: i0.forwardRef(() => CommonModule) }, { kind: "directive", type: i0.forwardRef(() => i1.NgTemplateOutlet), selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i0.forwardRef(() => IconComponent), selector: "m-icon, m-one-icon", inputs: ["config", "name", "color", "size", "one", "baseUrl", "remote"], outputs: ["configChange"] }, { kind: "component", type: i0.forwardRef(() => ContextMenuComponent), selector: "m-context-menu, m-one-context-menu", inputs: ["toggle", "remote", "exclude", "visibilityRule", "disableRule", "extraData", "inverted", "options"], outputs: ["toggleChange", "action"] }, { kind: "directive", type: i0.forwardRef(() => RouterLink), selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "pipe", type: i0.forwardRef(() => TranslatePipe), name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
10645
11608
  }
10646
11609
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ActionComponent, decorators: [{
10647
11610
  type: Component,
@@ -10653,8 +11616,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
10653
11616
  RouterLink,
10654
11617
  ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
10655
11618
  '[class.m-action--host-sticky]': 'sticky()',
10656
- }, template: "@let buttons = actionButtons();\n<!-- No `config()` guard: a bar the Design editor folded its Buttons into has no\n `button_groups/<name>.yml` behind it \u2014 they ride on `[buttons]` instead\n (ADR 0009, ADR 0010) \u2014 so what decides whether the row exists is whether\n there are Buttons in it. Empty, it draws only on the Canvas, where it is\n the drop space a Button lands on. -->\n@if (buttons.length || isDesignMode) {\n <div\n class=\"m-action\"\n [class.m-action--stuck]=\"isStuck()\"\n [class.m-action--toggle]=\"resolvedVariant() === 'toggle'\"\n [class.m-action--icon-only]=\"activeSqueeze() === 'icon'\"\n >\n @for (button of visibleButtons(); track $index) {\n <!-- A routed Button is a real link, so the browser's own affordances \u2014\n a middle-click, open in new tab, the URL on hover \u2014 reach it. A\n disabled one stays a <button>: an <a> cannot be disabled, and a\n RouterLink on one would still navigate. -->\n @let link = isDisabled(button.name) ? undefined : linkOf(button);\n @if (link) {\n <a\n class=\"m-action__btn\"\n [routerLink]=\"link\"\n [attr.data-testid]=\"(button.name || '') + '-btn'\"\n [class.active]=\"isActive(button)\"\n [attr.aria-current]=\"isActive(button) ? 'page' : null\"\n [style.--m-action-color]=\"fillColor(button)\"\n [style.--m-action-color-contrast]=\"contrastColor(button)\"\n [style.--m-action-label]=\"labelColor(button)\"\n (click)=\"select(button)\"\n >\n <ng-container\n *ngTemplateOutlet=\"buttonContent; context: { $implicit: button }\"\n />\n </a>\n } @else {\n <button\n type=\"button\"\n class=\"m-action__btn\"\n [attr.data-testid]=\"(button.name || '') + '-btn'\"\n [attr.render-id]=\"renderIds()?.[button.name ?? '']\"\n [class.active]=\"isActive(button)\"\n [style.--m-action-color]=\"fillColor(button)\"\n [style.--m-action-color-contrast]=\"contrastColor(button)\"\n [style.--m-action-label]=\"labelColor(button)\"\n [disabled]=\"isDisabled(button.name)\"\n (click)=\"select(button)\"\n >\n <ng-container\n *ngTemplateOutlet=\"buttonContent; context: { $implicit: button }\"\n />\n </button>\n }\n }\n @if (menuButtons().length) {\n <!-- The Buttons the bar could not fit. Squeezed rather than dropped:\n an action the User can still reach behind one press beats an action\n that silently stopped existing at 400px. -->\n <m-context-menu\n class=\"m-action__overflow\"\n [config]=\"squeezeMenu()\"\n [remote]=\"remote() ?? config()?.remote\"\n (action)=\"onMenuAction($event)\"\n />\n }\n @if (!buttons.length) {\n <!-- A bar with nothing in it has no box, and a slot with no box is a slot\n nothing can be dropped on \u2014 the same rect an empty projected Card is\n given (m-one-ui `.card-drop-space`). -->\n <span class=\"m-action__drop\"></span>\n }\n </div>\n}\n\n<ng-template #buttonContent let-button>\n @if (button.icon) {\n <m-icon\n [name]=\"button.icon\"\n [color]=\"iconColor(button)\"\n [remote]=\"remote() ?? config()?.remote\"\n />\n }\n @if (button.label && !isLabelHidden(button)) {\n <span class=\"m-action__label\">{{ button.label | translate }}</span>\n }\n</ng-template>\n", styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}m-action,m-one-action{display:block;width:100%;grid-column:1/-1}m-action.m-action--host-sticky,m-one-action.m-action--host-sticky{position:sticky;top:0;z-index:50;background:#ffffffeb;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px)}.m-action{display:flex;flex-wrap:nowrap;background:transparent;width:100%;border-bottom:1px solid #f1f5f9;--m-action-color: var(--m-button-color, var(--m-one-button-color, var(--m-mm)));--m-action-color-contrast: var(--m-button-color-contrast, var(--m-one-button-color-contrast, #ffffff))}.m-action--stuck{border-bottom-color:#00000014;box-shadow:0 2px 10px #0000000f}.m-action__btn{flex:1;min-width:0;padding:1rem 2rem;border:none;background:transparent;text-decoration:none;color:var(--m-action-label, #1e293b);font-weight:300;font-size:.9rem;display:flex;align-items:center;justify-content:center;gap:.6rem;white-space:nowrap;overflow:hidden;cursor:pointer;border-right:1px solid #f1f5f9;transition:all .25s cubic-bezier(.4,0,.2,1)}.m-action__btn:last-child{border-right:none}.m-action__btn:hover{background:#f8fafc;color:var(--m-action-color)}.m-action__btn .m-icon{transition:transform .2s ease}.m-action__btn:hover .m-icon{transform:scale(1.1)}.m-action__btn:disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.m-action__btn.active{color:var(--m-action-color);font-weight:500}.m-action--toggle .m-action__btn{position:relative;filter:grayscale(100%);transition:all .25s cubic-bezier(.4,0,.2,1),filter .25s cubic-bezier(.4,0,.2,1)}.m-action--toggle .m-action__btn.active{filter:none}.m-action--toggle .m-action__btn.active:hover:not(:disabled){filter:none}.m-action--icon-only .m-action__btn{padding:1rem .5rem;gap:0}.m-action__overflow{display:flex;align-items:center;padding:0 .5rem;flex:0 0 auto}.m-action__drop{display:block;flex:1;min-height:3.5rem;margin:.5rem;border:1px dashed currentColor;border-radius:.25rem;opacity:.4;pointer-events:none}.m-action__label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}@container mag-grid (max-width: 767.98px){.m-action__btn{padding:1rem .75rem;gap:.4rem}}@container mag-grid (max-width: 575.98px){.m-action__btn{padding:.85rem .4rem;font-size:.8rem}}\n"] }]
10657
- }], ctorParameters: () => [], propDecorators: { sticky: [{ type: i0.Input, args: [{ isSignal: true, alias: "sticky", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], renderIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "renderIds", required: false }] }], squeezeAt: [{ type: i0.Input, args: [{ isSignal: true, alias: "squeezeAt", required: false }] }], squeezeMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "squeezeMode", required: false }] }] } });
11619
+ }, template: "@let buttons = actionButtons();\n<!-- No `config()` guard: a bar the Design editor folded its Buttons into has no\n `button_groups/<name>.yml` behind it \u2014 they ride on `[buttons]` instead\n (ADR 0009, ADR 0010) \u2014 so what decides whether the row exists is whether\n there are Buttons in it. Empty, it draws only on the Canvas, where it is\n the drop space a Button lands on. -->\n@if (buttons.length || isDesignMode) {\n <div\n class=\"m-action\"\n [class.m-action--stuck]=\"isStuck()\"\n [class.m-action--toggle]=\"resolvedVariant() === 'toggle'\"\n >\n @for (button of visibleButtons(); track $index) {\n <!-- A routed Button is a real link, so the browser's own affordances \u2014\n a middle-click, open in new tab, the URL on hover \u2014 reach it. A\n disabled one stays a <button>: an <a> cannot be disabled, and a\n RouterLink on one would still navigate. -->\n @let link = isDisabled(button.name) ? undefined : linkOf(button);\n @if (link) {\n <a\n class=\"m-action__btn\"\n [routerLink]=\"link\"\n [attr.data-testid]=\"(button.name || '') + '-btn'\"\n [class.active]=\"isActive(button)\"\n [class.m-action__btn--icon-only]=\"isLabelHidden(button)\"\n [attr.aria-label]=\"isLabelHidden(button) ? (button.label | translate) : null\"\n [attr.aria-current]=\"isActive(button) ? 'page' : null\"\n [style.--m-action-color]=\"fillColor(button)\"\n [style.--m-action-color-contrast]=\"contrastColor(button)\"\n [style.--m-action-label]=\"labelColor(button)\"\n (click)=\"select(button)\"\n >\n <ng-container\n *ngTemplateOutlet=\"buttonContent; context: { $implicit: button }\"\n />\n </a>\n } @else {\n <button\n type=\"button\"\n class=\"m-action__btn\"\n [attr.data-testid]=\"(button.name || '') + '-btn'\"\n [attr.render-id]=\"renderIds()?.[button.name ?? '']\"\n [class.active]=\"isActive(button)\"\n [class.m-action__btn--icon-only]=\"isLabelHidden(button)\"\n [attr.aria-label]=\"isLabelHidden(button) ? (button.label | translate) : null\"\n [style.--m-action-color]=\"fillColor(button)\"\n [style.--m-action-color-contrast]=\"contrastColor(button)\"\n [style.--m-action-label]=\"labelColor(button)\"\n [disabled]=\"isDisabled(button.name)\"\n (click)=\"select(button)\"\n >\n <ng-container\n *ngTemplateOutlet=\"buttonContent; context: { $implicit: button }\"\n />\n </button>\n }\n }\n @if (menuButtons().length) {\n <!-- The Buttons the bar could not fit. Squeezed rather than dropped:\n an action the User can still reach behind one press beats an action\n that silently stopped existing at 400px. -->\n <m-context-menu\n class=\"m-action__overflow\"\n [config]=\"squeezeMenu()\"\n [remote]=\"remote() ?? config()?.remote\"\n (action)=\"onMenuAction($event)\"\n />\n }\n @if (!buttons.length) {\n <!-- A bar with nothing in it has no box, and a slot with no box is a slot\n nothing can be dropped on \u2014 the same rect an empty projected Card is\n given (m-one-ui `.card-drop-space`). -->\n <span class=\"m-action__drop\"></span>\n }\n </div>\n}\n\n<ng-template #buttonContent let-button>\n @if (button.icon) {\n <m-icon\n [name]=\"button.icon\"\n [color]=\"iconColor(button)\"\n [remote]=\"remote() ?? config()?.remote\"\n />\n }\n @if (button.label && !isLabelHidden(button)) {\n <span class=\"m-action__label\">{{ button.label | translate }}</span>\n }\n</ng-template>\n", styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}m-action,m-one-action{display:block;width:100%;grid-column:1/-1}m-action.m-action--host-sticky,m-one-action.m-action--host-sticky{position:sticky;top:0;z-index:50;background:#ffffffeb;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px)}.m-action{display:flex;flex-wrap:nowrap;background:transparent;width:100%;border-bottom:1px solid #f1f5f9;--m-action-color: var(--m-button-color, var(--m-one-button-color, var(--m-mm)));--m-action-color-contrast: var(--m-button-color-contrast, var(--m-one-button-color-contrast, #ffffff))}.m-action--stuck{border-bottom-color:#00000014;box-shadow:0 2px 10px #0000000f}.m-action__btn{flex:1;min-width:0;padding:1rem 2rem;border:none;background:transparent;text-decoration:none;color:var(--m-action-label, #1e293b);font-weight:300;font-size:.9rem;display:flex;align-items:center;justify-content:center;gap:.6rem;white-space:nowrap;overflow:hidden;cursor:pointer;border-right:1px solid #f1f5f9;transition:all .25s cubic-bezier(.4,0,.2,1)}.m-action__btn:last-child{border-right:none}.m-action__btn:hover{background:#f8fafc;color:var(--m-action-color)}.m-action__btn .m-icon{transition:transform .2s ease}.m-action__btn:hover .m-icon{transform:scale(1.1)}.m-action__btn:disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.m-action__btn.active{color:var(--m-action-color);font-weight:500}.m-action__btn.m-action__btn--icon-only{padding:1rem .5rem;gap:0}.m-action--toggle .m-action__btn{position:relative;filter:grayscale(100%);transition:all .25s cubic-bezier(.4,0,.2,1),filter .25s cubic-bezier(.4,0,.2,1)}.m-action--toggle .m-action__btn.active{filter:none}.m-action--toggle .m-action__btn.active:hover:not(:disabled){filter:none}.m-action__overflow{display:flex;align-items:center;padding:0 .5rem;flex:0 0 auto}.m-action__drop{display:block;flex:1;min-height:3.5rem;margin:.5rem;border:1px dashed currentColor;border-radius:.25rem;opacity:.4;pointer-events:none}.m-action__label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}@container mag-grid (max-width: 767.98px){.m-action__btn{padding:1rem .75rem;gap:.4rem}}@container mag-grid (max-width: 575.98px){.m-action__btn{padding:.85rem .4rem;font-size:.8rem}}\n"] }]
11620
+ }], ctorParameters: () => [], propDecorators: { sticky: [{ type: i0.Input, args: [{ isSignal: true, alias: "sticky", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], active: [{ type: i0.Input, args: [{ isSignal: true, alias: "active", required: false }] }], renderIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "renderIds", required: false }] }], squeezeAt: [{ type: i0.Input, args: [{ isSignal: true, alias: "squeezeAt", required: false }] }], squeezeMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "squeezeMode", required: false }] }] } });
10658
11621
 
10659
11622
  class BaseInputComponent {
10660
11623
  focused = input(false, ...(ngDevMode ? [{ debugName: "focused" }] : /* istanbul ignore next */ []));
@@ -14864,10 +15827,6 @@ function createMap(elems, key = 'id', elemMap = {}) {
14864
15827
  }, {}) ?? {});
14865
15828
  }
14866
15829
 
14867
- function getUniqueId() {
14868
- return Date.now().toString(36) + Math.random().toString(36).substr(2);
14869
- }
14870
-
14871
15830
  /**
14872
15831
  * Ranks items based on a numeric score and provides a sequence of ranks.
14873
15832
  */
@@ -16995,454 +17954,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
16995
17954
  args: [{ providedIn: 'root' }]
16996
17955
  }] });
16997
17956
 
16998
- const MODAL_COMPONENT = new InjectionToken('MODAL_COMPONENT');
16999
- const PANEL_COMPONENT = new InjectionToken('PANEL_COMPONENT');
17000
- const CONFIRM_COMPONENT = new InjectionToken('CONFIRM_COMPONENT');
17001
- /**
17002
- * The body an overlay opened by name is filled with — what `mModal` and
17003
- * `mSidePanel` already build by hand, reached through a token here so
17004
- * `ModalStore.openScreen` can build the same thing without importing the
17005
- * component into the store (the reason the three above are tokens).
17006
- */
17007
- const OVERLAY_BODY_COMPONENT = new InjectionToken('OVERLAY_BODY_COMPONENT');
17008
-
17009
- const MODAL_REF = new InjectionToken('MODAL_REF');
17010
- class ModalRef {
17011
- closeCallback;
17012
- changeCallback;
17013
- /** Commit a result and dismiss (single-pick, confirm, …). */
17014
- close(result) {
17015
- this.closeCallback?.(result);
17016
- }
17017
- /**
17018
- * Commit a result without dismissing. Multi-pick panels use this so each
17019
- * tick updates the field while the panel stays open.
17020
- */
17021
- change(result) {
17022
- this.changeCallback?.(result);
17023
- }
17024
- onClose(callback) {
17025
- this.closeCallback = callback;
17026
- }
17027
- onChange(callback) {
17028
- this.changeCallback = callback;
17029
- }
17030
- }
17031
-
17032
- /**
17033
- * A DockedPanel takes the viewport edge and displaces the older SidePanel inboard.
17034
- * Docking is desktop-only and requires the page to stay readable behind both panels.
17035
- * See ADR 0004.
17036
- */
17037
- const DOCK_MIN_PAGE_REMAINDER = 320;
17038
- const DOCK_TRANSITION = '300ms cubic-bezier(0.2, 0, 0, 1)';
17039
- const DEFAULT_PANEL_WIDTH = '400px';
17040
- /**
17041
- * Reads a px panel width. Any other unit is undockable — the displacement offset
17042
- * must be known before the panel exists in the DOM.
17043
- */
17044
- const parsePanelWidth = (width) => {
17045
- if (!width?.endsWith('px')) {
17046
- return undefined;
17047
- }
17048
- const value = Number.parseFloat(width);
17049
- return Number.isFinite(value) ? value : undefined;
17050
- };
17051
- /**
17052
- * A CSS length as a panel needs it. An authored width is free text — the
17053
- * Screen editor takes `400` as readily as `400px` — and a unitless number is
17054
- * not a length: the browser drops the declaration and the panel collapses to
17055
- * its content. A bare number means px, which is what every other authored
17056
- * dimension in the library already assumes; anything carrying a unit, a
17057
- * percentage or a `calc()` is passed through untouched.
17058
- */
17059
- const panelCssLength = (value) => {
17060
- const trimmed = value?.trim();
17061
- if (!trimmed)
17062
- return undefined;
17063
- return /^-?\d*\.?\d+$/.test(trimmed) ? `${trimmed}px` : trimmed;
17064
- };
17065
- const hasRoomToDock = (baseWidth, panelWidth, viewportWidth) => {
17066
- const base = parsePanelWidth(baseWidth);
17067
- const panel = parsePanelWidth(panelWidth);
17068
- if (base === undefined || panel === undefined) {
17069
- return false;
17070
- }
17071
- return viewportWidth - (base + panel) >= DOCK_MIN_PAGE_REMAINDER;
17072
- };
17073
-
17074
- const initialModalState = {
17075
- modalTriggerMap: {},
17076
- className: 'modal',
17077
- parentClassName: 'modals',
17078
- activeModal: undefined,
17079
- panelTriggerMap: {},
17080
- panelClassName: 'panel',
17081
- panelParentClassName: 'panels',
17082
- activePanel: undefined,
17083
- };
17084
- const ModalStore = signalStore({ providedIn: 'root' }, withState(initialModalState), withMethods((state, domService = inject(DomService), deviceService = inject(DeviceService)) => {
17085
- // Every modal that has gone, by id. A modal is dismissed from two places —
17086
- // its own close affordance and this store — and only one of those runs
17087
- // through a ModalRef, so a caller waiting on an answer would otherwise wait
17088
- // forever on the other.
17089
- const closed = new Subject();
17090
- const modalComp = inject(MODAL_COMPONENT);
17091
- const panelComp = inject(PANEL_COMPONENT);
17092
- const confirmComp = inject(CONFIRM_COMPONENT);
17093
- const overlayBodyComp = inject(OVERLAY_BODY_COMPONENT);
17094
- const open = (modalTrigger) => {
17095
- const id = modalTrigger.id ?? getUniqueId();
17096
- const modalComponentRef = domService.create({
17097
- component: modalComp,
17098
- className: state.className(),
17099
- id,
17100
- parentClassName: state.parentClassName(),
17101
- bindings: [
17102
- inputBinding('name', () => modalTrigger.name),
17103
- inputBinding('component', () => modalTrigger.component),
17104
- inputBinding('bindings', () => modalTrigger.bindings),
17105
- inputBinding('providers', () => modalTrigger.providers),
17106
- inputBinding('one', () => modalTrigger.one ?? false),
17107
- inputBinding('instanceId', () => id),
17108
- inputBinding('config', () => modalTrigger.config),
17109
- ],
17110
- });
17111
- patchState(state, {
17112
- modalTriggerMap: {
17113
- ...state.modalTriggerMap(),
17114
- [id]: {
17115
- ...modalTrigger,
17116
- ref: modalComponentRef,
17117
- },
17118
- },
17119
- activeModal: id,
17120
- });
17121
- return id;
17122
- };
17123
- const close = (id) => {
17124
- const modalId = id ?? state.activeModal();
17125
- const modalTriggerMap = state.modalTriggerMap();
17126
- if (!modalId) {
17127
- return;
17128
- }
17129
- // A modal that has already gone. Closing it again is what a body and its
17130
- // own close affordance both doing their job looks like (ADR 0031), and
17131
- // the state patch below would hand `activeModal` to somebody else's
17132
- // overlay, so the second call answers nothing.
17133
- if (id && !modalTriggerMap[id]) {
17134
- return;
17135
- }
17136
- domService.destroy({
17137
- componentRef: modalTriggerMap[modalId]?.ref,
17138
- parentClassName: state.parentClassName(),
17139
- id: modalId,
17140
- });
17141
- delete modalTriggerMap[modalId];
17142
- const remaining = Object.keys(modalTriggerMap);
17143
- patchState(state, {
17144
- modalTriggerMap: { ...modalTriggerMap },
17145
- activeModal: remaining.length
17146
- ? remaining[remaining.length - 1]
17147
- : undefined,
17148
- });
17149
- closed.next(modalId);
17150
- };
17151
- /**
17152
- * The panel a dock request would displace: whatever currently holds the edge.
17153
- * Docking is decided once, at open — never re-evaluated on resize (ADR 0004).
17154
- */
17155
- const resolveDockTarget = (side, width) => {
17156
- if (!deviceService.isDesktop()) {
17157
- return undefined;
17158
- }
17159
- const baseId = state.activePanel();
17160
- const base = baseId ? state.panelTriggerMap()[baseId] : undefined;
17161
- if (!baseId || !base || (base.side ?? 'right') !== side) {
17162
- return undefined;
17163
- }
17164
- const viewportWidth = typeof window === 'undefined' ? 0 : window.innerWidth;
17165
- return hasRoomToDock(base.width, width, viewportWidth)
17166
- ? baseId
17167
- : undefined;
17168
- };
17169
- const openPanel = (panelTrigger) => {
17170
- const id = panelTrigger.id ?? getUniqueId();
17171
- const side = panelTrigger.side ?? 'right';
17172
- // Authored free text, made a CSS length: a unitless `400` is dropped by
17173
- // the browser and the panel opens at the width of its own content.
17174
- const width = panelCssLength(panelTrigger.width) ?? DEFAULT_PANEL_WIDTH;
17175
- const height = panelCssLength(panelTrigger.height);
17176
- const isMobile = deviceService.isMobile();
17177
- if (panelTrigger.dock) {
17178
- const activeId = state.activePanel();
17179
- // Max two panels: a further dock request replaces the current DockedPanel,
17180
- // which restores the panel underneath to the edge before we displace it again.
17181
- if (activeId && state.panelTriggerMap()[activeId]?.dockedOver) {
17182
- closePanel(activeId);
17183
- }
17184
- }
17185
- const dockedOver = panelTrigger.dock
17186
- ? resolveDockTarget(side, width)
17187
- : undefined;
17188
- const styles = isMobile
17189
- ? {
17190
- position: 'fixed',
17191
- bottom: '0',
17192
- left: '0',
17193
- width: '100%',
17194
- height: '90%',
17195
- zIndex: '1000',
17196
- }
17197
- : {
17198
- position: 'fixed',
17199
- top: '0',
17200
- bottom: '0',
17201
- [side]: '0',
17202
- width,
17203
- zIndex: '1000',
17204
- transition: `${side} ${DOCK_TRANSITION}`,
17205
- };
17206
- const panelComponentRef = domService.create({
17207
- component: panelComp,
17208
- className: `${state.panelClassName()} panel--${side}`,
17209
- id,
17210
- parentClassName: state.panelParentClassName(),
17211
- styles,
17212
- bindings: [
17213
- inputBinding('component', () => panelTrigger.component),
17214
- inputBinding('bindings', () => panelTrigger.bindings),
17215
- inputBinding('providers', () => panelTrigger.providers),
17216
- inputBinding('side', () => side),
17217
- inputBinding('instanceId', () => id),
17218
- inputBinding('docked', () => !!state.panelTriggerMap()[id]?.dockedOver),
17219
- inputBinding('height', () => height),
17220
- inputBinding('closeProhibited', () => !!panelTrigger.closeProhibited),
17221
- ],
17222
- });
17223
- if (dockedOver) {
17224
- domService.updateStyleById({
17225
- id: dockedOver,
17226
- parentClassName: state.panelParentClassName(),
17227
- styles: { [side]: width },
17228
- });
17229
- }
17230
- patchState(state, {
17231
- panelTriggerMap: {
17232
- ...state.panelTriggerMap(),
17233
- [id]: {
17234
- ...panelTrigger,
17235
- side,
17236
- width,
17237
- dockedOver,
17238
- ref: panelComponentRef,
17239
- },
17240
- },
17241
- activePanel: id,
17242
- });
17243
- return id;
17244
- };
17245
- const closePanel = (id) => {
17246
- const panelId = id ?? state.activePanel();
17247
- const panelTriggerMap = state.panelTriggerMap();
17248
- if (!panelId) {
17249
- return;
17250
- }
17251
- // A panel that has already gone — `close`'s reason, and here it would
17252
- // also promote a DockedPanel a second time.
17253
- if (id && !panelTriggerMap[id]) {
17254
- return;
17255
- }
17256
- const closing = panelTriggerMap[panelId];
17257
- domService.destroy({
17258
- componentRef: closing?.ref,
17259
- parentClassName: state.panelParentClassName(),
17260
- id: panelId,
17261
- });
17262
- delete panelTriggerMap[panelId];
17263
- // Closing a DockedPanel returns the panel it displaced to the edge.
17264
- if (closing?.dockedOver && panelTriggerMap[closing.dockedOver]) {
17265
- domService.updateStyleById({
17266
- id: closing.dockedOver,
17267
- parentClassName: state.panelParentClassName(),
17268
- styles: { [closing.side ?? 'right']: '0' },
17269
- });
17270
- }
17271
- // Closing a displaced panel promotes its DockedPanel: already at the edge,
17272
- // so nothing moves — its seam just goes dashed -> solid.
17273
- const promotedId = Object.keys(panelTriggerMap).find((key) => panelTriggerMap[key]?.dockedOver === panelId);
17274
- if (promotedId) {
17275
- panelTriggerMap[promotedId] = {
17276
- ...panelTriggerMap[promotedId],
17277
- dockedOver: undefined,
17278
- };
17279
- }
17280
- const remaining = Object.keys(panelTriggerMap);
17281
- patchState(state, {
17282
- panelTriggerMap: { ...panelTriggerMap },
17283
- activePanel: remaining.length
17284
- ? remaining[remaining.length - 1]
17285
- : undefined,
17286
- });
17287
- };
17288
- const cleanupOnClose = rxMethod(pipe(filter((modalMap) => !Object.keys(modalMap).length), tap(() => {
17289
- domService.cleanup(state.parentClassName());
17290
- })));
17291
- const cleanupPanelsOnClose = rxMethod(pipe(filter((panelMap) => !Object.keys(panelMap).length), tap(() => {
17292
- domService.cleanup(state.panelParentClassName());
17293
- })));
17294
- /**
17295
- * The question as a value: subscribing asks it, and the single emission is
17296
- * the answer — `true` for the commit, `false` for a refusal and for a
17297
- * dismissal, which is a refusal by another route. Completes with that
17298
- * emission, so a `switchMap` over it moves on rather than holding the
17299
- * modal's answer open.
17300
- *
17301
- * Unsubscribing before it answers takes the modal away with it: the caller
17302
- * that asked is gone, and a dialog nothing is waiting on is a dialog whose
17303
- * answer lands nowhere.
17304
- */
17305
- const ask = (opts) => new Observable((subscriber) => {
17306
- const modalRef = new ModalRef();
17307
- let settled = false;
17308
- let id = '';
17309
- const settle = (result, dismiss) => {
17310
- if (settled)
17311
- return;
17312
- settled = true;
17313
- watch.unsubscribe();
17314
- if (dismiss)
17315
- close(id);
17316
- subscriber.next(result);
17317
- subscriber.complete();
17318
- };
17319
- const watch = closed
17320
- .pipe(filter((closedId) => closedId === id))
17321
- .subscribe(() => settle(false, false));
17322
- id = open({
17323
- component: confirmComp,
17324
- providers: [{ provide: MODAL_REF, useValue: modalRef }],
17325
- bindings: [
17326
- inputBinding('header', () => opts.header ?? ''),
17327
- inputBinding('body', () => opts.body ?? ''),
17328
- inputBinding('params', () => opts.params ?? {}),
17329
- inputBinding('type', () => opts.type ?? 'info'),
17330
- inputBinding('kind', () => opts.kind ?? 'yes'),
17331
- inputBinding('confirmLabel', () => opts.confirmLabel ?? ''),
17332
- inputBinding('cancelLabel', () => opts.cancelLabel ?? ''),
17333
- ],
17334
- });
17335
- modalRef.onClose((result) => settle(!!result, true));
17336
- return () => {
17337
- if (settled)
17338
- return;
17339
- settled = true;
17340
- watch.unsubscribe();
17341
- close(id);
17342
- };
17343
- });
17344
- /**
17345
- * Opens one Screen as an overlay and hands it its inputs — what a
17346
- * generated FeatureStore calls where a Control's `mModal` would be the
17347
- * drawn answer (m-one-ui OpenScreen).
17348
- *
17349
- * The same body the two directives build, reached the same way: the widget
17350
- * is loaded on first open, so nothing it names is in the initial bundle.
17351
- * Returns the overlay's own id and waits for nothing — the caller is a
17352
- * `tap` inside a request pipe, and a store that held its emission open
17353
- * until a panel closed would be answering for a gesture nobody made.
17354
- */
17355
- const openScreen = (trigger) => {
17356
- const bindings = [
17357
- inputBinding('widget', () => trigger.widget),
17358
- inputBinding('inputs', () => trigger.inputs ?? {}),
17359
- // The body binds these onto the Screen it creates (ADR 0033). A
17360
- // Screen the opener listens to nothing of hands an empty record,
17361
- // which binds nothing at all.
17362
- inputBinding('outputs', () => trigger.outputs ?? {}),
17363
- ];
17364
- // Its own ModalRef, the way each directive mints one: the body closes
17365
- // itself through this. Nothing here listens for the *result* — a store
17366
- // has nowhere to put a panel's answer — but the close dismisses, which is
17367
- // the whole of what a body opened this way can ask for (ADR 0031).
17368
- const modalRef = new ModalRef();
17369
- // What the body answered reaches the caller either way (ADR 0031): a
17370
- // `change` reports and the overlay stays, a `close` reports and then it
17371
- // goes. The order on a close is deliberate — a handler that reads the
17372
- // Screen it opened must run while that Screen is still there.
17373
- modalRef.onChange((result) => trigger.onResult?.(result));
17374
- const providers = [{ provide: MODAL_REF, useValue: modalRef }];
17375
- if (trigger.as === 'side_panel') {
17376
- const panelId = openPanel({
17377
- component: overlayBodyComp,
17378
- bindings,
17379
- providers,
17380
- side: trigger.side,
17381
- width: trigger.width,
17382
- height: trigger.height,
17383
- dock: trigger.dock,
17384
- closeProhibited: trigger.closeProhibited,
17385
- });
17386
- modalRef.onClose((result) => {
17387
- trigger.onResult?.(result);
17388
- closePanel(panelId);
17389
- });
17390
- return panelId;
17391
- }
17392
- const modalId = open({
17393
- component: overlayBodyComp,
17394
- bindings,
17395
- providers,
17396
- config: trigger.config,
17397
- });
17398
- modalRef.onClose((result) => {
17399
- trigger.onResult?.(result);
17400
- close(modalId);
17401
- });
17402
- return modalId;
17403
- };
17404
- /**
17405
- * Closes the overlay with this id, whichever kind it is — what a caller
17406
- * holding only what `openScreen` returned can say (ADR 0031). Nothing for
17407
- * an id nothing answers to, which is what a body that already closed itself
17408
- * leaves behind.
17409
- */
17410
- const dismiss = (id) => {
17411
- if (state.modalTriggerMap()[id]) {
17412
- close(id);
17413
- return;
17414
- }
17415
- if (state.panelTriggerMap()[id])
17416
- closePanel(id);
17417
- };
17418
- // The callback form, kept for every caller drawn against it. One
17419
- // implementation underneath: a refusal runs nothing, which is what an
17420
- // `onConfirm` that never fires already meant.
17421
- const confirm = (opts, onConfirm) => {
17422
- ask(opts).subscribe((result) => {
17423
- if (result)
17424
- onConfirm();
17425
- });
17426
- };
17427
- return {
17428
- open,
17429
- close,
17430
- dismiss,
17431
- ask,
17432
- confirm,
17433
- openScreen,
17434
- openPanel,
17435
- closePanel,
17436
- cleanupOnClose,
17437
- cleanupPanelsOnClose,
17438
- };
17439
- }), withHooks({
17440
- onInit({ cleanupOnClose, modalTriggerMap, cleanupPanelsOnClose, panelTriggerMap, }) {
17441
- cleanupOnClose(modalTriggerMap);
17442
- cleanupPanelsOnClose(panelTriggerMap);
17443
- },
17444
- }));
17445
-
17446
17957
  const USER_TAB_MAP = new InjectionToken('USER_TAB_MAP');
17447
17958
  const WIN_USER_TAB_HOOK = '__mag_register_user_tabs__';
17448
17959
  const WIN_USER_TAB_KEY = '__mag_user_tabs__';
@@ -17876,169 +18387,6 @@ function injectAuthenticate() {
17876
18387
  };
17877
18388
  }
17878
18389
 
17879
- class ConfirmComponent {
17880
- header = input('', ...(ngDevMode ? [{ debugName: "header" }] : /* istanbul ignore next */ []));
17881
- body = input('', ...(ngDevMode ? [{ debugName: "body" }] : /* istanbul ignore next */ []));
17882
- /**
17883
- * The MessageVariable values the two keys above name — a row's name or id the
17884
- * asker knows and the message asks about. Values and never text: they reach
17885
- * `TranslatePipe` as params rather than spliced into the key, so the message
17886
- * still resolves per language. Empty is a message with no slots, which is
17887
- * every confirmation drawn before this.
17888
- */
17889
- params = input({}, ...(ngDevMode ? [{ debugName: "params" }] : /* istanbul ignore next */ []));
17890
- type = input('info', ...(ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []));
17891
- /**
17892
- * Whether the question can be refused. `yes` is an acknowledgement — the one
17893
- * button commits and there is nothing else to press — and stays the default,
17894
- * which is what every ConfirmComponent drawn before this was.
17895
- */
17896
- kind = input('yes', ...(ngDevMode ? [{ debugName: "kind" }] : /* istanbul ignore next */ []));
17897
- /**
17898
- * The wording of each button, as a TranslationAsset key. Empty falls back to
17899
- * the library's own — derived from `type` for the commit, `cancel` for the
17900
- * refusal — so a caller that has nothing to say about the buttons says
17901
- * nothing.
17902
- */
17903
- confirmLabel = input('', ...(ngDevMode ? [{ debugName: "confirmLabel" }] : /* istanbul ignore next */ []));
17904
- cancelLabel = input('', ...(ngDevMode ? [{ debugName: "cancelLabel" }] : /* istanbul ignore next */ []));
17905
- #modalRef = inject(MODAL_REF);
17906
- confirmText = computed(() => {
17907
- if (this.confirmLabel())
17908
- return this.confirmLabel();
17909
- switch (this.type()) {
17910
- case 'danger':
17911
- return 'delete';
17912
- default:
17913
- return 'okay';
17914
- }
17915
- }, ...(ngDevMode ? [{ debugName: "confirmText" }] : /* istanbul ignore next */ []));
17916
- cancelText = computed(() => this.cancelLabel() || 'cancel', ...(ngDevMode ? [{ debugName: "cancelText" }] : /* istanbul ignore next */ []));
17917
- iconName = computed(() => {
17918
- switch (this.type()) {
17919
- case 'danger':
17920
- return 'trash';
17921
- case 'warning':
17922
- return 'exclamation-triangle';
17923
- case 'success':
17924
- return 'check-circle';
17925
- default:
17926
- return 'info';
17927
- }
17928
- }, ...(ngDevMode ? [{ debugName: "iconName" }] : /* istanbul ignore next */ []));
17929
- accept() {
17930
- this.#modalRef.close(true);
17931
- }
17932
- // The refusal is a result like any other, so it closes with `false` rather
17933
- // than dismissing: a caller waiting on the answer gets one either way.
17934
- decline() {
17935
- this.#modalRef.close(false);
17936
- }
17937
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ConfirmComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
17938
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: ConfirmComponent, isStandalone: true, selector: "m-confirm", inputs: { header: { classPropertyName: "header", publicName: "header", isSignal: true, isRequired: false, transformFunction: null }, body: { classPropertyName: "body", publicName: "body", isSignal: true, isRequired: false, transformFunction: null }, params: { classPropertyName: "params", publicName: "params", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, kind: { classPropertyName: "kind", publicName: "kind", isSignal: true, isRequired: false, transformFunction: null }, confirmLabel: { classPropertyName: "confirmLabel", publicName: "confirmLabel", isSignal: true, isRequired: false, transformFunction: null }, cancelLabel: { classPropertyName: "cancelLabel", publicName: "cancelLabel", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
17939
- <div class="confirm confirm--{{ type() }}">
17940
- <div class="confirm__header">
17941
- <div class="confirm__icon">
17942
- <m-icon [name]="iconName()" />
17943
- </div>
17944
- @if (header()) {
17945
- <!-- The heading takes the key and its values rather than projected
17946
- text: m-header translates its own label, and a MessageVariable
17947
- fills the same way it does everywhere else. -->
17948
- <m-header [level]="3" [label]="header()" [params]="params()" />
17949
- }
17950
- </div>
17951
-
17952
- <div class="confirm__content">
17953
- @if (body()) {
17954
- <p class="confirm__body" [innerHTML]="body() | translate: params()"></p>
17955
- }
17956
- </div>
17957
-
17958
- <div class="confirm__actions">
17959
- @if (kind() === 'yes-no') {
17960
- <!-- asset: buttons/confirm_cancel.yml -->
17961
- <m-one-button name="confirm_cancel" [label]="cancelText()" (clicked)="decline()" />
17962
- }
17963
- <!-- asset: buttons/okay.yml -->
17964
- <m-one-button name="okay" [label]="confirmText()" (clicked)="accept()" />
17965
- </div>
17966
- </div>
17967
- `, isInline: true, styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}.confirm{display:flex;flex-direction:column;min-width:320px;max-width:440px;padding:2.5rem;background:var(--m-backdrop-modal, rgba(255, 255, 255, .85));backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border:0;position:relative;overflow:hidden}.confirm__header{display:flex;flex-direction:column;align-items:center;text-align:center;gap:.9375rem;margin-bottom:1.5rem}.confirm__icon{width:64px;height:64px;border-radius:1.6rem;display:flex;align-items:center;justify-content:center;font-size:2rem;background:var(--m-backdrop-mm, rgba(65, 105, 225, .1));color:var(--m-mm, #4169e1)}.confirm__icon .m-icon{width:32px;height:32px}.confirm__title{margin:0;font-size:1.375rem;font-weight:700;color:var(--m-text-900);letter-spacing:-.02em}.confirm__content{text-align:center;margin-bottom:2rem}.confirm__body{margin:0;font-size:1rem;line-height:1.6;color:var(--m-text-600)}.confirm__actions{width:100%;margin-top:auto;display:flex;justify-content:center;gap:1rem}.confirm--danger .confirm__icon{background:var(--m-backdrop-error, rgba(235, 25, 26, .1));color:var(--m-error, #EB191A)}.confirm--warning .confirm__icon{background:var(--m-backdrop-warning, rgba(247, 122, 2, .1));color:var(--m-warning, #F77A02)}.confirm--success .confirm__icon{background:var(--m-backdrop-success, rgba(109, 168, 47, .1));color:var(--m-success, #6da82f)}.confirm--info .confirm__icon{background:var(--m-info-lite, rgba(3, 102, 214, .1));color:var(--m-info, #0366d6)}\n"], dependencies: [{ kind: "component", type: ButtonComponent, selector: "m-button,m-one-button", inputs: ["config", "color", "labelClass", "fullWidth", "nav", "navParams", "href", "disabled", "variant", "name", "baseUrl", "one", "remote", "label", "noTranslate", "params", "noNative", "icon", "isRightIcon", "iconOnly", "stacked", "imgSrc", "nonClickable", "inverted", "isSubmit", "tabindex"], outputs: ["configChange", "clicked"] }, { kind: "component", type: IconComponent, selector: "m-icon, m-one-icon", inputs: ["config", "name", "color", "size", "one", "baseUrl", "remote"], outputs: ["configChange"] }, { kind: "component", type: HeaderComponent$1, selector: "m-header", inputs: ["level", "label", "icon", "actionButton", "actionLabel", "noTranslate", "params"], outputs: ["actionClick"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
17968
- }
17969
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ConfirmComponent, decorators: [{
17970
- type: Component,
17971
- args: [{ selector: 'm-confirm', imports: [ButtonComponent, IconComponent, TranslatePipe, HeaderComponent$1], template: `
17972
- <div class="confirm confirm--{{ type() }}">
17973
- <div class="confirm__header">
17974
- <div class="confirm__icon">
17975
- <m-icon [name]="iconName()" />
17976
- </div>
17977
- @if (header()) {
17978
- <!-- The heading takes the key and its values rather than projected
17979
- text: m-header translates its own label, and a MessageVariable
17980
- fills the same way it does everywhere else. -->
17981
- <m-header [level]="3" [label]="header()" [params]="params()" />
17982
- }
17983
- </div>
17984
-
17985
- <div class="confirm__content">
17986
- @if (body()) {
17987
- <p class="confirm__body" [innerHTML]="body() | translate: params()"></p>
17988
- }
17989
- </div>
17990
-
17991
- <div class="confirm__actions">
17992
- @if (kind() === 'yes-no') {
17993
- <!-- asset: buttons/confirm_cancel.yml -->
17994
- <m-one-button name="confirm_cancel" [label]="cancelText()" (clicked)="decline()" />
17995
- }
17996
- <!-- asset: buttons/okay.yml -->
17997
- <m-one-button name="okay" [label]="confirmText()" (clicked)="accept()" />
17998
- </div>
17999
- </div>
18000
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}.confirm{display:flex;flex-direction:column;min-width:320px;max-width:440px;padding:2.5rem;background:var(--m-backdrop-modal, rgba(255, 255, 255, .85));backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border:0;position:relative;overflow:hidden}.confirm__header{display:flex;flex-direction:column;align-items:center;text-align:center;gap:.9375rem;margin-bottom:1.5rem}.confirm__icon{width:64px;height:64px;border-radius:1.6rem;display:flex;align-items:center;justify-content:center;font-size:2rem;background:var(--m-backdrop-mm, rgba(65, 105, 225, .1));color:var(--m-mm, #4169e1)}.confirm__icon .m-icon{width:32px;height:32px}.confirm__title{margin:0;font-size:1.375rem;font-weight:700;color:var(--m-text-900);letter-spacing:-.02em}.confirm__content{text-align:center;margin-bottom:2rem}.confirm__body{margin:0;font-size:1rem;line-height:1.6;color:var(--m-text-600)}.confirm__actions{width:100%;margin-top:auto;display:flex;justify-content:center;gap:1rem}.confirm--danger .confirm__icon{background:var(--m-backdrop-error, rgba(235, 25, 26, .1));color:var(--m-error, #EB191A)}.confirm--warning .confirm__icon{background:var(--m-backdrop-warning, rgba(247, 122, 2, .1));color:var(--m-warning, #F77A02)}.confirm--success .confirm__icon{background:var(--m-backdrop-success, rgba(109, 168, 47, .1));color:var(--m-success, #6da82f)}.confirm--info .confirm__icon{background:var(--m-info-lite, rgba(3, 102, 214, .1));color:var(--m-info, #0366d6)}\n"] }]
18001
- }], propDecorators: { header: [{ type: i0.Input, args: [{ isSignal: true, alias: "header", required: false }] }], body: [{ type: i0.Input, args: [{ isSignal: true, alias: "body", required: false }] }], params: [{ type: i0.Input, args: [{ isSignal: true, alias: "params", required: false }] }], type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }], kind: [{ type: i0.Input, args: [{ isSignal: true, alias: "kind", required: false }] }], confirmLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "confirmLabel", required: false }] }], cancelLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "cancelLabel", required: false }] }] } });
18002
-
18003
- function injectInstallApp() {
18004
- const modalStore = inject(ModalStore);
18005
- const httpService = inject(HttpService);
18006
- return (app) => {
18007
- const appName = app.name ?? app.link ?? '';
18008
- const appId = app.id ?? '';
18009
- return new Promise((resolve, reject) => {
18010
- const modalRef = new ModalRef();
18011
- const id = modalStore.open({
18012
- component: ConfirmComponent,
18013
- providers: [{ provide: MODAL_REF, useValue: modalRef }],
18014
- bindings: [
18015
- inputBinding('header', () => `install_app_title?appName=${appName}`),
18016
- inputBinding('body', () => `install_app_body?appName=${appName}`),
18017
- inputBinding('type', () => 'info'),
18018
- ],
18019
- });
18020
- modalRef.onClose(async (confirmed) => {
18021
- modalStore.close(id);
18022
- if (!confirmed) {
18023
- reject(new Error('app_install_declined'));
18024
- return;
18025
- }
18026
- try {
18027
- const body = await firstValueFrom(httpService.post('store', ['request', appId], {}));
18028
- if (body?.relation?.type === 5) {
18029
- reject({ type: 'install_pending', appName });
18030
- return;
18031
- }
18032
- resolve();
18033
- }
18034
- catch (e) {
18035
- reject(e);
18036
- }
18037
- });
18038
- });
18039
- };
18040
- }
18041
-
18042
18390
  /**
18043
18391
  * Pre-creates signal-to-observable conversions at service instantiation time
18044
18392
  * (always outside reactive context), preventing NG0602 when interceptors run
@@ -18117,7 +18465,7 @@ class NotificationService {
18117
18465
  ...notification,
18118
18466
  timestamp: notification.timestamp ?? new Date().toISOString(),
18119
18467
  });
18120
- if (!notification.persistent) {
18468
+ if (!notification.persistent && !notification.silent) {
18121
18469
  this.scheduleAutoClose(id);
18122
18470
  }
18123
18471
  return id;
@@ -18199,7 +18547,13 @@ const tokenRefreshed$ = new Subject();
18199
18547
  // Holds the refresh token while the refresh HTTP call is in-flight.
18200
18548
  // Must be stored before clearAuth() erases it from the store.
18201
18549
  let pendingRefreshToken = null;
18202
- // Deduplicates concurrent app_access_required 403s — only one install modal at a time.
18550
+ /**
18551
+ * The header naming which App sent a request (api ADR 0007): a domain api
18552
+ * honours a Declared Permission only for the App it names.
18553
+ */
18554
+ const CALLING_APP_HEADER = 'X-Mag-App';
18555
+ // Deduplicates concurrent app_access_required / agreement_required 403s — only
18556
+ // one install or Agreement modal at a time.
18203
18557
  // Subsequent failures queue on tokenRefreshed$/authFailed$ rather than opening a second modal.
18204
18558
  const appInstallGuard = { pending: null };
18205
18559
  function getTokenizedReq(request, { auth }) {
@@ -18207,14 +18561,19 @@ function getTokenizedReq(request, { auth }) {
18207
18561
  headers: request.headers.set('Authorization', auth),
18208
18562
  });
18209
18563
  }
18210
- const mInterceptor = (request, next) => {
18564
+ const mInterceptor = (incoming, next) => {
18211
18565
  const httpService = inject(HttpService);
18212
18566
  const injector = inject(Injector);
18213
18567
  const baseUrl = httpService.getUrl();
18214
18568
  const authBaseUrl = httpService.getAuthUrl();
18215
- const isBackend = request.url.startsWith(baseUrl) || request.url.startsWith(authBaseUrl);
18569
+ const isBackend = incoming.url.startsWith(baseUrl) || incoming.url.startsWith(authBaseUrl);
18570
+ const appLink = inject(APP_LINK)();
18571
+ const request = appLink && incoming.url.startsWith(baseUrl)
18572
+ ? incoming.clone({ setHeaders: { [CALLING_APP_HEADER]: appLink } })
18573
+ : incoming;
18216
18574
  const authenticate = injectAuthenticate();
18217
18575
  const installApp = injectInstallApp();
18576
+ const agreeToApp = injectAgreeToApp();
18218
18577
  const store = inject(LOGIN_STORE);
18219
18578
  const authObs = inject(InterceptorObservables);
18220
18579
  const tokens = store?.tokens();
@@ -18259,6 +18618,23 @@ const mInterceptor = (request, next) => {
18259
18618
  const waitForToken = () => race(tokenRefreshed$.pipe(take(1), switchMap$1(() => sendWithToken())), authFailed$.pipe(take(1), switchMap$1((err) => throwError(() => err))));
18260
18619
  const on403 = (error) => {
18261
18620
  const hint = error.error?.hint;
18621
+ // The App's Declared Permissions grew since the user agreed, or they never
18622
+ // did (store ADR 0006): ask, record it, and resend.
18623
+ if (hint?.type === 'agreement_required' && hint.app) {
18624
+ actions.cancelLoading();
18625
+ if (!appInstallGuard.pending) {
18626
+ appInstallGuard.pending = agreeToApp(hint.app, hint.permissions ?? [])
18627
+ .then(() => {
18628
+ appInstallGuard.pending = null;
18629
+ tokenRefreshed$.next();
18630
+ })
18631
+ .catch(() => {
18632
+ appInstallGuard.pending = null;
18633
+ authFailed$.next(error);
18634
+ });
18635
+ }
18636
+ return waitForToken();
18637
+ }
18262
18638
  if (hint?.type === 'app_access_required' && hint.app) {
18263
18639
  actions.cancelLoading();
18264
18640
  if (!appInstallGuard.pending) {
@@ -18448,6 +18824,8 @@ class BaseRootWebComponent extends BaseWebComponent {
18448
18824
  searchGroups = inject(WC_SEARCH_GROUPS, { optional: true });
18449
18825
  /** The custom element itself: the one channel two mounts of this app do not share. */
18450
18826
  host = inject(ElementRef).nativeElement;
18827
+ ownAppLink = inject(APP_LINK);
18828
+ agreementGate = inject(AgreementGate);
18451
18829
  constructor() {
18452
18830
  super();
18453
18831
  effect(() => {
@@ -18515,6 +18893,18 @@ class BaseRootWebComponent extends BaseWebComponent {
18515
18893
  if (id && !appId)
18516
18894
  untracked(() => bindApp(id));
18517
18895
  });
18896
+ // m-remote's `appLink` is who this app is, even where the page URL names
18897
+ // the app that mounted it. Named late, so Agreement is asked here rather
18898
+ // than at init (store ADR 0006).
18899
+ effect(() => {
18900
+ const id = this.appLink();
18901
+ if (!id || id === untracked(this.ownAppLink))
18902
+ return;
18903
+ untracked(() => {
18904
+ this.ownAppLink.set(id);
18905
+ this.agreementGate.ensure(id);
18906
+ });
18907
+ });
18518
18908
  // Run initial sync when router is ready
18519
18909
  this.router.initialNavigation();
18520
18910
  const initialPath = this.extra();
@@ -19241,7 +19631,7 @@ class SectionTableComponent extends ConfigComponent {
19241
19631
  </div>
19242
19632
  <ng-content select="m-section-pagination" />
19243
19633
  </div>
19244
- `, 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-table{display:flex;flex-direction:column;border:1px solid var(--m-backdrop-border);border-radius:12px;overflow:clip;background:#ffffffe6;-webkit-backdrop-filter:blur(40px);backdrop-filter:blur(40px);position:relative;transition:background-color .3s ease}.m-table--flat{border:none;box-shadow:none;background:transparent;-webkit-backdrop-filter:none;backdrop-filter:none;border-radius:0}.m-table__toolbar{position:sticky;top:0;z-index:2;display:flex;align-items:center;justify-content:space-between;padding:1.5rem var(--m-table-toolbar-padding-x, 1.25rem);border-bottom:1px solid var(--m-backdrop-border);gap:1.5rem;background:color-mix(in srgb,var(--m-background) 45%,transparent)}.m-table--flat .m-table__toolbar{background:transparent;padding-left:0;padding-right:0}.m-table__title{margin:0;font-size:1.25rem;font-weight:800;color:var(--m-text);letter-spacing:-.02em;flex:1}.m-table__search{flex:0 1 auto;display:flex;align-items:center}.m-table__search .m-input-wrapper{width:100%}.m-table__mobile-view{display:flex;flex-direction:column;gap:1rem;padding:1.25rem;flex:1;overflow:auto}.m-table__empty-mobile{padding:3rem 1.5rem;text-align:center;color:var(--m-text-tertiary);font-size:.9375rem;font-weight:500;font-style:italic;opacity:.8;background:color-mix(in srgb,var(--m-background) 20%,transparent);border-radius:12px;border:1px dashed var(--m-backdrop-border)}.m-table__wrapper{overflow:auto;flex:1}.m-table__wrapper::-webkit-scrollbar{width:6px;height:6px}.m-table__wrapper::-webkit-scrollbar-track{background:transparent}.m-table__wrapper::-webkit-scrollbar-thumb{background:var(--m-backdrop-border);border-radius:10px}.m-table__wrapper::-webkit-scrollbar-thumb:hover{background:var(--m-text-tertiary)}.m-table__table{width:100%;min-width:100%;border-collapse:separate;border-spacing:0}mark.m-table__highlight{background:var(--m-highlight);color:#000;border-radius:2px;padding:0 2px;font-weight:700;box-shadow:0 1px 4px #0003}mark.m-table__highlight .m-one-pagination{margin-left:auto;--m-button-size: 2.25rem;--m-pagination-gap: .375rem}.m-table-pagination{display:flex;align-items:center;gap:1.5rem;padding:1.25rem var(--m-table-pagination-padding-x, 1.25rem);border-top:1px solid var(--m-backdrop-border);font-size:.8125rem;flex-wrap:wrap;background:color-mix(in srgb,var(--m-background) 40%,transparent)}.m-table--flat .m-table-pagination{background:transparent;padding-left:0;padding-right:0}.m-table-pagination__size{display:flex;flex-direction:column;align-items:flex-start;gap:.35rem;color:var(--m-text-secondary);font-weight:500}.m-table-pagination__select{border:1px solid var(--m-backdrop-border);border-radius:8px;background:var(--m-backdrop-surface);color:var(--m-text);padding:.375rem .625rem;font-size:.8125rem;font-weight:600;cursor:pointer;transition:all .2s cubic-bezier(.4,0,.2,1);outline:none}.m-table-pagination__select:hover{background:var(--m-backdrop-glass);border-color:var(--m-mm);box-shadow:0 0 0 3px color-mix(in srgb,var(--m-mm) 10%,transparent)}.m-table-pagination__select:focus{border-color:var(--m-mm);box-shadow:0 0 0 3px color-mix(in srgb,var(--m-mm) 20%,transparent)}.m-table-filter{display:flex;flex-wrap:wrap;align-items:center;gap:10px;padding:1rem 1.25rem;background:color-mix(in srgb,var(--m-background-lite) 60%,transparent);border-bottom:1px solid var(--m-backdrop-border);box-shadow:inset 0 2px 4px #00000005;overflow-x:auto;scrollbar-width:none}.m-table-filter::-webkit-scrollbar{display:none}.m-table--flat .m-table-filter{background:transparent;padding-left:0;padding-right:0;border-bottom:none}.m-table-filter__item{display:flex;align-items:center;gap:10px;padding:.4375rem 1rem;border-radius:12px;background:var(--m-background);border:1px solid var(--m-backdrop-border);color:var(--m-text-secondary);cursor:pointer;transition:all .2s cubic-bezier(.4,0,.2,1);white-space:nowrap;-webkit-user-select:none;user-select:none;outline:none;font-weight:500}.m-table-filter__item:hover{border-color:var(--m-mm);color:var(--m-mm);background:var(--m-background);transform:translateY(-1px);box-shadow:0 4px 12px #0000000d}.m-table-filter__item--active{background:var(--m-mm);border-color:var(--m-mm);color:var(--m-inverse-text);font-weight:600;box-shadow:0 8px 16px color-mix(in srgb,var(--m-mm) 25%,transparent)}.m-table-filter__item--active:hover{background:var(--m-mm);border-color:var(--m-mm);color:var(--m-inverse-text);transform:translateY(-1px)}.m-table-filter__item--active .m-table-filter__badge{background:#fff3;color:var(--m-inverse-text);border-color:#ffffff1a}.m-table-filter__item--primary{background:var(--m-mm);border-color:var(--m-mm);color:var(--m-inverse-text);font-weight:600;box-shadow:0 8px 16px color-mix(in srgb,var(--m-mm) 25%,transparent)}.m-table-filter__item--primary:hover{background:var(--m-mm);border-color:var(--m-mm);color:var(--m-inverse-text);transform:translateY(-1px);box-shadow:0 10px 20px color-mix(in srgb,var(--m-mm) 30%,transparent)}.m-table-filter__item--primary .m-table-filter__badge{background:#fff3;color:var(--m-inverse-text);border-color:#ffffff1a}.m-table-filter__item--danger{border-color:var(--m-error);color:var(--m-error)}.m-table-filter__item--danger:hover{border-color:var(--m-error);color:var(--m-error);background:var(--m-backdrop-error);transform:translateY(-1px);box-shadow:0 4px 12px color-mix(in srgb,var(--m-error) 12%,transparent)}.m-table-filter__item--danger .m-table-filter__badge{background:var(--m-backdrop-error);color:var(--m-error);border-color:color-mix(in srgb,var(--m-error) 20%,transparent)}.m-table-filter__label{font-size:.8125rem;font-weight:600;letter-spacing:.01em}.m-table-filter__badge{display:inline-flex;align-items:center;justify-content:center;min-width:1.25rem;height:1.25rem;padding:0 .375rem;border-radius:100px;background:var(--m-backdrop-surface);color:var(--m-text-secondary);font-size:.6875rem;font-weight:700;border:1px solid var(--m-backdrop-border);transition:all .2s ease}.m-table-thead__th{position:sticky;top:0;z-index:10;background:color-mix(in srgb,var(--m-background) 95%,transparent);-webkit-backdrop-filter:blur(28px);backdrop-filter:blur(28px);padding:1.25rem;text-align:left;font-size:.75rem;font-weight:700;text-transform:uppercase;letter-spacing:.1em;color:var(--m-text-tertiary);border-bottom:2px solid var(--m-backdrop-border);white-space:nowrap;transition:all .2s ease}.m-table-thead__th:hover{color:var(--m-text);background:var(--m-background)}@media(min-width:769px){.m-table-thead__th--fixed{z-index:20;background:var(--m-background)}}@media(max-width:768px){.m-table-thead__th--fixed{position:static;z-index:auto}}.m-table-thead__th--fixed{border-right:none}@media(min-width:769px){.m-table-thead__th--fixed-last{border-right:1px solid var(--m-backdrop-border)}}@media(max-width:768px){.m-table-thead__th--fixed-last{border-right:none}}.m-table-thead__th--sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.m-table-thead__th--select{width:48px;min-width:48px;max-width:48px;padding:0 1rem;text-align:center}.m-table-thead__th--select input[type=checkbox]{width:1rem;height:1rem;cursor:pointer;accent-color:var(--m-mm);border-radius:3px;display:block;margin:0 auto}.m-table-thead__cell{display:flex;align-items:center;gap:.5rem}.m-table-thead__sort-icon{color:var(--m-mm);opacity:.6;transition:opacity .2s ease}.m-table-thead__th:hover .m-table-thead__sort-icon{opacity:1}.m-table-thead__menu-btn{display:flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;margin-left:auto;border:none;background:transparent;cursor:pointer;color:var(--m-text-tertiary);border-radius:6px;opacity:0;transition:all .15ms ease}.m-table-thead__menu-btn:hover{background:var(--m-backdrop-surface);color:var(--m-text)}.m-table-thead__th:hover .m-table-thead__menu-btn{opacity:1}.m-table-body__row{transition:background-color .3s cubic-bezier(.4,0,.2,1);position:relative}.m-table-body__row:hover{background:color-mix(in srgb,var(--m-mm) 5%,transparent)}.m-table-body__row:hover .m-table-body__cell{background:inherit}.m-table-body__cell{padding:1rem 1.25rem;font-size:.875rem;color:var(--m-text);border-bottom:1px solid var(--m-backdrop-border);white-space:nowrap;vertical-align:middle;background:transparent;transition:background-color .3s ease}.m-table-body__cell[class*=--number],.m-table-body__cell[class*=--currency],.m-table-body__cell[class*=--percent]{font-family:Inter,Roboto Mono,monospace;font-variant-numeric:tabular-nums;letter-spacing:-.01em}@media(min-width:769px){.m-table-body__cell--fixed{position:sticky;background:var(--m-background);z-index:5}}@media(max-width:768px){.m-table-body__cell--fixed{position:static;background:transparent;z-index:auto}}.m-table-body__cell--fixed{border-right:none;transition:background-color .3s ease}.m-table-body__row:hover .m-table-body__cell--fixed{background:color-mix(in srgb,var(--m-mm) 5%,var(--m-background));z-index:6}@media(min-width:769px){.m-table-body__cell--fixed-last{border-right:1px solid var(--m-backdrop-border)}}@media(max-width:768px){.m-table-body__cell--fixed-last{border-right:none}}.m-table-body__cell--context-menu{padding-top:.35rem;padding-bottom:.35rem}.m-table-body__cell--select{width:48px;min-width:48px;max-width:48px;padding:0 1rem;text-align:center}.m-table-body__cell--select input[type=checkbox],.m-table-body__cell--select input[type=radio]{width:1rem;height:1rem;cursor:pointer;accent-color:var(--m-mm);display:block;margin:0 auto}.m-table-body__input{border:none;border-bottom:2px solid var(--m-backdrop-border);background:transparent;font-size:.875rem;color:var(--m-text);padding:.25rem;outline:none;width:100%;transition:border-bottom-color .2s ease}.m-table-body__input:focus{border-bottom-color:var(--m-mm)}.m-table-body__action-btn{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;border:none;background:transparent;cursor:pointer;color:var(--m-text-tertiary);border-radius:8px;transition:all .2s ease}.m-table-body__action-btn:hover{background:var(--m-backdrop-surface);color:var(--m-text)}.m-table-body__empty{text-align:center;padding:4rem;color:var(--m-text-tertiary);font-size:1rem;font-weight:500;letter-spacing:.02em;font-style:italic;opacity:.7}.m-table-body__link{color:var(--m-mm);text-decoration:none;cursor:pointer;font-weight:600;transition:color .2s ease}.m-table-body__link:hover{text-decoration:underline;color:var(--m-mm-lite)}.m-table-body__value{padding:.25rem .5rem;border-radius:6px;font-weight:600;font-variant-numeric:tabular-nums;letter-spacing:-.01em}.m-table-body__value--positive{color:var(--m-success);background:var(--m-backdrop-success)}.m-table-body__value--negative{color:var(--m-error);background:var(--m-backdrop-error)}.m-table-body__dash{color:var(--m-text-tertiary);font-weight:400;font-style:italic;opacity:.8}.m-section-table-host{display:block;width:100%}.m-section-table__th{position:static;vertical-align:middle}.m-section-table--sticky .m-section-table__th{position:sticky;top:0}.m-section-table__heading{justify-content:var(--m-section-table-justify, flex-start);min-height:2rem}.m-section-table--compact :where(.m-section-table__th){padding:.625rem .75rem}.m-section-table--compact :where(.m-section-table__cell){padding:.5rem .75rem}.m-section-table--spacious :where(.m-section-table__th){padding:1.5rem 1.75rem}.m-section-table--spacious :where(.m-section-table__cell){padding:1.5rem 1.75rem}.m-section-table--margin{margin-block:1em}.m-section-table--border.m-table{border-top:4px solid var(--m-backdrop-border);border-bottom:2px solid var(--m-backdrop-border)}.m-section-table--zebra .m-section-table__row:nth-child(2n):not(:hover){background:color-mix(in srgb,var(--m-mm) 3%,transparent)}.m-section-table--zebra .m-section-table__row:nth-child(2n):not(:hover) .m-section-table__cell--frozen{background:color-mix(in srgb,var(--m-mm) 3%,var(--m-background))}.m-section-table__th--squeeze{position:relative;padding-right:3rem}.m-section-table__th--folded{padding-left:0;padding-right:0}.m-section-table__squeeze{position:absolute;top:50%;right:.5rem;transform:translateY(-50%);display:flex;border:1px solid var(--m-backdrop-border);border-radius:8px;background:var(--m-backdrop-surface)}.m-section-table__th--folded .m-section-table__squeeze{right:50%;transform:translate(50%,-50%)}@media(min-width:769px){.m-section-table__cell--frozen{position:sticky;z-index:5;background:var(--m-background)}}@media(min-width:769px){.m-section-table th.m-section-table__cell--frozen{z-index:20}}@media(min-width:769px){.m-section-table--sticky .m-section-table th.m-section-table__cell--frozen{z-index:21}}@media(min-width:769px){.m-section-table__cell--frozen-last{border-right:1px solid var(--m-backdrop-border)}}.m-section-table__row:hover .m-section-table__cell--frozen{background:color-mix(in srgb,var(--m-mm) 5%,var(--m-background))}.m-section-table__cell--folded{text-align:center;padding-left:0;padding-right:0}.m-section-table__content[hidden]{display:none}.m-section-table .m-section-table__cell .m-section-table__content .m-text-output-host.align-left .m-text-output{text-align:inherit}.m-section-table__dot{display:inline-block;width:.375rem;height:.375rem;border-radius:50%;background:var(--m-text-tertiary)}.m-section-table__row{cursor:default}\n"], dependencies: [{ kind: "component", type: ButtonComponent, selector: "m-button,m-one-button", inputs: ["config", "color", "labelClass", "fullWidth", "nav", "navParams", "href", "disabled", "variant", "name", "baseUrl", "one", "remote", "label", "noTranslate", "params", "noNative", "icon", "isRightIcon", "iconOnly", "stacked", "imgSrc", "nonClickable", "inverted", "isSubmit", "tabindex"], outputs: ["configChange", "clicked"] }, { kind: "component", type: FreezeComponent, selector: "m-freeze", inputs: ["config"] }, { 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 });
19634
+ `, 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-table{display:flex;flex-direction:column;border:1px solid var(--m-backdrop-border);border-radius:12px;overflow:clip;background:#ffffffe6;-webkit-backdrop-filter:blur(40px);backdrop-filter:blur(40px);position:relative;transition:background-color .3s ease}.m-table--flat{border:none;box-shadow:none;background:transparent;-webkit-backdrop-filter:none;backdrop-filter:none;border-radius:0}.m-table__toolbar{position:sticky;top:0;z-index:2;display:flex;align-items:center;justify-content:space-between;padding:1.5rem var(--m-table-toolbar-padding-x, 1.25rem);border-bottom:1px solid var(--m-backdrop-border);gap:1.5rem;background:color-mix(in srgb,var(--m-background) 45%,transparent)}.m-table--flat .m-table__toolbar{background:transparent;padding-left:0;padding-right:0}.m-table__title{margin:0;font-size:1.25rem;font-weight:800;color:var(--m-text);letter-spacing:-.02em;flex:1}.m-table__search{flex:0 1 auto;display:flex;align-items:center}.m-table__search .m-input-wrapper{width:100%}.m-table__mobile-view{display:flex;flex-direction:column;gap:1rem;padding:1.25rem;flex:1;overflow:auto}.m-table__empty-mobile{padding:3rem 1.5rem;text-align:center;color:var(--m-text-tertiary);font-size:.9375rem;font-weight:500;font-style:italic;opacity:.8;background:color-mix(in srgb,var(--m-background) 20%,transparent);border-radius:12px;border:1px dashed var(--m-backdrop-border)}.m-table__wrapper{overflow:auto;flex:1}.m-table__wrapper::-webkit-scrollbar{width:6px;height:6px}.m-table__wrapper::-webkit-scrollbar-track{background:transparent}.m-table__wrapper::-webkit-scrollbar-thumb{background:var(--m-backdrop-border);border-radius:10px}.m-table__wrapper::-webkit-scrollbar-thumb:hover{background:var(--m-text-tertiary)}.m-table__table{width:100%;min-width:100%;border-collapse:separate;border-spacing:0}mark.m-table__highlight{background:var(--m-highlight);color:#000;border-radius:2px;padding:0 2px;font-weight:700;box-shadow:0 1px 4px #0003}mark.m-table__highlight .m-one-pagination{margin-left:auto;--m-button-size: 2.25rem;--m-pagination-gap: .375rem}.m-table-pagination{display:flex;align-items:center;gap:1.5rem;padding:1.25rem var(--m-table-pagination-padding-x, 1.25rem);border-top:1px solid var(--m-backdrop-border);font-size:.8125rem;flex-wrap:wrap;background:color-mix(in srgb,var(--m-background) 40%,transparent)}.m-table--flat .m-table-pagination{background:transparent;padding-left:0;padding-right:0}.m-table-pagination__size{display:flex;flex-direction:column;align-items:flex-start;gap:.35rem;color:var(--m-text-secondary);font-weight:500}.m-table-pagination__select{border:1px solid var(--m-backdrop-border);border-radius:8px;background:var(--m-backdrop-surface);color:var(--m-text);padding:.375rem .625rem;font-size:.8125rem;font-weight:600;cursor:pointer;transition:all .2s cubic-bezier(.4,0,.2,1);outline:none}.m-table-pagination__select:hover{background:var(--m-backdrop-glass);border-color:var(--m-mm);box-shadow:0 0 0 3px color-mix(in srgb,var(--m-mm) 10%,transparent)}.m-table-pagination__select:focus{border-color:var(--m-mm);box-shadow:0 0 0 3px color-mix(in srgb,var(--m-mm) 20%,transparent)}.m-table-filter{display:flex;flex-wrap:wrap;align-items:center;gap:10px;padding:1rem 1.25rem;background:color-mix(in srgb,var(--m-background-lite) 60%,transparent);border-bottom:1px solid var(--m-backdrop-border);box-shadow:inset 0 2px 4px #00000005;overflow-x:auto;scrollbar-width:none}.m-table-filter::-webkit-scrollbar{display:none}.m-table--flat .m-table-filter{background:transparent;padding-left:0;padding-right:0;border-bottom:none}.m-table-filter__item{display:flex;align-items:center;gap:10px;padding:.4375rem 1rem;border-radius:12px;background:var(--m-background);border:1px solid var(--m-backdrop-border);color:var(--m-text-secondary);cursor:pointer;transition:all .2s cubic-bezier(.4,0,.2,1);white-space:nowrap;-webkit-user-select:none;user-select:none;outline:none;font-weight:500}.m-table-filter__item:hover{border-color:var(--m-mm);color:var(--m-mm);background:var(--m-background);transform:translateY(-1px);box-shadow:0 4px 12px #0000000d}.m-table-filter__item--active{background:var(--m-mm);border-color:var(--m-mm);color:var(--m-inverse-text);font-weight:600;box-shadow:0 8px 16px color-mix(in srgb,var(--m-mm) 25%,transparent)}.m-table-filter__item--active:hover{background:var(--m-mm);border-color:var(--m-mm);color:var(--m-inverse-text);transform:translateY(-1px)}.m-table-filter__item--active .m-table-filter__badge{background:#fff3;color:var(--m-inverse-text);border-color:#ffffff1a}.m-table-filter__item--primary{background:var(--m-mm);border-color:var(--m-mm);color:var(--m-inverse-text);font-weight:600;box-shadow:0 8px 16px color-mix(in srgb,var(--m-mm) 25%,transparent)}.m-table-filter__item--primary:hover{background:var(--m-mm);border-color:var(--m-mm);color:var(--m-inverse-text);transform:translateY(-1px);box-shadow:0 10px 20px color-mix(in srgb,var(--m-mm) 30%,transparent)}.m-table-filter__item--primary .m-table-filter__badge{background:#fff3;color:var(--m-inverse-text);border-color:#ffffff1a}.m-table-filter__item--danger{border-color:var(--m-error);color:var(--m-error)}.m-table-filter__item--danger:hover{border-color:var(--m-error);color:var(--m-error);background:var(--m-backdrop-error);transform:translateY(-1px);box-shadow:0 4px 12px color-mix(in srgb,var(--m-error) 12%,transparent)}.m-table-filter__item--danger .m-table-filter__badge{background:var(--m-backdrop-error);color:var(--m-error);border-color:color-mix(in srgb,var(--m-error) 20%,transparent)}.m-table-filter__label{font-size:.8125rem;font-weight:600;letter-spacing:.01em}.m-table-filter__badge{display:inline-flex;align-items:center;justify-content:center;min-width:1.25rem;height:1.25rem;padding:0 .375rem;border-radius:100px;background:var(--m-backdrop-surface);color:var(--m-text-secondary);font-size:.6875rem;font-weight:700;border:1px solid var(--m-backdrop-border);transition:all .2s ease}.m-table-thead__th{position:sticky;top:0;z-index:10;background:var(--m-table-thead-background, color-mix(in srgb, var(--m-background) 95%, transparent));-webkit-backdrop-filter:var(--m-table-thead-backdrop-filter, blur(28px));backdrop-filter:var(--m-table-thead-backdrop-filter, blur(28px));padding:1.25rem;text-align:left;font-size:.75rem;font-weight:700;text-transform:uppercase;letter-spacing:.1em;color:var(--m-text-tertiary);border-bottom:2px solid var(--m-backdrop-border);white-space:nowrap;transition:all .2s ease}.m-table-thead__th:hover{color:var(--m-text);background:var(--m-table-thead-background, var(--m-background))}@media(min-width:769px){.m-table-thead__th--fixed{z-index:20;background:var(--m-table-thead-background, var(--m-background))}}@media(max-width:768px){.m-table-thead__th--fixed{position:static;z-index:auto}}.m-table-thead__th--fixed{border-right:none}@media(min-width:769px){.m-table-thead__th--fixed-last{border-right:1px solid var(--m-backdrop-border)}}@media(max-width:768px){.m-table-thead__th--fixed-last{border-right:none}}.m-table-thead__th--sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.m-table-thead__th--select{width:48px;min-width:48px;max-width:48px;padding:0 1rem;text-align:center}.m-table-thead__th--select input[type=checkbox]{width:1rem;height:1rem;cursor:pointer;accent-color:var(--m-mm);border-radius:3px;display:block;margin:0 auto}.m-table-thead__cell{display:flex;align-items:center;gap:.5rem}.m-table-thead__sort-icon{color:var(--m-mm);opacity:.6;transition:opacity .2s ease}.m-table-thead__th:hover .m-table-thead__sort-icon{opacity:1}.m-table-thead__menu-btn{display:flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;margin-left:auto;border:none;background:transparent;cursor:pointer;color:var(--m-text-tertiary);border-radius:6px;opacity:0;transition:all .15ms ease}.m-table-thead__menu-btn:hover{background:var(--m-backdrop-surface);color:var(--m-text)}.m-table-thead__th:hover .m-table-thead__menu-btn{opacity:1}.m-table-body__row{transition:background-color .3s cubic-bezier(.4,0,.2,1);position:relative}.m-table-body__row:hover{background:color-mix(in srgb,var(--m-mm) 5%,transparent)}.m-table-body__row:hover .m-table-body__cell{background:inherit}.m-table-body__cell{padding:1rem 1.25rem;font-size:.875rem;color:var(--m-text);border-bottom:1px solid var(--m-backdrop-border);white-space:nowrap;vertical-align:middle;background:transparent;transition:background-color .3s ease}.m-table-body__cell[class*=--number],.m-table-body__cell[class*=--currency],.m-table-body__cell[class*=--percent]{font-family:Inter,Roboto Mono,monospace;font-variant-numeric:tabular-nums;letter-spacing:-.01em}@media(min-width:769px){.m-table-body__cell--fixed{position:sticky;background:var(--m-background);z-index:5}}@media(max-width:768px){.m-table-body__cell--fixed{position:static;background:transparent;z-index:auto}}.m-table-body__cell--fixed{border-right:none;transition:background-color .3s ease}.m-table-body__row:hover .m-table-body__cell--fixed{background:color-mix(in srgb,var(--m-mm) 5%,var(--m-background));z-index:6}@media(min-width:769px){.m-table-body__cell--fixed-last{border-right:1px solid var(--m-backdrop-border)}}@media(max-width:768px){.m-table-body__cell--fixed-last{border-right:none}}.m-table-body__cell--context-menu{padding-top:.35rem;padding-bottom:.35rem}.m-table-body__cell--select{width:48px;min-width:48px;max-width:48px;padding:0 1rem;text-align:center}.m-table-body__cell--select input[type=checkbox],.m-table-body__cell--select input[type=radio]{width:1rem;height:1rem;cursor:pointer;accent-color:var(--m-mm);display:block;margin:0 auto}.m-table-body__input{border:none;border-bottom:2px solid var(--m-backdrop-border);background:transparent;font-size:.875rem;color:var(--m-text);padding:.25rem;outline:none;width:100%;transition:border-bottom-color .2s ease}.m-table-body__input:focus{border-bottom-color:var(--m-mm)}.m-table-body__action-btn{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;border:none;background:transparent;cursor:pointer;color:var(--m-text-tertiary);border-radius:8px;transition:all .2s ease}.m-table-body__action-btn:hover{background:var(--m-backdrop-surface);color:var(--m-text)}.m-table-body__empty{text-align:center;padding:4rem;color:var(--m-text-tertiary);font-size:1rem;font-weight:500;letter-spacing:.02em;font-style:italic;opacity:.7}.m-table-body__link{color:var(--m-mm);text-decoration:none;cursor:pointer;font-weight:600;transition:color .2s ease}.m-table-body__link:hover{text-decoration:underline;color:var(--m-mm-lite)}.m-table-body__value{padding:.25rem .5rem;border-radius:6px;font-weight:600;font-variant-numeric:tabular-nums;letter-spacing:-.01em}.m-table-body__value--positive{color:var(--m-success);background:var(--m-backdrop-success)}.m-table-body__value--negative{color:var(--m-error);background:var(--m-backdrop-error)}.m-table-body__dash{color:var(--m-text-tertiary);font-weight:400;font-style:italic;opacity:.8}.m-section-table-host{display:block;width:100%}.m-section-table__th{position:static;vertical-align:middle}.m-section-table--sticky .m-section-table__th{position:sticky;top:0}.m-section-table__heading{justify-content:var(--m-section-table-justify, flex-start);min-height:2rem}.m-section-table--compact :where(.m-section-table__th){padding:.625rem .75rem}.m-section-table--compact :where(.m-section-table__cell){padding:.5rem .75rem}.m-section-table--spacious :where(.m-section-table__th){padding:1.5rem 1.75rem}.m-section-table--spacious :where(.m-section-table__cell){padding:1.5rem 1.75rem}.m-section-table--margin{margin-block:1em}.m-section-table--border.m-table{border-top:4px solid var(--m-backdrop-border);border-bottom:2px solid var(--m-backdrop-border)}.m-section-table--zebra .m-section-table__row:nth-child(2n):not(:hover){background:color-mix(in srgb,var(--m-mm) 3%,transparent)}.m-section-table--zebra .m-section-table__row:nth-child(2n):not(:hover) .m-section-table__cell--frozen{background:color-mix(in srgb,var(--m-mm) 3%,var(--m-background))}.m-section-table__th--squeeze{position:relative;padding-right:3rem}.m-section-table__th--folded{padding-left:0;padding-right:0}.m-section-table__squeeze{position:absolute;top:50%;right:.5rem;transform:translateY(-50%);display:flex;border:1px solid var(--m-backdrop-border);border-radius:8px;background:var(--m-backdrop-surface)}.m-section-table__th--folded .m-section-table__squeeze{right:50%;transform:translate(50%,-50%)}@media(min-width:769px){.m-section-table__cell--frozen{position:sticky;z-index:5;background:var(--m-background)}}@media(min-width:769px){.m-section-table th.m-section-table__cell--frozen{z-index:20}}@media(min-width:769px){.m-section-table--sticky .m-section-table th.m-section-table__cell--frozen{z-index:21}}@media(min-width:769px){.m-section-table__cell--frozen-last{border-right:1px solid var(--m-backdrop-border)}}.m-section-table__row:hover .m-section-table__cell--frozen{background:color-mix(in srgb,var(--m-mm) 5%,var(--m-background))}.m-section-table__cell--folded{text-align:center;padding-left:0;padding-right:0}.m-section-table__content[hidden]{display:none}.m-section-table .m-section-table__cell .m-section-table__content .m-text-output-host.align-left .m-text-output{text-align:inherit}.m-section-table__dot{display:inline-block;width:.375rem;height:.375rem;border-radius:50%;background:var(--m-text-tertiary)}.m-section-table__row{cursor:default}\n"], dependencies: [{ kind: "component", type: ButtonComponent, selector: "m-button,m-one-button", inputs: ["config", "color", "labelClass", "fullWidth", "nav", "navParams", "href", "disabled", "variant", "name", "baseUrl", "one", "remote", "label", "noTranslate", "params", "noNative", "icon", "isRightIcon", "iconOnly", "stacked", "imgSrc", "nonClickable", "inverted", "isSubmit", "tabindex"], outputs: ["configChange", "clicked"] }, { kind: "component", type: FreezeComponent, selector: "m-freeze", inputs: ["config"] }, { 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 });
19245
19635
  }
19246
19636
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SectionTableComponent, decorators: [{
19247
19637
  type: Component,
@@ -19335,7 +19725,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
19335
19725
  };
19336
19726
  },
19337
19727
  },
19338
- ], 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-table{display:flex;flex-direction:column;border:1px solid var(--m-backdrop-border);border-radius:12px;overflow:clip;background:#ffffffe6;-webkit-backdrop-filter:blur(40px);backdrop-filter:blur(40px);position:relative;transition:background-color .3s ease}.m-table--flat{border:none;box-shadow:none;background:transparent;-webkit-backdrop-filter:none;backdrop-filter:none;border-radius:0}.m-table__toolbar{position:sticky;top:0;z-index:2;display:flex;align-items:center;justify-content:space-between;padding:1.5rem var(--m-table-toolbar-padding-x, 1.25rem);border-bottom:1px solid var(--m-backdrop-border);gap:1.5rem;background:color-mix(in srgb,var(--m-background) 45%,transparent)}.m-table--flat .m-table__toolbar{background:transparent;padding-left:0;padding-right:0}.m-table__title{margin:0;font-size:1.25rem;font-weight:800;color:var(--m-text);letter-spacing:-.02em;flex:1}.m-table__search{flex:0 1 auto;display:flex;align-items:center}.m-table__search .m-input-wrapper{width:100%}.m-table__mobile-view{display:flex;flex-direction:column;gap:1rem;padding:1.25rem;flex:1;overflow:auto}.m-table__empty-mobile{padding:3rem 1.5rem;text-align:center;color:var(--m-text-tertiary);font-size:.9375rem;font-weight:500;font-style:italic;opacity:.8;background:color-mix(in srgb,var(--m-background) 20%,transparent);border-radius:12px;border:1px dashed var(--m-backdrop-border)}.m-table__wrapper{overflow:auto;flex:1}.m-table__wrapper::-webkit-scrollbar{width:6px;height:6px}.m-table__wrapper::-webkit-scrollbar-track{background:transparent}.m-table__wrapper::-webkit-scrollbar-thumb{background:var(--m-backdrop-border);border-radius:10px}.m-table__wrapper::-webkit-scrollbar-thumb:hover{background:var(--m-text-tertiary)}.m-table__table{width:100%;min-width:100%;border-collapse:separate;border-spacing:0}mark.m-table__highlight{background:var(--m-highlight);color:#000;border-radius:2px;padding:0 2px;font-weight:700;box-shadow:0 1px 4px #0003}mark.m-table__highlight .m-one-pagination{margin-left:auto;--m-button-size: 2.25rem;--m-pagination-gap: .375rem}.m-table-pagination{display:flex;align-items:center;gap:1.5rem;padding:1.25rem var(--m-table-pagination-padding-x, 1.25rem);border-top:1px solid var(--m-backdrop-border);font-size:.8125rem;flex-wrap:wrap;background:color-mix(in srgb,var(--m-background) 40%,transparent)}.m-table--flat .m-table-pagination{background:transparent;padding-left:0;padding-right:0}.m-table-pagination__size{display:flex;flex-direction:column;align-items:flex-start;gap:.35rem;color:var(--m-text-secondary);font-weight:500}.m-table-pagination__select{border:1px solid var(--m-backdrop-border);border-radius:8px;background:var(--m-backdrop-surface);color:var(--m-text);padding:.375rem .625rem;font-size:.8125rem;font-weight:600;cursor:pointer;transition:all .2s cubic-bezier(.4,0,.2,1);outline:none}.m-table-pagination__select:hover{background:var(--m-backdrop-glass);border-color:var(--m-mm);box-shadow:0 0 0 3px color-mix(in srgb,var(--m-mm) 10%,transparent)}.m-table-pagination__select:focus{border-color:var(--m-mm);box-shadow:0 0 0 3px color-mix(in srgb,var(--m-mm) 20%,transparent)}.m-table-filter{display:flex;flex-wrap:wrap;align-items:center;gap:10px;padding:1rem 1.25rem;background:color-mix(in srgb,var(--m-background-lite) 60%,transparent);border-bottom:1px solid var(--m-backdrop-border);box-shadow:inset 0 2px 4px #00000005;overflow-x:auto;scrollbar-width:none}.m-table-filter::-webkit-scrollbar{display:none}.m-table--flat .m-table-filter{background:transparent;padding-left:0;padding-right:0;border-bottom:none}.m-table-filter__item{display:flex;align-items:center;gap:10px;padding:.4375rem 1rem;border-radius:12px;background:var(--m-background);border:1px solid var(--m-backdrop-border);color:var(--m-text-secondary);cursor:pointer;transition:all .2s cubic-bezier(.4,0,.2,1);white-space:nowrap;-webkit-user-select:none;user-select:none;outline:none;font-weight:500}.m-table-filter__item:hover{border-color:var(--m-mm);color:var(--m-mm);background:var(--m-background);transform:translateY(-1px);box-shadow:0 4px 12px #0000000d}.m-table-filter__item--active{background:var(--m-mm);border-color:var(--m-mm);color:var(--m-inverse-text);font-weight:600;box-shadow:0 8px 16px color-mix(in srgb,var(--m-mm) 25%,transparent)}.m-table-filter__item--active:hover{background:var(--m-mm);border-color:var(--m-mm);color:var(--m-inverse-text);transform:translateY(-1px)}.m-table-filter__item--active .m-table-filter__badge{background:#fff3;color:var(--m-inverse-text);border-color:#ffffff1a}.m-table-filter__item--primary{background:var(--m-mm);border-color:var(--m-mm);color:var(--m-inverse-text);font-weight:600;box-shadow:0 8px 16px color-mix(in srgb,var(--m-mm) 25%,transparent)}.m-table-filter__item--primary:hover{background:var(--m-mm);border-color:var(--m-mm);color:var(--m-inverse-text);transform:translateY(-1px);box-shadow:0 10px 20px color-mix(in srgb,var(--m-mm) 30%,transparent)}.m-table-filter__item--primary .m-table-filter__badge{background:#fff3;color:var(--m-inverse-text);border-color:#ffffff1a}.m-table-filter__item--danger{border-color:var(--m-error);color:var(--m-error)}.m-table-filter__item--danger:hover{border-color:var(--m-error);color:var(--m-error);background:var(--m-backdrop-error);transform:translateY(-1px);box-shadow:0 4px 12px color-mix(in srgb,var(--m-error) 12%,transparent)}.m-table-filter__item--danger .m-table-filter__badge{background:var(--m-backdrop-error);color:var(--m-error);border-color:color-mix(in srgb,var(--m-error) 20%,transparent)}.m-table-filter__label{font-size:.8125rem;font-weight:600;letter-spacing:.01em}.m-table-filter__badge{display:inline-flex;align-items:center;justify-content:center;min-width:1.25rem;height:1.25rem;padding:0 .375rem;border-radius:100px;background:var(--m-backdrop-surface);color:var(--m-text-secondary);font-size:.6875rem;font-weight:700;border:1px solid var(--m-backdrop-border);transition:all .2s ease}.m-table-thead__th{position:sticky;top:0;z-index:10;background:color-mix(in srgb,var(--m-background) 95%,transparent);-webkit-backdrop-filter:blur(28px);backdrop-filter:blur(28px);padding:1.25rem;text-align:left;font-size:.75rem;font-weight:700;text-transform:uppercase;letter-spacing:.1em;color:var(--m-text-tertiary);border-bottom:2px solid var(--m-backdrop-border);white-space:nowrap;transition:all .2s ease}.m-table-thead__th:hover{color:var(--m-text);background:var(--m-background)}@media(min-width:769px){.m-table-thead__th--fixed{z-index:20;background:var(--m-background)}}@media(max-width:768px){.m-table-thead__th--fixed{position:static;z-index:auto}}.m-table-thead__th--fixed{border-right:none}@media(min-width:769px){.m-table-thead__th--fixed-last{border-right:1px solid var(--m-backdrop-border)}}@media(max-width:768px){.m-table-thead__th--fixed-last{border-right:none}}.m-table-thead__th--sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.m-table-thead__th--select{width:48px;min-width:48px;max-width:48px;padding:0 1rem;text-align:center}.m-table-thead__th--select input[type=checkbox]{width:1rem;height:1rem;cursor:pointer;accent-color:var(--m-mm);border-radius:3px;display:block;margin:0 auto}.m-table-thead__cell{display:flex;align-items:center;gap:.5rem}.m-table-thead__sort-icon{color:var(--m-mm);opacity:.6;transition:opacity .2s ease}.m-table-thead__th:hover .m-table-thead__sort-icon{opacity:1}.m-table-thead__menu-btn{display:flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;margin-left:auto;border:none;background:transparent;cursor:pointer;color:var(--m-text-tertiary);border-radius:6px;opacity:0;transition:all .15ms ease}.m-table-thead__menu-btn:hover{background:var(--m-backdrop-surface);color:var(--m-text)}.m-table-thead__th:hover .m-table-thead__menu-btn{opacity:1}.m-table-body__row{transition:background-color .3s cubic-bezier(.4,0,.2,1);position:relative}.m-table-body__row:hover{background:color-mix(in srgb,var(--m-mm) 5%,transparent)}.m-table-body__row:hover .m-table-body__cell{background:inherit}.m-table-body__cell{padding:1rem 1.25rem;font-size:.875rem;color:var(--m-text);border-bottom:1px solid var(--m-backdrop-border);white-space:nowrap;vertical-align:middle;background:transparent;transition:background-color .3s ease}.m-table-body__cell[class*=--number],.m-table-body__cell[class*=--currency],.m-table-body__cell[class*=--percent]{font-family:Inter,Roboto Mono,monospace;font-variant-numeric:tabular-nums;letter-spacing:-.01em}@media(min-width:769px){.m-table-body__cell--fixed{position:sticky;background:var(--m-background);z-index:5}}@media(max-width:768px){.m-table-body__cell--fixed{position:static;background:transparent;z-index:auto}}.m-table-body__cell--fixed{border-right:none;transition:background-color .3s ease}.m-table-body__row:hover .m-table-body__cell--fixed{background:color-mix(in srgb,var(--m-mm) 5%,var(--m-background));z-index:6}@media(min-width:769px){.m-table-body__cell--fixed-last{border-right:1px solid var(--m-backdrop-border)}}@media(max-width:768px){.m-table-body__cell--fixed-last{border-right:none}}.m-table-body__cell--context-menu{padding-top:.35rem;padding-bottom:.35rem}.m-table-body__cell--select{width:48px;min-width:48px;max-width:48px;padding:0 1rem;text-align:center}.m-table-body__cell--select input[type=checkbox],.m-table-body__cell--select input[type=radio]{width:1rem;height:1rem;cursor:pointer;accent-color:var(--m-mm);display:block;margin:0 auto}.m-table-body__input{border:none;border-bottom:2px solid var(--m-backdrop-border);background:transparent;font-size:.875rem;color:var(--m-text);padding:.25rem;outline:none;width:100%;transition:border-bottom-color .2s ease}.m-table-body__input:focus{border-bottom-color:var(--m-mm)}.m-table-body__action-btn{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;border:none;background:transparent;cursor:pointer;color:var(--m-text-tertiary);border-radius:8px;transition:all .2s ease}.m-table-body__action-btn:hover{background:var(--m-backdrop-surface);color:var(--m-text)}.m-table-body__empty{text-align:center;padding:4rem;color:var(--m-text-tertiary);font-size:1rem;font-weight:500;letter-spacing:.02em;font-style:italic;opacity:.7}.m-table-body__link{color:var(--m-mm);text-decoration:none;cursor:pointer;font-weight:600;transition:color .2s ease}.m-table-body__link:hover{text-decoration:underline;color:var(--m-mm-lite)}.m-table-body__value{padding:.25rem .5rem;border-radius:6px;font-weight:600;font-variant-numeric:tabular-nums;letter-spacing:-.01em}.m-table-body__value--positive{color:var(--m-success);background:var(--m-backdrop-success)}.m-table-body__value--negative{color:var(--m-error);background:var(--m-backdrop-error)}.m-table-body__dash{color:var(--m-text-tertiary);font-weight:400;font-style:italic;opacity:.8}.m-section-table-host{display:block;width:100%}.m-section-table__th{position:static;vertical-align:middle}.m-section-table--sticky .m-section-table__th{position:sticky;top:0}.m-section-table__heading{justify-content:var(--m-section-table-justify, flex-start);min-height:2rem}.m-section-table--compact :where(.m-section-table__th){padding:.625rem .75rem}.m-section-table--compact :where(.m-section-table__cell){padding:.5rem .75rem}.m-section-table--spacious :where(.m-section-table__th){padding:1.5rem 1.75rem}.m-section-table--spacious :where(.m-section-table__cell){padding:1.5rem 1.75rem}.m-section-table--margin{margin-block:1em}.m-section-table--border.m-table{border-top:4px solid var(--m-backdrop-border);border-bottom:2px solid var(--m-backdrop-border)}.m-section-table--zebra .m-section-table__row:nth-child(2n):not(:hover){background:color-mix(in srgb,var(--m-mm) 3%,transparent)}.m-section-table--zebra .m-section-table__row:nth-child(2n):not(:hover) .m-section-table__cell--frozen{background:color-mix(in srgb,var(--m-mm) 3%,var(--m-background))}.m-section-table__th--squeeze{position:relative;padding-right:3rem}.m-section-table__th--folded{padding-left:0;padding-right:0}.m-section-table__squeeze{position:absolute;top:50%;right:.5rem;transform:translateY(-50%);display:flex;border:1px solid var(--m-backdrop-border);border-radius:8px;background:var(--m-backdrop-surface)}.m-section-table__th--folded .m-section-table__squeeze{right:50%;transform:translate(50%,-50%)}@media(min-width:769px){.m-section-table__cell--frozen{position:sticky;z-index:5;background:var(--m-background)}}@media(min-width:769px){.m-section-table th.m-section-table__cell--frozen{z-index:20}}@media(min-width:769px){.m-section-table--sticky .m-section-table th.m-section-table__cell--frozen{z-index:21}}@media(min-width:769px){.m-section-table__cell--frozen-last{border-right:1px solid var(--m-backdrop-border)}}.m-section-table__row:hover .m-section-table__cell--frozen{background:color-mix(in srgb,var(--m-mm) 5%,var(--m-background))}.m-section-table__cell--folded{text-align:center;padding-left:0;padding-right:0}.m-section-table__content[hidden]{display:none}.m-section-table .m-section-table__cell .m-section-table__content .m-text-output-host.align-left .m-text-output{text-align:inherit}.m-section-table__dot{display:inline-block;width:.375rem;height:.375rem;border-radius:50%;background:var(--m-text-tertiary)}.m-section-table__row{cursor:default}\n"] }]
19728
+ ], 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-table{display:flex;flex-direction:column;border:1px solid var(--m-backdrop-border);border-radius:12px;overflow:clip;background:#ffffffe6;-webkit-backdrop-filter:blur(40px);backdrop-filter:blur(40px);position:relative;transition:background-color .3s ease}.m-table--flat{border:none;box-shadow:none;background:transparent;-webkit-backdrop-filter:none;backdrop-filter:none;border-radius:0}.m-table__toolbar{position:sticky;top:0;z-index:2;display:flex;align-items:center;justify-content:space-between;padding:1.5rem var(--m-table-toolbar-padding-x, 1.25rem);border-bottom:1px solid var(--m-backdrop-border);gap:1.5rem;background:color-mix(in srgb,var(--m-background) 45%,transparent)}.m-table--flat .m-table__toolbar{background:transparent;padding-left:0;padding-right:0}.m-table__title{margin:0;font-size:1.25rem;font-weight:800;color:var(--m-text);letter-spacing:-.02em;flex:1}.m-table__search{flex:0 1 auto;display:flex;align-items:center}.m-table__search .m-input-wrapper{width:100%}.m-table__mobile-view{display:flex;flex-direction:column;gap:1rem;padding:1.25rem;flex:1;overflow:auto}.m-table__empty-mobile{padding:3rem 1.5rem;text-align:center;color:var(--m-text-tertiary);font-size:.9375rem;font-weight:500;font-style:italic;opacity:.8;background:color-mix(in srgb,var(--m-background) 20%,transparent);border-radius:12px;border:1px dashed var(--m-backdrop-border)}.m-table__wrapper{overflow:auto;flex:1}.m-table__wrapper::-webkit-scrollbar{width:6px;height:6px}.m-table__wrapper::-webkit-scrollbar-track{background:transparent}.m-table__wrapper::-webkit-scrollbar-thumb{background:var(--m-backdrop-border);border-radius:10px}.m-table__wrapper::-webkit-scrollbar-thumb:hover{background:var(--m-text-tertiary)}.m-table__table{width:100%;min-width:100%;border-collapse:separate;border-spacing:0}mark.m-table__highlight{background:var(--m-highlight);color:#000;border-radius:2px;padding:0 2px;font-weight:700;box-shadow:0 1px 4px #0003}mark.m-table__highlight .m-one-pagination{margin-left:auto;--m-button-size: 2.25rem;--m-pagination-gap: .375rem}.m-table-pagination{display:flex;align-items:center;gap:1.5rem;padding:1.25rem var(--m-table-pagination-padding-x, 1.25rem);border-top:1px solid var(--m-backdrop-border);font-size:.8125rem;flex-wrap:wrap;background:color-mix(in srgb,var(--m-background) 40%,transparent)}.m-table--flat .m-table-pagination{background:transparent;padding-left:0;padding-right:0}.m-table-pagination__size{display:flex;flex-direction:column;align-items:flex-start;gap:.35rem;color:var(--m-text-secondary);font-weight:500}.m-table-pagination__select{border:1px solid var(--m-backdrop-border);border-radius:8px;background:var(--m-backdrop-surface);color:var(--m-text);padding:.375rem .625rem;font-size:.8125rem;font-weight:600;cursor:pointer;transition:all .2s cubic-bezier(.4,0,.2,1);outline:none}.m-table-pagination__select:hover{background:var(--m-backdrop-glass);border-color:var(--m-mm);box-shadow:0 0 0 3px color-mix(in srgb,var(--m-mm) 10%,transparent)}.m-table-pagination__select:focus{border-color:var(--m-mm);box-shadow:0 0 0 3px color-mix(in srgb,var(--m-mm) 20%,transparent)}.m-table-filter{display:flex;flex-wrap:wrap;align-items:center;gap:10px;padding:1rem 1.25rem;background:color-mix(in srgb,var(--m-background-lite) 60%,transparent);border-bottom:1px solid var(--m-backdrop-border);box-shadow:inset 0 2px 4px #00000005;overflow-x:auto;scrollbar-width:none}.m-table-filter::-webkit-scrollbar{display:none}.m-table--flat .m-table-filter{background:transparent;padding-left:0;padding-right:0;border-bottom:none}.m-table-filter__item{display:flex;align-items:center;gap:10px;padding:.4375rem 1rem;border-radius:12px;background:var(--m-background);border:1px solid var(--m-backdrop-border);color:var(--m-text-secondary);cursor:pointer;transition:all .2s cubic-bezier(.4,0,.2,1);white-space:nowrap;-webkit-user-select:none;user-select:none;outline:none;font-weight:500}.m-table-filter__item:hover{border-color:var(--m-mm);color:var(--m-mm);background:var(--m-background);transform:translateY(-1px);box-shadow:0 4px 12px #0000000d}.m-table-filter__item--active{background:var(--m-mm);border-color:var(--m-mm);color:var(--m-inverse-text);font-weight:600;box-shadow:0 8px 16px color-mix(in srgb,var(--m-mm) 25%,transparent)}.m-table-filter__item--active:hover{background:var(--m-mm);border-color:var(--m-mm);color:var(--m-inverse-text);transform:translateY(-1px)}.m-table-filter__item--active .m-table-filter__badge{background:#fff3;color:var(--m-inverse-text);border-color:#ffffff1a}.m-table-filter__item--primary{background:var(--m-mm);border-color:var(--m-mm);color:var(--m-inverse-text);font-weight:600;box-shadow:0 8px 16px color-mix(in srgb,var(--m-mm) 25%,transparent)}.m-table-filter__item--primary:hover{background:var(--m-mm);border-color:var(--m-mm);color:var(--m-inverse-text);transform:translateY(-1px);box-shadow:0 10px 20px color-mix(in srgb,var(--m-mm) 30%,transparent)}.m-table-filter__item--primary .m-table-filter__badge{background:#fff3;color:var(--m-inverse-text);border-color:#ffffff1a}.m-table-filter__item--danger{border-color:var(--m-error);color:var(--m-error)}.m-table-filter__item--danger:hover{border-color:var(--m-error);color:var(--m-error);background:var(--m-backdrop-error);transform:translateY(-1px);box-shadow:0 4px 12px color-mix(in srgb,var(--m-error) 12%,transparent)}.m-table-filter__item--danger .m-table-filter__badge{background:var(--m-backdrop-error);color:var(--m-error);border-color:color-mix(in srgb,var(--m-error) 20%,transparent)}.m-table-filter__label{font-size:.8125rem;font-weight:600;letter-spacing:.01em}.m-table-filter__badge{display:inline-flex;align-items:center;justify-content:center;min-width:1.25rem;height:1.25rem;padding:0 .375rem;border-radius:100px;background:var(--m-backdrop-surface);color:var(--m-text-secondary);font-size:.6875rem;font-weight:700;border:1px solid var(--m-backdrop-border);transition:all .2s ease}.m-table-thead__th{position:sticky;top:0;z-index:10;background:var(--m-table-thead-background, color-mix(in srgb, var(--m-background) 95%, transparent));-webkit-backdrop-filter:var(--m-table-thead-backdrop-filter, blur(28px));backdrop-filter:var(--m-table-thead-backdrop-filter, blur(28px));padding:1.25rem;text-align:left;font-size:.75rem;font-weight:700;text-transform:uppercase;letter-spacing:.1em;color:var(--m-text-tertiary);border-bottom:2px solid var(--m-backdrop-border);white-space:nowrap;transition:all .2s ease}.m-table-thead__th:hover{color:var(--m-text);background:var(--m-table-thead-background, var(--m-background))}@media(min-width:769px){.m-table-thead__th--fixed{z-index:20;background:var(--m-table-thead-background, var(--m-background))}}@media(max-width:768px){.m-table-thead__th--fixed{position:static;z-index:auto}}.m-table-thead__th--fixed{border-right:none}@media(min-width:769px){.m-table-thead__th--fixed-last{border-right:1px solid var(--m-backdrop-border)}}@media(max-width:768px){.m-table-thead__th--fixed-last{border-right:none}}.m-table-thead__th--sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.m-table-thead__th--select{width:48px;min-width:48px;max-width:48px;padding:0 1rem;text-align:center}.m-table-thead__th--select input[type=checkbox]{width:1rem;height:1rem;cursor:pointer;accent-color:var(--m-mm);border-radius:3px;display:block;margin:0 auto}.m-table-thead__cell{display:flex;align-items:center;gap:.5rem}.m-table-thead__sort-icon{color:var(--m-mm);opacity:.6;transition:opacity .2s ease}.m-table-thead__th:hover .m-table-thead__sort-icon{opacity:1}.m-table-thead__menu-btn{display:flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;margin-left:auto;border:none;background:transparent;cursor:pointer;color:var(--m-text-tertiary);border-radius:6px;opacity:0;transition:all .15ms ease}.m-table-thead__menu-btn:hover{background:var(--m-backdrop-surface);color:var(--m-text)}.m-table-thead__th:hover .m-table-thead__menu-btn{opacity:1}.m-table-body__row{transition:background-color .3s cubic-bezier(.4,0,.2,1);position:relative}.m-table-body__row:hover{background:color-mix(in srgb,var(--m-mm) 5%,transparent)}.m-table-body__row:hover .m-table-body__cell{background:inherit}.m-table-body__cell{padding:1rem 1.25rem;font-size:.875rem;color:var(--m-text);border-bottom:1px solid var(--m-backdrop-border);white-space:nowrap;vertical-align:middle;background:transparent;transition:background-color .3s ease}.m-table-body__cell[class*=--number],.m-table-body__cell[class*=--currency],.m-table-body__cell[class*=--percent]{font-family:Inter,Roboto Mono,monospace;font-variant-numeric:tabular-nums;letter-spacing:-.01em}@media(min-width:769px){.m-table-body__cell--fixed{position:sticky;background:var(--m-background);z-index:5}}@media(max-width:768px){.m-table-body__cell--fixed{position:static;background:transparent;z-index:auto}}.m-table-body__cell--fixed{border-right:none;transition:background-color .3s ease}.m-table-body__row:hover .m-table-body__cell--fixed{background:color-mix(in srgb,var(--m-mm) 5%,var(--m-background));z-index:6}@media(min-width:769px){.m-table-body__cell--fixed-last{border-right:1px solid var(--m-backdrop-border)}}@media(max-width:768px){.m-table-body__cell--fixed-last{border-right:none}}.m-table-body__cell--context-menu{padding-top:.35rem;padding-bottom:.35rem}.m-table-body__cell--select{width:48px;min-width:48px;max-width:48px;padding:0 1rem;text-align:center}.m-table-body__cell--select input[type=checkbox],.m-table-body__cell--select input[type=radio]{width:1rem;height:1rem;cursor:pointer;accent-color:var(--m-mm);display:block;margin:0 auto}.m-table-body__input{border:none;border-bottom:2px solid var(--m-backdrop-border);background:transparent;font-size:.875rem;color:var(--m-text);padding:.25rem;outline:none;width:100%;transition:border-bottom-color .2s ease}.m-table-body__input:focus{border-bottom-color:var(--m-mm)}.m-table-body__action-btn{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;border:none;background:transparent;cursor:pointer;color:var(--m-text-tertiary);border-radius:8px;transition:all .2s ease}.m-table-body__action-btn:hover{background:var(--m-backdrop-surface);color:var(--m-text)}.m-table-body__empty{text-align:center;padding:4rem;color:var(--m-text-tertiary);font-size:1rem;font-weight:500;letter-spacing:.02em;font-style:italic;opacity:.7}.m-table-body__link{color:var(--m-mm);text-decoration:none;cursor:pointer;font-weight:600;transition:color .2s ease}.m-table-body__link:hover{text-decoration:underline;color:var(--m-mm-lite)}.m-table-body__value{padding:.25rem .5rem;border-radius:6px;font-weight:600;font-variant-numeric:tabular-nums;letter-spacing:-.01em}.m-table-body__value--positive{color:var(--m-success);background:var(--m-backdrop-success)}.m-table-body__value--negative{color:var(--m-error);background:var(--m-backdrop-error)}.m-table-body__dash{color:var(--m-text-tertiary);font-weight:400;font-style:italic;opacity:.8}.m-section-table-host{display:block;width:100%}.m-section-table__th{position:static;vertical-align:middle}.m-section-table--sticky .m-section-table__th{position:sticky;top:0}.m-section-table__heading{justify-content:var(--m-section-table-justify, flex-start);min-height:2rem}.m-section-table--compact :where(.m-section-table__th){padding:.625rem .75rem}.m-section-table--compact :where(.m-section-table__cell){padding:.5rem .75rem}.m-section-table--spacious :where(.m-section-table__th){padding:1.5rem 1.75rem}.m-section-table--spacious :where(.m-section-table__cell){padding:1.5rem 1.75rem}.m-section-table--margin{margin-block:1em}.m-section-table--border.m-table{border-top:4px solid var(--m-backdrop-border);border-bottom:2px solid var(--m-backdrop-border)}.m-section-table--zebra .m-section-table__row:nth-child(2n):not(:hover){background:color-mix(in srgb,var(--m-mm) 3%,transparent)}.m-section-table--zebra .m-section-table__row:nth-child(2n):not(:hover) .m-section-table__cell--frozen{background:color-mix(in srgb,var(--m-mm) 3%,var(--m-background))}.m-section-table__th--squeeze{position:relative;padding-right:3rem}.m-section-table__th--folded{padding-left:0;padding-right:0}.m-section-table__squeeze{position:absolute;top:50%;right:.5rem;transform:translateY(-50%);display:flex;border:1px solid var(--m-backdrop-border);border-radius:8px;background:var(--m-backdrop-surface)}.m-section-table__th--folded .m-section-table__squeeze{right:50%;transform:translate(50%,-50%)}@media(min-width:769px){.m-section-table__cell--frozen{position:sticky;z-index:5;background:var(--m-background)}}@media(min-width:769px){.m-section-table th.m-section-table__cell--frozen{z-index:20}}@media(min-width:769px){.m-section-table--sticky .m-section-table th.m-section-table__cell--frozen{z-index:21}}@media(min-width:769px){.m-section-table__cell--frozen-last{border-right:1px solid var(--m-backdrop-border)}}.m-section-table__row:hover .m-section-table__cell--frozen{background:color-mix(in srgb,var(--m-mm) 5%,var(--m-background))}.m-section-table__cell--folded{text-align:center;padding-left:0;padding-right:0}.m-section-table__content[hidden]{display:none}.m-section-table .m-section-table__cell .m-section-table__content .m-text-output-host.align-left .m-text-output{text-align:inherit}.m-section-table__dot{display:inline-block;width:.375rem;height:.375rem;border-radius:50%;background:var(--m-text-tertiary)}.m-section-table__row{cursor:default}\n"] }]
19339
19729
  }], ctorParameters: () => [], propDecorators: { sticky: [{ type: i0.Input, args: [{ isSignal: true, alias: "sticky", required: false }] }], margin: [{ type: i0.Input, args: [{ isSignal: true, alias: "margin", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], sortChange: [{ type: i0.Output, args: ["sortChange"] }], tableInitialized: [{ type: i0.Output, args: ["tableInitialized"] }], headings: [{ type: i0.ViewChildren, args: ['heading', { isSignal: true }] }] } });
19340
19730
 
19341
19731
  /**
@@ -22536,7 +22926,7 @@ class WrapperInputComponent extends ConfigComponent {
22536
22926
  break;
22537
22927
  }
22538
22928
  case InputType.TOGGLE: {
22539
- const { ToggleInputComponent } = await import('./magmonium-one-toggle-atjxl_R_.mjs');
22929
+ const { ToggleInputComponent } = await import('./magmonium-one-toggle-CpMURu38.mjs');
22540
22930
  this.createDynamicComponent(seq, ToggleInputComponent, [], true);
22541
22931
  break;
22542
22932
  }
@@ -22548,12 +22938,12 @@ class WrapperInputComponent extends ConfigComponent {
22548
22938
  break;
22549
22939
  }
22550
22940
  case InputType.PASSWORD: {
22551
- const { PasswordInputComponent } = await import('./magmonium-one-password-yXiSYlMS.mjs');
22941
+ const { PasswordInputComponent } = await import('./magmonium-one-password-CyHOns1l.mjs');
22552
22942
  this.createDynamicComponent(seq, PasswordInputComponent);
22553
22943
  break;
22554
22944
  }
22555
22945
  case InputType.OTP: {
22556
- const { OtpInputComponent } = await import('./magmonium-one-otp-B-NBB6PF.mjs');
22946
+ const { OtpInputComponent } = await import('./magmonium-one-otp-BwXKEaEg.mjs');
22557
22947
  this.createDynamicComponent(seq, OtpInputComponent);
22558
22948
  break;
22559
22949
  }
@@ -24260,7 +24650,7 @@ class FileUploadInputComponent extends BaseInputComponent {
24260
24650
  const modalStore = this.modalStore;
24261
24651
  if (!modalStore)
24262
24652
  return undefined;
24263
- const { ImageEditorComponent } = await import('./magmonium-one-image-editor-CurYe_Mb.mjs');
24653
+ const { ImageEditorComponent } = await import('./magmonium-one-image-editor-BjCvZ9rH.mjs');
24264
24654
  const ratio = String(this.config()?.ratio ?? '');
24265
24655
  return new Promise((resolve) => {
24266
24656
  const modalRef = new ModalRef();
@@ -27136,6 +27526,8 @@ class RemoteComponent {
27136
27526
  mountedLink;
27137
27527
  /** The first report after each mount replaces: boot redirects leave no entry. */
27138
27528
  reported = false;
27529
+ /** The next report replaces rather than pushes — a move asked to (`move`). */
27530
+ replaceNext = false;
27139
27531
  /** The remote's own last word on where it stands, never echoed back to it. */
27140
27532
  lastReported;
27141
27533
  lastSent;
@@ -27302,7 +27694,8 @@ class RemoteComponent {
27302
27694
  * A menu click: unlike a path binding the host URL does not hold it yet, so
27303
27695
  * the report that follows is a move to write, not an echo to drop.
27304
27696
  */
27305
- move = (path) => {
27697
+ move = (path, options) => {
27698
+ this.replaceNext = !!options?.replaceUrl;
27306
27699
  this.loadedElement?.dispatchEvent(new CustomEvent(WC_NAVIGATE_EVENT, { detail: { path } }));
27307
27700
  };
27308
27701
  onReport = (event) => {
@@ -27328,8 +27721,9 @@ class RemoteComponent {
27328
27721
  const out = untracked(() => this.out());
27329
27722
  const target = out ? out(path, link) : path;
27330
27723
  const url = this.url();
27331
- const replace = !this.reported;
27724
+ const replace = !this.reported || this.replaceNext;
27332
27725
  this.reported = true;
27726
+ this.replaceNext = false;
27333
27727
  const keys = queryKeysOf(target);
27334
27728
  const dropped = this.queryKeys.filter((k) => !keys.includes(k));
27335
27729
  this.queryKeys = keys;
@@ -29189,7 +29583,7 @@ class TableHeaderComponent {
29189
29583
  }
29190
29584
  </tr>
29191
29585
  </thead>
29192
- `, 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-table-thead__th{position:sticky;top:0;z-index:10;background:color-mix(in srgb,var(--m-background) 95%,transparent);-webkit-backdrop-filter:blur(28px);backdrop-filter:blur(28px);padding:1.25rem;text-align:left;font-size:.75rem;font-weight:700;text-transform:uppercase;letter-spacing:.1em;color:var(--m-text-tertiary);border-bottom:2px solid var(--m-backdrop-border);white-space:nowrap;transition:all .2s ease}.m-table-thead__th:hover{color:var(--m-text);background:var(--m-background)}@media(min-width:769px){.m-table-thead__th--fixed{z-index:20;background:var(--m-background)}}@media(max-width:768px){.m-table-thead__th--fixed{position:static;z-index:auto}}.m-table-thead__th--fixed{border-right:none}@media(min-width:769px){.m-table-thead__th--fixed-last{border-right:1px solid var(--m-backdrop-border)}}@media(max-width:768px){.m-table-thead__th--fixed-last{border-right:none}}.m-table-thead__th--sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.m-table-thead__th--select{width:48px;min-width:48px;max-width:48px;padding:0 1rem;text-align:center}.m-table-thead__th--select input[type=checkbox]{width:1rem;height:1rem;cursor:pointer;accent-color:var(--m-mm);border-radius:3px;display:block;margin:0 auto}.m-table-thead__cell{display:flex;align-items:center;gap:.5rem}.m-table-thead__sort-icon{color:var(--m-mm);opacity:.6;transition:opacity .2s ease}.m-table-thead__th:hover .m-table-thead__sort-icon{opacity:1}.m-table-thead__menu-btn{display:flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;margin-left:auto;border:none;background:transparent;cursor:pointer;color:var(--m-text-tertiary);border-radius:6px;opacity:0;transition:all .15ms ease}.m-table-thead__menu-btn:hover{background:var(--m-backdrop-surface);color:var(--m-text)}.m-table-thead__th:hover .m-table-thead__menu-btn{opacity:1}\n"], dependencies: [{ kind: "component", type: CheckboxInputComponent, selector: "m-checkbox", inputs: ["checked", "config", "required", "disabled", "invalid", "touched", "focused", "errors"], outputs: ["checkedChange", "touchedChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
29586
+ `, 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-table-thead__th{position:sticky;top:0;z-index:10;background:var(--m-table-thead-background, color-mix(in srgb, var(--m-background) 95%, transparent));-webkit-backdrop-filter:var(--m-table-thead-backdrop-filter, blur(28px));backdrop-filter:var(--m-table-thead-backdrop-filter, blur(28px));padding:1.25rem;text-align:left;font-size:.75rem;font-weight:700;text-transform:uppercase;letter-spacing:.1em;color:var(--m-text-tertiary);border-bottom:2px solid var(--m-backdrop-border);white-space:nowrap;transition:all .2s ease}.m-table-thead__th:hover{color:var(--m-text);background:var(--m-table-thead-background, var(--m-background))}@media(min-width:769px){.m-table-thead__th--fixed{z-index:20;background:var(--m-table-thead-background, var(--m-background))}}@media(max-width:768px){.m-table-thead__th--fixed{position:static;z-index:auto}}.m-table-thead__th--fixed{border-right:none}@media(min-width:769px){.m-table-thead__th--fixed-last{border-right:1px solid var(--m-backdrop-border)}}@media(max-width:768px){.m-table-thead__th--fixed-last{border-right:none}}.m-table-thead__th--sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.m-table-thead__th--select{width:48px;min-width:48px;max-width:48px;padding:0 1rem;text-align:center}.m-table-thead__th--select input[type=checkbox]{width:1rem;height:1rem;cursor:pointer;accent-color:var(--m-mm);border-radius:3px;display:block;margin:0 auto}.m-table-thead__cell{display:flex;align-items:center;gap:.5rem}.m-table-thead__sort-icon{color:var(--m-mm);opacity:.6;transition:opacity .2s ease}.m-table-thead__th:hover .m-table-thead__sort-icon{opacity:1}.m-table-thead__menu-btn{display:flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;margin-left:auto;border:none;background:transparent;cursor:pointer;color:var(--m-text-tertiary);border-radius:6px;opacity:0;transition:all .15ms ease}.m-table-thead__menu-btn:hover{background:var(--m-backdrop-surface);color:var(--m-text)}.m-table-thead__th:hover .m-table-thead__menu-btn{opacity:1}\n"], dependencies: [{ kind: "component", type: CheckboxInputComponent, selector: "m-checkbox", inputs: ["checked", "config", "required", "disabled", "invalid", "touched", "focused", "errors"], outputs: ["checkedChange", "touchedChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
29193
29587
  }
29194
29588
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: TableHeaderComponent, decorators: [{
29195
29589
  type: Component,
@@ -29242,7 +29636,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
29242
29636
  }
29243
29637
  </tr>
29244
29638
  </thead>
29245
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}.m-table-thead__th{position:sticky;top:0;z-index:10;background:color-mix(in srgb,var(--m-background) 95%,transparent);-webkit-backdrop-filter:blur(28px);backdrop-filter:blur(28px);padding:1.25rem;text-align:left;font-size:.75rem;font-weight:700;text-transform:uppercase;letter-spacing:.1em;color:var(--m-text-tertiary);border-bottom:2px solid var(--m-backdrop-border);white-space:nowrap;transition:all .2s ease}.m-table-thead__th:hover{color:var(--m-text);background:var(--m-background)}@media(min-width:769px){.m-table-thead__th--fixed{z-index:20;background:var(--m-background)}}@media(max-width:768px){.m-table-thead__th--fixed{position:static;z-index:auto}}.m-table-thead__th--fixed{border-right:none}@media(min-width:769px){.m-table-thead__th--fixed-last{border-right:1px solid var(--m-backdrop-border)}}@media(max-width:768px){.m-table-thead__th--fixed-last{border-right:none}}.m-table-thead__th--sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.m-table-thead__th--select{width:48px;min-width:48px;max-width:48px;padding:0 1rem;text-align:center}.m-table-thead__th--select input[type=checkbox]{width:1rem;height:1rem;cursor:pointer;accent-color:var(--m-mm);border-radius:3px;display:block;margin:0 auto}.m-table-thead__cell{display:flex;align-items:center;gap:.5rem}.m-table-thead__sort-icon{color:var(--m-mm);opacity:.6;transition:opacity .2s ease}.m-table-thead__th:hover .m-table-thead__sort-icon{opacity:1}.m-table-thead__menu-btn{display:flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;margin-left:auto;border:none;background:transparent;cursor:pointer;color:var(--m-text-tertiary);border-radius:6px;opacity:0;transition:all .15ms ease}.m-table-thead__menu-btn:hover{background:var(--m-backdrop-surface);color:var(--m-text)}.m-table-thead__th:hover .m-table-thead__menu-btn{opacity:1}\n"] }]
29639
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}.m-table-thead__th{position:sticky;top:0;z-index:10;background:var(--m-table-thead-background, color-mix(in srgb, var(--m-background) 95%, transparent));-webkit-backdrop-filter:var(--m-table-thead-backdrop-filter, blur(28px));backdrop-filter:var(--m-table-thead-backdrop-filter, blur(28px));padding:1.25rem;text-align:left;font-size:.75rem;font-weight:700;text-transform:uppercase;letter-spacing:.1em;color:var(--m-text-tertiary);border-bottom:2px solid var(--m-backdrop-border);white-space:nowrap;transition:all .2s ease}.m-table-thead__th:hover{color:var(--m-text);background:var(--m-table-thead-background, var(--m-background))}@media(min-width:769px){.m-table-thead__th--fixed{z-index:20;background:var(--m-table-thead-background, var(--m-background))}}@media(max-width:768px){.m-table-thead__th--fixed{position:static;z-index:auto}}.m-table-thead__th--fixed{border-right:none}@media(min-width:769px){.m-table-thead__th--fixed-last{border-right:1px solid var(--m-backdrop-border)}}@media(max-width:768px){.m-table-thead__th--fixed-last{border-right:none}}.m-table-thead__th--sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.m-table-thead__th--select{width:48px;min-width:48px;max-width:48px;padding:0 1rem;text-align:center}.m-table-thead__th--select input[type=checkbox]{width:1rem;height:1rem;cursor:pointer;accent-color:var(--m-mm);border-radius:3px;display:block;margin:0 auto}.m-table-thead__cell{display:flex;align-items:center;gap:.5rem}.m-table-thead__sort-icon{color:var(--m-mm);opacity:.6;transition:opacity .2s ease}.m-table-thead__th:hover .m-table-thead__sort-icon{opacity:1}.m-table-thead__menu-btn{display:flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;margin-left:auto;border:none;background:transparent;cursor:pointer;color:var(--m-text-tertiary);border-radius:6px;opacity:0;transition:all .15ms ease}.m-table-thead__menu-btn:hover{background:var(--m-backdrop-surface);color:var(--m-text)}.m-table-thead__th:hover .m-table-thead__menu-btn{opacity:1}\n"] }]
29246
29640
  }], propDecorators: { visibleColumns: [{ type: i0.Input, args: [{ isSignal: true, alias: "visibleColumns", required: false }] }], fixedCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "fixedCount", required: false }] }], fixedOffset: [{ type: i0.Input, args: [{ isSignal: true, alias: "fixedOffset", required: false }] }], sortState: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortState", required: false }] }], sortClick: [{ type: i0.Output, args: ["sortClick"] }], selectable: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectable", required: false }] }], allSelected: [{ type: i0.Input, args: [{ isSignal: true, alias: "allSelected", required: false }] }], someSelected: [{ type: i0.Input, args: [{ isSignal: true, alias: "someSelected", required: false }] }], selectAll: [{ type: i0.Output, args: ["selectAll"] }] } });
29247
29641
 
29248
29642
  class TableUserCellComponent {
@@ -31304,7 +31698,7 @@ class TreeGridComponent extends ConfigComponent {
31304
31698
  </table>
31305
31699
  </div>
31306
31700
  </div>
31307
- `, 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-table{display:flex;flex-direction:column;border:1px solid var(--m-backdrop-border);border-radius:12px;overflow:clip;background:#ffffffe6;-webkit-backdrop-filter:blur(40px);backdrop-filter:blur(40px);position:relative;transition:background-color .3s ease}.m-table--flat{border:none;box-shadow:none;background:transparent;-webkit-backdrop-filter:none;backdrop-filter:none;border-radius:0}.m-table__toolbar{position:sticky;top:0;z-index:2;display:flex;align-items:center;justify-content:space-between;padding:1.5rem var(--m-table-toolbar-padding-x, 1.25rem);border-bottom:1px solid var(--m-backdrop-border);gap:1.5rem;background:color-mix(in srgb,var(--m-background) 45%,transparent)}.m-table--flat .m-table__toolbar{background:transparent;padding-left:0;padding-right:0}.m-table__title{margin:0;font-size:1.25rem;font-weight:800;color:var(--m-text);letter-spacing:-.02em;flex:1}.m-table__search{flex:0 1 auto;display:flex;align-items:center}.m-table__search .m-input-wrapper{width:100%}.m-table__mobile-view{display:flex;flex-direction:column;gap:1rem;padding:1.25rem;flex:1;overflow:auto}.m-table__empty-mobile{padding:3rem 1.5rem;text-align:center;color:var(--m-text-tertiary);font-size:.9375rem;font-weight:500;font-style:italic;opacity:.8;background:color-mix(in srgb,var(--m-background) 20%,transparent);border-radius:12px;border:1px dashed var(--m-backdrop-border)}.m-table__wrapper{overflow:auto;flex:1}.m-table__wrapper::-webkit-scrollbar{width:6px;height:6px}.m-table__wrapper::-webkit-scrollbar-track{background:transparent}.m-table__wrapper::-webkit-scrollbar-thumb{background:var(--m-backdrop-border);border-radius:10px}.m-table__wrapper::-webkit-scrollbar-thumb:hover{background:var(--m-text-tertiary)}.m-table__table{width:100%;min-width:100%;border-collapse:separate;border-spacing:0}mark.m-table__highlight{background:var(--m-highlight);color:#000;border-radius:2px;padding:0 2px;font-weight:700;box-shadow:0 1px 4px #0003}mark.m-table__highlight .m-one-pagination{margin-left:auto;--m-button-size: 2.25rem;--m-pagination-gap: .375rem}.m-table-pagination{display:flex;align-items:center;gap:1.5rem;padding:1.25rem var(--m-table-pagination-padding-x, 1.25rem);border-top:1px solid var(--m-backdrop-border);font-size:.8125rem;flex-wrap:wrap;background:color-mix(in srgb,var(--m-background) 40%,transparent)}.m-table--flat .m-table-pagination{background:transparent;padding-left:0;padding-right:0}.m-table-pagination__size{display:flex;flex-direction:column;align-items:flex-start;gap:.35rem;color:var(--m-text-secondary);font-weight:500}.m-table-pagination__select{border:1px solid var(--m-backdrop-border);border-radius:8px;background:var(--m-backdrop-surface);color:var(--m-text);padding:.375rem .625rem;font-size:.8125rem;font-weight:600;cursor:pointer;transition:all .2s cubic-bezier(.4,0,.2,1);outline:none}.m-table-pagination__select:hover{background:var(--m-backdrop-glass);border-color:var(--m-mm);box-shadow:0 0 0 3px color-mix(in srgb,var(--m-mm) 10%,transparent)}.m-table-pagination__select:focus{border-color:var(--m-mm);box-shadow:0 0 0 3px color-mix(in srgb,var(--m-mm) 20%,transparent)}.m-table-filter{display:flex;flex-wrap:wrap;align-items:center;gap:10px;padding:1rem 1.25rem;background:color-mix(in srgb,var(--m-background-lite) 60%,transparent);border-bottom:1px solid var(--m-backdrop-border);box-shadow:inset 0 2px 4px #00000005;overflow-x:auto;scrollbar-width:none}.m-table-filter::-webkit-scrollbar{display:none}.m-table--flat .m-table-filter{background:transparent;padding-left:0;padding-right:0;border-bottom:none}.m-table-filter__item{display:flex;align-items:center;gap:10px;padding:.4375rem 1rem;border-radius:12px;background:var(--m-background);border:1px solid var(--m-backdrop-border);color:var(--m-text-secondary);cursor:pointer;transition:all .2s cubic-bezier(.4,0,.2,1);white-space:nowrap;-webkit-user-select:none;user-select:none;outline:none;font-weight:500}.m-table-filter__item:hover{border-color:var(--m-mm);color:var(--m-mm);background:var(--m-background);transform:translateY(-1px);box-shadow:0 4px 12px #0000000d}.m-table-filter__item--active{background:var(--m-mm);border-color:var(--m-mm);color:var(--m-inverse-text);font-weight:600;box-shadow:0 8px 16px color-mix(in srgb,var(--m-mm) 25%,transparent)}.m-table-filter__item--active:hover{background:var(--m-mm);border-color:var(--m-mm);color:var(--m-inverse-text);transform:translateY(-1px)}.m-table-filter__item--active .m-table-filter__badge{background:#fff3;color:var(--m-inverse-text);border-color:#ffffff1a}.m-table-filter__item--primary{background:var(--m-mm);border-color:var(--m-mm);color:var(--m-inverse-text);font-weight:600;box-shadow:0 8px 16px color-mix(in srgb,var(--m-mm) 25%,transparent)}.m-table-filter__item--primary:hover{background:var(--m-mm);border-color:var(--m-mm);color:var(--m-inverse-text);transform:translateY(-1px);box-shadow:0 10px 20px color-mix(in srgb,var(--m-mm) 30%,transparent)}.m-table-filter__item--primary .m-table-filter__badge{background:#fff3;color:var(--m-inverse-text);border-color:#ffffff1a}.m-table-filter__item--danger{border-color:var(--m-error);color:var(--m-error)}.m-table-filter__item--danger:hover{border-color:var(--m-error);color:var(--m-error);background:var(--m-backdrop-error);transform:translateY(-1px);box-shadow:0 4px 12px color-mix(in srgb,var(--m-error) 12%,transparent)}.m-table-filter__item--danger .m-table-filter__badge{background:var(--m-backdrop-error);color:var(--m-error);border-color:color-mix(in srgb,var(--m-error) 20%,transparent)}.m-table-filter__label{font-size:.8125rem;font-weight:600;letter-spacing:.01em}.m-table-filter__badge{display:inline-flex;align-items:center;justify-content:center;min-width:1.25rem;height:1.25rem;padding:0 .375rem;border-radius:100px;background:var(--m-backdrop-surface);color:var(--m-text-secondary);font-size:.6875rem;font-weight:700;border:1px solid var(--m-backdrop-border);transition:all .2s ease}.m-table-thead__th{position:sticky;top:0;z-index:10;background:color-mix(in srgb,var(--m-background) 95%,transparent);-webkit-backdrop-filter:blur(28px);backdrop-filter:blur(28px);padding:1.25rem;text-align:left;font-size:.75rem;font-weight:700;text-transform:uppercase;letter-spacing:.1em;color:var(--m-text-tertiary);border-bottom:2px solid var(--m-backdrop-border);white-space:nowrap;transition:all .2s ease}.m-table-thead__th:hover{color:var(--m-text);background:var(--m-background)}@media(min-width:769px){.m-table-thead__th--fixed{z-index:20;background:var(--m-background)}}@media(max-width:768px){.m-table-thead__th--fixed{position:static;z-index:auto}}.m-table-thead__th--fixed{border-right:none}@media(min-width:769px){.m-table-thead__th--fixed-last{border-right:1px solid var(--m-backdrop-border)}}@media(max-width:768px){.m-table-thead__th--fixed-last{border-right:none}}.m-table-thead__th--sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.m-table-thead__th--select{width:48px;min-width:48px;max-width:48px;padding:0 1rem;text-align:center}.m-table-thead__th--select input[type=checkbox]{width:1rem;height:1rem;cursor:pointer;accent-color:var(--m-mm);border-radius:3px;display:block;margin:0 auto}.m-table-thead__cell{display:flex;align-items:center;gap:.5rem}.m-table-thead__sort-icon{color:var(--m-mm);opacity:.6;transition:opacity .2s ease}.m-table-thead__th:hover .m-table-thead__sort-icon{opacity:1}.m-table-thead__menu-btn{display:flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;margin-left:auto;border:none;background:transparent;cursor:pointer;color:var(--m-text-tertiary);border-radius:6px;opacity:0;transition:all .15ms ease}.m-table-thead__menu-btn:hover{background:var(--m-backdrop-surface);color:var(--m-text)}.m-table-thead__th:hover .m-table-thead__menu-btn{opacity:1}.m-table-body__row{transition:background-color .3s cubic-bezier(.4,0,.2,1);position:relative}.m-table-body__row:hover{background:color-mix(in srgb,var(--m-mm) 5%,transparent)}.m-table-body__row:hover .m-table-body__cell{background:inherit}.m-table-body__cell{padding:1rem 1.25rem;font-size:.875rem;color:var(--m-text);border-bottom:1px solid var(--m-backdrop-border);white-space:nowrap;vertical-align:middle;background:transparent;transition:background-color .3s ease}.m-table-body__cell[class*=--number],.m-table-body__cell[class*=--currency],.m-table-body__cell[class*=--percent]{font-family:Inter,Roboto Mono,monospace;font-variant-numeric:tabular-nums;letter-spacing:-.01em}@media(min-width:769px){.m-table-body__cell--fixed{position:sticky;background:var(--m-background);z-index:5}}@media(max-width:768px){.m-table-body__cell--fixed{position:static;background:transparent;z-index:auto}}.m-table-body__cell--fixed{border-right:none;transition:background-color .3s ease}.m-table-body__row:hover .m-table-body__cell--fixed{background:color-mix(in srgb,var(--m-mm) 5%,var(--m-background));z-index:6}@media(min-width:769px){.m-table-body__cell--fixed-last{border-right:1px solid var(--m-backdrop-border)}}@media(max-width:768px){.m-table-body__cell--fixed-last{border-right:none}}.m-table-body__cell--context-menu{padding-top:.35rem;padding-bottom:.35rem}.m-table-body__cell--select{width:48px;min-width:48px;max-width:48px;padding:0 1rem;text-align:center}.m-table-body__cell--select input[type=checkbox],.m-table-body__cell--select input[type=radio]{width:1rem;height:1rem;cursor:pointer;accent-color:var(--m-mm);display:block;margin:0 auto}.m-table-body__input{border:none;border-bottom:2px solid var(--m-backdrop-border);background:transparent;font-size:.875rem;color:var(--m-text);padding:.25rem;outline:none;width:100%;transition:border-bottom-color .2s ease}.m-table-body__input:focus{border-bottom-color:var(--m-mm)}.m-table-body__action-btn{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;border:none;background:transparent;cursor:pointer;color:var(--m-text-tertiary);border-radius:8px;transition:all .2s ease}.m-table-body__action-btn:hover{background:var(--m-backdrop-surface);color:var(--m-text)}.m-table-body__empty{text-align:center;padding:4rem;color:var(--m-text-tertiary);font-size:1rem;font-weight:500;letter-spacing:.02em;font-style:italic;opacity:.7}.m-table-body__link{color:var(--m-mm);text-decoration:none;cursor:pointer;font-weight:600;transition:color .2s ease}.m-table-body__link:hover{text-decoration:underline;color:var(--m-mm-lite)}.m-table-body__value{padding:.25rem .5rem;border-radius:6px;font-weight:600;font-variant-numeric:tabular-nums;letter-spacing:-.01em}.m-table-body__value--positive{color:var(--m-success);background:var(--m-backdrop-success)}.m-table-body__value--negative{color:var(--m-error);background:var(--m-backdrop-error)}.m-table-body__dash{color:var(--m-text-tertiary);font-weight:400;font-style:italic;opacity:.8}.m-tree-grid{--m-tree-grid-icon: .75rem}.m-tree-grid .m-table-thead__th,.m-tree-grid .m-table-body__cell{padding:.375rem .5rem}.m-tree-grid .m-table-thead__th{font-size:.6875rem;letter-spacing:.06em;border-bottom-width:1px}.m-tree-grid__tree-cell{display:flex;align-items:center;gap:0;min-width:0}.m-tree-grid__indent{flex:0 0 auto;width:calc(var(--m-tree-grid-depth, 0) * var(--m-tree-grid-indent, var(--m-tree-grid-icon)))}.m-tree-grid__toggle{flex:0 0 auto;width:var(--m-tree-grid-icon);height:var(--m-tree-grid-icon);display:inline-flex;align-items:center;justify-content:center}.m-tree-grid__toggle m-button{--m-button-size: .333rem}.m-tree-grid__toggle-spacer{width:var(--m-tree-grid-icon);height:var(--m-tree-grid-icon);flex:0 0 auto}.m-tree-grid__lead-icon{flex:0 0 auto;display:inline-flex;align-items:center;margin-left:.125rem;opacity:.75}.m-tree-grid__lead-icon m-icon{--m-icon-size: .75rem}.m-tree-grid__label{min-width:0;margin-left:.25rem;overflow:hidden;text-overflow:ellipsis;font-size:.875em;line-height:1.25}.m-tree-grid .m-table-body__row{cursor:pointer}.m-tree-grid .m-table-body__row--selected{background:color-mix(in srgb,var(--m-mm) 12%,transparent)}.m-tree-grid .m-table__toolbar{padding:.5rem;background:var(--m-background)}.m-tree-grid .m-table__search{flex:1 1 auto;width:100%}.m-tree-grid .m-table__search m-input-wrapper,.m-tree-grid .m-table__search .m-input-wrapper{width:100%}.m-tree-grid__match{background:var(--m-highlight);padding:0;color:inherit;border-radius:2px}\n"], dependencies: [{ kind: "component", type: TableHeaderComponent, selector: "m-table-header", inputs: ["visibleColumns", "fixedCount", "fixedOffset", "sortState", "selectable", "allSelected", "someSelected"], outputs: ["sortClick", "selectAll"] }, { kind: "component", type: FreezeComponent, selector: "m-freeze", inputs: ["config"] }, { kind: "component", type: ButtonComponent, selector: "m-button,m-one-button", inputs: ["config", "color", "labelClass", "fullWidth", "nav", "navParams", "href", "disabled", "variant", "name", "baseUrl", "one", "remote", "label", "noTranslate", "params", "noNative", "icon", "isRightIcon", "iconOnly", "stacked", "imgSrc", "nonClickable", "inverted", "isSubmit", "tabindex"], outputs: ["configChange", "clicked"] }, { kind: "component", type: HeaderComponent$1, selector: "m-header", inputs: ["level", "label", "icon", "actionButton", "actionLabel", "noTranslate", "params"], outputs: ["actionClick"] }, { kind: "component", type: IconComponent, selector: "m-icon, m-one-icon", inputs: ["config", "name", "color", "size", "one", "baseUrl", "remote"], outputs: ["configChange"] }, { kind: "component", type: ContextMenuComponent, selector: "m-context-menu, m-one-context-menu", inputs: ["toggle", "remote", "exclude", "visibilityRule", "disableRule", "extraData", "inverted", "options"], outputs: ["toggleChange", "action"] }, { kind: "component", type: WrapperInputComponent, selector: "m-input-wrapper", inputs: ["remote", "value", "readonly", "state", "focused", "form", "options", "dir", "element", "data", "template", "placeholder", "aclResolver", "formValues"], outputs: ["valueChange", "stateChange", "act", "fieldKey", "fieldType"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
31701
+ `, 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-table{display:flex;flex-direction:column;border:1px solid var(--m-backdrop-border);border-radius:12px;overflow:clip;background:#ffffffe6;-webkit-backdrop-filter:blur(40px);backdrop-filter:blur(40px);position:relative;transition:background-color .3s ease}.m-table--flat{border:none;box-shadow:none;background:transparent;-webkit-backdrop-filter:none;backdrop-filter:none;border-radius:0}.m-table__toolbar{position:sticky;top:0;z-index:2;display:flex;align-items:center;justify-content:space-between;padding:1.5rem var(--m-table-toolbar-padding-x, 1.25rem);border-bottom:1px solid var(--m-backdrop-border);gap:1.5rem;background:color-mix(in srgb,var(--m-background) 45%,transparent)}.m-table--flat .m-table__toolbar{background:transparent;padding-left:0;padding-right:0}.m-table__title{margin:0;font-size:1.25rem;font-weight:800;color:var(--m-text);letter-spacing:-.02em;flex:1}.m-table__search{flex:0 1 auto;display:flex;align-items:center}.m-table__search .m-input-wrapper{width:100%}.m-table__mobile-view{display:flex;flex-direction:column;gap:1rem;padding:1.25rem;flex:1;overflow:auto}.m-table__empty-mobile{padding:3rem 1.5rem;text-align:center;color:var(--m-text-tertiary);font-size:.9375rem;font-weight:500;font-style:italic;opacity:.8;background:color-mix(in srgb,var(--m-background) 20%,transparent);border-radius:12px;border:1px dashed var(--m-backdrop-border)}.m-table__wrapper{overflow:auto;flex:1}.m-table__wrapper::-webkit-scrollbar{width:6px;height:6px}.m-table__wrapper::-webkit-scrollbar-track{background:transparent}.m-table__wrapper::-webkit-scrollbar-thumb{background:var(--m-backdrop-border);border-radius:10px}.m-table__wrapper::-webkit-scrollbar-thumb:hover{background:var(--m-text-tertiary)}.m-table__table{width:100%;min-width:100%;border-collapse:separate;border-spacing:0}mark.m-table__highlight{background:var(--m-highlight);color:#000;border-radius:2px;padding:0 2px;font-weight:700;box-shadow:0 1px 4px #0003}mark.m-table__highlight .m-one-pagination{margin-left:auto;--m-button-size: 2.25rem;--m-pagination-gap: .375rem}.m-table-pagination{display:flex;align-items:center;gap:1.5rem;padding:1.25rem var(--m-table-pagination-padding-x, 1.25rem);border-top:1px solid var(--m-backdrop-border);font-size:.8125rem;flex-wrap:wrap;background:color-mix(in srgb,var(--m-background) 40%,transparent)}.m-table--flat .m-table-pagination{background:transparent;padding-left:0;padding-right:0}.m-table-pagination__size{display:flex;flex-direction:column;align-items:flex-start;gap:.35rem;color:var(--m-text-secondary);font-weight:500}.m-table-pagination__select{border:1px solid var(--m-backdrop-border);border-radius:8px;background:var(--m-backdrop-surface);color:var(--m-text);padding:.375rem .625rem;font-size:.8125rem;font-weight:600;cursor:pointer;transition:all .2s cubic-bezier(.4,0,.2,1);outline:none}.m-table-pagination__select:hover{background:var(--m-backdrop-glass);border-color:var(--m-mm);box-shadow:0 0 0 3px color-mix(in srgb,var(--m-mm) 10%,transparent)}.m-table-pagination__select:focus{border-color:var(--m-mm);box-shadow:0 0 0 3px color-mix(in srgb,var(--m-mm) 20%,transparent)}.m-table-filter{display:flex;flex-wrap:wrap;align-items:center;gap:10px;padding:1rem 1.25rem;background:color-mix(in srgb,var(--m-background-lite) 60%,transparent);border-bottom:1px solid var(--m-backdrop-border);box-shadow:inset 0 2px 4px #00000005;overflow-x:auto;scrollbar-width:none}.m-table-filter::-webkit-scrollbar{display:none}.m-table--flat .m-table-filter{background:transparent;padding-left:0;padding-right:0;border-bottom:none}.m-table-filter__item{display:flex;align-items:center;gap:10px;padding:.4375rem 1rem;border-radius:12px;background:var(--m-background);border:1px solid var(--m-backdrop-border);color:var(--m-text-secondary);cursor:pointer;transition:all .2s cubic-bezier(.4,0,.2,1);white-space:nowrap;-webkit-user-select:none;user-select:none;outline:none;font-weight:500}.m-table-filter__item:hover{border-color:var(--m-mm);color:var(--m-mm);background:var(--m-background);transform:translateY(-1px);box-shadow:0 4px 12px #0000000d}.m-table-filter__item--active{background:var(--m-mm);border-color:var(--m-mm);color:var(--m-inverse-text);font-weight:600;box-shadow:0 8px 16px color-mix(in srgb,var(--m-mm) 25%,transparent)}.m-table-filter__item--active:hover{background:var(--m-mm);border-color:var(--m-mm);color:var(--m-inverse-text);transform:translateY(-1px)}.m-table-filter__item--active .m-table-filter__badge{background:#fff3;color:var(--m-inverse-text);border-color:#ffffff1a}.m-table-filter__item--primary{background:var(--m-mm);border-color:var(--m-mm);color:var(--m-inverse-text);font-weight:600;box-shadow:0 8px 16px color-mix(in srgb,var(--m-mm) 25%,transparent)}.m-table-filter__item--primary:hover{background:var(--m-mm);border-color:var(--m-mm);color:var(--m-inverse-text);transform:translateY(-1px);box-shadow:0 10px 20px color-mix(in srgb,var(--m-mm) 30%,transparent)}.m-table-filter__item--primary .m-table-filter__badge{background:#fff3;color:var(--m-inverse-text);border-color:#ffffff1a}.m-table-filter__item--danger{border-color:var(--m-error);color:var(--m-error)}.m-table-filter__item--danger:hover{border-color:var(--m-error);color:var(--m-error);background:var(--m-backdrop-error);transform:translateY(-1px);box-shadow:0 4px 12px color-mix(in srgb,var(--m-error) 12%,transparent)}.m-table-filter__item--danger .m-table-filter__badge{background:var(--m-backdrop-error);color:var(--m-error);border-color:color-mix(in srgb,var(--m-error) 20%,transparent)}.m-table-filter__label{font-size:.8125rem;font-weight:600;letter-spacing:.01em}.m-table-filter__badge{display:inline-flex;align-items:center;justify-content:center;min-width:1.25rem;height:1.25rem;padding:0 .375rem;border-radius:100px;background:var(--m-backdrop-surface);color:var(--m-text-secondary);font-size:.6875rem;font-weight:700;border:1px solid var(--m-backdrop-border);transition:all .2s ease}.m-table-thead__th{position:sticky;top:0;z-index:10;background:var(--m-table-thead-background, color-mix(in srgb, var(--m-background) 95%, transparent));-webkit-backdrop-filter:var(--m-table-thead-backdrop-filter, blur(28px));backdrop-filter:var(--m-table-thead-backdrop-filter, blur(28px));padding:1.25rem;text-align:left;font-size:.75rem;font-weight:700;text-transform:uppercase;letter-spacing:.1em;color:var(--m-text-tertiary);border-bottom:2px solid var(--m-backdrop-border);white-space:nowrap;transition:all .2s ease}.m-table-thead__th:hover{color:var(--m-text);background:var(--m-table-thead-background, var(--m-background))}@media(min-width:769px){.m-table-thead__th--fixed{z-index:20;background:var(--m-table-thead-background, var(--m-background))}}@media(max-width:768px){.m-table-thead__th--fixed{position:static;z-index:auto}}.m-table-thead__th--fixed{border-right:none}@media(min-width:769px){.m-table-thead__th--fixed-last{border-right:1px solid var(--m-backdrop-border)}}@media(max-width:768px){.m-table-thead__th--fixed-last{border-right:none}}.m-table-thead__th--sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.m-table-thead__th--select{width:48px;min-width:48px;max-width:48px;padding:0 1rem;text-align:center}.m-table-thead__th--select input[type=checkbox]{width:1rem;height:1rem;cursor:pointer;accent-color:var(--m-mm);border-radius:3px;display:block;margin:0 auto}.m-table-thead__cell{display:flex;align-items:center;gap:.5rem}.m-table-thead__sort-icon{color:var(--m-mm);opacity:.6;transition:opacity .2s ease}.m-table-thead__th:hover .m-table-thead__sort-icon{opacity:1}.m-table-thead__menu-btn{display:flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;margin-left:auto;border:none;background:transparent;cursor:pointer;color:var(--m-text-tertiary);border-radius:6px;opacity:0;transition:all .15ms ease}.m-table-thead__menu-btn:hover{background:var(--m-backdrop-surface);color:var(--m-text)}.m-table-thead__th:hover .m-table-thead__menu-btn{opacity:1}.m-table-body__row{transition:background-color .3s cubic-bezier(.4,0,.2,1);position:relative}.m-table-body__row:hover{background:color-mix(in srgb,var(--m-mm) 5%,transparent)}.m-table-body__row:hover .m-table-body__cell{background:inherit}.m-table-body__cell{padding:1rem 1.25rem;font-size:.875rem;color:var(--m-text);border-bottom:1px solid var(--m-backdrop-border);white-space:nowrap;vertical-align:middle;background:transparent;transition:background-color .3s ease}.m-table-body__cell[class*=--number],.m-table-body__cell[class*=--currency],.m-table-body__cell[class*=--percent]{font-family:Inter,Roboto Mono,monospace;font-variant-numeric:tabular-nums;letter-spacing:-.01em}@media(min-width:769px){.m-table-body__cell--fixed{position:sticky;background:var(--m-background);z-index:5}}@media(max-width:768px){.m-table-body__cell--fixed{position:static;background:transparent;z-index:auto}}.m-table-body__cell--fixed{border-right:none;transition:background-color .3s ease}.m-table-body__row:hover .m-table-body__cell--fixed{background:color-mix(in srgb,var(--m-mm) 5%,var(--m-background));z-index:6}@media(min-width:769px){.m-table-body__cell--fixed-last{border-right:1px solid var(--m-backdrop-border)}}@media(max-width:768px){.m-table-body__cell--fixed-last{border-right:none}}.m-table-body__cell--context-menu{padding-top:.35rem;padding-bottom:.35rem}.m-table-body__cell--select{width:48px;min-width:48px;max-width:48px;padding:0 1rem;text-align:center}.m-table-body__cell--select input[type=checkbox],.m-table-body__cell--select input[type=radio]{width:1rem;height:1rem;cursor:pointer;accent-color:var(--m-mm);display:block;margin:0 auto}.m-table-body__input{border:none;border-bottom:2px solid var(--m-backdrop-border);background:transparent;font-size:.875rem;color:var(--m-text);padding:.25rem;outline:none;width:100%;transition:border-bottom-color .2s ease}.m-table-body__input:focus{border-bottom-color:var(--m-mm)}.m-table-body__action-btn{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;border:none;background:transparent;cursor:pointer;color:var(--m-text-tertiary);border-radius:8px;transition:all .2s ease}.m-table-body__action-btn:hover{background:var(--m-backdrop-surface);color:var(--m-text)}.m-table-body__empty{text-align:center;padding:4rem;color:var(--m-text-tertiary);font-size:1rem;font-weight:500;letter-spacing:.02em;font-style:italic;opacity:.7}.m-table-body__link{color:var(--m-mm);text-decoration:none;cursor:pointer;font-weight:600;transition:color .2s ease}.m-table-body__link:hover{text-decoration:underline;color:var(--m-mm-lite)}.m-table-body__value{padding:.25rem .5rem;border-radius:6px;font-weight:600;font-variant-numeric:tabular-nums;letter-spacing:-.01em}.m-table-body__value--positive{color:var(--m-success);background:var(--m-backdrop-success)}.m-table-body__value--negative{color:var(--m-error);background:var(--m-backdrop-error)}.m-table-body__dash{color:var(--m-text-tertiary);font-weight:400;font-style:italic;opacity:.8}.m-tree-grid{--m-tree-grid-icon: .75rem}.m-tree-grid .m-table-thead__th,.m-tree-grid .m-table-body__cell{padding:.375rem .5rem}.m-tree-grid{--m-table-thead-background: transparent;--m-table-thead-backdrop-filter: none}.m-tree-grid .m-table-thead__th{font-size:.6875rem;letter-spacing:.06em;border-bottom-width:1px}.m-tree-grid__tree-cell{display:flex;align-items:center;gap:0;min-width:0}.m-tree-grid__indent{flex:0 0 auto;width:calc(var(--m-tree-grid-depth, 0) * var(--m-tree-grid-indent, var(--m-tree-grid-icon)))}.m-tree-grid__toggle{flex:0 0 auto;width:var(--m-tree-grid-icon);height:var(--m-tree-grid-icon);display:inline-flex;align-items:center;justify-content:center}.m-tree-grid__toggle m-button{--m-button-size: .333rem}.m-tree-grid__toggle-spacer{width:var(--m-tree-grid-icon);height:var(--m-tree-grid-icon);flex:0 0 auto}.m-tree-grid__lead-icon{flex:0 0 auto;display:inline-flex;align-items:center;margin-left:.125rem;opacity:.75}.m-tree-grid__lead-icon m-icon{--m-icon-size: .75rem}.m-tree-grid__label{min-width:0;margin-left:.25rem;overflow:hidden;text-overflow:ellipsis;font-size:.875em;line-height:1.25}.m-tree-grid .m-table-body__row{cursor:pointer}.m-tree-grid .m-table-body__row--selected{background:color-mix(in srgb,var(--m-mm) 12%,transparent)}.m-tree-grid .m-table__toolbar{padding:.5rem;background:transparent}.m-tree-grid .m-table__search{flex:1 1 auto;width:100%}.m-tree-grid .m-table__search m-input-wrapper,.m-tree-grid .m-table__search .m-input-wrapper{width:100%}.m-tree-grid__match{background:var(--m-highlight);padding:0;color:inherit;border-radius:2px}\n"], dependencies: [{ kind: "component", type: TableHeaderComponent, selector: "m-table-header", inputs: ["visibleColumns", "fixedCount", "fixedOffset", "sortState", "selectable", "allSelected", "someSelected"], outputs: ["sortClick", "selectAll"] }, { kind: "component", type: FreezeComponent, selector: "m-freeze", inputs: ["config"] }, { kind: "component", type: ButtonComponent, selector: "m-button,m-one-button", inputs: ["config", "color", "labelClass", "fullWidth", "nav", "navParams", "href", "disabled", "variant", "name", "baseUrl", "one", "remote", "label", "noTranslate", "params", "noNative", "icon", "isRightIcon", "iconOnly", "stacked", "imgSrc", "nonClickable", "inverted", "isSubmit", "tabindex"], outputs: ["configChange", "clicked"] }, { kind: "component", type: HeaderComponent$1, selector: "m-header", inputs: ["level", "label", "icon", "actionButton", "actionLabel", "noTranslate", "params"], outputs: ["actionClick"] }, { kind: "component", type: IconComponent, selector: "m-icon, m-one-icon", inputs: ["config", "name", "color", "size", "one", "baseUrl", "remote"], outputs: ["configChange"] }, { kind: "component", type: ContextMenuComponent, selector: "m-context-menu, m-one-context-menu", inputs: ["toggle", "remote", "exclude", "visibilityRule", "disableRule", "extraData", "inverted", "options"], outputs: ["toggleChange", "action"] }, { kind: "component", type: WrapperInputComponent, selector: "m-input-wrapper", inputs: ["remote", "value", "readonly", "state", "focused", "form", "options", "dir", "element", "data", "template", "placeholder", "aclResolver", "formValues"], outputs: ["valueChange", "stateChange", "act", "fieldKey", "fieldType"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
31308
31702
  }
31309
31703
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: TreeGridComponent, decorators: [{
31310
31704
  type: Component,
@@ -31585,7 +31979,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
31585
31979
  </table>
31586
31980
  </div>
31587
31981
  </div>
31588
- `, 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-table{display:flex;flex-direction:column;border:1px solid var(--m-backdrop-border);border-radius:12px;overflow:clip;background:#ffffffe6;-webkit-backdrop-filter:blur(40px);backdrop-filter:blur(40px);position:relative;transition:background-color .3s ease}.m-table--flat{border:none;box-shadow:none;background:transparent;-webkit-backdrop-filter:none;backdrop-filter:none;border-radius:0}.m-table__toolbar{position:sticky;top:0;z-index:2;display:flex;align-items:center;justify-content:space-between;padding:1.5rem var(--m-table-toolbar-padding-x, 1.25rem);border-bottom:1px solid var(--m-backdrop-border);gap:1.5rem;background:color-mix(in srgb,var(--m-background) 45%,transparent)}.m-table--flat .m-table__toolbar{background:transparent;padding-left:0;padding-right:0}.m-table__title{margin:0;font-size:1.25rem;font-weight:800;color:var(--m-text);letter-spacing:-.02em;flex:1}.m-table__search{flex:0 1 auto;display:flex;align-items:center}.m-table__search .m-input-wrapper{width:100%}.m-table__mobile-view{display:flex;flex-direction:column;gap:1rem;padding:1.25rem;flex:1;overflow:auto}.m-table__empty-mobile{padding:3rem 1.5rem;text-align:center;color:var(--m-text-tertiary);font-size:.9375rem;font-weight:500;font-style:italic;opacity:.8;background:color-mix(in srgb,var(--m-background) 20%,transparent);border-radius:12px;border:1px dashed var(--m-backdrop-border)}.m-table__wrapper{overflow:auto;flex:1}.m-table__wrapper::-webkit-scrollbar{width:6px;height:6px}.m-table__wrapper::-webkit-scrollbar-track{background:transparent}.m-table__wrapper::-webkit-scrollbar-thumb{background:var(--m-backdrop-border);border-radius:10px}.m-table__wrapper::-webkit-scrollbar-thumb:hover{background:var(--m-text-tertiary)}.m-table__table{width:100%;min-width:100%;border-collapse:separate;border-spacing:0}mark.m-table__highlight{background:var(--m-highlight);color:#000;border-radius:2px;padding:0 2px;font-weight:700;box-shadow:0 1px 4px #0003}mark.m-table__highlight .m-one-pagination{margin-left:auto;--m-button-size: 2.25rem;--m-pagination-gap: .375rem}.m-table-pagination{display:flex;align-items:center;gap:1.5rem;padding:1.25rem var(--m-table-pagination-padding-x, 1.25rem);border-top:1px solid var(--m-backdrop-border);font-size:.8125rem;flex-wrap:wrap;background:color-mix(in srgb,var(--m-background) 40%,transparent)}.m-table--flat .m-table-pagination{background:transparent;padding-left:0;padding-right:0}.m-table-pagination__size{display:flex;flex-direction:column;align-items:flex-start;gap:.35rem;color:var(--m-text-secondary);font-weight:500}.m-table-pagination__select{border:1px solid var(--m-backdrop-border);border-radius:8px;background:var(--m-backdrop-surface);color:var(--m-text);padding:.375rem .625rem;font-size:.8125rem;font-weight:600;cursor:pointer;transition:all .2s cubic-bezier(.4,0,.2,1);outline:none}.m-table-pagination__select:hover{background:var(--m-backdrop-glass);border-color:var(--m-mm);box-shadow:0 0 0 3px color-mix(in srgb,var(--m-mm) 10%,transparent)}.m-table-pagination__select:focus{border-color:var(--m-mm);box-shadow:0 0 0 3px color-mix(in srgb,var(--m-mm) 20%,transparent)}.m-table-filter{display:flex;flex-wrap:wrap;align-items:center;gap:10px;padding:1rem 1.25rem;background:color-mix(in srgb,var(--m-background-lite) 60%,transparent);border-bottom:1px solid var(--m-backdrop-border);box-shadow:inset 0 2px 4px #00000005;overflow-x:auto;scrollbar-width:none}.m-table-filter::-webkit-scrollbar{display:none}.m-table--flat .m-table-filter{background:transparent;padding-left:0;padding-right:0;border-bottom:none}.m-table-filter__item{display:flex;align-items:center;gap:10px;padding:.4375rem 1rem;border-radius:12px;background:var(--m-background);border:1px solid var(--m-backdrop-border);color:var(--m-text-secondary);cursor:pointer;transition:all .2s cubic-bezier(.4,0,.2,1);white-space:nowrap;-webkit-user-select:none;user-select:none;outline:none;font-weight:500}.m-table-filter__item:hover{border-color:var(--m-mm);color:var(--m-mm);background:var(--m-background);transform:translateY(-1px);box-shadow:0 4px 12px #0000000d}.m-table-filter__item--active{background:var(--m-mm);border-color:var(--m-mm);color:var(--m-inverse-text);font-weight:600;box-shadow:0 8px 16px color-mix(in srgb,var(--m-mm) 25%,transparent)}.m-table-filter__item--active:hover{background:var(--m-mm);border-color:var(--m-mm);color:var(--m-inverse-text);transform:translateY(-1px)}.m-table-filter__item--active .m-table-filter__badge{background:#fff3;color:var(--m-inverse-text);border-color:#ffffff1a}.m-table-filter__item--primary{background:var(--m-mm);border-color:var(--m-mm);color:var(--m-inverse-text);font-weight:600;box-shadow:0 8px 16px color-mix(in srgb,var(--m-mm) 25%,transparent)}.m-table-filter__item--primary:hover{background:var(--m-mm);border-color:var(--m-mm);color:var(--m-inverse-text);transform:translateY(-1px);box-shadow:0 10px 20px color-mix(in srgb,var(--m-mm) 30%,transparent)}.m-table-filter__item--primary .m-table-filter__badge{background:#fff3;color:var(--m-inverse-text);border-color:#ffffff1a}.m-table-filter__item--danger{border-color:var(--m-error);color:var(--m-error)}.m-table-filter__item--danger:hover{border-color:var(--m-error);color:var(--m-error);background:var(--m-backdrop-error);transform:translateY(-1px);box-shadow:0 4px 12px color-mix(in srgb,var(--m-error) 12%,transparent)}.m-table-filter__item--danger .m-table-filter__badge{background:var(--m-backdrop-error);color:var(--m-error);border-color:color-mix(in srgb,var(--m-error) 20%,transparent)}.m-table-filter__label{font-size:.8125rem;font-weight:600;letter-spacing:.01em}.m-table-filter__badge{display:inline-flex;align-items:center;justify-content:center;min-width:1.25rem;height:1.25rem;padding:0 .375rem;border-radius:100px;background:var(--m-backdrop-surface);color:var(--m-text-secondary);font-size:.6875rem;font-weight:700;border:1px solid var(--m-backdrop-border);transition:all .2s ease}.m-table-thead__th{position:sticky;top:0;z-index:10;background:color-mix(in srgb,var(--m-background) 95%,transparent);-webkit-backdrop-filter:blur(28px);backdrop-filter:blur(28px);padding:1.25rem;text-align:left;font-size:.75rem;font-weight:700;text-transform:uppercase;letter-spacing:.1em;color:var(--m-text-tertiary);border-bottom:2px solid var(--m-backdrop-border);white-space:nowrap;transition:all .2s ease}.m-table-thead__th:hover{color:var(--m-text);background:var(--m-background)}@media(min-width:769px){.m-table-thead__th--fixed{z-index:20;background:var(--m-background)}}@media(max-width:768px){.m-table-thead__th--fixed{position:static;z-index:auto}}.m-table-thead__th--fixed{border-right:none}@media(min-width:769px){.m-table-thead__th--fixed-last{border-right:1px solid var(--m-backdrop-border)}}@media(max-width:768px){.m-table-thead__th--fixed-last{border-right:none}}.m-table-thead__th--sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.m-table-thead__th--select{width:48px;min-width:48px;max-width:48px;padding:0 1rem;text-align:center}.m-table-thead__th--select input[type=checkbox]{width:1rem;height:1rem;cursor:pointer;accent-color:var(--m-mm);border-radius:3px;display:block;margin:0 auto}.m-table-thead__cell{display:flex;align-items:center;gap:.5rem}.m-table-thead__sort-icon{color:var(--m-mm);opacity:.6;transition:opacity .2s ease}.m-table-thead__th:hover .m-table-thead__sort-icon{opacity:1}.m-table-thead__menu-btn{display:flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;margin-left:auto;border:none;background:transparent;cursor:pointer;color:var(--m-text-tertiary);border-radius:6px;opacity:0;transition:all .15ms ease}.m-table-thead__menu-btn:hover{background:var(--m-backdrop-surface);color:var(--m-text)}.m-table-thead__th:hover .m-table-thead__menu-btn{opacity:1}.m-table-body__row{transition:background-color .3s cubic-bezier(.4,0,.2,1);position:relative}.m-table-body__row:hover{background:color-mix(in srgb,var(--m-mm) 5%,transparent)}.m-table-body__row:hover .m-table-body__cell{background:inherit}.m-table-body__cell{padding:1rem 1.25rem;font-size:.875rem;color:var(--m-text);border-bottom:1px solid var(--m-backdrop-border);white-space:nowrap;vertical-align:middle;background:transparent;transition:background-color .3s ease}.m-table-body__cell[class*=--number],.m-table-body__cell[class*=--currency],.m-table-body__cell[class*=--percent]{font-family:Inter,Roboto Mono,monospace;font-variant-numeric:tabular-nums;letter-spacing:-.01em}@media(min-width:769px){.m-table-body__cell--fixed{position:sticky;background:var(--m-background);z-index:5}}@media(max-width:768px){.m-table-body__cell--fixed{position:static;background:transparent;z-index:auto}}.m-table-body__cell--fixed{border-right:none;transition:background-color .3s ease}.m-table-body__row:hover .m-table-body__cell--fixed{background:color-mix(in srgb,var(--m-mm) 5%,var(--m-background));z-index:6}@media(min-width:769px){.m-table-body__cell--fixed-last{border-right:1px solid var(--m-backdrop-border)}}@media(max-width:768px){.m-table-body__cell--fixed-last{border-right:none}}.m-table-body__cell--context-menu{padding-top:.35rem;padding-bottom:.35rem}.m-table-body__cell--select{width:48px;min-width:48px;max-width:48px;padding:0 1rem;text-align:center}.m-table-body__cell--select input[type=checkbox],.m-table-body__cell--select input[type=radio]{width:1rem;height:1rem;cursor:pointer;accent-color:var(--m-mm);display:block;margin:0 auto}.m-table-body__input{border:none;border-bottom:2px solid var(--m-backdrop-border);background:transparent;font-size:.875rem;color:var(--m-text);padding:.25rem;outline:none;width:100%;transition:border-bottom-color .2s ease}.m-table-body__input:focus{border-bottom-color:var(--m-mm)}.m-table-body__action-btn{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;border:none;background:transparent;cursor:pointer;color:var(--m-text-tertiary);border-radius:8px;transition:all .2s ease}.m-table-body__action-btn:hover{background:var(--m-backdrop-surface);color:var(--m-text)}.m-table-body__empty{text-align:center;padding:4rem;color:var(--m-text-tertiary);font-size:1rem;font-weight:500;letter-spacing:.02em;font-style:italic;opacity:.7}.m-table-body__link{color:var(--m-mm);text-decoration:none;cursor:pointer;font-weight:600;transition:color .2s ease}.m-table-body__link:hover{text-decoration:underline;color:var(--m-mm-lite)}.m-table-body__value{padding:.25rem .5rem;border-radius:6px;font-weight:600;font-variant-numeric:tabular-nums;letter-spacing:-.01em}.m-table-body__value--positive{color:var(--m-success);background:var(--m-backdrop-success)}.m-table-body__value--negative{color:var(--m-error);background:var(--m-backdrop-error)}.m-table-body__dash{color:var(--m-text-tertiary);font-weight:400;font-style:italic;opacity:.8}.m-tree-grid{--m-tree-grid-icon: .75rem}.m-tree-grid .m-table-thead__th,.m-tree-grid .m-table-body__cell{padding:.375rem .5rem}.m-tree-grid .m-table-thead__th{font-size:.6875rem;letter-spacing:.06em;border-bottom-width:1px}.m-tree-grid__tree-cell{display:flex;align-items:center;gap:0;min-width:0}.m-tree-grid__indent{flex:0 0 auto;width:calc(var(--m-tree-grid-depth, 0) * var(--m-tree-grid-indent, var(--m-tree-grid-icon)))}.m-tree-grid__toggle{flex:0 0 auto;width:var(--m-tree-grid-icon);height:var(--m-tree-grid-icon);display:inline-flex;align-items:center;justify-content:center}.m-tree-grid__toggle m-button{--m-button-size: .333rem}.m-tree-grid__toggle-spacer{width:var(--m-tree-grid-icon);height:var(--m-tree-grid-icon);flex:0 0 auto}.m-tree-grid__lead-icon{flex:0 0 auto;display:inline-flex;align-items:center;margin-left:.125rem;opacity:.75}.m-tree-grid__lead-icon m-icon{--m-icon-size: .75rem}.m-tree-grid__label{min-width:0;margin-left:.25rem;overflow:hidden;text-overflow:ellipsis;font-size:.875em;line-height:1.25}.m-tree-grid .m-table-body__row{cursor:pointer}.m-tree-grid .m-table-body__row--selected{background:color-mix(in srgb,var(--m-mm) 12%,transparent)}.m-tree-grid .m-table__toolbar{padding:.5rem;background:var(--m-background)}.m-tree-grid .m-table__search{flex:1 1 auto;width:100%}.m-tree-grid .m-table__search m-input-wrapper,.m-tree-grid .m-table__search .m-input-wrapper{width:100%}.m-tree-grid__match{background:var(--m-highlight);padding:0;color:inherit;border-radius:2px}\n"] }]
31982
+ `, 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-table{display:flex;flex-direction:column;border:1px solid var(--m-backdrop-border);border-radius:12px;overflow:clip;background:#ffffffe6;-webkit-backdrop-filter:blur(40px);backdrop-filter:blur(40px);position:relative;transition:background-color .3s ease}.m-table--flat{border:none;box-shadow:none;background:transparent;-webkit-backdrop-filter:none;backdrop-filter:none;border-radius:0}.m-table__toolbar{position:sticky;top:0;z-index:2;display:flex;align-items:center;justify-content:space-between;padding:1.5rem var(--m-table-toolbar-padding-x, 1.25rem);border-bottom:1px solid var(--m-backdrop-border);gap:1.5rem;background:color-mix(in srgb,var(--m-background) 45%,transparent)}.m-table--flat .m-table__toolbar{background:transparent;padding-left:0;padding-right:0}.m-table__title{margin:0;font-size:1.25rem;font-weight:800;color:var(--m-text);letter-spacing:-.02em;flex:1}.m-table__search{flex:0 1 auto;display:flex;align-items:center}.m-table__search .m-input-wrapper{width:100%}.m-table__mobile-view{display:flex;flex-direction:column;gap:1rem;padding:1.25rem;flex:1;overflow:auto}.m-table__empty-mobile{padding:3rem 1.5rem;text-align:center;color:var(--m-text-tertiary);font-size:.9375rem;font-weight:500;font-style:italic;opacity:.8;background:color-mix(in srgb,var(--m-background) 20%,transparent);border-radius:12px;border:1px dashed var(--m-backdrop-border)}.m-table__wrapper{overflow:auto;flex:1}.m-table__wrapper::-webkit-scrollbar{width:6px;height:6px}.m-table__wrapper::-webkit-scrollbar-track{background:transparent}.m-table__wrapper::-webkit-scrollbar-thumb{background:var(--m-backdrop-border);border-radius:10px}.m-table__wrapper::-webkit-scrollbar-thumb:hover{background:var(--m-text-tertiary)}.m-table__table{width:100%;min-width:100%;border-collapse:separate;border-spacing:0}mark.m-table__highlight{background:var(--m-highlight);color:#000;border-radius:2px;padding:0 2px;font-weight:700;box-shadow:0 1px 4px #0003}mark.m-table__highlight .m-one-pagination{margin-left:auto;--m-button-size: 2.25rem;--m-pagination-gap: .375rem}.m-table-pagination{display:flex;align-items:center;gap:1.5rem;padding:1.25rem var(--m-table-pagination-padding-x, 1.25rem);border-top:1px solid var(--m-backdrop-border);font-size:.8125rem;flex-wrap:wrap;background:color-mix(in srgb,var(--m-background) 40%,transparent)}.m-table--flat .m-table-pagination{background:transparent;padding-left:0;padding-right:0}.m-table-pagination__size{display:flex;flex-direction:column;align-items:flex-start;gap:.35rem;color:var(--m-text-secondary);font-weight:500}.m-table-pagination__select{border:1px solid var(--m-backdrop-border);border-radius:8px;background:var(--m-backdrop-surface);color:var(--m-text);padding:.375rem .625rem;font-size:.8125rem;font-weight:600;cursor:pointer;transition:all .2s cubic-bezier(.4,0,.2,1);outline:none}.m-table-pagination__select:hover{background:var(--m-backdrop-glass);border-color:var(--m-mm);box-shadow:0 0 0 3px color-mix(in srgb,var(--m-mm) 10%,transparent)}.m-table-pagination__select:focus{border-color:var(--m-mm);box-shadow:0 0 0 3px color-mix(in srgb,var(--m-mm) 20%,transparent)}.m-table-filter{display:flex;flex-wrap:wrap;align-items:center;gap:10px;padding:1rem 1.25rem;background:color-mix(in srgb,var(--m-background-lite) 60%,transparent);border-bottom:1px solid var(--m-backdrop-border);box-shadow:inset 0 2px 4px #00000005;overflow-x:auto;scrollbar-width:none}.m-table-filter::-webkit-scrollbar{display:none}.m-table--flat .m-table-filter{background:transparent;padding-left:0;padding-right:0;border-bottom:none}.m-table-filter__item{display:flex;align-items:center;gap:10px;padding:.4375rem 1rem;border-radius:12px;background:var(--m-background);border:1px solid var(--m-backdrop-border);color:var(--m-text-secondary);cursor:pointer;transition:all .2s cubic-bezier(.4,0,.2,1);white-space:nowrap;-webkit-user-select:none;user-select:none;outline:none;font-weight:500}.m-table-filter__item:hover{border-color:var(--m-mm);color:var(--m-mm);background:var(--m-background);transform:translateY(-1px);box-shadow:0 4px 12px #0000000d}.m-table-filter__item--active{background:var(--m-mm);border-color:var(--m-mm);color:var(--m-inverse-text);font-weight:600;box-shadow:0 8px 16px color-mix(in srgb,var(--m-mm) 25%,transparent)}.m-table-filter__item--active:hover{background:var(--m-mm);border-color:var(--m-mm);color:var(--m-inverse-text);transform:translateY(-1px)}.m-table-filter__item--active .m-table-filter__badge{background:#fff3;color:var(--m-inverse-text);border-color:#ffffff1a}.m-table-filter__item--primary{background:var(--m-mm);border-color:var(--m-mm);color:var(--m-inverse-text);font-weight:600;box-shadow:0 8px 16px color-mix(in srgb,var(--m-mm) 25%,transparent)}.m-table-filter__item--primary:hover{background:var(--m-mm);border-color:var(--m-mm);color:var(--m-inverse-text);transform:translateY(-1px);box-shadow:0 10px 20px color-mix(in srgb,var(--m-mm) 30%,transparent)}.m-table-filter__item--primary .m-table-filter__badge{background:#fff3;color:var(--m-inverse-text);border-color:#ffffff1a}.m-table-filter__item--danger{border-color:var(--m-error);color:var(--m-error)}.m-table-filter__item--danger:hover{border-color:var(--m-error);color:var(--m-error);background:var(--m-backdrop-error);transform:translateY(-1px);box-shadow:0 4px 12px color-mix(in srgb,var(--m-error) 12%,transparent)}.m-table-filter__item--danger .m-table-filter__badge{background:var(--m-backdrop-error);color:var(--m-error);border-color:color-mix(in srgb,var(--m-error) 20%,transparent)}.m-table-filter__label{font-size:.8125rem;font-weight:600;letter-spacing:.01em}.m-table-filter__badge{display:inline-flex;align-items:center;justify-content:center;min-width:1.25rem;height:1.25rem;padding:0 .375rem;border-radius:100px;background:var(--m-backdrop-surface);color:var(--m-text-secondary);font-size:.6875rem;font-weight:700;border:1px solid var(--m-backdrop-border);transition:all .2s ease}.m-table-thead__th{position:sticky;top:0;z-index:10;background:var(--m-table-thead-background, color-mix(in srgb, var(--m-background) 95%, transparent));-webkit-backdrop-filter:var(--m-table-thead-backdrop-filter, blur(28px));backdrop-filter:var(--m-table-thead-backdrop-filter, blur(28px));padding:1.25rem;text-align:left;font-size:.75rem;font-weight:700;text-transform:uppercase;letter-spacing:.1em;color:var(--m-text-tertiary);border-bottom:2px solid var(--m-backdrop-border);white-space:nowrap;transition:all .2s ease}.m-table-thead__th:hover{color:var(--m-text);background:var(--m-table-thead-background, var(--m-background))}@media(min-width:769px){.m-table-thead__th--fixed{z-index:20;background:var(--m-table-thead-background, var(--m-background))}}@media(max-width:768px){.m-table-thead__th--fixed{position:static;z-index:auto}}.m-table-thead__th--fixed{border-right:none}@media(min-width:769px){.m-table-thead__th--fixed-last{border-right:1px solid var(--m-backdrop-border)}}@media(max-width:768px){.m-table-thead__th--fixed-last{border-right:none}}.m-table-thead__th--sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.m-table-thead__th--select{width:48px;min-width:48px;max-width:48px;padding:0 1rem;text-align:center}.m-table-thead__th--select input[type=checkbox]{width:1rem;height:1rem;cursor:pointer;accent-color:var(--m-mm);border-radius:3px;display:block;margin:0 auto}.m-table-thead__cell{display:flex;align-items:center;gap:.5rem}.m-table-thead__sort-icon{color:var(--m-mm);opacity:.6;transition:opacity .2s ease}.m-table-thead__th:hover .m-table-thead__sort-icon{opacity:1}.m-table-thead__menu-btn{display:flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;margin-left:auto;border:none;background:transparent;cursor:pointer;color:var(--m-text-tertiary);border-radius:6px;opacity:0;transition:all .15ms ease}.m-table-thead__menu-btn:hover{background:var(--m-backdrop-surface);color:var(--m-text)}.m-table-thead__th:hover .m-table-thead__menu-btn{opacity:1}.m-table-body__row{transition:background-color .3s cubic-bezier(.4,0,.2,1);position:relative}.m-table-body__row:hover{background:color-mix(in srgb,var(--m-mm) 5%,transparent)}.m-table-body__row:hover .m-table-body__cell{background:inherit}.m-table-body__cell{padding:1rem 1.25rem;font-size:.875rem;color:var(--m-text);border-bottom:1px solid var(--m-backdrop-border);white-space:nowrap;vertical-align:middle;background:transparent;transition:background-color .3s ease}.m-table-body__cell[class*=--number],.m-table-body__cell[class*=--currency],.m-table-body__cell[class*=--percent]{font-family:Inter,Roboto Mono,monospace;font-variant-numeric:tabular-nums;letter-spacing:-.01em}@media(min-width:769px){.m-table-body__cell--fixed{position:sticky;background:var(--m-background);z-index:5}}@media(max-width:768px){.m-table-body__cell--fixed{position:static;background:transparent;z-index:auto}}.m-table-body__cell--fixed{border-right:none;transition:background-color .3s ease}.m-table-body__row:hover .m-table-body__cell--fixed{background:color-mix(in srgb,var(--m-mm) 5%,var(--m-background));z-index:6}@media(min-width:769px){.m-table-body__cell--fixed-last{border-right:1px solid var(--m-backdrop-border)}}@media(max-width:768px){.m-table-body__cell--fixed-last{border-right:none}}.m-table-body__cell--context-menu{padding-top:.35rem;padding-bottom:.35rem}.m-table-body__cell--select{width:48px;min-width:48px;max-width:48px;padding:0 1rem;text-align:center}.m-table-body__cell--select input[type=checkbox],.m-table-body__cell--select input[type=radio]{width:1rem;height:1rem;cursor:pointer;accent-color:var(--m-mm);display:block;margin:0 auto}.m-table-body__input{border:none;border-bottom:2px solid var(--m-backdrop-border);background:transparent;font-size:.875rem;color:var(--m-text);padding:.25rem;outline:none;width:100%;transition:border-bottom-color .2s ease}.m-table-body__input:focus{border-bottom-color:var(--m-mm)}.m-table-body__action-btn{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;border:none;background:transparent;cursor:pointer;color:var(--m-text-tertiary);border-radius:8px;transition:all .2s ease}.m-table-body__action-btn:hover{background:var(--m-backdrop-surface);color:var(--m-text)}.m-table-body__empty{text-align:center;padding:4rem;color:var(--m-text-tertiary);font-size:1rem;font-weight:500;letter-spacing:.02em;font-style:italic;opacity:.7}.m-table-body__link{color:var(--m-mm);text-decoration:none;cursor:pointer;font-weight:600;transition:color .2s ease}.m-table-body__link:hover{text-decoration:underline;color:var(--m-mm-lite)}.m-table-body__value{padding:.25rem .5rem;border-radius:6px;font-weight:600;font-variant-numeric:tabular-nums;letter-spacing:-.01em}.m-table-body__value--positive{color:var(--m-success);background:var(--m-backdrop-success)}.m-table-body__value--negative{color:var(--m-error);background:var(--m-backdrop-error)}.m-table-body__dash{color:var(--m-text-tertiary);font-weight:400;font-style:italic;opacity:.8}.m-tree-grid{--m-tree-grid-icon: .75rem}.m-tree-grid .m-table-thead__th,.m-tree-grid .m-table-body__cell{padding:.375rem .5rem}.m-tree-grid{--m-table-thead-background: transparent;--m-table-thead-backdrop-filter: none}.m-tree-grid .m-table-thead__th{font-size:.6875rem;letter-spacing:.06em;border-bottom-width:1px}.m-tree-grid__tree-cell{display:flex;align-items:center;gap:0;min-width:0}.m-tree-grid__indent{flex:0 0 auto;width:calc(var(--m-tree-grid-depth, 0) * var(--m-tree-grid-indent, var(--m-tree-grid-icon)))}.m-tree-grid__toggle{flex:0 0 auto;width:var(--m-tree-grid-icon);height:var(--m-tree-grid-icon);display:inline-flex;align-items:center;justify-content:center}.m-tree-grid__toggle m-button{--m-button-size: .333rem}.m-tree-grid__toggle-spacer{width:var(--m-tree-grid-icon);height:var(--m-tree-grid-icon);flex:0 0 auto}.m-tree-grid__lead-icon{flex:0 0 auto;display:inline-flex;align-items:center;margin-left:.125rem;opacity:.75}.m-tree-grid__lead-icon m-icon{--m-icon-size: .75rem}.m-tree-grid__label{min-width:0;margin-left:.25rem;overflow:hidden;text-overflow:ellipsis;font-size:.875em;line-height:1.25}.m-tree-grid .m-table-body__row{cursor:pointer}.m-tree-grid .m-table-body__row--selected{background:color-mix(in srgb,var(--m-mm) 12%,transparent)}.m-tree-grid .m-table__toolbar{padding:.5rem;background:transparent}.m-tree-grid .m-table__search{flex:1 1 auto;width:100%}.m-tree-grid .m-table__search m-input-wrapper,.m-tree-grid .m-table__search .m-input-wrapper{width:100%}.m-tree-grid__match{background:var(--m-highlight);padding:0;color:inherit;border-radius:2px}\n"] }]
31589
31983
  }], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: false }] }, { type: i0.Output, args: ["configChange"] }], data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }, { type: i0.Output, args: ["dataChange"] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], indentRem: [{ type: i0.Input, args: [{ isSignal: true, alias: "indentRem", required: false }] }], keyIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "keyIndex", required: false }] }], selectedKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedKey", required: false }] }, { type: i0.Output, args: ["selectedKeyChange"] }], rowToggled: [{ type: i0.Output, args: ["rowToggled"] }], loadChildren: [{ type: i0.Output, args: ["loadChildren"] }], rowSelected: [{ type: i0.Output, args: ["rowSelected"] }], menuAction: [{ type: i0.Output, args: ["menuAction"] }], cellClicked: [{ type: i0.Output, args: ["cellClicked"] }], searchChanged: [{ type: i0.Output, args: ["searchChanged"] }] } });
31590
31984
 
31591
31985
  const CHART_WIDTH = 300;
@@ -33217,9 +33611,14 @@ function provideModalComponents() {
33217
33611
  ]);
33218
33612
  }
33219
33613
 
33614
+ /** Where the recent queries are held (CONTEXT.md HeldValue). */
33615
+ const RECENT_KEY = 'search.recent';
33616
+ /** Recent queries kept — enough to pick from, not a history. */
33617
+ const RECENT_SEARCH_LIMIT = 8;
33220
33618
  const initialState$1 = {
33221
33619
  query: '',
33222
33620
  sourceResults: {},
33621
+ recent: [],
33223
33622
  };
33224
33623
  const SearchStore = signalStore({ providedIn: 'root' }, withState(initialState$1), withComputed(({ query, sourceResults }) => ({
33225
33624
  groupedResults: computed(() => Object.values(sourceResults()).filter((g) => g.items.length > 0)),
@@ -33227,11 +33626,30 @@ const SearchStore = signalStore({ providedIn: 'root' }, withState(initialState$1
33227
33626
  hasQuery: computed(() => query().trim().length > 0),
33228
33627
  })), withMethods((store) => {
33229
33628
  const searchQuery = inject(SEARCH_QUERY, { optional: true });
33629
+ const storage = inject(StorageService);
33230
33630
  return {
33231
33631
  updateQuery: (query) => {
33232
33632
  patchState(store, { query });
33233
33633
  searchQuery?.set(query);
33234
33634
  },
33635
+ /**
33636
+ * Keeps the current query as a recent one — called when a User follows
33637
+ * a hit, so only a search that found something is kept, never each
33638
+ * keystroke on the way to it. Moves a repeat to the front.
33639
+ */
33640
+ rememberQuery: () => {
33641
+ const query = store.query().trim();
33642
+ if (!query)
33643
+ return;
33644
+ const recent = [
33645
+ query,
33646
+ ...store
33647
+ .recent()
33648
+ .filter((q) => q.toLowerCase() !== query.toLowerCase()),
33649
+ ].slice(0, RECENT_SEARCH_LIMIT);
33650
+ patchState(store, { recent });
33651
+ storage.setHeld(RECENT_KEY, recent);
33652
+ },
33235
33653
  clearQuery: () => {
33236
33654
  patchState(store, { query: '', sourceResults: {} });
33237
33655
  searchQuery?.set('');
@@ -33257,6 +33675,9 @@ const SearchStore = signalStore({ providedIn: 'root' }, withState(initialState$1
33257
33675
  const injector = inject(Injector);
33258
33676
  return {
33259
33677
  onInit() {
33678
+ patchState(store, {
33679
+ recent: injector.get(StorageService).getHeld(RECENT_KEY) ?? [],
33680
+ });
33260
33681
  const sq = injector.get(SEARCH_QUERY, null);
33261
33682
  if (sq) {
33262
33683
  effect(() => {
@@ -33661,23 +34082,89 @@ const navTailMatcher = (prefix, name) => (segments) => {
33661
34082
  return { consumed: segments, posParams };
33662
34083
  };
33663
34084
 
34085
+ // What one entry and its chevron take on the line, at the trail's size. An
34086
+ // estimate rather than a measurement: labels are clipped to fit anyway, so the
34087
+ // guess only decides how many ancestors are worth drawing at all.
34088
+ const ENTRY_PX = 96;
34089
+ // Unmeasured (SSR, jsdom) the trail has no width to fold against, so a long
34090
+ // one still folds rather than running off the line.
34091
+ const UNMEASURED_FIT = 4;
34092
+ // The root entry and the one nearest the page are the two worth keeping.
34093
+ const MIN_FIT = 2;
33664
34094
  class NavTrailComponent {
33665
34095
  config = input.required(...(ngDevMode ? [{ debugName: "config" }] : /* istanbul ignore next */ []));
33666
34096
  Size = Size;
33667
34097
  themeStore = inject(ThemeStore);
33668
34098
  navStore = inject(NavStore);
34099
+ el = inject(ElementRef);
34100
+ destroyRef = inject(DestroyRef);
34101
+ doc = inject(DOCUMENT);
33669
34102
  headerColor = computed(() => this.themeStore.color()?.mm ?? '#fff', ...(ngDevMode ? [{ debugName: "headerColor" }] : /* istanbul ignore next */ []));
33670
34103
  fromUrl = computed(() => !!this.navStore.id(), ...(ngDevMode ? [{ debugName: "fromUrl" }] : /* istanbul ignore next */ []));
34104
+ // The trail's own width, measured rather than queried: the header is
34105
+ // routinely the width of a docked panel, not the window (ADR 0001).
34106
+ width = signal(undefined, ...(ngDevMode ? [{ debugName: "width" }] : /* istanbul ignore next */ []));
34107
+ fit = computed(() => {
34108
+ const width = this.width();
34109
+ if (width === undefined)
34110
+ return UNMEASURED_FIT;
34111
+ return Math.max(MIN_FIT, Math.floor(width / ENTRY_PX));
34112
+ }, ...(ngDevMode ? [{ debugName: "fit" }] : /* istanbul ignore next */ []));
34113
+ // Folded from the middle: the root anchors where the trail starts and the
34114
+ // nearest ancestors say where the User stands, so it is the ones between
34115
+ // that go behind the overflow.
34116
+ fold = computed(() => {
34117
+ const trail = this.config();
34118
+ const fit = this.fit();
34119
+ if (trail.length <= fit)
34120
+ return { shown: trail, hidden: [] };
34121
+ const tail = Math.max(1, fit - 1);
34122
+ return {
34123
+ shown: [trail[0], ...trail.slice(-tail)],
34124
+ hidden: trail.slice(1, trail.length - tail),
34125
+ };
34126
+ }, ...(ngDevMode ? [{ debugName: "fold" }] : /* istanbul ignore next */ []));
34127
+ shown = computed(() => this.fold().shown, ...(ngDevMode ? [{ debugName: "shown" }] : /* istanbul ignore next */ []));
34128
+ hidden = computed(() => this.fold().hidden, ...(ngDevMode ? [{ debugName: "hidden" }] : /* istanbul ignore next */ []));
34129
+ // No `nav` on the rows: the menu would follow it and move the User, where a
34130
+ // trail entry only Browses. The press comes back through `onOverflow`.
34131
+ overflowMenu = computed(() => ({
34132
+ align: 'left',
34133
+ icon: { name: 'more' },
34134
+ options: [
34135
+ this.hidden().map((entry) => ({
34136
+ id: entry.id,
34137
+ label: entry.label,
34138
+ icon: entry.icon,
34139
+ })),
34140
+ ],
34141
+ }), ...(ngDevMode ? [{ debugName: "overflowMenu" }] : /* istanbul ignore next */ []));
34142
+ constructor() {
34143
+ afterNextRender(() => {
34144
+ if (typeof ResizeObserver === 'undefined')
34145
+ return;
34146
+ const observer = new ResizeObserver(([entry]) => this.width.set(entry.contentRect.width));
34147
+ observer.observe(this.el.nativeElement);
34148
+ this.destroyRef.onDestroy(() => observer.disconnect());
34149
+ });
34150
+ }
33671
34151
  /**
33672
34152
  * Moves the panel onto the entry's Nav and leaves the Address, and the Page
33673
34153
  * behind the panel, where they are (CONTEXT.md Browse).
33674
34154
  */
33675
34155
  browse = (navId, params) => this.navStore.browse(navId, params);
34156
+ onOverflow(item) {
34157
+ const entry = this.hidden().find((e) => e.id === item.id);
34158
+ if (entry?.nav)
34159
+ this.browse(entry.nav, entry.navParams);
34160
+ else if (entry?.href)
34161
+ this.doc.location.assign(entry.href);
34162
+ }
33676
34163
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: NavTrailComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
33677
34164
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: NavTrailComponent, isStandalone: true, selector: "m-nav-trail", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null } }, host: { classAttribute: "m-nav-trail" }, ngImport: i0, template: `
33678
34165
  @if (config(); as trail) {
33679
34166
  <nav class="nav-trail">
33680
- @for (item of trail; track item.id; let i = $index; let last = $last) {
34167
+ @for (item of shown(); track item.id; let i = $index; let last = $last) {
33681
34168
  <div class="trail-item" [style.animation-delay.ms]="i * 50">
33682
34169
  @if (item.nav; as nav) {
33683
34170
  <!-- Browses: the trail moves the panel, never the User. -->
@@ -33685,13 +34172,14 @@ class NavTrailComponent {
33685
34172
  class="trail-link"
33686
34173
  role="button"
33687
34174
  tabindex="0"
34175
+ [attr.title]="item.label | translate"
33688
34176
  (click)="browse(nav, item.navParams)"
33689
34177
  (keydown.enter)="browse(nav, item.navParams)"
33690
34178
  >
33691
34179
  {{ item.label | translate }}
33692
34180
  </a>
33693
34181
  } @else if (item.href; as href) {
33694
- <a [href]="href" class="trail-link">
34182
+ <a [href]="href" class="trail-link" [attr.title]="item.label | translate">
33695
34183
  {{ item.label | translate }}
33696
34184
  </a>
33697
34185
  }
@@ -33701,17 +34189,26 @@ class NavTrailComponent {
33701
34189
  </div>
33702
34190
  }
33703
34191
  </div>
34192
+ @if (i === 0 && hidden().length) {
34193
+ <!-- The ancestors the line could not fit, one press away. -->
34194
+ <div class="trail-item trail-item--overflow">
34195
+ <m-context-menu [config]="overflowMenu()" (action)="onOverflow($event)" />
34196
+ <div class="trail-separator">
34197
+ <m-icon name="chevron-right" />
34198
+ </div>
34199
+ </div>
34200
+ }
33704
34201
  }
33705
34202
  </nav>
33706
34203
  }
33707
- `, isInline: true, styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}.m-nav-trail{display:block;flex:1;min-width:0}.nav-trail{display:flex;align-items:center;gap:.6rem;font-size:.725rem;letter-spacing:.04em;color:var(--m-text-tertiary);-webkit-user-select:none;user-select:none;font-weight:600}.trail-item{display:flex;align-items:center;gap:.6rem;animation:slide-in-trail .5s cubic-bezier(.16,1,.3,1)}.trail-link{color:inherit;text-decoration:none;padding:.25rem .6rem;border-radius:6px;transition:all .3s cubic-bezier(.16,1,.3,1);cursor:pointer;white-space:nowrap}.trail-link:hover{color:var(--m-mm);background:color-mix(in srgb,var(--m-mm) 6%,transparent);transform:translateY(-1px)}.trail-link:active{transform:scale(.96) translateY(0)}.trail-separator{display:flex;align-items:center;justify-content:center;opacity:.35;color:var(--m-text-tertiary);pointer-events:none;font-size:.625rem}.trail-separator .m-icon{--m-icon-size: .625rem;display:flex;align-items:center;justify-content:center}@keyframes slide-in-trail{0%{opacity:0;transform:translate(-10px)}to{opacity:1;transform:translate(0)}}\n"], dependencies: [{ kind: "component", type: IconComponent, selector: "m-icon, m-one-icon", inputs: ["config", "name", "color", "size", "one", "baseUrl", "remote"], outputs: ["configChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
34204
+ `, isInline: true, styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}.m-nav-trail{display:block;flex:1;min-width:0}.nav-trail{display:flex;flex-wrap:nowrap;align-items:center;min-width:0;gap:.125rem;font-size:.725rem;letter-spacing:.04em;color:var(--m-text-tertiary);-webkit-user-select:none;user-select:none;font-weight:600}.trail-item{display:flex;align-items:center;gap:.125rem;min-width:0;flex:0 3 auto;animation:slide-in-trail .5s cubic-bezier(.16,1,.3,1)}.trail-item:last-child{flex-shrink:1}.trail-item:last-child .trail-link{color:var(--m-text-secondary)}.trail-item--overflow{flex-shrink:0;--m-button-size: .7rem}.trail-link{display:block;min-width:2rem;max-width:12rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:inherit;text-decoration:none;padding:.125rem .375rem;border-radius:4px;transition:all .3s cubic-bezier(.16,1,.3,1);cursor:pointer}.trail-link:hover{color:var(--m-mm);background:color-mix(in srgb,var(--m-mm) 6%,transparent)}.trail-link:active{transform:scale(.96)}.trail-separator{display:flex;flex-shrink:0;align-items:center;justify-content:center;opacity:.35;color:var(--m-text-tertiary);pointer-events:none;font-size:.625rem}.trail-separator .m-icon{--m-icon-size: .625rem;display:flex;align-items:center;justify-content:center}@keyframes slide-in-trail{0%{opacity:0;transform:translate(-10px)}to{opacity:1;transform:translate(0)}}\n"], dependencies: [{ kind: "component", type: IconComponent, selector: "m-icon, m-one-icon", inputs: ["config", "name", "color", "size", "one", "baseUrl", "remote"], outputs: ["configChange"] }, { kind: "component", type: ContextMenuComponent, selector: "m-context-menu, m-one-context-menu", inputs: ["toggle", "remote", "exclude", "visibilityRule", "disableRule", "extraData", "inverted", "options"], outputs: ["toggleChange", "action"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
33708
34205
  }
33709
34206
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: NavTrailComponent, decorators: [{
33710
34207
  type: Component,
33711
34208
  args: [{ selector: 'm-nav-trail', template: `
33712
34209
  @if (config(); as trail) {
33713
34210
  <nav class="nav-trail">
33714
- @for (item of trail; track item.id; let i = $index; let last = $last) {
34211
+ @for (item of shown(); track item.id; let i = $index; let last = $last) {
33715
34212
  <div class="trail-item" [style.animation-delay.ms]="i * 50">
33716
34213
  @if (item.nav; as nav) {
33717
34214
  <!-- Browses: the trail moves the panel, never the User. -->
@@ -33719,13 +34216,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
33719
34216
  class="trail-link"
33720
34217
  role="button"
33721
34218
  tabindex="0"
34219
+ [attr.title]="item.label | translate"
33722
34220
  (click)="browse(nav, item.navParams)"
33723
34221
  (keydown.enter)="browse(nav, item.navParams)"
33724
34222
  >
33725
34223
  {{ item.label | translate }}
33726
34224
  </a>
33727
34225
  } @else if (item.href; as href) {
33728
- <a [href]="href" class="trail-link">
34226
+ <a [href]="href" class="trail-link" [attr.title]="item.label | translate">
33729
34227
  {{ item.label | translate }}
33730
34228
  </a>
33731
34229
  }
@@ -33735,13 +34233,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
33735
34233
  </div>
33736
34234
  }
33737
34235
  </div>
34236
+ @if (i === 0 && hidden().length) {
34237
+ <!-- The ancestors the line could not fit, one press away. -->
34238
+ <div class="trail-item trail-item--overflow">
34239
+ <m-context-menu [config]="overflowMenu()" (action)="onOverflow($event)" />
34240
+ <div class="trail-separator">
34241
+ <m-icon name="chevron-right" />
34242
+ </div>
34243
+ </div>
34244
+ }
33738
34245
  }
33739
34246
  </nav>
33740
34247
  }
33741
- `, imports: [TranslatePipe, IconComponent], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
34248
+ `, imports: [TranslatePipe, IconComponent, ContextMenuComponent], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
33742
34249
  class: 'm-nav-trail',
33743
- }, styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}.m-nav-trail{display:block;flex:1;min-width:0}.nav-trail{display:flex;align-items:center;gap:.6rem;font-size:.725rem;letter-spacing:.04em;color:var(--m-text-tertiary);-webkit-user-select:none;user-select:none;font-weight:600}.trail-item{display:flex;align-items:center;gap:.6rem;animation:slide-in-trail .5s cubic-bezier(.16,1,.3,1)}.trail-link{color:inherit;text-decoration:none;padding:.25rem .6rem;border-radius:6px;transition:all .3s cubic-bezier(.16,1,.3,1);cursor:pointer;white-space:nowrap}.trail-link:hover{color:var(--m-mm);background:color-mix(in srgb,var(--m-mm) 6%,transparent);transform:translateY(-1px)}.trail-link:active{transform:scale(.96) translateY(0)}.trail-separator{display:flex;align-items:center;justify-content:center;opacity:.35;color:var(--m-text-tertiary);pointer-events:none;font-size:.625rem}.trail-separator .m-icon{--m-icon-size: .625rem;display:flex;align-items:center;justify-content:center}@keyframes slide-in-trail{0%{opacity:0;transform:translate(-10px)}to{opacity:1;transform:translate(0)}}\n"] }]
33744
- }], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: true }] }] } });
34250
+ }, styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}.m-nav-trail{display:block;flex:1;min-width:0}.nav-trail{display:flex;flex-wrap:nowrap;align-items:center;min-width:0;gap:.125rem;font-size:.725rem;letter-spacing:.04em;color:var(--m-text-tertiary);-webkit-user-select:none;user-select:none;font-weight:600}.trail-item{display:flex;align-items:center;gap:.125rem;min-width:0;flex:0 3 auto;animation:slide-in-trail .5s cubic-bezier(.16,1,.3,1)}.trail-item:last-child{flex-shrink:1}.trail-item:last-child .trail-link{color:var(--m-text-secondary)}.trail-item--overflow{flex-shrink:0;--m-button-size: .7rem}.trail-link{display:block;min-width:2rem;max-width:12rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:inherit;text-decoration:none;padding:.125rem .375rem;border-radius:4px;transition:all .3s cubic-bezier(.16,1,.3,1);cursor:pointer}.trail-link:hover{color:var(--m-mm);background:color-mix(in srgb,var(--m-mm) 6%,transparent)}.trail-link:active{transform:scale(.96)}.trail-separator{display:flex;flex-shrink:0;align-items:center;justify-content:center;opacity:.35;color:var(--m-text-tertiary);pointer-events:none;font-size:.625rem}.trail-separator .m-icon{--m-icon-size: .625rem;display:flex;align-items:center;justify-content:center}@keyframes slide-in-trail{0%{opacity:0;transform:translate(-10px)}to{opacity:1;transform:translate(0)}}\n"] }]
34251
+ }], ctorParameters: () => [], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: true }] }] } });
33745
34252
 
33746
34253
  class SearchPanelComponent {
33747
34254
  searchStore = inject(SearchStore);
@@ -33749,9 +34256,31 @@ class SearchPanelComponent {
33749
34256
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: SearchPanelComponent, isStandalone: true, selector: "m-search-panel", ngImport: i0, template: `
33750
34257
  <div class="search-panel">
33751
34258
  @if (!searchStore.hasQuery()) {
33752
- <div class="search-panel__empty">
33753
- {{ 'type-to-search' | translate }}
33754
- </div>
34259
+ @if (searchStore.recent().length) {
34260
+ <div class="search-panel__group">
34261
+ <span class="search-panel__source-label">{{
34262
+ 'recent-searches' | translate
34263
+ }}</span>
34264
+ <!-- mousedown kept from the input, so picking a recent query
34265
+ leaves the search bar open with that query in it. -->
34266
+ @for (query of searchStore.recent(); track query) {
34267
+ <a
34268
+ class="search-panel__result"
34269
+ role="button"
34270
+ tabindex="0"
34271
+ (mousedown)="$event.preventDefault()"
34272
+ (click)="searchStore.updateQuery(query)"
34273
+ (keydown.enter)="searchStore.updateQuery(query)"
34274
+ >
34275
+ <span class="search-panel__result-title">{{ query }}</span>
34276
+ </a>
34277
+ }
34278
+ </div>
34279
+ } @else {
34280
+ <div class="search-panel__empty">
34281
+ {{ 'type-to-search' | translate }}
34282
+ </div>
34283
+ }
33755
34284
  } @else if (!searchStore.hasResults()) {
33756
34285
  <div class="search-panel__empty">{{ 'no-results-found' | translate }}</div>
33757
34286
  } @else {
@@ -33761,7 +34290,11 @@ class SearchPanelComponent {
33761
34290
  group.label | translate
33762
34291
  }}</span>
33763
34292
  @for (result of group.items; track result.id) {
33764
- <a class="search-panel__result" [routerLink]="result.url ?? '/'">
34293
+ <a
34294
+ class="search-panel__result"
34295
+ [routerLink]="result.url ?? '/'"
34296
+ (click)="searchStore.rememberQuery()"
34297
+ >
33765
34298
  @if (result.img) {
33766
34299
  <div class="search-panel__result-img">
33767
34300
  <m-img [src]="result.img" [alt]="result.title" />
@@ -33790,9 +34323,31 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
33790
34323
  args: [{ selector: 'm-search-panel', changeDetection: ChangeDetectionStrategy.OnPush, imports: [RouterLink, ImgComponent, TranslatePipe], template: `
33791
34324
  <div class="search-panel">
33792
34325
  @if (!searchStore.hasQuery()) {
33793
- <div class="search-panel__empty">
33794
- {{ 'type-to-search' | translate }}
33795
- </div>
34326
+ @if (searchStore.recent().length) {
34327
+ <div class="search-panel__group">
34328
+ <span class="search-panel__source-label">{{
34329
+ 'recent-searches' | translate
34330
+ }}</span>
34331
+ <!-- mousedown kept from the input, so picking a recent query
34332
+ leaves the search bar open with that query in it. -->
34333
+ @for (query of searchStore.recent(); track query) {
34334
+ <a
34335
+ class="search-panel__result"
34336
+ role="button"
34337
+ tabindex="0"
34338
+ (mousedown)="$event.preventDefault()"
34339
+ (click)="searchStore.updateQuery(query)"
34340
+ (keydown.enter)="searchStore.updateQuery(query)"
34341
+ >
34342
+ <span class="search-panel__result-title">{{ query }}</span>
34343
+ </a>
34344
+ }
34345
+ </div>
34346
+ } @else {
34347
+ <div class="search-panel__empty">
34348
+ {{ 'type-to-search' | translate }}
34349
+ </div>
34350
+ }
33796
34351
  } @else if (!searchStore.hasResults()) {
33797
34352
  <div class="search-panel__empty">{{ 'no-results-found' | translate }}</div>
33798
34353
  } @else {
@@ -33802,7 +34357,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
33802
34357
  group.label | translate
33803
34358
  }}</span>
33804
34359
  @for (result of group.items; track result.id) {
33805
- <a class="search-panel__result" [routerLink]="result.url ?? '/'">
34360
+ <a
34361
+ class="search-panel__result"
34362
+ [routerLink]="result.url ?? '/'"
34363
+ (click)="searchStore.rememberQuery()"
34364
+ >
33806
34365
  @if (result.img) {
33807
34366
  <div class="search-panel__result-img">
33808
34367
  <m-img [src]="result.img" [alt]="result.title" />
@@ -33830,8 +34389,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
33830
34389
  class NavHeaderComponent {
33831
34390
  _navStore = inject(NavStore);
33832
34391
  _searchStore = inject(SearchStore);
33833
- _isUser = computed(() => this._navStore.id() === `${ROOT_NAV$1}_user`, ...(ngDevMode ? [{ debugName: "_isUser" }] : /* istanbul ignore next */ []));
33834
- _isSearch = computed(() => this._navStore.id() === `${ROOT_NAV$1}_search`, ...(ngDevMode ? [{ debugName: "_isSearch" }] : /* istanbul ignore next */ []));
34392
+ // Asked of the panel that answered, not of the Address: opened over any page
34393
+ // but root, the Address is anchored there (`<page>_search`), and it is the
34394
+ // root-anchored Platform panel behind it that is showing.
34395
+ _isUser = computed(() => this._navStore.panelNavId() === `${ROOT_NAV$1}_user`, ...(ngDevMode ? [{ debugName: "_isUser" }] : /* istanbul ignore next */ []));
34396
+ _isSearch = computed(() => this._navStore.panelNavId() === `${ROOT_NAV$1}_search`, ...(ngDevMode ? [{ debugName: "_isSearch" }] : /* istanbul ignore next */ []));
33835
34397
  _hasParent = computed(() => this._navStore.breadcrumb().header?.id !== ROOT_NAV$1, ...(ngDevMode ? [{ debugName: "_hasParent" }] : /* istanbul ignore next */ []));
33836
34398
  _trail = computed(() => {
33837
34399
  const trail = this._navStore.breadcrumb().trail;
@@ -34296,8 +34858,8 @@ class NavComponent {
34296
34858
  return {
34297
34859
  icon: showArrow
34298
34860
  ? isMobileOrTablet
34299
- ? 'arrow-down'
34300
- : 'arrow-left'
34861
+ ? 'chevron-down'
34862
+ : 'chevron-left'
34301
34863
  : 'menu',
34302
34864
  variant: 'ghost',
34303
34865
  iconOnly: true,
@@ -34745,6 +35307,21 @@ class NotificationElementComponent {
34745
35307
  <m-button-group [name]="buttons" />
34746
35308
  </div>
34747
35309
  }
35310
+
35311
+ @if (notification()?.actions?.length) {
35312
+ <div class="notification-item__actions">
35313
+ @for (action of notification()?.actions; track $index) {
35314
+ <!-- Same stop as dismiss: an action is not a click on the row. -->
35315
+ <m-one-button
35316
+ variant="ghost"
35317
+ [label]="action.label"
35318
+ noTranslate="true"
35319
+ (click)="$event.stopPropagation()"
35320
+ (clicked)="action.run()"
35321
+ />
35322
+ }
35323
+ </div>
35324
+ }
34748
35325
  }
34749
35326
  </div>
34750
35327
  </div>
@@ -34846,6 +35423,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
34846
35423
  <m-button-group [name]="buttons" />
34847
35424
  </div>
34848
35425
  }
35426
+
35427
+ @if (notification()?.actions?.length) {
35428
+ <div class="notification-item__actions">
35429
+ @for (action of notification()?.actions; track $index) {
35430
+ <!-- Same stop as dismiss: an action is not a click on the row. -->
35431
+ <m-one-button
35432
+ variant="ghost"
35433
+ [label]="action.label"
35434
+ noTranslate="true"
35435
+ (click)="$event.stopPropagation()"
35436
+ (clicked)="action.run()"
35437
+ />
35438
+ }
35439
+ </div>
35440
+ }
34849
35441
  }
34850
35442
  </div>
34851
35443
  </div>
@@ -36820,22 +37412,17 @@ const providePlatformNavWidgets = () => provideNavWidgets(platformNavWidgets());
36820
37412
  function provideAppContext() {
36821
37413
  const navStore = inject(NavStore);
36822
37414
  const authStore = inject(AuthStore);
36823
- const httpService = inject(HttpService);
37415
+ const agreementGate = inject(AgreementGate);
36824
37416
  const relationType = signal(null, ...(ngDevMode ? [{ debugName: "relationType" }] : /* istanbul ignore next */ []));
36825
37417
  effect(() => {
36826
37418
  const appLink = navStore.appLink();
36827
37419
  const isLoggedIn = authStore.isLoggedIn();
37420
+ agreementGate.revision();
36828
37421
  if (appLink && isLoggedIn) {
36829
- httpService
36830
- .get('store', ['app', appLink, 'relation'])
36831
- .subscribe({
36832
- next: (response) => {
36833
- relationType.set(response.type);
36834
- },
36835
- error: () => {
36836
- relationType.set(null);
36837
- },
36838
- });
37422
+ // The same read the init Agreement step made, so it is fetched once.
37423
+ // A reply for an app the host has since left is dropped.
37424
+ const current = () => untracked(navStore.appLink) === appLink;
37425
+ agreementGate.view(appLink).then((view) => current() && relationType.set(view.type), () => current() && relationType.set(null));
36839
37426
  }
36840
37427
  else {
36841
37428
  relationType.set(null);
@@ -36869,6 +37456,12 @@ function provideMagWcConfig(options) {
36869
37456
  },
36870
37457
  },
36871
37458
  provideZonelessChangeDetection(),
37459
+ {
37460
+ // The `/app/<link>` a host mounts it under, until m-remote hands the
37461
+ // `appLink` input down (BaseRootWebComponent) — init reads it first.
37462
+ provide: APP_LINK,
37463
+ useFactory: () => signal(window.location.pathname.match(/^\/app\/([^/]+)/)?.[1]),
37464
+ },
36872
37465
  // `always` rather than the default `emptyOnly`: a child route rendered in
36873
37466
  // a parent Page's RouterOutlet declares its own component, so without it
36874
37467
  // Angular hands the child none of the parent's `:params` and
@@ -37046,6 +37639,7 @@ function provideMagAppConfig(options) {
37046
37639
  provideMurlUrlSerializer(),
37047
37640
  provideZonelessChangeDetection(),
37048
37641
  provideAnimations(),
37642
+ { provide: APP_LINK, useValue: signal(options.appLink) },
37049
37643
  provideHttpClient(withFetch(), withInterceptors([mInterceptor])),
37050
37644
  provideAppInitializer(initMagmoniumApp({
37051
37645
  backend: options.backend,
@@ -37144,6 +37738,7 @@ function bootstrapMagApp(routesOrOptions, maybeOptions) {
37144
37738
  backend: options.backend,
37145
37739
  authUrl: options.authUrl,
37146
37740
  socketUrl: options.socketUrl,
37741
+ appLink: options.appLink,
37147
37742
  routes: finalRoutes,
37148
37743
  providers: options.providers,
37149
37744
  });
@@ -37170,6 +37765,13 @@ function bootstrapMagApp(routesOrOptions, maybeOptions) {
37170
37765
  if (wcConfig?.app) {
37171
37766
  navStore.setWcConfig(wcConfig.app, wcConfig);
37172
37767
  navStore.setAppLink(wcConfig.app);
37768
+ // A bootstrap naming no appLink learns it only now, after init
37769
+ // — so Agreement is asked here instead (store ADR 0006).
37770
+ const appLink = appRef.injector.get(APP_LINK);
37771
+ if (!appLink()) {
37772
+ appLink.set(wcConfig.app);
37773
+ appRef.injector.get(AgreementGate).ensure(wcConfig.app);
37774
+ }
37173
37775
  }
37174
37776
  else if (options.appLink) {
37175
37777
  navStore.setAppLink(options.appLink);
@@ -39655,5 +40257,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
39655
40257
  * Generated bundle index. Do not edit.
39656
40258
  */
39657
40259
 
39658
- export { ClipboardService as $, ACCESS_DOMAINS as A, ButtonComponent as B, Assets as C, AuthActivityPageComponent as D, AuthApiService as E, AuthStore as F, AutosizeDirective as G, HeaderComponent$1 as H, InputType as I, BadgeComponent as J, BandingComponent as K, LabelComponent as L, MODAL_REF as M, BaseArrayInputComponent as N, BaseRootWebComponent as O, BaseWebComponent as P, ButtonGroupComponent as Q, RangeInputComponent as R, COMPONENT_INPUT_REGISTRY as S, TranslatePipe as T, CardComponent as U, CardWrapperComponent as V, CarouselComponent as W, ChartComponent as X, ChatBubbleComponent as Y, CheckboxInputComponent as Z, ClearableInputComponent as _, MIN_ZOOM as a, ImgComponent as a$, ColComponent as a0, ColorPickerInputComponent as a1, CommentItemComponent as a2, CommentsApiService as a3, CommentsComponent as a4, CommentsStore as a5, CompactNumberPipe as a6, ComponentInputComponent as a7, ComponentStepperComponent as a8, ConfigComponent as a9, Domain as aA, DotGridComponent as aB, DragListDirective as aC, DragListItemDirective as aD, DraggableDirective as aE, DropdownInputComponent as aF, FILTER_GROUP_CONTEXT as aG, FILTER_RANGE_MODES as aH, FILTER_VARIANTS as aI, FLEX_VARIANTS as aJ, FOLDER_PICK_LISTENER as aK, FORM_ASSET_FOLDER as aL, FileService as aM, FileUploadDirective as aN, FileUploadInputComponent as aO, FlexComponent as aP, FlexItemComponent as aQ, FormGroupComponent as aR, FrameComponent as aS, FreezeService as aT, GRID_BREAKPOINTS as aU, GetNavService as aV, HighlightDirective as aW, HttpService as aX, ICON_SOURCE as aY, IS_SIDE_PANEL as aZ, IconComponent as a_, ConfirmComponent as aa, ContextMenuComponent as ab, CustomIconClass as ac, CustomIconEditComponent as ad, DEFAULT_DENIAL as ae, DEFAULT_DOC_DENSITY as af, DEFAULT_DOC_VARIANT as ag, DEFAULT_FILTER_RANGE_MODE as ah, DEFAULT_FILTER_VARIANT as ai, DEFAULT_NAV_PARAM as aj, DEFAULT_NAV_SEGMENT as ak, DEFAULT_SIZE as al, DOCK_MIN_PAGE_REMAINDER as am, DOCS_FOLDER as an, DOC_ACTION_ICONS as ao, DOC_DENSITIES as ap, DOC_EDIT_ACTIONS as aq, DOC_TOOLBAR_GROUPS as ar, DOC_VARIANTS as as, DashboardCardComponent as at, DateInputComponent as au, DatePickerComponent as av, DeviceService as aw, DocComponent as ax, DocEditorComponent as ay, DomService as az, MAX_ZOOM as b, PercentagePipe as b$, InstrumentScoreComponent as b0, InterceptorObservables as b1, JumbotronComponent as b2, KeyValueComponent as b3, LAYOUT_ASSET_FOLDER as b4, LOGIN_COMPONENT as b5, LOGIN_STORE as b6, LanguageComponent as b7, ListComponent as b8, LogoComponent as b9, NavDetailsComponent as bA, NavHeaderComponent as bB, NavMenuComponent as bC, NavStore as bD, NavTrailComponent as bE, NothingComponent as bF, NotificationElementComponent as bG, NotificationGroupComponent as bH, NotificationPopupComponent as bI, NotificationService as bJ, NotificationStore as bK, NotificationType as bL, NotificationWidgetComponent as bM, ONE_ASSET_BASE_URL as bN, OPTIONS_SOURCE as bO, OVERLAY_WIDGETS as bP, OneApp as bQ, OptionsSourceDirective as bR, OverlayBodyComponent as bS, OverlayRef as bT, OverlayService as bU, PLATFORM_BUTTON_NAV_IDS as bV, PLATFORM_EXTENSIBLE_NAV_IDS as bW, PLATFORM_NAV_MAP as bX, PLATFORM_ROOT_CHILDREN as bY, PaginationComponent as bZ, PanelComponent as b_, MAG_SOCKET_EVENT as ba, MHeroColorDirective as bb, MHeroComponent as bc, MODAL_STORE_REF as bd, MOUNT_STATIC_SEGMENT as be, MOUNT_TOKEN as bf, MRefDirective as bg, MStepComponent as bh, MURL_PARAM as bi, MURL_SEP as bj, ManifestEnrichmentService as bk, MenuComponent as bl, ModalDirective as bm, ModalRef as bn, ModalStore as bo, MoneyPipe as bp, MultiRangeInputComponent as bq, MurlUrlSerializer as br, NAV_DEFAULT_MURL as bs, NAV_ID_SEP as bt, NAV_MAIN_BUTTONS as bu, NAV_SEGMENT_RE as bv, NAV_STORE_REF as bw, NAV_WC_COMPONENTS as bx, NAV_WIDGET_MAP as by, NavComponent as bz, cropRect as c, SocketStore as c$, PlaygroundComponent as c0, PositionDirective as c1, PwaInstallComponent as c2, REMOTE_PAGE_RELOAD as c3, ROOT_NAV$1 as c4, RadioGroupComponent as c5, RadioInputComponent as c6, RatingInputComponent as c7, ReactiveElementComponent as c8, RemoteComponent as c9, SectionFilterGroupComponent as cA, SectionFilterMenuComponent as cB, SectionFilterPanelComponent as cC, SectionFilterRangePanelComponent as cD, SectionFooterComponent as cE, SectionFormComponent as cF, SectionFormItemComponent as cG, SectionHeaderComponent as cH, SectionHeroComponent as cI, SectionPaginationComponent as cJ, SectionSearchComponent as cK, SectionStepperComponent as cL, SectionTableCellComponent as cM, SectionTableComponent as cN, SectionTableRowComponent as cO, SectionTableSortPipe as cP, SectionTabsComponent as cQ, SectionToggleComponent as cR, SectionToggleItemDirective as cS, SelectableCardInputComponent as cT, SelectorDirective as cU, SettingsSearchBarComponent as cV, SettingsSearchService as cW, ShapeComponent as cX, SharedStoreRegistry as cY, SidePanelDirective as cZ, Size as c_, RemoteLoaderService as ca, ResizeElementComponent as cb, RouteContainer as cc, RowComponent as cd, SEARCH_QUERY as ce, SEARCH_RESULTS_EVENT as cf, SECTION_ACCORDION_GROUP as cg, SECTION_FORM_CONTEXT as ch, SECTION_TABLE_VARIANTS as ci, SHARED_ICONS as cj, SIZE_CONTEXT as ck, ScoreComponent as cl, ScrollComponent as cm, ScrollService as cn, SearchPanelComponent as co, SearchStore as cp, SearchUserPanelComponent as cq, SectionAccordionDirective as cr, SectionAccordionGroupDirective as cs, SectionBackComponent as ct, SectionBadgesComponent as cu, SectionButtonGroupComponent as cv, SectionCardComponent as cw, SectionCarouselComponent as cx, SectionComponent as cy, SectionFilterComponent as cz, drawFramed as d, childNavId as d$, SortComponent as d0, StatComponent as d1, StepComponent as d2, StepperComponent as d3, StepsComponent as d4, StorageService as d5, StrokeLinecap as d6, StrokeLinejoin as d7, SummaryComponent as d8, SvgGeneratorComponent as d9, UserApiService as dA, UserAvatarComponent as dB, UserComponent as dC, UserNavComponent as dD, UserSettingsComponent as dE, UserStore as dF, WC_BUNDLE as dG, WC_NAVIGATE_EVENT as dH, WC_ROUTE_CHANGED_EVENT as dI, WC_SEARCH_GROUPS as dJ, WIN_USER_TAB_HOOK as dK, WIN_USER_TAB_KEY as dL, WatermarkComponent as dM, WcRouterStore as dN, WrapperInputComponent as dO, anchorNavId as dP, applyColorsToElement as dQ, applyDocEdit as dR, assetOptions as dS, bootstrapMagApp as dT, bootstrapPwaInstall as dU, buildWcBaseUrl as dV, calculateLuminance as dW, calculateRanks as dX, cellText as dY, checkDoc as dZ, checkFilterCondition as d_, SvgGeneratorService as da, SvgService as db, TOTAL_COLUMNS as dc, TRANSLATION_SOURCE as dd, TableComponent as de, TechnicalMeterComponent as df, TextInputComponent as dg, TextareaInputComponent as dh, ThemeComponent as di, ThemeDataService as dj, ThemeService as dk, ThemeStore as dl, TimeAgoPipe as dm, TimelineComponent as dn, ToggleButtonComponent as dp, ToggleInputComponent as dq, ToggleRadioInputComponent as dr, ToolTipDirective as ds, TooltipComponent as dt, TranslateService as du, TreeGridComponent as dv, URL_SEP as dw, USER_STORE_REF as dx, USER_TAB_MAP as dy, UniverseComponent as dz, encodeFramed as e, isExtensiblePlatformNavId as e$, claimDenial as e0, classListSignal as e1, coerceSize as e2, cornerEdge as e3, cornerSide as e4, createMap as e5, createPlatformNavMap as e6, definedWcTierOf as e7, deriveAvatarGradient as e8, deriveContrastColor as e9, flattenTreeGridRows as eA, formatBadgeCount as eB, fullName as eC, generateClipPath as eD, generateTransform as eE, getClassList as eF, getProperty as eG, getScrollParent as eH, getTierFromPreviewPath as eI, getTreeGridRow as eJ, getUniqueId as eK, getValue as eL, hasErrorComputed as eM, hexToRgb as eN, hslToRgb$1 as eO, initMagmoniumApp as eP, initialNotificationState as eQ, initialState$2 as eR, initials as eS, injectAuthenticate as eT, injectDefaultDenial as eU, injectInstallApp as eV, injectParentSize as eW, injectScrollSticky as eX, isBootRedirect as eY, isButtonName as eZ, isCancelledComputed as e_, deriveOppositeColor as ea, derivePropertyName as eb, docActionKey as ec, docAssetCandidates as ed, docProblemKey as ee, docRemotePath as ef, emailValidation as eg, evaluate as eh, evaluateBool as ei, fieldBoolean as ej, fieldNumber as ek, fieldString as el, filterHoldsList as em, filterHoldsOneBound as en, filterHoldsOptions as eo, filterHoldsRange as ep, filterList as eq, filterNumber as er, filterNumberList as es, filterOne as et, filterPanelOf as eu, filterPanelWidth as ev, filterRange as ew, filterTreeGridRows as ex, filterValueList as ey, filterValues as ez, clampFraming as f, provideModalComponents as f$, isJson as f0, isLoadingComputed as f1, isLocalhost as f2, isNavInstanceConfig as f3, isNavMenuConfig as f4, isNavRowsConfig as f5, isNavVisibilityConfig as f6, isPlatformNavId as f7, isSize as f8, isTierPreview as f9, navIdChain as fA, navIdFor as fB, navIdSegment as fC, navIdToRoutePath as fD, navIdToSegments as fE, navParamOf as fF, navTailMatcher as fG, navToId as fH, navVisibilityGuard as fI, nextSectionTableSort as fJ, normalizeAssetOptions as fK, offsetOfLine as fL, parentNavId as fM, parseAddress as fN, parseColor as fO, parseMountPattern as fP, parsePatternNames as fQ, patternValidation as fR, patternsValidation as fS, permissionRefusal as fT, platformNavWidgets as fU, privateGuard as fV, processImageToSvg as fW, provideAppContext as fX, provideMagAppConfig as fY, provideMagWcConfig as fZ, provideMagWcRoutes as f_, isUrlLocalhost as fa, isValidNavId as fb, isValidNavSegment as fc, isWebComponent as fd, linkToId as fe, linkToNav as ff, loadingActions as fg, mInterceptor as fh, manualValidation as fi, matchFieldValidation as fj, matchMount as fk, maxLengthValidation as fl, maxValidation as fm, mergePlatformNav as fn, mergeUnique as fo, mergeUniqueBy as fp, mergeUniqueWith as fq, minAgeValidation as fr, minLengthValidation as fs, minValidation as ft, miniMarkToHtml as fu, mountFor as fv, mountPatternProblem as fw, mountPatternText as fx, mountSegmentOf as fy, mountTokenOf as fz, BaseInputComponent as g, provideMurlUrlSerializer as g0, provideNavWidgets as g1, provideOverlayWidgets as g2, providePlatformNavWidgets as g3, provideSearch as g4, provideSizeContext as g5, provideUserTabs as g6, publicGuard as g7, readFieldPatterns as g8, recordDefinedWcTier as g9, toAttrBool as gA, toAttrNumber as gB, toCssLength as gC, toHostNavId as gD, toLength$1 as gE, toLocalNavId as gF, toggleTreeGridRow as gG, unfetchedPlatformNav as gH, ungroupedDocActions as gI, urlValidation as gJ, wcTierOf as gK, remoteOutletRoute as ga, renderAddress as gb, renderDocument as gc, requiredValidation as gd, resolveConfigAsset as ge, resolveIconSize as gf, resolvePallet as gg, resolvePatternRules as gh, resolveSize as gi, rgbToHex as gj, rgbToHsl as gk, rowHasChildren as gl, samePatterns as gm, sectionTableColumnId as gn, sectionTableColumnWidths as go, sectionTableFrozenCount as gp, segmentsToNavId as gq, setProperty as gr, setTreeGridChildren as gs, setWcTier as gt, settingsWidgets as gu, shouldShowBadge as gv, sortSectionTableRows as gw, splitNavId as gx, splitOnMatch as gy, stringToColor as gz, BaseTextInputComponent as h, initialFraming as i, TextOutputComponent as j, IS_DESIGN_MODE as k, APP_CONTEXT_REF as l, ASSET_BASE_URL as m, AccordionBodyDirective as n, outputSize as o, parseRatio as p, AccordionComponent as q, renameForType as r, AccordionGroupComponent as s, ActionComponent as t, AnimatedGraphsComponent as u, AppCardComponent as v, AppRelationType as w, AppTileComponent as x, AssetStore as y, AssetUrlPipe as z };
39659
- //# sourceMappingURL=magmonium-one-magmonium-one-Dr2fBHOB.mjs.map
40260
+ export { CheckboxInputComponent 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, ButtonGroupComponent as S, TranslatePipe as T, CALLING_APP_HEADER as U, COMPONENT_INPUT_REGISTRY as V, CardComponent as W, CardWrapperComponent as X, CarouselComponent as Y, ChartComponent as Z, ChatBubbleComponent as _, MIN_ZOOM as a, IS_SIDE_PANEL as a$, ClearableInputComponent as a0, ClipboardService as a1, ColComponent as a2, ColorPickerInputComponent as a3, CommentItemComponent as a4, CommentsApiService as a5, CommentsComponent as a6, CommentsStore as a7, CompactNumberPipe as a8, ComponentInputComponent as a9, DocEditorComponent as aA, DomService as aB, Domain as aC, DotGridComponent as aD, DragListDirective as aE, DragListItemDirective as aF, DraggableDirective as aG, DropdownInputComponent as aH, FILTER_GROUP_CONTEXT as aI, FILTER_RANGE_MODES as aJ, FILTER_VARIANTS as aK, FLEX_VARIANTS as aL, FOLDER_PICK_LISTENER as aM, FORM_ASSET_FOLDER as aN, FileService as aO, FileUploadDirective as aP, FileUploadInputComponent as aQ, FlexComponent as aR, FlexItemComponent as aS, FormGroupComponent as aT, FrameComponent as aU, FreezeService as aV, GRID_BREAKPOINTS as aW, GetNavService as aX, HighlightDirective as aY, HttpService as aZ, ICON_SOURCE as a_, ComponentStepperComponent as aa, ConfigComponent as ab, ConfirmComponent as ac, ContextMenuComponent as ad, CustomIconClass as ae, CustomIconEditComponent as af, DEFAULT_DENIAL as ag, DEFAULT_DOC_DENSITY as ah, DEFAULT_DOC_VARIANT as ai, DEFAULT_FILTER_RANGE_MODE as aj, DEFAULT_FILTER_VARIANT as ak, DEFAULT_NAV_PARAM as al, DEFAULT_NAV_SEGMENT as am, DEFAULT_SIZE as an, DOCK_MIN_PAGE_REMAINDER as ao, DOCS_FOLDER as ap, DOC_ACTION_ICONS as aq, DOC_DENSITIES as ar, DOC_EDIT_ACTIONS as as, DOC_TOOLBAR_GROUPS as at, DOC_VARIANTS as au, DashboardCardComponent as av, DateInputComponent as aw, DatePickerComponent as ax, DeviceService as ay, DocComponent as az, MAX_ZOOM as b, PaginationComponent as b$, IconComponent as b0, ImgComponent as b1, InstrumentScoreComponent as b2, InterceptorObservables as b3, JumbotronComponent as b4, KeyValueComponent as b5, LAYOUT_ASSET_FOLDER as b6, LOGIN_COMPONENT as b7, LOGIN_STORE as b8, LanguageComponent as b9, NAV_WIDGET_MAP as bA, NavComponent as bB, NavDetailsComponent as bC, NavHeaderComponent as bD, NavMenuComponent as bE, NavStore as bF, NavTrailComponent as bG, NothingComponent as bH, NotificationElementComponent as bI, NotificationGroupComponent as bJ, NotificationPopupComponent as bK, NotificationService as bL, NotificationStore as bM, NotificationType as bN, NotificationWidgetComponent as bO, ONE_ASSET_BASE_URL as bP, OPTIONS_SOURCE as bQ, OVERLAY_WIDGETS as bR, OneApp as bS, OptionsSourceDirective as bT, OverlayBodyComponent as bU, OverlayRef as bV, OverlayService as bW, PLATFORM_BUTTON_NAV_IDS as bX, PLATFORM_EXTENSIBLE_NAV_IDS as bY, PLATFORM_NAV_MAP as bZ, PLATFORM_ROOT_CHILDREN as b_, ListComponent as ba, LogoComponent as bb, MAG_SOCKET_EVENT as bc, MHeroColorDirective as bd, MHeroComponent as be, MODAL_STORE_REF as bf, MOUNT_STATIC_SEGMENT as bg, MOUNT_TOKEN as bh, MRefDirective as bi, MStepComponent as bj, MURL_PARAM as bk, MURL_SEP as bl, ManifestEnrichmentService as bm, MenuComponent as bn, ModalDirective as bo, ModalRef as bp, ModalStore as bq, MoneyPipe as br, MultiRangeInputComponent as bs, MurlUrlSerializer as bt, NAV_DEFAULT_MURL as bu, NAV_ID_SEP as bv, NAV_MAIN_BUTTONS as bw, NAV_SEGMENT_RE as bx, NAV_STORE_REF as by, NAV_WC_COMPONENTS as bz, cropRect as c, SharedStoreRegistry as c$, PanelComponent as c0, PercentagePipe as c1, PlaygroundComponent as c2, PositionDirective as c3, PwaInstallComponent as c4, RECENT_SEARCH_LIMIT as c5, REMOTE_PAGE_RELOAD as c6, ROOT_NAV$1 as c7, RadioGroupComponent as c8, RadioInputComponent as c9, SectionCarouselComponent as cA, SectionComponent as cB, SectionFilterComponent as cC, SectionFilterGroupComponent as cD, SectionFilterMenuComponent as cE, SectionFilterPanelComponent as cF, SectionFilterRangePanelComponent as cG, SectionFooterComponent as cH, SectionFormComponent as cI, SectionFormItemComponent as cJ, SectionHeaderComponent as cK, SectionHeroComponent as cL, SectionPaginationComponent as cM, SectionSearchComponent as cN, SectionStepperComponent as cO, SectionTableCellComponent as cP, SectionTableComponent as cQ, SectionTableRowComponent as cR, SectionTableSortPipe as cS, SectionTabsComponent as cT, SectionToggleComponent as cU, SectionToggleItemDirective as cV, SelectableCardInputComponent as cW, SelectorDirective as cX, SettingsSearchBarComponent as cY, SettingsSearchService as cZ, ShapeComponent as c_, RatingInputComponent as ca, ReactiveElementComponent as cb, RemoteComponent as cc, RemoteLoaderService as cd, ResizeElementComponent as ce, RouteContainer as cf, RowComponent as cg, SEARCH_QUERY as ch, SEARCH_RESULTS_EVENT as ci, SECTION_ACCORDION_GROUP as cj, SECTION_FORM_CONTEXT as ck, SECTION_TABLE_VARIANTS as cl, SHARED_ICONS as cm, SIZE_CONTEXT as cn, ScoreComponent as co, ScrollComponent as cp, ScrollService as cq, SearchPanelComponent as cr, SearchStore as cs, SearchUserPanelComponent as ct, SectionAccordionDirective as cu, SectionAccordionGroupDirective as cv, SectionBackComponent as cw, SectionBadgesComponent as cx, SectionButtonGroupComponent as cy, SectionCardComponent as cz, drawFramed as d, cellText as d$, SidePanelDirective as d0, Size as d1, SocketStore as d2, SortComponent as d3, StatComponent as d4, StepComponent as d5, StepperComponent as d6, StepsComponent as d7, StorageService as d8, StrokeLinecap as d9, USER_STORE_REF as dA, USER_TAB_MAP as dB, UniverseComponent as dC, UserApiService as dD, UserAvatarComponent as dE, UserComponent as dF, UserNavComponent as dG, UserSettingsComponent as dH, UserStore as dI, WC_BUNDLE as dJ, WC_NAVIGATE_EVENT as dK, WC_ROUTE_CHANGED_EVENT as dL, WC_SEARCH_GROUPS as dM, WIN_USER_TAB_HOOK as dN, WIN_USER_TAB_KEY as dO, WatermarkComponent as dP, WcRouterStore as dQ, WrapperInputComponent as dR, anchorNavId as dS, applyColorsToElement as dT, applyDocEdit as dU, assetOptions as dV, bootstrapMagApp as dW, bootstrapPwaInstall as dX, buildWcBaseUrl as dY, calculateLuminance as dZ, calculateRanks as d_, StrokeLinejoin as da, SummaryComponent as db, SvgGeneratorComponent as dc, SvgGeneratorService as dd, SvgService as de, TOTAL_COLUMNS as df, TRANSLATION_SOURCE as dg, TableComponent as dh, TechnicalMeterComponent as di, TextInputComponent as dj, TextareaInputComponent as dk, ThemeComponent as dl, ThemeDataService as dm, ThemeService as dn, ThemeStore as dp, TimeAgoPipe as dq, TimelineComponent as dr, ToggleButtonComponent as ds, ToggleInputComponent as dt, ToggleRadioInputComponent as du, ToolTipDirective as dv, TooltipComponent as dw, TranslateService as dx, TreeGridComponent as dy, URL_SEP as dz, encodeFramed as e, isBootRedirect as e$, checkDoc as e0, checkFilterCondition as e1, childNavId as e2, claimDenial as e3, classListSignal as e4, coerceSize as e5, cornerEdge as e6, cornerSide as e7, createMap as e8, createPlatformNavMap as e9, filterTreeGridRows as eA, filterValueList as eB, filterValues as eC, flattenTreeGridRows as eD, formatBadgeCount as eE, fullName as eF, generateClipPath as eG, generateTransform as eH, getClassList as eI, getProperty as eJ, getScrollParent as eK, getTierFromPreviewPath as eL, getTreeGridRow as eM, getUniqueId as eN, getValue as eO, hasErrorComputed as eP, hexToRgb as eQ, hslToRgb$1 as eR, initMagmoniumApp as eS, initialNotificationState as eT, initialState$2 as eU, initials as eV, injectAuthenticate as eW, injectDefaultDenial as eX, injectInstallApp as eY, injectParentSize as eZ, injectScrollSticky as e_, definedWcTierOf as ea, deriveAvatarGradient as eb, deriveContrastColor as ec, deriveOppositeColor as ed, derivePropertyName as ee, docActionKey as ef, docAssetCandidates as eg, docProblemKey as eh, docRemotePath as ei, emailValidation as ej, evaluate as ek, evaluateBool as el, fieldBoolean as em, fieldNumber as en, fieldString as eo, filterHoldsList as ep, filterHoldsOneBound as eq, filterHoldsOptions as er, filterHoldsRange as es, filterList as et, filterNumber as eu, filterNumberList as ev, filterOne as ew, filterPanelOf as ex, filterPanelWidth as ey, filterRange as ez, clampFraming as f, provideMagAppConfig as f$, isButtonName as f0, isCancelledComputed as f1, isExtensiblePlatformNavId as f2, isJson as f3, isLoadingComputed as f4, isLocalhost as f5, isNavInstanceConfig as f6, isNavMenuConfig as f7, isNavRowsConfig as f8, isNavVisibilityConfig as f9, mountPatternText as fA, mountSegmentOf as fB, mountTokenOf as fC, navIdChain as fD, navIdFor as fE, navIdSegment as fF, navIdToRoutePath as fG, navIdToSegments as fH, navParamOf as fI, navTailMatcher as fJ, navToId as fK, navVisibilityGuard as fL, nextSectionTableSort as fM, normalizeAssetOptions as fN, offsetOfLine as fO, parentNavId as fP, parseAddress as fQ, parseColor as fR, parseMountPattern as fS, parsePatternNames as fT, patternValidation as fU, patternsValidation as fV, permissionRefusal as fW, platformNavWidgets as fX, privateGuard as fY, processImageToSvg as fZ, provideAppContext as f_, isPlatformNavId as fa, isSize as fb, isTierPreview as fc, isUrlLocalhost as fd, isValidNavId as fe, isValidNavSegment as ff, isWebComponent as fg, linkToId as fh, linkToNav as fi, loadingActions as fj, mInterceptor as fk, manualValidation as fl, matchFieldValidation as fm, matchMount as fn, maxLengthValidation as fo, maxValidation as fp, mergePlatformNav as fq, mergeUnique as fr, mergeUniqueBy as fs, mergeUniqueWith as ft, minAgeValidation as fu, minLengthValidation as fv, minValidation as fw, miniMarkToHtml as fx, mountFor as fy, mountPatternProblem as fz, BaseInputComponent as g, provideMagWcConfig as g0, provideMagWcRoutes as g1, provideModalComponents as g2, provideMurlUrlSerializer as g3, provideNavWidgets as g4, provideOverlayWidgets as g5, providePlatformNavWidgets as g6, provideSearch as g7, provideSizeContext as g8, provideUserTabs as g9, splitNavId as gA, splitOnMatch as gB, stringToColor as gC, toAttrBool as gD, toAttrNumber as gE, toCssLength as gF, toHostNavId as gG, toLength$1 as gH, toLocalNavId as gI, toggleTreeGridRow as gJ, unfetchedPlatformNav as gK, ungroupedDocActions as gL, urlValidation as gM, wcTierOf as gN, publicGuard as ga, readFieldPatterns as gb, recordDefinedWcTier as gc, remoteOutletRoute as gd, renderAddress as ge, renderDocument as gf, requiredValidation as gg, resolveConfigAsset as gh, resolveIconSize as gi, resolvePallet as gj, resolvePatternRules as gk, resolveSize as gl, rgbToHex as gm, rgbToHsl as gn, rowHasChildren as go, samePatterns as gp, sectionTableColumnId as gq, sectionTableColumnWidths as gr, sectionTableFrozenCount as gs, segmentsToNavId as gt, setProperty as gu, setTreeGridChildren as gv, setWcTier as gw, settingsWidgets as gx, shouldShowBadge as gy, sortSectionTableRows 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 };
40261
+ //# sourceMappingURL=magmonium-one-magmonium-one-B5qzsrNB.mjs.map