@magmonium/one 0.4.42 → 0.4.44

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 (63) hide show
  1. package/fesm2022/{magmonium-one-attribute-value-DCTXt4Sr.mjs → magmonium-one-attribute-value-C1lqou2L.mjs} +3 -3
  2. package/fesm2022/{magmonium-one-attribute-value-DCTXt4Sr.mjs.map → magmonium-one-attribute-value-C1lqou2L.mjs.map} +1 -1
  3. package/fesm2022/{magmonium-one-base-checkbox-BNQAkyYU.mjs → magmonium-one-base-checkbox-CIxAiA4Q.mjs} +2 -2
  4. package/fesm2022/{magmonium-one-base-checkbox-BNQAkyYU.mjs.map → magmonium-one-base-checkbox-CIxAiA4Q.mjs.map} +1 -1
  5. package/fesm2022/{magmonium-one-base-dropdown-CcZ0lBQv.mjs → magmonium-one-base-dropdown-XpTWe4Ii.mjs} +10 -10
  6. package/fesm2022/{magmonium-one-base-dropdown-CcZ0lBQv.mjs.map → magmonium-one-base-dropdown-XpTWe4Ii.mjs.map} +1 -1
  7. package/fesm2022/{magmonium-one-base-input-BTxhUtYO.mjs → magmonium-one-base-input-C1Ek0Ezm.mjs} +2 -2
  8. package/fesm2022/{magmonium-one-base-input-BTxhUtYO.mjs.map → magmonium-one-base-input-C1Ek0Ezm.mjs.map} +1 -1
  9. package/fesm2022/{magmonium-one-base-text-BCSqKmVs.mjs → magmonium-one-base-text-Di2V2ojp.mjs} +2 -2
  10. package/fesm2022/{magmonium-one-base-text-BCSqKmVs.mjs.map → magmonium-one-base-text-Di2V2ojp.mjs.map} +1 -1
  11. package/fesm2022/{magmonium-one-button-BZQOf-Pm.mjs → magmonium-one-button-DZ4wCJgb.mjs} +7 -7
  12. package/fesm2022/{magmonium-one-button-BZQOf-Pm.mjs.map → magmonium-one-button-DZ4wCJgb.mjs.map} +1 -1
  13. package/fesm2022/{magmonium-one-checkbox-D5-5WhJ-.mjs → magmonium-one-checkbox-R-hPZrCa.mjs} +5 -5
  14. package/fesm2022/{magmonium-one-checkbox-D5-5WhJ-.mjs.map → magmonium-one-checkbox-R-hPZrCa.mjs.map} +1 -1
  15. package/fesm2022/{magmonium-one-color-utl-D86GGpz5.mjs → magmonium-one-color-utl-DI5p24iQ.mjs} +209 -6
  16. package/fesm2022/magmonium-one-color-utl-DI5p24iQ.mjs.map +1 -0
  17. package/fesm2022/{magmonium-one-directives-DePukAj8.mjs → magmonium-one-directives-B93p5bAL.mjs} +4 -4
  18. package/fesm2022/{magmonium-one-directives-DePukAj8.mjs.map → magmonium-one-directives-B93p5bAL.mjs.map} +1 -1
  19. package/fesm2022/{magmonium-one-group-Dl2bp-y-.mjs → magmonium-one-group-B7YeUd1u.mjs} +7 -7
  20. package/fesm2022/{magmonium-one-group-Dl2bp-y-.mjs.map → magmonium-one-group-B7YeUd1u.mjs.map} +1 -1
  21. package/fesm2022/{magmonium-one-header-DhK9NuZW.mjs → magmonium-one-header-DUiBhPUP.mjs} +4 -4
  22. package/fesm2022/{magmonium-one-header-DhK9NuZW.mjs.map → magmonium-one-header-DUiBhPUP.mjs.map} +1 -1
  23. package/fesm2022/{magmonium-one-icon-BgbtOdMv.mjs → magmonium-one-icon-C3jwzbb2.mjs} +13 -165
  24. package/fesm2022/magmonium-one-icon-C3jwzbb2.mjs.map +1 -0
  25. package/fesm2022/{magmonium-one-image-editor-oGxg59hV.mjs → magmonium-one-image-editor-BRTk8i4O.mjs} +4 -4
  26. package/fesm2022/{magmonium-one-image-editor-oGxg59hV.mjs.map → magmonium-one-image-editor-BRTk8i4O.mjs.map} +1 -1
  27. package/fesm2022/{magmonium-one-label-DjvJthAB.mjs → magmonium-one-label-D_rU82nD.mjs} +2 -2
  28. package/fesm2022/{magmonium-one-label-DjvJthAB.mjs.map → magmonium-one-label-D_rU82nD.mjs.map} +1 -1
  29. package/fesm2022/{magmonium-one-m-ref-C8c4Vf1G.mjs → magmonium-one-m-ref-CEms7B6-.mjs} +2 -2
  30. package/fesm2022/{magmonium-one-m-ref-C8c4Vf1G.mjs.map → magmonium-one-m-ref-CEms7B6-.mjs.map} +1 -1
  31. package/fesm2022/{magmonium-one-menu-bI7lVUYI.mjs → magmonium-one-menu-cO34OcJc.mjs} +6 -6
  32. package/fesm2022/{magmonium-one-menu-bI7lVUYI.mjs.map → magmonium-one-menu-cO34OcJc.mjs.map} +1 -1
  33. package/fesm2022/{magmonium-one-multi-range-o57TiVJU.mjs → magmonium-one-multi-range-Bq3_3NHg.mjs} +3 -3
  34. package/fesm2022/{magmonium-one-multi-range-o57TiVJU.mjs.map → magmonium-one-multi-range-Bq3_3NHg.mjs.map} +1 -1
  35. package/fesm2022/{magmonium-one-options-asset-EVsv0DL7.mjs → magmonium-one-options-asset-BMd7W0Mk.mjs} +2 -2
  36. package/fesm2022/{magmonium-one-options-asset-EVsv0DL7.mjs.map → magmonium-one-options-asset-BMd7W0Mk.mjs.map} +1 -1
  37. package/fesm2022/{magmonium-one-otp-CE4L1RcG.mjs → magmonium-one-otp-V2tFztLx.mjs} +5 -5
  38. package/fesm2022/{magmonium-one-otp-CE4L1RcG.mjs.map → magmonium-one-otp-V2tFztLx.mjs.map} +1 -1
  39. package/fesm2022/{magmonium-one-password-BIs_YxJ5.mjs → magmonium-one-password-IdllPMUw.mjs} +6 -6
  40. package/fesm2022/{magmonium-one-password-BIs_YxJ5.mjs.map → magmonium-one-password-IdllPMUw.mjs.map} +1 -1
  41. package/fesm2022/{magmonium-one-radio-C2wOB_Nb.mjs → magmonium-one-radio-BAL3-3j5.mjs} +3 -3
  42. package/fesm2022/{magmonium-one-radio-C2wOB_Nb.mjs.map → magmonium-one-radio-BAL3-3j5.mjs.map} +1 -1
  43. package/fesm2022/{magmonium-one-range-rgDe4O8u.mjs → magmonium-one-range-Cf7yUnhN.mjs} +4 -4
  44. package/fesm2022/{magmonium-one-range-rgDe4O8u.mjs.map → magmonium-one-range-Cf7yUnhN.mjs.map} +1 -1
  45. package/fesm2022/{magmonium-one-selector-DeRIUUBA.mjs → magmonium-one-selector-DAEI_0JX.mjs} +4 -4
  46. package/fesm2022/{magmonium-one-selector-DeRIUUBA.mjs.map → magmonium-one-selector-DAEI_0JX.mjs.map} +1 -1
  47. package/fesm2022/{magmonium-one-size-converter-C5fG_dgw.mjs → magmonium-one-size-converter-BOBD8nHy.mjs} +8 -1
  48. package/fesm2022/magmonium-one-size-converter-BOBD8nHy.mjs.map +1 -0
  49. package/fesm2022/{magmonium-one-text-BvXdAX0i.mjs → magmonium-one-text-BnTkYLJe.mjs} +6 -6
  50. package/fesm2022/{magmonium-one-text-BvXdAX0i.mjs.map → magmonium-one-text-BnTkYLJe.mjs.map} +1 -1
  51. package/fesm2022/{magmonium-one-text-output-Ci93Hi9Y.mjs → magmonium-one-text-output-BZU61QIF.mjs} +4 -4
  52. package/fesm2022/{magmonium-one-text-output-Ci93Hi9Y.mjs.map → magmonium-one-text-output-BZU61QIF.mjs.map} +1 -1
  53. package/fesm2022/magmonium-one-theme-DYvNIWmo.mjs +1 -0
  54. package/fesm2022/{magmonium-one-toggle-BTK2lzqA.mjs → magmonium-one-toggle-V_YnZXx5.mjs} +3 -3
  55. package/fesm2022/{magmonium-one-toggle-BTK2lzqA.mjs.map → magmonium-one-toggle-V_YnZXx5.mjs.map} +1 -1
  56. package/fesm2022/magmonium-one.mjs +669 -234
  57. package/fesm2022/magmonium-one.mjs.map +1 -1
  58. package/package.json +1 -1
  59. package/types/magmonium-one.d.ts +171 -8
  60. package/fesm2022/magmonium-one-color-utl-D86GGpz5.mjs.map +0 -1
  61. package/fesm2022/magmonium-one-icon-BgbtOdMv.mjs.map +0 -1
  62. package/fesm2022/magmonium-one-size-converter-C5fG_dgw.mjs.map +0 -1
  63. package/fesm2022/magmonium-one-theme-CT4cWpe7.mjs +0 -1
@@ -1,30 +1,30 @@
1
1
  import { t as __exportAll } from "./magmonium-one-rolldown-runtime-DpJrqANO.mjs";
2
- import { $ as WC_BUNDLE, A as isUrlLocalhost, B as IS_DESIGN_MODE, C as setWcLocalPort, D as getTierFromPreviewPath, E as wcTierOf, F as AppAvailability, G as MODAL_STORE_REF, H as LOADING_ACTIONS_REF, I as AppRelationType, J as OPTIONS_SOURCE, K as NAV_STORE_REF, L as COMPONENT_INPUT_REGISTRY, M as APP_CONTEXT_REF, N as APP_LINK, O as isLocalhost, P as ASSET_BASE_URL, Q as USER_STORE_REF, R as FOLDER_PICK_LISTENER, S as recordDefinedWcTier, T as wcLocalBaseOf, U as LOGIN_COMPONENT, V as IS_SIDE_PANEL, W as LOGIN_STORE, X as SEARCH_RESULTS_EVENT, Y as SEARCH_QUERY, Z as TRANSLATION_SOURCE, _ as ACCESS_DOMAINS, a as resolveSpacing, at as Size, b as definedWcBundleOf, c as TranslatePipe, d as browserLocale, et as WC_SEARCH_GROUPS, f as miniMarkToHtml, g as isJson, h as StorageService, i as resolveSize, it as DEFAULT_SIZE, j as isWebComponent, k as isTierPreview, l as TranslateService, m as SharedStoreRegistry, n as isSize, nt as LAYOUT_ASSET_FOLDER, o as toCssLength, p as AssetStore, q as ONE_ASSET_BASE_URL, r as resolveIconSize, rt as Assets, s as toLength, t as coerceSize, tt as FORM_ASSET_FOLDER, u as BrowserLocaleService, v as HttpService, w as setWcTier, x as definedWcTierOf, y as buildWcBaseUrl, z as ICON_SOURCE } from "./magmonium-one-size-converter-C5fG_dgw.mjs";
3
- import { a as OverlayService, c as DeviceService, i as OverlayRef, n as Direction, o as ScrollService, r as ThemeService, s as DomService, t as SelectorDirective } from "./magmonium-one-selector-DeRIUUBA.mjs";
2
+ import { $ as WC_BUNDLE, A as isUrlLocalhost, B as IS_DESIGN_MODE, C as setWcLocalPort, D as getTierFromPreviewPath, E as wcTierOf, F as AppAvailability, G as MODAL_STORE_REF, H as LOADING_ACTIONS_REF, I as AppRelationType, J as OPTIONS_SOURCE, K as NAV_STORE_REF, L as COMPONENT_INPUT_REGISTRY, M as APP_CONTEXT_REF, N as APP_LINK, O as isLocalhost, P as ASSET_BASE_URL, Q as USER_STORE_REF, R as FOLDER_PICK_LISTENER, S as recordDefinedWcTier, T as wcLocalBaseOf, U as LOGIN_COMPONENT, V as IS_SIDE_PANEL, W as LOGIN_STORE, X as SEARCH_RESULTS_EVENT, Y as SEARCH_QUERY, Z as TRANSLATION_SOURCE, _ as ACCESS_DOMAINS, a as resolveSpacing, at as Size, b as definedWcBundleOf, c as TranslatePipe, d as browserLocale, et as WC_SEARCH_GROUPS, f as miniMarkToHtml, g as isJson, h as StorageService, i as resolveSize, it as DEFAULT_SIZE, j as isWebComponent, k as isTierPreview, l as TranslateService, m as SharedStoreRegistry, n as isSize, nt as LAYOUT_ASSET_FOLDER, o as toCssLength, p as AssetStore, q as ONE_ASSET_BASE_URL, r as resolveIconSize, rt as Assets, s as toLength, t as coerceSize, tt as FORM_ASSET_FOLDER, u as BrowserLocaleService, v as HttpService, w as setWcTier, x as definedWcTierOf, y as buildWcBaseUrl, z as ICON_SOURCE } from "./magmonium-one-size-converter-BOBD8nHy.mjs";
3
+ import { a as OverlayService, c as DeviceService, i as OverlayRef, n as Direction, o as ScrollService, r as ThemeService, s as DomService, t as SelectorDirective } from "./magmonium-one-selector-DAEI_0JX.mjs";
4
4
  import { t as FileService } from "./magmonium-one-file.service-Bo06pU3_.mjs";
5
- import { a as calculateLuminance, c as hexToRgb, d as derivePropertyName, f as getProperty, h as ThemeDataService, i as deriveOppositeColor, l as hslToRgb, m as ThemeStore, n as resolvePallet, o as rgbToHex, p as setProperty, r as deriveContrastColor, s as rgbToHsl, t as applyColorsToElement, u as parseColor } from "./magmonium-one-color-utl-D86GGpz5.mjs";
6
- import "./magmonium-one-theme-CT4cWpe7.mjs";
7
- import { a as sectionTableColumnWidths, c as AssetUrlPipe, d as MoneyPipe, f as TimeAgoPipe, i as sectionTableColumnId, l as CompactNumberPipe, n as SectionTableSortPipe, o as sectionTableFrozenCount, r as nextSectionTableSort, s as sortSectionTableRows, t as LabelComponent, u as PercentagePipe } from "./magmonium-one-label-DjvJthAB.mjs";
8
- import { i as getScrollParent, n as activeElementWithin, r as classListSignal, t as BaseTextInputComponent } from "./magmonium-one-base-text-BCSqKmVs.mjs";
9
- import { a as appLogoShadowColor, c as normalizeAppColor, d as SIZE_CONTEXT, f as injectParentSize, g as AppLogoState, h as APP_LOGO_SOURCE, i as LOGO_GLYPH_MAX_BYTES, l as rebuildLogoGlyph, m as SHARED_ICONS, n as CustomIconClass, o as isLightAppColor, p as provideSizeContext, r as IconComponent, s as logoGlyphMaskUrl, t as CustomIconEditComponent, u as APP_LOGO_ICON } from "./magmonium-one-icon-BgbtOdMv.mjs";
10
- import { i as resolveConfigAsset, n as toAttrNumber, r as ConfigComponent, t as toAttrBool } from "./magmonium-one-attribute-value-DCTXt4Sr.mjs";
11
- import { a as isButtonName, c as formatBadgeCount, l as shouldShowBadge, n as SECTION_FORM_CONTEXT, o as ReactiveElementComponent, r as ImgComponent, s as BadgeComponent, t as ButtonComponent } from "./magmonium-one-button-BZQOf-Pm.mjs";
12
- import { t as MRefDirective } from "./magmonium-one-m-ref-C8c4Vf1G.mjs";
13
- import { t as HeaderComponent } from "./magmonium-one-header-DhK9NuZW.mjs";
14
- import { t as TextOutputComponent } from "./magmonium-one-text-output-Ci93Hi9Y.mjs";
15
- import { t as BaseInputComponent } from "./magmonium-one-base-input-BTxhUtYO.mjs";
16
- import { a as stringToColor, c as ToolTipDirective, d as DragListItemDirective, f as DragListDirective, i as MHeroColorDirective, l as FileUploadDirective, n as PaddingDirective, o as HighlightDirective, p as DraggableDirective, r as SPACING_INWARD, s as PositionDirective, t as MarginDirective, u as AutosizeDirective } from "./magmonium-one-directives-DePukAj8.mjs";
17
- import { n as DROPDOWN_IMPORTS, r as DROPDOWN_TEMPLATE, t as BaseDropdownComponent } from "./magmonium-one-base-dropdown-CcZ0lBQv.mjs";
5
+ import { C as isLightAppColor, D as ThemeDataService, E as rebuildLogoGlyph, S as appLogoShadowColor, T as normalizeAppColor, _ as AppLogoState, a as calculateLuminance, b as LOGO_GLYPH_MAX_BYTES, c as hexToRgb, d as derivePropertyName, f as getProperty, g as APP_THEME_COLOR, h as APP_LOGO_SOURCE, i as deriveOppositeColor, l as hslToRgb, m as ThemeStore, n as resolvePallet, o as rgbToHex, p as setProperty, r as deriveContrastColor, s as rgbToHsl, t as applyColorsToElement, u as parseColor, v as appThemeColorFactory, w as logoGlyphMaskUrl, x as appColorBrand, y as paintAppColor } from "./magmonium-one-color-utl-DI5p24iQ.mjs";
6
+ import "./magmonium-one-theme-DYvNIWmo.mjs";
7
+ import { a as sectionTableColumnWidths, c as AssetUrlPipe, d as MoneyPipe, f as TimeAgoPipe, i as sectionTableColumnId, l as CompactNumberPipe, n as SectionTableSortPipe, o as sectionTableFrozenCount, r as nextSectionTableSort, s as sortSectionTableRows, t as LabelComponent, u as PercentagePipe } from "./magmonium-one-label-D_rU82nD.mjs";
8
+ import { i as getScrollParent, n as activeElementWithin, r as classListSignal, t as BaseTextInputComponent } from "./magmonium-one-base-text-Di2V2ojp.mjs";
9
+ import { a as SIZE_CONTEXT, c as SHARED_ICONS, i as APP_LOGO_ICON, n as CustomIconClass, o as injectParentSize, r as IconComponent, s as provideSizeContext, t as CustomIconEditComponent } from "./magmonium-one-icon-C3jwzbb2.mjs";
10
+ import { i as resolveConfigAsset, n as toAttrNumber, r as ConfigComponent, t as toAttrBool } from "./magmonium-one-attribute-value-C1lqou2L.mjs";
11
+ import { a as isButtonName, c as formatBadgeCount, l as shouldShowBadge, n as SECTION_FORM_CONTEXT, o as ReactiveElementComponent, r as ImgComponent, s as BadgeComponent, t as ButtonComponent } from "./magmonium-one-button-DZ4wCJgb.mjs";
12
+ import { t as MRefDirective } from "./magmonium-one-m-ref-CEms7B6-.mjs";
13
+ import { t as HeaderComponent } from "./magmonium-one-header-DUiBhPUP.mjs";
14
+ import { t as TextOutputComponent } from "./magmonium-one-text-output-BZU61QIF.mjs";
15
+ import { t as BaseInputComponent } from "./magmonium-one-base-input-C1Ek0Ezm.mjs";
16
+ import { a as stringToColor, c as ToolTipDirective, d as DragListItemDirective, f as DragListDirective, i as MHeroColorDirective, l as FileUploadDirective, n as PaddingDirective, o as HighlightDirective, p as DraggableDirective, r as SPACING_INWARD, s as PositionDirective, t as MarginDirective, u as AutosizeDirective } from "./magmonium-one-directives-B93p5bAL.mjs";
17
+ import { n as DROPDOWN_IMPORTS, r as DROPDOWN_TEMPLATE, t as BaseDropdownComponent } from "./magmonium-one-base-dropdown-XpTWe4Ii.mjs";
18
18
  import { t as InputType } from "./magmonium-one-input-DqHPorA1.mjs";
