@magmonium/one 0.4.41 → 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 (83) hide show
  1. package/assets/fields/app_color.json +5 -0
  2. package/assets/fields/logo_glyph_paste.json +7 -0
  3. package/assets/fields/logo_glyph_upload.json +12 -0
  4. package/assets/forms/logo_glyph_input.json +13 -0
  5. package/assets/i18n/ar.json +8 -0
  6. package/assets/i18n/de.json +8 -0
  7. package/assets/i18n/en.json +8 -0
  8. package/assets/i18n/es.json +8 -0
  9. package/assets/i18n/fr.json +8 -0
  10. package/assets/i18n/hi.json +8 -0
  11. package/assets/i18n/it.json +8 -0
  12. package/assets/i18n/ja.json +8 -0
  13. package/assets/i18n/ko.json +8 -0
  14. package/assets/i18n/nl.json +8 -0
  15. package/assets/i18n/pl.json +8 -0
  16. package/assets/i18n/pt.json +8 -0
  17. package/assets/i18n/ru.json +8 -0
  18. package/assets/i18n/tr.json +8 -0
  19. package/assets/i18n/zh.json +8 -0
  20. package/assets/index.json +1 -1
  21. package/fesm2022/{magmonium-one-attribute-value-DCTXt4Sr.mjs → magmonium-one-attribute-value-C1lqou2L.mjs} +3 -3
  22. package/fesm2022/{magmonium-one-attribute-value-DCTXt4Sr.mjs.map → magmonium-one-attribute-value-C1lqou2L.mjs.map} +1 -1
  23. package/fesm2022/{magmonium-one-base-checkbox-BNQAkyYU.mjs → magmonium-one-base-checkbox-CIxAiA4Q.mjs} +2 -2
  24. package/fesm2022/{magmonium-one-base-checkbox-BNQAkyYU.mjs.map → magmonium-one-base-checkbox-CIxAiA4Q.mjs.map} +1 -1
  25. package/fesm2022/{magmonium-one-base-dropdown-DU4B4w7c.mjs → magmonium-one-base-dropdown-XpTWe4Ii.mjs} +10 -10
  26. package/fesm2022/{magmonium-one-base-dropdown-DU4B4w7c.mjs.map → magmonium-one-base-dropdown-XpTWe4Ii.mjs.map} +1 -1
  27. package/fesm2022/{magmonium-one-base-input-BTxhUtYO.mjs → magmonium-one-base-input-C1Ek0Ezm.mjs} +2 -2
  28. package/fesm2022/{magmonium-one-base-input-BTxhUtYO.mjs.map → magmonium-one-base-input-C1Ek0Ezm.mjs.map} +1 -1
  29. package/fesm2022/{magmonium-one-base-text-BCSqKmVs.mjs → magmonium-one-base-text-Di2V2ojp.mjs} +2 -2
  30. package/fesm2022/{magmonium-one-base-text-BCSqKmVs.mjs.map → magmonium-one-base-text-Di2V2ojp.mjs.map} +1 -1
  31. package/fesm2022/{magmonium-one-button-BWB3ZKIj.mjs → magmonium-one-button-DZ4wCJgb.mjs} +11 -9
  32. package/fesm2022/{magmonium-one-button-BWB3ZKIj.mjs.map → magmonium-one-button-DZ4wCJgb.mjs.map} +1 -1
  33. package/fesm2022/{magmonium-one-checkbox-D5-5WhJ-.mjs → magmonium-one-checkbox-R-hPZrCa.mjs} +5 -5
  34. package/fesm2022/{magmonium-one-checkbox-D5-5WhJ-.mjs.map → magmonium-one-checkbox-R-hPZrCa.mjs.map} +1 -1
  35. package/fesm2022/{magmonium-one-color-utl-D86GGpz5.mjs → magmonium-one-color-utl-DI5p24iQ.mjs} +209 -6
  36. package/fesm2022/magmonium-one-color-utl-DI5p24iQ.mjs.map +1 -0
  37. package/fesm2022/{magmonium-one-directives-DePukAj8.mjs → magmonium-one-directives-B93p5bAL.mjs} +4 -4
  38. package/fesm2022/{magmonium-one-directives-DePukAj8.mjs.map → magmonium-one-directives-B93p5bAL.mjs.map} +1 -1
  39. package/fesm2022/{magmonium-one-group-m41SX_fL.mjs → magmonium-one-group-B7YeUd1u.mjs} +7 -7
  40. package/fesm2022/{magmonium-one-group-m41SX_fL.mjs.map → magmonium-one-group-B7YeUd1u.mjs.map} +1 -1
  41. package/fesm2022/{magmonium-one-header-D8CB9CBJ.mjs → magmonium-one-header-DUiBhPUP.mjs} +6 -5
  42. package/fesm2022/{magmonium-one-header-D8CB9CBJ.mjs.map → magmonium-one-header-DUiBhPUP.mjs.map} +1 -1
  43. package/fesm2022/{magmonium-one-icon-BTPHGpEN.mjs → magmonium-one-icon-C3jwzbb2.mjs} +80 -9
  44. package/fesm2022/magmonium-one-icon-C3jwzbb2.mjs.map +1 -0
  45. package/fesm2022/{magmonium-one-image-editor-Dn0ACfH0.mjs → magmonium-one-image-editor-BRTk8i4O.mjs} +4 -4
  46. package/fesm2022/{magmonium-one-image-editor-Dn0ACfH0.mjs.map → magmonium-one-image-editor-BRTk8i4O.mjs.map} +1 -1
  47. package/fesm2022/{magmonium-one-label-DjvJthAB.mjs → magmonium-one-label-D_rU82nD.mjs} +2 -2
  48. package/fesm2022/{magmonium-one-label-DjvJthAB.mjs.map → magmonium-one-label-D_rU82nD.mjs.map} +1 -1
  49. package/fesm2022/{magmonium-one-m-ref-C8c4Vf1G.mjs → magmonium-one-m-ref-CEms7B6-.mjs} +2 -2
  50. package/fesm2022/{magmonium-one-m-ref-C8c4Vf1G.mjs.map → magmonium-one-m-ref-CEms7B6-.mjs.map} +1 -1
  51. package/fesm2022/{magmonium-one-menu-EIfPlZ4E.mjs → magmonium-one-menu-cO34OcJc.mjs} +8 -7
  52. package/fesm2022/{magmonium-one-menu-EIfPlZ4E.mjs.map → magmonium-one-menu-cO34OcJc.mjs.map} +1 -1
  53. package/fesm2022/{magmonium-one-multi-range-o57TiVJU.mjs → magmonium-one-multi-range-Bq3_3NHg.mjs} +3 -3
  54. package/fesm2022/{magmonium-one-multi-range-o57TiVJU.mjs.map → magmonium-one-multi-range-Bq3_3NHg.mjs.map} +1 -1
  55. package/fesm2022/{magmonium-one-options-asset-EVsv0DL7.mjs → magmonium-one-options-asset-BMd7W0Mk.mjs} +2 -2
  56. package/fesm2022/{magmonium-one-options-asset-EVsv0DL7.mjs.map → magmonium-one-options-asset-BMd7W0Mk.mjs.map} +1 -1
  57. package/fesm2022/{magmonium-one-otp-CE4L1RcG.mjs → magmonium-one-otp-V2tFztLx.mjs} +5 -5
  58. package/fesm2022/{magmonium-one-otp-CE4L1RcG.mjs.map → magmonium-one-otp-V2tFztLx.mjs.map} +1 -1
  59. package/fesm2022/{magmonium-one-password-BjqYmT1s.mjs → magmonium-one-password-IdllPMUw.mjs} +6 -6
  60. package/fesm2022/{magmonium-one-password-BjqYmT1s.mjs.map → magmonium-one-password-IdllPMUw.mjs.map} +1 -1
  61. package/fesm2022/{magmonium-one-radio-C2wOB_Nb.mjs → magmonium-one-radio-BAL3-3j5.mjs} +3 -3
  62. package/fesm2022/{magmonium-one-radio-C2wOB_Nb.mjs.map → magmonium-one-radio-BAL3-3j5.mjs.map} +1 -1
  63. package/fesm2022/{magmonium-one-range-rgDe4O8u.mjs → magmonium-one-range-Cf7yUnhN.mjs} +4 -4
  64. package/fesm2022/{magmonium-one-range-rgDe4O8u.mjs.map → magmonium-one-range-Cf7yUnhN.mjs.map} +1 -1
  65. package/fesm2022/{magmonium-one-selector-DeRIUUBA.mjs → magmonium-one-selector-DAEI_0JX.mjs} +4 -4
  66. package/fesm2022/{magmonium-one-selector-DeRIUUBA.mjs.map → magmonium-one-selector-DAEI_0JX.mjs.map} +1 -1
  67. package/fesm2022/{magmonium-one-size-converter-C5fG_dgw.mjs → magmonium-one-size-converter-BOBD8nHy.mjs} +8 -1
  68. package/fesm2022/magmonium-one-size-converter-BOBD8nHy.mjs.map +1 -0
  69. package/fesm2022/{magmonium-one-text-BL-1lWST.mjs → magmonium-one-text-BnTkYLJe.mjs} +8 -7
  70. package/fesm2022/{magmonium-one-text-BL-1lWST.mjs.map → magmonium-one-text-BnTkYLJe.mjs.map} +1 -1
  71. package/fesm2022/{magmonium-one-text-output-Ci93Hi9Y.mjs → magmonium-one-text-output-BZU61QIF.mjs} +4 -4
  72. package/fesm2022/{magmonium-one-text-output-Ci93Hi9Y.mjs.map → magmonium-one-text-output-BZU61QIF.mjs.map} +1 -1
  73. package/fesm2022/magmonium-one-theme-DYvNIWmo.mjs +1 -0
  74. package/fesm2022/{magmonium-one-toggle-BTK2lzqA.mjs → magmonium-one-toggle-V_YnZXx5.mjs} +3 -3
  75. package/fesm2022/{magmonium-one-toggle-BTK2lzqA.mjs.map → magmonium-one-toggle-V_YnZXx5.mjs.map} +1 -1
  76. package/fesm2022/magmonium-one.mjs +788 -185
  77. package/fesm2022/magmonium-one.mjs.map +1 -1
  78. package/package.json +1 -1
  79. package/types/magmonium-one.d.ts +355 -53
  80. package/fesm2022/magmonium-one-color-utl-D86GGpz5.mjs.map +0 -1
  81. package/fesm2022/magmonium-one-icon-BTPHGpEN.mjs.map +0 -1
  82. package/fesm2022/magmonium-one-size-converter-C5fG_dgw.mjs.map +0 -1
  83. package/fesm2022/magmonium-one-theme-CT4cWpe7.mjs +0 -1
@@ -1,35 +1,35 @@
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 injectParentSize, i as SIZE_CONTEXT, n as CustomIconClass, o as provideSizeContext, r as IconComponent, s as SHARED_ICONS, t as CustomIconEditComponent } from "./magmonium-one-icon-BTPHGpEN.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-BWB3ZKIj.mjs";
12
- import { t as MRefDirective } from "./magmonium-one-m-ref-C8c4Vf1G.mjs";
13
- import { t as HeaderComponent } from "./magmonium-one-header-D8CB9CBJ.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-DU4B4w7c.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-BL-1lWST.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-m41SX_fL.mjs";
23
- import { n as ContextMenuBoxComponent, r as MenuComponent, t as ContextMenuComponent } from "./magmonium-one-menu-EIfPlZ4E.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";
31
31
  import { HttpErrorResponse, provideHttpClient, withFetch, withInterceptors } from "@angular/common/http";
32
- import { EMPTY, Observable, Subject, catchError, combineLatest, filter, finalize, firstValueFrom, forkJoin, from, fromEvent, map, of, pipe, race, shareReplay, startWith, switchMap, take, tap, throwError } from "rxjs";
32
+ import { EMPTY, Observable, Subject, catchError, combineLatest, filter, finalize, firstValueFrom, forkJoin, from, fromEvent, map, mergeMap, of, pipe, race, shareReplay, startWith, switchMap, take, tap, throwError } from "rxjs";
33
33
  import { rxResource, takeUntilDestroyed, toObservable, toSignal } from "@angular/core/rxjs-interop";
34
34
  import { patchState, signalStore, withComputed, withHooks, withMethods, withProps, withState } from "@ngrx/signals";
35
35
  import { rxMethod } from "@ngrx/signals/rxjs-interop";
@@ -565,6 +565,48 @@ const NotificationStore = signalStore({ providedIn: "root" }, withState(initialN
565
565
  else store.notify(notification);
566
566
  });
567
567
  } })));
568
+ var AppIdentityService = class AppIdentityService {
569
+ #http = inject(HttpService);
570
+ #cache = /* @__PURE__ */ new Map();
571
+ identity = (link) => {
572
+ const held = this.#cache.get(link);
573
+ if (held) return held;
574
+ const read = this.#http.get("store", ["identity", link]).pipe(map((identity) => identity), catchError(() => {
575
+ this.#cache.delete(link);
576
+ return of(void 0);
577
+ }), shareReplay(1));
578
+ this.#cache.set(link, read);
579
+ return read;
580
+ };
581
+ forget = (link) => {
582
+ this.#cache.delete(link);
583
+ };
584
+ static ɵfac = i0.ɵɵngDeclareFactory({
585
+ minVersion: "12.0.0",
586
+ version: "22.2.1",
587
+ ngImport: i0,
588
+ type: AppIdentityService,
589
+ deps: [],
590
+ target: i0.ɵɵFactoryTarget.Injectable
591
+ });
592
+ static ɵprov = i0.ɵɵngDeclareInjectable({
593
+ minVersion: "12.0.0",
594
+ version: "22.2.1",
595
+ ngImport: i0,
596
+ type: AppIdentityService,
597
+ providedIn: "root"
598
+ });
599
+ };
600
+ i0.ɵɵngDeclareClassMetadata({
601
+ minVersion: "12.0.0",
602
+ version: "22.2.1",
603
+ ngImport: i0,
604
+ type: AppIdentityService,
605
+ decorators: [{
606
+ type: Injectable,
607
+ args: [{ providedIn: "root" }]
608
+ }]
609
+ });
568
610
  const DEFAULT_NAV_PARAM = "id";
569
611
  const navParamOf = (nav) => nav?.param ?? "id";
570
612
  const ROOT_NAV = "root";
@@ -1169,6 +1211,7 @@ const initialState$3 = {
1169
1211
  remoteWidgets: {},
1170
1212
  navMap: createPlatformNavMap(),
1171
1213
  wcConfigMap: {},
1214
+ identityMap: {},
1172
1215
  navLoading: false
1173
1216
  };
1174
1217
  const routeNavIdOf = (root) => {
@@ -1231,6 +1274,7 @@ const NavStore = signalStore({ providedIn: "root" }, withState(initialState$3),
1231
1274
  router
1232
1275
  };
1233
1276
  }), withComputed((store) => {
1277
+ const assetStore = inject(AssetStore);
1234
1278
  const navWidgetMaps = inject(NAV_WIDGET_MAP, { optional: true });
1235
1279
  const anchorRouteNavId = computed(() => visibleNavId(store.routeNavId() ?? "root"), ...ngDevMode ? [{ debugName: "anchorRouteNavId" }] : /* istanbul ignore next */ []);
1236
1280
  const id = computed(() => store.menuNavId() ?? navIdFor(anchorRouteNavId(), store.murl()), ...ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []);
@@ -1276,7 +1320,7 @@ const NavStore = signalStore({ providedIn: "root" }, withState(initialState$3),
1276
1320
  const navMap = store.navMap();
1277
1321
  const listed = menuMounts();
1278
1322
  if (!listed.length) return navMap;
1279
- const configs = store.wcConfigMap();
1323
+ const identities = store.identityMap();
1280
1324
  const parentOf = ({ appNavId, urlMode }) => {
1281
1325
  const host = parentNavId(appNavId);
1282
1326
  return urlMode === "tail" && host && navMap[host] ? host : ROOT_NAV;
@@ -1284,7 +1328,7 @@ const NavStore = signalStore({ providedIn: "root" }, withState(initialState$3),
1284
1328
  const extra = listed.map((mount) => {
1285
1329
  const { name, appNavId, link } = mount;
1286
1330
  const fetched = navMap[appNavId];
1287
- const config = link ? configs[link] : void 0;
1331
+ const identity = link ? identities[link] : void 0;
1288
1332
  return {
1289
1333
  node: {
1290
1334
  ...fetched ?? {
@@ -1292,8 +1336,7 @@ const NavStore = signalStore({ providedIn: "root" }, withState(initialState$3),
1292
1336
  presentation: "static"
1293
1337
  },
1294
1338
  navId: appNavId,
1295
- title: config?.app ?? fetched?.title ?? name,
1296
- ...config?.logo ? { logo: config.logo } : {}
1339
+ title: identity?.name ?? fetched?.title ?? name
1297
1340
  },
1298
1341
  parent: parentOf(mount)
1299
1342
  };
@@ -1498,6 +1541,50 @@ const NavStore = signalStore({ providedIn: "root" }, withState(initialState$3),
1498
1541
  }, ...ngDevMode ? [{ debugName: "activeWcConfig" }] : /* istanbul ignore next */ []);
1499
1542
  const activeAppOpen = computed(() => !!activeWcConfig()?.open, ...ngDevMode ? [{ debugName: "activeAppOpen" }] : /* istanbul ignore next */ []);
1500
1543
  const currentWcConfig = computed(() => activeAppOpen() ? void 0 : activeWcConfig(), ...ngDevMode ? [{ debugName: "currentWcConfig" }] : /* istanbul ignore next */ []);
1544
+ const currentIdentity = computed(() => {
1545
+ const appLink = store.appLink();
1546
+ return appLink && !activeAppOpen() ? store.identityMap()[appLink] : void 0;
1547
+ }, ...ngDevMode ? [{ debugName: "currentIdentity" }] : /* istanbul ignore next */ []);
1548
+ const appLogoLink = computed(() => store.appLink() ?? assetStore.appLink(), ...ngDevMode ? [{ debugName: "appLogoLink" }] : /* istanbul ignore next */ []);
1549
+ const appLogo = computed(() => {
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
+ };
1560
+ const root = store.navMap()[ROOT_NAV];
1561
+ if (root?.logo) return {
1562
+ src: root.logo,
1563
+ name: root.title
1564
+ };
1565
+ return { name: identity?.name ?? appLink ?? root?.title };
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 */ []);
1501
1588
  const answeringNavId = (candidates, hit) => {
1502
1589
  if (hit) return hit.navId;
1503
1590
  const map = store.navMap();
@@ -1536,8 +1623,32 @@ const NavStore = signalStore({ providedIn: "root" }, withState(initialState$3),
1536
1623
  hasOwnContent: !!widgetConfig || !!emittedMenu?.length
1537
1624
  });
1538
1625
  }, ...ngDevMode ? [{ debugName: "breadcrumbResult" }] : /* istanbul ignore next */ []);
1539
- const breadcrumb = computed(() => breadcrumbResult().breadcrumb, ...ngDevMode ? [{ debugName: "breadcrumb" }] : /* istanbul ignore next */ []);
1540
- 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 */ []);
1541
1652
  return {
1542
1653
  id,
1543
1654
  allMounts,
@@ -1562,6 +1673,10 @@ const NavStore = signalStore({ providedIn: "root" }, withState(initialState$3),
1562
1673
  return false;
1563
1674
  }, ...ngDevMode ? [{ debugName: "navHasContent" }] : /* istanbul ignore next */ []),
1564
1675
  currentWcConfig,
1676
+ currentIdentity,
1677
+ appLogoLink,
1678
+ appLogo,
1679
+ appLogos,
1565
1680
  activeAppOpen,
1566
1681
  transparentNavIds,
1567
1682
  resolvedNavMenuConfig,
@@ -1572,6 +1687,7 @@ const NavStore = signalStore({ providedIn: "root" }, withState(initialState$3),
1572
1687
  };
1573
1688
  }), withMethods((store) => {
1574
1689
  const getNavService = inject(GetNavService);
1690
+ const appIdentityService = inject(AppIdentityService);
1575
1691
  const localDefaultNavId = inject(NAV_DEFAULT_MURL, { optional: true });
1576
1692
  const appBaseHref = inject(APP_BASE_HREF, { optional: true }) ?? "/";
1577
1693
  const location = inject(Location);
@@ -1755,6 +1871,15 @@ const NavStore = signalStore({ providedIn: "root" }, withState(initialState$3),
1755
1871
  } }));
1756
1872
  };
