@magmonium/one 0.4.50 → 0.4.52

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 (62) hide show
  1. package/assets/docs/en/app-release.md +14 -7
  2. package/fesm2022/{magmonium-one-attribute-value-CSl5Xeq1.mjs → magmonium-one-attribute-value-BobQXKUK.mjs} +3 -3
  3. package/fesm2022/{magmonium-one-attribute-value-CSl5Xeq1.mjs.map → magmonium-one-attribute-value-BobQXKUK.mjs.map} +1 -1
  4. package/fesm2022/{magmonium-one-base-checkbox-BqCPBI1d.mjs → magmonium-one-base-checkbox-bwMjlhHR.mjs} +2 -2
  5. package/fesm2022/{magmonium-one-base-checkbox-BqCPBI1d.mjs.map → magmonium-one-base-checkbox-bwMjlhHR.mjs.map} +1 -1
  6. package/fesm2022/{magmonium-one-base-dropdown-Dxo8Yd62.mjs → magmonium-one-base-dropdown-7XYsiJBX.mjs} +12 -12
  7. package/fesm2022/{magmonium-one-base-dropdown-Dxo8Yd62.mjs.map → magmonium-one-base-dropdown-7XYsiJBX.mjs.map} +1 -1
  8. package/fesm2022/{magmonium-one-base-input-CsVND89n.mjs → magmonium-one-base-input-KRWQalNW.mjs} +2 -2
  9. package/fesm2022/{magmonium-one-base-input-CsVND89n.mjs.map → magmonium-one-base-input-KRWQalNW.mjs.map} +1 -1
  10. package/fesm2022/{magmonium-one-base-text-CWf7J75v.mjs → magmonium-one-base-text-HyEol70U.mjs} +2 -2
  11. package/fesm2022/{magmonium-one-base-text-CWf7J75v.mjs.map → magmonium-one-base-text-HyEol70U.mjs.map} +1 -1
  12. package/fesm2022/{magmonium-one-button-CJ1Gaaw-.mjs → magmonium-one-button-B1KCA8KO.mjs} +7 -7
  13. package/fesm2022/{magmonium-one-button-CJ1Gaaw-.mjs.map → magmonium-one-button-B1KCA8KO.mjs.map} +1 -1
  14. package/fesm2022/{magmonium-one-checkbox-CS83TVYG.mjs → magmonium-one-checkbox-CbEdjmtz.mjs} +5 -5
  15. package/fesm2022/{magmonium-one-checkbox-CS83TVYG.mjs.map → magmonium-one-checkbox-CbEdjmtz.mjs.map} +1 -1
  16. package/fesm2022/{magmonium-one-color-utl-td5Lij8L.mjs → magmonium-one-color-utl-Bd80JrEQ.mjs} +2 -2
  17. package/fesm2022/{magmonium-one-color-utl-td5Lij8L.mjs.map → magmonium-one-color-utl-Bd80JrEQ.mjs.map} +1 -1
  18. package/fesm2022/{magmonium-one-directives-O1JyFBc3.mjs → magmonium-one-directives-C_i3gUFT.mjs} +4 -4
  19. package/fesm2022/{magmonium-one-directives-O1JyFBc3.mjs.map → magmonium-one-directives-C_i3gUFT.mjs.map} +1 -1
  20. package/fesm2022/{magmonium-one-group-CYIO2BE-.mjs → magmonium-one-group-C7alQqSj.mjs} +7 -7
  21. package/fesm2022/{magmonium-one-group-CYIO2BE-.mjs.map → magmonium-one-group-C7alQqSj.mjs.map} +1 -1
  22. package/fesm2022/{magmonium-one-header-7MmiF2rG.mjs → magmonium-one-header-CckG0DHr.mjs} +4 -4
  23. package/fesm2022/{magmonium-one-header-7MmiF2rG.mjs.map → magmonium-one-header-CckG0DHr.mjs.map} +1 -1
  24. package/fesm2022/{magmonium-one-icon-DR7LgBc3.mjs → magmonium-one-icon-dAR6gd-q.mjs} +4 -4
  25. package/fesm2022/{magmonium-one-icon-DR7LgBc3.mjs.map → magmonium-one-icon-dAR6gd-q.mjs.map} +1 -1
  26. package/fesm2022/{magmonium-one-image-editor-CkPeheGY.mjs → magmonium-one-image-editor-DHlktZ6z.mjs} +4 -4
  27. package/fesm2022/{magmonium-one-image-editor-CkPeheGY.mjs.map → magmonium-one-image-editor-DHlktZ6z.mjs.map} +1 -1
  28. package/fesm2022/{magmonium-one-label-B2Rtuiyg.mjs → magmonium-one-label-B95NhEzQ.mjs} +2 -2
  29. package/fesm2022/{magmonium-one-label-B2Rtuiyg.mjs.map → magmonium-one-label-B95NhEzQ.mjs.map} +1 -1
  30. package/fesm2022/{magmonium-one-m-ref-X9KgVe86.mjs → magmonium-one-m-ref-BdP7Kzhk.mjs} +2 -2
  31. package/fesm2022/{magmonium-one-m-ref-X9KgVe86.mjs.map → magmonium-one-m-ref-BdP7Kzhk.mjs.map} +1 -1
  32. package/fesm2022/{magmonium-one-menu-Dstqv7P7.mjs → magmonium-one-menu-DmZJi88Y.mjs} +8 -8
  33. package/fesm2022/{magmonium-one-menu-Dstqv7P7.mjs.map → magmonium-one-menu-DmZJi88Y.mjs.map} +1 -1
  34. package/fesm2022/{magmonium-one-multi-range-OzTdXSHR.mjs → magmonium-one-multi-range-BnWtK-O0.mjs} +3 -3
  35. package/fesm2022/{magmonium-one-multi-range-OzTdXSHR.mjs.map → magmonium-one-multi-range-BnWtK-O0.mjs.map} +1 -1
  36. package/fesm2022/{magmonium-one-options-asset-BlrhLckD.mjs → magmonium-one-options-asset-By4-vPVk.mjs} +2 -2
  37. package/fesm2022/{magmonium-one-options-asset-BlrhLckD.mjs.map → magmonium-one-options-asset-By4-vPVk.mjs.map} +1 -1
  38. package/fesm2022/{magmonium-one-otp-CkQohg0H.mjs → magmonium-one-otp-BOiv-9eT.mjs} +5 -5
  39. package/fesm2022/{magmonium-one-otp-CkQohg0H.mjs.map → magmonium-one-otp-BOiv-9eT.mjs.map} +1 -1
  40. package/fesm2022/{magmonium-one-password-CLhWaUXK.mjs → magmonium-one-password-Bsv1wUIJ.mjs} +6 -6
  41. package/fesm2022/{magmonium-one-password-CLhWaUXK.mjs.map → magmonium-one-password-Bsv1wUIJ.mjs.map} +1 -1
  42. package/fesm2022/{magmonium-one-radio-dZL0E4k_.mjs → magmonium-one-radio-BsQv0Wof.mjs} +3 -3
  43. package/fesm2022/{magmonium-one-radio-dZL0E4k_.mjs.map → magmonium-one-radio-BsQv0Wof.mjs.map} +1 -1
  44. package/fesm2022/{magmonium-one-range-DLu5PhUN.mjs → magmonium-one-range-DPR659yG.mjs} +4 -4
  45. package/fesm2022/{magmonium-one-range-DLu5PhUN.mjs.map → magmonium-one-range-DPR659yG.mjs.map} +1 -1
  46. package/fesm2022/{magmonium-one-selector-GGFfBf2O.mjs → magmonium-one-selector-CXZMCqmO.mjs} +4 -4
  47. package/fesm2022/{magmonium-one-selector-GGFfBf2O.mjs.map → magmonium-one-selector-CXZMCqmO.mjs.map} +1 -1
  48. package/fesm2022/{magmonium-one-size-converter-BalJd7VH.mjs → magmonium-one-size-converter-BOLtxL8d.mjs} +6 -3
  49. package/fesm2022/magmonium-one-size-converter-BOLtxL8d.mjs.map +1 -0
  50. package/fesm2022/{magmonium-one-text-BPThK6-y.mjs → magmonium-one-text-Bo4XPBXB.mjs} +6 -6
  51. package/fesm2022/{magmonium-one-text-BPThK6-y.mjs.map → magmonium-one-text-Bo4XPBXB.mjs.map} +1 -1
  52. package/fesm2022/{magmonium-one-text-output-Cg2dT_U_.mjs → magmonium-one-text-output-Dkx0i1iu.mjs} +4 -4
  53. package/fesm2022/{magmonium-one-text-output-Cg2dT_U_.mjs.map → magmonium-one-text-output-Dkx0i1iu.mjs.map} +1 -1
  54. package/fesm2022/magmonium-one-theme-Ce9i3H3R.mjs +1 -0
  55. package/fesm2022/{magmonium-one-toggle-DRG14zhR.mjs → magmonium-one-toggle-C5-GwMSQ.mjs} +3 -3
  56. package/fesm2022/{magmonium-one-toggle-DRG14zhR.mjs.map → magmonium-one-toggle-C5-GwMSQ.mjs.map} +1 -1
  57. package/fesm2022/magmonium-one.mjs +257 -106
  58. package/fesm2022/magmonium-one.mjs.map +1 -1
  59. package/package.json +1 -1
  60. package/types/magmonium-one.d.ts +135 -64
  61. package/fesm2022/magmonium-one-size-converter-BalJd7VH.mjs.map +0 -1
  62. package/fesm2022/magmonium-one-theme-CYT4pn5X.mjs +0 -1
@@ -1,30 +1,30 @@
1
1
  import { t as __exportAll } from "./magmonium-one-rolldown-runtime-DpJrqANO.mjs";
2
- import { $ as SEARCH_RESULTS_EVENT, A as isLocalhost, B as FOLDER_PICK_LISTENER, C as definedWcTierOf, D as wcLocalBaseOf, E as setWcTier, F as APP_LINK, G as LOADING_ACTIONS_REF, H as ICON_SOURCE, I as ASSET_BASE_URL, J as MODAL_STORE_REF, K as LOGIN_COMPONENT, L as AppAvailability, M as isUrlLocalhost, N as isWebComponent, O as wcTierOf, P as APP_CONTEXT_REF, Q as SEARCH_QUERY, R as AppRelationType, S as definedWcBundleOf, T as setWcLocalPort, U as IS_DESIGN_MODE, V as HOST_SESSION, W as IS_SIDE_PANEL, X as ONE_ASSET_BASE_URL, Y as NAV_STORE_REF, Z as OPTIONS_SOURCE, _ as StorageService, a as resolveSpacing, at as LAYOUT_ASSET_FOLDER, b as HttpService, c as TranslatePipe, ct as Size, d as browserLocale, et as TRANSLATION_SOURCE, f as escapeHtml, g as SharedStoreRegistry, h as AssetStore, i as resolveSize, it as FORM_ASSET_FOLDER, j as isTierPreview, k as getTierFromPreviewPath, l as TranslateService, m as miniMarkToHtml, n as isSize, nt as WC_BUNDLE, o as toCssLength, ot as Assets, p as miniMarkInlineToHtml, q as LOGIN_STORE, r as resolveIconSize, rt as WC_SEARCH_GROUPS, s as toLength, st as DEFAULT_SIZE, t as coerceSize, tt as USER_STORE_REF, u as BrowserLocaleService, v as isJson, w as recordDefinedWcTier, x as buildWcBaseUrl, y as ACCESS_DOMAINS, z as COMPONENT_INPUT_REGISTRY } from "./magmonium-one-size-converter-BalJd7VH.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-GGFfBf2O.mjs";
2
+ import { $ as SEARCH_RESULTS_EVENT, A as isLocalhost, B as FOLDER_PICK_LISTENER, C as definedWcTierOf, D as wcLocalBaseOf, E as setWcTier, F as APP_LINK, G as LOADING_ACTIONS_REF, H as ICON_SOURCE, I as ASSET_BASE_URL, J as MODAL_STORE_REF, K as LOGIN_COMPONENT, L as AppAvailability, M as isUrlLocalhost, N as isWebComponent, O as wcTierOf, P as APP_CONTEXT_REF, Q as SEARCH_QUERY, R as AppRelationType, S as definedWcBundleOf, T as setWcLocalPort, U as IS_DESIGN_MODE, V as HOST_SESSION, W as IS_SIDE_PANEL, X as ONE_ASSET_BASE_URL, Y as NAV_STORE_REF, Z as OPTIONS_SOURCE, _ as StorageService, a as resolveSpacing, at as LAYOUT_ASSET_FOLDER, b as HttpService, c as TranslatePipe, ct as Size, d as browserLocale, et as TRANSLATION_SOURCE, f as escapeHtml, g as SharedStoreRegistry, h as AssetStore, i as resolveSize, it as FORM_ASSET_FOLDER, j as isTierPreview, k as getTierFromPreviewPath, l as TranslateService, m as miniMarkToHtml, n as isSize, nt as WC_BUNDLE, o as toCssLength, ot as Assets, p as miniMarkInlineToHtml, q as LOGIN_STORE, r as resolveIconSize, rt as WC_SEARCH_GROUPS, s as toLength, st as DEFAULT_SIZE, t as coerceSize, tt as USER_STORE_REF, u as BrowserLocaleService, v as isJson, w as recordDefinedWcTier, x as buildWcBaseUrl, y as ACCESS_DOMAINS, z as COMPONENT_INPUT_REGISTRY } from "./magmonium-one-size-converter-BOLtxL8d.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-CXZMCqmO.mjs";
4
4
  import { t as FileService } from "./magmonium-one-file.service-Bo06pU3_.mjs";
5
- import { C as isLightAppColor, D as readableAppColor, E as normalizeAppColor, O as rebuildLogoGlyph, S as appLogoShadowColor, T as logoGlyphMaskUrl, _ 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, k as ThemeDataService, 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 isReadableOn, x as appColorBrand, y as paintAppColor } from "./magmonium-one-color-utl-td5Lij8L.mjs";
6
- import "./magmonium-one-theme-CYT4pn5X.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-B2Rtuiyg.mjs";
8
- 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-DR7LgBc3.mjs";
9
- import { i as resolveConfigAsset, n as toAttrNumber, r as ConfigComponent, t as toAttrBool } from "./magmonium-one-attribute-value-CSl5Xeq1.mjs";
10
- 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-CJ1Gaaw-.mjs";
11
- import { t as MRefDirective } from "./magmonium-one-m-ref-X9KgVe86.mjs";
12
- import { i as OptionsSourceDirective, n as normalizeAssetOptions, r as presetDefaultOption, t as assetOptions } from "./magmonium-one-options-asset-BlrhLckD.mjs";
5
+ import { C as isLightAppColor, D as readableAppColor, E as normalizeAppColor, O as rebuildLogoGlyph, S as appLogoShadowColor, T as logoGlyphMaskUrl, _ 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, k as ThemeDataService, 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 isReadableOn, x as appColorBrand, y as paintAppColor } from "./magmonium-one-color-utl-Bd80JrEQ.mjs";
6
+ import "./magmonium-one-theme-Ce9i3H3R.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-B95NhEzQ.mjs";
8
+ 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-dAR6gd-q.mjs";
9
+ import { i as resolveConfigAsset, n as toAttrNumber, r as ConfigComponent, t as toAttrBool } from "./magmonium-one-attribute-value-BobQXKUK.mjs";
10
+ 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-B1KCA8KO.mjs";
11
+ import { t as MRefDirective } from "./magmonium-one-m-ref-BdP7Kzhk.mjs";
12
+ import { i as OptionsSourceDirective, n as normalizeAssetOptions, r as presetDefaultOption, t as assetOptions } from "./magmonium-one-options-asset-By4-vPVk.mjs";
13
13
  import { t as InputType } from "./magmonium-one-input-DqHPorA1.mjs";