19
- import { t as TextInputComponent } from "./magmonium-one-text-BvXdAX0i.mjs";
20
- import { i as OptionsSourceDirective, n as normalizeAssetOptions, r as presetDefaultOption, t as assetOptions } from "./magmonium-one-options-asset-EVsv0DL7.mjs";
21
- import { r as PLACED_CHECKBOX, t as CheckboxInputComponent } from "./magmonium-one-checkbox-D5-5WhJ-.mjs";
22
- import { i as mergeUniqueWith, n as mergeUnique, r as mergeUniqueBy, t as ButtonGroupComponent } from "./magmonium-one-group-Dl2bp-y-.mjs";
23
- import { n as ContextMenuBoxComponent, r as MenuComponent, t as ContextMenuComponent } from "./magmonium-one-menu-bI7lVUYI.mjs";
24
- import { t as BaseCheckboxInputComponent } from "./magmonium-one-base-checkbox-BNQAkyYU.mjs";
25
- import { t as RadioInputComponent } from "./magmonium-one-radio-C2wOB_Nb.mjs";
26
- import { r as BaseArrayInputComponent, t as MultiRangeInputComponent } from "./magmonium-one-multi-range-o57TiVJU.mjs";
27
- import { t as RangeInputComponent } from "./magmonium-one-range-rgDe4O8u.mjs";
19
+ import { t as TextInputComponent } from "./magmonium-one-text-BnTkYLJe.mjs";
20
+ import { i as OptionsSourceDirective, n as normalizeAssetOptions, r as presetDefaultOption, t as assetOptions } from "./magmonium-one-options-asset-BMd7W0Mk.mjs";
21
+ import { r as PLACED_CHECKBOX, t as CheckboxInputComponent } from "./magmonium-one-checkbox-R-hPZrCa.mjs";
22
+ import { i as mergeUniqueWith, n as mergeUnique, r as mergeUniqueBy, t as ButtonGroupComponent } from "./magmonium-one-group-B7YeUd1u.mjs";
23
+ import { n as ContextMenuBoxComponent, r as MenuComponent, t as ContextMenuComponent } from "./magmonium-one-menu-cO34OcJc.mjs";
24
+ import { t as BaseCheckboxInputComponent } from "./magmonium-one-base-checkbox-CIxAiA4Q.mjs";
25
+ import { t as RadioInputComponent } from "./magmonium-one-radio-BAL3-3j5.mjs";
26
+ import { r as BaseArrayInputComponent, t as MultiRangeInputComponent } from "./magmonium-one-multi-range-Bq3_3NHg.mjs";
27
+ import { t as RangeInputComponent } from "./magmonium-one-range-Cf7yUnhN.mjs";
28
28
  import { o as isEditableImage, s as outputSize } from "./magmonium-one-image-frame-BTSaUSAi.mjs";
29
29
  import * as i0 from "@angular/core";
30
30
  import { ApplicationRef, CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, DOCUMENT, DestroyRef, Directive, ElementRef, EventEmitter, HostAttributeToken, HostBinding, HostListener, Injectable, InjectionToken, Injector, Input, Output, TemplateRef, ViewChild, ViewContainerRef, ViewEncapsulation, afterEveryRender, afterNextRender, afterRenderEffect, computed, contentChild, contentChildren, createComponent, effect, forwardRef, inject, input, inputBinding, linkedSignal, makeEnvironmentProviders, model, numberAttribute, output, outputBinding, provideAppInitializer, provideBrowserGlobalErrorListeners, provideZonelessChangeDetection, reflectComponentType, runInInjectionContext, signal, twoWayBinding, untracked, viewChild, viewChildren } from "@angular/core";
@@ -1274,6 +1274,7 @@ const NavStore = signalStore({ providedIn: "root" }, withState(initialState$3),
1274
1274
  router
1275
1275
  };
1276
1276
  }), withComputed((store) => {
1277
+ const assetStore = inject(AssetStore);
1277
1278
  const navWidgetMaps = inject(NAV_WIDGET_MAP, { optional: true });
1278
1279
  const anchorRouteNavId = computed(() => visibleNavId(store.routeNavId() ?? "root"), ...ngDevMode ? [{ debugName: "anchorRouteNavId" }] : /* istanbul ignore next */ []);
1279
1280
  const id = computed(() => store.menuNavId() ?? navIdFor(anchorRouteNavId(), store.murl()), ...ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []);
@@ -1544,21 +1545,46 @@ const NavStore = signalStore({ providedIn: "root" }, withState(initialState$3),
1544
1545
  const appLink = store.appLink();
1545
1546
  return appLink && !activeAppOpen() ? store.identityMap()[appLink] : void 0;
1546
1547
  }, ...ngDevMode ? [{ debugName: "currentIdentity" }] : /* istanbul ignore next */ []);
1548
+ const appLogoLink = computed(() => store.appLink() ?? assetStore.appLink(), ...ngDevMode ? [{ debugName: "appLogoLink" }] : /* istanbul ignore next */ []);
1547
1549
  const appLogo = computed(() => {
1548
- const appLink = store.appLink();
1549
- if (appLink && !activeAppOpen()) {
1550
- const identity = store.identityMap()[appLink];
1551
- return {
1552
- glyph: identity?.logoGlyph ?? null,
1553
- name: identity?.name ?? appLink
1554
- };
1555
- }
1550
+ const appLink = appLogoLink();
1551
+ const identity = appLink ? store.identityMap()[appLink] : void 0;
1552
+ if (identity?.logoGlyph) return {
1553
+ glyph: identity.logoGlyph,
1554
+ name: identity.name
1555
+ };
1556
+ if (appLink && !activeAppOpen()) return {
1557
+ glyph: null,
1558
+ name: identity?.name ?? appLink
1559
+ };
1556
1560
  const root = store.navMap()[ROOT_NAV];
1557
- return root ? {
1561
+ if (root?.logo) return {
1558
1562
  src: root.logo,
1559
1563
  name: root.title
1560
- } : void 0;
1564
+ };
1565
+ return { name: identity?.name ?? appLink ?? root?.title };
1561
1566
  }, ...ngDevMode ? [{ debugName: "appLogo" }] : /* istanbul ignore next */ []);
1567
+ const appLogos = computed(() => {
1568
+ const logos = {};
1569
+ for (const [link, identity] of Object.entries(store.identityMap())) {
1570
+ const color = identity.appColor;
1571
+ if (identity.logoGlyph) logos[link] = {
1572
+ glyph: identity.logoGlyph,
1573
+ name: identity.name,
1574
+ color
1575
+ };
1576
+ else if (!identity.open) logos[link] = {
1577
+ glyph: null,
1578
+ name: identity.name || link,
1579
+ color
1580
+ };
1581
+ else if (color) logos[link] = {
1582
+ name: identity.name || link,
1583
+ color
1584
+ };
1585
+ }
1586
+ return logos;
1587
+ }, ...ngDevMode ? [{ debugName: "appLogos" }] : /* istanbul ignore next */ []);
1562
1588
  const answeringNavId = (candidates, hit) => {
1563
1589
  if (hit) return hit.navId;
1564
1590
  const map = store.navMap();
@@ -1597,8 +1623,32 @@ const NavStore = signalStore({ providedIn: "root" }, withState(initialState$3),
1597
1623
  hasOwnContent: !!widgetConfig || !!emittedMenu?.length
1598
1624
  });
1599
1625
  }, ...ngDevMode ? [{ debugName: "breadcrumbResult" }] : /* istanbul ignore next */ []);
1600
- const breadcrumb = computed(() => breadcrumbResult().breadcrumb, ...ngDevMode ? [{ debugName: "breadcrumb" }] : /* istanbul ignore next */ []);
1601
- const navMenus = computed(() => breadcrumbResult().navMenus, ...ngDevMode ? [{ debugName: "navMenus" }] : /* istanbul ignore next */ []);
1626
+ const appLinkByNavId = computed(() => Object.fromEntries([...allMounts(), ...menuMounts()].flatMap(({ appNavId, link }) => link ? [[appNavId, link]] : [])), ...ngDevMode ? [{ debugName: "appLinkByNavId" }] : /* istanbul ignore next */ []);
1627
+ const withAppLogo = computed(() => {
1628
+ const links = appLinkByNavId();
1629
+ const identities = store.identityMap();
1630
+ return (entry) => {
1631
+ const link = links[entry.nav ?? entry.id];
1632
+ const identity = link ? identities[link] : void 0;
1633
+ if (!link || !identity || identity.open && !identity.logoGlyph) return entry;
1634
+ return {
1635
+ ...entry,
1636
+ appLogo: {
1637
+ glyph: identity.logoGlyph,
1638
+ color: identity.appColor,
1639
+ name: identity.name || link
1640
+ }
1641
+ };
1642
+ };
1643
+ }, ...ngDevMode ? [{ debugName: "withAppLogo" }] : /* istanbul ignore next */ []);
1644
+ const breadcrumb = computed(() => {
1645
+ const crumb = breadcrumbResult().breadcrumb;
1646
+ return {
1647
+ ...crumb,
1648
+ header: withAppLogo()(crumb.header)
1649
+ };
1650
+ }, ...ngDevMode ? [{ debugName: "breadcrumb" }] : /* istanbul ignore next */ []);
1651
+ const navMenus = computed(() => breadcrumbResult().navMenus.map(withAppLogo()), ...ngDevMode ? [{ debugName: "navMenus" }] : /* istanbul ignore next */ []);
1602
1652
  return {
1603
1653
  id,
1604
1654
  allMounts,
@@ -1624,7 +1674,9 @@ const NavStore = signalStore({ providedIn: "root" }, withState(initialState$3),
1624
1674
  }, ...ngDevMode ? [{ debugName: "navHasContent" }] : /* istanbul ignore next */ []),
1625
1675
  currentWcConfig,
1626
1676
  currentIdentity,
1677
+ appLogoLink,
1627
1678
  appLogo,
1679
+ appLogos,
1628
1680
  activeAppOpen,
1629
1681
  transparentNavIds,
1630
1682
  resolvedNavMenuConfig,
@@ -1971,7 +2023,9 @@ const NavStore = signalStore({ providedIn: "root" }, withState(initialState$3),
1971
2023
  const appLogoState = inject(AppLogoState);
1972
2024
  return { onInit() {
1973
2025
  store.syncFromRouter(store.navigationEnd);
2026
+ store.loadIdentity(store.appLogoLink);
1974
2027
  effect(() => appLogoState.set(store.appLogo()));
2028
+ effect(() => appLogoState.setLogos(store.appLogos()));
1975
2029
  const loadedFor = /* @__PURE__ */ new Set();
1976
2030
  effect(() => {
1977
2031
  const loaders = store.visibilityLoaders();
@@ -3420,6 +3474,7 @@ function initMagmoniumApp({ backend, authUrl, socketUrl }) {
3420
3474
  SharedStoreRegistry.setTranslateService(translateService);
3421
3475
  SharedStoreRegistry.setLoadingActions(loadingActions);
3422
3476
  SharedStoreRegistry.setNotificationStore(inject(NotificationStore));
3477
+ SharedStoreRegistry.setAppLogoState(inject(AppLogoState));
3423
3478
  if (navStore) SharedStoreRegistry.setNavStore(navStore);
3424
3479
  if (loginStore) SharedStoreRegistry.setLoginStore(loginStore);
3425
3480
  const effectiveBackend = backend || "http://localhost:8000";
@@ -4156,12 +4211,12 @@ var SectionFormItemComponent = class SectionFormItemComponent extends ConfigComp
4156
4211
  try {
4157
4212
  switch (type) {
4158
4213
  case InputType.RADIO: {
4159
- const { RadioInputComponent } = await import("./magmonium-one-radio-C2wOB_Nb.mjs").then((n) => n.n);
4214
+ const { RadioInputComponent } = await import("./magmonium-one-radio-BAL3-3j5.mjs").then((n) => n.n);
4160
4215
  this.createDynamicComponent(seq, RadioInputComponent);
4161
4216
  break;
4162
4217
  }
4163
4218
  case InputType.TOGGLE: {
4164
- const { ToggleInputComponent } = await import("./magmonium-one-toggle-BTK2lzqA.mjs");
4219
+ const { ToggleInputComponent } = await import("./magmonium-one-toggle-V_YnZXx5.mjs");
4165
4220
  this.createDynamicComponent(seq, ToggleInputComponent, [], true);
4166
4221
  break;
4167
4222
  }
@@ -4171,12 +4226,12 @@ var SectionFormItemComponent = class SectionFormItemComponent extends ConfigComp
4171
4226
  break;
4172
4227
  }
4173
4228
  case InputType.PASSWORD: {
4174
- const { PasswordInputComponent } = await import("./magmonium-one-password-BIs_YxJ5.mjs");
4229
+ const { PasswordInputComponent } = await import("./magmonium-one-password-IdllPMUw.mjs");
4175
4230
  this.createDynamicComponent(seq, PasswordInputComponent);
4176
4231
  break;
4177
4232
  }
4178
4233
  case InputType.OTP: {
4179
- const { OtpInputComponent } = await import("./magmonium-one-otp-CE4L1RcG.mjs");
4234
+ const { OtpInputComponent } = await import("./magmonium-one-otp-V2tFztLx.mjs");
4180
4235
  this.createDynamicComponent(seq, OtpInputComponent);
4181
4236
  break;
4182
4237
  }
@@ -4186,7 +4241,7 @@ var SectionFormItemComponent = class SectionFormItemComponent extends ConfigComp
4186
4241
  break;
4187
4242
  }
4188
4243
  case InputType.CHECKBOX: {
4189
- const { CheckboxInputComponent } = await import("./magmonium-one-checkbox-D5-5WhJ-.mjs").then((n) => n.n);
4244
+ const { CheckboxInputComponent } = await import("./magmonium-one-checkbox-R-hPZrCa.mjs").then((n) => n.n);
4190
4245
  this.createDynamicComponent(seq, CheckboxInputComponent, [], true);
4191
4246
  break;
4192
4247
  }
@@ -4201,12 +4256,12 @@ var SectionFormItemComponent = class SectionFormItemComponent extends ConfigComp
4201
4256
  break;
4202
4257
  }
4203
4258
  case InputType.RANGE: {
4204
- const { RangeInputComponent } = await import("./magmonium-one-range-rgDe4O8u.mjs").then((n) => n.n);
4259
+ const { RangeInputComponent } = await import("./magmonium-one-range-Cf7yUnhN.mjs").then((n) => n.n);
4205
4260
  this.createDynamicComponent(seq, RangeInputComponent);
4206
4261
  break;
4207
4262
  }
4208
4263
  case InputType.MULTI_RANGE: {
4209
- const { MultiRangeInputComponent } = await import("./magmonium-one-multi-range-o57TiVJU.mjs").then((n) => n.n);
4264
+ const { MultiRangeInputComponent } = await import("./magmonium-one-multi-range-Bq3_3NHg.mjs").then((n) => n.n);
4210
4265
  this.createDynamicComponent(seq, MultiRangeInputComponent);
4211
4266
  break;
4212
4267
  }
@@ -4257,7 +4312,7 @@ var SectionFormItemComponent = class SectionFormItemComponent extends ConfigComp
4257
4312
  break;
4258
4313
  }
4259
4314
  default: {
4260
- const { TextInputComponent } = await import("./magmonium-one-text-BvXdAX0i.mjs").then((n) => n.n);
4315
+ const { TextInputComponent } = await import("./magmonium-one-text-BnTkYLJe.mjs").then((n) => n.n);
4261
4316
  this.createDynamicComponent(seq, TextInputComponent);
4262
4317
  break;
4263
4318
  }
@@ -16808,8 +16863,8 @@ var SectionHeaderComponent = class SectionHeaderComponent {
16808
16863
  classAttribute: "m-section-header"
16809
16864
  },
16810
16865
  ngImport: i0,
16811
- 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 — 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 — `<span label>` — 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 —\n empty until a Control is dropped in it — 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 — 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",
16812
- 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:var(--m-section-header-sticky-top, 0);z-index:var(--m-section-header-sticky-z, 10)}:host(.is-sticky){background:color-mix(in srgb,var(--m-background) 80%,transparent);backdrop-filter:blur(16px) saturate(180%);-webkit-backdrop-filter:blur(16px) saturate(180%)}:host(.is-accordion){cursor:pointer}.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"],
16866
+ 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 — 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 <!-- An AppLogo projected in the icon's place, selected by tag like the\n FilterGroup below — boxed to the heading's line box the same way. -->\n <div class=\"section-header__logo\">\n <ng-content select=\"m-app-logo\" />\n </div>\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 — `<span label>` — 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 —\n empty until a Control is dropped in it — 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 — 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",
16867
+ 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:var(--m-section-header-sticky-top, 0);z-index:var(--m-section-header-sticky-z, 10)}:host(.is-sticky){background:color-mix(in srgb,var(--m-background) 80%,transparent);backdrop-filter:blur(16px) saturate(180%);-webkit-backdrop-filter:blur(16px) saturate(180%)}:host(.is-accordion){cursor:pointer}.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,.section-header__logo{display:contents}.section-header__logo 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"],
16813
16868
  dependencies: [
16814
16869
  {
16815
16870
  kind: "directive",
@@ -16941,8 +16996,8 @@ i0.ɵɵngDeclareClassMetadata({
16941
16996
  "[class.is-accordion]": "!!accordion()",
16942
16997
  "(click)": "onHeaderClick($event)"
16943
16998
  },
16944
- 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 — 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 — `<span label>` — 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 —\n empty until a Control is dropped in it — 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 — 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",
16945
- 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:var(--m-section-header-sticky-top, 0);z-index:var(--m-section-header-sticky-z, 10)}:host(.is-sticky){background:color-mix(in srgb,var(--m-background) 80%,transparent);backdrop-filter:blur(16px) saturate(180%);-webkit-backdrop-filter:blur(16px) saturate(180%)}:host(.is-accordion){cursor:pointer}.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"]
16999
+ 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 — 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 <!-- An AppLogo projected in the icon's place, selected by tag like the\n FilterGroup below — boxed to the heading's line box the same way. -->\n <div class=\"section-header__logo\">\n <ng-content select=\"m-app-logo\" />\n </div>\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 — `<span label>` — 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 —\n empty until a Control is dropped in it — 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 — 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",
17000
+ 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:var(--m-section-header-sticky-top, 0);z-index:var(--m-section-header-sticky-z, 10)}:host(.is-sticky){background:color-mix(in srgb,var(--m-background) 80%,transparent);backdrop-filter:blur(16px) saturate(180%);-webkit-backdrop-filter:blur(16px) saturate(180%)}:host(.is-accordion){cursor:pointer}.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,.section-header__logo{display:contents}.section-header__logo 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"]
16946
17001
  }]
16947
17002
  }],