1757
1873
  const loadWcConfig = rxMethod(pipe(filter((appLink) => !!appLink), filter((appLink) => !untracked(() => !!store.wcConfigMap()[appLink])), switchMap((appLink) => getNavService.loadWcConfig(appLink).pipe(tap((config) => untracked(() => setWcConfig(appLink, config)))))));
1874
+ const setIdentity = (identity) => {
1875
+ patchState(store, (state) => ({ identityMap: {
1876
+ ...state.identityMap,
1877
+ [identity.link]: identity
1878
+ } }));
1879
+ };
1880
+ const loadIdentity = rxMethod(pipe(filter((appLink) => !!appLink), filter((appLink) => !untracked(() => !!store.identityMap()[appLink])), mergeMap((appLink) => appIdentityService.identity(appLink).pipe(tap((identity) => {
1881
+ if (identity) untracked(() => setIdentity(identity));
1882
+ })))));
1758
1883
  const setAppLink = (appLink, appNavId) => {
1759
1884
  patchState(store, {
1760
1885
  appLink,
@@ -1762,6 +1887,7 @@ const NavStore = signalStore({ providedIn: "root" }, withState(initialState$3),
1762
1887
  });
1763
1888
  settleRoute();
1764
1889
  loadWcConfig(appLink);
1890
+ loadIdentity(appLink);
1765
1891
  };
1766
1892
  const registerMount = (mount) => {
1767
1893
  const previous = untracked(() => store.mounts())[mount.name];
@@ -1777,6 +1903,7 @@ const NavStore = signalStore({ providedIn: "root" }, withState(initialState$3),
1777
1903
  settleRoute();
1778
1904
  translateService.mountRemoteApp(mount.link);
1779
1905
  loadWcConfig(mount.link);
1906
+ loadIdentity(mount.link);
1780
1907
  const standsOn = untracked(() => store.hostRoute()).navId === mount.appNavId;
1781
1908
  if (mount.createMenu || stale.length || standsOn) loadMountNav(mount);
1782
1909
  };
@@ -1879,6 +2006,8 @@ const NavStore = signalStore({ providedIn: "root" }, withState(initialState$3),
1879
2006
  mountOf,
1880
2007
  setWcConfig,
1881
2008
  loadWcConfig,
2009
+ setIdentity,
2010
+ loadIdentity,
1882
2011
  loadNav,
1883
2012
  registerWidgets,
1884
2013
  back,
@@ -1891,8 +2020,12 @@ const NavStore = signalStore({ providedIn: "root" }, withState(initialState$3),
1891
2020
  navIdChain
1892
2021
  };
1893
2022
  }), withHooks((store) => {
2023
+ const appLogoState = inject(AppLogoState);
1894
2024
  return { onInit() {
1895
2025
  store.syncFromRouter(store.navigationEnd);
2026
+ store.loadIdentity(store.appLogoLink);
2027
+ effect(() => appLogoState.set(store.appLogo()));
2028
+ effect(() => appLogoState.setLogos(store.appLogos()));
1896
2029
  const loadedFor = /* @__PURE__ */ new Set();
1897
2030
  effect(() => {
1898
2031
  const loaders = store.visibilityLoaders();
@@ -3002,7 +3135,8 @@ var ConfirmComponent = class ConfirmComponent {
3002
3135
  "size",
3003
3136
  "one",
3004
3137
  "baseUrl",
3005
- "remote"
3138
+ "remote",
3139
+ "shadow"
3006
3140
  ],
3007
3141
  outputs: ["configChange"]
3008
3142
  },
@@ -3340,6 +3474,7 @@ function initMagmoniumApp({ backend, authUrl, socketUrl }) {
3340
3474
  SharedStoreRegistry.setTranslateService(translateService);
3341
3475
  SharedStoreRegistry.setLoadingActions(loadingActions);
3342
3476
  SharedStoreRegistry.setNotificationStore(inject(NotificationStore));
3477
+ SharedStoreRegistry.setAppLogoState(inject(AppLogoState));
3343
3478
  if (navStore) SharedStoreRegistry.setNavStore(navStore);
3344
3479
  if (loginStore) SharedStoreRegistry.setLoginStore(loginStore);
3345
3480
  const effectiveBackend = backend || "http://localhost:8000";
@@ -4076,12 +4211,12 @@ var SectionFormItemComponent = class SectionFormItemComponent extends ConfigComp
4076
4211
  try {
4077
4212
  switch (type) {
4078
4213
  case InputType.RADIO: {
4079
- 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);
4080
4215
  this.createDynamicComponent(seq, RadioInputComponent);
4081
4216
  break;
4082
4217
  }
4083
4218
  case InputType.TOGGLE: {
4084
- const { ToggleInputComponent } = await import("./magmonium-one-toggle-BTK2lzqA.mjs");
4219
+ const { ToggleInputComponent } = await import("./magmonium-one-toggle-V_YnZXx5.mjs");
4085
4220
  this.createDynamicComponent(seq, ToggleInputComponent, [], true);
4086
4221
  break;
4087
4222
  }
@@ -4091,12 +4226,12 @@ var SectionFormItemComponent = class SectionFormItemComponent extends ConfigComp
4091
4226
  break;
4092
4227
  }
4093
4228
  case InputType.PASSWORD: {
4094
- const { PasswordInputComponent } = await import("./magmonium-one-password-BjqYmT1s.mjs");
4229
+ const { PasswordInputComponent } = await import("./magmonium-one-password-IdllPMUw.mjs");
4095
4230
  this.createDynamicComponent(seq, PasswordInputComponent);
4096
4231
  break;
4097
4232
  }
4098
4233
  case InputType.OTP: {
4099
- const { OtpInputComponent } = await import("./magmonium-one-otp-CE4L1RcG.mjs");
4234
+ const { OtpInputComponent } = await import("./magmonium-one-otp-V2tFztLx.mjs");
4100
4235
  this.createDynamicComponent(seq, OtpInputComponent);
4101
4236
  break;
4102
4237
  }
@@ -4106,7 +4241,7 @@ var SectionFormItemComponent = class SectionFormItemComponent extends ConfigComp
4106
4241
  break;
4107
4242
  }
4108
4243
  case InputType.CHECKBOX: {
4109
- 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);
4110
4245
  this.createDynamicComponent(seq, CheckboxInputComponent, [], true);
4111
4246
  break;
4112
4247
  }
@@ -4121,12 +4256,12 @@ var SectionFormItemComponent = class SectionFormItemComponent extends ConfigComp
4121
4256
  break;
4122
4257
  }
4123
4258
  case InputType.RANGE: {
4124
- 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);
4125
4260
  this.createDynamicComponent(seq, RangeInputComponent);
4126
4261
  break;
4127
4262
  }
4128
4263
  case InputType.MULTI_RANGE: {
4129
- 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);
4130
4265
  this.createDynamicComponent(seq, MultiRangeInputComponent);
4131
4266
  break;
4132
4267
  }
@@ -4177,7 +4312,7 @@ var SectionFormItemComponent = class SectionFormItemComponent extends ConfigComp
4177
4312
  break;
4178
4313
  }
4179
4314
  default: {
4180
- const { TextInputComponent } = await import("./magmonium-one-text-BL-1lWST.mjs").then((n) => n.n);
4315
+ const { TextInputComponent } = await import("./magmonium-one-text-BnTkYLJe.mjs").then((n) => n.n);
4181
4316
  this.createDynamicComponent(seq, TextInputComponent);
4182
4317
  break;
4183
4318
  }
@@ -6547,7 +6682,8 @@ var SectionBackComponent = class SectionBackComponent {
6547
6682
  "size",
6548
6683
  "one",
6549
6684
  "baseUrl",
6550
- "remote"
6685
+ "remote",
6686
+ "shadow"
6551
6687
  ],
6552
6688
  outputs: ["configChange"]
6553
6689
  },
@@ -6991,7 +7127,8 @@ var ActionComponent = class ActionComponent extends ButtonGroupComponent {
6991
7127
  "size",
6992
7128
  "one",
6993
7129
  "baseUrl",
6994
- "remote"
7130
+ "remote",
7131
+ "shadow"
6995
7132
  ],
6996
7133
  outputs: ["configChange"]
6997
7134
  },
@@ -7351,7 +7488,8 @@ var ClearableInputComponent = class ClearableInputComponent extends BaseTextInpu
7351
7488
  "size",
7352
7489
  "one",
7353
7490
  "baseUrl",
7354
- "remote"
7491
+ "remote",
7492
+ "shadow"
7355
7493
  ],
7356
7494
  outputs: ["configChange"]
7357
7495
  },
@@ -9527,7 +9665,8 @@ var SectionFilterMenuComponent = class SectionFilterMenuComponent {
9527
9665
  "size",
9528
9666
  "one",
9529
9667
  "baseUrl",
9530
- "remote"
9668
+ "remote",
9669
+ "shadow"
9531
9670
  ],
9532
9671
  outputs: ["configChange"]
9533
9672
  },
@@ -14577,7 +14716,8 @@ var AuthActivityPageComponent = class AuthActivityPageComponent {
14577
14716
  "size",
14578
14717
  "one",
14579
14718
  "baseUrl",
14580
- "remote"
14719
+ "remote",
14720
+ "shadow"
14581
14721
  ],
14582
14722
  outputs: ["configChange"]
14583
14723
  },
@@ -16723,8 +16863,8 @@ var SectionHeaderComponent = class SectionHeaderComponent {
16723
16863
  classAttribute: "m-section-header"
16724
16864
  },
16725
16865
  ngImport: i0,
16726
- 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",
16727
- 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"],
16728
16868
  dependencies: [
16729
16869
  {
16730
16870
  kind: "directive",
@@ -16778,7 +16918,8 @@ var SectionHeaderComponent = class SectionHeaderComponent {
16778
16918
  "size",
16779
16919
  "one",
16780
16920
  "baseUrl",
16781
- "remote"
16921
+ "remote",
16922
+ "shadow"
16782
16923
  ],
16783
16924
  outputs: ["configChange"]
16784
16925
  },
@@ -16855,8 +16996,8 @@ i0.ɵɵngDeclareClassMetadata({
16855
16996
  "[class.is-accordion]": "!!accordion()",
16856
16997
  "(click)": "onHeaderClick($event)"
16857
16998
  },
16858
- 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",
16859
- 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"]
16860
17001
  }]
16861
17002
  }],
16862
17003
  propDecorators: {
@@ -17310,7 +17451,8 @@ var SectionTableComponent = class SectionTableComponent extends ConfigComponent
17310
17451
  "size",
17311
17452
  "one",
17312
17453
  "baseUrl",
17313
- "remote"
17454
+ "remote",
17455
+ "shadow"
17314
17456
  ],
17315
17457
  outputs: ["configChange"]
17316
17458
  },
@@ -18418,7 +18560,8 @@ var TextareaInputComponent = class TextareaInputComponent extends BaseTextInputC
18418
18560
  "size",
18419
18561
  "one",
18420
18562
  "baseUrl",
18421
- "remote"
18563
+ "remote",
18564
+ "shadow"
18422
18565
  ],
18423
18566
  outputs: ["configChange"]
18424
18567
  }
@@ -21372,7 +21515,8 @@ var ColorPickerInputComponent = class ColorPickerInputComponent extends BaseText
21372
21515
  "size",
21373
21516
  "one",
21374
21517
  "baseUrl",
21375
- "remote"
21518
+ "remote",
21519
+ "shadow"
21376
21520
  ],
21377
21521
  outputs: ["configChange"]
21378
21522
  },
@@ -21637,12 +21781,12 @@ var WrapperInputComponent = class WrapperInputComponent extends ConfigComponent
21637
21781
  const seq = ++this.dynamicSeq;
21638
21782
  switch (this.config()?.type) {
21639
21783
  case InputType.RADIO: {
21640
- 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);
21641
21785
  this.createDynamicComponent(seq, RadioInputComponent);
21642
21786
  break;
21643
21787
  }
21644
21788
  case InputType.TOGGLE: {
21645
- const { ToggleInputComponent } = await import("./magmonium-one-toggle-BTK2lzqA.mjs");
21789
+ const { ToggleInputComponent } = await import("./magmonium-one-toggle-V_YnZXx5.mjs");
21646
21790
  this.createDynamicComponent(seq, ToggleInputComponent, [], true);
21647
21791
  break;
21648
21792
  }
@@ -21652,12 +21796,12 @@ var WrapperInputComponent = class WrapperInputComponent extends ConfigComponent
21652
21796
  break;
21653
21797
  }
21654
21798
  case InputType.PASSWORD: {
21655
- const { PasswordInputComponent } = await import("./magmonium-one-password-BjqYmT1s.mjs");
21799
+ const { PasswordInputComponent } = await import("./magmonium-one-password-IdllPMUw.mjs");
21656
21800
  this.createDynamicComponent(seq, PasswordInputComponent);
21657
21801
  break;
21658
21802
  }
21659
21803
  case InputType.OTP: {
21660
- const { OtpInputComponent } = await import("./magmonium-one-otp-CE4L1RcG.mjs");
21804
+ const { OtpInputComponent } = await import("./magmonium-one-otp-V2tFztLx.mjs");
21661
21805
  this.createDynamicComponent(seq, OtpInputComponent);
21662
21806
  break;
21663
21807
  }
@@ -21667,7 +21811,7 @@ var WrapperInputComponent = class WrapperInputComponent extends ConfigComponent
21667
21811
  break;
21668
21812
  }
21669
21813
  case InputType.CHECKBOX: {
21670
- 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);
21671
21815
  this.createDynamicComponent(seq, CheckboxInputComponent, [], true);
21672
21816
  break;
21673
21817
  }
@@ -21682,12 +21826,12 @@ var WrapperInputComponent = class WrapperInputComponent extends ConfigComponent
21682
21826
  break;
21683
21827
  }
21684
21828
  case InputType.RANGE: {
21685
- 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);
21686
21830
  this.createDynamicComponent(seq, RangeInputComponent);
21687
21831
  break;
21688
21832
  }
21689
21833
  case InputType.MULTI_RANGE: {
21690
- 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);
21691
21835
  this.createDynamicComponent(seq, MultiRangeInputComponent);
21692
21836
  break;
21693
21837
  }
@@ -21738,7 +21882,7 @@ var WrapperInputComponent = class WrapperInputComponent extends ConfigComponent
21738
21882
  break;
21739
21883
  }
21740
21884
  default: {
21741
- const { TextInputComponent } = await import("./magmonium-one-text-BL-1lWST.mjs").then((n) => n.n);
21885
+ const { TextInputComponent } = await import("./magmonium-one-text-BnTkYLJe.mjs").then((n) => n.n);
21742
21886
  this.createDynamicComponent(seq, TextInputComponent);
21743
21887
  break;
21744
21888
  }
@@ -22669,7 +22813,8 @@ var ToggleRadioInputComponent = class ToggleRadioInputComponent extends BaseText
22669
22813
  "size",
22670
22814
  "one",
22671
22815
  "baseUrl",
22672
- "remote"
22816
+ "remote",
22817
+ "shadow"
22673
22818
  ],
22674
22819
  outputs: ["configChange"]
22675
22820
  },
@@ -23037,7 +23182,8 @@ var SelectableCardInputComponent = class SelectableCardInputComponent extends Ba
23037
23182
  "size",