14
- import { r as PLACED_CHECKBOX, t as CheckboxInputComponent } from "./magmonium-one-checkbox-CS83TVYG.mjs";
15
- import { a as ToolTipDirective, c as DragListItemDirective, d as MarginDirective, f as PaddingDirective, i as PositionDirective, l as DragListDirective, n as stringToColor, o as FileUploadDirective, p as SPACING_INWARD, r as HighlightDirective, s as AutosizeDirective, t as MHeroColorDirective, u as DraggableDirective } from "./magmonium-one-directives-O1JyFBc3.mjs";
16
- import { t as HeaderComponent } from "./magmonium-one-header-7MmiF2rG.mjs";
17
- import { i as mergeUniqueWith, n as mergeUnique, r as mergeUniqueBy, t as ButtonGroupComponent } from "./magmonium-one-group-CYIO2BE-.mjs";
18
- import { n as ContextMenuBoxComponent, r as MenuComponent, t as ContextMenuComponent } from "./magmonium-one-menu-Dstqv7P7.mjs";
19
- import { t as BaseInputComponent } from "./magmonium-one-base-input-CsVND89n.mjs";
20
- import { i as getScrollParent, n as activeElementWithin, r as classListSignal, t as BaseTextInputComponent } from "./magmonium-one-base-text-CWf7J75v.mjs";
21
- import { t as TextOutputComponent } from "./magmonium-one-text-output-Cg2dT_U_.mjs";
22
- import { t as BaseCheckboxInputComponent } from "./magmonium-one-base-checkbox-BqCPBI1d.mjs";
23
- import { t as RadioInputComponent } from "./magmonium-one-radio-dZL0E4k_.mjs";
24
- import { t as TextInputComponent } from "./magmonium-one-text-BPThK6-y.mjs";
25
- import { r as BaseArrayInputComponent, t as MultiRangeInputComponent } from "./magmonium-one-multi-range-OzTdXSHR.mjs";
26
- import { t as RangeInputComponent } from "./magmonium-one-range-DLu5PhUN.mjs";
27
- import { n as DROPDOWN_IMPORTS, r as DROPDOWN_TEMPLATE, t as BaseDropdownComponent } from "./magmonium-one-base-dropdown-Dxo8Yd62.mjs";
14
+ import { r as PLACED_CHECKBOX, t as CheckboxInputComponent } from "./magmonium-one-checkbox-CbEdjmtz.mjs";
15
+ import { a as ToolTipDirective, c as DragListItemDirective, d as MarginDirective, f as PaddingDirective, i as PositionDirective, l as DragListDirective, n as stringToColor, o as FileUploadDirective, p as SPACING_INWARD, r as HighlightDirective, s as AutosizeDirective, t as MHeroColorDirective, u as DraggableDirective } from "./magmonium-one-directives-C_i3gUFT.mjs";
16
+ import { t as HeaderComponent } from "./magmonium-one-header-CckG0DHr.mjs";
17
+ import { i as mergeUniqueWith, n as mergeUnique, r as mergeUniqueBy, t as ButtonGroupComponent } from "./magmonium-one-group-C7alQqSj.mjs";
18
+ import { n as ContextMenuBoxComponent, r as MenuComponent, t as ContextMenuComponent } from "./magmonium-one-menu-DmZJi88Y.mjs";
19
+ import { t as BaseInputComponent } from "./magmonium-one-base-input-KRWQalNW.mjs";
20
+ import { i as getScrollParent, n as activeElementWithin, r as classListSignal, t as BaseTextInputComponent } from "./magmonium-one-base-text-HyEol70U.mjs";
21
+ import { t as TextOutputComponent } from "./magmonium-one-text-output-Dkx0i1iu.mjs";
22
+ import { t as BaseCheckboxInputComponent } from "./magmonium-one-base-checkbox-bwMjlhHR.mjs";
23
+ import { t as RadioInputComponent } from "./magmonium-one-radio-BsQv0Wof.mjs";
24
+ import { t as TextInputComponent } from "./magmonium-one-text-Bo4XPBXB.mjs";
25
+ import { r as BaseArrayInputComponent, t as MultiRangeInputComponent } from "./magmonium-one-multi-range-BnWtK-O0.mjs";
26
+ import { t as RangeInputComponent } from "./magmonium-one-range-DPR659yG.mjs";
27
+ import { n as DROPDOWN_IMPORTS, r as DROPDOWN_TEMPLATE, t as BaseDropdownComponent } from "./magmonium-one-base-dropdown-7XYsiJBX.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";
@@ -744,12 +744,12 @@ var SectionFormItemComponent = class SectionFormItemComponent extends ConfigComp
744
744
  try {
745
745
  switch (type) {
746
746
  case InputType.RADIO: {
747
- const { RadioInputComponent } = await import("./magmonium-one-radio-dZL0E4k_.mjs").then((n) => n.n);
747
+ const { RadioInputComponent } = await import("./magmonium-one-radio-BsQv0Wof.mjs").then((n) => n.n);
748
748
  this.createDynamicComponent(seq, RadioInputComponent);
749
749
  break;
750
750
  }
751
751
  case InputType.TOGGLE: {
752
- const { ToggleInputComponent } = await import("./magmonium-one-toggle-DRG14zhR.mjs");
752
+ const { ToggleInputComponent } = await import("./magmonium-one-toggle-C5-GwMSQ.mjs");
753
753
  this.createDynamicComponent(seq, ToggleInputComponent, [], true);
754
754
  break;
755
755
  }
@@ -759,12 +759,12 @@ var SectionFormItemComponent = class SectionFormItemComponent extends ConfigComp
759
759
  break;
760
760
  }
761
761
  case InputType.PASSWORD: {
762
- const { PasswordInputComponent } = await import("./magmonium-one-password-CLhWaUXK.mjs");
762
+ const { PasswordInputComponent } = await import("./magmonium-one-password-Bsv1wUIJ.mjs");
763
763
  this.createDynamicComponent(seq, PasswordInputComponent);
764
764
  break;
765
765
  }
766
766
  case InputType.OTP: {
767
- const { OtpInputComponent } = await import("./magmonium-one-otp-CkQohg0H.mjs");
767
+ const { OtpInputComponent } = await import("./magmonium-one-otp-BOiv-9eT.mjs");
768
768
  this.createDynamicComponent(seq, OtpInputComponent);
769
769
  break;
770
770
  }
@@ -774,7 +774,7 @@ var SectionFormItemComponent = class SectionFormItemComponent extends ConfigComp
774
774
  break;
775
775
  }
776
776
  case InputType.CHECKBOX: {
777
- const { CheckboxInputComponent } = await import("./magmonium-one-checkbox-CS83TVYG.mjs").then((n) => n.n);
777
+ const { CheckboxInputComponent } = await import("./magmonium-one-checkbox-CbEdjmtz.mjs").then((n) => n.n);
778
778
  this.createDynamicComponent(seq, CheckboxInputComponent, [], true);
779
779
  break;
780
780
  }
@@ -789,12 +789,12 @@ var SectionFormItemComponent = class SectionFormItemComponent extends ConfigComp
789
789
  break;
790
790
  }
791
791
  case InputType.RANGE: {
792
- const { RangeInputComponent } = await import("./magmonium-one-range-DLu5PhUN.mjs").then((n) => n.n);
792
+ const { RangeInputComponent } = await import("./magmonium-one-range-DPR659yG.mjs").then((n) => n.n);
793
793
  this.createDynamicComponent(seq, RangeInputComponent);
794
794
  break;
795
795
  }
796
796
  case InputType.MULTI_RANGE: {
797
- const { MultiRangeInputComponent } = await import("./magmonium-one-multi-range-OzTdXSHR.mjs").then((n) => n.n);
797
+ const { MultiRangeInputComponent } = await import("./magmonium-one-multi-range-BnWtK-O0.mjs").then((n) => n.n);
798
798
  this.createDynamicComponent(seq, MultiRangeInputComponent);
799
799
  break;
800
800
  }
@@ -845,7 +845,7 @@ var SectionFormItemComponent = class SectionFormItemComponent extends ConfigComp
845
845
  break;
846
846
  }
847
847
  default: {
848
- const { TextInputComponent } = await import("./magmonium-one-text-BPThK6-y.mjs").then((n) => n.n);
848
+ const { TextInputComponent } = await import("./magmonium-one-text-Bo4XPBXB.mjs").then((n) => n.n);
849
849
  this.createDynamicComponent(seq, TextInputComponent);
850
850
  break;
851
851
  }