16948
17003
  propDecorators: {
@@ -21726,12 +21781,12 @@ var WrapperInputComponent = class WrapperInputComponent extends ConfigComponent
21726
21781
  const seq = ++this.dynamicSeq;
21727
21782
  switch (this.config()?.type) {
21728
21783
  case InputType.RADIO: {
21729
- const { RadioInputComponent } = await import("./magmonium-one-radio-C2wOB_Nb.mjs").then((n) => n.n);
21784
+ const { RadioInputComponent } = await import("./magmonium-one-radio-BAL3-3j5.mjs").then((n) => n.n);
21730
21785
  this.createDynamicComponent(seq, RadioInputComponent);
21731
21786
  break;
21732
21787
  }
21733
21788
  case InputType.TOGGLE: {
21734
- const { ToggleInputComponent } = await import("./magmonium-one-toggle-BTK2lzqA.mjs");
21789
+ const { ToggleInputComponent } = await import("./magmonium-one-toggle-V_YnZXx5.mjs");
21735
21790
  this.createDynamicComponent(seq, ToggleInputComponent, [], true);
21736
21791
  break;
21737
21792
  }
@@ -21741,12 +21796,12 @@ var WrapperInputComponent = class WrapperInputComponent extends ConfigComponent
21741
21796
  break;
21742
21797
  }
21743
21798
  case InputType.PASSWORD: {
21744
- const { PasswordInputComponent } = await import("./magmonium-one-password-BIs_YxJ5.mjs");
21799
+ const { PasswordInputComponent } = await import("./magmonium-one-password-IdllPMUw.mjs");
21745
21800
  this.createDynamicComponent(seq, PasswordInputComponent);
21746
21801
  break;
21747
21802
  }
21748
21803
  case InputType.OTP: {
21749
- const { OtpInputComponent } = await import("./magmonium-one-otp-CE4L1RcG.mjs");
21804
+ const { OtpInputComponent } = await import("./magmonium-one-otp-V2tFztLx.mjs");
21750
21805
  this.createDynamicComponent(seq, OtpInputComponent);
21751
21806
  break;
21752
21807
  }
@@ -21756,7 +21811,7 @@ var WrapperInputComponent = class WrapperInputComponent extends ConfigComponent
21756
21811
  break;
21757
21812
  }
21758
21813
  case InputType.CHECKBOX: {
21759
- const { CheckboxInputComponent } = await import("./magmonium-one-checkbox-D5-5WhJ-.mjs").then((n) => n.n);
21814
+ const { CheckboxInputComponent } = await import("./magmonium-one-checkbox-R-hPZrCa.mjs").then((n) => n.n);
21760
21815
  this.createDynamicComponent(seq, CheckboxInputComponent, [], true);
21761
21816
  break;
21762
21817
  }
@@ -21771,12 +21826,12 @@ var WrapperInputComponent = class WrapperInputComponent extends ConfigComponent
21771
21826
  break;
21772
21827
  }
21773
21828
  case InputType.RANGE: {
21774
- const { RangeInputComponent } = await import("./magmonium-one-range-rgDe4O8u.mjs").then((n) => n.n);
21829
+ const { RangeInputComponent } = await import("./magmonium-one-range-Cf7yUnhN.mjs").then((n) => n.n);
21775
21830
  this.createDynamicComponent(seq, RangeInputComponent);
21776
21831
  break;
21777
21832
  }
21778
21833
  case InputType.MULTI_RANGE: {
21779
- const { MultiRangeInputComponent } = await import("./magmonium-one-multi-range-o57TiVJU.mjs").then((n) => n.n);
21834
+ const { MultiRangeInputComponent } = await import("./magmonium-one-multi-range-Bq3_3NHg.mjs").then((n) => n.n);
21780
21835
  this.createDynamicComponent(seq, MultiRangeInputComponent);
21781
21836
  break;
21782
21837
  }
@@ -21827,7 +21882,7 @@ var WrapperInputComponent = class WrapperInputComponent extends ConfigComponent
21827
21882
  break;
21828
21883
  }
21829
21884
  default: {
21830
- const { TextInputComponent } = await import("./magmonium-one-text-BvXdAX0i.mjs").then((n) => n.n);
21885
+ const { TextInputComponent } = await import("./magmonium-one-text-BnTkYLJe.mjs").then((n) => n.n);
21831
21886
  this.createDynamicComponent(seq, TextInputComponent);
21832
21887
  break;
21833
21888
  }