23038
23183
  "one",
23039
23184
  "baseUrl",
23040
- "remote"
23185
+ "remote",
23186
+ "shadow"
23041
23187
  ],
23042
23188
  outputs: ["configChange"]
23043
23189
  },
@@ -24054,7 +24200,7 @@ var FileUploadInputComponent = class FileUploadInputComponent extends BaseInputC
24054
24200
  openEditor = async (file, size) => {
24055
24201
  const modalStore = this.modalStore;
24056
24202
  if (!modalStore) return void 0;
24057
- const { ImageEditorComponent } = await import("./magmonium-one-image-editor-Dn0ACfH0.mjs");
24203
+ const { ImageEditorComponent } = await import("./magmonium-one-image-editor-BRTk8i4O.mjs");
24058
24204
  const ratio = String(this.config()?.ratio ?? "");
24059
24205
  return new Promise((resolve) => {
24060
24206
  const modalRef = new ModalRef();
@@ -24293,7 +24439,8 @@ var FileUploadInputComponent = class FileUploadInputComponent extends BaseInputC
24293
24439
  "size",
24294
24440
  "one",
24295
24441
  "baseUrl",
24296
- "remote"
24442
+ "remote",
24443
+ "shadow"
24297
24444
  ],
24298
24445
  outputs: ["configChange"]
24299
24446
  },
@@ -24734,7 +24881,8 @@ var ListComponent = class ListComponent extends ConfigComponent {
24734
24881
  "size",
24735
24882
  "one",
24736
24883
  "baseUrl",
24737
- "remote"
24884
+ "remote",
24885
+ "shadow"
24738
24886
  ],
24739
24887
  outputs: ["configChange"]
24740
24888
  },
@@ -25784,7 +25932,8 @@ var StepComponent = class StepComponent {
25784
25932
  "size",
25785
25933
  "one",
25786
25934
  "baseUrl",
25787
- "remote"
25935
+ "remote",
25936
+ "shadow"
25788
25937
  ],
25789
25938
  outputs: ["configChange"]
25790
25939
  },
@@ -27164,7 +27313,8 @@ var DashboardCardComponent = class DashboardCardComponent {
27164
27313
  "size",
27165
27314
  "one",
27166
27315
  "baseUrl",
27167
- "remote"
27316
+ "remote",
27317
+ "shadow"
27168
27318
  ],
27169
27319
  outputs: ["configChange"]
27170
27320
  },
@@ -27656,7 +27806,8 @@ var WatermarkComponent = class WatermarkComponent extends ConfigComponent {
27656
27806
  "size",
27657
27807
  "one",
27658
27808
  "baseUrl",
27659
- "remote"
27809
+ "remote",
27810
+ "shadow"
27660
27811
  ],
27661
27812
  outputs: ["configChange"]
27662
27813
  }, {
@@ -27935,7 +28086,8 @@ var TechnicalMeterComponent = class TechnicalMeterComponent {
27935
28086
  "size",
27936
28087
  "one",
27937
28088
  "baseUrl",
27938
- "remote"
28089
+ "remote",
28090
+ "shadow"
27939
28091
  ],
27940
28092
  outputs: ["configChange"]
27941
28093
  },
@@ -29106,6 +29258,7 @@ var RemoteComponent = class RemoteComponent {
29106
29258
  navRef = inject(NAV_STORE_REF, { optional: true });
29107
29259
  reloadPage = inject(REMOTE_PAGE_RELOAD);
29108
29260
  assetStore = inject(AssetStore);
29261
+ appLogoState = inject(AppLogoState);
29109
29262
  loadedElement;
29110
29263
  loadId = 0;
29111
29264
  mountedLink;
@@ -29140,7 +29293,13 @@ var RemoteComponent = class RemoteComponent {
29140
29293
  return navUrl === void 0 ? void 0 : `${navUrl}${this.hostQuery()}`;
29141
29294
  }, ...ngDevMode ? [{ debugName: "remotePath" }] : /* istanbul ignore next */ []);
29142
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 */ []);
29143
29301
  constructor() {
29302
+ effect(() => paintAppColor(this.elementRef.nativeElement, this.appColor()));
29144
29303
  effect(() => {
29145
29304
  this.loginStore?.isLoggedIn();
29146
29305
  const config = this.config();
@@ -29516,7 +29675,8 @@ var RemoteComponent = class RemoteComponent {
29516
29675
  "size",
29517
29676
  "one",
29518
29677
  "baseUrl",
29519
- "remote"
29678
+ "remote",
29679
+ "shadow"
29520
29680
  ],
29521
29681
  outputs: ["configChange"]
29522
29682
  },
@@ -30065,7 +30225,8 @@ var PluginComponent = class PluginComponent {
30065
30225
  "size",
30066
30226
  "one",
30067
30227
  "baseUrl",
30068
- "remote"
30228
+ "remote",
30229
+ "shadow"
30069
30230
  ],
30070
30231
  outputs: ["configChange"]
30071
30232
  }, {
@@ -31098,7 +31259,8 @@ var SortComponent = class SortComponent extends ConfigComponent {
31098
31259
  "size",
31099
31260
  "one",
31100
31261
  "baseUrl",
31101
- "remote"
31262
+ "remote",
31263
+ "shadow"
31102
31264
  ],
31103
31265
  outputs: ["configChange"]
31104
31266
  },
@@ -33310,7 +33472,8 @@ var TableBodyComponent = class TableBodyComponent {
33310
33472
  "size",
33311
33473
  "one",
33312
33474
  "baseUrl",
33313
- "remote"
33475
+ "remote",
33476
+ "shadow"
33314
33477
  ],
33315
33478
  outputs: ["configChange"]
33316
33479
  },
@@ -35690,7 +35853,8 @@ var TreeGridComponent = class TreeGridComponent extends ConfigComponent {
35690
35853
  "size",
35691
35854
  "one",
35692
35855
  "baseUrl",
35693
- "remote"
35856
+ "remote",
35857
+ "shadow"
35694
35858
  ],
35695
35859
  outputs: ["configChange"]
35696
35860
  },
@@ -36538,7 +36702,8 @@ var SummaryComponent = class SummaryComponent extends ConfigComponent {
36538
36702
  "size",
36539
36703
  "one",
36540
36704
  "baseUrl",
36541
- "remote"
36705
+ "remote",
36706
+ "shadow"
36542
36707
  ],
36543
36708
  outputs: ["configChange"]
36544
36709
  },
@@ -36833,7 +36998,8 @@ var AccordionComponent = class AccordionComponent extends ConfigComponent {
36833
36998
  "size",
36834
36999
  "one",
36835
37000
  "baseUrl",
36836
- "remote"
37001
+ "remote",
37002
+ "shadow"
36837
37003
  ],
36838
37004
  outputs: ["configChange"]
36839
37005
  },
@@ -37629,7 +37795,8 @@ var NothingComponent = class NothingComponent {
37629
37795
  "size",
37630
37796
  "one",
37631
37797
  "baseUrl",
37632
- "remote"
37798
+ "remote",
37799
+ "shadow"
37633
37800
  ],
37634
37801
  outputs: ["configChange"]
37635
37802
  },
@@ -37810,6 +37977,140 @@ i0.ɵɵngDeclareClassMetadata({
37810
37977
  args: ["inner", { isSignal: true }]
37811
37978
  }] }
37812
37979
  });