@@ -13314,7 +13314,7 @@ const mInterceptor = (incoming, next) => {
13314
13314
  const authBaseUrl = httpService.getAuthUrl();
13315
13315
  const isBackend = incoming.url.startsWith(baseUrl) || incoming.url.startsWith(authBaseUrl);
13316
13316
  const appLink = inject(APP_LINK)();
13317
- const request = appLink && incoming.url.startsWith(baseUrl) ? incoming.clone({ setHeaders: { [CALLING_APP_HEADER]: appLink } }) : incoming;
13317
+ const request = appLink && incoming.url.startsWith(baseUrl) && !incoming.headers.has("X-Mag-App") ? incoming.clone({ setHeaders: { [CALLING_APP_HEADER]: appLink } }) : incoming;
13318
13318
  const authenticate = injectAuthenticate();
13319
13319
  const renewSession = injectRenewSession();
13320
13320
  const hostSession = inject(HOST_SESSION);
@@ -13782,6 +13782,9 @@ function isNavRowsConfig(entry) {
13782
13782
  function isNavInstanceConfig(entry) {
13783
13783
  return typeof entry === "object" && "navInstance" in entry;
13784
13784
  }
13785
+ function isNavCountConfig(entry) {
13786
+ return typeof entry === "object" && "navCount" in entry;
13787
+ }
13785
13788
  function isNavVisibilityConfig(entry) {
13786
13789
  return typeof entry === "object" && "navVisible" in entry;
13787
13790
  }
@@ -14049,7 +14052,7 @@ const mergeTrail = (derived, override, derivedHeader) => {
14049
14052
  };
14050
14053
  };
14051
14054
  function deriveBreadcrumb(params) {
14052
- const { navId, navMap, anchor, breadcrumb, navMenu, hasOwnContent, dynamicRows, routeParams, instances, hidden = EMPTY_HIDDEN, transparent = EMPTY_HIDDEN } = params;
14055
+ const { navId, navMap, anchor, breadcrumb, navMenu, hasOwnContent, dynamicRows, routeParams, instances, hidden = EMPTY_HIDDEN, transparent = EMPTY_HIDDEN, counts } = params;
14053
14056
  if (!navId) return emptyResult();
14054
14057
  const instanceOf = (id) => {
14055
14058
  const nav = navMap[id];
@@ -14088,12 +14091,20 @@ function deriveBreadcrumb(params) {
14088
14091
  trail: derivedTrail,
14089
14092
  header: derivedHeader
14090
14093
  };
14094
+ const withCount = (entry) => {
14095
+ const badge = counts?.[entry.nav ?? entry.id];
14096
+ return badge ? {
14097
+ ...entry,
14098
+ badge
14099
+ } : entry;
14100
+ };
14101
+ const menus = navMenu?.length && ownPanel ? navMenu : buildNavMenus(ownerId, navMap, anchor, dynamicRows, routeParams, instances, hidden, transparent);
14091
14102
  return {
14092
14103
  breadcrumb: {
14093
- trail,
14094
- header
14104
+ trail: (trail ?? []).map(withCount),
14105
+ header: withCount(header)
14095
14106
  },
14096
- navMenus: navMenu?.length && ownPanel ? navMenu : buildNavMenus(ownerId, navMap, anchor, dynamicRows, routeParams, instances, hidden, transparent)
14107
+ navMenus: menus.map(withCount)
14097
14108
  };
14098
14109
  }
14099
14110
  const withOpenOutlets = (router, address) => {
@@ -14228,7 +14239,6 @@ const initialState$3 = {
14228
14239
  menuNavId: void 0,
14229
14240
  menuParams: void 0,
14230
14241
  browsedApp: void 0,
14231
- keepPanelOnPathChange: false,
14232
14242
  panelPushed: false,
14233
14243
  navScrolledDown: false,
14234
14244
  visibilityAnswers: {},
@@ -14382,6 +14392,11 @@ const NavStore = signalStore({ providedIn: "root" }, withState(initialState$3),
14382
14392
  const hasMurl = computed(() => store.murl().length > 0, ...ngDevMode ? [{ debugName: "hasMurl" }] : /* istanbul ignore next */ []);
14383
14393
  const isNavOpened = computed(() => hasMurl() || store.navOpenedByUser(), ...ngDevMode ? [{ debugName: "isNavOpened" }] : /* istanbul ignore next */ []);
14384
14394
  const isMNavOpened = hasMurl;
14395
+ const isSideMenuOpen = computed(() => {
14396
+ if (!isNavOpened()) return false;
14397
+ const navId = id();
14398
+ return menuMounts().some(({ urlMode, link, appNavId }) => urlMode === "outlet" && !!link && (navId === appNavId || navId.startsWith(`${appNavId}_`)));
14399
+ }, ...ngDevMode ? [{ debugName: "isSideMenuOpen" }] : /* istanbul ignore next */ []);
14385
14400
  const entryAt = (candidate) => {
14386
14401
  const maps = navWidgetMaps ?? [];
14387
14402
  const navId = candidate;
@@ -14439,6 +14454,16 @@ const NavStore = signalStore({ providedIn: "root" }, withState(initialState$3),
14439
14454
  }
14440
14455
  return out;
14441
14456
  }, ...ngDevMode ? [{ debugName: "dynamicInstances" }] : /* istanbul ignore next */ []);
14457
+ const navCounts = computed(() => {
14458
+ const out = {};
14459
+ for (const nav of Object.values(store.navMap())) {
14460
+ const hit = entryAt(nav.navId);
14461
+ if (!hit || !isNavCountConfig(hit.entry)) continue;
14462
+ const badge = hit.entry.navCount();
14463
+ if (badge) out[nav.navId] = badge;
14464
+ }
14465
+ return out;
14466
+ }, ...ngDevMode ? [{ debugName: "navCounts" }] : /* istanbul ignore next */ []);
14442
14467
  const visibilityReads = computed(() => {
14443
14468
  const params = panelParams();
14444
14469
  const out = [];
@@ -14642,6 +14667,7 @@ const NavStore = signalStore({ providedIn: "root" }, withState(initialState$3),
14642
14667
  hidden: hiddenNavIds(),
14643
14668
  transparent: transparentNavIds(),
14644
14669
  routeParams: panelParams(),
14670
+ counts: navCounts(),
14645
14671
  breadcrumb: menuConfig?.breadcramb?.() ?? (typeof widgetConfig?.breadcramb === "function" ? widgetConfig.breadcramb() : widgetConfig?.breadcramb),
14646
14672
  navMenu: emittedMenu,
14647
14673
  hasOwnContent: !!widgetConfig || !!emittedMenu?.length
@@ -14683,6 +14709,7 @@ const NavStore = signalStore({ providedIn: "root" }, withState(initialState$3),
14683
14709
  hasMurl,
14684
14710
  isNavOpened,
14685
14711
  isMNavOpened,
14712
+ isSideMenuOpen,
14686
14713
  resolvedWidget,
14687
14714
  searchAnswer,
14688
14715
  searchLabel,
@@ -14718,23 +14745,32 @@ const NavStore = signalStore({ providedIn: "root" }, withState(initialState$3),
14718
14745
  const translateService = inject(TranslateService);
14719
14746
  const router = store.router;
14720
14747
  const mountOf = (navId) => mountFor(navId, untracked(() => store.allMounts()));
14748
+ const slotOfMount = (mount) => slotOf(mount.name, mount.appNavId, untracked(() => store.path()), untracked(() => store.outlets()), untracked(() => store.navMap()));
14721
14749
  const addressFor = (navId, params) => renderAddress(navId, store.navMap(), {
14722
14750
  navId: store.routeNavId() ?? "root",
14723
14751
  path: store.path()
14724
14752
  }, params);
14725
14753
  const goToNav = (navId, params, options) => {
14726
14754
  const willOpen = untracked(() => splitNavId(navId, store.navMap()).murl.length > 0);
14727
- if (options?.keepPanel && !willOpen) patchState(store, {
14728
- navOpenedByUser: true,
14729
- keepPanelOnPathChange: true
14730
- });
14755
+ const keepPanel = !!options?.keepPanel || untracked(() => store.isNavOpened());
14756
+ if (keepPanel && !willOpen) patchState(store, { navOpenedByUser: true });
14731
14757
  const mount = mountOf(navId);
14732
14758
  if (mount?.navigate) {
14733
- if (!options?.keepPanel) patchState(store, {
14734
- navOpenedByUser: false,
14735
- menuNavId: void 0,
14736
- browsedApp: void 0
14737
- });
14759
+ if (!options?.keepPanel) {
14760
+ const slot = keepPanel && slotOfMount(mount);
14761
+ patchState(store, slot === "side" ? {
14762
+ menuNavId: navId,
14763
+ menuParams: params,
14764
+ browsedApp: {
14765
+ name: mount.name,
14766
+ appNavId: mount.appNavId,
14767
+ slot
14768
+ }
14769
+ } : {
14770
+ menuNavId: void 0,
14771
+ browsedApp: void 0
14772
+ });
14773
+ }
14738
14774
  const map = untracked(() => store.navMap());
14739
14775
  const own = navIdToRoutePath(mount.appNavId, map);
14740
14776
  const full = fillRoutePath(navId, map, params);
@@ -14814,6 +14850,9 @@ const NavStore = signalStore({ providedIn: "root" }, withState(initialState$3),
14814
14850
  menuNavId: void 0,
14815
14851
  browsedApp: void 0
14816
14852
  });
14853
+ dropMurl();
14854
+ };
14855
+ const dropMurl = () => {
14817
14856
  if (!untracked(() => store.hasMurl())) return;
14818
14857
  if (untracked(() => store.panelPushed())) {
14819
14858
  patchState(store, { panelPushed: false });
@@ -14843,10 +14882,9 @@ const NavStore = signalStore({ providedIn: "root" }, withState(initialState$3),
14843
14882
  const outlets = outletsOf(router.url);
14844
14883
  untracked(() => {
14845
14884
  const pathChanged = path !== store.path();
14846
- const keepPanel = store.keepPanelOnPathChange();
14847
14885
  const browsed = store.browsedApp();
14848
14886
  const slot = browsed && slotOf(browsed.name, browsed.appNavId, path, outlets, store.navMap());
14849
- const moved = !!browsed && !!slot && slot !== browsed.slot;
14887
+ const kept = !!browsed && !!slot && (slot !== browsed.slot || slot === "side");
14850
14888
  patchState(store, {
14851
14889
  path,
14852
14890
  outlets,
@@ -14856,13 +14894,11 @@ const NavStore = signalStore({ providedIn: "root" }, withState(initialState$3),
14856
14894
  }),
14857
14895
  routeChain,
14858
14896
  murl,
14859
- menuNavId: moved ? store.menuNavId() : void 0,
14860
- browsedApp: moved && browsed && slot ? {
14897
+ menuNavId: kept ? store.menuNavId() : void 0,
14898
+ browsedApp: kept && browsed && slot ? {
14861
14899
  ...browsed,
14862
14900
  slot
14863
14901
  } : void 0,
14864
- navOpenedByUser: pathChanged && !keepPanel && !moved ? false : store.navOpenedByUser(),
14865
- keepPanelOnPathChange: false,
14866
14902
  navScrolledDown: pathChanged ? false : store.navScrolledDown(),
14867
14903
  panelPushed: murl.length ? store.panelPushed() : false
14868
14904
  });
@@ -14872,11 +14908,20 @@ const NavStore = signalStore({ providedIn: "root" }, withState(initialState$3),
14872
14908
  const setSelected = (navId, params, options) => {
14873
14909
  if (!navId) return closePanel();
14874
14910
  if (!standsOn(navId, params)) return goToNav(navId, params, options);
14875
- if (!options?.keepPanel) return closePanel();
14911
+ if (options?.keepPanel) {
14912
+ patchState(store, {
14913
+ navOpenedByUser: true,
14914
+ menuNavId: void 0
14915
+ });
14916
+ return;
14917
+ }
14918
+ if (!untracked(() => store.isNavOpened())) return;
14876
14919
  patchState(store, {
14877
14920
  navOpenedByUser: true,
14878
- menuNavId: void 0
14921
+ menuNavId: void 0,
14922
+ browsedApp: void 0
14879
14923
  });
14924
+ dropMurl();
14880
14925
  };
14881
14926
  const toggleMenu = () => {
14882
14927
  if (untracked(() => store.isNavOpened())) {
@@ -14894,7 +14939,7 @@ const NavStore = signalStore({ providedIn: "root" }, withState(initialState$3),
14894
14939
  [appLink]: config
14895
14940
  } }));
14896
14941
  };
14897
- 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)))))));
14942
+ const loadWcConfig = rxMethod(pipe(filter((appLink) => !!appLink), filter((appLink) => !untracked(() => !!store.wcConfigMap()[appLink])), mergeMap((appLink) => getNavService.loadWcConfig(appLink).pipe(tap((config) => untracked(() => setWcConfig(appLink, config)))))));
14898
14943
  const setIdentity = (identity) => {
14899
14944
  patchState(store, (state) => ({ identityMap: {
14900
14945
  ...state.identityMap,
@@ -14946,6 +14991,12 @@ const NavStore = signalStore({ providedIn: "root" }, withState(initialState$3),
14946
14991
  settleRoute();
14947
14992
  };
14948
14993
  const setMountRoute = (name, route) => {
14994
+ const keyOf = (r) => r && visibilityKey(r.navId, r.params);
14995
+ const browsed = untracked(() => store.browsedApp());
14996
+ if (browsed?.name === name && browsed.slot === "side" && keyOf(route) !== keyOf(untracked(() => store.mountRoutes())[name])) patchState(store, {
14997
+ menuNavId: route ? toHostNavId(route.navId, browsed.appNavId) : browsed.appNavId,
14998
+ menuParams: route?.params
14999
+ });
14949
15000
  patchState(store, (state) => ({ mountRoutes: route ? {
14950
15001
  ...state.mountRoutes,
14951
15002
  [name]: route
@@ -14976,7 +15027,7 @@ const NavStore = signalStore({ providedIn: "root" }, withState(initialState$3),
14976
15027
  };
14977
15028
  const browseApp = (appNavId) => {
14978
15029
  const mount = mountOf(appNavId);
14979
- const slot = mount && slotOf(mount.name, mount.appNavId, untracked(() => store.path()), untracked(() => store.outlets()), untracked(() => store.navMap()));
15030
+ const slot = mount && slotOfMount(mount);
14980
15031
  patchState(store, {
14981
15032
  navOpenedByUser: true,
14982
15033
  menuNavId: appNavId,
@@ -15232,9 +15283,14 @@ i0.ɵɵngDeclareClassMetadata({
15232
15283
  });
15233
15284
  function initMagmoniumApp({ backend, authUrl, socketUrl }) {
15234
15285
  return () => {
15286
+ const httpService = inject(HttpService);
15287
+ const effectiveBackend = backend || "http://localhost:8000";
15288
+ if (!backend) console.warn("initMagmoniumApp: No backend URL provided, defaulting to http://localhost:8000. Check your environment configuration if this is unexpected.");
15289
+ const effectiveAuth = authUrl || effectiveBackend;
15290
+ httpService.setUrl(effectiveBackend);
15291
+ httpService.setAuthUrl(effectiveAuth);
15235
15292
  inject(FreezeService);
15236
15293
  const hostSession = inject(HOST_SESSION);
15237
- const httpService = inject(HttpService);
15238
15294
  const translateService = inject(TranslateService);
15239
15295
  const themeStore = inject(ThemeStore);
15240
15296
  const loginStore = inject(LOGIN_STORE);
@@ -15249,11 +15305,6 @@ function initMagmoniumApp({ backend, authUrl, socketUrl }) {
15249
15305
  SharedStoreRegistry.setAppLogoState(inject(AppLogoState));
15250
15306
  if (navStore) SharedStoreRegistry.setNavStore(navStore);
15251
15307
  if (loginStore) SharedStoreRegistry.setLoginStore(loginStore);
15252
- const effectiveBackend = backend || "http://localhost:8000";
15253
- if (!backend) console.warn("initMagmoniumApp: No backend URL provided, defaulting to http://localhost:8000. Check your environment configuration if this is unexpected.");
15254
- const effectiveAuth = authUrl || effectiveBackend;
15255
- httpService.setUrl(effectiveBackend);
15256
- httpService.setAuthUrl(effectiveAuth);
15257
15308
  themeStore.init();
15258
15309
  if (socketUrl) {
15259
15310
  const socketStore = inject(SocketStore);
@@ -16677,6 +16728,7 @@ var SectionHeaderComponent = class SectionHeaderComponent {
16677
16728
  extraData = input(...ngDevMode ? [void 0, { debugName: "extraData" }] : /* istanbul ignore next */ []);
16678
16729
  align = input(void 0, ...ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []);
16679
16730
  alignment = computed(() => this.align() ?? "left", ...ngDevMode ? [{ debugName: "alignment" }] : /* istanbul ignore next */ []);
16731
+ badge = input(...ngDevMode ? [void 0, { debugName: "badge" }] : /* istanbul ignore next */ []);
16680
16732
  showBack = input(false, ...ngDevMode ? [{ debugName: "showBack" }] : /* istanbul ignore next */ []);
16681
16733
  actionButton = input(...ngDevMode ? [void 0, { debugName: "actionButton" }] : /* istanbul ignore next */ []);
16682
16734
  actionLabel = input(...ngDevMode ? [void 0, { debugName: "actionLabel" }] : /* istanbul ignore next */ []);
@@ -16707,6 +16759,11 @@ var SectionHeaderComponent = class SectionHeaderComponent {
16707
16759
  variant: "ghost"
16708
16760
  };
16709
16761
  }, ...ngDevMode ? [{ debugName: "actionConfig" }] : /* istanbul ignore next */ []);
16762
+ badgeConfig = computed(() => {
16763
+ if (!this.badge()?.count) return void 0;
16764
+ return { variant: this.badge()?.variant ?? "danger" };
16765
+ }, ...ngDevMode ? [{ debugName: "badgeConfig" }] : /* istanbul ignore next */ []);
16766
+ badgeText = computed(() => formatBadgeCount(this.badge()?.count), ...ngDevMode ? [{ debugName: "badgeText" }] : /* istanbul ignore next */ []);
16710
16767
  accordion = computed(() => this.sectionContext?.accordion?.() ?? null, ...ngDevMode ? [{ debugName: "accordion" }] : /* istanbul ignore next */ []);
16711
16768
  toggleIconName = computed(() => {
16712
16769
  const accordion = this.accordion();
@@ -16839,6 +16896,13 @@ var SectionHeaderComponent = class SectionHeaderComponent {
16839
16896
  isRequired: false,
16840
16897
  transformFunction: null
16841
16898
  },
16899
+ badge: {
16900
+ classPropertyName: "badge",
16901
+ publicName: "badge",
16902
+ isSignal: true,
16903
+ isRequired: false,
16904
+ transformFunction: null
16905
+ },
16842
16906
  showBack: {
16843
16907
  classPropertyName: "showBack",
16844
16908
  publicName: "showBack",
@@ -16901,8 +16965,8 @@ var SectionHeaderComponent = class SectionHeaderComponent {
16901
16965
  classAttribute: "m-section-header"
16902
16966
  },
16903
16967
  ngImport: i0,
16904
- 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",
16905
- 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"],
16968
+ 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 <!-- The badge shares the heading's line rather than sitting at the row's\n end, where a header's `flex: 1` title box would push it: the count\n belongs to the word it counts. -->\n <div class=\"section-header__heading\">\n <m-header\n [level]=\"level()\"\n [label]=\"label()\"\n [icon]=\"icon()\"\n [params]=\"params()\"\n [noTranslate]=\"noTranslate()\" />\n @if (badgeConfig(); as badge) {\n <m-badge [config]=\"badge\">{{ badgeText() }}</m-badge>\n }\n </div>\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",
16969
+ 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}.section-header__heading{display:flex;align-items:center;gap:.5rem;min-width:0}.section-header__heading m-badge{--m-badge-height: 1.5em;--m-badge-min-width: 1.5em;--m-badge-padding: 0 .3em;--m-badge-gap: .1em;flex:none}: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"],
16906
16970
  dependencies: [
16907
16971
  {
16908
16972
  kind: "directive",
@@ -16961,6 +17025,13 @@ var SectionHeaderComponent = class SectionHeaderComponent {
16961
17025
  ],
16962
17026
  outputs: ["configChange"]
16963
17027
  },
17028
+ {
17029
+ kind: "component",
17030
+ type: BadgeComponent,
17031
+ selector: "m-badge",
17032
+ inputs: ["config"],
17033
+ outputs: ["configChange"]
17034
+ },
16964
17035
  {
16965
17036
  kind: "component",
16966
17037
  type: ButtonComponent,
@@ -17013,6 +17084,7 @@ i0.ɵɵngDeclareClassMetadata({
17013
17084
  ContextMenuComponent,
17014
17085
  HeaderComponent,
17015
17086
  IconComponent,
17087
+ BadgeComponent,
17016
17088
  ButtonComponent
17017
17089
  ],
17018
17090
  changeDetection: ChangeDetectionStrategy.OnPush,
@@ -17034,8 +17106,8 @@ i0.ɵɵngDeclareClassMetadata({
17034
17106
  "[class.is-accordion]": "!!accordion()",
17035
17107
  "(click)": "onHeaderClick($event)"
17036
17108
  },
17037
- 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",
17038
- 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"]
17109
+ 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 <!-- The badge shares the heading's line rather than sitting at the row's\n end, where a header's `flex: 1` title box would push it: the count\n belongs to the word it counts. -->\n <div class=\"section-header__heading\">\n <m-header\n [level]=\"level()\"\n [label]=\"label()\"\n [icon]=\"icon()\"\n [params]=\"params()\"\n [noTranslate]=\"noTranslate()\" />\n @if (badgeConfig(); as badge) {\n <m-badge [config]=\"badge\">{{ badgeText() }}</m-badge>\n }\n </div>\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",
17110
+ 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}.section-header__heading{display:flex;align-items:center;gap:.5rem;min-width:0}.section-header__heading m-badge{--m-badge-height: 1.5em;--m-badge-min-width: 1.5em;--m-badge-padding: 0 .3em;--m-badge-gap: .1em;flex:none}: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"]
17039
17111
  }]
17040
17112
  }],
17041
17113
  propDecorators: {
@@ -17151,6 +17223,14 @@ i0.ɵɵngDeclareClassMetadata({
17151
17223
  required: false
17152
17224
  }]
17153
17225
  }],
17226
+ badge: [{
17227
+ type: i0.Input,
17228
+ args: [{
17229
+ isSignal: true,
17230
+ alias: "badge",
17231
+ required: false
17232
+ }]
17233
+ }],
17154
17234
  showBack: [{
17155
17235
  type: i0.Input,
17156
17236
  args: [{
@@ -21129,7 +21209,7 @@ var ColorPickerBoxComponent = class ColorPickerBoxComponent {
21129
21209
  </m-section>
21130
21210
  </div>`,
21131
21211
  isInline: true,
21132
- 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)}}.color-picker-box{width:100%;box-sizing:border-box;background:color-mix(in srgb,var(--m-focus) 2%,var(--m-background));border:var(--m-input-border-width, 1px) solid var(--m-text-input-border, color-mix(in srgb, var(--m-text) 18%, var(--m-background)));border-radius:var(--m-input-radius, .5rem);overflow:hidden;box-shadow:0 .75rem 2rem color-mix(in srgb,var(--m-text) 12%,transparent);animation:color-picker-in .2s ease-out}.color-picker-box .color-picker-box-header{position:sticky;display:flex;flex-direction:row;top:0;left:0;width:100%;z-index:10;align-items:center;justify-content:space-between;background:color-mix(in srgb,var(--m-focus) 2%,var(--m-background));border-bottom:1px solid var(--m-text-input-border, color-mix(in srgb, var(--m-text) 18%, var(--m-background)))}.color-picker-box .color-picker-box-header .color-preview{height:2em;width:2em;border-radius:calc(var(--m-input-radius, .5rem) * .6);margin:.5em}.color-picker-box .color-picker-box-header .color-header{flex:1;padding:0 .5em}.color-picker-box .color-area{position:relative;width:100%;height:5em;overflow:hidden}.color-picker-box .color-area .color-base{position:absolute;inset:0;width:100%;height:100%;background:linear-gradient(180deg,#fff,#fff0,#000),linear-gradient(90deg,gray,#fff0);pointer-events:none}.color-picker-box .color-area .saturation-gradient{position:absolute;inset:0;background:linear-gradient(90deg,rgb(128,128,128) 0%,transparent 100%)}.color-picker-box .color-area .brightness-gradient{position:absolute;inset:0;background:linear-gradient(180deg,#ffffff 0%,transparent 50%,#000000 100%)}.color-picker-box .color-area .color-pointer{position:absolute;width:12px;height:12px;border:2px solid #fff;border-radius:50%;transform:translate(-50%,-50%);box-shadow:0 0 0 1px #0000004d;cursor:pointer;z-index:1}.color-picker-box .color-sliders{display:flex;flex-direction:column;gap:.5em;padding:.5em .75em;box-sizing:border-box}.color-picker-box .color-sliders .hue-slider,.color-picker-box .color-sliders .opacity-slider{height:.5em;position:relative;border-radius:.5em}.color-picker-box .color-sliders .hue-slider .pointer,.color-picker-box .color-sliders .opacity-slider .pointer{width:.5em;height:.5em;border-radius:50%;transform:translate(-50%,calc(-50% + 4px));box-shadow:0 1px 3px #0003;cursor:pointer;margin:0;padding:0;border:2px solid white;transition:scale .2s ease}.color-picker-box .color-sliders .hue-slider .pointer:hover,.color-picker-box .color-sliders .opacity-slider .pointer:hover{scale:1.2;box-shadow:0 2px 4px #0003}.color-picker-box .color-sliders .hue-slider{background:linear-gradient(to right,red,#ff0,#0f0,#0ff,#00f,#f0f,red)}.color-picker-box .suggested-colors{padding:.375rem;box-sizing:border-box;width:100%}.color-picker-box .suggested-colors .suggested-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.375em;padding:.25em .375em;border-bottom:1px solid var(--m-text-input-border, color-mix(in srgb, var(--m-text) 18%, var(--m-background)))}.color-picker-box .suggested-colors .suggested-header span{font-size:.75em;font-weight:500;color:var(--m-input-color, var(--m-mm));display:flex;align-items:center;gap:.5em}.color-picker-box .suggested-colors .color-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(24px,1fr));gap:8px;width:100%;padding:.25rem}.color-picker-box .suggested-colors .color-grid .color-option{width:24px;height:24px;border-radius:.25rem;cursor:pointer;border:1px solid var(--m-text-input-border, color-mix(in srgb, var(--m-text) 18%, var(--m-background)));transition:transform .15s ease,box-shadow .15s ease;margin:auto;position:relative;padding:0}.color-picker-box .suggested-colors .color-grid .color-option:hover{transform:scale(1.1);z-index:1;box-shadow:0 2px 4px #0003}.color-picker-box .suggested-colors .color-grid .color-option:active{transform:scale(.95)}.color-picker-box .suggested-colors .color-grid .color-option[data-alpha]{background-image:linear-gradient(45deg,#ccc 25%,transparent 25%),linear-gradient(-45deg,#ccc 25%,transparent 25%),linear-gradient(45deg,transparent 75%,#ccc 75%),linear-gradient(-45deg,transparent 75%,#ccc 75%);background-size:10px 10px;background-position:0 0,0 5px,5px -5px,-5px 0px}@keyframes color-picker-in{0%{opacity:0;transform:scale(.95) translateY(-4px)}to{opacity:1;transform:scale(1) translateY(0)}}\n"],
21212
+ 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)}}.color-picker-box{width:100%;box-sizing:border-box;background:color-mix(in srgb,var(--m-focus) 2%,var(--m-background));border:var(--m-input-border-width, 1px) solid var(--m-text-input-border, color-mix(in srgb, var(--m-text) 18%, var(--m-background)));border-radius:var(--m-input-radius, .5rem);overflow:hidden;box-shadow:0 .75rem 2rem var(--m-backdrop-shadow);animation:color-picker-in .2s ease-out}.color-picker-box .color-picker-box-header{position:sticky;display:flex;flex-direction:row;top:0;left:0;width:100%;z-index:10;align-items:center;justify-content:space-between;background:color-mix(in srgb,var(--m-focus) 2%,var(--m-background));border-bottom:1px solid var(--m-text-input-border, color-mix(in srgb, var(--m-text) 18%, var(--m-background)))}.color-picker-box .color-picker-box-header .color-preview{height:2em;width:2em;border-radius:calc(var(--m-input-radius, .5rem) * .6);margin:.5em}.color-picker-box .color-picker-box-header .color-header{flex:1;padding:0 .5em}.color-picker-box .color-area{position:relative;width:100%;height:5em;overflow:hidden}.color-picker-box .color-area .color-base{position:absolute;inset:0;width:100%;height:100%;background:linear-gradient(180deg,#fff,#fff0,#000),linear-gradient(90deg,gray,#fff0);pointer-events:none}.color-picker-box .color-area .saturation-gradient{position:absolute;inset:0;background:linear-gradient(90deg,rgb(128,128,128) 0%,transparent 100%)}.color-picker-box .color-area .brightness-gradient{position:absolute;inset:0;background:linear-gradient(180deg,#ffffff 0%,transparent 50%,#000000 100%)}.color-picker-box .color-area .color-pointer{position:absolute;width:12px;height:12px;border:2px solid #fff;border-radius:50%;transform:translate(-50%,-50%);box-shadow:0 0 0 1px #0000004d;cursor:pointer;z-index:1}.color-picker-box .color-sliders{display:flex;flex-direction:column;gap:.5em;padding:.5em .75em;box-sizing:border-box}.color-picker-box .color-sliders .hue-slider,.color-picker-box .color-sliders .opacity-slider{height:.5em;position:relative;border-radius:.5em}.color-picker-box .color-sliders .hue-slider .pointer,.color-picker-box .color-sliders .opacity-slider .pointer{width:.5em;height:.5em;border-radius:50%;transform:translate(-50%,calc(-50% + 4px));box-shadow:0 1px 3px #0003;cursor:pointer;margin:0;padding:0;border:2px solid white;transition:scale .2s ease}.color-picker-box .color-sliders .hue-slider .pointer:hover,.color-picker-box .color-sliders .opacity-slider .pointer:hover{scale:1.2;box-shadow:0 2px 4px #0003}.color-picker-box .color-sliders .hue-slider{background:linear-gradient(to right,red,#ff0,#0f0,#0ff,#00f,#f0f,red)}.color-picker-box .suggested-colors{padding:.375rem;box-sizing:border-box;width:100%}.color-picker-box .suggested-colors .suggested-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.375em;padding:.25em .375em;border-bottom:1px solid var(--m-text-input-border, color-mix(in srgb, var(--m-text) 18%, var(--m-background)))}.color-picker-box .suggested-colors .suggested-header span{font-size:.75em;font-weight:500;color:var(--m-input-color, var(--m-mm));display:flex;align-items:center;gap:.5em}.color-picker-box .suggested-colors .color-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(24px,1fr));gap:8px;width:100%;padding:.25rem}.color-picker-box .suggested-colors .color-grid .color-option{width:24px;height:24px;border-radius:.25rem;cursor:pointer;border:1px solid var(--m-text-input-border, color-mix(in srgb, var(--m-text) 18%, var(--m-background)));transition:transform .15s ease,box-shadow .15s ease;margin:auto;position:relative;padding:0}.color-picker-box .suggested-colors .color-grid .color-option:hover{transform:scale(1.1);z-index:1;box-shadow:0 2px 4px #0003}.color-picker-box .suggested-colors .color-grid .color-option:active{transform:scale(.95)}.color-picker-box .suggested-colors .color-grid .color-option[data-alpha]{background-image:linear-gradient(45deg,#ccc 25%,transparent 25%),linear-gradient(-45deg,#ccc 25%,transparent 25%),linear-gradient(45deg,transparent 75%,#ccc 75%),linear-gradient(-45deg,transparent 75%,#ccc 75%);background-size:10px 10px;background-position:0 0,0 5px,5px -5px,-5px 0px}@keyframes color-picker-in{0%{opacity:0;transform:scale(.95) translateY(-4px)}to{opacity:1;transform:scale(1) translateY(0)}}\n"],
21133
21213
  dependencies: [
21134
21214
  {
21135
21215
  kind: "directive",
@@ -21190,6 +21270,7 @@ var ColorPickerBoxComponent = class ColorPickerBoxComponent {
21190
21270
  "disableRule",
21191
21271
  "extraData",
21192
21272
  "align",
21273
+ "badge",
21193
21274
  "showBack",
21194
21275
  "actionButton",
21195
21276
  "actionLabel",
@@ -21353,7 +21434,7 @@ i0.ɵɵngDeclareClassMetadata({
21353
21434
  </m-section>
21354
21435
  </div>`,
21355
21436
  changeDetection: ChangeDetectionStrategy.OnPush,
21356
- 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)}}.color-picker-box{width:100%;box-sizing:border-box;background:color-mix(in srgb,var(--m-focus) 2%,var(--m-background));border:var(--m-input-border-width, 1px) solid var(--m-text-input-border, color-mix(in srgb, var(--m-text) 18%, var(--m-background)));border-radius:var(--m-input-radius, .5rem);overflow:hidden;box-shadow:0 .75rem 2rem color-mix(in srgb,var(--m-text) 12%,transparent);animation:color-picker-in .2s ease-out}.color-picker-box .color-picker-box-header{position:sticky;display:flex;flex-direction:row;top:0;left:0;width:100%;z-index:10;align-items:center;justify-content:space-between;background:color-mix(in srgb,var(--m-focus) 2%,var(--m-background));border-bottom:1px solid var(--m-text-input-border, color-mix(in srgb, var(--m-text) 18%, var(--m-background)))}.color-picker-box .color-picker-box-header .color-preview{height:2em;width:2em;border-radius:calc(var(--m-input-radius, .5rem) * .6);margin:.5em}.color-picker-box .color-picker-box-header .color-header{flex:1;padding:0 .5em}.color-picker-box .color-area{position:relative;width:100%;height:5em;overflow:hidden}.color-picker-box .color-area .color-base{position:absolute;inset:0;width:100%;height:100%;background:linear-gradient(180deg,#fff,#fff0,#000),linear-gradient(90deg,gray,#fff0);pointer-events:none}.color-picker-box .color-area .saturation-gradient{position:absolute;inset:0;background:linear-gradient(90deg,rgb(128,128,128) 0%,transparent 100%)}.color-picker-box .color-area .brightness-gradient{position:absolute;inset:0;background:linear-gradient(180deg,#ffffff 0%,transparent 50%,#000000 100%)}.color-picker-box .color-area .color-pointer{position:absolute;width:12px;height:12px;border:2px solid #fff;border-radius:50%;transform:translate(-50%,-50%);box-shadow:0 0 0 1px #0000004d;cursor:pointer;z-index:1}.color-picker-box .color-sliders{display:flex;flex-direction:column;gap:.5em;padding:.5em .75em;box-sizing:border-box}.color-picker-box .color-sliders .hue-slider,.color-picker-box .color-sliders .opacity-slider{height:.5em;position:relative;border-radius:.5em}.color-picker-box .color-sliders .hue-slider .pointer,.color-picker-box .color-sliders .opacity-slider .pointer{width:.5em;height:.5em;border-radius:50%;transform:translate(-50%,calc(-50% + 4px));box-shadow:0 1px 3px #0003;cursor:pointer;margin:0;padding:0;border:2px solid white;transition:scale .2s ease}.color-picker-box .color-sliders .hue-slider .pointer:hover,.color-picker-box .color-sliders .opacity-slider .pointer:hover{scale:1.2;box-shadow:0 2px 4px #0003}.color-picker-box .color-sliders .hue-slider{background:linear-gradient(to right,red,#ff0,#0f0,#0ff,#00f,#f0f,red)}.color-picker-box .suggested-colors{padding:.375rem;box-sizing:border-box;width:100%}.color-picker-box .suggested-colors .suggested-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.375em;padding:.25em .375em;border-bottom:1px solid var(--m-text-input-border, color-mix(in srgb, var(--m-text) 18%, var(--m-background)))}.color-picker-box .suggested-colors .suggested-header span{font-size:.75em;font-weight:500;color:var(--m-input-color, var(--m-mm));display:flex;align-items:center;gap:.5em}.color-picker-box .suggested-colors .color-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(24px,1fr));gap:8px;width:100%;padding:.25rem}.color-picker-box .suggested-colors .color-grid .color-option{width:24px;height:24px;border-radius:.25rem;cursor:pointer;border:1px solid var(--m-text-input-border, color-mix(in srgb, var(--m-text) 18%, var(--m-background)));transition:transform .15s ease,box-shadow .15s ease;margin:auto;position:relative;padding:0}.color-picker-box .suggested-colors .color-grid .color-option:hover{transform:scale(1.1);z-index:1;box-shadow:0 2px 4px #0003}.color-picker-box .suggested-colors .color-grid .color-option:active{transform:scale(.95)}.color-picker-box .suggested-colors .color-grid .color-option[data-alpha]{background-image:linear-gradient(45deg,#ccc 25%,transparent 25%),linear-gradient(-45deg,#ccc 25%,transparent 25%),linear-gradient(45deg,transparent 75%,#ccc 75%),linear-gradient(-45deg,transparent 75%,#ccc 75%);background-size:10px 10px;background-position:0 0,0 5px,5px -5px,-5px 0px}@keyframes color-picker-in{0%{opacity:0;transform:scale(.95) translateY(-4px)}to{opacity:1;transform:scale(1) translateY(0)}}\n"]
21437
+ 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)}}.color-picker-box{width:100%;box-sizing:border-box;background:color-mix(in srgb,var(--m-focus) 2%,var(--m-background));border:var(--m-input-border-width, 1px) solid var(--m-text-input-border, color-mix(in srgb, var(--m-text) 18%, var(--m-background)));border-radius:var(--m-input-radius, .5rem);overflow:hidden;box-shadow:0 .75rem 2rem var(--m-backdrop-shadow);animation:color-picker-in .2s ease-out}.color-picker-box .color-picker-box-header{position:sticky;display:flex;flex-direction:row;top:0;left:0;width:100%;z-index:10;align-items:center;justify-content:space-between;background:color-mix(in srgb,var(--m-focus) 2%,var(--m-background));border-bottom:1px solid var(--m-text-input-border, color-mix(in srgb, var(--m-text) 18%, var(--m-background)))}.color-picker-box .color-picker-box-header .color-preview{height:2em;width:2em;border-radius:calc(var(--m-input-radius, .5rem) * .6);margin:.5em}.color-picker-box .color-picker-box-header .color-header{flex:1;padding:0 .5em}.color-picker-box .color-area{position:relative;width:100%;height:5em;overflow:hidden}.color-picker-box .color-area .color-base{position:absolute;inset:0;width:100%;height:100%;background:linear-gradient(180deg,#fff,#fff0,#000),linear-gradient(90deg,gray,#fff0);pointer-events:none}.color-picker-box .color-area .saturation-gradient{position:absolute;inset:0;background:linear-gradient(90deg,rgb(128,128,128) 0%,transparent 100%)}.color-picker-box .color-area .brightness-gradient{position:absolute;inset:0;background:linear-gradient(180deg,#ffffff 0%,transparent 50%,#000000 100%)}.color-picker-box .color-area .color-pointer{position:absolute;width:12px;height:12px;border:2px solid #fff;border-radius:50%;transform:translate(-50%,-50%);box-shadow:0 0 0 1px #0000004d;cursor:pointer;z-index:1}.color-picker-box .color-sliders{display:flex;flex-direction:column;gap:.5em;padding:.5em .75em;box-sizing:border-box}.color-picker-box .color-sliders .hue-slider,.color-picker-box .color-sliders .opacity-slider{height:.5em;position:relative;border-radius:.5em}.color-picker-box .color-sliders .hue-slider .pointer,.color-picker-box .color-sliders .opacity-slider .pointer{width:.5em;height:.5em;border-radius:50%;transform:translate(-50%,calc(-50% + 4px));box-shadow:0 1px 3px #0003;cursor:pointer;margin:0;padding:0;border:2px solid white;transition:scale .2s ease}.color-picker-box .color-sliders .hue-slider .pointer:hover,.color-picker-box .color-sliders .opacity-slider .pointer:hover{scale:1.2;box-shadow:0 2px 4px #0003}.color-picker-box .color-sliders .hue-slider{background:linear-gradient(to right,red,#ff0,#0f0,#0ff,#00f,#f0f,red)}.color-picker-box .suggested-colors{padding:.375rem;box-sizing:border-box;width:100%}.color-picker-box .suggested-colors .suggested-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.375em;padding:.25em .375em;border-bottom:1px solid var(--m-text-input-border, color-mix(in srgb, var(--m-text) 18%, var(--m-background)))}.color-picker-box .suggested-colors .suggested-header span{font-size:.75em;font-weight:500;color:var(--m-input-color, var(--m-mm));display:flex;align-items:center;gap:.5em}.color-picker-box .suggested-colors .color-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(24px,1fr));gap:8px;width:100%;padding:.25rem}.color-picker-box .suggested-colors .color-grid .color-option{width:24px;height:24px;border-radius:.25rem;cursor:pointer;border:1px solid var(--m-text-input-border, color-mix(in srgb, var(--m-text) 18%, var(--m-background)));transition:transform .15s ease,box-shadow .15s ease;margin:auto;position:relative;padding:0}.color-picker-box .suggested-colors .color-grid .color-option:hover{transform:scale(1.1);z-index:1;box-shadow:0 2px 4px #0003}.color-picker-box .suggested-colors .color-grid .color-option:active{transform:scale(.95)}.color-picker-box .suggested-colors .color-grid .color-option[data-alpha]{background-image:linear-gradient(45deg,#ccc 25%,transparent 25%),linear-gradient(-45deg,#ccc 25%,transparent 25%),linear-gradient(45deg,transparent 75%,#ccc 75%),linear-gradient(-45deg,transparent 75%,#ccc 75%);background-size:10px 10px;background-position:0 0,0 5px,5px -5px,-5px 0px}@keyframes color-picker-in{0%{opacity:0;transform:scale(.95) translateY(-4px)}to{opacity:1;transform:scale(1) translateY(0)}}\n"]
21357
21438
  }]
21358
21439
  }],
21359
21440
  ctorParameters: () => [],
@@ -21819,12 +21900,12 @@ var WrapperInputComponent = class WrapperInputComponent extends ConfigComponent
21819
21900
  const seq = ++this.dynamicSeq;
21820
21901
  switch (this.config()?.type) {
21821
21902
  case InputType.RADIO: {
21822
- const { RadioInputComponent } = await import("./magmonium-one-radio-dZL0E4k_.mjs").then((n) => n.n);
21903
+ const { RadioInputComponent } = await import("./magmonium-one-radio-BsQv0Wof.mjs").then((n) => n.n);
21823
21904
  this.createDynamicComponent(seq, RadioInputComponent);
21824
21905
  break;
21825
21906
  }
21826
21907
  case InputType.TOGGLE: {
21827
- const { ToggleInputComponent } = await import("./magmonium-one-toggle-DRG14zhR.mjs");
21908
+ const { ToggleInputComponent } = await import("./magmonium-one-toggle-C5-GwMSQ.mjs");
21828
21909
  this.createDynamicComponent(seq, ToggleInputComponent, [], true);
21829
21910
  break;
21830
21911
  }
@@ -21834,12 +21915,12 @@ var WrapperInputComponent = class WrapperInputComponent extends ConfigComponent
21834
21915
  break;
21835
21916
  }
21836
21917
  case InputType.PASSWORD: {
21837
- const { PasswordInputComponent } = await import("./magmonium-one-password-CLhWaUXK.mjs");
21918
+ const { PasswordInputComponent } = await import("./magmonium-one-password-Bsv1wUIJ.mjs");
21838
21919
  this.createDynamicComponent(seq, PasswordInputComponent);
21839
21920
  break;
21840
21921
  }
21841
21922
  case InputType.OTP: {
21842
- const { OtpInputComponent } = await import("./magmonium-one-otp-CkQohg0H.mjs");
21923
+ const { OtpInputComponent } = await import("./magmonium-one-otp-BOiv-9eT.mjs");
21843
21924
  this.createDynamicComponent(seq, OtpInputComponent);
21844
21925
  break;
21845
21926
  }
@@ -21849,7 +21930,7 @@ var WrapperInputComponent = class WrapperInputComponent extends ConfigComponent
21849
21930
  break;
21850
21931
  }
21851
21932
  case InputType.CHECKBOX: {
21852
- const { CheckboxInputComponent } = await import("./magmonium-one-checkbox-CS83TVYG.mjs").then((n) => n.n);
21933
+ const { CheckboxInputComponent } = await import("./magmonium-one-checkbox-CbEdjmtz.mjs").then((n) => n.n);
21853
21934
  this.createDynamicComponent(seq, CheckboxInputComponent, [], true);
21854
21935
  break;
21855
21936
  }
@@ -21864,12 +21945,12 @@ var WrapperInputComponent = class WrapperInputComponent extends ConfigComponent
21864
21945
  break;
21865
21946
  }
21866
21947
  case InputType.RANGE: {
21867
- const { RangeInputComponent } = await import("./magmonium-one-range-DLu5PhUN.mjs").then((n) => n.n);
21948
+ const { RangeInputComponent } = await import("./magmonium-one-range-DPR659yG.mjs").then((n) => n.n);
21868
21949
  this.createDynamicComponent(seq, RangeInputComponent);
21869
21950
  break;
21870
21951
  }
21871
21952
  case InputType.MULTI_RANGE: {
21872
- const { MultiRangeInputComponent } = await import("./magmonium-one-multi-range-OzTdXSHR.mjs").then((n) => n.n);
21953
+ const { MultiRangeInputComponent } = await import("./magmonium-one-multi-range-BnWtK-O0.mjs").then((n) => n.n);
21873
21954
  this.createDynamicComponent(seq, MultiRangeInputComponent);
21874
21955
  break;
21875
21956
  }
@@ -21920,7 +22001,7 @@ var WrapperInputComponent = class WrapperInputComponent extends ConfigComponent
21920
22001
  break;
21921
22002
  }
21922
22003
  default: {
21923
- const { TextInputComponent } = await import("./magmonium-one-text-BPThK6-y.mjs").then((n) => n.n);
22004
+ const { TextInputComponent } = await import("./magmonium-one-text-Bo4XPBXB.mjs").then((n) => n.n);
21924
22005
  this.createDynamicComponent(seq, TextInputComponent);
21925
22006
  break;
21926
22007
  }
@@ -24238,7 +24319,7 @@ var FileUploadInputComponent = class FileUploadInputComponent extends BaseInputC
24238
24319
  openEditor = async (file, size) => {
24239
24320
  const modalStore = this.modalStore;
24240
24321
  if (!modalStore) return void 0;
24241
- const { ImageEditorComponent } = await import("./magmonium-one-image-editor-CkPeheGY.mjs");
24322
+ const { ImageEditorComponent } = await import("./magmonium-one-image-editor-DHlktZ6z.mjs");
24242
24323
  const ratio = String(this.config()?.ratio ?? "");
24243
24324
  return new Promise((resolve) => {
24244
24325
  const modalRef = new ModalRef();
@@ -28998,13 +29079,15 @@ var RemoteLoaderService = class RemoteLoaderService {
28998
29079
  const config = await this.configOf(link);
28999
29080
  return config.reason ? config : this.mount(config.config, useShadow, props, children);
29000
29081
  };
29001
- loadPluginFromLink = async (link, screen, props) => {
29082
+ loadPluginFromLink = async (link, screen, props, hostLink) => {
29002
29083
  const loaded = await this.configOf(link);
29003
29084
  if (loaded.reason) return loaded;
29004
29085
  const config = loaded.config;
29005
- const bundle = await this.loadBundle(config);
29006
- if (bundle !== true) return bundle;
29007
29086
  const tag = pluginTag(config.selector, screen);
29087
+ const rootless = config.kind === "plugin";
29088
+ if (rootless && !(config.plugins ?? []).some((p) => p.name === screen)) return { reason: "screen-not-found" };
29089
+ const bundle = await this.loadBundle(config, rootless ? tag : config.selector, hostLink);
29090
+ if (bundle !== true) return bundle;
29008
29091
  if (!customElements.get(tag)) return { reason: "screen-not-found" };
29009
29092
  const element = this.create(tag, props || {});
29010
29093
  const { assetBaseUrl } = this.resolveUrls(config);
@@ -29047,7 +29130,7 @@ var RemoteLoaderService = class RemoteLoaderService {
29047
29130
  config
29048
29131
  } : { reason: "element-timeout" };
29049
29132
  };
29050
- loadBundle = async (config) => {
29133
+ loadBundle = async (config, waitFor = config.selector, hostLink) => {
29051
29134
  if (this.loginStore && !this.loginStore.isLoggedIn()) {
29052
29135
  console.warn(`Attempted to load component ${config.selector} without authentication`);
29053
29136
  return {};
@@ -29055,18 +29138,18 @@ var RemoteLoaderService = class RemoteLoaderService {
29055
29138
  const { scriptUrl } = this.resolveUrls(config);
29056
29139
  if (!scriptUrl) return { reason: "script-failed" };
29057
29140
  const tier = config.link && wcTierOf(config.link) || "status";
29058
- const wasDefined = !!customElements.get(config.selector);
29141
+ const wasDefined = !!customElements.get(waitFor);
29059
29142
  const definedAs = definedWcTierOf(config.selector);
29060
29143
  const sameBundle = !!config.componentFileName && definedWcBundleOf(config.selector) === config.componentFileName;
29061
29144
  if (wasDefined && definedAs && definedAs !== tier && !sameBundle) return { reason: "tier-conflict" };
29062
29145
  if (wasDefined && sameBundle) return true;
29063
29146
  try {
29064
- await this.loadScript(scriptUrl);
29147
+ await this.loadScript(scriptUrl, hostLink);
29065
29148
  } catch {
29066
29149
  return { reason: "script-failed" };
29067
29150
  }
29068
29151
  let timer;
29069
- const defined = await Promise.race([customElements.whenDefined(config.selector).then(() => true), new Promise((resolve) => {
29152
+ const defined = await Promise.race([customElements.whenDefined(waitFor).then(() => true), new Promise((resolve) => {
29070
29153
  timer = setTimeout(() => resolve(false), ELEMENT_TIMEOUT_MS);
29071
29154
  })]);
29072
29155
  clearTimeout(timer);
@@ -29074,7 +29157,7 @@ var RemoteLoaderService = class RemoteLoaderService {
29074
29157
  if (!wasDefined) recordDefinedWcTier(config.selector, tier, config.componentFileName);
29075
29158
  return true;
29076
29159
  };
29077
- async loadScript(url) {
29160
+ async loadScript(url, hostLink) {
29078
29161
  if (document.querySelector(`script[data-wc-src="${url}"]`)) return;
29079
29162
  if (!url.startsWith("http") || url.startsWith(window.location.origin)) return new Promise((resolve, reject) => {
29080
29163
  const script = document.createElement("script");
@@ -29085,7 +29168,7 @@ var RemoteLoaderService = class RemoteLoaderService {
29085
29168
  script.onerror = () => reject(/* @__PURE__ */ new Error(`Failed to load script: ${url}`));
29086
29169
  document.head.appendChild(script);
29087
29170
  });
29088
- const blob = await firstValueFrom(this.httpService.blob(url));
29171
+ const blob = await firstValueFrom(this.httpService.blob(url, hostLink ? { [CALLING_APP_HEADER]: hostLink } : void 0));
29089
29172
  const blobUrl = URL.createObjectURL(blob);
29090
29173
  return new Promise((resolve, reject) => {
29091
29174
  const script = document.createElement("script");
@@ -30624,6 +30707,7 @@ var PluginComponent = class PluginComponent {
30624
30707
  ...ngDevMode ? { debugName: "port" } : /* istanbul ignore next */ {},
30625
30708
  transform: (value) => value === void 0 || value === null || value === "" ? void 0 : numberAttribute(value)
30626
30709
  });
30710
+ hostLink = input(void 0, ...ngDevMode ? [{ debugName: "hostLink" }] : /* istanbul ignore next */ []);
30627
30711
  inputs = input({}, ...ngDevMode ? [{ debugName: "inputs" }] : /* istanbul ignore next */ []);
30628
30712
  inputChildren = contentChildren(PluginInputComponent, ...ngDevMode ? [{ debugName: "inputChildren" }] : /* istanbul ignore next */ []);
30629
30713
  outputChildren = contentChildren(PluginOutputComponent, ...ngDevMode ? [{ debugName: "outputChildren" }] : /* istanbul ignore next */ []);
@@ -30636,7 +30720,7 @@ var PluginComponent = class PluginComponent {
30636
30720
  loader = inject(RemoteLoaderService);
30637
30721
  translateService = inject(TranslateService);
30638
30722
  loginStore = inject(LOGIN_STORE, { optional: true });
30639
- hostLink = inject(APP_LINK);
30723
+ appLink = inject(APP_LINK);
30640
30724
  elementRef = inject(ElementRef);
30641
30725
  loadedElement;
30642
30726
  loadId = 0;
@@ -30649,6 +30733,7 @@ var PluginComponent = class PluginComponent {
30649
30733
  const screen = this.screen();
30650
30734
  const source = this.source();
30651
30735
  const port = this.port();
30736
+ this.hostLink();
30652
30737
  untracked(() => {
30653
30738
  setWcTier(link, source === "published" ? void 0 : source);
30654
30739
  setWcLocalPort(link, source === "local" ? port : void 0);
@@ -30675,12 +30760,13 @@ var PluginComponent = class PluginComponent {
30675
30760
  const id = ++this.loadId;
30676
30761
  this.dismount();
30677
30762
  this.state.set("loading");
30763
+ const host = untracked(() => this.hostLink());
30678
30764
  const result = await this.loader.loadPluginFromLink(link, screen, {
30679
30765
  ...untracked(() => this.values()),
30680
30766
  lang: untracked(() => this.translateService.lang()),
30681
30767
  pluginLink: link,
30682
- hostLink: this.hostLink()
30683
- });
30768
+ hostLink: host ?? this.appLink()
30769
+ }, host);
30684
30770
  if (id !== this.loadId) return;
30685
30771
  if (!result.element) {
30686
30772
  this.failure.set(result);
@@ -30746,6 +30832,13 @@ var PluginComponent = class PluginComponent {
30746
30832
  isRequired: false,
30747
30833
  transformFunction: null
30748
30834
  },
30835
+ hostLink: {
30836
+ classPropertyName: "hostLink",
30837
+ publicName: "hostLink",
30838
+ isSignal: true,
30839
+ isRequired: false,
30840
+ transformFunction: null
30841
+ },
30749
30842
  inputs: {
30750
30843
  classPropertyName: "inputs",
30751
30844
  publicName: "inputs",
@@ -30887,6 +30980,14 @@ i0.ɵɵngDeclareClassMetadata({
30887
30980
  required: false
30888
30981
  }]
30889
30982
  }],
30983
+ hostLink: [{
30984
+ type: i0.Input,
30985
+ args: [{
30986
+ isSignal: true,
30987
+ alias: "hostLink",
30988
+ required: false
30989
+ }]
30990
+ }],
30890
30991
  inputs: [{
30891
30992
  type: i0.Input,
30892
30993
  args: [{
@@ -38584,6 +38685,7 @@ var TimelineComponent = class TimelineComponent extends ConfigComponent {
38584
38685
  "disableRule",
38585
38686
  "extraData",
38586
38687
  "align",
38688
+ "badge",
38587
38689
  "showBack",
38588
38690
  "actionButton",
38589
38691
  "actionLabel",
@@ -38972,7 +39074,7 @@ var ScrollComponent = class ScrollComponent {
38972
39074
  <div class="scroll__fade" [class.visible]="_hasFade()"></div>
38973
39075
  `,
38974
39076
  isInline: true,
38975
- 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;flex:1;min-height:0;position:relative;overflow:hidden}.scroll__inner{height:100%;overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch}@media(max-width:1199px){.scroll__inner{scrollbar-width:none}.scroll__inner::-webkit-scrollbar{display:none}}@media(min-width:1200px){.scroll__inner{scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.12) transparent}.scroll__inner::-webkit-scrollbar{width:3px}.scroll__inner::-webkit-scrollbar-track{background:transparent}.scroll__inner::-webkit-scrollbar-thumb{background:#0000001f;border-radius:2px;transition:background .2s}.scroll__inner::-webkit-scrollbar-thumb:hover{background:#00000047}}.scroll__fade{position:absolute;bottom:0;left:0;right:0;height:4rem;background:linear-gradient(to bottom,transparent,rgba(255,255,255,.92));pointer-events:none;opacity:0;transition:opacity .25s ease;z-index:1}.scroll__fade.visible{opacity:1}\n"],
39077
+ 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;flex:1;min-height:0;position:relative;overflow:hidden}.scroll__inner{height:100%;overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch}@media(max-width:1199px){.scroll__inner{scrollbar-width:none}.scroll__inner::-webkit-scrollbar{display:none}}@media(min-width:1200px){.scroll__inner{scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.12) transparent}.scroll__inner::-webkit-scrollbar{width:3px}.scroll__inner::-webkit-scrollbar-track{background:transparent}.scroll__inner::-webkit-scrollbar-thumb{background:#0000001f;border-radius:2px;transition:background .2s}.scroll__inner::-webkit-scrollbar-thumb:hover{background:#00000047}}.scroll__fade{position:absolute;bottom:0;left:0;right:0;height:4rem;background:linear-gradient(to bottom,transparent,color-mix(in srgb,var(--m-background) 92%,transparent));pointer-events:none;opacity:0;transition:opacity .25s ease;z-index:1}.scroll__fade.visible{opacity:1}\n"],
38976
39078
  changeDetection: i0.ChangeDetectionStrategy.OnPush
38977
39079
  });
38978
39080
  };
@@ -38992,7 +39094,7 @@ i0.ɵɵngDeclareClassMetadata({
38992
39094
  </div>
38993
39095
  <div class="scroll__fade" [class.visible]="_hasFade()"></div>
38994
39096
  `,
38995
- 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;flex:1;min-height:0;position:relative;overflow:hidden}.scroll__inner{height:100%;overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch}@media(max-width:1199px){.scroll__inner{scrollbar-width:none}.scroll__inner::-webkit-scrollbar{display:none}}@media(min-width:1200px){.scroll__inner{scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.12) transparent}.scroll__inner::-webkit-scrollbar{width:3px}.scroll__inner::-webkit-scrollbar-track{background:transparent}.scroll__inner::-webkit-scrollbar-thumb{background:#0000001f;border-radius:2px;transition:background .2s}.scroll__inner::-webkit-scrollbar-thumb:hover{background:#00000047}}.scroll__fade{position:absolute;bottom:0;left:0;right:0;height:4rem;background:linear-gradient(to bottom,transparent,rgba(255,255,255,.92));pointer-events:none;opacity:0;transition:opacity .25s ease;z-index:1}.scroll__fade.visible{opacity:1}\n"]
39097
+ 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;flex:1;min-height:0;position:relative;overflow:hidden}.scroll__inner{height:100%;overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch}@media(max-width:1199px){.scroll__inner{scrollbar-width:none}.scroll__inner::-webkit-scrollbar{display:none}}@media(min-width:1200px){.scroll__inner{scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.12) transparent}.scroll__inner::-webkit-scrollbar{width:3px}.scroll__inner::-webkit-scrollbar-track{background:transparent}.scroll__inner::-webkit-scrollbar-thumb{background:#0000001f;border-radius:2px;transition:background .2s}.scroll__inner::-webkit-scrollbar-thumb:hover{background:#00000047}}.scroll__fade{position:absolute;bottom:0;left:0;right:0;height:4rem;background:linear-gradient(to bottom,transparent,color-mix(in srgb,var(--m-background) 92%,transparent));pointer-events:none;opacity:0;transition:opacity .25s ease;z-index:1}.scroll__fade.visible{opacity:1}\n"]
38996
39098
  }]
38997
39099
  }],
38998
39100
  ctorParameters: () => [],
@@ -40673,7 +40775,7 @@ var PanelComponent = class PanelComponent {
40673
40775
  </div>
40674
40776
  `,
40675
40777
  isInline: true,
40676
- 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;height:100%}:host.is-nav-hidden{display:none}.side-panel{height:100%;background:var(--m-background);display:flex;flex-direction:column;overflow:hidden;position:relative;animation:panel-slide-right .3s cubic-bezier(.2,0,0,1) forwards;border-left:var(--m-input-border-width, 1px) solid var(--m-text-input-border, color-mix(in srgb, var(--m-text) 18%, var(--m-background)));box-shadow:-.75rem 0 2rem color-mix(in srgb,var(--m-text) 12%,transparent)}.side-panel--docked{border-left:1px dashed var(--m-border);box-shadow:none}.side-panel--left{animation-name:panel-slide-left;border-left:none;border-right:var(--m-input-border-width, 1px) solid var(--m-text-input-border, color-mix(in srgb, var(--m-text) 18%, var(--m-background)));box-shadow:.75rem 0 2rem color-mix(in srgb,var(--m-text) 12%,transparent)}.side-panel--left.side-panel--docked{border-left:none;border-right:1px dashed var(--m-border);box-shadow:none}.side-panel__close{position:absolute;top:0;right:0;padding:.25em;z-index:20}.side-panel__content{flex:1;display:flex;flex-direction:column;min-height:0;overflow-y:auto}@media(max-width:767px){.side-panel{animation-name:panel-slide-bottom;border-left:none;border-right:none;border-top:var(--m-input-border-width, 1px) solid var(--m-text-input-border, color-mix(in srgb, var(--m-text) 18%, var(--m-background)));box-shadow:0 -.75rem 2rem color-mix(in srgb,var(--m-text) 12%,transparent);overflow-y:auto}}@keyframes panel-slide-right{0%{transform:translate(100%)}to{transform:translate(0)}}@keyframes panel-slide-left{0%{transform:translate(-100%)}to{transform:translate(0)}}@keyframes panel-slide-bottom{0%{transform:translateY(100%)}to{transform:translateY(0)}}\n"],
40778
+ 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;height:100%}:host.is-nav-hidden{display:none}.side-panel{height:100%;background:var(--m-background);display:flex;flex-direction:column;overflow:hidden;position:relative;animation:panel-slide-right .3s cubic-bezier(.2,0,0,1) forwards;border-left:var(--m-input-border-width, 1px) solid var(--m-text-input-border, color-mix(in srgb, var(--m-text) 18%, var(--m-background)));box-shadow:-.75rem 0 2rem var(--m-backdrop-shadow)}.side-panel--docked{border-left:1px dashed var(--m-border);box-shadow:none}.side-panel--left{animation-name:panel-slide-left;border-left:none;border-right:var(--m-input-border-width, 1px) solid var(--m-text-input-border, color-mix(in srgb, var(--m-text) 18%, var(--m-background)));box-shadow:.75rem 0 2rem var(--m-backdrop-shadow)}.side-panel--left.side-panel--docked{border-left:none;border-right:1px dashed var(--m-border);box-shadow:none}.side-panel__close{position:absolute;top:0;right:0;padding:.25em;z-index:20}.side-panel__content{flex:1;display:flex;flex-direction:column;min-height:0;overflow-y:auto}@media(max-width:767px){.side-panel{animation-name:panel-slide-bottom;border-left:none;border-right:none;border-top:var(--m-input-border-width, 1px) solid var(--m-text-input-border, color-mix(in srgb, var(--m-text) 18%, var(--m-background)));box-shadow:0 -.75rem 2rem var(--m-backdrop-shadow);overflow-y:auto}}@keyframes panel-slide-right{0%{transform:translate(100%)}to{transform:translate(0)}}@keyframes panel-slide-left{0%{transform:translate(-100%)}to{transform:translate(0)}}@keyframes panel-slide-bottom{0%{transform:translateY(100%)}to{transform:translateY(0)}}\n"],
40677
40779
  dependencies: [{
40678
40780
  kind: "component",
40679
40781
  type: ButtonComponent,
@@ -40747,7 +40849,7 @@ i0.ɵɵngDeclareClassMetadata({
40747
40849
  useValue: true
40748
40850
  }],
40749
40851
  host: { "[class.is-nav-hidden]": "navOpen()" },
40750
- 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;height:100%}:host.is-nav-hidden{display:none}.side-panel{height:100%;background:var(--m-background);display:flex;flex-direction:column;overflow:hidden;position:relative;animation:panel-slide-right .3s cubic-bezier(.2,0,0,1) forwards;border-left:var(--m-input-border-width, 1px) solid var(--m-text-input-border, color-mix(in srgb, var(--m-text) 18%, var(--m-background)));box-shadow:-.75rem 0 2rem color-mix(in srgb,var(--m-text) 12%,transparent)}.side-panel--docked{border-left:1px dashed var(--m-border);box-shadow:none}.side-panel--left{animation-name:panel-slide-left;border-left:none;border-right:var(--m-input-border-width, 1px) solid var(--m-text-input-border, color-mix(in srgb, var(--m-text) 18%, var(--m-background)));box-shadow:.75rem 0 2rem color-mix(in srgb,var(--m-text) 12%,transparent)}.side-panel--left.side-panel--docked{border-left:none;border-right:1px dashed var(--m-border);box-shadow:none}.side-panel__close{position:absolute;top:0;right:0;padding:.25em;z-index:20}.side-panel__content{flex:1;display:flex;flex-direction:column;min-height:0;overflow-y:auto}@media(max-width:767px){.side-panel{animation-name:panel-slide-bottom;border-left:none;border-right:none;border-top:var(--m-input-border-width, 1px) solid var(--m-text-input-border, color-mix(in srgb, var(--m-text) 18%, var(--m-background)));box-shadow:0 -.75rem 2rem color-mix(in srgb,var(--m-text) 12%,transparent);overflow-y:auto}}@keyframes panel-slide-right{0%{transform:translate(100%)}to{transform:translate(0)}}@keyframes panel-slide-left{0%{transform:translate(-100%)}to{transform:translate(0)}}@keyframes panel-slide-bottom{0%{transform:translateY(100%)}to{transform:translateY(0)}}\n"]
40852
+ 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;height:100%}:host.is-nav-hidden{display:none}.side-panel{height:100%;background:var(--m-background);display:flex;flex-direction:column;overflow:hidden;position:relative;animation:panel-slide-right .3s cubic-bezier(.2,0,0,1) forwards;border-left:var(--m-input-border-width, 1px) solid var(--m-text-input-border, color-mix(in srgb, var(--m-text) 18%, var(--m-background)));box-shadow:-.75rem 0 2rem var(--m-backdrop-shadow)}.side-panel--docked{border-left:1px dashed var(--m-border);box-shadow:none}.side-panel--left{animation-name:panel-slide-left;border-left:none;border-right:var(--m-input-border-width, 1px) solid var(--m-text-input-border, color-mix(in srgb, var(--m-text) 18%, var(--m-background)));box-shadow:.75rem 0 2rem var(--m-backdrop-shadow)}.side-panel--left.side-panel--docked{border-left:none;border-right:1px dashed var(--m-border);box-shadow:none}.side-panel__close{position:absolute;top:0;right:0;padding:.25em;z-index:20}.side-panel__content{flex:1;display:flex;flex-direction:column;min-height:0;overflow-y:auto}@media(max-width:767px){.side-panel{animation-name:panel-slide-bottom;border-left:none;border-right:none;border-top:var(--m-input-border-width, 1px) solid var(--m-text-input-border, color-mix(in srgb, var(--m-text) 18%, var(--m-background)));box-shadow:0 -.75rem 2rem var(--m-backdrop-shadow);overflow-y:auto}}@keyframes panel-slide-right{0%{transform:translate(100%)}to{transform:translate(0)}}@keyframes panel-slide-left{0%{transform:translate(-100%)}to{transform:translate(0)}}@keyframes panel-slide-bottom{0%{transform:translateY(100%)}to{transform:translateY(0)}}\n"]
40751
40853
  }]
40752
40854
  }],
40753
40855
  propDecorators: {
@@ -42075,7 +42177,7 @@ var NavHeaderComponent = class NavHeaderComponent {
42075
42177
  classAttribute: "m-nav-header"
42076
42178
  },
42077
42179
  ngImport: i0,
42078
- 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 <!-- The title follows its own Nav, as a menu row naming it would: the\n panel lists that Nav's rows, so its Page is the one they hang from.\n `role=\"button\"` also keeps the sheet's drag from starting on it. -->\n @if (h.appLogo; as logo) {\n <!-- A mounted app's header draws its AppLogo in the icon's place. -->\n <m-section-header\n class=\"nav-header__title\"\n role=\"button\"\n tabindex=\"0\"\n [label]=\"h.label\"\n (click)=\"_followHeader()\"\n (keydown.enter)=\"_followHeader()\"\n >\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\n class=\"nav-header__title\"\n role=\"button\"\n tabindex=\"0\"\n [icon]=\"h.icon\"\n [label]=\"h.label\"\n (click)=\"_followHeader()\"\n (keydown.enter)=\"_followHeader()\"\n />\n }\n }\n }\n</m-section>\n",
42180
+ 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 <!-- The title follows its own Nav, as a menu row naming it would: the\n panel lists that Nav's rows, so its Page is the one they hang from.\n `role=\"button\"` also keeps the sheet's drag from starting on it. -->\n @if (h.appLogo; as logo) {\n <!-- A mounted app's header draws its AppLogo in the icon's place. -->\n <m-section-header\n class=\"nav-header__title\"\n role=\"button\"\n tabindex=\"0\"\n [label]=\"h.label\"\n [badge]=\"h.badge\"\n (click)=\"_followHeader()\"\n (keydown.enter)=\"_followHeader()\"\n >\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\n class=\"nav-header__title\"\n role=\"button\"\n tabindex=\"0\"\n [icon]=\"h.icon\"\n [label]=\"h.label\"\n [badge]=\"h.badge\"\n (click)=\"_followHeader()\"\n (keydown.enter)=\"_followHeader()\"\n />\n }\n }\n }\n</m-section>\n",
42079
42181
  styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}.nav-header__user{display:block;padding:1rem}.nav-header__username{font-size:.6875rem;font-weight:600;color:var(--m-text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}m-section-search.nav-header__search{--_nav-row-height: var(--section-header-min-height, calc(var(--section-header-py, .5rem) * 2 + 1.25rem));min-height:var(--_nav-row-height);padding-block:0;--m-input-clear-height: calc(var(--_nav-row-height) - .5rem);--m-input-clear-min-height: calc(var(--_nav-row-height) - .5rem)}.nav-header__title{cursor:pointer}.nav-header__title:hover,.nav-header__title:focus-visible{background:color-mix(in srgb,var(--m-text) 8%,transparent);outline:none}.nav-header__title .nav-header__app-logo{flex-shrink:0;align-self:flex-start;width:var(--m-section-header-icon-box, 1.5125rem);height:var(--m-section-header-icon-box, 1.5125rem)}\n"],
42080
42182
  dependencies: [
42081
42183
  {
@@ -42120,6 +42222,7 @@ var NavHeaderComponent = class NavHeaderComponent {
42120
42222
  "disableRule",
42121
42223
  "extraData",
42122
42224
  "align",
42225
+ "badge",
42123
42226
  "showBack",
42124
42227
  "actionButton",
42125
42228
  "actionLabel",
@@ -42280,7 +42383,7 @@ i0.ɵɵngDeclareClassMetadata({
42280
42383
  "[style.display]": "\"block\"",
42281
42384
  "[style.--m-section-min-height]": "\"0\""
42282
42385
  },
42283
- 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 <!-- The title follows its own Nav, as a menu row naming it would: the\n panel lists that Nav's rows, so its Page is the one they hang from.\n `role=\"button\"` also keeps the sheet's drag from starting on it. -->\n @if (h.appLogo; as logo) {\n <!-- A mounted app's header draws its AppLogo in the icon's place. -->\n <m-section-header\n class=\"nav-header__title\"\n role=\"button\"\n tabindex=\"0\"\n [label]=\"h.label\"\n (click)=\"_followHeader()\"\n (keydown.enter)=\"_followHeader()\"\n >\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\n class=\"nav-header__title\"\n role=\"button\"\n tabindex=\"0\"\n [icon]=\"h.icon\"\n [label]=\"h.label\"\n (click)=\"_followHeader()\"\n (keydown.enter)=\"_followHeader()\"\n />\n }\n }\n }\n</m-section>\n",
42386
+ 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 <!-- The title follows its own Nav, as a menu row naming it would: the\n panel lists that Nav's rows, so its Page is the one they hang from.\n `role=\"button\"` also keeps the sheet's drag from starting on it. -->\n @if (h.appLogo; as logo) {\n <!-- A mounted app's header draws its AppLogo in the icon's place. -->\n <m-section-header\n class=\"nav-header__title\"\n role=\"button\"\n tabindex=\"0\"\n [label]=\"h.label\"\n [badge]=\"h.badge\"\n (click)=\"_followHeader()\"\n (keydown.enter)=\"_followHeader()\"\n >\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\n class=\"nav-header__title\"\n role=\"button\"\n tabindex=\"0\"\n [icon]=\"h.icon\"\n [label]=\"h.label\"\n [badge]=\"h.badge\"\n (click)=\"_followHeader()\"\n (keydown.enter)=\"_followHeader()\"\n />\n }\n }\n }\n</m-section>\n",
42284
42387
  styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}.nav-header__user{display:block;padding:1rem}.nav-header__username{font-size:.6875rem;font-weight:600;color:var(--m-text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}m-section-search.nav-header__search{--_nav-row-height: var(--section-header-min-height, calc(var(--section-header-py, .5rem) * 2 + 1.25rem));min-height:var(--_nav-row-height);padding-block:0;--m-input-clear-height: calc(var(--_nav-row-height) - .5rem);--m-input-clear-min-height: calc(var(--_nav-row-height) - .5rem)}.nav-header__title{cursor:pointer}.nav-header__title:hover,.nav-header__title:focus-visible{background:color-mix(in srgb,var(--m-text) 8%,transparent);outline:none}.nav-header__title .nav-header__app-logo{flex-shrink:0;align-self:flex-start;width:var(--m-section-header-icon-box, 1.5125rem);height:var(--m-section-header-icon-box, 1.5125rem)}\n"]
42285
42388
  }]
42286
42389
  }],
@@ -42344,6 +42447,7 @@ var NavMenuComponent = class NavMenuComponent {
42344
42447
  browse = (item) => {
42345
42448
  if (item.nav) this._navRef?.browse?.(item.nav, item.navParams);
42346
42449
  };
42450
+ formatBadgeCount = (count, max = 99) => formatBadgeCount(count, max);
42347
42451
  rows = computed(() => (this.navList() ?? []).map((item, index) => ({
42348
42452
  id: `${item.nav ?? item.href ?? item.label}-${index}`,
42349
42453
  row: item
@@ -42395,6 +42499,18 @@ var NavMenuComponent = class NavMenuComponent {
42395
42499
  <m-icon [name]="item.icon || 'menu'" [baseUrl]="baseUrl()" />
42396
42500
  }
42397
42501
  </ng-template>
42502
+ <!-- A row's count, drawn beside the row's own word rather than pushed to
42503
+ the row's end: it is the same figure the panel's header wears and part
42504
+ of the label, not a column of figures the list is scanned by. -->
42505
+ <ng-template #badgeTemplate let-item>
42506
+ @if (item.badge; as badge) {
42507
+ <m-badge
42508
+ class="nav-menu__badge"
42509
+ [config]="{ variant: badge.variant ?? 'danger' }"
42510
+ >{{ formatBadgeCount(badge.count) }}</m-badge
42511
+ >
42512
+ }
42513
+ </ng-template>
42398
42514
  <ng-template #menuTemplate let-item="row">
42399
42515
  <div class="nav-menu__item">
42400
42516
  @if (item.nav; as nav) {
@@ -42410,7 +42526,10 @@ var NavMenuComponent = class NavMenuComponent {
42410
42526
  <span class="nav-menu__icon">
42411
42527
  <ng-container *ngTemplateOutlet="iconTemplate; context: { $implicit: item }" />
42412
42528
  </span>
42413
- <span class="nav-menu__label">{{ item.label | translate }}</span>
42529
+ <span class="nav-menu__label">
42530
+ {{ item.label | translate }}
42531
+ <ng-container *ngTemplateOutlet="badgeTemplate; context: { $implicit: item }" />
42532
+ </span>
42414
42533
  </a>
42415
42534
  <!-- The row follows the Nav; the chevron only Browses into it. -->
42416
42535
  @if (item.browsable) {
@@ -42428,7 +42547,10 @@ var NavMenuComponent = class NavMenuComponent {
42428
42547
  <span class="nav-menu__icon">
42429
42548
  <ng-container *ngTemplateOutlet="iconTemplate; context: { $implicit: item }" />
42430
42549
  </span>
42431
- <span class="nav-menu__label">{{ item.label | translate }}</span>
42550
+ <span class="nav-menu__label">
42551
+ {{ item.label | translate }}
42552
+ <ng-container *ngTemplateOutlet="badgeTemplate; context: { $implicit: item }" />
42553
+ </span>
42432
42554
  </a>
42433
42555
  } @else {
42434
42556
  <span class="nav-menu__icon">
@@ -42436,6 +42558,7 @@ var NavMenuComponent = class NavMenuComponent {
42436
42558
  </span>
42437
42559
  <span class="nav-menu__label">
42438
42560
  <span class="nav-menu__text">{{ item.label | translate }}</span>
42561
+ <ng-container *ngTemplateOutlet="badgeTemplate; context: { $implicit: item }" />
42439
42562
  </span>
42440
42563
  }
42441
42564
  </div>
@@ -42445,7 +42568,7 @@ var NavMenuComponent = class NavMenuComponent {
42445
42568
  </div>
42446
42569
  `,
42447
42570
  isInline: true,
42448
- 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"],
42571
+ 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__badge{--m-badge-height: 1.5em;--m-badge-min-width: 1.5em;--m-badge-padding: 0 .3em;--m-badge-gap: .1em;vertical-align:middle;margin-inline-start:.15rem}.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"],
42449
42572
  dependencies: [
42450
42573
  {
42451
42574
  kind: "directive",
@@ -42487,6 +42610,13 @@ var NavMenuComponent = class NavMenuComponent {
42487
42610
  "size"
42488
42611
  ]
42489
42612
  },
42613
+ {
42614
+ kind: "component",
42615
+ type: BadgeComponent,
42616
+ selector: "m-badge",
42617
+ inputs: ["config"],
42618
+ outputs: ["configChange"]
42619
+ },
42490
42620
  {
42491
42621
  kind: "directive",
42492
42622
  type: MRefDirective,
@@ -42576,6 +42706,18 @@ i0.ɵɵngDeclareClassMetadata({
42576
42706
  <m-icon [name]="item.icon || 'menu'" [baseUrl]="baseUrl()" />
42577
42707
  }
42578
42708
  </ng-template>
42709
+ <!-- A row's count, drawn beside the row's own word rather than pushed to
42710
+ the row's end: it is the same figure the panel's header wears and part
42711
+ of the label, not a column of figures the list is scanned by. -->
42712
+ <ng-template #badgeTemplate let-item>
42713
+ @if (item.badge; as badge) {
42714
+ <m-badge
42715
+ class="nav-menu__badge"
42716
+ [config]="{ variant: badge.variant ?? 'danger' }"
42717
+ >{{ formatBadgeCount(badge.count) }}</m-badge
42718
+ >
42719
+ }
42720
+ </ng-template>
42579
42721
  <ng-template #menuTemplate let-item="row">
42580
42722
  <div class="nav-menu__item">
42581
42723
  @if (item.nav; as nav) {
@@ -42591,7 +42733,10 @@ i0.ɵɵngDeclareClassMetadata({
42591
42733
  <span class="nav-menu__icon">
42592
42734
  <ng-container *ngTemplateOutlet="iconTemplate; context: { $implicit: item }" />
42593
42735
  </span>
42594
- <span class="nav-menu__label">{{ item.label | translate }}</span>
42736
+ <span class="nav-menu__label">
42737
+ {{ item.label | translate }}
42738
+ <ng-container *ngTemplateOutlet="badgeTemplate; context: { $implicit: item }" />
42739
+ </span>
42595
42740
  </a>
42596
42741
  <!-- The row follows the Nav; the chevron only Browses into it. -->
42597
42742
  @if (item.browsable) {
@@ -42609,7 +42754,10 @@ i0.ɵɵngDeclareClassMetadata({
42609
42754
  <span class="nav-menu__icon">
42610
42755
  <ng-container *ngTemplateOutlet="iconTemplate; context: { $implicit: item }" />
42611
42756
  </span>
42612
- <span class="nav-menu__label">{{ item.label | translate }}</span>
42757
+ <span class="nav-menu__label">
42758
+ {{ item.label | translate }}
42759
+ <ng-container *ngTemplateOutlet="badgeTemplate; context: { $implicit: item }" />
42760
+ </span>
42613
42761
  </a>
42614
42762
  } @else {
42615
42763
  <span class="nav-menu__icon">
@@ -42617,6 +42765,7 @@ i0.ɵɵngDeclareClassMetadata({
42617
42765
  </span>
42618
42766
  <span class="nav-menu__label">
42619
42767
  <span class="nav-menu__text">{{ item.label | translate }}</span>
42768
+ <ng-container *ngTemplateOutlet="badgeTemplate; context: { $implicit: item }" />
42620
42769
  </span>
42621
42770
  }
42622
42771
  </div>
@@ -42630,12 +42779,13 @@ i0.ɵɵngDeclareClassMetadata({
42630
42779
  NgTemplateOutlet,
42631
42780
  IconComponent,
42632
42781
  AppLogoComponent,
42782
+ BadgeComponent,
42633
42783
  MRefDirective,
42634
42784
  TranslatePipe,
42635
42785
  ListComponent,
42636
42786
  ButtonComponent
42637
42787
  ],
42638
- 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"]
42788
+ 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__badge{--m-badge-height: 1.5em;--m-badge-min-width: 1.5em;--m-badge-padding: 0 .3em;--m-badge-gap: .1em;vertical-align:middle;margin-inline-start:.15rem}.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"]
42639
42789
  }]
42640
42790
  }],
42641
42791
  propDecorators: {
@@ -47118,16 +47268,16 @@ const platformNavWidgets = () => ({
47118
47268
  });
47119
47269
  const providePlatformNavWidgets = () => provideNavWidgets(platformNavWidgets());
47120
47270
  function provideAppContext() {
47121
- const navStore = inject(NavStore);
47271
+ const ownAppLink = inject(APP_LINK);
47122
47272
  const authStore = inject(AuthStore);
47123
47273
  const agreementGate = inject(AgreementGate);
47124
47274
  const relationType = signal(null, ...ngDevMode ? [{ debugName: "relationType" }] : /* istanbul ignore next */ []);
47125
47275
  effect(() => {
47126
- const appLink = navStore.appLink();
47276
+ const appLink = ownAppLink();
47127
47277
  const isLoggedIn = authStore.isLoggedIn();
47128
47278
  agreementGate.revision();
47129
47279
  if (appLink && isLoggedIn) {
47130
- const current = () => untracked(navStore.appLink) === appLink;
47280
+ const current = () => untracked(ownAppLink) === appLink;
47131
47281
  agreementGate.view(appLink).then((view) => current() && relationType.set(view.type), () => current() && relationType.set(null));
47132
47282
  } else relationType.set(null);
47133
47283
  });
@@ -48594,6 +48744,7 @@ var SvgGeneratorToolBoxComponent = class SvgGeneratorToolBoxComponent {
48594
48744
  "disableRule",
48595
48745
  "extraData",
48596
48746
  "align",
48747
+ "badge",
48597
48748
  "showBack",
48598
48749
  "actionButton",
48599
48750
  "actionLabel",
@@ -51697,6 +51848,6 @@ i0.ɵɵngDeclareClassMetadata({
51697
51848
  }]
51698
51849
  }
51699
51850
  });
51700
- 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, HOST_SESSION, HeaderComponent, HighlightDirective, HttpService, HttpSharingClient, ICON_SOURCE, IS_DESIGN_MODE, IS_SIDE_PANEL, IconComponent, ImgComponent, InputType, InstrumentScoreComponent, InterceptorObservables, JumbotronComponent, KeyValueComponent, LAYOUT_ASSET_FOLDER, LOADING_ACTIONS_REF, LOGIN_COMPONENT, LOGIN_STORE, LOGO_GLYPH_MAX_BYTES, LanguageComponent, ListComponent, LogoComponent, LogoGlyphInputComponent, MAG_SOCKET_EVENT, MHeroColorDirective, MHeroComponent, MODAL_REF, MODAL_STORE_REF, MOUNT_STATIC_SEGMENT, MOUNT_TOKEN, MRefDirective, MStepComponent, MURL_PARAM, MURL_SEP, ManifestEnrichmentService, MarginDirective, MenuComponent, ModalDirective, ModalRef, ModalStore, MoneyPipe, MultiRangeInputComponent, MultiselectInputComponent, MurlUrlSerializer, NAV_DEFAULT_MURL, NAV_ID_SEP, NAV_MAIN_BUTTONS, NAV_SEGMENT_RE, NAV_STORE_REF, NAV_WC_COMPONENTS, NAV_WIDGET_MAP, NavComponent, NavDetailsComponent, NavHeaderComponent, NavMenuComponent, NavStore, NavTrailComponent, NothingComponent, NotificationElementComponent, NotificationGroupComponent, NotificationPopupComponent, NotificationService, NotificationStore, NotificationType, NotificationWidgetComponent, ONE_ASSET_BASE_URL, OPTIONS_SOURCE, OVERLAY_WIDGETS, OneApp, OptionsSourceDirective, OverlayBodyComponent, OverlayRef, OverlayService, PLATFORM_BUTTON_NAV_IDS, PLATFORM_EXTENSIBLE_NAV_IDS, PLATFORM_NAV_MAP, PLATFORM_ROOT_CHILDREN, PLUGIN_FALLBACK_LANG, PLUGIN_OUTPUT_EVENT, PLUGIN_SCREENS, PaddingDirective, PaginationComponent, PanelComponent, PercentagePipe, PlaygroundComponent, PluginComponent, PluginInputComponent, PluginOutputComponent, PositionDirective, PwaInstallComponent, RECENT_SEARCH_LIMIT, REMOTE_BOOT_TIMEOUT_MS, REMOTE_PAGE_RELOAD, ROOT_NAV, RadioGroupComponent, RadioInputComponent, RangeInputComponent, RatingInputComponent, ReactiveElementComponent, RemoteComponent, RemoteLoaderService, ResizeElementComponent, RouteContainer, RowComponent, SEARCH_ANSWER_KEY, SEARCH_LABEL_KEY, SEARCH_QUERY, SEARCH_RESULTS_EVENT, SECTION_ACCORDION_GROUP, SECTION_FORM_CONTEXT, SECTION_TABLE_VARIANTS, SHARED_ICONS, SHARING_CLIENT, SIZE_CONTEXT, SPACING_INWARD, SPLASH_ID, ScoreComponent, ScrollComponent, ScrollService, SearchPanelComponent, SearchStore, SearchUserPanelComponent, SectionAccordionDirective, SectionAccordionGroupDirective, SectionBackComponent, SectionBadgesComponent, SectionButtonGroupComponent, SectionCardComponent, SectionCarouselComponent, SectionComponent, SectionFilterComponent, SectionFilterGroupComponent, SectionFilterMenuComponent, SectionFilterPanelComponent, SectionFilterRangePanelComponent, SectionFooterComponent, SectionFormComponent, SectionFormItemComponent, SectionHeaderComponent, SectionHeroComponent, SectionPaginationComponent, SectionSearchComponent, SectionStepperComponent, SectionTableCellComponent, SectionTableComponent, SectionTableRowComponent, SectionTableSortPipe, SectionTabsComponent, SectionToggleComponent, SectionToggleItemDirective, SelectableCardInputComponent, SelectorDirective, SettingsSearchBarComponent, SettingsSearchService, ShapeComponent, SharedStoreRegistry, SidePanelDirective, Size, SocketStore, SortComponent, StatComponent, StepComponent, StepperComponent, StepsComponent, StorageService, StrokeLinecap, StrokeLinejoin, SummaryComponent, SvgGeneratorComponent, SvgGeneratorService, SvgService, TOTAL_COLUMNS, TRANSLATION_SOURCE, TableComponent, TechnicalMeterComponent, TextInputComponent, TextOutputComponent, TextareaInputComponent, ThemeComponent, ThemeDataService, ThemeService, ThemeStore, TimeAgoPipe, TimelineComponent, ToggleButtonComponent, ToggleInputComponent, ToggleRadioInputComponent, ToolTipDirective, TooltipComponent, TranslatePipe, TranslateService, TreeGridComponent, URL_SEP, USER_STORE_REF, USER_TAB_MAP, UniverseComponent, UserApiService, UserAvatarComponent, UserComponent, UserNavComponent, UserSettingsComponent, UserStore, WC_BUNDLE, WC_NAVIGATE_EVENT, WC_ROUTE_CHANGED_EVENT, WC_SEARCH_GROUPS, WIN_USER_TAB_HOOK, WIN_USER_TAB_KEY, WatermarkComponent, WcRouterStore, WrapperInputComponent, activeElementWithin, allowedCodes, anchorNavId, appColorBrand, appLogoShadowColor, appThemeColorFactory, applyColorsToElement, applyDocEdit, assetOptions, baseUnderHost, bootstrapMagApp, bootstrapPwaInstall, browserLocale, buildWcBaseUrl, calculateLuminance, calculateRanks, cellText, checkDoc, checkFilterCondition, childNavId, claimDenial, classListSignal, coerceSize, cornerEdge, cornerSide, createLoadingState, createMap, createPlatformNavMap, createPluginElement, definePluginScreens, definedWcBundleOf, definedWcTierOf, deriveAvatarGradient, deriveContrastColor, deriveOppositeColor, derivePropertyName, docActionKey, docAssetCandidates, docProblemKey, docRemotePath, emailValidation, escapeHtml, 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, isReadableOn, isSize, isTierPreview, isUrlLocalhost, isValidNavId, isValidNavSegment, isWebComponent, linkToId, linkToNav, loadingActions, logoGlyphMaskUrl, mInterceptor, manualValidation, matchFieldValidation, matchMount, maxLengthValidation, maxValidation, mergePlatformNav, mergeUnique, mergeUniqueBy, mergeUniqueWith, minAgeValidation, minLengthValidation, minValidation, miniMarkInlineToHtml, 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, readableAppColor, rebuildLogoGlyph, recordDefinedWcTier, registerSessionRenewal, remoteOutletRoute, renderAddress, renderDocument, requiredValidation, resolveConfigAsset, resolveIconSize, resolvePallet, resolvePatternRules, resolveSize, resolveSpacing, rgbToHex, rgbToHsl, rowHasChildren, samePatterns, sectionTableColumnId, sectionTableColumnWidths, sectionTableFrozenCount, segmentsToNavId, setProperty, setTreeGridChildren, setWcLocalPort, setWcTier, settingsWidgets, shouldShowBadge, sortSectionTableRows, splashHtml, splitNavId, splitOnMatch, splitPath, stringToColor, tailRouteOf, toAttrBool, toAttrNumber, toCssLength, toHostNavId, toLength, toLocalNavId, toggleGroup, toggleTreeGridRow, toggleUid, unfetchedPlatformNav, ungroupedDocActions, urlValidation, wcLocalBaseOf, wcTierOf, withLevel };
51851
+ 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, HOST_SESSION, HeaderComponent, HighlightDirective, HttpService, HttpSharingClient, ICON_SOURCE, IS_DESIGN_MODE, IS_SIDE_PANEL, IconComponent, ImgComponent, InputType, InstrumentScoreComponent, InterceptorObservables, JumbotronComponent, KeyValueComponent, LAYOUT_ASSET_FOLDER, LOADING_ACTIONS_REF, LOGIN_COMPONENT, LOGIN_STORE, LOGO_GLYPH_MAX_BYTES, LanguageComponent, ListComponent, LogoComponent, LogoGlyphInputComponent, MAG_SOCKET_EVENT, MHeroColorDirective, MHeroComponent, MODAL_REF, MODAL_STORE_REF, MOUNT_STATIC_SEGMENT, MOUNT_TOKEN, MRefDirective, MStepComponent, MURL_PARAM, MURL_SEP, ManifestEnrichmentService, MarginDirective, MenuComponent, ModalDirective, ModalRef, ModalStore, MoneyPipe, MultiRangeInputComponent, MultiselectInputComponent, MurlUrlSerializer, NAV_DEFAULT_MURL, NAV_ID_SEP, NAV_MAIN_BUTTONS, NAV_SEGMENT_RE, NAV_STORE_REF, NAV_WC_COMPONENTS, NAV_WIDGET_MAP, NavComponent, NavDetailsComponent, NavHeaderComponent, NavMenuComponent, NavStore, NavTrailComponent, NothingComponent, NotificationElementComponent, NotificationGroupComponent, NotificationPopupComponent, NotificationService, NotificationStore, NotificationType, NotificationWidgetComponent, ONE_ASSET_BASE_URL, OPTIONS_SOURCE, OVERLAY_WIDGETS, OneApp, OptionsSourceDirective, OverlayBodyComponent, OverlayRef, OverlayService, PLATFORM_BUTTON_NAV_IDS, PLATFORM_EXTENSIBLE_NAV_IDS, PLATFORM_NAV_MAP, PLATFORM_ROOT_CHILDREN, PLUGIN_FALLBACK_LANG, PLUGIN_OUTPUT_EVENT, PLUGIN_SCREENS, PaddingDirective, PaginationComponent, PanelComponent, PercentagePipe, PlaygroundComponent, PluginComponent, PluginInputComponent, PluginOutputComponent, PositionDirective, PwaInstallComponent, RECENT_SEARCH_LIMIT, REMOTE_BOOT_TIMEOUT_MS, REMOTE_PAGE_RELOAD, ROOT_NAV, RadioGroupComponent, RadioInputComponent, RangeInputComponent, RatingInputComponent, ReactiveElementComponent, RemoteComponent, RemoteLoaderService, ResizeElementComponent, RouteContainer, RowComponent, SEARCH_ANSWER_KEY, SEARCH_LABEL_KEY, SEARCH_QUERY, SEARCH_RESULTS_EVENT, SECTION_ACCORDION_GROUP, SECTION_FORM_CONTEXT, SECTION_TABLE_VARIANTS, SHARED_ICONS, SHARING_CLIENT, SIZE_CONTEXT, SPACING_INWARD, SPLASH_ID, ScoreComponent, ScrollComponent, ScrollService, SearchPanelComponent, SearchStore, SearchUserPanelComponent, SectionAccordionDirective, SectionAccordionGroupDirective, SectionBackComponent, SectionBadgesComponent, SectionButtonGroupComponent, SectionCardComponent, SectionCarouselComponent, SectionComponent, SectionFilterComponent, SectionFilterGroupComponent, SectionFilterMenuComponent, SectionFilterPanelComponent, SectionFilterRangePanelComponent, SectionFooterComponent, SectionFormComponent, SectionFormItemComponent, SectionHeaderComponent, SectionHeroComponent, SectionPaginationComponent, SectionSearchComponent, SectionStepperComponent, SectionTableCellComponent, SectionTableComponent, SectionTableRowComponent, SectionTableSortPipe, SectionTabsComponent, SectionToggleComponent, SectionToggleItemDirective, SelectableCardInputComponent, SelectorDirective, SettingsSearchBarComponent, SettingsSearchService, ShapeComponent, SharedStoreRegistry, SidePanelDirective, Size, SocketStore, SortComponent, StatComponent, StepComponent, StepperComponent, StepsComponent, StorageService, StrokeLinecap, StrokeLinejoin, SummaryComponent, SvgGeneratorComponent, SvgGeneratorService, SvgService, TOTAL_COLUMNS, TRANSLATION_SOURCE, TableComponent, TechnicalMeterComponent, TextInputComponent, TextOutputComponent, TextareaInputComponent, ThemeComponent, ThemeDataService, ThemeService, ThemeStore, TimeAgoPipe, TimelineComponent, ToggleButtonComponent, ToggleInputComponent, ToggleRadioInputComponent, ToolTipDirective, TooltipComponent, TranslatePipe, TranslateService, TreeGridComponent, URL_SEP, USER_STORE_REF, USER_TAB_MAP, UniverseComponent, UserApiService, UserAvatarComponent, UserComponent, UserNavComponent, UserSettingsComponent, UserStore, WC_BUNDLE, WC_NAVIGATE_EVENT, WC_ROUTE_CHANGED_EVENT, WC_SEARCH_GROUPS, WIN_USER_TAB_HOOK, WIN_USER_TAB_KEY, WatermarkComponent, WcRouterStore, WrapperInputComponent, activeElementWithin, allowedCodes, anchorNavId, appColorBrand, appLogoShadowColor, appThemeColorFactory, applyColorsToElement, applyDocEdit, assetOptions, baseUnderHost, bootstrapMagApp, bootstrapPwaInstall, browserLocale, buildWcBaseUrl, calculateLuminance, calculateRanks, cellText, checkDoc, checkFilterCondition, childNavId, claimDenial, classListSignal, coerceSize, cornerEdge, cornerSide, createLoadingState, createMap, createPlatformNavMap, createPluginElement, definePluginScreens, definedWcBundleOf, definedWcTierOf, deriveAvatarGradient, deriveContrastColor, deriveOppositeColor, derivePropertyName, docActionKey, docAssetCandidates, docProblemKey, docRemotePath, emailValidation, escapeHtml, 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, isNavCountConfig, isNavInstanceConfig, isNavMenuConfig, isNavRowsConfig, isNavVisibilityConfig, isPlatformNavId, isPlatformPanelNavId, isReadableOn, isSize, isTierPreview, isUrlLocalhost, isValidNavId, isValidNavSegment, isWebComponent, linkToId, linkToNav, loadingActions, logoGlyphMaskUrl, mInterceptor, manualValidation, matchFieldValidation, matchMount, maxLengthValidation, maxValidation, mergePlatformNav, mergeUnique, mergeUniqueBy, mergeUniqueWith, minAgeValidation, minLengthValidation, minValidation, miniMarkInlineToHtml, 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, readableAppColor, rebuildLogoGlyph, recordDefinedWcTier, registerSessionRenewal, remoteOutletRoute, renderAddress, renderDocument, requiredValidation, resolveConfigAsset, resolveIconSize, resolvePallet, resolvePatternRules, resolveSize, resolveSpacing, rgbToHex, rgbToHsl, rowHasChildren, samePatterns, sectionTableColumnId, sectionTableColumnWidths, sectionTableFrozenCount, segmentsToNavId, setProperty, setTreeGridChildren, setWcLocalPort, setWcTier, settingsWidgets, shouldShowBadge, sortSectionTableRows, splashHtml, splitNavId, splitOnMatch, splitPath, stringToColor, tailRouteOf, toAttrBool, toAttrNumber, toCssLength, toHostNavId, toLength, toLocalNavId, toggleGroup, toggleTreeGridRow, toggleUid, unfetchedPlatformNav, ungroupedDocActions, urlValidation, wcLocalBaseOf, wcTierOf, withLevel };
51701
51852
 
51702
51853
  //# sourceMappingURL=magmonium-one.mjs.map