@@ -24145,7 +24200,7 @@ var FileUploadInputComponent = class FileUploadInputComponent extends BaseInputC
24145
24200
  openEditor = async (file, size) => {
24146
24201
  const modalStore = this.modalStore;
24147
24202
  if (!modalStore) return void 0;
24148
- const { ImageEditorComponent } = await import("./magmonium-one-image-editor-oGxg59hV.mjs");
24203
+ const { ImageEditorComponent } = await import("./magmonium-one-image-editor-BRTk8i4O.mjs");
24149
24204
  const ratio = String(this.config()?.ratio ?? "");
24150
24205
  return new Promise((resolve) => {
24151
24206
  const modalRef = new ModalRef();
@@ -29166,12 +29221,232 @@ const remoteOutletRoute = (name) => ({
29166
29221
  children: [],
29167
29222
  data: { remoteOutlet: true }
29168
29223
  });
29224
+ var AppLogoComponent = class AppLogoComponent {
29225
+ glyph = input(...ngDevMode ? [void 0, { debugName: "glyph" }] : /* istanbul ignore next */ []);
29226
+ appColor = input(...ngDevMode ? [void 0, { debugName: "appColor" }] : /* istanbul ignore next */ []);
29227
+ name = input(...ngDevMode ? [void 0, { debugName: "name" }] : /* istanbul ignore next */ []);
29228
+ link = input(...ngDevMode ? [void 0, { debugName: "link" }] : /* istanbul ignore next */ []);
29229
+ variant = input("tile", ...ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []);
29230
+ tone = input("app", ...ngDevMode ? [{ debugName: "tone" }] : /* istanbul ignore next */ []);
29231
+ size = input(...ngDevMode ? [void 0, { debugName: "size" }] : /* istanbul ignore next */ []);
29232
+ #state = inject(AppLogoState);
29233
+ #own = inject(APP_LOGO_SOURCE);
29234
+ lookup = computed(() => {
29235
+ const link = this.link()?.trim();
29236
+ if (link) return this.#state.logos()[link];
29237
+ return this.glyph() !== void 0 || this.appColor() !== void 0 || this.name() !== void 0 ? void 0 : this.#own();
29238
+ }, ...ngDevMode ? [{ debugName: "lookup" }] : /* istanbul ignore next */ []);
29239
+ color = computed(() => {
29240
+ const value = this.appColor() !== void 0 ? this.appColor() : this.lookup()?.color;
29241
+ return value ? normalizeAppColor(value) ?? null : null;
29242
+ }, ...ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []);
29243
+ label = computed(() => (this.name() !== void 0 ? this.name() : this.lookup()?.name) || this.link()?.trim() || "", ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
29244
+ shadow = computed(() => {
29245
+ const color = this.color();
29246
+ return color ? appLogoShadowColor(color) : null;
29247
+ }, ...ngDevMode ? [{ debugName: "shadow" }] : /* istanbul ignore next */ []);
29248
+ mask = computed(() => {
29249
+ if (this.glyph() !== void 0) {
29250
+ const glyph = this.glyph();
29251
+ return glyph ? logoGlyphMaskUrl(glyph) : void 0;
29252
+ }
29253
+ const found = this.lookup();
29254
+ if (found?.glyph) return logoGlyphMaskUrl(found.glyph);
29255
+ return found?.src ? `url("${encodeURI(found.src)}")` : void 0;
29256
+ }, ...ngDevMode ? [{ debugName: "mask" }] : /* istanbul ignore next */ []);
29257
+ letter = computed(() => this.label().trim().charAt(0).toUpperCase(), ...ngDevMode ? [{ debugName: "letter" }] : /* istanbul ignore next */ []);
29258
+ static ɵfac = i0.ɵɵngDeclareFactory({
29259
+ minVersion: "12.0.0",
29260
+ version: "22.2.1",
29261
+ ngImport: i0,
29262
+ type: AppLogoComponent,
29263
+ deps: [],
29264
+ target: i0.ɵɵFactoryTarget.Component
29265
+ });
29266
+ static ɵcmp = i0.ɵɵngDeclareComponent({
29267
+ minVersion: "17.0.0",
29268
+ version: "22.2.1",
29269
+ type: AppLogoComponent,
29270
+ isStandalone: true,
29271
+ selector: "m-app-logo",
29272
+ inputs: {
29273
+ glyph: {
29274
+ classPropertyName: "glyph",
29275
+ publicName: "glyph",
29276
+ isSignal: true,
29277
+ isRequired: false,
29278
+ transformFunction: null
29279
+ },
29280
+ appColor: {
29281
+ classPropertyName: "appColor",
29282
+ publicName: "appColor",
29283
+ isSignal: true,
29284
+ isRequired: false,
29285
+ transformFunction: null
29286
+ },
29287
+ name: {
29288
+ classPropertyName: "name",
29289
+ publicName: "name",
29290
+ isSignal: true,
29291
+ isRequired: false,
29292
+ transformFunction: null
29293
+ },
29294
+ link: {
29295
+ classPropertyName: "link",
29296
+ publicName: "link",
29297
+ isSignal: true,
29298
+ isRequired: false,
29299
+ transformFunction: null
29300
+ },
29301
+ variant: {
29302
+ classPropertyName: "variant",
29303
+ publicName: "variant",
29304
+ isSignal: true,
29305
+ isRequired: false,
29306
+ transformFunction: null
29307
+ },
29308
+ tone: {
29309
+ classPropertyName: "tone",
29310
+ publicName: "tone",
29311
+ isSignal: true,
29312
+ isRequired: false,
29313
+ transformFunction: null
29314
+ },
29315
+ size: {
29316
+ classPropertyName: "size",
29317
+ publicName: "size",
29318
+ isSignal: true,
29319
+ isRequired: false,
29320
+ transformFunction: null
29321
+ }
29322
+ },
29323
+ host: {
29324
+ attributes: { "role": "img" },
29325
+ properties: {
29326
+ "class.m-app-logo--glow": "variant() === 'glow'",
29327
+ "class.m-app-logo--light": "tone() === 'light'",
29328
+ "attr.aria-label": "label() || null",
29329
+ "style.width": "size() || null",
29330
+ "style.height": "size() || null",
29331
+ "style.--m-app-logo-color": "color()",
29332
+ "style.--m-app-logo-shadow": "shadow()"
29333
+ },
29334
+ classAttribute: "m-app-logo"
29335
+ },
29336
+ ngImport: i0,
29337
+ template: `
29338
+ <span class="m-app-logo__mark">
29339
+ @if (mask(); as url) {
29340
+ <span class="m-app-logo__glyph" [style.mask-image]="url"></span>
29341
+ } @else {
29342
+ <span class="m-app-logo__letter">{{ letter() }}</span>
29343
+ }
29344
+ </span>
29345
+ `,
29346
+ isInline: true,
29347
+ 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;width:100%;height:100%;aspect-ratio:1;container-type:size;border-radius:22%;overflow:hidden;background:var(--m-app-logo-color, var(--m-text-quaternary))}.m-app-logo__mark{display:flex;align-items:center;justify-content:center;width:100%;height:100%;filter:drop-shadow(0 4cqmin 3cqmin var(--m-app-logo-shadow, rgba(0, 0, 0, .25)))}.m-app-logo__glyph{width:60%;height:60%;background:#fff;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:center;mask-position:center;-webkit-mask-size:contain;mask-size:contain}.m-app-logo__letter{color:#fff;font-size:50cqmin;font-weight:700;line-height:1}:host(.m-app-logo--glow){border-radius:0;overflow:visible;background:none}:host(.m-app-logo--glow) .m-app-logo__mark{filter:drop-shadow(0 0 8cqmin color-mix(in srgb,var(--m-app-logo-color, var(--m-mm)) 55%,transparent)) drop-shadow(0 6cqmin 18cqmin color-mix(in srgb,var(--m-app-logo-color, var(--m-mm)) 35%,transparent))}:host(.m-app-logo--glow) .m-app-logo__glyph{width:100%;height:100%;background:var(--m-app-logo-color, var(--m-mm))}:host(.m-app-logo--glow) .m-app-logo__letter{color:var(--m-app-logo-color, var(--m-mm));font-size:80cqmin}:host(.m-app-logo--glow.m-app-logo--light) .m-app-logo__glyph{background:#fff}:host(.m-app-logo--glow.m-app-logo--light) .m-app-logo__letter{color:#fff}\n"],
29348
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
29349
+ });
29350
+ };
29351
+ i0.ɵɵngDeclareClassMetadata({
29352
+ minVersion: "12.0.0",
29353
+ version: "22.2.1",
29354
+ ngImport: i0,
29355
+ type: AppLogoComponent,
29356
+ decorators: [{
29357
+ type: Component,
29358
+ args: [{
29359
+ selector: "m-app-logo",
29360
+ template: `
29361
+ <span class="m-app-logo__mark">
29362
+ @if (mask(); as url) {
29363
+ <span class="m-app-logo__glyph" [style.mask-image]="url"></span>
29364
+ } @else {
29365
+ <span class="m-app-logo__letter">{{ letter() }}</span>
29366
+ }
29367
+ </span>
29368
+ `,
29369
+ changeDetection: ChangeDetectionStrategy.OnPush,
29370
+ host: {
29371
+ class: "m-app-logo",
29372
+ "[class.m-app-logo--glow]": "variant() === 'glow'",
29373
+ "[class.m-app-logo--light]": "tone() === 'light'",
29374
+ role: "img",
29375
+ "[attr.aria-label]": "label() || null",
29376
+ "[style.width]": "size() || null",
29377
+ "[style.height]": "size() || null",
29378
+ "[style.--m-app-logo-color]": "color()",
29379
+ "[style.--m-app-logo-shadow]": "shadow()"
29380
+ },
29381
+ 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;width:100%;height:100%;aspect-ratio:1;container-type:size;border-radius:22%;overflow:hidden;background:var(--m-app-logo-color, var(--m-text-quaternary))}.m-app-logo__mark{display:flex;align-items:center;justify-content:center;width:100%;height:100%;filter:drop-shadow(0 4cqmin 3cqmin var(--m-app-logo-shadow, rgba(0, 0, 0, .25)))}.m-app-logo__glyph{width:60%;height:60%;background:#fff;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:center;mask-position:center;-webkit-mask-size:contain;mask-size:contain}.m-app-logo__letter{color:#fff;font-size:50cqmin;font-weight:700;line-height:1}:host(.m-app-logo--glow){border-radius:0;overflow:visible;background:none}:host(.m-app-logo--glow) .m-app-logo__mark{filter:drop-shadow(0 0 8cqmin color-mix(in srgb,var(--m-app-logo-color, var(--m-mm)) 55%,transparent)) drop-shadow(0 6cqmin 18cqmin color-mix(in srgb,var(--m-app-logo-color, var(--m-mm)) 35%,transparent))}:host(.m-app-logo--glow) .m-app-logo__glyph{width:100%;height:100%;background:var(--m-app-logo-color, var(--m-mm))}:host(.m-app-logo--glow) .m-app-logo__letter{color:var(--m-app-logo-color, var(--m-mm));font-size:80cqmin}:host(.m-app-logo--glow.m-app-logo--light) .m-app-logo__glyph{background:#fff}:host(.m-app-logo--glow.m-app-logo--light) .m-app-logo__letter{color:#fff}\n"]
29382
+ }]
29383
+ }],
29384
+ propDecorators: {
29385
+ glyph: [{
29386
+ type: i0.Input,
29387
+ args: [{
29388
+ isSignal: true,
29389
+ alias: "glyph",
29390
+ required: false
29391
+ }]
29392
+ }],
29393
+ appColor: [{
29394
+ type: i0.Input,
29395
+ args: [{
29396
+ isSignal: true,
29397
+ alias: "appColor",
29398
+ required: false
29399
+ }]
29400
+ }],
29401
+ name: [{
29402
+ type: i0.Input,
29403
+ args: [{
29404
+ isSignal: true,
29405
+ alias: "name",
29406
+ required: false
29407
+ }]
29408
+ }],
29409
+ link: [{
29410
+ type: i0.Input,
29411
+ args: [{
29412
+ isSignal: true,
29413
+ alias: "link",
29414
+ required: false
29415
+ }]
29416
+ }],
29417
+ variant: [{
29418
+ type: i0.Input,
29419
+ args: [{
29420
+ isSignal: true,
29421
+ alias: "variant",
29422
+ required: false
29423
+ }]
29424
+ }],
29425
+ tone: [{
29426
+ type: i0.Input,
29427
+ args: [{
29428
+ isSignal: true,
29429
+ alias: "tone",
29430
+ required: false
29431
+ }]
29432
+ }],
29433
+ size: [{
29434
+ type: i0.Input,
29435
+ args: [{
29436
+ isSignal: true,
29437
+ alias: "size",
29438
+ required: false
29439
+ }]
29440
+ }]
29441
+ }
29442
+ });
29169
29443
  const REMOTE_PAGE_RELOAD = new InjectionToken("REMOTE_PAGE_RELOAD", {
29170
29444
  providedIn: "root",
29171
29445
  factory: () => () => window.location.reload()
29172
29446
  });
29173
29447
  const tierReloadKey = (link) => `m-remote-tier-reload:${window.location.pathname}|${link ?? ""}|${link && wcTierOf(link) || "status"}`;
29174
29448
  const isBootRedirect = (pending, sent, path) => pending && (sent === void 0 || !samePath(path, sent));
29449
+ const REMOTE_BOOT_TIMEOUT_MS = 1e4;
29175
29450
  var RemoteComponent = class RemoteComponent {
29176
29451
  config = input(...ngDevMode ? [void 0, { debugName: "config" }] : /* istanbul ignore next */ []);
29177
29452
  link = input(...ngDevMode ? [void 0, { debugName: "link" }] : /* istanbul ignore next */ []);
@@ -29192,6 +29467,8 @@ var RemoteComponent = class RemoteComponent {
29192
29467
  return typeof mount === "string" ? parseMountPattern(mount) : mount;
29193
29468
  }, ...ngDevMode ? [{ debugName: "pattern" }] : /* istanbul ignore next */ []);
29194
29469
  beta = input(false, ...ngDevMode ? [{ debugName: "beta" }] : /* istanbul ignore next */ []);
29470
+ glyph = input(...ngDevMode ? [void 0, { debugName: "glyph" }] : /* istanbul ignore next */ []);
29471
+ appColor = input(...ngDevMode ? [void 0, { debugName: "appColor" }] : /* istanbul ignore next */ []);
29195
29472
  loaded = output();
29196
29473
  failed = output();
29197
29474
  loader = inject(RemoteLoaderService);
@@ -29203,6 +29480,7 @@ var RemoteComponent = class RemoteComponent {
29203
29480
  navRef = inject(NAV_STORE_REF, { optional: true });
29204
29481
  reloadPage = inject(REMOTE_PAGE_RELOAD);
29205
29482
  assetStore = inject(AssetStore);
29483
+ appLogoState = inject(AppLogoState);
29206
29484
  loadedElement;
29207
29485
  loadId = 0;
29208
29486
  mountedLink;
@@ -29216,6 +29494,13 @@ var RemoteComponent = class RemoteComponent {
29216
29494
  pinnedLink;
29217
29495
  state = signal("idle", ...ngDevMode ? [{ debugName: "state" }] : /* istanbul ignore next */ []);
29218
29496
  failure = signal({}, ...ngDevMode ? [{ debugName: "failure" }] : /* istanbul ignore next */ []);
29497
+ booting = signal(false, ...ngDevMode ? [{ debugName: "booting" }] : /* istanbul ignore next */ []);
29498
+ bootTimer;
29499
+ endBoot = () => {
29500
+ clearTimeout(this.bootTimer);
29501
+ this.bootTimer = void 0;
29502
+ this.booting.set(false);
29503
+ };
29219
29504
  hostQuery = this.router ? toSignal(this.router.events.pipe(filter((e) => e instanceof NavigationEnd), map(() => this.currentQuery())), { initialValue: this.currentQuery() }) : signal("");
29220
29505
  hostSegments = this.router ? toSignal(this.router.events.pipe(filter((e) => e instanceof NavigationEnd), map(() => this.primarySegments())), { initialValue: this.primarySegments() }) : signal([]);
29221
29506
  mountMatch = linkedSignal({
@@ -29237,7 +29522,29 @@ var RemoteComponent = class RemoteComponent {
29237
29522
  return navUrl === void 0 ? void 0 : `${navUrl}${this.hostQuery()}`;
29238
29523
  }, ...ngDevMode ? [{ debugName: "remotePath" }] : /* istanbul ignore next */ []);
29239
29524
  ownTail = computed(() => this.mountMatch()?.navUrl ?? this.tail(), ...ngDevMode ? [{ debugName: "ownTail" }] : /* istanbul ignore next */ []);
29525
+ mountColor = computed(() => {
29526
+ const chosen = normalizeAppColor(this.appColor() ?? "");
29527
+ if (chosen) return chosen;
29528
+ const link = this.appLink();
29529
+ const color = link ? this.appLogoState.logos()[link]?.color : void 0;
29530
+ return color ? normalizeAppColor(color) : void 0;
29531
+ }, ...ngDevMode ? [{ debugName: "mountColor" }] : /* istanbul ignore next */ []);
29532
+ chosenGlyph = computed(() => {
29533
+ const glyph = this.glyph()?.trim();
29534
+ return glyph ? rebuildLogoGlyph(glyph).svg || void 0 : void 0;
29535
+ }, ...ngDevMode ? [{ debugName: "chosenGlyph" }] : /* istanbul ignore next */ []);
29536
+ splash = computed(() => {
29537
+ const link = this.appLink() ?? "";
29538
+ const own = link ? this.appLogoState.logos()[link] : void 0;
29539
+ const logo = own && own.glyph !== void 0 ? own : this.appLogoState.source();
29540
+ return {
29541
+ glyph: this.chosenGlyph() ?? logo?.glyph ?? null,
29542
+ color: this.mountColor() ?? null,
29543
+ name: own?.name?.trim() || link
29544
+ };
29545
+ }, ...ngDevMode ? [{ debugName: "splash" }] : /* istanbul ignore next */ []);
29240
29546
  constructor() {
29547
+ effect(() => paintAppColor(this.elementRef.nativeElement, this.mountColor()));
29241
29548
  effect(() => {
29242
29549
  this.loginStore?.isLoggedIn();
29243
29550
  const config = this.config();
@@ -29303,6 +29610,7 @@ var RemoteComponent = class RemoteComponent {
29303
29610
  });
29304
29611
  }
29305
29612
  ngOnDestroy() {
29613
+ clearTimeout(this.bootTimer);
29306
29614
  if (this.pinnedLink) setWcTier(this.pinnedLink, void 0);
29307
29615
  this.dismountElement();
29308
29616
  this.url()?.clear(this.queryKeys);
@@ -29349,6 +29657,7 @@ var RemoteComponent = class RemoteComponent {
29349
29657
  };
29350
29658
  onReport = (event) => {
29351
29659
  const detail = event.detail;
29660
+ this.endBoot();
29352
29661
  const raw = detail?.path;
29353
29662
  if (raw === void 0) return;
29354
29663
  const path = raw.replace(/^\//, "");
@@ -29423,6 +29732,8 @@ var RemoteComponent = class RemoteComponent {
29423
29732
  } catch {}
29424
29733
  result.element.addEventListener(WC_ROUTE_CHANGED_EVENT, this.onReport);
29425
29734
  host.appendChild(result.element);
29735
+ this.booting.set(true);
29736
+ this.bootTimer = setTimeout(this.endBoot, REMOTE_BOOT_TIMEOUT_MS);
29426
29737
  this.state.set("loaded");
29427
29738
  const loadedConfig = result.config ?? config;
29428
29739
  if (loadedConfig) this.loaded.emit(loadedConfig);
@@ -29440,6 +29751,7 @@ var RemoteComponent = class RemoteComponent {
29440
29751
  };
29441
29752
  dismountElement = () => {
29442
29753
  const host = this.elementRef.nativeElement;
29754
+ this.endBoot();
29443
29755
  this.loadedElement?.removeEventListener(WC_ROUTE_CHANGED_EVENT, this.onReport);
29444
29756
  if (this.loadedElement?.parentNode === host) host.removeChild(this.loadedElement);
29445
29757
  this.loadedElement = void 0;
@@ -29563,33 +29875,79 @@ var RemoteComponent = class RemoteComponent {
29563
29875
  isSignal: true,
29564
29876
  isRequired: false,
29565
29877
  transformFunction: null
29878
+ },
29879
+ glyph: {
29880
+ classPropertyName: "glyph",
29881
+ publicName: "glyph",
29882
+ isSignal: true,
29883
+ isRequired: false,
29884
+ transformFunction: null
29885
+ },
29886
+ appColor: {
29887
+ classPropertyName: "appColor",
29888
+ publicName: "appColor",
29889
+ isSignal: true,
29890
+ isRequired: false,
29891
+ transformFunction: null
29566
29892
  }
29567
29893
  },
29568
29894
  outputs: {
29569
29895
  loaded: "loaded",
29570
29896
  failed: "failed"
29571
29897
  },
29572
- host: { classAttribute: "m-remote" },
29898
+ host: {
29899
+ properties: { "class.m-remote--booting": "booting()" },
29900
+ classAttribute: "m-remote"
29901
+ },
29573
29902
  ngImport: i0,
29574
29903
  template: `
29575
- @if (state() === 'loading') {
29576
- <div class="m-remote__loading"><div class="m-remote__spinner"></div></div>
29904
+ @if (state() === 'loading' || booting()) {
29905
+ <div class="m-remote__splash">
29906
+ <span class="m-remote__splash-mark">
29907
+ <m-app-logo
29908
+ variant="glow"
29909
+ tone="light"
29910
+ [glyph]="splash().glyph"
29911
+ [appColor]="splash().color"
29912
+ [name]="splash().name"
29913
+ />
29914
+ </span>
29915
+ </div>
29577
29916
  } @else if (state() === 'self-beta') {
29578
29917
  <div class="m-remote__self-beta">
29579
- <span class="m-remote__reason">{{ 'remote-self-beta' | translate }}</span>
29580
- <m-button label="open-beta" icon="chevrons-right" variant="primary" (clicked)="openBeta()" />
29918
+ <span class="m-remote__reason">{{
29919
+ 'remote-self-beta' | translate
29920
+ }}</span>
29921
+ <m-button
29922
+ label="open-beta"
29923
+ icon="chevrons-right"
29924
+ variant="primary"
29925
+ (clicked)="openBeta()"
29926
+ />
29581
29927
  </div>
29582
29928
  } @else if (state() === 'failed') {
29583
29929
  <div class="m-remote__broken">
29584
29930
  <m-icon name="link-broken" color="currentColor" />
29585
29931
  <span class="m-remote__reason">
29586
29932
  @switch (failure().reason) {
29587
- @case ('invalid-link') { {{ 'remote-invalid-link' | translate }} }
29588
- @case ('config-not-found') { {{ 'remote-config-not-found' | translate }} }
29589
- @case ('script-failed') { {{ 'remote-script-failed' | translate }} }
29590
- @case ('element-timeout') { {{ 'remote-element-timeout' | translate }} }
29591
- @case ('offline') { {{ 'remote-offline' | translate }} }
29592
- @case ('tier-conflict') { {{ 'remote-tier-conflict' | translate }} }
29933
+ @case ('invalid-link') {
29934
+ {{ 'remote-invalid-link' | translate }}
29935
+ }
29936
+ @case ('config-not-found') {
29937
+ {{ 'remote-config-not-found' | translate }}
29938
+ }
29939
+ @case ('script-failed') {
29940
+ {{ 'remote-script-failed' | translate }}
29941
+ }
29942
+ @case ('element-timeout') {
29943
+ {{ 'remote-element-timeout' | translate }}
29944
+ }
29945
+ @case ('offline') {
29946
+ {{ 'remote-offline' | translate }}
29947
+ }
29948
+ @case ('tier-conflict') {
29949
+ {{ 'remote-tier-conflict' | translate }}
29950
+ }
29593
29951
  }
29594
29952
  </span>
29595
29953
  <span class="m-remote__detail">{{ appLink() }}</span>
@@ -29600,7 +29958,7 @@ var RemoteComponent = class RemoteComponent {
29600
29958
  }
29601
29959
  `,
29602
29960
  isInline: true,
29603
- styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}.m-remote{display:block;width:100%;min-height:100%;flex:1;isolation:isolate}.m-remote__loading,.m-remote__broken,.m-remote__self-beta{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:24px}.m-remote__spinner{width:20px;height:20px;border:2px solid var(--m-backdrop-border);border-top-color:var(--m-mm);border-radius:50%;animation:m-remote-spin .8s linear infinite}.m-remote__broken,.m-remote__self-beta{color:var(--m-text-secondary)}.m-remote__detail{font-size:.85em}@keyframes m-remote-spin{to{transform:rotate(360deg)}}\n"],
29961
+ styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}.m-remote{display:block;width:100%;min-height:100%;flex:1;isolation:isolate}.m-remote__broken,.m-remote__self-beta{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:24px}.m-remote__broken,.m-remote__self-beta{color:var(--m-text-secondary)}.m-remote--booting{position:relative;min-height:100vh}.m-remote--booting>.m-remote__splash{position:absolute;inset:0;z-index:1}.m-remote--booting>:not(.m-remote__splash){visibility:hidden}.m-remote__splash{display:flex;align-items:center;justify-content:center;width:100%;height:100%;min-height:100vh;background:var(--m-background)}.m-remote__splash-mark{display:flex;width:96px;height:96px;animation:m-remote-breathe 1.6s ease-in-out infinite}@media(prefers-reduced-motion:reduce){.m-remote__splash-mark{animation:none}}.m-remote__detail{font-size:.85em}@keyframes m-remote-breathe{0%,to{opacity:1;transform:scale(1)}50%{opacity:.55;transform:scale(.93)}}\n"],
29604
29962
  dependencies: [
29605
29963
  {
29606
29964
  kind: "component",
@@ -29652,6 +30010,20 @@ var RemoteComponent = class RemoteComponent {
29652
30010
  ],
29653
30011
  outputs: ["configChange", "clicked"]
29654
30012
  },
30013
+ {
30014
+ kind: "component",
30015
+ type: AppLogoComponent,
30016
+ selector: "m-app-logo",
30017
+ inputs: [
30018
+ "glyph",
30019
+ "appColor",
30020
+ "name",
30021
+ "link",
30022
+ "variant",
30023
+ "tone",
30024
+ "size"
30025
+ ]
30026
+ },
29655
30027
  {
29656
30028
  kind: "pipe",
29657
30029
  type: TranslatePipe,
@@ -29674,28 +30046,61 @@ i0.ɵɵngDeclareClassMetadata({
29674
30046
  imports: [
29675
30047
  TranslatePipe,
29676
30048
  IconComponent,
29677
- ButtonComponent
30049
+ ButtonComponent,
30050
+ AppLogoComponent
29678
30051
  ],
29679
- host: { class: "m-remote" },
30052
+ host: {
30053
+ class: "m-remote",
30054
+ "[class.m-remote--booting]": "booting()"
30055
+ },
29680
30056
  template: `
29681
- @if (state() === 'loading') {
29682
- <div class="m-remote__loading"><div class="m-remote__spinner"></div></div>
30057
+ @if (state() === 'loading' || booting()) {
30058
+ <div class="m-remote__splash">
30059
+ <span class="m-remote__splash-mark">
30060
+ <m-app-logo
30061
+ variant="glow"
30062
+ tone="light"
30063
+ [glyph]="splash().glyph"
30064
+ [appColor]="splash().color"
30065
+ [name]="splash().name"
30066
+ />
30067
+ </span>
30068
+ </div>
29683
30069
  } @else if (state() === 'self-beta') {
29684
30070
  <div class="m-remote__self-beta">
29685
- <span class="m-remote__reason">{{ 'remote-self-beta' | translate }}</span>
29686
- <m-button label="open-beta" icon="chevrons-right" variant="primary" (clicked)="openBeta()" />
30071
+ <span class="m-remote__reason">{{
30072
+ 'remote-self-beta' | translate
30073
+ }}</span>
30074
+ <m-button
30075
+ label="open-beta"
30076
+ icon="chevrons-right"
30077
+ variant="primary"
30078
+ (clicked)="openBeta()"
30079
+ />
29687
30080
  </div>
29688
30081
  } @else if (state() === 'failed') {
29689
30082
  <div class="m-remote__broken">
29690
30083
  <m-icon name="link-broken" color="currentColor" />
29691
30084
  <span class="m-remote__reason">
29692
30085
  @switch (failure().reason) {
29693
- @case ('invalid-link') { {{ 'remote-invalid-link' | translate }} }
29694
- @case ('config-not-found') { {{ 'remote-config-not-found' | translate }} }
29695
- @case ('script-failed') { {{ 'remote-script-failed' | translate }} }
29696
- @case ('element-timeout') { {{ 'remote-element-timeout' | translate }} }
29697
- @case ('offline') { {{ 'remote-offline' | translate }} }
29698
- @case ('tier-conflict') { {{ 'remote-tier-conflict' | translate }} }
30086
+ @case ('invalid-link') {
30087
+ {{ 'remote-invalid-link' | translate }}
30088
+ }
30089
+ @case ('config-not-found') {
30090
+ {{ 'remote-config-not-found' | translate }}
30091
+ }
30092
+ @case ('script-failed') {
30093
+ {{ 'remote-script-failed' | translate }}
30094
+ }
30095
+ @case ('element-timeout') {
30096
+ {{ 'remote-element-timeout' | translate }}
30097
+ }
30098
+ @case ('offline') {
30099
+ {{ 'remote-offline' | translate }}
30100
+ }
30101
+ @case ('tier-conflict') {
30102
+ {{ 'remote-tier-conflict' | translate }}
30103
+ }
29699
30104
  }
29700
30105
  </span>
29701
30106
  <span class="m-remote__detail">{{ appLink() }}</span>
@@ -29707,7 +30112,7 @@ i0.ɵɵngDeclareClassMetadata({
29707
30112
  `,
29708
30113
  changeDetection: ChangeDetectionStrategy.OnPush,
29709
30114
  encapsulation: ViewEncapsulation.None,
29710
- styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}.m-remote{display:block;width:100%;min-height:100%;flex:1;isolation:isolate}.m-remote__loading,.m-remote__broken,.m-remote__self-beta{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:24px}.m-remote__spinner{width:20px;height:20px;border:2px solid var(--m-backdrop-border);border-top-color:var(--m-mm);border-radius:50%;animation:m-remote-spin .8s linear infinite}.m-remote__broken,.m-remote__self-beta{color:var(--m-text-secondary)}.m-remote__detail{font-size:.85em}@keyframes m-remote-spin{to{transform:rotate(360deg)}}\n"]
30115
+ styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}.m-remote{display:block;width:100%;min-height:100%;flex:1;isolation:isolate}.m-remote__broken,.m-remote__self-beta{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:24px}.m-remote__broken,.m-remote__self-beta{color:var(--m-text-secondary)}.m-remote--booting{position:relative;min-height:100vh}.m-remote--booting>.m-remote__splash{position:absolute;inset:0;z-index:1}.m-remote--booting>:not(.m-remote__splash){visibility:hidden}.m-remote__splash{display:flex;align-items:center;justify-content:center;width:100%;height:100%;min-height:100vh;background:var(--m-background)}.m-remote__splash-mark{display:flex;width:96px;height:96px;animation:m-remote-breathe 1.6s ease-in-out infinite}@media(prefers-reduced-motion:reduce){.m-remote__splash-mark{animation:none}}.m-remote__detail{font-size:.85em}@keyframes m-remote-breathe{0%,to{opacity:1;transform:scale(1)}50%{opacity:.55;transform:scale(.93)}}\n"]
29711
30116
  }]
29712
30117
  }],
29713
30118
  ctorParameters: () => [],
@@ -29832,6 +30237,22 @@ i0.ɵɵngDeclareClassMetadata({
29832
30237
  required: false
29833
30238
  }]
29834
30239
  }],
30240
+ glyph: [{
30241
+ type: i0.Input,
30242
+ args: [{
30243
+ isSignal: true,
30244
+ alias: "glyph",
30245
+ required: false
30246
+ }]
30247
+ }],
30248
+ appColor: [{
30249
+ type: i0.Input,
30250
+ args: [{
30251
+ isSignal: true,
30252
+ alias: "appColor",
30253
+ required: false
30254
+ }]
30255
+ }],
29835
30256
  loaded: [{
29836
30257
  type: i0.Output,
29837
30258
  args: ["loaded"]
@@ -37915,140 +38336,6 @@ i0.ɵɵngDeclareClassMetadata({
37915
38336
  args: ["inner", { isSignal: true }]
37916
38337
  }] }
37917
38338
  });
37918
- var AppLogoComponent = class AppLogoComponent {
37919
- glyph = input(...ngDevMode ? [void 0, { debugName: "glyph" }] : /* istanbul ignore next */ []);
37920
- appColor = input(...ngDevMode ? [void 0, { debugName: "appColor" }] : /* istanbul ignore next */ []);
37921
- name = input(...ngDevMode ? [void 0, { debugName: "name" }] : /* istanbul ignore next */ []);
37922
- color = computed(() => {
37923
- const value = this.appColor();
37924
- return value ? normalizeAppColor(value) ?? null : null;
37925
- }, ...ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []);
37926
- shadow = computed(() => {
37927
- const color = this.color();
37928
- return color ? appLogoShadowColor(color) : null;
37929
- }, ...ngDevMode ? [{ debugName: "shadow" }] : /* istanbul ignore next */ []);
37930
- mask = computed(() => {
37931
- const glyph = this.glyph();
37932
- return glyph ? logoGlyphMaskUrl(glyph) : void 0;
37933
- }, ...ngDevMode ? [{ debugName: "mask" }] : /* istanbul ignore next */ []);
37934
- letter = computed(() => (this.name()?.trim().charAt(0) ?? "").toUpperCase(), ...ngDevMode ? [{ debugName: "letter" }] : /* istanbul ignore next */ []);
37935
- static ɵfac = i0.ɵɵngDeclareFactory({
37936
- minVersion: "12.0.0",
37937
- version: "22.2.1",
37938
- ngImport: i0,
37939
- type: AppLogoComponent,
37940
- deps: [],
37941
- target: i0.ɵɵFactoryTarget.Component
37942
- });
37943
- static ɵcmp = i0.ɵɵngDeclareComponent({
37944
- minVersion: "17.0.0",
37945
- version: "22.2.1",
37946
- type: AppLogoComponent,
37947
- isStandalone: true,
37948
- selector: "m-app-logo",
37949
- inputs: {
37950
- glyph: {
37951
- classPropertyName: "glyph",
37952
- publicName: "glyph",
37953
- isSignal: true,
37954
- isRequired: false,
37955
- transformFunction: null
37956
- },
37957
- appColor: {
37958
- classPropertyName: "appColor",
37959
- publicName: "appColor",
37960
- isSignal: true,
37961
- isRequired: false,
37962
- transformFunction: null
37963
- },
37964
- name: {
37965
- classPropertyName: "name",
37966
- publicName: "name",
37967
- isSignal: true,
37968
- isRequired: false,
37969
- transformFunction: null
37970
- }
37971
- },
37972
- host: {
37973
- attributes: { "role": "img" },
37974
- properties: {
37975
- "attr.aria-label": "name() || null",
37976
- "style.--m-app-logo-color": "color()",
37977
- "style.--m-app-logo-shadow": "shadow()"
37978
- },
37979
- classAttribute: "m-app-logo"
37980
- },
37981
- ngImport: i0,
37982
- template: `
37983
- <span class="m-app-logo__mark">
37984
- @if (mask(); as url) {
37985
- <span class="m-app-logo__glyph" [style.mask-image]="url"></span>
37986
- } @else {
37987
- <span class="m-app-logo__letter">{{ letter() }}</span>
37988
- }
37989
- </span>
37990
- `,
37991
- isInline: true,
37992
- 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;width:100%;height:100%;aspect-ratio:1;container-type:size;border-radius:22%;overflow:hidden;background:var(--m-app-logo-color, var(--m-text-quaternary))}.m-app-logo__mark{display:flex;align-items:center;justify-content:center;width:100%;height:100%;filter:drop-shadow(0 4cqmin 3cqmin var(--m-app-logo-shadow, rgba(0, 0, 0, .25)))}.m-app-logo__glyph{width:60%;height:60%;background:#fff;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:center;mask-position:center;-webkit-mask-size:contain;mask-size:contain}.m-app-logo__letter{color:#fff;font-size:50cqmin;font-weight:700;line-height:1}\n"],
37993
- changeDetection: i0.ChangeDetectionStrategy.OnPush
37994
- });
37995
- };
37996
- i0.ɵɵngDeclareClassMetadata({
37997
- minVersion: "12.0.0",
37998
- version: "22.2.1",
37999
- ngImport: i0,
38000
- type: AppLogoComponent,
38001
- decorators: [{
38002
- type: Component,
38003
- args: [{
38004
- selector: "m-app-logo",
38005
- template: `
38006
- <span class="m-app-logo__mark">
38007
- @if (mask(); as url) {
38008
- <span class="m-app-logo__glyph" [style.mask-image]="url"></span>
38009
- } @else {
38010
- <span class="m-app-logo__letter">{{ letter() }}</span>
38011
- }
38012
- </span>
38013
- `,
38014
- changeDetection: ChangeDetectionStrategy.OnPush,
38015
- host: {
38016
- class: "m-app-logo",
38017
- role: "img",
38018
- "[attr.aria-label]": "name() || null",
38019
- "[style.--m-app-logo-color]": "color()",
38020
- "[style.--m-app-logo-shadow]": "shadow()"
38021
- },
38022
- 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;width:100%;height:100%;aspect-ratio:1;container-type:size;border-radius:22%;overflow:hidden;background:var(--m-app-logo-color, var(--m-text-quaternary))}.m-app-logo__mark{display:flex;align-items:center;justify-content:center;width:100%;height:100%;filter:drop-shadow(0 4cqmin 3cqmin var(--m-app-logo-shadow, rgba(0, 0, 0, .25)))}.m-app-logo__glyph{width:60%;height:60%;background:#fff;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:center;mask-position:center;-webkit-mask-size:contain;mask-size:contain}.m-app-logo__letter{color:#fff;font-size:50cqmin;font-weight:700;line-height:1}\n"]
38023
- }]
38024
- }],
38025
- propDecorators: {
38026
- glyph: [{
38027
- type: i0.Input,
38028
- args: [{
38029
- isSignal: true,
38030
- alias: "glyph",
38031
- required: false
38032
- }]
38033
- }],
38034
- appColor: [{
38035
- type: i0.Input,
38036
- args: [{
38037
- isSignal: true,
38038
- alias: "appColor",
38039
- required: false
38040
- }]
38041
- }],
38042
- name: [{
38043
- type: i0.Input,
38044
- args: [{
38045
- isSignal: true,
38046
- alias: "name",
38047
- required: false
38048
- }]
38049
- }]
38050
- }
38051
- });
38052
38339
  var AppCardComponent = class AppCardComponent {
38053
38340
  app = input.required(...ngDevMode ? [{ debugName: "app" }] : /* istanbul ignore next */ []);
38054
38341
  variant = input("card", ...ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []);
@@ -38168,7 +38455,11 @@ var AppCardComponent = class AppCardComponent {
38168
38455
  inputs: [
38169
38456
  "glyph",
38170
38457
  "appColor",
38171
- "name"
38458
+ "name",
38459
+ "link",
38460
+ "variant",
38461
+ "tone",
38462
+ "size"
38172
38463
  ]
38173
38464
  },
38174
38465
  {
@@ -38462,7 +38753,11 @@ var LogoGlyphInputComponent = class LogoGlyphInputComponent {
38462
38753
  inputs: [
38463
38754
  "glyph",
38464
38755
  "appColor",
38465
- "name"
38756
+ "name",
38757
+ "link",
38758
+ "variant",
38759
+ "tone",
38760
+ "size"
38466
38761
  ]
38467
38762
  },
38468
38763
  {
@@ -41109,8 +41404,8 @@ var NavHeaderComponent = class NavHeaderComponent {
41109
41404
  classAttribute: "m-nav-header"
41110
41405
  },
41111
41406
  ngImport: i0,
41112
- template: "<m-section>\n @if (_isSearch() && _searchOpen()) {\n <!-- Searching: the field takes the row the trail was on, so the nav is\n hidden while there is something to type into. -->\n <m-section-search\n class=\"nav-header__search\"\n [(isOpen)]=\"_searchOpen\"\n [value]=\"_searchStore.query()\"\n [searchLabel]=\"_searchLabel()\"\n (searchChange)=\"_searchStore.updateQuery($event)\"\n />\n } @else if (_trail() || _isSearch()) {\n <!-- The nav's row, and the bar's toggle stands in it rather than in a row\n stacked on top of it. Both slots are written a single `@if` deep: a\n Section matches its projected slots by tag, and a node nested deeper\n falls through to the body instead. -->\n <m-section-back [back]=\"_hasParent()\" (navigate)=\"_navStore.back()\">\n @if (_trail(); as trail) {\n <m-nav-trail [config]=\"trail\" />\n }\n @if (_isSearch()) {\n <m-button\n class=\"nav-header__search-toggle\"\n [config]=\"_searchToggle\"\n (clicked)=\"_openSearch()\"\n />\n }\n </m-section-back>\n }\n\n @if (_user(); as user) {\n <m-user class=\"nav-header__user\" [id]=\"user.id\" [user]=\"user\" mRef=\"root_user\">\n <span class=\"nav-header__username\">&#64;{{ user.username }}</span>\n </m-user>\n } @else if (_header(); as h) {\n @if (h.label) {\n <m-section-header class=\"nav-header__title\" [icon]=\"h.icon\" [label]=\"h.label\" />\n }\n }\n</m-section>\n",
41113
- 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)}}.nav-header__user{display:block;padding:1rem}.nav-header__username{font-size:.6875rem;font-weight:600;color:var(--m-text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}m-section-search.nav-header__search{--_nav-row-height: var(--section-header-min-height, calc(var(--section-header-py, .5rem) * 2 + 1.25rem));min-height:var(--_nav-row-height);padding-block:0;--m-input-clear-height: calc(var(--_nav-row-height) - .5rem);--m-input-clear-min-height: calc(var(--_nav-row-height) - .5rem)}\n"],
41407
+ template: "<m-section>\n @if (_isSearch() && _searchOpen()) {\n <!-- Searching: the field takes the row the trail was on, so the nav is\n hidden while there is something to type into. -->\n <m-section-search\n class=\"nav-header__search\"\n [(isOpen)]=\"_searchOpen\"\n [value]=\"_searchStore.query()\"\n [searchLabel]=\"_searchLabel()\"\n (searchChange)=\"_searchStore.updateQuery($event)\"\n />\n } @else if (_trail() || _isSearch()) {\n <!-- The nav's row, and the bar's toggle stands in it rather than in a row\n stacked on top of it. Both slots are written a single `@if` deep: a\n Section matches its projected slots by tag, and a node nested deeper\n falls through to the body instead. -->\n <m-section-back [back]=\"_hasParent()\" (navigate)=\"_navStore.back()\">\n @if (_trail(); as trail) {\n <m-nav-trail [config]=\"trail\" />\n }\n @if (_isSearch()) {\n <m-button\n class=\"nav-header__search-toggle\"\n [config]=\"_searchToggle\"\n (clicked)=\"_openSearch()\"\n />\n }\n </m-section-back>\n }\n\n @if (_user(); as user) {\n <m-user class=\"nav-header__user\" [id]=\"user.id\" [user]=\"user\" mRef=\"root_user\">\n <span class=\"nav-header__username\">&#64;{{ user.username }}</span>\n </m-user>\n } @else if (_header(); as h) {\n @if (h.label) {\n @if (h.appLogo; as logo) {\n <!-- A mounted app's header draws its AppLogo in the icon's place. -->\n <m-section-header class=\"nav-header__title\" [label]=\"h.label\">\n <m-app-logo class=\"nav-header__app-logo\" [glyph]=\"logo.glyph\" [appColor]=\"logo.color\" [name]=\"logo.name\" />\n </m-section-header>\n } @else {\n <m-section-header class=\"nav-header__title\" [icon]=\"h.icon\" [label]=\"h.label\" />\n }\n }\n }\n</m-section>\n",
41408
+ 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)}}.nav-header__user{display:block;padding:1rem}.nav-header__username{font-size:.6875rem;font-weight:600;color:var(--m-text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}m-section-search.nav-header__search{--_nav-row-height: var(--section-header-min-height, calc(var(--section-header-py, .5rem) * 2 + 1.25rem));min-height:var(--_nav-row-height);padding-block:0;--m-input-clear-height: calc(var(--_nav-row-height) - .5rem);--m-input-clear-min-height: calc(var(--_nav-row-height) - .5rem)}.nav-header__title .nav-header__app-logo{flex-shrink:0;align-self:flex-start;width:var(--m-section-header-icon-box, 1.5125rem);height:var(--m-section-header-icon-box, 1.5125rem)}\n"],
41114
41409
  dependencies: [
41115
41410
  {
41116
41411
  kind: "component",
@@ -41267,6 +41562,20 @@ var NavHeaderComponent = class NavHeaderComponent {
41267
41562
  "mRefToggle",
41268
41563
  "mRefParams"
41269
41564
  ]
41565
+ },
41566
+ {
41567
+ kind: "component",
41568
+ type: AppLogoComponent,
41569
+ selector: "m-app-logo",
41570
+ inputs: [
41571
+ "glyph",
41572
+ "appColor",
41573
+ "name",
41574
+ "link",
41575
+ "variant",
41576
+ "tone",
41577
+ "size"
41578
+ ]
41270
41579
  }
41271
41580
  ],
41272
41581
  changeDetection: i0.ChangeDetectionStrategy.OnPush,
@@ -41290,7 +41599,8 @@ i0.ɵɵngDeclareClassMetadata({
41290
41599
  SectionSearchComponent,
41291
41600
  ButtonComponent,
41292
41601
  UserComponent,
41293
- MRefDirective
41602
+ MRefDirective,
41603
+ AppLogoComponent
41294
41604
  ],
41295
41605
  encapsulation: ViewEncapsulation.None,
41296
41606
  changeDetection: ChangeDetectionStrategy.OnPush,
@@ -41299,8 +41609,8 @@ i0.ɵɵngDeclareClassMetadata({
41299
41609
  "[style.display]": "\"block\"",
41300
41610
  "[style.--m-section-min-height]": "\"0\""
41301
41611
  },
41302
- template: "<m-section>\n @if (_isSearch() && _searchOpen()) {\n <!-- Searching: the field takes the row the trail was on, so the nav is\n hidden while there is something to type into. -->\n <m-section-search\n class=\"nav-header__search\"\n [(isOpen)]=\"_searchOpen\"\n [value]=\"_searchStore.query()\"\n [searchLabel]=\"_searchLabel()\"\n (searchChange)=\"_searchStore.updateQuery($event)\"\n />\n } @else if (_trail() || _isSearch()) {\n <!-- The nav's row, and the bar's toggle stands in it rather than in a row\n stacked on top of it. Both slots are written a single `@if` deep: a\n Section matches its projected slots by tag, and a node nested deeper\n falls through to the body instead. -->\n <m-section-back [back]=\"_hasParent()\" (navigate)=\"_navStore.back()\">\n @if (_trail(); as trail) {\n <m-nav-trail [config]=\"trail\" />\n }\n @if (_isSearch()) {\n <m-button\n class=\"nav-header__search-toggle\"\n [config]=\"_searchToggle\"\n (clicked)=\"_openSearch()\"\n />\n }\n </m-section-back>\n }\n\n @if (_user(); as user) {\n <m-user class=\"nav-header__user\" [id]=\"user.id\" [user]=\"user\" mRef=\"root_user\">\n <span class=\"nav-header__username\">&#64;{{ user.username }}</span>\n </m-user>\n } @else if (_header(); as h) {\n @if (h.label) {\n <m-section-header class=\"nav-header__title\" [icon]=\"h.icon\" [label]=\"h.label\" />\n }\n }\n</m-section>\n",
41303
- 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)}}.nav-header__user{display:block;padding:1rem}.nav-header__username{font-size:.6875rem;font-weight:600;color:var(--m-text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}m-section-search.nav-header__search{--_nav-row-height: var(--section-header-min-height, calc(var(--section-header-py, .5rem) * 2 + 1.25rem));min-height:var(--_nav-row-height);padding-block:0;--m-input-clear-height: calc(var(--_nav-row-height) - .5rem);--m-input-clear-min-height: calc(var(--_nav-row-height) - .5rem)}\n"]
41612
+ template: "<m-section>\n @if (_isSearch() && _searchOpen()) {\n <!-- Searching: the field takes the row the trail was on, so the nav is\n hidden while there is something to type into. -->\n <m-section-search\n class=\"nav-header__search\"\n [(isOpen)]=\"_searchOpen\"\n [value]=\"_searchStore.query()\"\n [searchLabel]=\"_searchLabel()\"\n (searchChange)=\"_searchStore.updateQuery($event)\"\n />\n } @else if (_trail() || _isSearch()) {\n <!-- The nav's row, and the bar's toggle stands in it rather than in a row\n stacked on top of it. Both slots are written a single `@if` deep: a\n Section matches its projected slots by tag, and a node nested deeper\n falls through to the body instead. -->\n <m-section-back [back]=\"_hasParent()\" (navigate)=\"_navStore.back()\">\n @if (_trail(); as trail) {\n <m-nav-trail [config]=\"trail\" />\n }\n @if (_isSearch()) {\n <m-button\n class=\"nav-header__search-toggle\"\n [config]=\"_searchToggle\"\n (clicked)=\"_openSearch()\"\n />\n }\n </m-section-back>\n }\n\n @if (_user(); as user) {\n <m-user class=\"nav-header__user\" [id]=\"user.id\" [user]=\"user\" mRef=\"root_user\">\n <span class=\"nav-header__username\">&#64;{{ user.username }}</span>\n </m-user>\n } @else if (_header(); as h) {\n @if (h.label) {\n @if (h.appLogo; as logo) {\n <!-- A mounted app's header draws its AppLogo in the icon's place. -->\n <m-section-header class=\"nav-header__title\" [label]=\"h.label\">\n <m-app-logo class=\"nav-header__app-logo\" [glyph]=\"logo.glyph\" [appColor]=\"logo.color\" [name]=\"logo.name\" />\n </m-section-header>\n } @else {\n <m-section-header class=\"nav-header__title\" [icon]=\"h.icon\" [label]=\"h.label\" />\n }\n }\n }\n</m-section>\n",
41613
+ 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)}}.nav-header__user{display:block;padding:1rem}.nav-header__username{font-size:.6875rem;font-weight:600;color:var(--m-text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}m-section-search.nav-header__search{--_nav-row-height: var(--section-header-min-height, calc(var(--section-header-py, .5rem) * 2 + 1.25rem));min-height:var(--_nav-row-height);padding-block:0;--m-input-clear-height: calc(var(--_nav-row-height) - .5rem);--m-input-clear-min-height: calc(var(--_nav-row-height) - .5rem)}.nav-header__title .nav-header__app-logo{flex-shrink:0;align-self:flex-start;width:var(--m-section-header-icon-box, 1.5125rem);height:var(--m-section-header-icon-box, 1.5125rem)}\n"]
41304
41614
  }]