37980
+ var AppLogoComponent = class AppLogoComponent {
37981
+ glyph = input(...ngDevMode ? [void 0, { debugName: "glyph" }] : /* istanbul ignore next */ []);
37982
+ appColor = input(...ngDevMode ? [void 0, { debugName: "appColor" }] : /* istanbul ignore next */ []);
37983
+ name = input(...ngDevMode ? [void 0, { debugName: "name" }] : /* istanbul ignore next */ []);
37984
+ color = computed(() => {
37985
+ const value = this.appColor();
37986
+ return value ? normalizeAppColor(value) ?? null : null;
37987
+ }, ...ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []);
37988
+ shadow = computed(() => {
37989
+ const color = this.color();
37990
+ return color ? appLogoShadowColor(color) : null;
37991
+ }, ...ngDevMode ? [{ debugName: "shadow" }] : /* istanbul ignore next */ []);
37992
+ mask = computed(() => {
37993
+ const glyph = this.glyph();
37994
+ return glyph ? logoGlyphMaskUrl(glyph) : void 0;
37995
+ }, ...ngDevMode ? [{ debugName: "mask" }] : /* istanbul ignore next */ []);
37996
+ letter = computed(() => (this.name()?.trim().charAt(0) ?? "").toUpperCase(), ...ngDevMode ? [{ debugName: "letter" }] : /* istanbul ignore next */ []);
37997
+ static ɵfac = i0.ɵɵngDeclareFactory({
37998
+ minVersion: "12.0.0",
37999
+ version: "22.2.1",
38000
+ ngImport: i0,
38001
+ type: AppLogoComponent,
38002
+ deps: [],
38003
+ target: i0.ɵɵFactoryTarget.Component
38004
+ });
38005
+ static ɵcmp = i0.ɵɵngDeclareComponent({
38006
+ minVersion: "17.0.0",
38007
+ version: "22.2.1",
38008
+ type: AppLogoComponent,
38009
+ isStandalone: true,
38010
+ selector: "m-app-logo",
38011
+ inputs: {
38012
+ glyph: {
38013
+ classPropertyName: "glyph",
38014
+ publicName: "glyph",
38015
+ isSignal: true,
38016
+ isRequired: false,
38017
+ transformFunction: null
38018
+ },
38019
+ appColor: {
38020
+ classPropertyName: "appColor",
38021
+ publicName: "appColor",
38022
+ isSignal: true,
38023
+ isRequired: false,
38024
+ transformFunction: null
38025
+ },
38026
+ name: {
38027
+ classPropertyName: "name",
38028
+ publicName: "name",
38029
+ isSignal: true,
38030
+ isRequired: false,
38031
+ transformFunction: null
38032
+ }
38033
+ },
38034
+ host: {
38035
+ attributes: { "role": "img" },
38036
+ properties: {
38037
+ "attr.aria-label": "name() || null",
38038
+ "style.--m-app-logo-color": "color()",
38039
+ "style.--m-app-logo-shadow": "shadow()"
38040
+ },
38041
+ classAttribute: "m-app-logo"
38042
+ },
38043
+ ngImport: i0,
38044
+ template: `
38045
+ <span class="m-app-logo__mark">
38046
+ @if (mask(); as url) {
38047
+ <span class="m-app-logo__glyph" [style.mask-image]="url"></span>
38048
+ } @else {
38049
+ <span class="m-app-logo__letter">{{ letter() }}</span>
38050
+ }
38051
+ </span>
38052
+ `,
38053
+ isInline: true,
38054
+ styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}:host{display:inline-flex;align-items:center;justify-content:center;width:100%;height:100%;aspect-ratio:1;container-type:size;border-radius:22%;overflow:hidden;background:var(--m-app-logo-color, var(--m-text-quaternary))}.m-app-logo__mark{display:flex;align-items:center;justify-content:center;width:100%;height:100%;filter:drop-shadow(0 4cqmin 3cqmin var(--m-app-logo-shadow, rgba(0, 0, 0, .25)))}.m-app-logo__glyph{width:60%;height:60%;background:#fff;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:center;mask-position:center;-webkit-mask-size:contain;mask-size:contain}.m-app-logo__letter{color:#fff;font-size:50cqmin;font-weight:700;line-height:1}\n"],
38055
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
38056
+ });
38057
+ };
38058
+ i0.ɵɵngDeclareClassMetadata({
38059
+ minVersion: "12.0.0",
38060
+ version: "22.2.1",
38061
+ ngImport: i0,
38062
+ type: AppLogoComponent,
38063
+ decorators: [{
38064
+ type: Component,
38065
+ args: [{
38066
+ selector: "m-app-logo",
38067
+ template: `
38068
+ <span class="m-app-logo__mark">
38069
+ @if (mask(); as url) {
38070
+ <span class="m-app-logo__glyph" [style.mask-image]="url"></span>
38071
+ } @else {
38072
+ <span class="m-app-logo__letter">{{ letter() }}</span>
38073
+ }
38074
+ </span>
38075
+ `,
38076
+ changeDetection: ChangeDetectionStrategy.OnPush,
38077
+ host: {
38078
+ class: "m-app-logo",
38079
+ role: "img",
38080
+ "[attr.aria-label]": "name() || null",
38081
+ "[style.--m-app-logo-color]": "color()",
38082
+ "[style.--m-app-logo-shadow]": "shadow()"
38083
+ },
38084
+ styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}:host{display:inline-flex;align-items:center;justify-content:center;width:100%;height:100%;aspect-ratio:1;container-type:size;border-radius:22%;overflow:hidden;background:var(--m-app-logo-color, var(--m-text-quaternary))}.m-app-logo__mark{display:flex;align-items:center;justify-content:center;width:100%;height:100%;filter:drop-shadow(0 4cqmin 3cqmin var(--m-app-logo-shadow, rgba(0, 0, 0, .25)))}.m-app-logo__glyph{width:60%;height:60%;background:#fff;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:center;mask-position:center;-webkit-mask-size:contain;mask-size:contain}.m-app-logo__letter{color:#fff;font-size:50cqmin;font-weight:700;line-height:1}\n"]
38085
+ }]
38086
+ }],
38087
+ propDecorators: {
38088
+ glyph: [{
38089
+ type: i0.Input,
38090
+ args: [{
38091
+ isSignal: true,
38092
+ alias: "glyph",
38093
+ required: false
38094
+ }]
38095
+ }],
38096
+ appColor: [{
38097
+ type: i0.Input,
38098
+ args: [{
38099
+ isSignal: true,
38100
+ alias: "appColor",
38101
+ required: false
38102
+ }]
38103
+ }],
38104
+ name: [{
38105
+ type: i0.Input,
38106
+ args: [{
38107
+ isSignal: true,
38108
+ alias: "name",
38109
+ required: false
38110
+ }]
38111
+ }]
38112
+ }
38113
+ });
37813
38114
  var AppCardComponent = class AppCardComponent {
37814
38115
  app = input.required(...ngDevMode ? [{ debugName: "app" }] : /* istanbul ignore next */ []);
37815
38116
  variant = input("card", ...ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []);
@@ -37875,8 +38176,8 @@ var AppCardComponent = class AppCardComponent {
37875
38176
  },
37876
38177
  ngImport: i0,
37877
38178
  template: `
37878
- <div [class]="'app-card app-card--' + variant()" [style.--app-accent]="app().accentColor" (click)="cardClick.emit(app())" role="button" tabindex="0">
37879
- @if (app().accentColor && variant() === 'card') {
38179
+ <div [class]="'app-card app-card--' + variant()" [style.--app-accent]="app().appColor" (click)="cardClick.emit(app())" role="button" tabindex="0">
38180
+ @if (app().appColor && variant() === 'card') {
37880
38181
  <div class="app-card__accent"></div>
37881
38182
  }
37882
38183
 
@@ -37885,17 +38186,13 @@ var AppCardComponent = class AppCardComponent {
37885
38186
  }
37886
38187
 
37887
38188
  <div class="app-card__icon-wrap">
37888
- <m-img [src]="app().iconUrl" [remote]="app().remote" [alt]="app().name" onerror="this.src='assets/icons/default-app.svg'; this.onerror=null;" />
38189
+ <m-app-logo [glyph]="app().logoGlyph" [appColor]="app().appColor" [name]="app().name" />
37889
38190
  </div>
37890
38191
 
37891
38192
  <div class="app-card__body">
37892
38193
  <div class="app-card__main-info">
37893
38194
  <span class="app-card__name">{{ app().name }}</span>
37894
38195
 
37895
- @if (variant() === 'row' || variant() === 'card') {
37896
- <span class="app-card__company">{{ app().company }}</span>
37897
- }
37898
-
37899
38196
  @if (variant() === 'row') {
37900
38197
  <span class="app-card__version">{{ app().version }}</span>
37901
38198
  }
@@ -37924,24 +38221,16 @@ var AppCardComponent = class AppCardComponent {
37924
38221
  </div>
37925
38222
  `,
37926
38223
  isInline: true,
37927
- 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)}}.app-card{position:relative;display:flex;border-radius:1.25rem;background:var(--m-backdrop-card, rgba(255, 255, 255, .25));-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);border:1px solid var(--m-border, rgba(255, 255, 255, .4));padding:1rem;gap:1rem;cursor:pointer;transition:all .3s cubic-bezier(.16,1,.3,1);outline:none;overflow:hidden}.app-card:hover{transform:translateY(-4px);box-shadow:0 12px 24px -8px var(--m-backdrop-shadow, rgba(0, 0, 0, .1));border-color:var(--m-focus, rgba(65, 105, 225, .4))}.app-card--small{padding:.75rem;gap:.75rem;align-items:center}.app-card--small .app-card__icon-wrap{width:2.5rem;height:2.5rem;border-radius:.75rem}.app-card--small .app-card__name{font-size:.875rem;font-weight:700}.app-card--tile{flex-direction:column;align-items:center;justify-content:center;padding:.875rem;gap:.5rem}.app-card--tile .app-card__icon-wrap{width:3.5rem;height:3.5rem;border-radius:1rem}.app-card--tile .app-card__body{align-items:center;text-align:center}.app-card--tile .app-card__main-info{align-items:center}.app-card--tile .app-card__name{font-size:.8125rem;font-weight:600;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;word-break:break-word}.app-card--row{align-items:center}.app-card--row .app-card__icon-wrap{width:3.25rem;height:3.25rem;border-radius:.875rem}.app-card--row .app-card__main-info{display:flex;flex-direction:column;gap:.125rem}.app-card--row .app-card__name{font-size:.9375rem;font-weight:700}.app-card--row .app-card__company,.app-card--row .app-card__version{font-size:.75rem;color:var(--m-text-secondary, #64748b)}.app-card--card{flex-direction:column;padding:1.25rem;min-height:12rem}.app-card--card .app-card__accent{position:absolute;top:0;left:0;right:0;height:4px;background:var(--app-accent, var(--m-focus, #4169e1))}.app-card--card .app-card__icon-wrap{width:3.75rem;height:3.75rem;border-radius:1.125rem;background:var(--app-accent, var(--m-frame, #e0e7ff));opacity:.9}.app-card--card .app-card__icon-wrap:before{content:\"\";position:absolute;inset:0;background:var(--app-accent);opacity:.15}.app-card--card .app-card__body{flex:1;display:flex;flex-direction:column;gap:.5rem}.app-card--card .app-card__name{font-size:1.125rem;font-weight:800}.app-card--card .app-card__company{font-size:.8125rem;color:var(--m-text-secondary, #64748b);font-weight:600}.app-card--card .app-card__desc{font-size:.875rem;color:var(--m-text-secondary, #64748b);line-height:1.4;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;margin:.25rem 0}.app-card--card .app-card__footer{margin-top:auto;display:flex;align-items:center;justify-content:space-between;gap:.5rem}.app-card--card .app-card__version-badge{font-size:.6875rem;font-weight:700;background:var(--m-background-lite, rgba(0, 0, 0, .05));padding:.125rem .5rem;border-radius:9999px;color:var(--m-text-secondary, #64748b)}.app-card--card .app-card__updated{font-size:.6875rem;color:var(--m-text-tertiary, #94a3b8)}.app-card__badge{position:absolute;top:.75rem;right:.75rem;min-width:1.375rem;height:1.375rem;padding:0 .375rem;background:var(--m-error, #f43f5e);color:#fff;border-radius:9999px;font-size:.625rem;font-weight:800;display:flex;align-items:center;justify-content:center;box-shadow:0 4px 12px #f43f5e66;z-index:2}.app-card__icon-wrap{flex-shrink:0;overflow:hidden;background:var(--m-frame, #f1f5f9);display:flex;align-items:center;justify-content:center}.app-card__icon-wrap img,.app-card__icon-wrap m-img{width:60%;height:60%;object-fit:contain}.app-card__body{min-width:0}.app-card__actions{margin-left:auto;display:flex;align-items:center}.app-card--card .app-card__actions{position:absolute;bottom:1.25rem;right:1.25rem}\n"],
38224
+ 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)}}.app-card{position:relative;display:flex;border-radius:1.25rem;background:var(--m-backdrop-card, rgba(255, 255, 255, .25));-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);border:1px solid var(--m-border, rgba(255, 255, 255, .4));padding:1rem;gap:1rem;cursor:pointer;transition:all .3s cubic-bezier(.16,1,.3,1);outline:none;overflow:hidden}.app-card:hover{transform:translateY(-4px);box-shadow:0 12px 24px -8px var(--m-backdrop-shadow, rgba(0, 0, 0, .1));border-color:var(--m-focus, rgba(65, 105, 225, .4))}.app-card--small{padding:.75rem;gap:.75rem;align-items:center}.app-card--small .app-card__icon-wrap{width:2.5rem;height:2.5rem;border-radius:.75rem}.app-card--small .app-card__name{font-size:.875rem;font-weight:700}.app-card--tile{flex-direction:column;align-items:center;justify-content:center;padding:.875rem;gap:.5rem}.app-card--tile .app-card__icon-wrap{width:3.5rem;height:3.5rem;border-radius:1rem}.app-card--tile .app-card__body{align-items:center;text-align:center}.app-card--tile .app-card__main-info{align-items:center}.app-card--tile .app-card__name{font-size:.8125rem;font-weight:600;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;word-break:break-word}.app-card--row{align-items:center}.app-card--row .app-card__icon-wrap{width:3.25rem;height:3.25rem;border-radius:.875rem}.app-card--row .app-card__main-info{display:flex;flex-direction:column;gap:.125rem}.app-card--row .app-card__name{font-size:.9375rem;font-weight:700}.app-card--row .app-card__version{font-size:.75rem;color:var(--m-text-secondary, #64748b)}.app-card--card{flex-direction:column;padding:1.25rem;min-height:12rem}.app-card--card .app-card__accent{position:absolute;top:0;left:0;right:0;height:4px;background:var(--app-accent, var(--m-focus, #4169e1))}.app-card--card .app-card__icon-wrap{width:3.75rem;height:3.75rem;border-radius:1.125rem;background:var(--app-accent, var(--m-frame, #e0e7ff));opacity:.9}.app-card--card .app-card__icon-wrap:before{content:\"\";position:absolute;inset:0;background:var(--app-accent);opacity:.15}.app-card--card .app-card__body{flex:1;display:flex;flex-direction:column;gap:.5rem}.app-card--card .app-card__name{font-size:1.125rem;font-weight:800}.app-card--card .app-card__desc{font-size:.875rem;color:var(--m-text-secondary, #64748b);line-height:1.4;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;margin:.25rem 0}.app-card--card .app-card__footer{margin-top:auto;display:flex;align-items:center;justify-content:space-between;gap:.5rem}.app-card--card .app-card__version-badge{font-size:.6875rem;font-weight:700;background:var(--m-background-lite, rgba(0, 0, 0, .05));padding:.125rem .5rem;border-radius:9999px;color:var(--m-text-secondary, #64748b)}.app-card--card .app-card__updated{font-size:.6875rem;color:var(--m-text-tertiary, #94a3b8)}.app-card__badge{position:absolute;top:.75rem;right:.75rem;min-width:1.375rem;height:1.375rem;padding:0 .375rem;background:var(--m-error, #f43f5e);color:#fff;border-radius:9999px;font-size:.625rem;font-weight:800;display:flex;align-items:center;justify-content:center;box-shadow:0 4px 12px #f43f5e66;z-index:2}.app-card__icon-wrap{flex-shrink:0;overflow:hidden;background:var(--m-frame, #f1f5f9);display:flex;align-items:center;justify-content:center}.app-card__icon-wrap img,.app-card__icon-wrap m-img{width:60%;height:60%;object-fit:contain}.app-card__body{min-width:0}.app-card__actions{margin-left:auto;display:flex;align-items:center}.app-card--card .app-card__actions{position:absolute;bottom:1.25rem;right:1.25rem}\n"],
37928
38225
  dependencies: [
37929
38226
  {
37930
38227
  kind: "component",
37931
- type: ImgComponent,
37932
- selector: "m-img",
38228
+ type: AppLogoComponent,
38229
+ selector: "m-app-logo",
37933
38230
  inputs: [
37934
- "src",
37935
- "data",
37936
- "dataType",
37937
- "alt",
37938
- "priority",
37939
- "fill",
37940
- "width",
37941
- "height",
37942
- "remote",
37943
- "ngSrcset",
37944
- "sizes"
38231
+ "glyph",
38232
+ "appColor",
38233
+ "name"
37945
38234
  ]
37946
38235
  },
37947
38236
  {
@@ -37989,7 +38278,8 @@ var AppCardComponent = class AppCardComponent {
37989
38278
  "size",
37990
38279
  "one",
37991
38280
  "baseUrl",
37992
- "remote"
38281
+ "remote",
38282
+ "shadow"
37993
38283
  ],
37994
38284
  outputs: ["configChange"]
37995
38285
  },
@@ -38013,14 +38303,14 @@ i0.ɵɵngDeclareClassMetadata({
38013
38303
  selector: "m-app-card",
38014
38304
  changeDetection: ChangeDetectionStrategy.OnPush,
38015
38305
  imports: [
38016
- ImgComponent,
38306
+ AppLogoComponent,
38017
38307
  ButtonComponent,
38018
38308
  TranslatePipe,
38019
38309
  IconComponent
38020
38310
  ],
38021
38311
  template: `
38022
- <div [class]="'app-card app-card--' + variant()" [style.--app-accent]="app().accentColor" (click)="cardClick.emit(app())" role="button" tabindex="0">
38023
- @if (app().accentColor && variant() === 'card') {
38312
+ <div [class]="'app-card app-card--' + variant()" [style.--app-accent]="app().appColor" (click)="cardClick.emit(app())" role="button" tabindex="0">
38313
+ @if (app().appColor && variant() === 'card') {
38024
38314
  <div class="app-card__accent"></div>
38025
38315
  }
38026
38316
 
@@ -38029,17 +38319,13 @@ i0.ɵɵngDeclareClassMetadata({
38029
38319
  }
38030
38320
 
38031
38321
  <div class="app-card__icon-wrap">
38032
- <m-img [src]="app().iconUrl" [remote]="app().remote" [alt]="app().name" onerror="this.src='assets/icons/default-app.svg'; this.onerror=null;" />
38322
+ <m-app-logo [glyph]="app().logoGlyph" [appColor]="app().appColor" [name]="app().name" />
38033
38323
  </div>
38034
38324
 
38035
38325
  <div class="app-card__body">
38036
38326
  <div class="app-card__main-info">
38037
38327
  <span class="app-card__name">{{ app().name }}</span>
38038
38328
 
38039
- @if (variant() === 'row' || variant() === 'card') {
38040
- <span class="app-card__company">{{ app().company }}</span>
38041
- }
38042
-
38043
38329
  @if (variant() === 'row') {
38044
38330
  <span class="app-card__version">{{ app().version }}</span>
38045
38331
  }
@@ -38067,7 +38353,7 @@ i0.ɵɵngDeclareClassMetadata({
38067
38353
  }
38068
38354
  </div>
38069
38355
  `,
38070
- 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)}}.app-card{position:relative;display:flex;border-radius:1.25rem;background:var(--m-backdrop-card, rgba(255, 255, 255, .25));-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);border:1px solid var(--m-border, rgba(255, 255, 255, .4));padding:1rem;gap:1rem;cursor:pointer;transition:all .3s cubic-bezier(.16,1,.3,1);outline:none;overflow:hidden}.app-card:hover{transform:translateY(-4px);box-shadow:0 12px 24px -8px var(--m-backdrop-shadow, rgba(0, 0, 0, .1));border-color:var(--m-focus, rgba(65, 105, 225, .4))}.app-card--small{padding:.75rem;gap:.75rem;align-items:center}.app-card--small .app-card__icon-wrap{width:2.5rem;height:2.5rem;border-radius:.75rem}.app-card--small .app-card__name{font-size:.875rem;font-weight:700}.app-card--tile{flex-direction:column;align-items:center;justify-content:center;padding:.875rem;gap:.5rem}.app-card--tile .app-card__icon-wrap{width:3.5rem;height:3.5rem;border-radius:1rem}.app-card--tile .app-card__body{align-items:center;text-align:center}.app-card--tile .app-card__main-info{align-items:center}.app-card--tile .app-card__name{font-size:.8125rem;font-weight:600;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;word-break:break-word}.app-card--row{align-items:center}.app-card--row .app-card__icon-wrap{width:3.25rem;height:3.25rem;border-radius:.875rem}.app-card--row .app-card__main-info{display:flex;flex-direction:column;gap:.125rem}.app-card--row .app-card__name{font-size:.9375rem;font-weight:700}.app-card--row .app-card__company,.app-card--row .app-card__version{font-size:.75rem;color:var(--m-text-secondary, #64748b)}.app-card--card{flex-direction:column;padding:1.25rem;min-height:12rem}.app-card--card .app-card__accent{position:absolute;top:0;left:0;right:0;height:4px;background:var(--app-accent, var(--m-focus, #4169e1))}.app-card--card .app-card__icon-wrap{width:3.75rem;height:3.75rem;border-radius:1.125rem;background:var(--app-accent, var(--m-frame, #e0e7ff));opacity:.9}.app-card--card .app-card__icon-wrap:before{content:\"\";position:absolute;inset:0;background:var(--app-accent);opacity:.15}.app-card--card .app-card__body{flex:1;display:flex;flex-direction:column;gap:.5rem}.app-card--card .app-card__name{font-size:1.125rem;font-weight:800}.app-card--card .app-card__company{font-size:.8125rem;color:var(--m-text-secondary, #64748b);font-weight:600}.app-card--card .app-card__desc{font-size:.875rem;color:var(--m-text-secondary, #64748b);line-height:1.4;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;margin:.25rem 0}.app-card--card .app-card__footer{margin-top:auto;display:flex;align-items:center;justify-content:space-between;gap:.5rem}.app-card--card .app-card__version-badge{font-size:.6875rem;font-weight:700;background:var(--m-background-lite, rgba(0, 0, 0, .05));padding:.125rem .5rem;border-radius:9999px;color:var(--m-text-secondary, #64748b)}.app-card--card .app-card__updated{font-size:.6875rem;color:var(--m-text-tertiary, #94a3b8)}.app-card__badge{position:absolute;top:.75rem;right:.75rem;min-width:1.375rem;height:1.375rem;padding:0 .375rem;background:var(--m-error, #f43f5e);color:#fff;border-radius:9999px;font-size:.625rem;font-weight:800;display:flex;align-items:center;justify-content:center;box-shadow:0 4px 12px #f43f5e66;z-index:2}.app-card__icon-wrap{flex-shrink:0;overflow:hidden;background:var(--m-frame, #f1f5f9);display:flex;align-items:center;justify-content:center}.app-card__icon-wrap img,.app-card__icon-wrap m-img{width:60%;height:60%;object-fit:contain}.app-card__body{min-width:0}.app-card__actions{margin-left:auto;display:flex;align-items:center}.app-card--card .app-card__actions{position:absolute;bottom:1.25rem;right:1.25rem}\n"]
38356
+ 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)}}.app-card{position:relative;display:flex;border-radius:1.25rem;background:var(--m-backdrop-card, rgba(255, 255, 255, .25));-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);border:1px solid var(--m-border, rgba(255, 255, 255, .4));padding:1rem;gap:1rem;cursor:pointer;transition:all .3s cubic-bezier(.16,1,.3,1);outline:none;overflow:hidden}.app-card:hover{transform:translateY(-4px);box-shadow:0 12px 24px -8px var(--m-backdrop-shadow, rgba(0, 0, 0, .1));border-color:var(--m-focus, rgba(65, 105, 225, .4))}.app-card--small{padding:.75rem;gap:.75rem;align-items:center}.app-card--small .app-card__icon-wrap{width:2.5rem;height:2.5rem;border-radius:.75rem}.app-card--small .app-card__name{font-size:.875rem;font-weight:700}.app-card--tile{flex-direction:column;align-items:center;justify-content:center;padding:.875rem;gap:.5rem}.app-card--tile .app-card__icon-wrap{width:3.5rem;height:3.5rem;border-radius:1rem}.app-card--tile .app-card__body{align-items:center;text-align:center}.app-card--tile .app-card__main-info{align-items:center}.app-card--tile .app-card__name{font-size:.8125rem;font-weight:600;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;word-break:break-word}.app-card--row{align-items:center}.app-card--row .app-card__icon-wrap{width:3.25rem;height:3.25rem;border-radius:.875rem}.app-card--row .app-card__main-info{display:flex;flex-direction:column;gap:.125rem}.app-card--row .app-card__name{font-size:.9375rem;font-weight:700}.app-card--row .app-card__version{font-size:.75rem;color:var(--m-text-secondary, #64748b)}.app-card--card{flex-direction:column;padding:1.25rem;min-height:12rem}.app-card--card .app-card__accent{position:absolute;top:0;left:0;right:0;height:4px;background:var(--app-accent, var(--m-focus, #4169e1))}.app-card--card .app-card__icon-wrap{width:3.75rem;height:3.75rem;border-radius:1.125rem;background:var(--app-accent, var(--m-frame, #e0e7ff));opacity:.9}.app-card--card .app-card__icon-wrap:before{content:\"\";position:absolute;inset:0;background:var(--app-accent);opacity:.15}.app-card--card .app-card__body{flex:1;display:flex;flex-direction:column;gap:.5rem}.app-card--card .app-card__name{font-size:1.125rem;font-weight:800}.app-card--card .app-card__desc{font-size:.875rem;color:var(--m-text-secondary, #64748b);line-height:1.4;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;margin:.25rem 0}.app-card--card .app-card__footer{margin-top:auto;display:flex;align-items:center;justify-content:space-between;gap:.5rem}.app-card--card .app-card__version-badge{font-size:.6875rem;font-weight:700;background:var(--m-background-lite, rgba(0, 0, 0, .05));padding:.125rem .5rem;border-radius:9999px;color:var(--m-text-secondary, #64748b)}.app-card--card .app-card__updated{font-size:.6875rem;color:var(--m-text-tertiary, #94a3b8)}.app-card__badge{position:absolute;top:.75rem;right:.75rem;min-width:1.375rem;height:1.375rem;padding:0 .375rem;background:var(--m-error, #f43f5e);color:#fff;border-radius:9999px;font-size:.625rem;font-weight:800;display:flex;align-items:center;justify-content:center;box-shadow:0 4px 12px #f43f5e66;z-index:2}.app-card__icon-wrap{flex-shrink:0;overflow:hidden;background:var(--m-frame, #f1f5f9);display:flex;align-items:center;justify-content:center}.app-card__icon-wrap img,.app-card__icon-wrap m-img{width:60%;height:60%;object-fit:contain}.app-card__body{min-width:0}.app-card__actions{margin-left:auto;display:flex;align-items:center}.app-card--card .app-card__actions{position:absolute;bottom:1.25rem;right:1.25rem}\n"]
38071
38357
  }]
38072
38358
  }],
38073
38359
  propDecorators: {
@@ -38121,6 +38407,241 @@ i0.ɵɵngDeclareClassMetadata({
38121
38407
  }]
38122
38408
  }
38123
38409
  });
