@magmonium/one 0.4.42 → 0.4.43

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 +203 -71
  57. package/fesm2022/magmonium-one.mjs.map +1 -1
  58. package/package.json +1 -1
  59. package/types/magmonium-one.d.ts +78 -23
  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();
@@ -29203,6 +29258,7 @@ var RemoteComponent = class RemoteComponent {
29203
29258
  navRef = inject(NAV_STORE_REF, { optional: true });
29204
29259
  reloadPage = inject(REMOTE_PAGE_RELOAD);
29205
29260
  assetStore = inject(AssetStore);
29261
+ appLogoState = inject(AppLogoState);
29206
29262
  loadedElement;
29207
29263
  loadId = 0;
29208
29264
  mountedLink;
@@ -29237,7 +29293,13 @@ var RemoteComponent = class RemoteComponent {
29237
29293
  return navUrl === void 0 ? void 0 : `${navUrl}${this.hostQuery()}`;
29238
29294
  }, ...ngDevMode ? [{ debugName: "remotePath" }] : /* istanbul ignore next */ []);
29239
29295
  ownTail = computed(() => this.mountMatch()?.navUrl ?? this.tail(), ...ngDevMode ? [{ debugName: "ownTail" }] : /* istanbul ignore next */ []);
29296
+ appColor = computed(() => {
29297
+ const link = this.appLink();
29298
+ const color = link ? this.appLogoState.logos()[link]?.color : void 0;
29299
+ return color ? normalizeAppColor(color) : void 0;
29300
+ }, ...ngDevMode ? [{ debugName: "appColor" }] : /* istanbul ignore next */ []);
29240
29301
  constructor() {
29302
+ effect(() => paintAppColor(this.elementRef.nativeElement, this.appColor()));
29241
29303
  effect(() => {
29242
29304
  this.loginStore?.isLoggedIn();
29243
29305
  const config = this.config();
@@ -41109,8 +41171,8 @@ var NavHeaderComponent = class NavHeaderComponent {
41109
41171
  classAttribute: "m-nav-header"
41110
41172
  },
41111
41173
  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"],
41174
+ 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",
41175
+ 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__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
41176
  dependencies: [
41115
41177
  {
41116
41178
  kind: "component",
@@ -41267,6 +41329,16 @@ var NavHeaderComponent = class NavHeaderComponent {
41267
41329
  "mRefToggle",
41268
41330
  "mRefParams"
41269
41331
  ]
41332
+ },
41333
+ {
41334
+ kind: "component",
41335
+ type: AppLogoComponent,
41336
+ selector: "m-app-logo",
41337
+ inputs: [
41338
+ "glyph",
41339
+ "appColor",
41340
+ "name"
41341
+ ]
41270
41342
  }
41271
41343
  ],
41272
41344
  changeDetection: i0.ChangeDetectionStrategy.OnPush,
@@ -41290,7 +41362,8 @@ i0.ɵɵngDeclareClassMetadata({
41290
41362
  SectionSearchComponent,
41291
41363
  ButtonComponent,
41292
41364
  UserComponent,
41293
- MRefDirective
41365
+ MRefDirective,
41366
+ AppLogoComponent
41294
41367
  ],
41295
41368
  encapsulation: ViewEncapsulation.None,
41296
41369
  changeDetection: ChangeDetectionStrategy.OnPush,
@@ -41299,8 +41372,8 @@ i0.ɵɵngDeclareClassMetadata({
41299
41372
  "[style.display]": "\"block\"",
41300
41373
  "[style.--m-section-min-height]": "\"0\""
41301
41374
  },
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"]
41375
+ 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",
41376
+ 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__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
41377
  }]
41305
41378
  }],
41306
41379
  ctorParameters: () => []
@@ -41406,6 +41479,14 @@ var NavMenuComponent = class NavMenuComponent {
41406
41479
  },
41407
41480
  ngImport: i0,
41408
41481
  template: `
41482
+ <!-- A row standing for a mounted app draws its AppLogo, else its icon. -->
41483
+ <ng-template #iconTemplate let-item>
41484
+ @if (item.appLogo; as logo) {
41485
+ <m-app-logo class="nav-menu__app-logo" [glyph]="logo.glyph" [appColor]="logo.color" [name]="logo.name" />
41486
+ } @else {
41487
+ <m-icon [name]="item.icon || 'menu'" [baseUrl]="baseUrl()" />
41488
+ }
41489
+ </ng-template>
41409
41490
  <ng-template #menuTemplate let-item="row">
41410
41491
  <div class="nav-menu__item">
41411
41492
  @if (item.nav; as nav) {
@@ -41419,7 +41500,7 @@ var NavMenuComponent = class NavMenuComponent {
41419
41500
  class="nav-menu__link"
41420
41501
  >
41421
41502
  <span class="nav-menu__icon">
41422
- <m-icon [name]="item.icon || 'menu'" [baseUrl]="baseUrl()" />
41503
+ <ng-container *ngTemplateOutlet="iconTemplate; context: { $implicit: item }" />
41423
41504
  </span>
41424
41505
  <span class="nav-menu__label">{{ item.label | translate }}</span>
41425
41506
  </a>
@@ -41437,13 +41518,13 @@ var NavMenuComponent = class NavMenuComponent {
41437
41518
  } @else if (item.href; as href) {
41438
41519
  <a [href]="href" class="nav-menu__link">
41439
41520
  <span class="nav-menu__icon">
41440
- <m-icon [name]="item.icon || 'menu'" [baseUrl]="baseUrl()" />
41521
+ <ng-container *ngTemplateOutlet="iconTemplate; context: { $implicit: item }" />
41441
41522
  </span>
41442
41523
  <span class="nav-menu__label">{{ item.label | translate }}</span>
41443
41524
  </a>
41444
41525
  } @else {
41445
41526
  <span class="nav-menu__icon">
41446
- <m-icon [name]="item.icon || 'menu'" [baseUrl]="baseUrl()" />
41527
+ <ng-container *ngTemplateOutlet="iconTemplate; context: { $implicit: item }" />
41447
41528
  </span>
41448
41529
  <span class="nav-menu__label">
41449
41530
  <span class="nav-menu__text">{{ item.label | translate }}</span>
@@ -41456,8 +41537,18 @@ var NavMenuComponent = class NavMenuComponent {
41456
41537
  </div>
41457
41538
  `,
41458
41539
  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"],
41540
+ 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
41541
  dependencies: [
41542
+ {
41543
+ kind: "directive",
41544
+ type: NgTemplateOutlet,
41545
+ selector: "[ngTemplateOutlet]",
41546
+ inputs: [
41547
+ "ngTemplateOutletContext",
41548
+ "ngTemplateOutlet",
41549
+ "ngTemplateOutletInjector"
41550
+ ]
41551
+ },
41461
41552
  {
41462
41553
  kind: "component",
41463
41554
  type: IconComponent,
@@ -41474,6 +41565,16 @@ var NavMenuComponent = class NavMenuComponent {
41474
41565
  ],
41475
41566
  outputs: ["configChange"]
41476
41567
  },
41568
+ {
41569
+ kind: "component",
41570
+ type: AppLogoComponent,
41571
+ selector: "m-app-logo",
41572
+ inputs: [
41573
+ "glyph",
41574
+ "appColor",
41575
+ "name"
41576
+ ]
41577
+ },
41477
41578
  {
41478
41579
  kind: "directive",
41479
41580
  type: MRefDirective,
@@ -41555,6 +41656,14 @@ i0.ɵɵngDeclareClassMetadata({
41555
41656
  args: [{
41556
41657
  selector: "m-nav-menu",
41557
41658
  template: `
41659
+ <!-- A row standing for a mounted app draws its AppLogo, else its icon. -->
41660
+ <ng-template #iconTemplate let-item>
41661
+ @if (item.appLogo; as logo) {
41662
+ <m-app-logo class="nav-menu__app-logo" [glyph]="logo.glyph" [appColor]="logo.color" [name]="logo.name" />
41663
+ } @else {
41664
+ <m-icon [name]="item.icon || 'menu'" [baseUrl]="baseUrl()" />
41665
+ }
41666
+ </ng-template>
41558
41667
  <ng-template #menuTemplate let-item="row">
41559
41668
  <div class="nav-menu__item">
41560
41669
  @if (item.nav; as nav) {
@@ -41568,7 +41677,7 @@ i0.ɵɵngDeclareClassMetadata({
41568
41677
  class="nav-menu__link"
41569
41678
  >
41570
41679
  <span class="nav-menu__icon">
41571
- <m-icon [name]="item.icon || 'menu'" [baseUrl]="baseUrl()" />
41680
+ <ng-container *ngTemplateOutlet="iconTemplate; context: { $implicit: item }" />
41572
41681
  </span>
41573
41682
  <span class="nav-menu__label">{{ item.label | translate }}</span>
41574
41683
  </a>
@@ -41586,13 +41695,13 @@ i0.ɵɵngDeclareClassMetadata({
41586
41695
  } @else if (item.href; as href) {
41587
41696
  <a [href]="href" class="nav-menu__link">
41588
41697
  <span class="nav-menu__icon">
41589
- <m-icon [name]="item.icon || 'menu'" [baseUrl]="baseUrl()" />
41698
+ <ng-container *ngTemplateOutlet="iconTemplate; context: { $implicit: item }" />
41590
41699
  </span>
41591
41700
  <span class="nav-menu__label">{{ item.label | translate }}</span>
41592
41701
  </a>
41593
41702
  } @else {
41594
41703
  <span class="nav-menu__icon">
41595
- <m-icon [name]="item.icon || 'menu'" [baseUrl]="baseUrl()" />
41704
+ <ng-container *ngTemplateOutlet="iconTemplate; context: { $implicit: item }" />
41596
41705
  </span>
41597
41706
  <span class="nav-menu__label">
41598
41707
  <span class="nav-menu__text">{{ item.label | translate }}</span>
@@ -41606,13 +41715,15 @@ i0.ɵɵngDeclareClassMetadata({
41606
41715
  `,
41607
41716
  changeDetection: ChangeDetectionStrategy.OnPush,
41608
41717
  imports: [
41718
+ NgTemplateOutlet,
41609
41719
  IconComponent,
41720
+ AppLogoComponent,
41610
41721
  MRefDirective,
41611
41722
  TranslatePipe,
41612
41723
  ListComponent,
41613
41724
  ButtonComponent
41614
41725
  ],
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"]
41726
+ 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
41727
  }]
41617
41728
  }],
41618
41729
  propDecorators: {
@@ -46182,6 +46293,14 @@ function provideMagWcConfig(options) {
46182
46293
  provide: NavStore,
46183
46294
  useFactory: () => SharedStoreRegistry.getNavStore() || SharedStoreRegistry.getHostInjector()?.get(NavStore, null) || null
46184
46295
  },
46296
+ {
46297
+ provide: AppLogoState,
46298
+ useFactory: () => SharedStoreRegistry.getAppLogoState() ?? new AppLogoState()
46299
+ },
46300
+ {
46301
+ provide: APP_THEME_COLOR,
46302
+ useFactory: appThemeColorFactory
46303
+ },
46185
46304
  {
46186
46305
  provide: MODAL_STORE_REF,
46187
46306
  useFactory: () => {
@@ -46382,6 +46501,14 @@ function provideMagAppConfig(options) {
46382
46501
  provide: NavStore,
46383
46502
  useFactory: () => SharedStoreRegistry.getNavStore() || SharedStoreRegistry.getHostInjector()?.get(NavStore, null) || new NavStore()
46384
46503
  },
46504
+ {
46505
+ provide: AppLogoState,
46506
+ useFactory: () => SharedStoreRegistry.getAppLogoState() ?? new AppLogoState()
46507
+ },
46508
+ {
46509
+ provide: APP_THEME_COLOR,
46510
+ useFactory: appThemeColorFactory
46511
+ },
46385
46512
  {
46386
46513
  provide: NAV_STORE_REF,
46387
46514
  useFactory: (localStore) => SharedStoreRegistry.getNavStore() || SharedStoreRegistry.getHostInjector()?.get(NAV_STORE_REF, null) || localStore,
@@ -46401,6 +46528,11 @@ function provideMagAppConfig(options) {
46401
46528
  provide: APP_CONTEXT_REF,
46402
46529
  useFactory: provideAppContext
46403
46530
  },
46531
+ provideAppInitializer(() => {
46532
+ const color = inject(APP_THEME_COLOR);
46533
+ const body = inject(DOCUMENT).body;
46534
+ effect(() => paintAppColor(body, color()));
46535
+ }),
46404
46536
  provideAppInitializer(() => {
46405
46537
  inject(APP_CONTEXT_REF);
46406
46538
  }),
@@ -50586,6 +50718,6 @@ i0.ɵɵngDeclareClassMetadata({
50586
50718
  }]
50587
50719
  }
50588
50720
  });
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 };
50721
+ 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_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, 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, splitNavId, splitOnMatch, splitPath, stringToColor, tailRouteOf, toAttrBool, toAttrNumber, toCssLength, toHostNavId, toLength, toLocalNavId, toggleGroup, toggleTreeGridRow, toggleUid, unfetchedPlatformNav, ungroupedDocActions, urlValidation, wcLocalBaseOf, wcTierOf, withLevel };
50590
50722
 
50591
50723
  //# sourceMappingURL=magmonium-one.mjs.map