41305
41615
  }],
41306
41616
  ctorParameters: () => []
@@ -41406,6 +41716,14 @@ var NavMenuComponent = class NavMenuComponent {
41406
41716
  },
41407
41717
  ngImport: i0,
41408
41718
  template: `
41719
+ <!-- A row standing for a mounted app draws its AppLogo, else its icon. -->
41720
+ <ng-template #iconTemplate let-item>
41721
+ @if (item.appLogo; as logo) {
41722
+ <m-app-logo class="nav-menu__app-logo" [glyph]="logo.glyph" [appColor]="logo.color" [name]="logo.name" />
41723
+ } @else {
41724
+ <m-icon [name]="item.icon || 'menu'" [baseUrl]="baseUrl()" />
41725
+ }
41726
+ </ng-template>
41409
41727
  <ng-template #menuTemplate let-item="row">
41410
41728
  <div class="nav-menu__item">
41411
41729
  @if (item.nav; as nav) {
@@ -41419,7 +41737,7 @@ var NavMenuComponent = class NavMenuComponent {
41419
41737
  class="nav-menu__link"
41420
41738
  >
41421
41739
  <span class="nav-menu__icon">
41422
- <m-icon [name]="item.icon || 'menu'" [baseUrl]="baseUrl()" />
41740
+ <ng-container *ngTemplateOutlet="iconTemplate; context: { $implicit: item }" />
41423
41741
  </span>
41424
41742
  <span class="nav-menu__label">{{ item.label | translate }}</span>
41425
41743
  </a>
@@ -41437,13 +41755,13 @@ var NavMenuComponent = class NavMenuComponent {
41437
41755
  } @else if (item.href; as href) {
41438
41756
  <a [href]="href" class="nav-menu__link">
41439
41757
  <span class="nav-menu__icon">
41440
- <m-icon [name]="item.icon || 'menu'" [baseUrl]="baseUrl()" />
41758
+ <ng-container *ngTemplateOutlet="iconTemplate; context: { $implicit: item }" />
41441
41759
  </span>
41442
41760
  <span class="nav-menu__label">{{ item.label | translate }}</span>
41443
41761
  </a>
41444
41762
  } @else {
41445
41763
  <span class="nav-menu__icon">
41446
- <m-icon [name]="item.icon || 'menu'" [baseUrl]="baseUrl()" />
41764
+ <ng-container *ngTemplateOutlet="iconTemplate; context: { $implicit: item }" />
41447
41765
  </span>
41448
41766
  <span class="nav-menu__label">
41449
41767
  <span class="nav-menu__text">{{ item.label | translate }}</span>
@@ -41456,8 +41774,18 @@ var NavMenuComponent = class NavMenuComponent {
41456
41774
  </div>
41457
41775
  `,