38410
+ const ERROR_KEYS = {
38411
+ logo_invalid: "logo-glyph-invalid",
38412
+ logo_too_large: "logo-glyph-too-large"
38413
+ };
38414
+ var LogoGlyphInputComponent = class LogoGlyphInputComponent {
38415
+ glyph = model(null, ...ngDevMode ? [{ debugName: "glyph" }] : /* istanbul ignore next */ []);
38416
+ appColor = model(null, ...ngDevMode ? [{ debugName: "appColor" }] : /* istanbul ignore next */ []);
38417
+ name = input(...ngDevMode ? [void 0, { debugName: "name" }] : /* istanbul ignore next */ []);
38418
+ suggestedColors = input([], ...ngDevMode ? [{ debugName: "suggestedColors" }] : /* istanbul ignore next */ []);
38419
+ disabled = input(false, ...ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []);
38420
+ markup = signal("", ...ngDevMode ? [{ debugName: "markup" }] : /* istanbul ignore next */ []);
38421
+ error = signal("", ...ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []);
38422
+ errorKey = computed(() => {
38423
+ const error = this.error();
38424
+ return error ? ERROR_KEYS[error] : void 0;
38425
+ }, ...ngDevMode ? [{ debugName: "errorKey" }] : /* istanbul ignore next */ []);
38426
+ lightColor = computed(() => {
38427
+ const color = this.appColor();
38428
+ return !!color && isLightAppColor(color);
38429
+ }, ...ngDevMode ? [{ debugName: "lightColor" }] : /* istanbul ignore next */ []);
38430
+ suggestions = computed(() => this.suggestedColors().map((color) => normalizeAppColor(color)).filter((color) => !!color), ...ngDevMode ? [{ debugName: "suggestions" }] : /* istanbul ignore next */ []);
38431
+ formData = computed(() => ({
38432
+ logo_glyph_paste: this.markup(),
38433
+ app_color: this.appColor() ?? ""
38434
+ }), ...ngDevMode ? [{ debugName: "formData" }] : /* istanbul ignore next */ []);
38435
+ lastUpload;
38436
+ take = (markup) => {
38437
+ this.markup.set(markup);
38438
+ if (!markup.trim()) {
38439
+ this.error.set("");
38440
+ return;
38441
+ }
38442
+ const { svg, error } = rebuildLogoGlyph(markup);
38443
+ this.error.set(error);
38444
+ if (svg) this.glyph.set(svg);
38445
+ };
38446
+ onForm = (data) => {
38447
+ const upload = data["logo_glyph_upload"];
38448
+ if (upload !== this.lastUpload) {
38449
+ this.lastUpload = upload;
38450
+ if (typeof upload === "string") this.take(upload);
38451
+ }
38452
+ const paste = data["logo_glyph_paste"];
38453
+ if (typeof paste === "string" && paste !== this.markup()) this.take(paste);
38454
+ const color = normalizeAppColor(String(data["app_color"] ?? ""));
38455
+ if (color && color !== this.appColor()) this.appColor.set(color);
38456
+ };
38457
+ pickSuggestion = (color) => {
38458
+ if (!this.disabled()) this.appColor.set(color);
38459
+ };
38460
+ static ɵfac = i0.ɵɵngDeclareFactory({
38461
+ minVersion: "12.0.0",
38462
+ version: "22.2.1",
38463
+ ngImport: i0,
38464
+ type: LogoGlyphInputComponent,
38465
+ deps: [],
38466
+ target: i0.ɵɵFactoryTarget.Component
38467
+ });
38468
+ static ɵcmp = i0.ɵɵngDeclareComponent({
38469
+ minVersion: "17.0.0",
38470
+ version: "22.2.1",
38471
+ type: LogoGlyphInputComponent,
38472
+ isStandalone: true,
38473
+ selector: "m-logo-glyph-input",
38474
+ inputs: {
38475
+ glyph: {
38476
+ classPropertyName: "glyph",
38477
+ publicName: "glyph",
38478
+ isSignal: true,
38479
+ isRequired: false,
38480
+ transformFunction: null
38481
+ },
38482
+ appColor: {
38483
+ classPropertyName: "appColor",
38484
+ publicName: "appColor",
38485
+ isSignal: true,
38486
+ isRequired: false,
38487
+ transformFunction: null
38488
+ },
38489
+ name: {
38490
+ classPropertyName: "name",
38491
+ publicName: "name",
38492
+ isSignal: true,
38493
+ isRequired: false,
38494
+ transformFunction: null
38495
+ },
38496
+ suggestedColors: {
38497
+ classPropertyName: "suggestedColors",
38498
+ publicName: "suggestedColors",
38499
+ isSignal: true,
38500
+ isRequired: false,
38501
+ transformFunction: null
38502
+ },
38503
+ disabled: {
38504
+ classPropertyName: "disabled",
38505
+ publicName: "disabled",
38506
+ isSignal: true,
38507
+ isRequired: false,
38508
+ transformFunction: null
38509
+ }
38510
+ },
38511
+ outputs: {
38512
+ glyph: "glyphChange",
38513
+ appColor: "appColorChange"
38514
+ },
38515
+ host: { classAttribute: "m-logo-glyph-input" },
38516
+ ngImport: i0,
38517
+ template: "<div class=\"m-logo-glyph-input__preview\">\n <div class=\"m-logo-glyph-input__logo m-logo-glyph-input__logo--large\">\n <m-app-logo [glyph]=\"glyph()\" [appColor]=\"appColor()\" [name]=\"name()\" />\n </div>\n <div class=\"m-logo-glyph-input__logo m-logo-glyph-input__logo--small\">\n <m-app-logo [glyph]=\"glyph()\" [appColor]=\"appColor()\" [name]=\"name()\" />\n </div>\n</div>\n\n<div class=\"m-logo-glyph-input__fields\">\n <ng-content select=\"[logoAi]\" />\n\n <!-- asset: forms/logo_glyph_input.yml -->\n <m-form\n name=\"logo_glyph_input\"\n [one]=\"true\"\n [data]=\"formData()\"\n [readonly]=\"disabled()\"\n [autofocus]=\"false\"\n (dataChange)=\"onForm($event)\"\n />\n @if (errorKey(); as key) {\n <m-text-output variant=\"footer\" color=\"error\" [label]=\"key\" />\n }\n @if (lightColor()) {\n <m-text-output variant=\"footer\" color=\"warning\" label=\"app-color-light\" />\n }\n\n @if (suggestions().length) {\n <m-text-output variant=\"footer\" label=\"app-color-suggestions\" />\n <div class=\"m-logo-glyph-input__swatches\">\n @for (color of suggestions(); track color) {\n <div\n class=\"m-logo-glyph-input__swatch\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-label]=\"color\"\n [attr.aria-pressed]=\"color === appColor()\"\n [class.m-logo-glyph-input__swatch--picked]=\"color === appColor()\"\n (click)=\"pickSuggestion(color)\"\n (keydown.enter)=\"pickSuggestion(color)\"\n (keydown.space)=\"pickSuggestion(color); $event.preventDefault()\"\n >\n <m-app-logo [glyph]=\"glyph()\" [appColor]=\"color\" [name]=\"name()\" />\n </div>\n }\n </div>\n }\n</div>\n",
38518
+ 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;flex-wrap:wrap;gap:1.5rem;align-items:flex-start}.m-logo-glyph-input__preview{display:flex;align-items:flex-end;gap:1rem}.m-logo-glyph-input__logo--large{width:6rem;height:6rem}.m-logo-glyph-input__logo--small{width:2rem;height:2rem}.m-logo-glyph-input__fields{display:flex;flex-direction:column;gap:.75rem;flex:1 1 18rem;min-width:0}.m-logo-glyph-input__swatches{display:grid;grid-template-columns:repeat(auto-fill,minmax(2.5rem,1fr));gap:.5rem}.m-logo-glyph-input__swatch{aspect-ratio:1;border-radius:25%;padding:2px;cursor:pointer;outline:2px solid transparent;transition:outline-color .15s ease}.m-logo-glyph-input__swatch:focus-visible,.m-logo-glyph-input__swatch:hover{outline-color:var(--m-text-quaternary)}.m-logo-glyph-input__swatch--picked{outline-color:var(--m-mm)}\n"],
38519
+ dependencies: [
38520
+ {
38521
+ kind: "component",
38522
+ type: AppLogoComponent,
38523
+ selector: "m-app-logo",
38524
+ inputs: [
38525
+ "glyph",
38526
+ "appColor",
38527
+ "name"
38528
+ ]
38529
+ },
38530
+ {
38531
+ kind: "component",
38532
+ type: FormGroupComponent,
38533
+ selector: "m-form, m-one-form",
38534
+ inputs: [
38535
+ "data",
38536
+ "state",
38537
+ "validation",
38538
+ "options",
38539
+ "fieldConfigs",
38540
+ "aclResolver",
38541
+ "autofocus",
38542
+ "readonly",
38543
+ "fieldRenderIds",
38544
+ "elements",
38545
+ "templates",
38546
+ "datas",
38547
+ "label",
38548
+ "subtitle"
38549
+ ],
38550
+ outputs: [
38551
+ "dataChange",
38552
+ "act",
38553
+ "stateChange"
38554
+ ]
38555
+ },
38556
+ {
38557
+ kind: "component",
38558
+ type: TextOutputComponent,
38559
+ selector: "m-text-output",
38560
+ inputs: [
38561
+ "config",
38562
+ "align",
38563
+ "variant",
38564
+ "color",
38565
+ "fontWeight",
38566
+ "label",
38567
+ "noTranslate",
38568
+ "params"
38569
+ ],
38570
+ outputs: ["configChange", "clicked"]
38571
+ }
38572
+ ],
38573
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
38574
+ });
38575
+ };
38576
+ i0.ɵɵngDeclareClassMetadata({
38577
+ minVersion: "12.0.0",
38578
+ version: "22.2.1",
38579
+ ngImport: i0,
38580
+ type: LogoGlyphInputComponent,
38581
+ decorators: [{
38582
+ type: Component,
38583
+ args: [{
38584
+ selector: "m-logo-glyph-input",
38585
+ imports: [
38586
+ AppLogoComponent,
38587
+ FormGroupComponent,
38588
+ TextOutputComponent
38589
+ ],
38590
+ changeDetection: ChangeDetectionStrategy.OnPush,
38591
+ host: { class: "m-logo-glyph-input" },
38592
+ template: "<div class=\"m-logo-glyph-input__preview\">\n <div class=\"m-logo-glyph-input__logo m-logo-glyph-input__logo--large\">\n <m-app-logo [glyph]=\"glyph()\" [appColor]=\"appColor()\" [name]=\"name()\" />\n </div>\n <div class=\"m-logo-glyph-input__logo m-logo-glyph-input__logo--small\">\n <m-app-logo [glyph]=\"glyph()\" [appColor]=\"appColor()\" [name]=\"name()\" />\n </div>\n</div>\n\n<div class=\"m-logo-glyph-input__fields\">\n <ng-content select=\"[logoAi]\" />\n\n <!-- asset: forms/logo_glyph_input.yml -->\n <m-form\n name=\"logo_glyph_input\"\n [one]=\"true\"\n [data]=\"formData()\"\n [readonly]=\"disabled()\"\n [autofocus]=\"false\"\n (dataChange)=\"onForm($event)\"\n />\n @if (errorKey(); as key) {\n <m-text-output variant=\"footer\" color=\"error\" [label]=\"key\" />\n }\n @if (lightColor()) {\n <m-text-output variant=\"footer\" color=\"warning\" label=\"app-color-light\" />\n }\n\n @if (suggestions().length) {\n <m-text-output variant=\"footer\" label=\"app-color-suggestions\" />\n <div class=\"m-logo-glyph-input__swatches\">\n @for (color of suggestions(); track color) {\n <div\n class=\"m-logo-glyph-input__swatch\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-label]=\"color\"\n [attr.aria-pressed]=\"color === appColor()\"\n [class.m-logo-glyph-input__swatch--picked]=\"color === appColor()\"\n (click)=\"pickSuggestion(color)\"\n (keydown.enter)=\"pickSuggestion(color)\"\n (keydown.space)=\"pickSuggestion(color); $event.preventDefault()\"\n >\n <m-app-logo [glyph]=\"glyph()\" [appColor]=\"color\" [name]=\"name()\" />\n </div>\n }\n </div>\n }\n</div>\n",
38593
+ 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;flex-wrap:wrap;gap:1.5rem;align-items:flex-start}.m-logo-glyph-input__preview{display:flex;align-items:flex-end;gap:1rem}.m-logo-glyph-input__logo--large{width:6rem;height:6rem}.m-logo-glyph-input__logo--small{width:2rem;height:2rem}.m-logo-glyph-input__fields{display:flex;flex-direction:column;gap:.75rem;flex:1 1 18rem;min-width:0}.m-logo-glyph-input__swatches{display:grid;grid-template-columns:repeat(auto-fill,minmax(2.5rem,1fr));gap:.5rem}.m-logo-glyph-input__swatch{aspect-ratio:1;border-radius:25%;padding:2px;cursor:pointer;outline:2px solid transparent;transition:outline-color .15s ease}.m-logo-glyph-input__swatch:focus-visible,.m-logo-glyph-input__swatch:hover{outline-color:var(--m-text-quaternary)}.m-logo-glyph-input__swatch--picked{outline-color:var(--m-mm)}\n"]
38594
+ }]
38595
+ }],
38596
+ propDecorators: {
38597
+ glyph: [{
38598
+ type: i0.Input,
38599
+ args: [{
38600
+ isSignal: true,
38601
+ alias: "glyph",
38602
+ required: false
38603
+ }]
38604
+ }, {
38605
+ type: i0.Output,
38606
+ args: ["glyphChange"]
38607
+ }],
38608
+ appColor: [{
38609
+ type: i0.Input,
38610
+ args: [{
38611
+ isSignal: true,
38612
+ alias: "appColor",
38613
+ required: false
38614
+ }]
38615
+ }, {
38616
+ type: i0.Output,
38617
+ args: ["appColorChange"]
38618
+ }],
38619
+ name: [{
38620
+ type: i0.Input,
38621
+ args: [{
38622
+ isSignal: true,
38623
+ alias: "name",
38624
+ required: false
38625
+ }]
38626
+ }],
38627
+ suggestedColors: [{
38628
+ type: i0.Input,
38629
+ args: [{
38630
+ isSignal: true,
38631
+ alias: "suggestedColors",
38632
+ required: false
38633
+ }]
38634
+ }],
38635
+ disabled: [{
38636
+ type: i0.Input,
38637
+ args: [{
38638
+ isSignal: true,
38639
+ alias: "disabled",
38640
+ required: false
38641
+ }]
38642
+ }]
38643
+ }
38644
+ });
38124
38645
  var PlaygroundComponent = class PlaygroundComponent {
38125
38646
  config = input(...ngDevMode ? [void 0, { debugName: "config" }] : /* istanbul ignore next */ []);
38126
38647
  copied = signal(false, ...ngDevMode ? [{ debugName: "copied" }] : /* istanbul ignore next */ []);
@@ -38977,7 +39498,8 @@ var ModalComponent = class ModalComponent extends ConfigComponent {
38977
39498
  "size",
38978
39499
  "one",
38979
39500
  "baseUrl",
38980
- "remote"
39501
+ "remote",
39502
+ "shadow"
38981
39503
  ],
38982
39504
  outputs: ["configChange"]
38983
39505
  },
@@ -40285,7 +40807,8 @@ var NavTrailComponent = class NavTrailComponent {
40285
40807
  "size",
40286
40808
  "one",
40287
40809
  "baseUrl",
40288
- "remote"
40810
+ "remote",
40811
+ "shadow"
40289
40812
  ],
40290
40813
  outputs: ["configChange"]
40291
40814
  },
@@ -40648,8 +41171,8 @@ var NavHeaderComponent = class NavHeaderComponent {
40648
41171
  classAttribute: "m-nav-header"
40649
41172
  },
40650
41173
  ngImport: i0,
40651
- 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",
40652
- 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"],
40653
41176
  dependencies: [
40654
41177
  {
40655
41178
  kind: "component",
@@ -40806,6 +41329,16 @@ var NavHeaderComponent = class NavHeaderComponent {
40806
41329
  "mRefToggle",
40807
41330
  "mRefParams"
40808
41331
  ]
41332
+ },
41333
+ {
41334
+ kind: "component",
41335
+ type: AppLogoComponent,
41336
+ selector: "m-app-logo",
41337
+ inputs: [
41338
+ "glyph",
41339
+ "appColor",
41340
+ "name"
41341
+ ]
40809
41342
  }
40810
41343
  ],
40811
41344
  changeDetection: i0.ChangeDetectionStrategy.OnPush,
@@ -40829,7 +41362,8 @@ i0.ɵɵngDeclareClassMetadata({
40829
41362
  SectionSearchComponent,
40830
41363
  ButtonComponent,
40831
41364
  UserComponent,
40832
- MRefDirective
41365
+ MRefDirective,
41366
+ AppLogoComponent
40833
41367
  ],
40834
41368
  encapsulation: ViewEncapsulation.None,
40835
41369
  changeDetection: ChangeDetectionStrategy.OnPush,
@@ -40838,8 +41372,8 @@ i0.ɵɵngDeclareClassMetadata({
40838
41372
  "[style.display]": "\"block\"",
40839
41373
  "[style.--m-section-min-height]": "\"0\""
40840
41374
  },
40841
- 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",
40842
- 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"]
40843
41377
  }]
40844
41378
  }],
40845
41379
  ctorParameters: () => []
@@ -40945,6 +41479,14 @@ var NavMenuComponent = class NavMenuComponent {
40945
41479
  },
40946
41480
  ngImport: i0,
40947
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>
40948
41490
  <ng-template #menuTemplate let-item="row">
40949
41491
  <div class="nav-menu__item">
40950
41492
  @if (item.nav; as nav) {
@@ -40958,7 +41500,7 @@ var NavMenuComponent = class NavMenuComponent {
40958
41500
  class="nav-menu__link"
40959
41501
  >
40960
41502
  <span class="nav-menu__icon">
40961
- <m-icon [name]="item.icon || 'menu'" [baseUrl]="baseUrl()" />
41503
+ <ng-container *ngTemplateOutlet="iconTemplate; context: { $implicit: item }" />
40962
41504
  </span>
40963
41505
  <span class="nav-menu__label">{{ item.label | translate }}</span>
40964
41506
  </a>
@@ -40976,13 +41518,13 @@ var NavMenuComponent = class NavMenuComponent {
40976
41518
  } @else if (item.href; as href) {
40977
41519
  <a [href]="href" class="nav-menu__link">
40978
41520
  <span class="nav-menu__icon">
40979
- <m-icon [name]="item.icon || 'menu'" [baseUrl]="baseUrl()" />
41521
+ <ng-container *ngTemplateOutlet="iconTemplate; context: { $implicit: item }" />
40980
41522
  </span>
40981
41523
  <span class="nav-menu__label">{{ item.label | translate }}</span>
40982
41524
  </a>
40983
41525
  } @else {
40984
41526
  <span class="nav-menu__icon">
40985
- <m-icon [name]="item.icon || 'menu'" [baseUrl]="baseUrl()" />
41527
+ <ng-container *ngTemplateOutlet="iconTemplate; context: { $implicit: item }" />
40986
41528
  </span>
40987
41529
  <span class="nav-menu__label">
40988
41530
  <span class="nav-menu__text">{{ item.label | translate }}</span>
@@ -40995,8 +41537,18 @@ var NavMenuComponent = class NavMenuComponent {
40995
41537
  </div>
40996
41538
  `,
40997
41539
  isInline: true,
40998
- 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"],
40999
41541
  dependencies: [
41542
+ {
41543
+ kind: "directive",
41544
+ type: NgTemplateOutlet,
41545
+ selector: "[ngTemplateOutlet]",
41546
+ inputs: [
41547
+ "ngTemplateOutletContext",
41548
+ "ngTemplateOutlet",
41549
+ "ngTemplateOutletInjector"
41550
+ ]
41551
+ },
41000
41552
  {
41001
41553
  kind: "component",
41002
41554
  type: IconComponent,
@@ -41008,10 +41560,21 @@ var NavMenuComponent = class NavMenuComponent {
41008
41560
  "size",
41009
41561
  "one",
41010
41562
  "baseUrl",
41011
- "remote"
41563
+ "remote",
41564
+ "shadow"
41012
41565
  ],
41013
41566
  outputs: ["configChange"]
41014
41567
  },
41568
+ {
41569
+ kind: "component",
41570
+ type: AppLogoComponent,
41571
+ selector: "m-app-logo",
41572
+ inputs: [
41573
+ "glyph",
41574
+ "appColor",
41575
+ "name"
41576
+ ]
41577
+ },
41015
41578
  {
41016
41579
  kind: "directive",
41017
41580
  type: MRefDirective,
@@ -41093,6 +41656,14 @@ i0.ɵɵngDeclareClassMetadata({
41093
41656
  args: [{
41094
41657
  selector: "m-nav-menu",
41095
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>
41096
41667
  <ng-template #menuTemplate let-item="row">
41097
41668
  <div class="nav-menu__item">
41098
41669
  @if (item.nav; as nav) {
@@ -41106,7 +41677,7 @@ i0.ɵɵngDeclareClassMetadata({
41106
41677
  class="nav-menu__link"
41107
41678
  >
41108
41679
  <span class="nav-menu__icon">
41109
- <m-icon [name]="item.icon || 'menu'" [baseUrl]="baseUrl()" />
41680
+ <ng-container *ngTemplateOutlet="iconTemplate; context: { $implicit: item }" />
41110
41681
  </span>
41111
41682
  <span class="nav-menu__label">{{ item.label | translate }}</span>
41112
41683
  </a>
@@ -41124,13 +41695,13 @@ i0.ɵɵngDeclareClassMetadata({
41124
41695
  } @else if (item.href; as href) {
41125
41696
  <a [href]="href" class="nav-menu__link">
41126
41697
  <span class="nav-menu__icon">
41127
- <m-icon [name]="item.icon || 'menu'" [baseUrl]="baseUrl()" />
41698
+ <ng-container *ngTemplateOutlet="iconTemplate; context: { $implicit: item }" />
41128
41699
  </span>
41129
41700
  <span class="nav-menu__label">{{ item.label | translate }}</span>
41130
41701
  </a>
41131
41702
  } @else {
41132
41703
  <span class="nav-menu__icon">
41133
- <m-icon [name]="item.icon || 'menu'" [baseUrl]="baseUrl()" />
41704
+ <ng-container *ngTemplateOutlet="iconTemplate; context: { $implicit: item }" />
41134
41705
  </span>
41135
41706
  <span class="nav-menu__label">
41136
41707
  <span class="nav-menu__text">{{ item.label | translate }}</span>
@@ -41144,13 +41715,15 @@ i0.ɵɵngDeclareClassMetadata({
41144
41715
  `,
41145
41716
  changeDetection: ChangeDetectionStrategy.OnPush,
41146
41717
  imports: [
41718
+ NgTemplateOutlet,
41147
41719
  IconComponent,
41720
+ AppLogoComponent,
41148
41721
  MRefDirective,
41149
41722
  TranslatePipe,
41150
41723
  ListComponent,
41151
41724
  ButtonComponent
41152
41725
  ],
41153
- 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"]
41154
41727
  }]
41155
41728
  }],
41156
41729
  propDecorators: {
@@ -41471,7 +42044,8 @@ var NavDetailsComponent = class NavDetailsComponent {
41471
42044
  "size",
41472
42045
  "one",
41473
42046
  "baseUrl",
41474
- "remote"
42047
+ "remote",
42048
+ "shadow"
41475
42049
  ],
41476
42050
  outputs: ["configChange"]
41477
42051
  },