41458
41776
  isInline: true,
41459
- styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}:host{display:block;width:100%}.nav-menu{padding:0;margin:0}.nav-menu ul{display:flex;flex-direction:column;gap:0;padding:0;margin:0}.nav-menu li{padding:0;list-style:none;width:100%;border-bottom:1px solid rgba(0,0,0,.02)}.nav-menu li:last-child{border-bottom:none}.nav-menu__item{display:flex;align-items:center;gap:.75rem;width:100%;position:relative;color:var(--m-text-secondary);background:transparent}.nav-menu__item:not(:has(.nav-menu__link)){padding:.625rem 1rem}.nav-menu__link{display:flex;align-items:center;gap:.75rem;padding:.625rem 1rem;border-radius:0;transition:all .15s cubic-bezier(.4,0,.2,1);cursor:pointer;width:100%;color:inherit;text-decoration:none}.nav-menu__link:hover{background:#00000008;color:var(--m-text)}.nav-menu__link:hover .nav-menu__icon{color:var(--m-text)}.nav-menu__link:hover .nav-menu__label{color:var(--m-text);font-weight:600}.nav-menu__browse{flex:none;margin-inline-end:.5rem;color:var(--m-text-tertiary)}.nav-menu__icon{display:flex;align-items:center;justify-content:center;color:var(--m-text-tertiary);transition:color .15s ease;width:1.15rem;height:1.15rem}.nav-menu__icon .m-icon{display:flex;align-items:center}.nav-menu__label{flex:1;display:block;width:100%;font-size:.8125rem;font-weight:500;letter-spacing:.01em;color:inherit;text-decoration:none}.nav-menu__item:has(.active){background:linear-gradient(90deg,color-mix(in srgb,var(--m-mm) 6%,transparent) 0%,color-mix(in srgb,var(--m-mm) 2%,transparent) 60%,transparent 100%);color:var(--m-mm);border-radius:0}.nav-menu__item:has(.active):after{content:\"\";position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,rgba(255,255,255,.3) 0%,rgba(255,255,255,.05) 50%,transparent 100%);z-index:3}.nav-menu__item:has(.active) .nav-menu__icon{color:var(--m-mm);filter:drop-shadow(0 0 3px color-mix(in srgb,var(--m-mm) 20%,transparent))}.nav-menu__item:has(.active) .nav-menu__label{color:var(--m-mm);font-weight:700;letter-spacing:.015em}\n"],
41777
+ styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}:host{display:block;width:100%}.nav-menu{padding:0;margin:0}.nav-menu ul{display:flex;flex-direction:column;gap:0;padding:0;margin:0}.nav-menu li{padding:0;list-style:none;width:100%;border-bottom:1px solid rgba(0,0,0,.02)}.nav-menu li:last-child{border-bottom:none}.nav-menu__item{display:flex;align-items:center;gap:.75rem;width:100%;position:relative;color:var(--m-text-secondary);background:transparent}.nav-menu__item:not(:has(.nav-menu__link)){padding:.625rem 1rem}.nav-menu__link{display:flex;align-items:center;gap:.75rem;padding:.625rem 1rem;border-radius:0;transition:all .15s cubic-bezier(.4,0,.2,1);cursor:pointer;width:100%;color:inherit;text-decoration:none}.nav-menu__link:hover{background:#00000008;color:var(--m-text)}.nav-menu__link:hover .nav-menu__icon{color:var(--m-text)}.nav-menu__link:hover .nav-menu__label{color:var(--m-text);font-weight:600}.nav-menu__browse{flex:none;margin-inline-end:.5rem;color:var(--m-text-tertiary)}.nav-menu__icon{display:flex;align-items:center;justify-content:center;color:var(--m-text-tertiary);transition:color .15s ease;width:1.15rem;height:1.15rem}.nav-menu__app-logo{display:block;width:100%;height:100%}.nav-menu__icon .m-icon{display:flex;align-items:center}.nav-menu__label{flex:1;display:block;width:100%;font-size:.8125rem;font-weight:500;letter-spacing:.01em;color:inherit;text-decoration:none}.nav-menu__item:has(.active){background:linear-gradient(90deg,color-mix(in srgb,var(--m-mm) 6%,transparent) 0%,color-mix(in srgb,var(--m-mm) 2%,transparent) 60%,transparent 100%);color:var(--m-mm);border-radius:0}.nav-menu__item:has(.active):after{content:\"\";position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,rgba(255,255,255,.3) 0%,rgba(255,255,255,.05) 50%,transparent 100%);z-index:3}.nav-menu__item:has(.active) .nav-menu__icon{color:var(--m-mm);filter:drop-shadow(0 0 3px color-mix(in srgb,var(--m-mm) 20%,transparent))}.nav-menu__item:has(.active) .nav-menu__label{color:var(--m-mm);font-weight:700;letter-spacing:.015em}\n"],
41460
41778
  dependencies: [
41779
+ {
41780
+ kind: "directive",
41781
+ type: NgTemplateOutlet,
41782
+ selector: "[ngTemplateOutlet]",
41783
+ inputs: [
41784
+ "ngTemplateOutletContext",
41785
+ "ngTemplateOutlet",
41786
+ "ngTemplateOutletInjector"
41787
+ ]
41788
+ },
41461
41789
  {
41462
41790
  kind: "component",
41463
41791
  type: IconComponent,
@@ -41474,6 +41802,20 @@ var NavMenuComponent = class NavMenuComponent {
41474
41802
  ],
41475
41803
  outputs: ["configChange"]
41476
41804
  },
41805
+ {
41806
+ kind: "component",
41807
+ type: AppLogoComponent,
41808
+ selector: "m-app-logo",
41809
+ inputs: [
41810
+ "glyph",
41811
+ "appColor",
41812
+ "name",
41813
+ "link",
41814
+ "variant",
41815
+ "tone",
41816
+ "size"
41817
+ ]
41818
+ },
41477
41819
  {
41478
41820
  kind: "directive",
41479
41821
  type: MRefDirective,
@@ -41555,6 +41897,14 @@ i0.ɵɵngDeclareClassMetadata({
41555
41897
  args: [{
41556
41898
  selector: "m-nav-menu",
41557
41899
  template: `
41900
+ <!-- A row standing for a mounted app draws its AppLogo, else its icon. -->
41901
+ <ng-template #iconTemplate let-item>
41902
+ @if (item.appLogo; as logo) {
41903
+ <m-app-logo class="nav-menu__app-logo" [glyph]="logo.glyph" [appColor]="logo.color" [name]="logo.name" />
41904
+ } @else {
41905
+ <m-icon [name]="item.icon || 'menu'" [baseUrl]="baseUrl()" />
41906
+ }
41907
+ </ng-template>
41558
41908
  <ng-template #menuTemplate let-item="row">
41559
41909
  <div class="nav-menu__item">
41560
41910
  @if (item.nav; as nav) {
@@ -41568,7 +41918,7 @@ i0.ɵɵngDeclareClassMetadata({
41568
41918
  class="nav-menu__link"
41569
41919
  >
41570
41920
  <span class="nav-menu__icon">
41571
- <m-icon [name]="item.icon || 'menu'" [baseUrl]="baseUrl()" />
41921
+ <ng-container *ngTemplateOutlet="iconTemplate; context: { $implicit: item }" />
41572
41922
  </span>
41573
41923
  <span class="nav-menu__label">{{ item.label | translate }}</span>
41574
41924
  </a>
@@ -41586,13 +41936,13 @@ i0.ɵɵngDeclareClassMetadata({
41586
41936
  } @else if (item.href; as href) {
41587
41937
  <a [href]="href" class="nav-menu__link">
41588
41938
  <span class="nav-menu__icon">
41589
- <m-icon [name]="item.icon || 'menu'" [baseUrl]="baseUrl()" />
41939
+ <ng-container *ngTemplateOutlet="iconTemplate; context: { $implicit: item }" />
41590
41940
  </span>
41591
41941
  <span class="nav-menu__label">{{ item.label | translate }}</span>
41592
41942
  </a>
41593
41943
  } @else {
41594
41944
  <span class="nav-menu__icon">
41595
- <m-icon [name]="item.icon || 'menu'" [baseUrl]="baseUrl()" />
41945
+ <ng-container *ngTemplateOutlet="iconTemplate; context: { $implicit: item }" />
41596
41946
  </span>
41597
41947
  <span class="nav-menu__label">
41598
41948
  <span class="nav-menu__text">{{ item.label | translate }}</span>
@@ -41606,13 +41956,15 @@ i0.ɵɵngDeclareClassMetadata({
41606
41956
  `,
41607
41957
  changeDetection: ChangeDetectionStrategy.OnPush,
41608
41958
  imports: [
41959
+ NgTemplateOutlet,
41609
41960
  IconComponent,
41961
+ AppLogoComponent,
41610
41962
  MRefDirective,
41611
41963
  TranslatePipe,
41612
41964
  ListComponent,
41613
41965
  ButtonComponent
41614
41966
  ],
41615
- styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}:host{display:block;width:100%}.nav-menu{padding:0;margin:0}.nav-menu ul{display:flex;flex-direction:column;gap:0;padding:0;margin:0}.nav-menu li{padding:0;list-style:none;width:100%;border-bottom:1px solid rgba(0,0,0,.02)}.nav-menu li:last-child{border-bottom:none}.nav-menu__item{display:flex;align-items:center;gap:.75rem;width:100%;position:relative;color:var(--m-text-secondary);background:transparent}.nav-menu__item:not(:has(.nav-menu__link)){padding:.625rem 1rem}.nav-menu__link{display:flex;align-items:center;gap:.75rem;padding:.625rem 1rem;border-radius:0;transition:all .15s cubic-bezier(.4,0,.2,1);cursor:pointer;width:100%;color:inherit;text-decoration:none}.nav-menu__link:hover{background:#00000008;color:var(--m-text)}.nav-menu__link:hover .nav-menu__icon{color:var(--m-text)}.nav-menu__link:hover .nav-menu__label{color:var(--m-text);font-weight:600}.nav-menu__browse{flex:none;margin-inline-end:.5rem;color:var(--m-text-tertiary)}.nav-menu__icon{display:flex;align-items:center;justify-content:center;color:var(--m-text-tertiary);transition:color .15s ease;width:1.15rem;height:1.15rem}.nav-menu__icon .m-icon{display:flex;align-items:center}.nav-menu__label{flex:1;display:block;width:100%;font-size:.8125rem;font-weight:500;letter-spacing:.01em;color:inherit;text-decoration:none}.nav-menu__item:has(.active){background:linear-gradient(90deg,color-mix(in srgb,var(--m-mm) 6%,transparent) 0%,color-mix(in srgb,var(--m-mm) 2%,transparent) 60%,transparent 100%);color:var(--m-mm);border-radius:0}.nav-menu__item:has(.active):after{content:\"\";position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,rgba(255,255,255,.3) 0%,rgba(255,255,255,.05) 50%,transparent 100%);z-index:3}.nav-menu__item:has(.active) .nav-menu__icon{color:var(--m-mm);filter:drop-shadow(0 0 3px color-mix(in srgb,var(--m-mm) 20%,transparent))}.nav-menu__item:has(.active) .nav-menu__label{color:var(--m-mm);font-weight:700;letter-spacing:.015em}\n"]
41967
+ styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}:host{display:block;width:100%}.nav-menu{padding:0;margin:0}.nav-menu ul{display:flex;flex-direction:column;gap:0;padding:0;margin:0}.nav-menu li{padding:0;list-style:none;width:100%;border-bottom:1px solid rgba(0,0,0,.02)}.nav-menu li:last-child{border-bottom:none}.nav-menu__item{display:flex;align-items:center;gap:.75rem;width:100%;position:relative;color:var(--m-text-secondary);background:transparent}.nav-menu__item:not(:has(.nav-menu__link)){padding:.625rem 1rem}.nav-menu__link{display:flex;align-items:center;gap:.75rem;padding:.625rem 1rem;border-radius:0;transition:all .15s cubic-bezier(.4,0,.2,1);cursor:pointer;width:100%;color:inherit;text-decoration:none}.nav-menu__link:hover{background:#00000008;color:var(--m-text)}.nav-menu__link:hover .nav-menu__icon{color:var(--m-text)}.nav-menu__link:hover .nav-menu__label{color:var(--m-text);font-weight:600}.nav-menu__browse{flex:none;margin-inline-end:.5rem;color:var(--m-text-tertiary)}.nav-menu__icon{display:flex;align-items:center;justify-content:center;color:var(--m-text-tertiary);transition:color .15s ease;width:1.15rem;height:1.15rem}.nav-menu__app-logo{display:block;width:100%;height:100%}.nav-menu__icon .m-icon{display:flex;align-items:center}.nav-menu__label{flex:1;display:block;width:100%;font-size:.8125rem;font-weight:500;letter-spacing:.01em;color:inherit;text-decoration:none}.nav-menu__item:has(.active){background:linear-gradient(90deg,color-mix(in srgb,var(--m-mm) 6%,transparent) 0%,color-mix(in srgb,var(--m-mm) 2%,transparent) 60%,transparent 100%);color:var(--m-mm);border-radius:0}.nav-menu__item:has(.active):after{content:\"\";position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,rgba(255,255,255,.3) 0%,rgba(255,255,255,.05) 50%,transparent 100%);z-index:3}.nav-menu__item:has(.active) .nav-menu__icon{color:var(--m-mm);filter:drop-shadow(0 0 3px color-mix(in srgb,var(--m-mm) 20%,transparent))}.nav-menu__item:has(.active) .nav-menu__label{color:var(--m-mm);font-weight:700;letter-spacing:.015em}\n"]
41616
41968
  }]
41617
41969
  }],
41618
41970
  propDecorators: {
@@ -42398,7 +42750,11 @@ var NavComponent = class NavComponent {
42398
42750
  inputs: [
42399
42751
  "glyph",
42400
42752
  "appColor",
42401
- "name"
42753
+ "name",
42754
+ "link",
42755
+ "variant",
42756
+ "tone",
42757
+ "size"
42402
42758
  ]
42403
42759
  }
42404
42760
  ],
@@ -46182,6 +46538,14 @@ function provideMagWcConfig(options) {
46182
46538
  provide: NavStore,
46183
46539
  useFactory: () => SharedStoreRegistry.getNavStore() || SharedStoreRegistry.getHostInjector()?.get(NavStore, null) || null
46184
46540
  },
46541
+ {
46542
+ provide: AppLogoState,
46543
+ useFactory: () => SharedStoreRegistry.getAppLogoState() ?? new AppLogoState()
46544
+ },
46545
+ {
46546
+ provide: APP_THEME_COLOR,
46547
+ useFactory: appThemeColorFactory
46548
+ },
46185
46549
  {
46186
46550
  provide: MODAL_STORE_REF,
46187
46551
  useFactory: () => {
@@ -46382,6 +46746,14 @@ function provideMagAppConfig(options) {
46382
46746
  provide: NavStore,
46383
46747
  useFactory: () => SharedStoreRegistry.getNavStore() || SharedStoreRegistry.getHostInjector()?.get(NavStore, null) || new NavStore()
46384
46748
  },
46749
+ {
46750
+ provide: AppLogoState,
46751
+ useFactory: () => SharedStoreRegistry.getAppLogoState() ?? new AppLogoState()
46752
+ },
46753
+ {
46754
+ provide: APP_THEME_COLOR,
46755
+ useFactory: appThemeColorFactory
46756
+ },
46385
46757
  {
46386
46758
  provide: NAV_STORE_REF,
46387
46759
  useFactory: (localStore) => SharedStoreRegistry.getNavStore() || SharedStoreRegistry.getHostInjector()?.get(NAV_STORE_REF, null) || localStore,
@@ -46401,6 +46773,11 @@ function provideMagAppConfig(options) {
46401
46773
  provide: APP_CONTEXT_REF,
46402
46774
  useFactory: provideAppContext
46403
46775
  },
46776
+ provideAppInitializer(() => {
46777
+ const color = inject(APP_THEME_COLOR);
46778
+ const body = inject(DOCUMENT).body;
46779
+ effect(() => paintAppColor(body, color()));
46780
+ }),
46404
46781
  provideAppInitializer(() => {
46405
46782
  inject(APP_CONTEXT_REF);
46406
46783
  }),
@@ -46459,6 +46836,60 @@ function bootstrapMagApp(routesOrOptions, maybeOptions) {
46459
46836
  `;
46460
46837
  });
46461
46838
  }
46839
+ const SPLASH_ID = "m-splash";
46840
+ const escapeHtml = (value) => value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
46841
+ const splashHtml = ({ appColor, glyph, link }) => {
46842
+ const color = normalizeAppColor(appColor) ?? "#0f172a";
46843
+ const mark = glyph?.trim() ? `<div class="${SPLASH_ID}__glyph"></div>` : `<div class="${SPLASH_ID}__letter">${escapeHtml(link.trim().charAt(0).toUpperCase())}</div>`;
46844
+ const mask = glyph?.trim() ? `
46845
+ #${SPLASH_ID} .${SPLASH_ID}__glyph {
46846
+ width: 100%;
46847
+ height: 100%;
46848
+ background: #fff;
46849
+ -webkit-mask: ${logoGlyphMaskUrl(glyph.trim())} center / contain no-repeat;
46850
+ mask: ${logoGlyphMaskUrl(glyph.trim())} center / contain no-repeat;
46851
+ }` : "";
46852
+ return ` <div id="${SPLASH_ID}">
46853
+ <div class="${SPLASH_ID}__mark" aria-hidden="true">${mark}</div>
46854
+ <style>
46855
+ #${SPLASH_ID} {
46856
+ position: fixed;
46857
+ inset: 0;
46858
+ display: flex;
46859
+ align-items: center;
46860
+ justify-content: center;
46861
+ background: ${color};
46862
+ z-index: 99999;
46863
+ transition: opacity 0.35s ease, visibility 0.35s ease;
46864
+ }
46865
+ #${SPLASH_ID}.hidden {
46866
+ opacity: 0;
46867
+ visibility: hidden;
46868
+ pointer-events: none;
46869
+ }
46870
+ #${SPLASH_ID} .${SPLASH_ID}__mark {
46871
+ display: flex;
46872
+ align-items: center;
46873
+ justify-content: center;
46874
+ width: 72px;
46875
+ height: 72px;
46876
+ animation: m-splash-breathe 1.6s ease-in-out infinite;
46877
+ }${mask}
46878
+ #${SPLASH_ID} .${SPLASH_ID}__letter {
46879
+ color: #fff;
46880
+ font: 700 56px/1 system-ui, sans-serif;
46881
+ }
46882
+ @keyframes m-splash-breathe {
46883
+ 0%, 100% { opacity: 1; transform: scale(1); }
46884
+ 50% { opacity: 0.55; transform: scale(0.93); }
46885
+ }
46886
+ @media (prefers-reduced-motion: reduce) {
46887
+ #${SPLASH_ID} .${SPLASH_ID}__mark { animation: none; }
46888
+ }
46889
+ </style>
46890
+ </div>
46891
+ `;
46892
+ };
46462
46893
  var Domain;
46463
46894
  (function(Domain) {
46464
46895
  Domain["AUTH"] = "auth";
@@ -49831,7 +50262,11 @@ var AppTileComponent = class AppTileComponent {
49831
50262
  inputs: [
49832
50263
  "glyph",
49833
50264
  "appColor",
49834
- "name"
50265
+ "name",
50266
+ "link",
50267
+ "variant",
50268
+ "tone",
50269
+ "size"
49835
50270
  ]
49836
50271
  },
49837
50272
  {
@@ -50586,6 +51021,6 @@ i0.ɵɵngDeclareClassMetadata({
50586
51021
  }]
50587
51022
  }
50588
51023
  });
50589
- export { ACCESS_DOMAINS, APP_CONTEXT_REF, APP_LINK, APP_LOGO_ICON, APP_LOGO_SOURCE, ASSET_BASE_URL, AUDIENCE_ICONS, AUDIENCE_LEVELS, AccordionBodyDirective, AccordionComponent, AccordionGroupComponent, ActionComponent, AnimatedGraphsComponent, AppAvailability, AppCardComponent, AppIdentityService, AppLogoComponent, AppLogoState, AppRelationType, AppTileComponent, AssetStore, AssetUrlPipe, Assets, AudiencePickerBoxComponent, AudiencePickerComponent, AuthActivityPageComponent, AuthApiService, AuthStore, AutosizeDirective, BadgeComponent, BandingComponent, BaseArrayInputComponent, BaseRootWebComponent, BaseWebComponent, BrowserLocaleService, ButtonComponent, ButtonGroupComponent, CALLING_APP_HEADER, COMPONENT_INPUT_REGISTRY, CardComponent, CardWrapperComponent, CarouselComponent, ChartComponent, ChatBubbleComponent, CheckboxGroupComponent, CheckboxInputComponent, ClearableInputComponent, ClipboardService, ColComponent, ColorPickerInputComponent, CommentItemComponent, CommentsApiService, CommentsComponent, CommentsStore, CompactNumberPipe, ComponentInputComponent, ComponentStepperComponent, ConfigComponent, ConfirmComponent, ContextMenuComponent, CustomIconClass, CustomIconEditComponent, DEFAULT_AUDIENCE, DEFAULT_DENIAL, DEFAULT_DOC_ALIGN, DEFAULT_DOC_DENSITY, DEFAULT_DOC_VARIANT, DEFAULT_FILTER_RANGE_MODE, DEFAULT_FILTER_VARIANT, DEFAULT_NAV_PARAM, DEFAULT_NAV_SEGMENT, DEFAULT_SIZE, DOCK_MIN_PAGE_REMAINDER, DOCS_FOLDER, DOC_ACTION_ICONS, DOC_ALIGNS, DOC_DENSITIES, DOC_EDIT_ACTIONS, DOC_TOOLBAR_GROUPS, DOC_VARIANTS, DashboardCardComponent, DateInputComponent, DatePickerComponent, DeviceService, DocComponent, DocEditorComponent, DomService, Domain, DotGridComponent, DragListDirective, DragListItemDirective, DraggableDirective, DropdownInputComponent, FILTER_GROUP_CONTEXT, FILTER_RANGE_MODES, FILTER_VARIANTS, FLEX_VARIANTS, FOLDER_PICK_LISTENER, FORM_ASSET_FOLDER, FileService, FileUploadDirective, FileUploadInputComponent, FlexComponent, FlexItemComponent, FormGroupComponent, FrameComponent, FreezeService, GRID_BREAKPOINTS, GetNavService, HeaderComponent, HighlightDirective, HttpService, HttpSharingClient, ICON_SOURCE, IS_DESIGN_MODE, IS_SIDE_PANEL, IconComponent, ImgComponent, InputType, InstrumentScoreComponent, InterceptorObservables, JumbotronComponent, KeyValueComponent, LAYOUT_ASSET_FOLDER, LOADING_ACTIONS_REF, LOGIN_COMPONENT, LOGIN_STORE, LOGO_GLYPH_MAX_BYTES, LanguageComponent, ListComponent, LogoComponent, LogoGlyphInputComponent, MAG_SOCKET_EVENT, MHeroColorDirective, MHeroComponent, MODAL_REF, MODAL_STORE_REF, MOUNT_STATIC_SEGMENT, MOUNT_TOKEN, MRefDirective, MStepComponent, MURL_PARAM, MURL_SEP, ManifestEnrichmentService, MarginDirective, MenuComponent, ModalDirective, ModalRef, ModalStore, MoneyPipe, MultiRangeInputComponent, MultiselectInputComponent, MurlUrlSerializer, NAV_DEFAULT_MURL, NAV_ID_SEP, NAV_MAIN_BUTTONS, NAV_SEGMENT_RE, NAV_STORE_REF, NAV_WC_COMPONENTS, NAV_WIDGET_MAP, NavComponent, NavDetailsComponent, NavHeaderComponent, NavMenuComponent, NavStore, NavTrailComponent, NothingComponent, NotificationElementComponent, NotificationGroupComponent, NotificationPopupComponent, NotificationService, NotificationStore, NotificationType, NotificationWidgetComponent, ONE_ASSET_BASE_URL, OPTIONS_SOURCE, OVERLAY_WIDGETS, OneApp, OptionsSourceDirective, OverlayBodyComponent, OverlayRef, OverlayService, PLATFORM_BUTTON_NAV_IDS, PLATFORM_EXTENSIBLE_NAV_IDS, PLATFORM_NAV_MAP, PLATFORM_ROOT_CHILDREN, PLUGIN_FALLBACK_LANG, PLUGIN_OUTPUT_EVENT, PLUGIN_SCREENS, PaddingDirective, PaginationComponent, PanelComponent, PercentagePipe, PlaygroundComponent, PluginComponent, PluginInputComponent, PluginOutputComponent, PositionDirective, PwaInstallComponent, RECENT_SEARCH_LIMIT, REMOTE_PAGE_RELOAD, ROOT_NAV, RadioGroupComponent, RadioInputComponent, RangeInputComponent, RatingInputComponent, ReactiveElementComponent, RemoteComponent, RemoteLoaderService, ResizeElementComponent, RouteContainer, RowComponent, SEARCH_ANSWER_KEY, SEARCH_LABEL_KEY, SEARCH_QUERY, SEARCH_RESULTS_EVENT, SECTION_ACCORDION_GROUP, SECTION_FORM_CONTEXT, SECTION_TABLE_VARIANTS, SHARED_ICONS, SHARING_CLIENT, SIZE_CONTEXT, SPACING_INWARD, ScoreComponent, ScrollComponent, ScrollService, SearchPanelComponent, SearchStore, SearchUserPanelComponent, SectionAccordionDirective, SectionAccordionGroupDirective, SectionBackComponent, SectionBadgesComponent, SectionButtonGroupComponent, SectionCardComponent, SectionCarouselComponent, SectionComponent, SectionFilterComponent, SectionFilterGroupComponent, SectionFilterMenuComponent, SectionFilterPanelComponent, SectionFilterRangePanelComponent, SectionFooterComponent, SectionFormComponent, SectionFormItemComponent, SectionHeaderComponent, SectionHeroComponent, SectionPaginationComponent, SectionSearchComponent, SectionStepperComponent, SectionTableCellComponent, SectionTableComponent, SectionTableRowComponent, SectionTableSortPipe, SectionTabsComponent, SectionToggleComponent, SectionToggleItemDirective, SelectableCardInputComponent, SelectorDirective, SettingsSearchBarComponent, SettingsSearchService, ShapeComponent, SharedStoreRegistry, SidePanelDirective, Size, SocketStore, SortComponent, StatComponent, StepComponent, StepperComponent, StepsComponent, StorageService, StrokeLinecap, StrokeLinejoin, SummaryComponent, SvgGeneratorComponent, SvgGeneratorService, SvgService, TOTAL_COLUMNS, TRANSLATION_SOURCE, TableComponent, TechnicalMeterComponent, TextInputComponent, TextOutputComponent, TextareaInputComponent, ThemeComponent, ThemeDataService, ThemeService, ThemeStore, TimeAgoPipe, TimelineComponent, ToggleButtonComponent, ToggleInputComponent, ToggleRadioInputComponent, ToolTipDirective, TooltipComponent, TranslatePipe, TranslateService, TreeGridComponent, URL_SEP, USER_STORE_REF, USER_TAB_MAP, UniverseComponent, UserApiService, UserAvatarComponent, UserComponent, UserNavComponent, UserSettingsComponent, UserStore, WC_BUNDLE, WC_NAVIGATE_EVENT, WC_ROUTE_CHANGED_EVENT, WC_SEARCH_GROUPS, WIN_USER_TAB_HOOK, WIN_USER_TAB_KEY, WatermarkComponent, WcRouterStore, WrapperInputComponent, activeElementWithin, allowedCodes, anchorNavId, appLogoShadowColor, applyColorsToElement, applyDocEdit, assetOptions, baseUnderHost, bootstrapMagApp, bootstrapPwaInstall, browserLocale, buildWcBaseUrl, calculateLuminance, calculateRanks, cellText, checkDoc, checkFilterCondition, childNavId, claimDenial, classListSignal, coerceSize, cornerEdge, cornerSide, createLoadingState, createMap, createPlatformNavMap, createPluginElement, definePluginScreens, definedWcBundleOf, definedWcTierOf, deriveAvatarGradient, deriveContrastColor, deriveOppositeColor, derivePropertyName, docActionKey, docAssetCandidates, docProblemKey, docRemotePath, emailValidation, evaluate, evaluateBool, exposeScreens, exposedScreensOf, fieldBoolean, fieldNumber, fieldString, filterHoldsList, filterHoldsOneBound, filterHoldsOptions, filterHoldsRange, filterList, filterNumber, filterNumberList, filterOne, filterPanelOf, filterPanelWidth, filterRange, filterTreeGridRows, filterValueList, filterValues, flattenTreeGridRows, formatBadgeCount, fullName, generateClipPath, generateTransform, getClassList, getProperty, getScrollParent, getTierFromPreviewPath, getTreeGridRow, getUniqueId, getValue, hasErrorComputed, hexToRgb, hslToRgb, initMagmoniumApp, initialNotificationState, initialState, initials, injectAuthenticate, injectDefaultDenial, injectInstallApp, injectParentSize, injectScrollSticky, isBootRedirect, isButtonName, isCancelledComputed, isExtensiblePlatformNavId, isJson, isLightAppColor, isLoadingComputed, isLocalhost, isNavInstanceConfig, isNavMenuConfig, isNavRowsConfig, isNavVisibilityConfig, isPlatformNavId, isPlatformPanelNavId, isSize, isTierPreview, isUrlLocalhost, isValidNavId, isValidNavSegment, isWebComponent, linkToId, linkToNav, loadingActions, logoGlyphMaskUrl, mInterceptor, manualValidation, matchFieldValidation, matchMount, maxLengthValidation, maxValidation, mergePlatformNav, mergeUnique, mergeUniqueBy, mergeUniqueWith, minAgeValidation, minLengthValidation, minValidation, miniMarkToHtml, mountFor, mountPatternProblem, mountPatternText, mountSegmentOf, mountTokenOf, navIdChain, navIdFor, navIdSegment, navIdToRoutePath, navIdToSegments, navParamOf, navTailMatcher, navToId, navVisibilityGuard, nextSectionTableSort, normalizeAppColor, normalizeAssetOptions, offsetOfLine, outletPathOf, outletSegmentsOf, parentNavId, parseAddress, parseColor, parseMountPattern, parsePatternNames, patternValidation, patternsValidation, permissionRefusal, pickCount, pickSupportedLanguage, picksMembers, platformNavWidgets, pluginTag, presetDefaultOption, privateGuard, processImageToSvg, provideAppContext, provideMagAppConfig, provideMagWcConfig, provideMagWcRoutes, provideModalComponents, provideMurlUrlSerializer, provideNavWidgets, provideOverlayWidgets, providePlatformNavWidgets, providePluginRuntime, provideSearch, provideSizeContext, provideUserTabs, publicGuard, readFieldPatterns, rebuildLogoGlyph, recordDefinedWcTier, remoteOutletRoute, renderAddress, renderDocument, requiredValidation, resolveConfigAsset, resolveIconSize, resolvePallet, resolvePatternRules, resolveSize, resolveSpacing, rgbToHex, rgbToHsl, rowHasChildren, samePatterns, sectionTableColumnId, sectionTableColumnWidths, sectionTableFrozenCount, segmentsToNavId, setProperty, setTreeGridChildren, setWcLocalPort, setWcTier, settingsWidgets, shouldShowBadge, sortSectionTableRows, splitNavId, splitOnMatch, splitPath, stringToColor, tailRouteOf, toAttrBool, toAttrNumber, toCssLength, toHostNavId, toLength, toLocalNavId, toggleGroup, toggleTreeGridRow, toggleUid, unfetchedPlatformNav, ungroupedDocActions, urlValidation, wcLocalBaseOf, wcTierOf, withLevel };
51024
+ export { ACCESS_DOMAINS, APP_CONTEXT_REF, APP_LINK, APP_LOGO_ICON, APP_LOGO_SOURCE, APP_THEME_COLOR, ASSET_BASE_URL, AUDIENCE_ICONS, AUDIENCE_LEVELS, AccordionBodyDirective, AccordionComponent, AccordionGroupComponent, ActionComponent, AnimatedGraphsComponent, AppAvailability, AppCardComponent, AppIdentityService, AppLogoComponent, AppLogoState, AppRelationType, AppTileComponent, AssetStore, AssetUrlPipe, Assets, AudiencePickerBoxComponent, AudiencePickerComponent, AuthActivityPageComponent, AuthApiService, AuthStore, AutosizeDirective, BadgeComponent, BandingComponent, BaseArrayInputComponent, BaseRootWebComponent, BaseWebComponent, BrowserLocaleService, ButtonComponent, ButtonGroupComponent, CALLING_APP_HEADER, COMPONENT_INPUT_REGISTRY, CardComponent, CardWrapperComponent, CarouselComponent, ChartComponent, ChatBubbleComponent, CheckboxGroupComponent, CheckboxInputComponent, ClearableInputComponent, ClipboardService, ColComponent, ColorPickerInputComponent, CommentItemComponent, CommentsApiService, CommentsComponent, CommentsStore, CompactNumberPipe, ComponentInputComponent, ComponentStepperComponent, ConfigComponent, ConfirmComponent, ContextMenuComponent, CustomIconClass, CustomIconEditComponent, DEFAULT_AUDIENCE, DEFAULT_DENIAL, DEFAULT_DOC_ALIGN, DEFAULT_DOC_DENSITY, DEFAULT_DOC_VARIANT, DEFAULT_FILTER_RANGE_MODE, DEFAULT_FILTER_VARIANT, DEFAULT_NAV_PARAM, DEFAULT_NAV_SEGMENT, DEFAULT_SIZE, DOCK_MIN_PAGE_REMAINDER, DOCS_FOLDER, DOC_ACTION_ICONS, DOC_ALIGNS, DOC_DENSITIES, DOC_EDIT_ACTIONS, DOC_TOOLBAR_GROUPS, DOC_VARIANTS, DashboardCardComponent, DateInputComponent, DatePickerComponent, DeviceService, DocComponent, DocEditorComponent, DomService, Domain, DotGridComponent, DragListDirective, DragListItemDirective, DraggableDirective, DropdownInputComponent, FILTER_GROUP_CONTEXT, FILTER_RANGE_MODES, FILTER_VARIANTS, FLEX_VARIANTS, FOLDER_PICK_LISTENER, FORM_ASSET_FOLDER, FileService, FileUploadDirective, FileUploadInputComponent, FlexComponent, FlexItemComponent, FormGroupComponent, FrameComponent, FreezeService, GRID_BREAKPOINTS, GetNavService, HeaderComponent, HighlightDirective, HttpService, HttpSharingClient, ICON_SOURCE, IS_DESIGN_MODE, IS_SIDE_PANEL, IconComponent, ImgComponent, InputType, InstrumentScoreComponent, InterceptorObservables, JumbotronComponent, KeyValueComponent, LAYOUT_ASSET_FOLDER, LOADING_ACTIONS_REF, LOGIN_COMPONENT, LOGIN_STORE, LOGO_GLYPH_MAX_BYTES, LanguageComponent, ListComponent, LogoComponent, LogoGlyphInputComponent, MAG_SOCKET_EVENT, MHeroColorDirective, MHeroComponent, MODAL_REF, MODAL_STORE_REF, MOUNT_STATIC_SEGMENT, MOUNT_TOKEN, MRefDirective, MStepComponent, MURL_PARAM, MURL_SEP, ManifestEnrichmentService, MarginDirective, MenuComponent, ModalDirective, ModalRef, ModalStore, MoneyPipe, MultiRangeInputComponent, MultiselectInputComponent, MurlUrlSerializer, NAV_DEFAULT_MURL, NAV_ID_SEP, NAV_MAIN_BUTTONS, NAV_SEGMENT_RE, NAV_STORE_REF, NAV_WC_COMPONENTS, NAV_WIDGET_MAP, NavComponent, NavDetailsComponent, NavHeaderComponent, NavMenuComponent, NavStore, NavTrailComponent, NothingComponent, NotificationElementComponent, NotificationGroupComponent, NotificationPopupComponent, NotificationService, NotificationStore, NotificationType, NotificationWidgetComponent, ONE_ASSET_BASE_URL, OPTIONS_SOURCE, OVERLAY_WIDGETS, OneApp, OptionsSourceDirective, OverlayBodyComponent, OverlayRef, OverlayService, PLATFORM_BUTTON_NAV_IDS, PLATFORM_EXTENSIBLE_NAV_IDS, PLATFORM_NAV_MAP, PLATFORM_ROOT_CHILDREN, PLUGIN_FALLBACK_LANG, PLUGIN_OUTPUT_EVENT, PLUGIN_SCREENS, PaddingDirective, PaginationComponent, PanelComponent, PercentagePipe, PlaygroundComponent, PluginComponent, PluginInputComponent, PluginOutputComponent, PositionDirective, PwaInstallComponent, RECENT_SEARCH_LIMIT, REMOTE_BOOT_TIMEOUT_MS, REMOTE_PAGE_RELOAD, ROOT_NAV, RadioGroupComponent, RadioInputComponent, RangeInputComponent, RatingInputComponent, ReactiveElementComponent, RemoteComponent, RemoteLoaderService, ResizeElementComponent, RouteContainer, RowComponent, SEARCH_ANSWER_KEY, SEARCH_LABEL_KEY, SEARCH_QUERY, SEARCH_RESULTS_EVENT, SECTION_ACCORDION_GROUP, SECTION_FORM_CONTEXT, SECTION_TABLE_VARIANTS, SHARED_ICONS, SHARING_CLIENT, SIZE_CONTEXT, SPACING_INWARD, SPLASH_ID, ScoreComponent, ScrollComponent, ScrollService, SearchPanelComponent, SearchStore, SearchUserPanelComponent, SectionAccordionDirective, SectionAccordionGroupDirective, SectionBackComponent, SectionBadgesComponent, SectionButtonGroupComponent, SectionCardComponent, SectionCarouselComponent, SectionComponent, SectionFilterComponent, SectionFilterGroupComponent, SectionFilterMenuComponent, SectionFilterPanelComponent, SectionFilterRangePanelComponent, SectionFooterComponent, SectionFormComponent, SectionFormItemComponent, SectionHeaderComponent, SectionHeroComponent, SectionPaginationComponent, SectionSearchComponent, SectionStepperComponent, SectionTableCellComponent, SectionTableComponent, SectionTableRowComponent, SectionTableSortPipe, SectionTabsComponent, SectionToggleComponent, SectionToggleItemDirective, SelectableCardInputComponent, SelectorDirective, SettingsSearchBarComponent, SettingsSearchService, ShapeComponent, SharedStoreRegistry, SidePanelDirective, Size, SocketStore, SortComponent, StatComponent, StepComponent, StepperComponent, StepsComponent, StorageService, StrokeLinecap, StrokeLinejoin, SummaryComponent, SvgGeneratorComponent, SvgGeneratorService, SvgService, TOTAL_COLUMNS, TRANSLATION_SOURCE, TableComponent, TechnicalMeterComponent, TextInputComponent, TextOutputComponent, TextareaInputComponent, ThemeComponent, ThemeDataService, ThemeService, ThemeStore, TimeAgoPipe, TimelineComponent, ToggleButtonComponent, ToggleInputComponent, ToggleRadioInputComponent, ToolTipDirective, TooltipComponent, TranslatePipe, TranslateService, TreeGridComponent, URL_SEP, USER_STORE_REF, USER_TAB_MAP, UniverseComponent, UserApiService, UserAvatarComponent, UserComponent, UserNavComponent, UserSettingsComponent, UserStore, WC_BUNDLE, WC_NAVIGATE_EVENT, WC_ROUTE_CHANGED_EVENT, WC_SEARCH_GROUPS, WIN_USER_TAB_HOOK, WIN_USER_TAB_KEY, WatermarkComponent, WcRouterStore, WrapperInputComponent, activeElementWithin, allowedCodes, anchorNavId, appColorBrand, appLogoShadowColor, appThemeColorFactory, applyColorsToElement, applyDocEdit, assetOptions, baseUnderHost, bootstrapMagApp, bootstrapPwaInstall, browserLocale, buildWcBaseUrl, calculateLuminance, calculateRanks, cellText, checkDoc, checkFilterCondition, childNavId, claimDenial, classListSignal, coerceSize, cornerEdge, cornerSide, createLoadingState, createMap, createPlatformNavMap, createPluginElement, definePluginScreens, definedWcBundleOf, definedWcTierOf, deriveAvatarGradient, deriveContrastColor, deriveOppositeColor, derivePropertyName, docActionKey, docAssetCandidates, docProblemKey, docRemotePath, emailValidation, evaluate, evaluateBool, exposeScreens, exposedScreensOf, fieldBoolean, fieldNumber, fieldString, filterHoldsList, filterHoldsOneBound, filterHoldsOptions, filterHoldsRange, filterList, filterNumber, filterNumberList, filterOne, filterPanelOf, filterPanelWidth, filterRange, filterTreeGridRows, filterValueList, filterValues, flattenTreeGridRows, formatBadgeCount, fullName, generateClipPath, generateTransform, getClassList, getProperty, getScrollParent, getTierFromPreviewPath, getTreeGridRow, getUniqueId, getValue, hasErrorComputed, hexToRgb, hslToRgb, initMagmoniumApp, initialNotificationState, initialState, initials, injectAuthenticate, injectDefaultDenial, injectInstallApp, injectParentSize, injectScrollSticky, isBootRedirect, isButtonName, isCancelledComputed, isExtensiblePlatformNavId, isJson, isLightAppColor, isLoadingComputed, isLocalhost, isNavInstanceConfig, isNavMenuConfig, isNavRowsConfig, isNavVisibilityConfig, isPlatformNavId, isPlatformPanelNavId, isSize, isTierPreview, isUrlLocalhost, isValidNavId, isValidNavSegment, isWebComponent, linkToId, linkToNav, loadingActions, logoGlyphMaskUrl, mInterceptor, manualValidation, matchFieldValidation, matchMount, maxLengthValidation, maxValidation, mergePlatformNav, mergeUnique, mergeUniqueBy, mergeUniqueWith, minAgeValidation, minLengthValidation, minValidation, miniMarkToHtml, mountFor, mountPatternProblem, mountPatternText, mountSegmentOf, mountTokenOf, navIdChain, navIdFor, navIdSegment, navIdToRoutePath, navIdToSegments, navParamOf, navTailMatcher, navToId, navVisibilityGuard, nextSectionTableSort, normalizeAppColor, normalizeAssetOptions, offsetOfLine, outletPathOf, outletSegmentsOf, paintAppColor, parentNavId, parseAddress, parseColor, parseMountPattern, parsePatternNames, patternValidation, patternsValidation, permissionRefusal, pickCount, pickSupportedLanguage, picksMembers, platformNavWidgets, pluginTag, presetDefaultOption, privateGuard, processImageToSvg, provideAppContext, provideMagAppConfig, provideMagWcConfig, provideMagWcRoutes, provideModalComponents, provideMurlUrlSerializer, provideNavWidgets, provideOverlayWidgets, providePlatformNavWidgets, providePluginRuntime, provideSearch, provideSizeContext, provideUserTabs, publicGuard, readFieldPatterns, rebuildLogoGlyph, recordDefinedWcTier, remoteOutletRoute, renderAddress, renderDocument, requiredValidation, resolveConfigAsset, resolveIconSize, resolvePallet, resolvePatternRules, resolveSize, resolveSpacing, rgbToHex, rgbToHsl, rowHasChildren, samePatterns, sectionTableColumnId, sectionTableColumnWidths, sectionTableFrozenCount, segmentsToNavId, setProperty, setTreeGridChildren, setWcLocalPort, setWcTier, settingsWidgets, shouldShowBadge, sortSectionTableRows, splashHtml, splitNavId, splitOnMatch, splitPath, stringToColor, tailRouteOf, toAttrBool, toAttrNumber, toCssLength, toHostNavId, toLength, toLocalNavId, toggleGroup, toggleTreeGridRow, toggleUid, unfetchedPlatformNav, ungroupedDocActions, urlValidation, wcLocalBaseOf, wcTierOf, withLevel };
50590
51025
 
50591
51026
  //# sourceMappingURL=magmonium-one.mjs.map