@@ -41624,24 +42198,31 @@ var NavComponent = class NavComponent {
41624
42198
  logo = computed(() => {
41625
42199
  if (this.logoPending()) return void 0;
41626
42200
  const config = this.isHost() ? void 0 : this.currentWcConfig();
41627
- if (config?.logo) return {
41628
- src: config.logo,
41629
- alt: config.name || config.app,
41630
- app: config.app
41631
- };
42201
+ if (config?.app) {
42202
+ const identity = this.#navStore.currentIdentity();
42203
+ return {
42204
+ app: config.app,
42205
+ alt: identity?.name ?? config.app,
42206
+ glyph: identity?.logoGlyph ?? null,
42207
+ color: identity?.appColor ?? null,
42208
+ src: void 0
42209
+ };
42210
+ }
41632
42211
  const root = this.#navStore.navMap()[ROOT_NAV];
41633
42212
  return root?.logo ? {
41634
- src: root.logo,
42213
+ app: void 0,
41635
42214
  alt: root.title ?? "logo",
41636
- app: void 0
42215
+ glyph: null,
42216
+ color: null,
42217
+ src: root.logo
41637
42218
  } : void 0;
41638
42219
  }, ...ngDevMode ? [{ debugName: "logo" }] : /* istanbul ignore next */ []);
41639
42220
  appRail = computed(() => {
41640
42221
  if (!this.isHost()) return [];
41641
42222
  const configs = this.#navStore.wcConfigMap();
42223
+ const identities = this.#navStore.identityMap();
41642
42224
  const panelNavId = this.isNavOpened() ? this.#navStore.id() : void 0;
41643
42225
  const isActive = (appNavId) => !!panelNavId && (panelNavId === appNavId || panelNavId.startsWith(`${appNavId}_`));
41644
- const hostLogo = this.#navStore.navMap()[ROOT_NAV]?.logo;
41645
42226
  const appLink = this.appLink();
41646
42227
  const appNavId = this.#navStore.appNavId();
41647
42228
  const main = appLink && appNavId && !this.activeAppOpen() ? [{
@@ -41660,9 +42241,9 @@ var NavComponent = class NavComponent {
41660
42241
  key,
41661
42242
  appNavId,
41662
42243
  pending: !config,
41663
- src: config?.logo ?? hostLogo,
41664
- remote: config?.logo ? config.link || link : void 0,
41665
- alt: config?.name || config?.app || link,
42244
+ glyph: identities[link]?.logoGlyph ?? null,
42245
+ color: identities[link]?.appColor ?? null,
42246
+ alt: identities[link]?.name ?? link,
41666
42247
  active: isActive(appNavId)
41667
42248
  }));
41668
42249
  }, ...ngDevMode ? [{ debugName: "appRail" }] : /* istanbul ignore next */ []);
@@ -41848,7 +42429,7 @@ var NavComponent = class NavComponent {
41848
42429
  outputs: { menuClicked: "menuClicked" },
41849
42430
  host: { classAttribute: "m-nav" },
41850
42431
  ngImport: i0,
41851
- template: "<div class=\"nav\" [class.is-open]=\"isNavOpened()\" [class.is-scrolled-down]=\"isScrolledDown()\">\n <div class=\"nav__header\">\n @if (showLogo()) {\n @if (logo(); as logo) {\n <!-- AppLogo: menu open → home with panel still showing root; closed → home page. -->\n <button\n type=\"button\"\n class=\"nav_logo nav_logo--app\"\n [attr.data-app]=\"logo.app\"\n [attr.aria-label]=\"logo.alt\"\n [class.nav_logo--pop]=\"logoPop()\"\n [class.nav_logo--active]=\"logoActive()\"\n (click)=\"onLogoClick()\"\n (animationend)=\"logoPop.set(false)\"\n >\n <m-img class=\"nav_logo_img\" [src]=\"logo.src\" [alt]=\"logo.alt\" />\n </button>\n } @else if (logoPending()) {\n <div class=\"nav_logo nav_logo--loading\">\n <div class=\"nav_logo-skeleton\"></div>\n </div>\n }\n }\n <div class=\"nav_actions\">\n <m-one-button-group\n class=\"nav_main_group\"\n name=\"nav_main_button_group\"\n [buttons]=\"computedMainButtons()\"\n [vertical]=\"isVertical()\"\n />\n </div>\n @for (app of appRail(); track app.key) {\n <!-- App Rail: the Main Slot's App, then each Side App — opens the panel on its menu. -->\n @if (app.pending) {\n <div class=\"nav_logo nav_logo--loading nav_logo--rail\">\n <div class=\"nav_logo-skeleton\"></div>\n </div>\n } @else {\n <button\n type=\"button\"\n class=\"nav_logo nav_logo--app nav_logo--rail\"\n [attr.data-app]=\"app.key\"\n [attr.aria-label]=\"app.alt\"\n [class.nav_logo--active]=\"app.active\"\n (click)=\"onAppLogoClick(app.appNavId)\"\n >\n <m-img class=\"nav_logo_img\" [src]=\"app.src\" [remote]=\"app.remote\" [alt]=\"app.alt\" />\n </button>\n }\n }\n </div>\n\n <div class=\"nav__body\">\n <m-one-button (clicked)=\"toggleMenu()\" [config]=\"menuButtonConfig()\" />\n </div>\n\n <div class=\"nav__footer\">\n <m-one-button-group name=\"nav_footer_button_group\" [buttons]=\"computedFooterButtons()\" [vertical]=\"isVertical()\" />\n </div>\n</div>\n\n<div\n class=\"nav__backdrop\"\n [class.show]=\"isNavOpened()\"\n (click)=\"toggleMenu()\"\n (keydown.enter)=\"toggleMenu()\"\n tabindex=\"0\"\n></div>\n<m-nav-details />\n",
42432
+ template: "<div class=\"nav\" [class.is-open]=\"isNavOpened()\" [class.is-scrolled-down]=\"isScrolledDown()\">\n <div class=\"nav__header\">\n @if (showLogo()) {\n @if (logo(); as logo) {\n <!-- AppLogo: menu open → home with panel still showing root; closed → home page. -->\n <button\n type=\"button\"\n class=\"nav_logo nav_logo--app\"\n [attr.data-app]=\"logo.app\"\n [attr.aria-label]=\"logo.alt\"\n [class.nav_logo--pop]=\"logoPop()\"\n [class.nav_logo--active]=\"logoActive()\"\n (click)=\"onLogoClick()\"\n (animationend)=\"logoPop.set(false)\"\n >\n @if (logo.src) {\n <m-img class=\"nav_logo_img\" [src]=\"logo.src\" [alt]=\"logo.alt\" />\n } @else {\n <m-app-logo class=\"nav_logo_img\" [glyph]=\"logo.glyph\" [appColor]=\"logo.color\" [name]=\"logo.alt\" />\n }\n </button>\n } @else if (logoPending()) {\n <div class=\"nav_logo nav_logo--loading\">\n <div class=\"nav_logo-skeleton\"></div>\n </div>\n }\n }\n <div class=\"nav_actions\">\n <m-one-button-group\n class=\"nav_main_group\"\n name=\"nav_main_button_group\"\n [buttons]=\"computedMainButtons()\"\n [vertical]=\"isVertical()\"\n />\n </div>\n @for (app of appRail(); track app.key) {\n <!-- App Rail: the Main Slot's App, then each Side App — opens the panel on its menu. -->\n @if (app.pending) {\n <div class=\"nav_logo nav_logo--loading nav_logo--rail\">\n <div class=\"nav_logo-skeleton\"></div>\n </div>\n } @else {\n <button\n type=\"button\"\n class=\"nav_logo nav_logo--app nav_logo--rail\"\n [attr.data-app]=\"app.key\"\n [attr.aria-label]=\"app.alt\"\n [class.nav_logo--active]=\"app.active\"\n (click)=\"onAppLogoClick(app.appNavId)\"\n >\n <m-app-logo class=\"nav_logo_img\" [glyph]=\"app.glyph\" [appColor]=\"app.color\" [name]=\"app.alt\" />\n </button>\n }\n }\n </div>\n\n <div class=\"nav__body\">\n <m-one-button (clicked)=\"toggleMenu()\" [config]=\"menuButtonConfig()\" />\n </div>\n\n <div class=\"nav__footer\">\n <m-one-button-group name=\"nav_footer_button_group\" [buttons]=\"computedFooterButtons()\" [vertical]=\"isVertical()\" />\n </div>\n</div>\n\n<div\n class=\"nav__backdrop\"\n [class.show]=\"isNavOpened()\"\n (click)=\"toggleMenu()\"\n (keydown.enter)=\"toggleMenu()\"\n tabindex=\"0\"\n></div>\n<m-nav-details />\n",
41852
42433
  styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}.m-nav .nav{position:fixed;top:0;left:0;backdrop-filter:blur(16px) brightness(1.1) saturate(1.8) contrast(1.1);-webkit-backdrop-filter:blur(16px) brightness(1.1) saturate(1.8) contrast(1.1);background-color:var(--m-backdrop-glass);border:1px solid var(--m-backdrop-border);border:none;border-right:1px solid color-mix(in srgb,var(--m-border) 55%,transparent);width:64px;height:100%;transition:.4s cubic-bezier(.165,.84,.44,1) .15s ease-in-out;z-index:100;display:flex;flex-direction:column}.m-nav .nav button:not(.primary):not(:has(.nav-lang-label)):hover{background:#ffffff14;transform:scale(1.05);box-shadow:none}.m-nav .nav button:not(.primary):not(:has(.nav-lang-label)):active{transform:scale(.95);box-shadow:none}.m-nav .nav m-one-button:has(.nav-lang-label){--m-button-background: transparent;--m-button-hover-background: transparent;--m-button-border: none;--m-button-shadow: none;--m-button-padding: 0;--m-button-width: 2rem;--m-button-hover-transform: none}.m-nav .nav .button-group{display:flex;flex-direction:column;align-items:center;gap:1.75rem}.m-nav .nav_logo{display:flex;align-items:center;justify-content:center;padding:0;height:64px;width:64px;box-sizing:border-box;position:relative;margin:0 auto}.m-nav .nav_logo:after{content:\"\";position:absolute;bottom:0;left:10%;width:80%;height:2px;background:radial-gradient(ellipse at center,color-mix(in srgb,var(--m-mm) 25%,transparent) 0%,color-mix(in srgb,var(--m-success) 15%,transparent) 40%,transparent 100%);filter:blur(.5px);pointer-events:none;z-index:11}.m-nav .nav_logo.nav_logo--rail:after{content:none}.m-nav .nav_logo.nav_logo--app{border:0;background:transparent!important;font:inherit;color:inherit;cursor:pointer;pointer-events:auto;-webkit-tap-highlight-color:transparent}.m-nav .nav_logo.nav_logo--app:hover{transform:none!important}.m-nav .nav_logo.nav_logo--app .nav_logo_img{display:block;width:32px;height:32px;margin:0 auto;position:relative;z-index:1;border-radius:9px;overflow:hidden;transition:transform .35s cubic-bezier(.34,1.56,.64,1)}.m-nav .nav_logo.nav_logo--app .nav_logo_img img{width:100%;height:100%;object-fit:cover}.m-nav .nav_logo.nav_logo--app:hover .nav_logo_img{transform:scale(1.06)}.m-nav .nav_logo.nav_logo--app:active .nav_logo_img{transform:scale(.88);transition-duration:.1s}.m-nav .nav_logo.nav_logo--app.nav_logo--pop .nav_logo_img{animation:nav-logo-pop .4s cubic-bezier(.34,1.56,.64,1)}.m-nav .nav_logo.nav_logo--app:before{content:\"\";position:absolute;top:50%;left:50%;width:44px;height:44px;border-radius:14px;border:1px solid transparent;transform:translate(-50%,-50%) scale(.85);opacity:0;pointer-events:none;transition:opacity .2s ease,transform .25s cubic-bezier(.34,1.56,.64,1)}.m-nav .nav_logo.nav_logo--app.nav_logo--active:before{opacity:1;transform:translate(-50%,-50%) scale(1);border-color:color-mix(in srgb,var(--m-primary-color) 45%,transparent);background:color-mix(in srgb,var(--m-primary-color) 8%,transparent)}.m-nav .nav_logo.nav_logo--loading{cursor:default!important;pointer-events:none!important}.m-nav .nav_logo.nav_logo--loading .nav_logo-skeleton{width:28px;height:28px;margin:0 auto;border-radius:8px;background:#ffffff14;animation:nav-logo-skeleton-pulse 1.5s infinite ease-in-out}.m-nav .nav_logo svg{width:1.75rem;height:auto;display:block;margin:0 auto;filter:drop-shadow(0 4px 12px color-mix(in srgb,var(--m-mm) 40%,transparent));transition:filter .3s ease-out}.m-nav .nav_logo svg:hover{filter:drop-shadow(0 8px 16px color-mix(in srgb,var(--m-mm) 60%,transparent))}.m-nav .nav_actions{width:100%;flex-direction:column;display:flex;align-items:center;justify-content:center;gap:1.75rem;margin-top:.5rem}.m-nav .nav_actions .nav_main_group{display:flex;flex-direction:column;align-items:center;width:100%}.m-nav .nav_user{width:100%;display:flex;align-items:center;justify-content:center;position:relative;z-index:12}.m-nav .nav__header,.m-nav .nav__footer{width:100%;position:relative;align-items:center;justify-content:center;display:flex;flex-direction:column}.m-nav .nav__body{width:100%;position:relative;flex:1;display:grid;place-items:center}@media(max-width:767px){.m-nav .nav{top:auto!important;bottom:0!important;left:0;right:0;position:fixed;width:100%;height:48px;box-sizing:content-box;display:flex;flex-direction:row;align-items:stretch;border-right:none;border-top:1px solid color-mix(in srgb,var(--m-border) 55%,transparent);padding-bottom:env(safe-area-inset-bottom);will-change:transform,opacity;transition:transform .4s cubic-bezier(.4,0,.2,1),opacity .4s ease;-webkit-backdrop-filter:blur(20px) saturate(180%);backdrop-filter:blur(20px) saturate(180%);background:color-mix(in srgb,var(--m-background) 70%,transparent)}.m-nav .nav.is-scrolled-down{transform:translateY(calc(100% + env(safe-area-inset-bottom)));opacity:0;pointer-events:none}.m-nav .nav .nav__footer{display:none}.m-nav .nav .nav__header{flex:1;display:flex;flex-direction:row;align-items:center;justify-content:space-between;height:100%}.m-nav .nav .nav__header .nav_logo{flex:0 0 64px;display:flex;align-items:center;justify-content:center;height:100%;cursor:pointer}.m-nav .nav .nav__header .nav_logo.nav_logo--loading{cursor:default!important;pointer-events:none!important}.m-nav .nav .nav__header .nav_logo svg{width:1.5rem}.m-nav .nav .nav__header .nav_actions{flex:1;display:flex;flex-direction:row;align-items:center;justify-content:center;gap:.75rem;height:100%}.m-nav .nav .nav__header .nav_actions .nav_main_group{display:flex;align-items:center}.m-nav .nav .nav__header .nav_actions .nav_main_group .button-group{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:center;justify-content:center;gap:.75rem}.m-nav .nav .nav__body{flex:0 0 48px;display:flex;justify-content:flex-end;align-items:center;padding-right:.25rem;height:100%}}@media(min-width:768px)and (max-width:1199px){.m-nav .nav{top:auto!important;bottom:0!important;left:0;right:0;position:fixed;width:100%;height:56px;box-sizing:content-box;display:flex;flex-direction:row;align-items:stretch;border-right:none;border-top:1px solid color-mix(in srgb,var(--m-border) 55%,transparent);padding-bottom:env(safe-area-inset-bottom);will-change:transform,opacity;transition:transform .4s cubic-bezier(.4,0,.2,1),opacity .4s ease;-webkit-backdrop-filter:blur(20px) saturate(180%);backdrop-filter:blur(20px) saturate(180%);background:color-mix(in srgb,var(--m-background) 70%,transparent)}.m-nav .nav.is-scrolled-down{transform:translateY(calc(100% + env(safe-area-inset-bottom)));opacity:0;pointer-events:none}.m-nav .nav .nav__footer{display:none}.m-nav .nav .nav__header{flex:1;display:flex;flex-direction:row;align-items:center;justify-content:space-between;height:100%}.m-nav .nav .nav__header .nav_logo{flex:0 0 72px;display:flex;align-items:center;justify-content:center;height:100%;cursor:pointer}.m-nav .nav .nav__header .nav_logo.nav_logo--loading{cursor:default!important;pointer-events:none!important}.m-nav .nav .nav__header .nav_logo svg{width:1.75rem}.m-nav .nav .nav__header .nav_actions{flex:1;display:flex;flex-direction:row;align-items:center;justify-content:center;gap:1.25rem;height:100%}.m-nav .nav .nav__header .nav_actions .nav_main_group{display:flex;align-items:center}.m-nav .nav .nav__header .nav_actions .nav_main_group .button-group{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:center;justify-content:center;gap:1.25rem}.m-nav .nav .nav__body{flex:0 0 56px;display:flex;justify-content:flex-end;align-items:center;padding-right:.5rem;height:100%}}@keyframes breathe{0%,to{box-shadow:0 2px 8px #00000014,0 0 0 0 transparent}50%{box-shadow:0 6px 16px color-mix(in srgb,var(--m-mm) 20%,transparent),0 0 10px 2px color-mix(in srgb,var(--m-mm) 25%,transparent)}}.m-nav .nav__backdrop{position:fixed;inset:0;z-index:80;opacity:0;pointer-events:none;transition:opacity .4s cubic-bezier(.16,1,.3,1);cursor:pointer}.m-nav .nav__backdrop.show{opacity:1;pointer-events:all}.m-nav .nav-lang-label{font-size:.7rem;font-weight:800;text-transform:uppercase;color:var(--m-text-secondary);opacity:.8;line-height:1;display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;border-radius:2em;background:#00000008;transition:all .2s ease}.m-nav button:has(.nav-lang-label):hover .nav-lang-label{background:#0000000f;opacity:1;color:var(--m-primary-color)}.m-nav button.primary:has(.nav-lang-label) .nav-lang-label{background:var(--m-btn-color-opposite, #e1b941);opacity:1}@keyframes nav-logo-skeleton-pulse{0%{opacity:.5}50%{opacity:.8}to{opacity:.5}}@keyframes nav-logo-pop{0%{transform:scale(1)}35%{transform:scale(.85)}70%{transform:scale(1.06)}to{transform:scale(1)}}\n"],
41853
42434
  dependencies: [
41854
42435
  {
@@ -41920,6 +42501,16 @@ var NavComponent = class NavComponent {
41920
42501
  "ngSrcset",
41921
42502
  "sizes"
41922
42503
  ]
42504
+ },
42505
+ {
42506
+ kind: "component",
42507
+ type: AppLogoComponent,
42508
+ selector: "m-app-logo",
42509
+ inputs: [
42510
+ "glyph",
42511
+ "appColor",
42512
+ "name"
42513
+ ]
41923
42514
  }
41924
42515
  ],
41925
42516
  changeDetection: i0.ChangeDetectionStrategy.OnPush,
@@ -41939,12 +42530,13 @@ i0.ɵɵngDeclareClassMetadata({
41939
42530
  ButtonGroupComponent,
41940
42531
  ButtonComponent,
41941
42532
  NavDetailsComponent,
41942
- ImgComponent
42533
+ ImgComponent,
42534
+ AppLogoComponent
41943
42535
  ],
41944
42536
  encapsulation: ViewEncapsulation.None,
41945
42537
  changeDetection: ChangeDetectionStrategy.OnPush,
41946
42538
  host: { class: "m-nav" },
41947
- template: "<div class=\"nav\" [class.is-open]=\"isNavOpened()\" [class.is-scrolled-down]=\"isScrolledDown()\">\n <div class=\"nav__header\">\n @if (showLogo()) {\n @if (logo(); as logo) {\n <!-- AppLogo: menu open → home with panel still showing root; closed → home page. -->\n <button\n type=\"button\"\n class=\"nav_logo nav_logo--app\"\n [attr.data-app]=\"logo.app\"\n [attr.aria-label]=\"logo.alt\"\n [class.nav_logo--pop]=\"logoPop()\"\n [class.nav_logo--active]=\"logoActive()\"\n (click)=\"onLogoClick()\"\n (animationend)=\"logoPop.set(false)\"\n >\n <m-img class=\"nav_logo_img\" [src]=\"logo.src\" [alt]=\"logo.alt\" />\n </button>\n } @else if (logoPending()) {\n <div class=\"nav_logo nav_logo--loading\">\n <div class=\"nav_logo-skeleton\"></div>\n </div>\n }\n }\n <div class=\"nav_actions\">\n <m-one-button-group\n class=\"nav_main_group\"\n name=\"nav_main_button_group\"\n [buttons]=\"computedMainButtons()\"\n [vertical]=\"isVertical()\"\n />\n </div>\n @for (app of appRail(); track app.key) {\n <!-- App Rail: the Main Slot's App, then each Side App — opens the panel on its menu. -->\n @if (app.pending) {\n <div class=\"nav_logo nav_logo--loading nav_logo--rail\">\n <div class=\"nav_logo-skeleton\"></div>\n </div>\n } @else {\n <button\n type=\"button\"\n class=\"nav_logo nav_logo--app nav_logo--rail\"\n [attr.data-app]=\"app.key\"\n [attr.aria-label]=\"app.alt\"\n [class.nav_logo--active]=\"app.active\"\n (click)=\"onAppLogoClick(app.appNavId)\"\n >\n <m-img class=\"nav_logo_img\" [src]=\"app.src\" [remote]=\"app.remote\" [alt]=\"app.alt\" />\n </button>\n }\n }\n </div>\n\n <div class=\"nav__body\">\n <m-one-button (clicked)=\"toggleMenu()\" [config]=\"menuButtonConfig()\" />\n </div>\n\n <div class=\"nav__footer\">\n <m-one-button-group name=\"nav_footer_button_group\" [buttons]=\"computedFooterButtons()\" [vertical]=\"isVertical()\" />\n </div>\n</div>\n\n<div\n class=\"nav__backdrop\"\n [class.show]=\"isNavOpened()\"\n (click)=\"toggleMenu()\"\n (keydown.enter)=\"toggleMenu()\"\n tabindex=\"0\"\n></div>\n<m-nav-details />\n",
42539
+ template: "<div class=\"nav\" [class.is-open]=\"isNavOpened()\" [class.is-scrolled-down]=\"isScrolledDown()\">\n <div class=\"nav__header\">\n @if (showLogo()) {\n @if (logo(); as logo) {\n <!-- AppLogo: menu open → home with panel still showing root; closed → home page. -->\n <button\n type=\"button\"\n class=\"nav_logo nav_logo--app\"\n [attr.data-app]=\"logo.app\"\n [attr.aria-label]=\"logo.alt\"\n [class.nav_logo--pop]=\"logoPop()\"\n [class.nav_logo--active]=\"logoActive()\"\n (click)=\"onLogoClick()\"\n (animationend)=\"logoPop.set(false)\"\n >\n @if (logo.src) {\n <m-img class=\"nav_logo_img\" [src]=\"logo.src\" [alt]=\"logo.alt\" />\n } @else {\n <m-app-logo class=\"nav_logo_img\" [glyph]=\"logo.glyph\" [appColor]=\"logo.color\" [name]=\"logo.alt\" />\n }\n </button>\n } @else if (logoPending()) {\n <div class=\"nav_logo nav_logo--loading\">\n <div class=\"nav_logo-skeleton\"></div>\n </div>\n }\n }\n <div class=\"nav_actions\">\n <m-one-button-group\n class=\"nav_main_group\"\n name=\"nav_main_button_group\"\n [buttons]=\"computedMainButtons()\"\n [vertical]=\"isVertical()\"\n />\n </div>\n @for (app of appRail(); track app.key) {\n <!-- App Rail: the Main Slot's App, then each Side App — opens the panel on its menu. -->\n @if (app.pending) {\n <div class=\"nav_logo nav_logo--loading nav_logo--rail\">\n <div class=\"nav_logo-skeleton\"></div>\n </div>\n } @else {\n <button\n type=\"button\"\n class=\"nav_logo nav_logo--app nav_logo--rail\"\n [attr.data-app]=\"app.key\"\n [attr.aria-label]=\"app.alt\"\n [class.nav_logo--active]=\"app.active\"\n (click)=\"onAppLogoClick(app.appNavId)\"\n >\n <m-app-logo class=\"nav_logo_img\" [glyph]=\"app.glyph\" [appColor]=\"app.color\" [name]=\"app.alt\" />\n </button>\n }\n }\n </div>\n\n <div class=\"nav__body\">\n <m-one-button (clicked)=\"toggleMenu()\" [config]=\"menuButtonConfig()\" />\n </div>\n\n <div class=\"nav__footer\">\n <m-one-button-group name=\"nav_footer_button_group\" [buttons]=\"computedFooterButtons()\" [vertical]=\"isVertical()\" />\n </div>\n</div>\n\n<div\n class=\"nav__backdrop\"\n [class.show]=\"isNavOpened()\"\n (click)=\"toggleMenu()\"\n (keydown.enter)=\"toggleMenu()\"\n tabindex=\"0\"\n></div>\n<m-nav-details />\n",
41948
42540
  styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}.m-nav .nav{position:fixed;top:0;left:0;backdrop-filter:blur(16px) brightness(1.1) saturate(1.8) contrast(1.1);-webkit-backdrop-filter:blur(16px) brightness(1.1) saturate(1.8) contrast(1.1);background-color:var(--m-backdrop-glass);border:1px solid var(--m-backdrop-border);border:none;border-right:1px solid color-mix(in srgb,var(--m-border) 55%,transparent);width:64px;height:100%;transition:.4s cubic-bezier(.165,.84,.44,1) .15s ease-in-out;z-index:100;display:flex;flex-direction:column}.m-nav .nav button:not(.primary):not(:has(.nav-lang-label)):hover{background:#ffffff14;transform:scale(1.05);box-shadow:none}.m-nav .nav button:not(.primary):not(:has(.nav-lang-label)):active{transform:scale(.95);box-shadow:none}.m-nav .nav m-one-button:has(.nav-lang-label){--m-button-background: transparent;--m-button-hover-background: transparent;--m-button-border: none;--m-button-shadow: none;--m-button-padding: 0;--m-button-width: 2rem;--m-button-hover-transform: none}.m-nav .nav .button-group{display:flex;flex-direction:column;align-items:center;gap:1.75rem}.m-nav .nav_logo{display:flex;align-items:center;justify-content:center;padding:0;height:64px;width:64px;box-sizing:border-box;position:relative;margin:0 auto}.m-nav .nav_logo:after{content:\"\";position:absolute;bottom:0;left:10%;width:80%;height:2px;background:radial-gradient(ellipse at center,color-mix(in srgb,var(--m-mm) 25%,transparent) 0%,color-mix(in srgb,var(--m-success) 15%,transparent) 40%,transparent 100%);filter:blur(.5px);pointer-events:none;z-index:11}.m-nav .nav_logo.nav_logo--rail:after{content:none}.m-nav .nav_logo.nav_logo--app{border:0;background:transparent!important;font:inherit;color:inherit;cursor:pointer;pointer-events:auto;-webkit-tap-highlight-color:transparent}.m-nav .nav_logo.nav_logo--app:hover{transform:none!important}.m-nav .nav_logo.nav_logo--app .nav_logo_img{display:block;width:32px;height:32px;margin:0 auto;position:relative;z-index:1;border-radius:9px;overflow:hidden;transition:transform .35s cubic-bezier(.34,1.56,.64,1)}.m-nav .nav_logo.nav_logo--app .nav_logo_img img{width:100%;height:100%;object-fit:cover}.m-nav .nav_logo.nav_logo--app:hover .nav_logo_img{transform:scale(1.06)}.m-nav .nav_logo.nav_logo--app:active .nav_logo_img{transform:scale(.88);transition-duration:.1s}.m-nav .nav_logo.nav_logo--app.nav_logo--pop .nav_logo_img{animation:nav-logo-pop .4s cubic-bezier(.34,1.56,.64,1)}.m-nav .nav_logo.nav_logo--app:before{content:\"\";position:absolute;top:50%;left:50%;width:44px;height:44px;border-radius:14px;border:1px solid transparent;transform:translate(-50%,-50%) scale(.85);opacity:0;pointer-events:none;transition:opacity .2s ease,transform .25s cubic-bezier(.34,1.56,.64,1)}.m-nav .nav_logo.nav_logo--app.nav_logo--active:before{opacity:1;transform:translate(-50%,-50%) scale(1);border-color:color-mix(in srgb,var(--m-primary-color) 45%,transparent);background:color-mix(in srgb,var(--m-primary-color) 8%,transparent)}.m-nav .nav_logo.nav_logo--loading{cursor:default!important;pointer-events:none!important}.m-nav .nav_logo.nav_logo--loading .nav_logo-skeleton{width:28px;height:28px;margin:0 auto;border-radius:8px;background:#ffffff14;animation:nav-logo-skeleton-pulse 1.5s infinite ease-in-out}.m-nav .nav_logo svg{width:1.75rem;height:auto;display:block;margin:0 auto;filter:drop-shadow(0 4px 12px color-mix(in srgb,var(--m-mm) 40%,transparent));transition:filter .3s ease-out}.m-nav .nav_logo svg:hover{filter:drop-shadow(0 8px 16px color-mix(in srgb,var(--m-mm) 60%,transparent))}.m-nav .nav_actions{width:100%;flex-direction:column;display:flex;align-items:center;justify-content:center;gap:1.75rem;margin-top:.5rem}.m-nav .nav_actions .nav_main_group{display:flex;flex-direction:column;align-items:center;width:100%}.m-nav .nav_user{width:100%;display:flex;align-items:center;justify-content:center;position:relative;z-index:12}.m-nav .nav__header,.m-nav .nav__footer{width:100%;position:relative;align-items:center;justify-content:center;display:flex;flex-direction:column}.m-nav .nav__body{width:100%;position:relative;flex:1;display:grid;place-items:center}@media(max-width:767px){.m-nav .nav{top:auto!important;bottom:0!important;left:0;right:0;position:fixed;width:100%;height:48px;box-sizing:content-box;display:flex;flex-direction:row;align-items:stretch;border-right:none;border-top:1px solid color-mix(in srgb,var(--m-border) 55%,transparent);padding-bottom:env(safe-area-inset-bottom);will-change:transform,opacity;transition:transform .4s cubic-bezier(.4,0,.2,1),opacity .4s ease;-webkit-backdrop-filter:blur(20px) saturate(180%);backdrop-filter:blur(20px) saturate(180%);background:color-mix(in srgb,var(--m-background) 70%,transparent)}.m-nav .nav.is-scrolled-down{transform:translateY(calc(100% + env(safe-area-inset-bottom)));opacity:0;pointer-events:none}.m-nav .nav .nav__footer{display:none}.m-nav .nav .nav__header{flex:1;display:flex;flex-direction:row;align-items:center;justify-content:space-between;height:100%}.m-nav .nav .nav__header .nav_logo{flex:0 0 64px;display:flex;align-items:center;justify-content:center;height:100%;cursor:pointer}.m-nav .nav .nav__header .nav_logo.nav_logo--loading{cursor:default!important;pointer-events:none!important}.m-nav .nav .nav__header .nav_logo svg{width:1.5rem}.m-nav .nav .nav__header .nav_actions{flex:1;display:flex;flex-direction:row;align-items:center;justify-content:center;gap:.75rem;height:100%}.m-nav .nav .nav__header .nav_actions .nav_main_group{display:flex;align-items:center}.m-nav .nav .nav__header .nav_actions .nav_main_group .button-group{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:center;justify-content:center;gap:.75rem}.m-nav .nav .nav__body{flex:0 0 48px;display:flex;justify-content:flex-end;align-items:center;padding-right:.25rem;height:100%}}@media(min-width:768px)and (max-width:1199px){.m-nav .nav{top:auto!important;bottom:0!important;left:0;right:0;position:fixed;width:100%;height:56px;box-sizing:content-box;display:flex;flex-direction:row;align-items:stretch;border-right:none;border-top:1px solid color-mix(in srgb,var(--m-border) 55%,transparent);padding-bottom:env(safe-area-inset-bottom);will-change:transform,opacity;transition:transform .4s cubic-bezier(.4,0,.2,1),opacity .4s ease;-webkit-backdrop-filter:blur(20px) saturate(180%);backdrop-filter:blur(20px) saturate(180%);background:color-mix(in srgb,var(--m-background) 70%,transparent)}.m-nav .nav.is-scrolled-down{transform:translateY(calc(100% + env(safe-area-inset-bottom)));opacity:0;pointer-events:none}.m-nav .nav .nav__footer{display:none}.m-nav .nav .nav__header{flex:1;display:flex;flex-direction:row;align-items:center;justify-content:space-between;height:100%}.m-nav .nav .nav__header .nav_logo{flex:0 0 72px;display:flex;align-items:center;justify-content:center;height:100%;cursor:pointer}.m-nav .nav .nav__header .nav_logo.nav_logo--loading{cursor:default!important;pointer-events:none!important}.m-nav .nav .nav__header .nav_logo svg{width:1.75rem}.m-nav .nav .nav__header .nav_actions{flex:1;display:flex;flex-direction:row;align-items:center;justify-content:center;gap:1.25rem;height:100%}.m-nav .nav .nav__header .nav_actions .nav_main_group{display:flex;align-items:center}.m-nav .nav .nav__header .nav_actions .nav_main_group .button-group{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:center;justify-content:center;gap:1.25rem}.m-nav .nav .nav__body{flex:0 0 56px;display:flex;justify-content:flex-end;align-items:center;padding-right:.5rem;height:100%}}@keyframes breathe{0%,to{box-shadow:0 2px 8px #00000014,0 0 0 0 transparent}50%{box-shadow:0 6px 16px color-mix(in srgb,var(--m-mm) 20%,transparent),0 0 10px 2px color-mix(in srgb,var(--m-mm) 25%,transparent)}}.m-nav .nav__backdrop{position:fixed;inset:0;z-index:80;opacity:0;pointer-events:none;transition:opacity .4s cubic-bezier(.16,1,.3,1);cursor:pointer}.m-nav .nav__backdrop.show{opacity:1;pointer-events:all}.m-nav .nav-lang-label{font-size:.7rem;font-weight:800;text-transform:uppercase;color:var(--m-text-secondary);opacity:.8;line-height:1;display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;border-radius:2em;background:#00000008;transition:all .2s ease}.m-nav button:has(.nav-lang-label):hover .nav-lang-label{background:#0000000f;opacity:1;color:var(--m-primary-color)}.m-nav button.primary:has(.nav-lang-label) .nav-lang-label{background:var(--m-btn-color-opposite, #e1b941);opacity:1}@keyframes nav-logo-skeleton-pulse{0%{opacity:.5}50%{opacity:.8}to{opacity:.5}}@keyframes nav-logo-pop{0%{transform:scale(1)}35%{transform:scale(.85)}70%{transform:scale(1.06)}to{transform:scale(1)}}\n"]
41949
42541
  }]
41950
42542
  }],
@@ -41982,7 +42574,6 @@ var FooterComponent = class FooterComponent {
41982
42574
  #navStore = inject(NavStore);
41983
42575
  currentYear = (/* @__PURE__ */ new Date()).getFullYear();
41984
42576
  activeApp = this.#navStore.currentWcConfig;
41985
- companyName = computed(() => this.activeApp()?.company ?? "Magmonium India Private Limited", ...ngDevMode ? [{ debugName: "companyName" }] : /* istanbul ignore next */ []);
41986
42577
  static ɵfac = i0.ɵɵngDeclareFactory({
41987
42578
  minVersion: "12.0.0",
41988
42579
  version: "22.2.1",
@@ -42040,7 +42631,8 @@ var FooterComponent = class FooterComponent {
42040
42631
  "size",
42041
42632
  "one",
42042
42633
  "baseUrl",
42043
- "remote"
42634
+ "remote",
42635
+ "shadow"
42044
42636
  ],
42045
42637
  outputs: ["configChange"]
42046
42638
  },
@@ -44243,7 +44835,8 @@ var ThemeCardContentComponent = class ThemeCardContentComponent {
44243
44835
  "size",
44244
44836
  "one",
44245
44837
  "baseUrl",
44246
- "remote"
44838
+ "remote",
44839
+ "shadow"
44247
44840
  ],
44248
44841
  outputs: ["configChange"]
44249
44842
  }, {
@@ -45700,6 +46293,14 @@ function provideMagWcConfig(options) {
45700
46293
  provide: NavStore,
45701
46294
  useFactory: () => SharedStoreRegistry.getNavStore() || SharedStoreRegistry.getHostInjector()?.get(NavStore, null) || null
45702
46295
  },
46296
+ {
46297
+ provide: AppLogoState,
46298
+ useFactory: () => SharedStoreRegistry.getAppLogoState() ?? new AppLogoState()
46299
+ },
46300
+ {
46301
+ provide: APP_THEME_COLOR,
46302
+ useFactory: appThemeColorFactory
46303
+ },
45703
46304
  {
45704
46305
  provide: MODAL_STORE_REF,
45705
46306
  useFactory: () => {
@@ -45900,6 +46501,14 @@ function provideMagAppConfig(options) {
45900
46501
  provide: NavStore,
45901
46502
  useFactory: () => SharedStoreRegistry.getNavStore() || SharedStoreRegistry.getHostInjector()?.get(NavStore, null) || new NavStore()
45902
46503
  },
46504
+ {
46505
+ provide: AppLogoState,
46506
+ useFactory: () => SharedStoreRegistry.getAppLogoState() ?? new AppLogoState()
46507
+ },
46508
+ {
46509
+ provide: APP_THEME_COLOR,
46510
+ useFactory: appThemeColorFactory
46511
+ },
45903
46512
  {
45904
46513
  provide: NAV_STORE_REF,
45905
46514
  useFactory: (localStore) => SharedStoreRegistry.getNavStore() || SharedStoreRegistry.getHostInjector()?.get(NAV_STORE_REF, null) || localStore,
@@ -45919,6 +46528,11 @@ function provideMagAppConfig(options) {
45919
46528
  provide: APP_CONTEXT_REF,
45920
46529
  useFactory: provideAppContext
45921
46530
  },
46531
+ provideAppInitializer(() => {
46532
+ const color = inject(APP_THEME_COLOR);
46533
+ const body = inject(DOCUMENT).body;
46534
+ effect(() => paintAppColor(body, color()));
46535
+ }),
45922
46536
  provideAppInitializer(() => {
45923
46537
  inject(APP_CONTEXT_REF);
45924
46538
  }),
@@ -48026,7 +48640,8 @@ var SvgGeneratorComponent = class SvgGeneratorComponent {
48026
48640
  "size",
48027
48641
  "one",
48028
48642
  "baseUrl",
48029
- "remote"
48643
+ "remote",
48644
+ "shadow"
48030
48645
  ],
48031
48646
  outputs: ["configChange"]
48032
48647
  },
@@ -48291,7 +48906,8 @@ var SearchUserPanelComponent = class SearchUserPanelComponent {
48291
48906
  "size",
48292
48907
  "one",
48293
48908
  "baseUrl",
48294
- "remote"
48909
+ "remote",
48910
+ "shadow"
48295
48911
  ],
48296
48912
  outputs: ["configChange"]
48297
48913
  },
@@ -49214,7 +49830,6 @@ i0.ɵɵngDeclareClassMetadata({
49214
49830
  }]
49215
49831
  }
49216
49832
  });
49217
- const FALLBACK_ICON = "apps";
49218
49833
  var AppTileComponent = class AppTileComponent {
49219
49834
  app = input.required(...ngDevMode ? [{ debugName: "app" }] : /* istanbul ignore next */ []);
49220
49835
  notifications = input([], ...ngDevMode ? [{ debugName: "notifications" }] : /* istanbul ignore next */ []);
@@ -49222,13 +49837,7 @@ var AppTileComponent = class AppTileComponent {
49222
49837
  openApp = output();
49223
49838
  clearAll = output();
49224
49839
  expanded = signal(false, ...ngDevMode ? [{ debugName: "expanded" }] : /* istanbul ignore next */ []);
49225
- fallback = FALLBACK_ICON;
49226
49840
  icon = computed(() => this.app()?.icon, ...ngDevMode ? [{ debugName: "icon" }] : /* istanbul ignore next */ []);
49227
- remote = computed(() => this.app()?.remote, ...ngDevMode ? [{ debugName: "remote" }] : /* istanbul ignore next */ []);
49228
- isUrl = computed(() => {
49229
- const icon = this.icon();
49230
- return !!icon && (icon.startsWith("http") || icon.startsWith("/") || icon.includes("."));
49231
- }, ...ngDevMode ? [{ debugName: "isUrl" }] : /* istanbul ignore next */ []);
49232
49841
  notificationCount = computed(() => this.notifications().length, ...ngDevMode ? [{ debugName: "notificationCount" }] : /* istanbul ignore next */ []);
49233
49842
  expandOrNavigate = (_event) => {
49234
49843
  if (this.expanded()) {
@@ -49307,10 +49916,10 @@ var AppTileComponent = class AppTileComponent {
49307
49916
  @if (expanded()) {
49308
49917
  <div class="app-tile__header">
49309
49918
  <div class="app-tile__header-icon">
49310
- @if (isUrl()) {
49311
- <m-img [src]="icon()!" [remote]="remote()" [alt]="app.name" />
49919
+ @if (icon(); as name) {
49920
+ <m-icon [name]="name" color="mm" />
49312
49921
  } @else {
49313
- <m-icon [name]="icon() || fallback" color="mm" />
49922
+ <m-app-logo [glyph]="app.logoGlyph" [appColor]="app.appColor" [name]="app.name" />
49314
49923
  }
49315
49924
  </div>
49316
49925
  <span class="app-tile__header-name">{{ app.name }}</span>
@@ -49326,13 +49935,13 @@ var AppTileComponent = class AppTileComponent {
49326
49935
  </div>
49327
49936
  } @else {
49328
49937
  <div class="app-tile__icon-wrapper">
49329
- @if (isUrl()) {
49330
- <div class="app-tile__custom-icon">
49331
- <m-img [src]="icon()!" [remote]="remote()" [alt]="app.name" />
49938
+ @if (icon(); as name) {
49939
+ <div class="app-tile__icon">
49940
+ <m-icon [name]="name" />
49332
49941
  </div>
49333
49942
  } @else {
49334
- <div class="app-tile__icon">
49335
- <m-icon [name]="icon() || fallback" />
49943
+ <div class="app-tile__custom-icon">
49944
+ <m-app-logo [glyph]="app.logoGlyph" [appColor]="app.appColor" [name]="app.name" />
49336
49945
  </div>
49337
49946
  }
49338
49947
  @if (notificationCount() > 0) {
@@ -49349,20 +49958,12 @@ var AppTileComponent = class AppTileComponent {
49349
49958
  dependencies: [
49350
49959
  {
49351
49960
  kind: "component",
49352
- type: ImgComponent,
49353
- selector: "m-img",
49961
+ type: AppLogoComponent,
49962
+ selector: "m-app-logo",
49354
49963
  inputs: [
49355
- "src",
49356
- "data",
49357
- "dataType",
49358
- "alt",
49359
- "priority",
49360
- "fill",
49361
- "width",
49362
- "height",
49363
- "remote",
49364
- "ngSrcset",
49365
- "sizes"
49964
+ "glyph",
49965
+ "appColor",
49966
+ "name"
49366
49967
  ]
49367
49968
  },
49368
49969
  {
@@ -49376,7 +49977,8 @@ var AppTileComponent = class AppTileComponent {
49376
49977
  "size",
49377
49978
  "one",
49378
49979
  "baseUrl",
49379
- "remote"
49980
+ "remote",
49981
+ "shadow"
49380
49982
  ],
49381
49983
  outputs: ["configChange"]
49382
49984
  },
@@ -49422,7 +50024,7 @@ i0.ɵɵngDeclareClassMetadata({
49422
50024
  selector: "m-app-tile",
49423
50025
  changeDetection: ChangeDetectionStrategy.OnPush,
49424
50026
  imports: [
49425
- ImgComponent,
50027
+ AppLogoComponent,
49426
50028
  IconComponent,
49427
50029
  BadgeComponent,
49428
50030
  ButtonGroupComponent,
@@ -49444,10 +50046,10 @@ i0.ɵɵngDeclareClassMetadata({
49444
50046
  @if (expanded()) {
49445
50047
  <div class="app-tile__header">
49446
50048
  <div class="app-tile__header-icon">
49447
- @if (isUrl()) {
49448
- <m-img [src]="icon()!" [remote]="remote()" [alt]="app.name" />
50049
+ @if (icon(); as name) {
50050
+ <m-icon [name]="name" color="mm" />
49449
50051
  } @else {
49450
- <m-icon [name]="icon() || fallback" color="mm" />
50052
+ <m-app-logo [glyph]="app.logoGlyph" [appColor]="app.appColor" [name]="app.name" />
49451
50053
  }
49452
50054
  </div>
49453
50055
  <span class="app-tile__header-name">{{ app.name }}</span>
@@ -49463,13 +50065,13 @@ i0.ɵɵngDeclareClassMetadata({
49463
50065
  </div>
49464
50066
  } @else {
49465
50067
  <div class="app-tile__icon-wrapper">
49466
- @if (isUrl()) {
49467
- <div class="app-tile__custom-icon">
49468
- <m-img [src]="icon()!" [remote]="remote()" [alt]="app.name" />
50068
+ @if (icon(); as name) {
50069
+ <div class="app-tile__icon">
50070
+ <m-icon [name]="name" />
49469
50071
  </div>
49470
50072
  } @else {
49471
- <div class="app-tile__icon">
49472
- <m-icon [name]="icon() || fallback" />
50073
+ <div class="app-tile__custom-icon">
50074
+ <m-app-logo [glyph]="app.logoGlyph" [appColor]="app.appColor" [name]="app.name" />
49473
50075
  </div>
49474
50076
  }
49475
50077
  @if (notificationCount() > 0) {
@@ -49730,7 +50332,8 @@ var AudiencePickerBoxComponent = class AudiencePickerBoxComponent {
49730
50332
  "size",
49731
50333
  "one",
49732
50334
  "baseUrl",
49733
- "remote"
50335
+ "remote",
50336
+ "shadow"
49734
50337
  ],
49735
50338
  outputs: ["configChange"]
49736
50339
  },
@@ -50115,6 +50718,6 @@ i0.ɵɵngDeclareClassMetadata({
50115
50718
  }]
50116
50719
  }
50117
50720
  });
50118
- export { ACCESS_DOMAINS, APP_CONTEXT_REF, APP_LINK, ASSET_BASE_URL, AUDIENCE_ICONS, AUDIENCE_LEVELS, AccordionBodyDirective, AccordionComponent, AccordionGroupComponent, ActionComponent, AnimatedGraphsComponent, AppAvailability, AppCardComponent, 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, LanguageComponent, ListComponent, LogoComponent, 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, 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, isLoadingComputed, isLocalhost, isNavInstanceConfig, isNavMenuConfig, isNavRowsConfig, isNavVisibilityConfig, isPlatformNavId, isPlatformPanelNavId, isSize, isTierPreview, isUrlLocalhost, isValidNavId, isValidNavSegment, isWebComponent, linkToId, linkToNav, loadingActions, 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, 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, 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 };
50119
50722
 
50120
50723
  //# sourceMappingURL=magmonium-one.mjs.map