@magmonium/one 0.4.11 → 0.4.13

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 (138) hide show
  1. package/assets/i18n/af.json +250 -1
  2. package/assets/i18n/am.json +250 -1
  3. package/assets/i18n/ar.json +250 -1
  4. package/assets/i18n/as.json +250 -1
  5. package/assets/i18n/az.json +250 -1
  6. package/assets/i18n/ba.json +250 -1
  7. package/assets/i18n/be.json +250 -1
  8. package/assets/i18n/bg.json +250 -1
  9. package/assets/i18n/bn.json +250 -1
  10. package/assets/i18n/br.json +250 -1
  11. package/assets/i18n/brx.json +250 -1
  12. package/assets/i18n/bs.json +250 -1
  13. package/assets/i18n/ca.json +250 -1
  14. package/assets/i18n/ceb.json +250 -1
  15. package/assets/i18n/cnr.json +250 -1
  16. package/assets/i18n/co.json +250 -1
  17. package/assets/i18n/cs.json +250 -1
  18. package/assets/i18n/cy.json +250 -1
  19. package/assets/i18n/da.json +250 -1
  20. package/assets/i18n/de.json +250 -1
  21. package/assets/i18n/doi.json +250 -1
  22. package/assets/i18n/el.json +250 -1
  23. package/assets/i18n/en.json +249 -0
  24. package/assets/i18n/eo.json +250 -1
  25. package/assets/i18n/es.json +250 -1
  26. package/assets/i18n/et.json +250 -1
  27. package/assets/i18n/eu.json +250 -1
  28. package/assets/i18n/fa.json +250 -1
  29. package/assets/i18n/fi.json +250 -1
  30. package/assets/i18n/fr.json +250 -1
  31. package/assets/i18n/fy.json +250 -1
  32. package/assets/i18n/ga.json +250 -1
  33. package/assets/i18n/gd.json +250 -1
  34. package/assets/i18n/gl.json +250 -1
  35. package/assets/i18n/gu.json +250 -1
  36. package/assets/i18n/ha.json +250 -1
  37. package/assets/i18n/haw.json +250 -1
  38. package/assets/i18n/he.json +250 -1
  39. package/assets/i18n/hi.json +250 -1
  40. package/assets/i18n/hmn.json +250 -1
  41. package/assets/i18n/hr.json +250 -1
  42. package/assets/i18n/hu.json +250 -1
  43. package/assets/i18n/hy.json +250 -1
  44. package/assets/i18n/id.json +250 -1
  45. package/assets/i18n/ie.json +250 -1
  46. package/assets/i18n/ig.json +250 -1
  47. package/assets/i18n/ilo.json +250 -1
  48. package/assets/i18n/is.json +250 -1
  49. package/assets/i18n/it.json +250 -1
  50. package/assets/i18n/iw.json +250 -1
  51. package/assets/i18n/ja.json +250 -1
  52. package/assets/i18n/jw.json +250 -1
  53. package/assets/i18n/ka.json +250 -1
  54. package/assets/i18n/kk.json +250 -1
  55. package/assets/i18n/km.json +250 -1
  56. package/assets/i18n/kn.json +250 -1
  57. package/assets/i18n/ko.json +250 -1
  58. package/assets/i18n/kok.json +250 -1
  59. package/assets/i18n/ks.json +250 -1
  60. package/assets/i18n/ku.json +250 -1
  61. package/assets/i18n/ky.json +250 -1
  62. package/assets/i18n/la.json +250 -1
  63. package/assets/i18n/lb.json +250 -1
  64. package/assets/i18n/lo.json +250 -1
  65. package/assets/i18n/lt.json +250 -1
  66. package/assets/i18n/lv.json +250 -1
  67. package/assets/i18n/ma.json +250 -1
  68. package/assets/i18n/mai.json +250 -1
  69. package/assets/i18n/me.json +250 -1
  70. package/assets/i18n/mg.json +250 -1
  71. package/assets/i18n/mi.json +250 -1
  72. package/assets/i18n/mk.json +250 -1
  73. package/assets/i18n/ml.json +250 -1
  74. package/assets/i18n/mn.json +250 -1
  75. package/assets/i18n/mni.json +250 -1
  76. package/assets/i18n/mr.json +250 -1
  77. package/assets/i18n/ms.json +250 -1
  78. package/assets/i18n/mt.json +250 -1
  79. package/assets/i18n/my.json +250 -1
  80. package/assets/i18n/ne.json +250 -1
  81. package/assets/i18n/nl.json +250 -1
  82. package/assets/i18n/no.json +250 -1
  83. package/assets/i18n/ny.json +250 -1
  84. package/assets/i18n/or.json +250 -1
  85. package/assets/i18n/pa.json +250 -1
  86. package/assets/i18n/pl.json +250 -1
  87. package/assets/i18n/ps.json +250 -1
  88. package/assets/i18n/pt.json +250 -1
  89. package/assets/i18n/rm.json +250 -1
  90. package/assets/i18n/ro.json +250 -1
  91. package/assets/i18n/ru.json +250 -1
  92. package/assets/i18n/sa.json +250 -1
  93. package/assets/i18n/sat.json +250 -1
  94. package/assets/i18n/sc.json +250 -1
  95. package/assets/i18n/sd.json +250 -1
  96. package/assets/i18n/si.json +250 -1
  97. package/assets/i18n/sk.json +250 -1
  98. package/assets/i18n/sl.json +250 -1
  99. package/assets/i18n/sm.json +250 -1
  100. package/assets/i18n/sn.json +250 -1
  101. package/assets/i18n/so.json +250 -1
  102. package/assets/i18n/sq.json +250 -1
  103. package/assets/i18n/sr.json +250 -1
  104. package/assets/i18n/st.json +250 -1
  105. package/assets/i18n/su.json +250 -1
  106. package/assets/i18n/sv.json +250 -1
  107. package/assets/i18n/sw.json +250 -1
  108. package/assets/i18n/ta.json +250 -1
  109. package/assets/i18n/te.json +250 -1
  110. package/assets/i18n/tg.json +250 -1
  111. package/assets/i18n/th.json +250 -1
  112. package/assets/i18n/tl.json +250 -1
  113. package/assets/i18n/tr.json +250 -1
  114. package/assets/i18n/uk.json +250 -1
  115. package/assets/i18n/ur.json +250 -1
  116. package/assets/i18n/uz.json +250 -1
  117. package/assets/i18n/vi.json +250 -1
  118. package/assets/i18n/xh.json +250 -1
  119. package/assets/i18n/yi.json +250 -1
  120. package/assets/i18n/yo.json +250 -1
  121. package/assets/i18n/zh.json +250 -1
  122. package/assets/i18n/zu.json +250 -1
  123. package/assets/index.json +1 -1
  124. package/assets/options/countries.json +1 -1
  125. package/fesm2022/{magmonium-one-image-editor-w_mIbhJH.mjs → magmonium-one-image-editor-DN8v0YOv.mjs} +2 -2
  126. package/fesm2022/{magmonium-one-image-editor-w_mIbhJH.mjs.map → magmonium-one-image-editor-DN8v0YOv.mjs.map} +1 -1
  127. package/fesm2022/{magmonium-one-magmonium-one-Cu45fHus.mjs → magmonium-one-magmonium-one-DWeZSPCv.mjs} +508 -488
  128. package/fesm2022/magmonium-one-magmonium-one-DWeZSPCv.mjs.map +1 -0
  129. package/fesm2022/{magmonium-one-otp-Ct41thd0.mjs → magmonium-one-otp-CpjpaJdi.mjs} +2 -2
  130. package/fesm2022/{magmonium-one-otp-Ct41thd0.mjs.map → magmonium-one-otp-CpjpaJdi.mjs.map} +1 -1
  131. package/fesm2022/{magmonium-one-password-CT8y_iYQ.mjs → magmonium-one-password-CX1OjX5P.mjs} +2 -2
  132. package/fesm2022/{magmonium-one-password-CT8y_iYQ.mjs.map → magmonium-one-password-CX1OjX5P.mjs.map} +1 -1
  133. package/fesm2022/{magmonium-one-toggle-DELqFKZY.mjs → magmonium-one-toggle-zniJyl09.mjs} +2 -2
  134. package/fesm2022/{magmonium-one-toggle-DELqFKZY.mjs.map → magmonium-one-toggle-zniJyl09.mjs.map} +1 -1
  135. package/fesm2022/magmonium-one.mjs +1 -1
  136. package/package.json +1 -1
  137. package/types/magmonium-one.d.ts +167 -121
  138. package/fesm2022/magmonium-one-magmonium-one-Cu45fHus.mjs.map +0 -1
@@ -8992,7 +8992,7 @@ class SectionFormItemComponent extends ConfigComponent {
8992
8992
  break;
8993
8993
  }
8994
8994
  case InputType.TOGGLE: {
8995
- const { ToggleInputComponent } = await import('./magmonium-one-toggle-DELqFKZY.mjs');
8995
+ const { ToggleInputComponent } = await import('./magmonium-one-toggle-zniJyl09.mjs');
8996
8996
  this.createDynamicComponent(seq, ToggleInputComponent, [], true);
8997
8997
  break;
8998
8998
  }
@@ -9004,12 +9004,12 @@ class SectionFormItemComponent extends ConfigComponent {
9004
9004
  break;
9005
9005
  }
9006
9006
  case InputType.PASSWORD: {
9007
- const { PasswordInputComponent } = await import('./magmonium-one-password-CT8y_iYQ.mjs');
9007
+ const { PasswordInputComponent } = await import('./magmonium-one-password-CX1OjX5P.mjs');
9008
9008
  this.createDynamicComponent(seq, PasswordInputComponent);
9009
9009
  break;
9010
9010
  }
9011
9011
  case InputType.OTP: {
9012
- const { OtpInputComponent } = await import('./magmonium-one-otp-Ct41thd0.mjs');
9012
+ const { OtpInputComponent } = await import('./magmonium-one-otp-CpjpaJdi.mjs');
9013
9013
  this.createDynamicComponent(seq, OtpInputComponent);
9014
9014
  break;
9015
9015
  }
@@ -9052,7 +9052,6 @@ class SectionFormItemComponent extends ConfigComponent {
9052
9052
  this.createDynamicComponent(seq, TextareaInputComponent);
9053
9053
  break;
9054
9054
  }
9055
- case InputType.MULTISELECT:
9056
9055
  case InputType.DROPDOWN: {
9057
9056
  const { DropdownInputComponent } = await Promise.resolve().then(function () { return dropdown; });
9058
9057
  this.createDynamicComponent(seq, DropdownInputComponent, [
@@ -9061,6 +9060,14 @@ class SectionFormItemComponent extends ConfigComponent {
9061
9060
  ]);
9062
9061
  break;
9063
9062
  }
9063
+ case InputType.MULTISELECT: {
9064
+ const { MultiselectInputComponent } = await Promise.resolve().then(function () { return multiselect; });
9065
+ this.createDynamicComponent(seq, MultiselectInputComponent, [
9066
+ inputBinding('options', this.options),
9067
+ inputBinding('dir', this.dir),
9068
+ ]);
9069
+ break;
9070
+ }
9064
9071
  case InputType.COLOR: {
9065
9072
  const { ColorPickerInputComponent } = await Promise.resolve().then(function () { return colorPicker; });
9066
9073
  this.createDynamicComponent(seq, ColorPickerInputComponent);
@@ -9591,10 +9598,17 @@ class SectionFormComponent extends ConfigComponent {
9591
9598
  injector = inject(Injector);
9592
9599
  previousValue = null;
9593
9600
  previousData = undefined;
9601
+ previousReleased = [];
9594
9602
  // Names announced by projected items (content projection has no template
9595
9603
  // `(fieldKey)` hook). Merged with `config.inputs` so the FieldTree always
9596
9604
  // has a slot for every rendered field.
9597
9605
  registeredFields = signal([], ...(ngDevMode ? [{ debugName: "registeredFields" }] : /* istanbul ignore next */ []));
9606
+ // Keys whose item was rendered and has since left — hidden behind an `@if`
9607
+ // or removed. Absent rather than empty: stripped from what `dataChange` and a
9608
+ // submit hand over. A key no item ever registered is never here, so one the
9609
+ // caller's `data` carries without a Field (an `id`) still survives the round
9610
+ // trip.
9611
+ releasedFields = signal([], ...(ngDevMode ? [{ debugName: "releasedFields" }] : /* istanbul ignore next */ []));
9598
9612
  // Keys whose item carries `required` — the tag's word, which has to become
9599
9613
  // the FieldTree's word too. Kept apart from `registeredFields` because a key
9600
9614
  // is announced once and its required flag can flip whenever the Field's
@@ -9613,6 +9627,9 @@ class SectionFormComponent extends ConfigComponent {
9613
9627
  if (!this.registeredFields().includes(name)) {
9614
9628
  this.registeredFields.update((fields) => [...fields, name]);
9615
9629
  }
9630
+ if (this.releasedFields().includes(name)) {
9631
+ this.releasedFields.update((fields) => fields.filter((field) => field !== name));
9632
+ }
9616
9633
  this.setRequired(name, required);
9617
9634
  this.setPatterns(name, patterns);
9618
9635
  });
@@ -9623,8 +9640,17 @@ class SectionFormComponent extends ConfigComponent {
9623
9640
  untracked(() => {
9624
9641
  this.setRequired(name, false);
9625
9642
  this.setPatterns(name, undefined);
9643
+ if (!this.releasedFields().includes(name)) {
9644
+ this.releasedFields.update((fields) => [...fields, name]);
9645
+ }
9626
9646
  });
9627
9647
  };
9648
+ withoutReleased = (record) => {
9649
+ const released = this.releasedFields();
9650
+ if (!released.length)
9651
+ return record;
9652
+ return Object.fromEntries(Object.entries(record).filter(([key]) => !released.includes(key)));
9653
+ };
9628
9654
  setRequired = (name, required) => {
9629
9655
  const has = this.requiredFields().includes(name);
9630
9656
  if (has === required)
@@ -9716,8 +9742,9 @@ class SectionFormComponent extends ConfigComponent {
9716
9742
  // values, so keys no item renders survive the round trip.
9717
9743
  // The spread is a `T` by the same claim the caller made when it bound `data`:
9718
9744
  // the FieldTree is keyed by the names the Fields registered, which are `T`'s
9719
- // keys, and the keys no item renders come off `data` itself.
9720
- submitData = () => ({
9745
+ // keys, and the keys no item renders come off `data` itself. A released key
9746
+ // is the exception — its Field left, so its key does too.
9747
+ submitData = () => this.withoutReleased({
9721
9748
  ...this.data(),
9722
9749
  ...(this.formGroup()?.().value() ?? {}),
9723
9750
  });
@@ -9819,11 +9846,18 @@ class SectionFormComponent extends ConfigComponent {
9819
9846
  // one, and run in creation order) see the move as suppressed.
9820
9847
  this.dataVersion.update((version) => version + 1);
9821
9848
  }
9822
- if (isUserEdit(this.previousValue, value, dataChanged)) {
9823
- this.dataChange.emit({ ...data, ...value });
9849
+ // A Field leaving is a change to the value as well: whatever hid it was
9850
+ // a caller reacting to an edit, and the key has to leave what the caller
9851
+ // holds. Read here rather than emitted from `releaseField`, so a form
9852
+ // torn down with its items emits nothing — its effect is gone first.
9853
+ const released = this.releasedFields();
9854
+ const left = released.some((name) => !this.previousReleased.includes(name));
9855
+ if (isUserEdit(this.previousValue, value, dataChanged) || left) {
9856
+ this.dataChange.emit(this.withoutReleased({ ...data, ...value }));
9824
9857
  }
9825
9858
  this.previousValue = value;
9826
9859
  this.previousData = data;
9860
+ this.previousReleased = released;
9827
9861
  });
9828
9862
  // A form on a visual editor's Canvas is a picture of a form: it is rebuilt
9829
9863
  // on every config edit, and taking the caret each time would leave the
@@ -9899,7 +9933,7 @@ class SectionFormComponent extends ConfigComponent {
9899
9933
  this.rebuild();
9900
9934
  };
9901
9935
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SectionFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
9902
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.9", type: SectionFormComponent, isStandalone: true, selector: "m-section-form, m-one-section-form", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, maxWidth: { classPropertyName: "maxWidth", publicName: "maxWidth", isSignal: true, isRequired: false, transformFunction: null }, heightMode: { classPropertyName: "heightMode", publicName: "heightMode", isSignal: true, isRequired: false, transformFunction: null }, maxHeight: { classPropertyName: "maxHeight", publicName: "maxHeight", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, padding: { classPropertyName: "padding", publicName: "padding", isSignal: true, isRequired: false, transformFunction: null }, paddingX: { classPropertyName: "paddingX", publicName: "paddingX", isSignal: true, isRequired: false, transformFunction: null }, paddingY: { classPropertyName: "paddingY", publicName: "paddingY", isSignal: true, isRequired: false, transformFunction: null }, margin: { classPropertyName: "margin", publicName: "margin", isSignal: true, isRequired: false, transformFunction: null }, marginX: { classPropertyName: "marginX", publicName: "marginX", isSignal: true, isRequired: false, transformFunction: null }, marginY: { classPropertyName: "marginY", publicName: "marginY", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, autofocus: { classPropertyName: "autofocus", publicName: "autofocus", isSignal: true, isRequired: false, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, validation: { classPropertyName: "validation", publicName: "validation", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, fieldConfigs: { classPropertyName: "fieldConfigs", publicName: "fieldConfigs", isSignal: true, isRequired: false, transformFunction: null }, fieldRenderIds: { classPropertyName: "fieldRenderIds", publicName: "fieldRenderIds", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { dataChange: "dataChange", submitted: "submitted", formInitialized: "formInitialized" }, host: { properties: { "class.is-full-height": "isFullHeight()", "class.has-max-height": "!!cssMaxHeight()", "class.no-border": "resolvedVariant() === \"noBorder\"", "class.is-with-border": "resolvedVariant() === \"withBorder\"", "class.is-sandwich-border": "resolvedVariant() === \"sandwichBorder\"", "class.align-left": "resolvedAlign() === \"left\"", "class.align-right": "resolvedAlign() === \"right\"", "class.align-center": "resolvedAlign() === \"center\"", "style.font-size": "sizeLength()", "style.--input-size": "sizeLength()", "style.--m-section-align": "resolvedAlign()", "style.--m-section-max-width": "resolvedMaxWidth()", "style.--m-section-max-height": "cssMaxHeight()", "style.min-height": "resolvedMinHeight()", "style.min-width": "resolvedMinWidth()", "style.max-height": "resolvedMaxHeight()", "style.max-width": "resolvedMaxWidth()", "style.padding-inline": "resolvedPaddingInline()", "style.padding-block": "resolvedPaddingBlock()", "style.--m-section-form-margin-inline": "resolvedMarginInline()", "style.margin-block": "resolvedMarginBlock()" }, classAttribute: "m-section-form" }, providers: [
9936
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.9", type: SectionFormComponent, isStandalone: true, selector: "m-section-form, m-one-section-form", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, maxWidth: { classPropertyName: "maxWidth", publicName: "maxWidth", isSignal: true, isRequired: false, transformFunction: null }, heightMode: { classPropertyName: "heightMode", publicName: "heightMode", isSignal: true, isRequired: false, transformFunction: null }, maxHeight: { classPropertyName: "maxHeight", publicName: "maxHeight", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, padding: { classPropertyName: "padding", publicName: "padding", isSignal: true, isRequired: false, transformFunction: null }, paddingX: { classPropertyName: "paddingX", publicName: "paddingX", isSignal: true, isRequired: false, transformFunction: null }, paddingY: { classPropertyName: "paddingY", publicName: "paddingY", isSignal: true, isRequired: false, transformFunction: null }, margin: { classPropertyName: "margin", publicName: "margin", isSignal: true, isRequired: false, transformFunction: null }, marginX: { classPropertyName: "marginX", publicName: "marginX", isSignal: true, isRequired: false, transformFunction: null }, marginY: { classPropertyName: "marginY", publicName: "marginY", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, autofocus: { classPropertyName: "autofocus", publicName: "autofocus", isSignal: true, isRequired: false, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, validation: { classPropertyName: "validation", publicName: "validation", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, fieldConfigs: { classPropertyName: "fieldConfigs", publicName: "fieldConfigs", isSignal: true, isRequired: false, transformFunction: null }, fieldRenderIds: { classPropertyName: "fieldRenderIds", publicName: "fieldRenderIds", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { dataChange: "dataChange", submitted: "submitted", formInitialized: "formInitialized" }, host: { properties: { "class.is-full-height": "isFullHeight()", "class.has-max-height": "!!cssMaxHeight()", "class.no-border": "resolvedVariant() === \"noBorder\"", "class.is-with-border": "resolvedVariant() === \"withBorder\"", "class.is-sandwich-border": "resolvedVariant() === \"sandwichBorder\"", "class.is-side-border": "resolvedVariant() === \"sideBorder\"", "class.is-left-border": "resolvedVariant() === \"leftBorder\"", "class.is-right-border": "resolvedVariant() === \"rightBorder\"", "class.align-left": "resolvedAlign() === \"left\"", "class.align-right": "resolvedAlign() === \"right\"", "class.align-center": "resolvedAlign() === \"center\"", "style.font-size": "sizeLength()", "style.--input-size": "sizeLength()", "style.--m-section-align": "resolvedAlign()", "style.--m-section-max-width": "resolvedMaxWidth()", "style.--m-section-max-height": "cssMaxHeight()", "style.min-height": "resolvedMinHeight()", "style.min-width": "resolvedMinWidth()", "style.max-height": "resolvedMaxHeight()", "style.max-width": "resolvedMaxWidth()", "style.padding-inline": "resolvedPaddingInline()", "style.padding-block": "resolvedPaddingBlock()", "style.--m-section-form-margin-inline": "resolvedMarginInline()", "style.margin-block": "resolvedMarginBlock()" }, classAttribute: "m-section-form" }, providers: [
9903
9937
  // Full width, so an `mMargin` narrows it the way its own margin does
9904
9938
  // rather than pushing it past its container (SPACING_INWARD).
9905
9939
  { provide: SPACING_INWARD, useValue: { margin: true } },
@@ -9925,7 +9959,7 @@ class SectionFormComponent extends ConfigComponent {
9925
9959
  <form class="section-form" novalidate (submit)="handleSubmit($event)">
9926
9960
  <ng-content />
9927
9961
  </form>
9928
- `, isInline: true, styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}:host{display:block;width:calc(100% - 2 * var(--m-section-form-margin-inline, var(--m-margin-inline, 0px)));margin-inline:var(--m-section-form-margin-inline, var(--m-margin-inline, 0px));box-sizing:border-box;min-height:5em;container-type:inline-size;container-name:mag-grid;--_section-px: 1rem;--_section-pt: 1.5rem;--_section-pb: 0rem}:host(.has-max-height){height:var(--m-section-max-height);overflow:auto}:host(.is-with-border){border:var(--m-section-border, 1px solid var(--m-backdrop-border));box-sizing:border-box}:host(.is-sandwich-border){border-block:var(--m-section-border, 1px solid var(--m-backdrop-border));box-sizing:border-box}.section-form{margin:0;display:flex;flex-direction:row;flex-wrap:wrap;gap:var(--m-form-group-content-gap, 1.5rem 1.25rem);width:100%}.section-form>*{flex:1 1 100%;min-width:0}.section-form>.col-1{flex:1 1 calc(1 * (100% + 1.25rem) / 12 - 1.25rem)}.section-form>.col-2{flex:2 1 calc(2 * (100% + 1.25rem) / 12 - 1.25rem)}.section-form>.col-3{flex:3 1 calc(.25*(100% + 1.25rem) - 1.25rem)}.section-form>.col-4{flex:4 1 calc(4 * (100% + 1.25rem) / 12 - 1.25rem)}.section-form>.col-5{flex:5 1 calc(5 * (100% + 1.25rem) / 12 - 1.25rem)}.section-form>.col-6{flex:6 1 calc(.5*(100% + 1.25rem) - 1.25rem)}.section-form>.col-7{flex:7 1 calc(7 * (100% + 1.25rem) / 12 - 1.25rem)}.section-form>.col-8{flex:8 1 calc(8 * (100% + 1.25rem) / 12 - 1.25rem)}.section-form>.col-9{flex:9 1 calc(.75*(100% + 1.25rem) - 1.25rem)}.section-form>.col-10{flex:10 1 calc(10 * (100% + 1.25rem) / 12 - 1.25rem)}.section-form>.col-11{flex:11 1 calc(11 * (100% + 1.25rem) / 12 - 1.25rem)}.section-form>.col-12{flex:12 1 calc(1*(100% + 1.25rem) - 1.25rem)}@media(max-width:480px){.section-form>*{flex-basis:100%}}:host(.align-left) .section-form{margin-inline-start:0;margin-inline-end:auto;justify-content:flex-start}:host(.align-right) .section-form{margin-inline-start:auto;margin-inline-end:0;justify-content:flex-end}:host(.align-center) .section-form{margin-inline:auto;justify-content:center}:host(.is-full-height){height:100vh;min-height:100vh;overflow:auto}:host(.is-full-height) .section-form{flex:1;height:100%}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
9962
+ `, isInline: true, styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}:host{display:block;width:calc(100% - 2 * var(--m-section-form-margin-inline, var(--m-margin-inline, 0px)));margin-inline:var(--m-section-form-margin-inline, var(--m-margin-inline, 0px));box-sizing:border-box;min-height:5em;container-type:inline-size;container-name:mag-grid;--_section-px: 1rem;--_section-pt: 1.5rem;--_section-pb: 0rem}:host(.has-max-height){height:var(--m-section-max-height);overflow:auto}:host(.is-with-border){border:var(--m-section-border, 1px solid var(--m-backdrop-border));box-sizing:border-box}:host(.is-sandwich-border){border-block:var(--m-section-border, 1px solid var(--m-backdrop-border));box-sizing:border-box}:host(.is-side-border){border-inline:var(--m-section-border, 1px solid var(--m-backdrop-border));box-sizing:border-box}:host(.is-left-border){border-inline-start:var(--m-section-border, 1px solid var(--m-backdrop-border));box-sizing:border-box}:host(.is-right-border){border-inline-end:var(--m-section-border, 1px solid var(--m-backdrop-border));box-sizing:border-box}.section-form{margin:0;display:flex;flex-direction:row;flex-wrap:wrap;gap:var(--m-form-group-content-gap, 1.5rem 1.25rem);width:100%}.section-form>*{flex:1 1 100%;min-width:0}.section-form>.col-1{flex:1 1 calc(1 * (100% + 1.25rem) / 12 - 1.25rem)}.section-form>.col-2{flex:2 1 calc(2 * (100% + 1.25rem) / 12 - 1.25rem)}.section-form>.col-3{flex:3 1 calc(.25*(100% + 1.25rem) - 1.25rem)}.section-form>.col-4{flex:4 1 calc(4 * (100% + 1.25rem) / 12 - 1.25rem)}.section-form>.col-5{flex:5 1 calc(5 * (100% + 1.25rem) / 12 - 1.25rem)}.section-form>.col-6{flex:6 1 calc(.5*(100% + 1.25rem) - 1.25rem)}.section-form>.col-7{flex:7 1 calc(7 * (100% + 1.25rem) / 12 - 1.25rem)}.section-form>.col-8{flex:8 1 calc(8 * (100% + 1.25rem) / 12 - 1.25rem)}.section-form>.col-9{flex:9 1 calc(.75*(100% + 1.25rem) - 1.25rem)}.section-form>.col-10{flex:10 1 calc(10 * (100% + 1.25rem) / 12 - 1.25rem)}.section-form>.col-11{flex:11 1 calc(11 * (100% + 1.25rem) / 12 - 1.25rem)}.section-form>.col-12{flex:12 1 calc(1*(100% + 1.25rem) - 1.25rem)}@media(max-width:480px){.section-form>*{flex-basis:100%}}:host(.align-left) .section-form{margin-inline-start:0;margin-inline-end:auto;justify-content:flex-start}:host(.align-right) .section-form{margin-inline-start:auto;margin-inline-end:0;justify-content:flex-end}:host(.align-center) .section-form{margin-inline:auto;justify-content:center}:host(.is-full-height){height:100vh;min-height:100vh;overflow:auto}:host(.is-full-height) .section-form{flex:1;height:100%}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
9929
9963
  }
9930
9964
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SectionFormComponent, decorators: [{
9931
9965
  type: Component,
@@ -9940,6 +9974,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
9940
9974
  '[class.no-border]': 'resolvedVariant() === "noBorder"',
9941
9975
  '[class.is-with-border]': 'resolvedVariant() === "withBorder"',
9942
9976
  '[class.is-sandwich-border]': 'resolvedVariant() === "sandwichBorder"',
9977
+ '[class.is-side-border]': 'resolvedVariant() === "sideBorder"',
9978
+ '[class.is-left-border]': 'resolvedVariant() === "leftBorder"',
9979
+ '[class.is-right-border]': 'resolvedVariant() === "rightBorder"',
9943
9980
  '[class.align-left]': 'resolvedAlign() === "left"',
9944
9981
  '[class.align-right]': 'resolvedAlign() === "right"',
9945
9982
  '[class.align-center]': 'resolvedAlign() === "center"',
@@ -9981,7 +10018,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
9981
10018
  };
9982
10019
  },
9983
10020
  },
9984
- ], 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:calc(100% - 2 * var(--m-section-form-margin-inline, var(--m-margin-inline, 0px)));margin-inline:var(--m-section-form-margin-inline, var(--m-margin-inline, 0px));box-sizing:border-box;min-height:5em;container-type:inline-size;container-name:mag-grid;--_section-px: 1rem;--_section-pt: 1.5rem;--_section-pb: 0rem}:host(.has-max-height){height:var(--m-section-max-height);overflow:auto}:host(.is-with-border){border:var(--m-section-border, 1px solid var(--m-backdrop-border));box-sizing:border-box}:host(.is-sandwich-border){border-block:var(--m-section-border, 1px solid var(--m-backdrop-border));box-sizing:border-box}.section-form{margin:0;display:flex;flex-direction:row;flex-wrap:wrap;gap:var(--m-form-group-content-gap, 1.5rem 1.25rem);width:100%}.section-form>*{flex:1 1 100%;min-width:0}.section-form>.col-1{flex:1 1 calc(1 * (100% + 1.25rem) / 12 - 1.25rem)}.section-form>.col-2{flex:2 1 calc(2 * (100% + 1.25rem) / 12 - 1.25rem)}.section-form>.col-3{flex:3 1 calc(.25*(100% + 1.25rem) - 1.25rem)}.section-form>.col-4{flex:4 1 calc(4 * (100% + 1.25rem) / 12 - 1.25rem)}.section-form>.col-5{flex:5 1 calc(5 * (100% + 1.25rem) / 12 - 1.25rem)}.section-form>.col-6{flex:6 1 calc(.5*(100% + 1.25rem) - 1.25rem)}.section-form>.col-7{flex:7 1 calc(7 * (100% + 1.25rem) / 12 - 1.25rem)}.section-form>.col-8{flex:8 1 calc(8 * (100% + 1.25rem) / 12 - 1.25rem)}.section-form>.col-9{flex:9 1 calc(.75*(100% + 1.25rem) - 1.25rem)}.section-form>.col-10{flex:10 1 calc(10 * (100% + 1.25rem) / 12 - 1.25rem)}.section-form>.col-11{flex:11 1 calc(11 * (100% + 1.25rem) / 12 - 1.25rem)}.section-form>.col-12{flex:12 1 calc(1*(100% + 1.25rem) - 1.25rem)}@media(max-width:480px){.section-form>*{flex-basis:100%}}:host(.align-left) .section-form{margin-inline-start:0;margin-inline-end:auto;justify-content:flex-start}:host(.align-right) .section-form{margin-inline-start:auto;margin-inline-end:0;justify-content:flex-end}:host(.align-center) .section-form{margin-inline:auto;justify-content:center}:host(.is-full-height){height:100vh;min-height:100vh;overflow:auto}:host(.is-full-height) .section-form{flex:1;height:100%}\n"] }]
10021
+ ], 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:calc(100% - 2 * var(--m-section-form-margin-inline, var(--m-margin-inline, 0px)));margin-inline:var(--m-section-form-margin-inline, var(--m-margin-inline, 0px));box-sizing:border-box;min-height:5em;container-type:inline-size;container-name:mag-grid;--_section-px: 1rem;--_section-pt: 1.5rem;--_section-pb: 0rem}:host(.has-max-height){height:var(--m-section-max-height);overflow:auto}:host(.is-with-border){border:var(--m-section-border, 1px solid var(--m-backdrop-border));box-sizing:border-box}:host(.is-sandwich-border){border-block:var(--m-section-border, 1px solid var(--m-backdrop-border));box-sizing:border-box}:host(.is-side-border){border-inline:var(--m-section-border, 1px solid var(--m-backdrop-border));box-sizing:border-box}:host(.is-left-border){border-inline-start:var(--m-section-border, 1px solid var(--m-backdrop-border));box-sizing:border-box}:host(.is-right-border){border-inline-end:var(--m-section-border, 1px solid var(--m-backdrop-border));box-sizing:border-box}.section-form{margin:0;display:flex;flex-direction:row;flex-wrap:wrap;gap:var(--m-form-group-content-gap, 1.5rem 1.25rem);width:100%}.section-form>*{flex:1 1 100%;min-width:0}.section-form>.col-1{flex:1 1 calc(1 * (100% + 1.25rem) / 12 - 1.25rem)}.section-form>.col-2{flex:2 1 calc(2 * (100% + 1.25rem) / 12 - 1.25rem)}.section-form>.col-3{flex:3 1 calc(.25*(100% + 1.25rem) - 1.25rem)}.section-form>.col-4{flex:4 1 calc(4 * (100% + 1.25rem) / 12 - 1.25rem)}.section-form>.col-5{flex:5 1 calc(5 * (100% + 1.25rem) / 12 - 1.25rem)}.section-form>.col-6{flex:6 1 calc(.5*(100% + 1.25rem) - 1.25rem)}.section-form>.col-7{flex:7 1 calc(7 * (100% + 1.25rem) / 12 - 1.25rem)}.section-form>.col-8{flex:8 1 calc(8 * (100% + 1.25rem) / 12 - 1.25rem)}.section-form>.col-9{flex:9 1 calc(.75*(100% + 1.25rem) - 1.25rem)}.section-form>.col-10{flex:10 1 calc(10 * (100% + 1.25rem) / 12 - 1.25rem)}.section-form>.col-11{flex:11 1 calc(11 * (100% + 1.25rem) / 12 - 1.25rem)}.section-form>.col-12{flex:12 1 calc(1*(100% + 1.25rem) - 1.25rem)}@media(max-width:480px){.section-form>*{flex-basis:100%}}:host(.align-left) .section-form{margin-inline-start:0;margin-inline-end:auto;justify-content:flex-start}:host(.align-right) .section-form{margin-inline-start:auto;margin-inline-end:0;justify-content:flex-end}:host(.align-center) .section-form{margin-inline:auto;justify-content:center}:host(.is-full-height){height:100vh;min-height:100vh;overflow:auto}:host(.is-full-height) .section-form{flex:1;height:100%}\n"] }]
9985
10022
  }], ctorParameters: () => [], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], maxWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxWidth", required: false }] }], heightMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "heightMode", required: false }] }], maxHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxHeight", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], align: [{ type: i0.Input, args: [{ isSignal: true, alias: "align", required: false }] }], padding: [{ type: i0.Input, args: [{ isSignal: true, alias: "padding", required: false }] }], paddingX: [{ type: i0.Input, args: [{ isSignal: true, alias: "paddingX", required: false }] }], paddingY: [{ type: i0.Input, args: [{ isSignal: true, alias: "paddingY", required: false }] }], margin: [{ type: i0.Input, args: [{ isSignal: true, alias: "margin", required: false }] }], marginX: [{ type: i0.Input, args: [{ isSignal: true, alias: "marginX", required: false }] }], marginY: [{ type: i0.Input, args: [{ isSignal: true, alias: "marginY", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], autofocus: [{ type: i0.Input, args: [{ isSignal: true, alias: "autofocus", required: false }] }], data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], dataChange: [{ type: i0.Output, args: ["dataChange"] }], submitted: [{ type: i0.Output, args: ["submitted"] }], formInitialized: [{ type: i0.Output, args: ["formInitialized"] }], validation: [{ type: i0.Input, args: [{ isSignal: true, alias: "validation", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], fieldConfigs: [{ type: i0.Input, args: [{ isSignal: true, alias: "fieldConfigs", required: false }] }], fieldRenderIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "fieldRenderIds", required: false }] }] } });
9986
10023
 
9987
10024
  // '' and null are an unset, not a length — a config asset drops a cleared
@@ -10132,6 +10169,113 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
10132
10169
  ], styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}m-section-button-group{display:flex;flex-wrap:wrap;align-items:center;box-sizing:border-box;--m-button-size: var(--input-size, 1em);gap:calc(var(--input-size, 1em) * .375)}m-section-button-group.is-design-mode{min-width:4em;min-height:4em}m-section-button-group.vertical{flex-direction:column}m-section-button-group.vertical.align-left{align-items:flex-start}m-section-button-group.vertical.align-center{align-items:center}m-section-button-group.vertical.align-right{align-items:flex-end}m-section-button-group.horizontal{flex-direction:row}m-section-button-group.align-left{justify-content:flex-start}m-section-button-group.align-center{justify-content:center}m-section-button-group.align-right{justify-content:flex-end}m-section-button-group.is-full-width{width:100%}m-section-button-group.is-full-width.horizontal>*{flex:1 1 0;min-width:0}m-section-button-group.is-full-width.vertical{align-items:stretch}m-section-button-group.is-joined{gap:0;flex-wrap:nowrap}m-section-button-group.is-joined>*{position:relative}m-section-button-group.is-joined>* button{border-radius:0!important}m-section-button-group.is-joined>*:hover,m-section-button-group.is-joined>*:focus-within{z-index:1}m-section-button-group.is-joined.horizontal>*+*{margin-left:-2px}m-section-button-group.is-joined.horizontal>*:first-child button{border-top-left-radius:4px!important;border-bottom-left-radius:4px!important}m-section-button-group.is-joined.horizontal>*:last-child button{border-top-right-radius:4px!important;border-bottom-right-radius:4px!important}m-section-button-group.is-joined.vertical{align-items:stretch}m-section-button-group.is-joined.vertical>*+*{margin-top:-2px}m-section-button-group.is-joined.vertical>*:first-child button{border-top-left-radius:4px!important;border-top-right-radius:4px!important}m-section-button-group.is-joined.vertical>*:last-child button{border-bottom-left-radius:4px!important;border-bottom-right-radius:4px!important}\n"] }]
10133
10170
  }], propDecorators: { vertical: [{ type: i0.Input, args: [{ isSignal: true, alias: "vertical", required: false }] }], align: [{ type: i0.Input, args: [{ isSignal: true, alias: "align", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], fullWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "fullWidth", required: false }] }] } });
10134
10171
 
10172
+ const SECTION_CONTEXT = new InjectionToken('SECTION_CONTEXT');
10173
+
10174
+ const BACK_BTN = {
10175
+ icon: 'chevron-left',
10176
+ iconOnly: true,
10177
+ variant: 'ghost',
10178
+ };
10179
+ class SectionBackComponent {
10180
+ back = input(false, ...(ngDevMode ? [{ debugName: "back" }] : /* istanbul ignore next */ []));
10181
+ label = input(...(ngDevMode ? [undefined, { debugName: "label" }] : /* istanbul ignore next */ []));
10182
+ html = input(...(ngDevMode ? [undefined, { debugName: "html" }] : /* istanbul ignore next */ []));
10183
+ padding = input(false, ...(ngDevMode ? [{ debugName: "padding" }] : /* istanbul ignore next */ []));
10184
+ paddingX = input(false, ...(ngDevMode ? [{ debugName: "paddingX" }] : /* istanbul ignore next */ []));
10185
+ paddingY = input(false, ...(ngDevMode ? [{ debugName: "paddingY" }] : /* istanbul ignore next */ []));
10186
+ navigate = output();
10187
+ backBtn = BACK_BTN;
10188
+ sectionContext = inject(SECTION_CONTEXT, { optional: true });
10189
+ sidepanel = computed(() => this.sectionContext?.sidepanel() ?? false, ...(ngDevMode ? [{ debugName: "sidepanel" }] : /* istanbul ignore next */ []));
10190
+ noBorder = computed(() => this.sectionContext?.variant() === 'noBorder', ...(ngDevMode ? [{ debugName: "noBorder" }] : /* istanbul ignore next */ []));
10191
+ contentRef = viewChild('content', ...(ngDevMode ? [{ debugName: "contentRef" }] : /* istanbul ignore next */ []));
10192
+ hasContent = signal(false, ...(ngDevMode ? [{ debugName: "hasContent" }] : /* istanbul ignore next */ []));
10193
+ constructor() {
10194
+ effect(() => {
10195
+ const el = this.contentRef()?.nativeElement;
10196
+ if (el)
10197
+ this.hasContent.set(el.childNodes.length > 0);
10198
+ });
10199
+ }
10200
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SectionBackComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10201
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: SectionBackComponent, isStandalone: true, selector: "m-section-back", inputs: { back: { classPropertyName: "back", publicName: "back", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, html: { classPropertyName: "html", publicName: "html", isSignal: true, isRequired: false, transformFunction: null }, padding: { classPropertyName: "padding", publicName: "padding", isSignal: true, isRequired: false, transformFunction: null }, paddingX: { classPropertyName: "paddingX", publicName: "paddingX", isSignal: true, isRequired: false, transformFunction: null }, paddingY: { classPropertyName: "paddingY", publicName: "paddingY", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { navigate: "navigate" }, host: { properties: { "class.has-sidepanel": "sidepanel()", "class.has-padding-x": "padding() || paddingX()", "class.has-padding-y": "padding() || paddingY()", "class.no-border": "noBorder()" }, classAttribute: "m-section-back" }, viewQueries: [{ propertyName: "contentRef", first: true, predicate: ["content"], descendants: true, isSignal: true }], ngImport: i0, template: `
10202
+ @if (back()) {
10203
+ <m-button [config]="backBtn" (clicked)="navigate.emit()" />
10204
+ } @else {
10205
+ <m-icon icon="logo" color="mm" />
10206
+ }
10207
+ <span #content><ng-content /></span>
10208
+ @if (!hasContent()) {
10209
+ @if (html()) {
10210
+ <m-header [level]="3" [innerHTML]="html()" />
10211
+ } @else {
10212
+ <m-header [level]="3" [label]="label() ?? 'magmonium'" />
10213
+ }
10214
+ }
10215
+ `, isInline: true, styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}:host{display:flex;align-items:center;gap:.25rem;min-height:var(--section-header-min-height, calc(var(--section-header-py, .5rem) * 2 + 1.25rem));border-bottom:1px solid var(--m-backdrop-border);width:100%;grid-column:1/-1;--section-back-size: .7rem;--section-back-seat: calc(var(--section-back-size) * 2.25)}:host(.no-border){border-bottom:none}m-button,m-icon{flex-shrink:0}m-button{--m-button-size: var(--section-back-size)}m-icon{display:inline-flex;justify-content:center;width:var(--section-back-seat)}m-logo{flex-shrink:0;width:1.5rem;height:1.5rem}m-header{flex:1;min-width:0}:host>span{display:contents}:host.has-padding-x{padding-inline:var(--section-px, 1rem)}:host.has-padding-y{padding-block:var(--section-header-py, .85rem)}\n"], dependencies: [{ kind: "component", type: IconComponent, selector: "m-icon, m-one-icon", inputs: ["config", "name", "color", "size", "one", "baseUrl", "remote"], outputs: ["configChange"] }, { kind: "component", type: ButtonComponent, selector: "m-button,m-one-button", inputs: ["config", "color", "labelClass", "fullWidth", "nav", "navParams", "href", "disabled", "variant", "name", "baseUrl", "one", "remote", "label", "noTranslate", "params", "noNative", "icon", "isRightIcon", "iconOnly", "stacked", "imgSrc", "nonClickable", "inverted", "isSubmit", "tabindex"], outputs: ["configChange", "clicked"] }, { kind: "component", type: HeaderComponent$1, selector: "m-header", inputs: ["level", "label", "icon", "actionButton", "actionLabel", "noTranslate", "params"], outputs: ["actionClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
10216
+ }
10217
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SectionBackComponent, decorators: [{
10218
+ type: Component,
10219
+ args: [{ selector: 'm-section-back', template: `
10220
+ @if (back()) {
10221
+ <m-button [config]="backBtn" (clicked)="navigate.emit()" />
10222
+ } @else {
10223
+ <m-icon icon="logo" color="mm" />
10224
+ }
10225
+ <span #content><ng-content /></span>
10226
+ @if (!hasContent()) {
10227
+ @if (html()) {
10228
+ <m-header [level]="3" [innerHTML]="html()" />
10229
+ } @else {
10230
+ <m-header [level]="3" [label]="label() ?? 'magmonium'" />
10231
+ }
10232
+ }
10233
+ `, imports: [IconComponent, ButtonComponent, HeaderComponent$1], changeDetection: ChangeDetectionStrategy.OnPush, host: {
10234
+ class: 'm-section-back',
10235
+ '[class.has-sidepanel]': 'sidepanel()',
10236
+ '[class.has-padding-x]': 'padding() || paddingX()',
10237
+ '[class.has-padding-y]': 'padding() || paddingY()',
10238
+ '[class.no-border]': 'noBorder()',
10239
+ }, styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}:host{display:flex;align-items:center;gap:.25rem;min-height:var(--section-header-min-height, calc(var(--section-header-py, .5rem) * 2 + 1.25rem));border-bottom:1px solid var(--m-backdrop-border);width:100%;grid-column:1/-1;--section-back-size: .7rem;--section-back-seat: calc(var(--section-back-size) * 2.25)}:host(.no-border){border-bottom:none}m-button,m-icon{flex-shrink:0}m-button{--m-button-size: var(--section-back-size)}m-icon{display:inline-flex;justify-content:center;width:var(--section-back-seat)}m-logo{flex-shrink:0;width:1.5rem;height:1.5rem}m-header{flex:1;min-width:0}:host>span{display:contents}:host.has-padding-x{padding-inline:var(--section-px, 1rem)}:host.has-padding-y{padding-block:var(--section-header-py, .85rem)}\n"] }]
10240
+ }], ctorParameters: () => [], propDecorators: { back: [{ type: i0.Input, args: [{ isSignal: true, alias: "back", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], html: [{ type: i0.Input, args: [{ isSignal: true, alias: "html", required: false }] }], padding: [{ type: i0.Input, args: [{ isSignal: true, alias: "padding", required: false }] }], paddingX: [{ type: i0.Input, args: [{ isSignal: true, alias: "paddingX", required: false }] }], paddingY: [{ type: i0.Input, args: [{ isSignal: true, alias: "paddingY", required: false }] }], navigate: [{ type: i0.Output, args: ["navigate"] }], contentRef: [{ type: i0.ViewChild, args: ['content', { isSignal: true }] }] } });
10241
+
10242
+ /**
10243
+ * Merges multiple arrays and removes duplicates
10244
+ * @param arrays - Arrays to merge
10245
+ * @returns Merged array with unique values
10246
+ */
10247
+ function mergeUnique(...arrays) {
10248
+ return [...new Set(arrays.flat())];
10249
+ }
10250
+ /**
10251
+ * Merges arrays of objects and removes duplicates by key
10252
+ * @param arrays - Arrays to merge
10253
+ * @param key - Property to use for uniqueness check
10254
+ * @returns Merged array with unique objects
10255
+ */
10256
+ function mergeUniqueBy(arrays, key) {
10257
+ const map = new Map();
10258
+ arrays.flat().forEach((item) => {
10259
+ if (!map.has(item[key])) {
10260
+ map.set(item[key], item);
10261
+ }
10262
+ });
10263
+ return Array.from(map.values());
10264
+ }
10265
+ /**
10266
+ * Merges arrays with custom comparator
10267
+ */
10268
+ function mergeUniqueWith(arrays, compareFn) {
10269
+ const map = new Map();
10270
+ arrays.flat().forEach((item) => {
10271
+ const key = compareFn(item);
10272
+ if (!map.has(key)) {
10273
+ map.set(key, item);
10274
+ }
10275
+ });
10276
+ return Array.from(map.values());
10277
+ }
10278
+
10135
10279
  var Direction;
10136
10280
  (function (Direction) {
10137
10281
  Direction["TOP"] = "top";
@@ -10928,254 +11072,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
10928
11072
  }]
10929
11073
  }], propDecorators: { toggle: [{ type: i0.Input, args: [{ isSignal: true, alias: "toggle", required: false }] }, { type: i0.Output, args: ["toggleChange"] }], remote: [{ type: i0.Input, args: [{ isSignal: true, alias: "remote", required: false }] }], exclude: [{ type: i0.Input, args: [{ isSignal: true, alias: "exclude", required: false }] }], visibilityRule: [{ type: i0.Input, args: [{ isSignal: true, alias: "visibilityRule", required: false }] }], disableRule: [{ type: i0.Input, args: [{ isSignal: true, alias: "disableRule", required: false }] }], extraData: [{ type: i0.Input, args: [{ isSignal: true, alias: "extraData", required: false }] }], inverted: [{ type: i0.Input, args: [{ isSignal: true, alias: "inverted", required: false }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], action: [{ type: i0.Output, args: ["action"] }], selectorDir: [{ type: i0.ViewChild, args: [i0.forwardRef(() => SelectorDirective), { isSignal: true }] }] } });
10930
11074
 
10931
- const SECTION_CONTEXT = new InjectionToken('SECTION_CONTEXT');
10932
-
10933
- // The line box each heading level draws, straight from `header.sass`: its font
10934
- // size and its line-height. The icon beside a heading is boxed to the same
10935
- // span so the two centre on one another — `--m-header-font-size` is read
10936
- // first, so a caller resizing the heading moves the icon's box with it.
10937
- const HEADER_LINE_BOX = {
10938
- 1: 'calc(var(--m-header-font-size, 2.25rem) * 1.15)',
10939
- 2: 'calc(var(--m-header-font-size, 1.75rem) * 1.2)',
10940
- 3: 'calc(var(--m-header-font-size, 1.375rem) * 1.1)',
10941
- 4: 'calc(var(--m-header-font-size, 1.125rem) * 1.1)',
10942
- 5: 'calc(var(--m-header-font-size, 1rem) * 1.1)',
10943
- 6: 'calc(var(--m-header-font-size, 0.875rem) * 1.1)',
10944
- };
10945
- class SectionHeaderComponent {
10946
- sticky = input(false, ...(ngDevMode ? [{ debugName: "sticky" }] : /* istanbul ignore next */ []));
10947
- level = input(3, ...(ngDevMode ? [{ debugName: "level" }] : /* istanbul ignore next */ []));
10948
- label = input(...(ngDevMode ? [undefined, { debugName: "label" }] : /* istanbul ignore next */ []));
10949
- subLabel = input(...(ngDevMode ? [undefined, { debugName: "subLabel" }] : /* istanbul ignore next */ []));
10950
- // `label` and `subLabel` are authored text rather than translation keys —
10951
- // forwarded to `m-header` for the label, and skipping `translate` for the
10952
- // sub. What a bound label needs above all: a value read from data is the
10953
- // text itself, and resolving it as a key renders nothing.
10954
- noTranslate = input(false, ...(ngDevMode ? [{ debugName: "noTranslate" }] : /* istanbul ignore next */ []));
10955
- // The [MessageVariable] values both lines are resolved with — one record for
10956
- // the pair, because a page holds one record for every dynamic slot it draws
10957
- // (m-one-ui ADR 0066) and two headings naming the same slot mean the same
10958
- // datum. Ignored under `noTranslate`, where neither line is looked up.
10959
- params = input(undefined, ...(ngDevMode ? [{ debugName: "params" }] : /* istanbul ignore next */ []));
10960
- // Draw the sub line above the label instead of below it. The two nodes keep
10961
- // their order — title first, sub second — whichever way the pair reads, so
10962
- // reversing is a setting rather than a second way to arrange the children.
10963
- reverse = input(false, ...(ngDevMode ? [{ debugName: "reverse" }] : /* istanbul ignore next */ []));
10964
- icon = input(...(ngDevMode ? [undefined, { debugName: "icon" }] : /* istanbul ignore next */ []));
10965
- menu = input(...(ngDevMode ? [undefined, { debugName: "menu" }] : /* istanbul ignore next */ []));
10966
- menuName = input(...(ngDevMode ? [undefined, { debugName: "menuName" }] : /* istanbul ignore next */ []));
10967
- visibilityRule = input(...(ngDevMode ? [undefined, { debugName: "visibilityRule" }] : /* istanbul ignore next */ []));
10968
- disableRule = input(...(ngDevMode ? [undefined, { debugName: "disableRule" }] : /* istanbul ignore next */ []));
10969
- extraData = input(...(ngDevMode ? [undefined, { debugName: "extraData" }] : /* istanbul ignore next */ []));
10970
- align = input(undefined, ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
10971
- // The header's own `align` alone. A Section's `align` places boxes — its
10972
- // body box, and the header's content box below — and a header whose text
10973
- // followed it could not be left-aligned inside a centred Section at all.
10974
- alignment = computed(() => this.align() ?? 'left', ...(ngDevMode ? [{ debugName: "alignment" }] : /* istanbul ignore next */ []));
10975
- showBack = input(false, ...(ngDevMode ? [{ debugName: "showBack" }] : /* istanbul ignore next */ []));
10976
- actionButton = input(...(ngDevMode ? [undefined, { debugName: "actionButton" }] : /* istanbul ignore next */ []));
10977
- // The action Button's accessible name — it renders icon-only, so without a
10978
- // label a screen reader has nothing to announce.
10979
- actionLabel = input(...(ngDevMode ? [undefined, { debugName: "actionLabel" }] : /* istanbul ignore next */ []));
10980
- spacing = input(false, ...(ngDevMode ? [{ debugName: "spacing" }] : /* istanbul ignore next */ []));
10981
- maxWidth = input(...(ngDevMode ? [undefined, { debugName: "maxWidth" }] : /* istanbul ignore next */ []));
10982
- actionClick = output();
10983
- action = output();
10984
- back = output();
10985
- translateService = inject(TranslateService);
10986
- // A computed rather than the impure TranslatePipe, the same trade
10987
- // HeaderComponent makes: one lookup per sub change instead of one per
10988
- // change-detection tick, and it still repaints when the language moves.
10989
- subText = computed(() => this.noTranslate()
10990
- ? this.subLabel()
10991
- : this.translateService.translate(this.subLabel(), this.params()), ...(ngDevMode ? [{ debugName: "subText" }] : /* istanbul ignore next */ []));
10992
- scrollSticky = injectScrollSticky(120, 'none');
10993
- sectionContext = inject(SECTION_CONTEXT, { optional: true });
10994
- sidepanel = computed(() => this.sectionContext?.sidepanel() ?? false, ...(ngDevMode ? [{ debugName: "sidepanel" }] : /* istanbul ignore next */ []));
10995
- noBorder = computed(() => this.sectionContext?.variant() === 'noBorder', ...(ngDevMode ? [{ debugName: "noBorder" }] : /* istanbul ignore next */ []));
10996
- // Falls back to the Section's `maxWidth`: the header sits above the body and
10997
- // the two are one column, so constraining the body alone left the heading
10998
- // hanging off the edge of the content it titles. The border stays on the
10999
- // host and keeps spanning the Section — only this inner box narrows.
11000
- resolvedMaxWidth = computed(() => this.maxWidth() ?? this.sectionContext?.maxWidth?.(), ...(ngDevMode ? [{ debugName: "resolvedMaxWidth" }] : /* istanbul ignore next */ []));
11001
- // Where that box sits once it is narrower than the row. The Section's
11002
- // `align` — the same value that places `.m-section__body` — so header and
11003
- // body stay in one column.
11004
- boxAlign = computed(() => this.sectionContext?.align?.() ?? 'left', ...(ngDevMode ? [{ debugName: "boxAlign" }] : /* istanbul ignore next */ []));
11005
- // The icon sits in the row, not in the heading, so it has no line box of its
11006
- // own to centre against — it gets the heading's.
11007
- iconBox = computed(() => HEADER_LINE_BOX[this.level()], ...(ngDevMode ? [{ debugName: "iconBox" }] : /* istanbul ignore next */ []));
11008
- isSticky = computed(() => this.sticky() && this.scrollSticky(), ...(ngDevMode ? [{ debugName: "isSticky" }] : /* istanbul ignore next */ []));
11009
- hasMenu = computed(() => !!this.menu() || !!this.menuName(), ...(ngDevMode ? [{ debugName: "hasMenu" }] : /* istanbul ignore next */ []));
11010
- actionConfig = computed(() => {
11011
- const icon = this.actionButton();
11012
- if (!icon)
11013
- return undefined;
11014
- return {
11015
- icon,
11016
- label: this.actionLabel(),
11017
- iconOnly: true,
11018
- variant: 'ghost',
11019
- };
11020
- }, ...(ngDevMode ? [{ debugName: "actionConfig" }] : /* istanbul ignore next */ []));
11021
- // Read through SECTION_CONTEXT rather than by injecting the directive:
11022
- // every `<m-section>` provides the context, so the nearest one wins and a
11023
- // header only ever draws the toggle of the Section it belongs to. Injecting
11024
- // SectionAccordionDirective instead walks past that Section to any ancestor
11025
- // carrying the behaviour, which put an arrow on every nested header. Null
11026
- // where the Section has no active accordion (CONTEXT.md SectionAccordion).
11027
- accordion = computed(() => this.sectionContext?.accordion?.() ?? null, ...(ngDevMode ? [{ debugName: "accordion" }] : /* istanbul ignore next */ []));
11028
- // toggleIcon set: the glyph itself swaps between closed/open, already
11029
- // "pointing" the right way, so it never rotates. toggleIcon absent: the
11030
- // one glyph (icon, or the default chevron) rotates 180° instead.
11031
- toggleIconName = computed(() => {
11032
- const accordion = this.accordion();
11033
- if (!accordion)
11034
- return undefined;
11035
- const toggleIcon = accordion.toggleIcon();
11036
- if (toggleIcon) {
11037
- return accordion.isOpen() ? toggleIcon : accordion.icon() ?? 'accordion_chevron';
11038
- }
11039
- return accordion.icon() ?? 'accordion_chevron';
11040
- }, ...(ngDevMode ? [{ debugName: "toggleIconName" }] : /* istanbul ignore next */ []));
11041
- toggleRotates = computed(() => !this.accordion()?.toggleIcon(), ...(ngDevMode ? [{ debugName: "toggleRotates" }] : /* istanbul ignore next */ []));
11042
- onToggleClick() {
11043
- this.accordion()?.toggle();
11044
- }
11045
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SectionHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
11046
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: SectionHeaderComponent, isStandalone: true, selector: "m-section-header", inputs: { sticky: { classPropertyName: "sticky", publicName: "sticky", isSignal: true, isRequired: false, transformFunction: null }, level: { classPropertyName: "level", publicName: "level", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, subLabel: { classPropertyName: "subLabel", publicName: "subLabel", isSignal: true, isRequired: false, transformFunction: null }, noTranslate: { classPropertyName: "noTranslate", publicName: "noTranslate", isSignal: true, isRequired: false, transformFunction: null }, params: { classPropertyName: "params", publicName: "params", isSignal: true, isRequired: false, transformFunction: null }, reverse: { classPropertyName: "reverse", publicName: "reverse", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, menu: { classPropertyName: "menu", publicName: "menu", isSignal: true, isRequired: false, transformFunction: null }, menuName: { classPropertyName: "menuName", publicName: "menuName", isSignal: true, isRequired: false, transformFunction: null }, visibilityRule: { classPropertyName: "visibilityRule", publicName: "visibilityRule", isSignal: true, isRequired: false, transformFunction: null }, disableRule: { classPropertyName: "disableRule", publicName: "disableRule", isSignal: true, isRequired: false, transformFunction: null }, extraData: { classPropertyName: "extraData", publicName: "extraData", isSignal: true, isRequired: false, transformFunction: null }, align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, showBack: { classPropertyName: "showBack", publicName: "showBack", isSignal: true, isRequired: false, transformFunction: null }, actionButton: { classPropertyName: "actionButton", publicName: "actionButton", isSignal: true, isRequired: false, transformFunction: null }, actionLabel: { classPropertyName: "actionLabel", publicName: "actionLabel", isSignal: true, isRequired: false, transformFunction: null }, spacing: { classPropertyName: "spacing", publicName: "spacing", isSignal: true, isRequired: false, transformFunction: null }, maxWidth: { classPropertyName: "maxWidth", publicName: "maxWidth", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { actionClick: "actionClick", action: "action", back: "back" }, host: { properties: { "class.is-sticky-enabled": "sticky()", "class.is-sticky": "isSticky()", "class.has-menu": "hasMenu()", "class.align-left": "alignment() === \"left\"", "class.align-center": "alignment() === \"center\"", "class.align-right": "alignment() === \"right\"", "class.has-sidepanel": "sidepanel()", "class.no-border": "noBorder()", "class.spacing": "spacing()", "class.box-center": "boxAlign() === \"center\"", "class.box-right": "boxAlign() === \"right\"", "style.--m-section-header-max-width": "resolvedMaxWidth()", "style.--m-section-header-icon-box": "iconBox()" }, classAttribute: "m-section-header" }, ngImport: i0, template: "<!-- One declaration of the row, rendered by whichever branch `spacing` picks.\n Hoisted into a template rather than written twice: an `<ng-content>` may\n appear once per selector in a component, so the duplicated copy caught\n nothing and a header projecting a title rendered it in the `spacing`\n branch alone. -->\n<ng-template #body>\n @if (accordion(); as accordionRef) {\n <div\n class=\"section-header__toggle\"\n [class.section-header__toggle--rotate]=\"toggleRotates()\"\n [class.section-header__toggle--open]=\"accordionRef.isOpen()\"\n [id]=\"accordionRef.headerId\"\n [attr.aria-expanded]=\"accordionRef.isOpen()\"\n [attr.aria-controls]=\"accordionRef.bodyId\"\n >\n <m-button\n [config]=\"{ icon: toggleIconName(), iconOnly: true, variant: 'ghost' }\"\n (clicked)=\"onToggleClick()\" />\n </div>\n }\n @if (showBack()) {\n <div class=\"section-header__back\">\n <m-button\n [config]=\"{ icon: 'chevron-left', iconOnly: true }\"\n (clicked)=\"back.emit()\" />\n </div>\n } @else if (!label() && icon(); as iconName) {\n <!-- Only where no label is written. A header with one hands the icon to\n `m-header`, which draws it inside the heading's line box and so on the\n heading's own centre line. Beside a projected title there is no such\n box to borrow, so the glyph is boxed to the level's line box here and\n centred in it \u2014 otherwise it centres against the whole title column,\n which on the Canvas is the label slot's drop rect stacked above the\n heading. -->\n <div class=\"section-header__icon\">\n <m-icon [name]=\"iconName\" />\n </div>\n }\n <div\n class=\"section-header__title\"\n [class.section-header__title--reverse]=\"reverse()\"\n >\n <!-- The title slot is the catch-all rather than a `[label]` one: every\n header already projecting a heading writes it unselected, and a\n selector here would drop that content on the floor. What the design\n page emits \u2014 `<span label>` \u2014 is caught by it too, nothing else\n claiming the node. -->\n <ng-content />\n <!-- The written label, drawn beside the slot rather than as its\n `ng-content` fallback. A fallback renders only while *nothing* is\n projected, and the design Canvas always projects the slot span \u2014\n empty until a Control is dropped in it \u2014 so a fallback there would\n blank the label a header is still configured with. `label` answers\n instead, which no header projecting a title sets. -->\n @if (label()) {\n <m-header\n [level]=\"level()\"\n [label]=\"label()\"\n [icon]=\"icon()\"\n [params]=\"params()\"\n [noTranslate]=\"noTranslate()\" />\n }\n @if (subText(); as sub) {\n <span class=\"section-header__sub\">{{ sub }}</span>\n }\n </div>\n <!-- A FilterGroup projected into the header row, selected by tag rather than\n by an attribute \u2014 the same shape a Section catches its `m-action` with.\n A header has room for one icon and not for a row, so a group landing\n here is squeezed by placement (ADR 0025); nothing here enforces that,\n the caller binding `[squeeze]` on the tag it projects. -->\n <div class=\"section-header__filters\">\n <ng-content select=\"m-section-filter-group\" />\n </div>\n @if (actionConfig(); as action) {\n <div class=\"section-header__action\">\n <m-button [config]=\"action\" (clicked)=\"actionClick.emit()\" />\n </div>\n }\n @if (hasMenu()) {\n <div class=\"section-header__menu\">\n <m-context-menu\n [config]=\"menu()\"\n [name]=\"menuName()\"\n [visibilityRule]=\"visibilityRule()\"\n [disableRule]=\"disableRule()\"\n [extraData]=\"extraData()\"\n (action)=\"action.emit($event)\"\n />\n </div>\n }\n</ng-template>\n\n<!-- Always the same two boxes, whether or not a `maxWidth` is in force. The\n border and the sticky backdrop live on the host and keep spanning the\n Section's full width; only this container narrows and is placed by the\n Section's `align`, so the heading lines up with the body under it. -->\n<div class=\"section-header__container\">\n <div class=\"section-header__inner\">\n <ng-container [ngTemplateOutlet]=\"body\" />\n </div>\n</div>\n", styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}:host{display:flex;align-items:center;gap:.5rem;min-height:var(--section-header-min-height, calc(var(--section-header-py, .5rem) * 2 + 1.25rem));border-bottom:1px solid var(--m-backdrop-border);padding:var(--section-header-py, .85rem) var(--section-px, 1rem);width:100%;grid-column:1/-1}:host(.no-border){border-bottom:none}:host(.spacing){padding:0;width:100%}.section-header__container{width:100%;min-width:0;max-width:var(--m-section-header-max-width, none);margin-inline:0 auto}:host(.box-center) .section-header__container{margin-inline:auto}:host(.box-right) .section-header__container{margin-inline:auto 0}.section-header__inner{display:flex;align-items:center;gap:.5rem;width:100%;min-width:0}.section-header__inner .section-header__title{flex:1;min-width:0;gap:.5rem}:host(.spacing) .section-header__inner{padding:1rem 1.5rem}:host(.has-sidepanel){padding-right:50px}:host(.has-sidepanel.has-menu){padding-right:50px}:host(.spacing.has-sidepanel) .section-header__inner{padding-right:calc(1.5rem + 50px)}:host(.is-sticky-enabled){position:sticky;top:0;z-index:10}:host(.is-sticky-enabled){background:color-mix(in srgb,var(--m-background) 80%,transparent);backdrop-filter:blur(16px) saturate(180%);-webkit-backdrop-filter:blur(16px) saturate(180%)}.section-header__toggle{display:flex;flex-shrink:0}.section-header__toggle.section-header__toggle--rotate m-button{display:flex;transition:transform .3s cubic-bezier(.4,0,.2,1)}.section-header__toggle.section-header__toggle--rotate.section-header__toggle--open m-button{transform:rotate(180deg)}.section-header__title{flex:1;min-width:0;display:flex;flex-direction:column;gap:.1rem}m-header{min-width:0}.section-header__title--reverse{flex-direction:column-reverse}.section-header__sub{font-size:.8rem;color:var(--m-text-secondary);line-height:1.2}:host(.align-center){--m-header-justify: center}:host(.align-right){--m-header-justify: flex-end}:host(.has-menu){padding-right:0}:host(.spacing.has-menu) .section-header__inner{padding-right:0}.section-header__filters{display:contents}.section-header__filters m-section-filter-group{width:auto;flex-shrink:0;border-bottom:none}.section-header__back{display:flex;align-items:center;flex-shrink:0}.section-header__icon{display:flex;align-items:center;justify-content:center;flex-shrink:0;align-self:flex-start;height:var(--m-section-header-icon-box, 1.5125rem)}.section-header__menu,.section-header__action{margin-left:auto;flex-shrink:0;display:flex;align-items:center}.section-header__action+.section-header__menu{margin-left:0}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ContextMenuComponent, selector: "m-context-menu, m-one-context-menu", inputs: ["toggle", "remote", "exclude", "visibilityRule", "disableRule", "extraData", "inverted", "options"], outputs: ["toggleChange", "action"] }, { kind: "component", type: HeaderComponent$1, selector: "m-header", inputs: ["level", "label", "icon", "actionButton", "actionLabel", "noTranslate", "params"], outputs: ["actionClick"] }, { kind: "component", type: IconComponent, selector: "m-icon, m-one-icon", inputs: ["config", "name", "color", "size", "one", "baseUrl", "remote"], outputs: ["configChange"] }, { kind: "component", type: ButtonComponent, selector: "m-button,m-one-button", inputs: ["config", "color", "labelClass", "fullWidth", "nav", "navParams", "href", "disabled", "variant", "name", "baseUrl", "one", "remote", "label", "noTranslate", "params", "noNative", "icon", "isRightIcon", "iconOnly", "stacked", "imgSrc", "nonClickable", "inverted", "isSubmit", "tabindex"], outputs: ["configChange", "clicked"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
11047
- }
11048
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SectionHeaderComponent, decorators: [{
11049
- type: Component,
11050
- args: [{ selector: 'm-section-header', imports: [
11051
- NgTemplateOutlet,
11052
- ContextMenuComponent,
11053
- HeaderComponent$1,
11054
- IconComponent,
11055
- ButtonComponent,
11056
- ], changeDetection: ChangeDetectionStrategy.OnPush, host: {
11057
- class: 'm-section-header',
11058
- '[class.is-sticky-enabled]': 'sticky()',
11059
- '[class.is-sticky]': 'isSticky()',
11060
- '[class.has-menu]': 'hasMenu()',
11061
- '[class.align-left]': 'alignment() === "left"',
11062
- '[class.align-center]': 'alignment() === "center"',
11063
- '[class.align-right]': 'alignment() === "right"',
11064
- '[class.has-sidepanel]': 'sidepanel()',
11065
- '[class.no-border]': 'noBorder()',
11066
- '[class.spacing]': 'spacing()',
11067
- '[class.box-center]': 'boxAlign() === "center"',
11068
- '[class.box-right]': 'boxAlign() === "right"',
11069
- '[style.--m-section-header-max-width]': 'resolvedMaxWidth()',
11070
- '[style.--m-section-header-icon-box]': 'iconBox()',
11071
- }, template: "<!-- One declaration of the row, rendered by whichever branch `spacing` picks.\n Hoisted into a template rather than written twice: an `<ng-content>` may\n appear once per selector in a component, so the duplicated copy caught\n nothing and a header projecting a title rendered it in the `spacing`\n branch alone. -->\n<ng-template #body>\n @if (accordion(); as accordionRef) {\n <div\n class=\"section-header__toggle\"\n [class.section-header__toggle--rotate]=\"toggleRotates()\"\n [class.section-header__toggle--open]=\"accordionRef.isOpen()\"\n [id]=\"accordionRef.headerId\"\n [attr.aria-expanded]=\"accordionRef.isOpen()\"\n [attr.aria-controls]=\"accordionRef.bodyId\"\n >\n <m-button\n [config]=\"{ icon: toggleIconName(), iconOnly: true, variant: 'ghost' }\"\n (clicked)=\"onToggleClick()\" />\n </div>\n }\n @if (showBack()) {\n <div class=\"section-header__back\">\n <m-button\n [config]=\"{ icon: 'chevron-left', iconOnly: true }\"\n (clicked)=\"back.emit()\" />\n </div>\n } @else if (!label() && icon(); as iconName) {\n <!-- Only where no label is written. A header with one hands the icon to\n `m-header`, which draws it inside the heading's line box and so on the\n heading's own centre line. Beside a projected title there is no such\n box to borrow, so the glyph is boxed to the level's line box here and\n centred in it \u2014 otherwise it centres against the whole title column,\n which on the Canvas is the label slot's drop rect stacked above the\n heading. -->\n <div class=\"section-header__icon\">\n <m-icon [name]=\"iconName\" />\n </div>\n }\n <div\n class=\"section-header__title\"\n [class.section-header__title--reverse]=\"reverse()\"\n >\n <!-- The title slot is the catch-all rather than a `[label]` one: every\n header already projecting a heading writes it unselected, and a\n selector here would drop that content on the floor. What the design\n page emits \u2014 `<span label>` \u2014 is caught by it too, nothing else\n claiming the node. -->\n <ng-content />\n <!-- The written label, drawn beside the slot rather than as its\n `ng-content` fallback. A fallback renders only while *nothing* is\n projected, and the design Canvas always projects the slot span \u2014\n empty until a Control is dropped in it \u2014 so a fallback there would\n blank the label a header is still configured with. `label` answers\n instead, which no header projecting a title sets. -->\n @if (label()) {\n <m-header\n [level]=\"level()\"\n [label]=\"label()\"\n [icon]=\"icon()\"\n [params]=\"params()\"\n [noTranslate]=\"noTranslate()\" />\n }\n @if (subText(); as sub) {\n <span class=\"section-header__sub\">{{ sub }}</span>\n }\n </div>\n <!-- A FilterGroup projected into the header row, selected by tag rather than\n by an attribute \u2014 the same shape a Section catches its `m-action` with.\n A header has room for one icon and not for a row, so a group landing\n here is squeezed by placement (ADR 0025); nothing here enforces that,\n the caller binding `[squeeze]` on the tag it projects. -->\n <div class=\"section-header__filters\">\n <ng-content select=\"m-section-filter-group\" />\n </div>\n @if (actionConfig(); as action) {\n <div class=\"section-header__action\">\n <m-button [config]=\"action\" (clicked)=\"actionClick.emit()\" />\n </div>\n }\n @if (hasMenu()) {\n <div class=\"section-header__menu\">\n <m-context-menu\n [config]=\"menu()\"\n [name]=\"menuName()\"\n [visibilityRule]=\"visibilityRule()\"\n [disableRule]=\"disableRule()\"\n [extraData]=\"extraData()\"\n (action)=\"action.emit($event)\"\n />\n </div>\n }\n</ng-template>\n\n<!-- Always the same two boxes, whether or not a `maxWidth` is in force. The\n border and the sticky backdrop live on the host and keep spanning the\n Section's full width; only this container narrows and is placed by the\n Section's `align`, so the heading lines up with the body under it. -->\n<div class=\"section-header__container\">\n <div class=\"section-header__inner\">\n <ng-container [ngTemplateOutlet]=\"body\" />\n </div>\n</div>\n", styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}:host{display:flex;align-items:center;gap:.5rem;min-height:var(--section-header-min-height, calc(var(--section-header-py, .5rem) * 2 + 1.25rem));border-bottom:1px solid var(--m-backdrop-border);padding:var(--section-header-py, .85rem) var(--section-px, 1rem);width:100%;grid-column:1/-1}:host(.no-border){border-bottom:none}:host(.spacing){padding:0;width:100%}.section-header__container{width:100%;min-width:0;max-width:var(--m-section-header-max-width, none);margin-inline:0 auto}:host(.box-center) .section-header__container{margin-inline:auto}:host(.box-right) .section-header__container{margin-inline:auto 0}.section-header__inner{display:flex;align-items:center;gap:.5rem;width:100%;min-width:0}.section-header__inner .section-header__title{flex:1;min-width:0;gap:.5rem}:host(.spacing) .section-header__inner{padding:1rem 1.5rem}:host(.has-sidepanel){padding-right:50px}:host(.has-sidepanel.has-menu){padding-right:50px}:host(.spacing.has-sidepanel) .section-header__inner{padding-right:calc(1.5rem + 50px)}:host(.is-sticky-enabled){position:sticky;top:0;z-index:10}:host(.is-sticky-enabled){background:color-mix(in srgb,var(--m-background) 80%,transparent);backdrop-filter:blur(16px) saturate(180%);-webkit-backdrop-filter:blur(16px) saturate(180%)}.section-header__toggle{display:flex;flex-shrink:0}.section-header__toggle.section-header__toggle--rotate m-button{display:flex;transition:transform .3s cubic-bezier(.4,0,.2,1)}.section-header__toggle.section-header__toggle--rotate.section-header__toggle--open m-button{transform:rotate(180deg)}.section-header__title{flex:1;min-width:0;display:flex;flex-direction:column;gap:.1rem}m-header{min-width:0}.section-header__title--reverse{flex-direction:column-reverse}.section-header__sub{font-size:.8rem;color:var(--m-text-secondary);line-height:1.2}:host(.align-center){--m-header-justify: center}:host(.align-right){--m-header-justify: flex-end}:host(.has-menu){padding-right:0}:host(.spacing.has-menu) .section-header__inner{padding-right:0}.section-header__filters{display:contents}.section-header__filters m-section-filter-group{width:auto;flex-shrink:0;border-bottom:none}.section-header__back{display:flex;align-items:center;flex-shrink:0}.section-header__icon{display:flex;align-items:center;justify-content:center;flex-shrink:0;align-self:flex-start;height:var(--m-section-header-icon-box, 1.5125rem)}.section-header__menu,.section-header__action{margin-left:auto;flex-shrink:0;display:flex;align-items:center}.section-header__action+.section-header__menu{margin-left:0}\n"] }]
11072
- }], propDecorators: { sticky: [{ type: i0.Input, args: [{ isSignal: true, alias: "sticky", required: false }] }], level: [{ type: i0.Input, args: [{ isSignal: true, alias: "level", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], subLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "subLabel", required: false }] }], noTranslate: [{ type: i0.Input, args: [{ isSignal: true, alias: "noTranslate", required: false }] }], params: [{ type: i0.Input, args: [{ isSignal: true, alias: "params", required: false }] }], reverse: [{ type: i0.Input, args: [{ isSignal: true, alias: "reverse", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], menu: [{ type: i0.Input, args: [{ isSignal: true, alias: "menu", required: false }] }], menuName: [{ type: i0.Input, args: [{ isSignal: true, alias: "menuName", required: false }] }], visibilityRule: [{ type: i0.Input, args: [{ isSignal: true, alias: "visibilityRule", required: false }] }], disableRule: [{ type: i0.Input, args: [{ isSignal: true, alias: "disableRule", required: false }] }], extraData: [{ type: i0.Input, args: [{ isSignal: true, alias: "extraData", required: false }] }], align: [{ type: i0.Input, args: [{ isSignal: true, alias: "align", required: false }] }], showBack: [{ type: i0.Input, args: [{ isSignal: true, alias: "showBack", required: false }] }], actionButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "actionButton", required: false }] }], actionLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "actionLabel", required: false }] }], spacing: [{ type: i0.Input, args: [{ isSignal: true, alias: "spacing", required: false }] }], maxWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxWidth", required: false }] }], actionClick: [{ type: i0.Output, args: ["actionClick"] }], action: [{ type: i0.Output, args: ["action"] }], back: [{ type: i0.Output, args: ["back"] }] } });
11073
-
11074
- const BACK_BTN = {
11075
- icon: 'chevron-left',
11076
- iconOnly: true,
11077
- variant: 'ghost',
11078
- };
11079
- class SectionBackComponent {
11080
- back = input(false, ...(ngDevMode ? [{ debugName: "back" }] : /* istanbul ignore next */ []));
11081
- label = input(...(ngDevMode ? [undefined, { debugName: "label" }] : /* istanbul ignore next */ []));
11082
- html = input(...(ngDevMode ? [undefined, { debugName: "html" }] : /* istanbul ignore next */ []));
11083
- padding = input(false, ...(ngDevMode ? [{ debugName: "padding" }] : /* istanbul ignore next */ []));
11084
- paddingX = input(false, ...(ngDevMode ? [{ debugName: "paddingX" }] : /* istanbul ignore next */ []));
11085
- paddingY = input(false, ...(ngDevMode ? [{ debugName: "paddingY" }] : /* istanbul ignore next */ []));
11086
- navigate = output();
11087
- backBtn = BACK_BTN;
11088
- sectionContext = inject(SECTION_CONTEXT, { optional: true });
11089
- sidepanel = computed(() => this.sectionContext?.sidepanel() ?? false, ...(ngDevMode ? [{ debugName: "sidepanel" }] : /* istanbul ignore next */ []));
11090
- noBorder = computed(() => this.sectionContext?.variant() === 'noBorder', ...(ngDevMode ? [{ debugName: "noBorder" }] : /* istanbul ignore next */ []));
11091
- contentRef = viewChild('content', ...(ngDevMode ? [{ debugName: "contentRef" }] : /* istanbul ignore next */ []));
11092
- hasContent = signal(false, ...(ngDevMode ? [{ debugName: "hasContent" }] : /* istanbul ignore next */ []));
11093
- constructor() {
11094
- effect(() => {
11095
- const el = this.contentRef()?.nativeElement;
11096
- if (el)
11097
- this.hasContent.set(el.childNodes.length > 0);
11098
- });
11099
- }
11100
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SectionBackComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
11101
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: SectionBackComponent, isStandalone: true, selector: "m-section-back", inputs: { back: { classPropertyName: "back", publicName: "back", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, html: { classPropertyName: "html", publicName: "html", isSignal: true, isRequired: false, transformFunction: null }, padding: { classPropertyName: "padding", publicName: "padding", isSignal: true, isRequired: false, transformFunction: null }, paddingX: { classPropertyName: "paddingX", publicName: "paddingX", isSignal: true, isRequired: false, transformFunction: null }, paddingY: { classPropertyName: "paddingY", publicName: "paddingY", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { navigate: "navigate" }, host: { properties: { "class.has-sidepanel": "sidepanel()", "class.has-padding-x": "padding() || paddingX()", "class.has-padding-y": "padding() || paddingY()", "class.no-border": "noBorder()" }, classAttribute: "m-section-back" }, viewQueries: [{ propertyName: "contentRef", first: true, predicate: ["content"], descendants: true, isSignal: true }], ngImport: i0, template: `
11102
- @if (back()) {
11103
- <m-button [config]="backBtn" (clicked)="navigate.emit()" />
11104
- } @else {
11105
- <m-icon icon="logo" color="mm" />
11106
- }
11107
- <span #content><ng-content /></span>
11108
- @if (!hasContent()) {
11109
- @if (html()) {
11110
- <m-header [level]="3" [innerHTML]="html()" />
11111
- } @else {
11112
- <m-header [level]="3" [label]="label() ?? 'magmonium'" />
11113
- }
11114
- }
11115
- `, isInline: true, styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}:host{display:flex;align-items:center;gap:.25rem;min-height:var(--section-header-min-height, calc(var(--section-header-py, .5rem) * 2 + 1.25rem));border-bottom:1px solid var(--m-backdrop-border);width:100%;grid-column:1/-1;--section-back-size: .7rem;--section-back-seat: calc(var(--section-back-size) * 2.25)}:host(.no-border){border-bottom:none}m-button,m-icon{flex-shrink:0}m-button{--m-button-size: var(--section-back-size)}m-icon{display:inline-flex;justify-content:center;width:var(--section-back-seat)}m-logo{flex-shrink:0;width:1.5rem;height:1.5rem}m-header{flex:1;min-width:0}:host>span{display:contents}:host.has-padding-x{padding-inline:var(--section-px, 1rem)}:host.has-padding-y{padding-block:var(--section-header-py, .85rem)}\n"], dependencies: [{ kind: "component", type: IconComponent, selector: "m-icon, m-one-icon", inputs: ["config", "name", "color", "size", "one", "baseUrl", "remote"], outputs: ["configChange"] }, { kind: "component", type: ButtonComponent, selector: "m-button,m-one-button", inputs: ["config", "color", "labelClass", "fullWidth", "nav", "navParams", "href", "disabled", "variant", "name", "baseUrl", "one", "remote", "label", "noTranslate", "params", "noNative", "icon", "isRightIcon", "iconOnly", "stacked", "imgSrc", "nonClickable", "inverted", "isSubmit", "tabindex"], outputs: ["configChange", "clicked"] }, { kind: "component", type: HeaderComponent$1, selector: "m-header", inputs: ["level", "label", "icon", "actionButton", "actionLabel", "noTranslate", "params"], outputs: ["actionClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
11116
- }
11117
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SectionBackComponent, decorators: [{
11118
- type: Component,
11119
- args: [{ selector: 'm-section-back', template: `
11120
- @if (back()) {
11121
- <m-button [config]="backBtn" (clicked)="navigate.emit()" />
11122
- } @else {
11123
- <m-icon icon="logo" color="mm" />
11124
- }
11125
- <span #content><ng-content /></span>
11126
- @if (!hasContent()) {
11127
- @if (html()) {
11128
- <m-header [level]="3" [innerHTML]="html()" />
11129
- } @else {
11130
- <m-header [level]="3" [label]="label() ?? 'magmonium'" />
11131
- }
11132
- }
11133
- `, imports: [IconComponent, ButtonComponent, HeaderComponent$1], changeDetection: ChangeDetectionStrategy.OnPush, host: {
11134
- class: 'm-section-back',
11135
- '[class.has-sidepanel]': 'sidepanel()',
11136
- '[class.has-padding-x]': 'padding() || paddingX()',
11137
- '[class.has-padding-y]': 'padding() || paddingY()',
11138
- '[class.no-border]': 'noBorder()',
11139
- }, styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}:host{display:flex;align-items:center;gap:.25rem;min-height:var(--section-header-min-height, calc(var(--section-header-py, .5rem) * 2 + 1.25rem));border-bottom:1px solid var(--m-backdrop-border);width:100%;grid-column:1/-1;--section-back-size: .7rem;--section-back-seat: calc(var(--section-back-size) * 2.25)}:host(.no-border){border-bottom:none}m-button,m-icon{flex-shrink:0}m-button{--m-button-size: var(--section-back-size)}m-icon{display:inline-flex;justify-content:center;width:var(--section-back-seat)}m-logo{flex-shrink:0;width:1.5rem;height:1.5rem}m-header{flex:1;min-width:0}:host>span{display:contents}:host.has-padding-x{padding-inline:var(--section-px, 1rem)}:host.has-padding-y{padding-block:var(--section-header-py, .85rem)}\n"] }]
11140
- }], ctorParameters: () => [], propDecorators: { back: [{ type: i0.Input, args: [{ isSignal: true, alias: "back", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], html: [{ type: i0.Input, args: [{ isSignal: true, alias: "html", required: false }] }], padding: [{ type: i0.Input, args: [{ isSignal: true, alias: "padding", required: false }] }], paddingX: [{ type: i0.Input, args: [{ isSignal: true, alias: "paddingX", required: false }] }], paddingY: [{ type: i0.Input, args: [{ isSignal: true, alias: "paddingY", required: false }] }], navigate: [{ type: i0.Output, args: ["navigate"] }], contentRef: [{ type: i0.ViewChild, args: ['content', { isSignal: true }] }] } });
11141
-
11142
- /**
11143
- * Merges multiple arrays and removes duplicates
11144
- * @param arrays - Arrays to merge
11145
- * @returns Merged array with unique values
11146
- */
11147
- function mergeUnique(...arrays) {
11148
- return [...new Set(arrays.flat())];
11149
- }
11150
- /**
11151
- * Merges arrays of objects and removes duplicates by key
11152
- * @param arrays - Arrays to merge
11153
- * @param key - Property to use for uniqueness check
11154
- * @returns Merged array with unique objects
11155
- */
11156
- function mergeUniqueBy(arrays, key) {
11157
- const map = new Map();
11158
- arrays.flat().forEach((item) => {
11159
- if (!map.has(item[key])) {
11160
- map.set(item[key], item);
11161
- }
11162
- });
11163
- return Array.from(map.values());
11164
- }
11165
- /**
11166
- * Merges arrays with custom comparator
11167
- */
11168
- function mergeUniqueWith(arrays, compareFn) {
11169
- const map = new Map();
11170
- arrays.flat().forEach((item) => {
11171
- const key = compareFn(item);
11172
- if (!map.has(key)) {
11173
- map.set(key, item);
11174
- }
11175
- });
11176
- return Array.from(map.values());
11177
- }
11178
-
11179
11075
  class ButtonGroupComponent extends ConfigComponent {
11180
11076
  // to overwrite specific button config
11181
11077
  buttons = input(...(ngDevMode ? [undefined, { debugName: "buttons" }] : /* istanbul ignore next */ []));
@@ -17420,7 +17316,9 @@ class SectionAccordionDirective {
17420
17316
  // Ungrouped default is open (CONTEXT.md) — a bare `register()` call from a
17421
17317
  // group overrides this via setOpen before first render.
17422
17318
  _open = signal(true, ...(ngDevMode ? [{ debugName: "_open" }] : /* istanbul ignore next */ []));
17423
- isOpen = computed(() => this._open(), ...(ngDevMode ? [{ debugName: "isOpen" }] : /* istanbul ignore next */ []));
17319
+ // Always open on the Canvas: the toggle is inert there, so a group member
17320
+ // closed at registration would hide its children with no way to reach them.
17321
+ isOpen = computed(() => this.isDesignMode || this._open(), ...(ngDevMode ? [{ debugName: "isOpen" }] : /* istanbul ignore next */ []));
17424
17322
  sectionAccordionId = `m-section-accordion-${++counter}`;
17425
17323
  headerId = `${this.sectionAccordionId}-header`;
17426
17324
  bodyId = `${this.sectionAccordionId}-body`;
@@ -17487,7 +17385,6 @@ class SectionComponent extends ConfigComponent {
17487
17385
  // on every Section it draws, so an unattached one must not collapse or
17488
17386
  // announce itself as a region.
17489
17387
  accordion = computed(() => this.accordionDirective?.isActive() ? this.accordionDirective : null, ...(ngDevMode ? [{ debugName: "accordion" }] : /* istanbul ignore next */ []));
17490
- header = contentChild(SectionHeaderComponent, ...(ngDevMode ? [{ debugName: "header" }] : /* istanbul ignore next */ []));
17491
17388
  badges = contentChild(SectionBadgesComponent, ...(ngDevMode ? [{ debugName: "badges" }] : /* istanbul ignore next */ []));
17492
17389
  toggle = contentChild(SectionToggleComponent, ...(ngDevMode ? [{ debugName: "toggle" }] : /* istanbul ignore next */ []));
17493
17390
  action = contentChild(ActionComponent, ...(ngDevMode ? [{ debugName: "action" }] : /* istanbul ignore next */ []));
@@ -17575,7 +17472,7 @@ class SectionComponent extends ConfigComponent {
17575
17472
  });
17576
17473
  }
17577
17474
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SectionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
17578
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: SectionComponent, isStandalone: true, selector: "m-section", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, maxWidth: { classPropertyName: "maxWidth", publicName: "maxWidth", isSignal: true, isRequired: false, transformFunction: null }, heightMode: { classPropertyName: "heightMode", publicName: "heightMode", isSignal: true, isRequired: false, transformFunction: null }, maxHeight: { classPropertyName: "maxHeight", publicName: "maxHeight", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, alignX: { classPropertyName: "alignX", publicName: "alignX", isSignal: true, isRequired: false, transformFunction: null }, alignY: { classPropertyName: "alignY", publicName: "alignY", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { inView: "inView" }, host: { properties: { "class.is-full-height": "isFullHeight()", "class.has-sidepanel": "resolvedSidepanel()", "class.has-max-height": "!!cssMaxHeight()", "class.no-border": "resolvedVariant() === \"noBorder\"", "class.is-with-border": "resolvedVariant() === \"withBorder\"", "class.is-sandwich-border": "resolvedVariant() === \"sandwichBorder\"", "class.align-x-left": "resolvedAlignX() === \"left\"", "class.align-x-center": "resolvedAlignX() === \"center\"", "class.align-x-right": "resolvedAlignX() === \"right\"", "class.align-y-top": "resolvedAlignY() === \"top\"", "class.align-y-center": "resolvedAlignY() === \"center\"", "class.align-y-bottom": "resolvedAlignY() === \"bottom\"", "class.align-left": "resolvedAlign() === \"left\"", "class.align-right": "resolvedAlign() === \"right\"", "class.align-center": "resolvedAlign() === \"center\"", "style.font-size": "sizeLength()", "style.--input-size": "sizeLength()", "style.--m-section-align": "resolvedAlign()", "style.--m-section-max-width": "resolvedMaxWidth()", "style.--m-section-max-height": "cssMaxHeight()" }, classAttribute: "m-section" }, providers: [
17475
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: SectionComponent, isStandalone: true, selector: "m-section", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, maxWidth: { classPropertyName: "maxWidth", publicName: "maxWidth", isSignal: true, isRequired: false, transformFunction: null }, heightMode: { classPropertyName: "heightMode", publicName: "heightMode", isSignal: true, isRequired: false, transformFunction: null }, maxHeight: { classPropertyName: "maxHeight", publicName: "maxHeight", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, alignX: { classPropertyName: "alignX", publicName: "alignX", isSignal: true, isRequired: false, transformFunction: null }, alignY: { classPropertyName: "alignY", publicName: "alignY", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { inView: "inView" }, host: { properties: { "class.is-full-height": "isFullHeight()", "class.has-sidepanel": "resolvedSidepanel()", "class.has-max-height": "!!cssMaxHeight()", "class.no-border": "resolvedVariant() === \"noBorder\"", "class.is-with-border": "resolvedVariant() === \"withBorder\"", "class.is-sandwich-border": "resolvedVariant() === \"sandwichBorder\"", "class.is-side-border": "resolvedVariant() === \"sideBorder\"", "class.is-left-border": "resolvedVariant() === \"leftBorder\"", "class.is-right-border": "resolvedVariant() === \"rightBorder\"", "class.align-x-left": "resolvedAlignX() === \"left\"", "class.align-x-center": "resolvedAlignX() === \"center\"", "class.align-x-right": "resolvedAlignX() === \"right\"", "class.align-y-top": "resolvedAlignY() === \"top\"", "class.align-y-center": "resolvedAlignY() === \"center\"", "class.align-y-bottom": "resolvedAlignY() === \"bottom\"", "class.align-left": "resolvedAlign() === \"left\"", "class.align-right": "resolvedAlign() === \"right\"", "class.align-center": "resolvedAlign() === \"center\"", "style.font-size": "sizeLength()", "style.--input-size": "sizeLength()", "style.--m-section-align": "resolvedAlign()", "style.--m-section-max-width": "resolvedMaxWidth()", "style.--m-section-max-height": "cssMaxHeight()" }, classAttribute: "m-section" }, providers: [
17579
17476
  provideSizeContext(SectionComponent),
17580
17477
  {
17581
17478
  provide: SECTION_CONTEXT,
@@ -17590,10 +17487,10 @@ class SectionComponent extends ConfigComponent {
17590
17487
  };
17591
17488
  },
17592
17489
  },
17593
- ], queries: [{ propertyName: "header", first: true, predicate: SectionHeaderComponent, descendants: true, isSignal: true }, { propertyName: "badges", first: true, predicate: SectionBadgesComponent, descendants: true, isSignal: true }, { propertyName: "toggle", first: true, predicate: SectionToggleComponent, descendants: true, isSignal: true }, { propertyName: "action", first: true, predicate: ActionComponent, descendants: true, isSignal: true }, { propertyName: "back", first: true, predicate: SectionBackComponent, descendants: true, isSignal: true }, { propertyName: "search", first: true, predicate: SectionSearchComponent, descendants: true, isSignal: true }, { propertyName: "filter", first: true, predicate: SectionFilterComponent, descendants: true, isSignal: true }, { propertyName: "filterGroup", first: true, predicate: SectionFilterGroupComponent, descendants: true, isSignal: true }, { propertyName: "stepper", first: true, predicate: SectionStepperComponent, descendants: true, isSignal: true }, { propertyName: "hero", first: true, predicate: SectionHeroComponent, descendants: true, isSignal: true }, { propertyName: "jumbotron", first: true, predicate: JumbotronComponent, descendants: true, isSignal: true }, { propertyName: "carousel", first: true, predicate: CarouselComponent, descendants: true, isSignal: true }, { propertyName: "footer", first: true, predicate: SectionFooterComponent, descendants: true, isSignal: true }, { propertyName: "pagination", first: true, predicate: SectionPaginationComponent, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: `
17594
- @if (header()) {
17595
- <ng-content select="m-section-header" />
17596
- }
17490
+ ], queries: [{ propertyName: "badges", first: true, predicate: SectionBadgesComponent, descendants: true, isSignal: true }, { propertyName: "toggle", first: true, predicate: SectionToggleComponent, descendants: true, isSignal: true }, { propertyName: "action", first: true, predicate: ActionComponent, descendants: true, isSignal: true }, { propertyName: "back", first: true, predicate: SectionBackComponent, descendants: true, isSignal: true }, { propertyName: "search", first: true, predicate: SectionSearchComponent, descendants: true, isSignal: true }, { propertyName: "filter", first: true, predicate: SectionFilterComponent, descendants: true, isSignal: true }, { propertyName: "filterGroup", first: true, predicate: SectionFilterGroupComponent, descendants: true, isSignal: true }, { propertyName: "stepper", first: true, predicate: SectionStepperComponent, descendants: true, isSignal: true }, { propertyName: "hero", first: true, predicate: SectionHeroComponent, descendants: true, isSignal: true }, { propertyName: "jumbotron", first: true, predicate: JumbotronComponent, descendants: true, isSignal: true }, { propertyName: "carousel", first: true, predicate: CarouselComponent, descendants: true, isSignal: true }, { propertyName: "footer", first: true, predicate: SectionFooterComponent, descendants: true, isSignal: true }, { propertyName: "pagination", first: true, predicate: SectionPaginationComponent, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: `
17491
+ <!-- Ungated, unlike the slots below: the design Canvas draws its header
17492
+ through an ngTemplateOutlet, which a contentChild query never sees. -->
17493
+ <ng-content select="m-section-header" />
17597
17494
  <div
17598
17495
  class="m-section__collapsible"
17599
17496
  [id]="accordion()?.bodyId"
@@ -17647,14 +17544,14 @@ class SectionComponent extends ConfigComponent {
17647
17544
  }
17648
17545
  </div>
17649
17546
  </div>
17650
- `, isInline: true, styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}:host{display:block;width:100%;min-height:var(--m-section-min-height, 5em);container-type:inline-size;container-name:mag-grid;--_section-px: 1rem;--_section-pt: 1.5rem;--_section-pb: 0rem;--_section-header-py: 1rem}:host(.has-max-height){height:var(--m-section-max-height);overflow:auto}:host(.is-with-border){border:var(--m-section-border, 1px solid var(--m-backdrop-border));box-sizing:border-box}:host(.is-sandwich-border){border-block:var(--m-section-border, 1px solid var(--m-backdrop-border));box-sizing:border-box}.m-section__collapsible{display:grid;grid-template-columns:minmax(0,1fr);grid-template-rows:1fr;transition:grid-template-rows .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);opacity:1}.m-section__collapsible.is-collapsed{grid-template-rows:0fr;opacity:0;pointer-events:none}.m-section__collapsible-content{min-height:0;min-width:0;overflow:clip}.m-section__body{display:flex;flex-wrap:wrap;align-content:flex-start;align-items:stretch;max-width:var(--m-section-max-width);margin-inline:auto}:host(.align-left) .m-section__body{margin-inline-start:0;margin-inline-end:auto}:host(.align-right) .m-section__body{margin-inline-start:auto;margin-inline-end:0;justify-content:flex-end}:host(.align-center) .m-section__body{margin-inline:auto;justify-content:center}:host(.align-x-left) .m-section__body{justify-content:flex-start}:host(.align-x-center) .m-section__body{justify-content:center}:host(.align-x-right) .m-section__body{justify-content:flex-end}:host(.align-y-top) .m-section__body{align-items:flex-start;align-content:flex-start}:host(.align-y-center) .m-section__body{align-items:center;align-content:center}:host(.align-y-bottom) .m-section__body{align-items:flex-end;align-content:flex-end}:host(.is-full-height){height:100vh;min-height:100vh;overflow:auto}:host(.is-full-height) .m-section__body{flex:1;height:100%}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
17547
+ `, isInline: true, styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}:host{display:block;width:100%;min-height:var(--m-section-min-height, 5em);container-type:inline-size;container-name:mag-grid;--_section-px: 1rem;--_section-pt: 1.5rem;--_section-pb: 0rem;--_section-header-py: 1rem}:host(.has-max-height){height:var(--m-section-max-height);overflow:auto}:host(.is-with-border){border:var(--m-section-border, 1px solid var(--m-backdrop-border));box-sizing:border-box}:host(.is-sandwich-border){border-block:var(--m-section-border, 1px solid var(--m-backdrop-border));box-sizing:border-box}:host(.is-side-border){border-inline:var(--m-section-border, 1px solid var(--m-backdrop-border));box-sizing:border-box}:host(.is-left-border){border-inline-start:var(--m-section-border, 1px solid var(--m-backdrop-border));box-sizing:border-box}:host(.is-right-border){border-inline-end:var(--m-section-border, 1px solid var(--m-backdrop-border));box-sizing:border-box}.m-section__collapsible{display:grid;grid-template-columns:minmax(0,1fr);grid-template-rows:1fr;transition:grid-template-rows .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);opacity:1}.m-section__collapsible.is-collapsed{grid-template-rows:0fr;opacity:0;pointer-events:none}.m-section__collapsible-content{min-height:0;min-width:0;overflow:clip}.m-section__body{display:flex;flex-wrap:wrap;align-content:flex-start;align-items:stretch;max-width:var(--m-section-max-width);margin-inline:auto}:host(.align-left) .m-section__body{margin-inline-start:0;margin-inline-end:auto}:host(.align-right) .m-section__body{margin-inline-start:auto;margin-inline-end:0;justify-content:flex-end}:host(.align-center) .m-section__body{margin-inline:auto;justify-content:center}:host(.align-x-left) .m-section__body{justify-content:flex-start}:host(.align-x-center) .m-section__body{justify-content:center}:host(.align-x-right) .m-section__body{justify-content:flex-end}:host(.align-y-top) .m-section__body{align-items:flex-start;align-content:flex-start}:host(.align-y-center) .m-section__body{align-items:center;align-content:center}:host(.align-y-bottom) .m-section__body{align-items:flex-end;align-content:flex-end}:host(.is-full-height){height:100vh;min-height:100vh;overflow:auto}:host(.is-full-height) .m-section__body{flex:1;height:100%}:host(.is-full-height) .m-section__collapsible:not(.is-collapsed)>.m-section__collapsible-content{overflow:visible}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
17651
17548
  }
17652
17549
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SectionComponent, decorators: [{
17653
17550
  type: Component,
17654
17551
  args: [{ selector: 'm-section', template: `
17655
- @if (header()) {
17656
- <ng-content select="m-section-header" />
17657
- }
17552
+ <!-- Ungated, unlike the slots below: the design Canvas draws its header
17553
+ through an ngTemplateOutlet, which a contentChild query never sees. -->
17554
+ <ng-content select="m-section-header" />
17658
17555
  <div
17659
17556
  class="m-section__collapsible"
17660
17557
  [id]="accordion()?.bodyId"
@@ -17716,6 +17613,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
17716
17613
  '[class.no-border]': 'resolvedVariant() === "noBorder"',
17717
17614
  '[class.is-with-border]': 'resolvedVariant() === "withBorder"',
17718
17615
  '[class.is-sandwich-border]': 'resolvedVariant() === "sandwichBorder"',
17616
+ '[class.is-side-border]': 'resolvedVariant() === "sideBorder"',
17617
+ '[class.is-left-border]': 'resolvedVariant() === "leftBorder"',
17618
+ '[class.is-right-border]': 'resolvedVariant() === "rightBorder"',
17719
17619
  '[class.align-x-left]': 'resolvedAlignX() === "left"',
17720
17620
  '[class.align-x-center]': 'resolvedAlignX() === "center"',
17721
17621
  '[class.align-x-right]': 'resolvedAlignX() === "right"',
@@ -17751,8 +17651,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
17751
17651
  };
17752
17652
  },
17753
17653
  },
17754
- ], 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%;min-height:var(--m-section-min-height, 5em);container-type:inline-size;container-name:mag-grid;--_section-px: 1rem;--_section-pt: 1.5rem;--_section-pb: 0rem;--_section-header-py: 1rem}:host(.has-max-height){height:var(--m-section-max-height);overflow:auto}:host(.is-with-border){border:var(--m-section-border, 1px solid var(--m-backdrop-border));box-sizing:border-box}:host(.is-sandwich-border){border-block:var(--m-section-border, 1px solid var(--m-backdrop-border));box-sizing:border-box}.m-section__collapsible{display:grid;grid-template-columns:minmax(0,1fr);grid-template-rows:1fr;transition:grid-template-rows .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);opacity:1}.m-section__collapsible.is-collapsed{grid-template-rows:0fr;opacity:0;pointer-events:none}.m-section__collapsible-content{min-height:0;min-width:0;overflow:clip}.m-section__body{display:flex;flex-wrap:wrap;align-content:flex-start;align-items:stretch;max-width:var(--m-section-max-width);margin-inline:auto}:host(.align-left) .m-section__body{margin-inline-start:0;margin-inline-end:auto}:host(.align-right) .m-section__body{margin-inline-start:auto;margin-inline-end:0;justify-content:flex-end}:host(.align-center) .m-section__body{margin-inline:auto;justify-content:center}:host(.align-x-left) .m-section__body{justify-content:flex-start}:host(.align-x-center) .m-section__body{justify-content:center}:host(.align-x-right) .m-section__body{justify-content:flex-end}:host(.align-y-top) .m-section__body{align-items:flex-start;align-content:flex-start}:host(.align-y-center) .m-section__body{align-items:center;align-content:center}:host(.align-y-bottom) .m-section__body{align-items:flex-end;align-content:flex-end}:host(.is-full-height){height:100vh;min-height:100vh;overflow:auto}:host(.is-full-height) .m-section__body{flex:1;height:100%}\n"] }]
17755
- }], ctorParameters: () => [], propDecorators: { header: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SectionHeaderComponent), { isSignal: true }] }], badges: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SectionBadgesComponent), { isSignal: true }] }], toggle: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SectionToggleComponent), { isSignal: true }] }], action: [{ type: i0.ContentChild, args: [i0.forwardRef(() => ActionComponent), { isSignal: true }] }], back: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SectionBackComponent), { isSignal: true }] }], search: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SectionSearchComponent), { isSignal: true }] }], filter: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SectionFilterComponent), { isSignal: true }] }], filterGroup: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SectionFilterGroupComponent), { isSignal: true }] }], stepper: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SectionStepperComponent), { isSignal: true }] }], hero: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SectionHeroComponent), { isSignal: true }] }], jumbotron: [{ type: i0.ContentChild, args: [i0.forwardRef(() => JumbotronComponent), { isSignal: true }] }], carousel: [{ type: i0.ContentChild, args: [i0.forwardRef(() => CarouselComponent), { isSignal: true }] }], footer: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SectionFooterComponent), { isSignal: true }] }], pagination: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SectionPaginationComponent), { isSignal: true }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], maxWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxWidth", required: false }] }], heightMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "heightMode", required: false }] }], maxHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxHeight", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], align: [{ type: i0.Input, args: [{ isSignal: true, alias: "align", required: false }] }], alignX: [{ type: i0.Input, args: [{ isSignal: true, alias: "alignX", required: false }] }], alignY: [{ type: i0.Input, args: [{ isSignal: true, alias: "alignY", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], inView: [{ type: i0.Output, args: ["inView"] }] } });
17654
+ ], 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%;min-height:var(--m-section-min-height, 5em);container-type:inline-size;container-name:mag-grid;--_section-px: 1rem;--_section-pt: 1.5rem;--_section-pb: 0rem;--_section-header-py: 1rem}:host(.has-max-height){height:var(--m-section-max-height);overflow:auto}:host(.is-with-border){border:var(--m-section-border, 1px solid var(--m-backdrop-border));box-sizing:border-box}:host(.is-sandwich-border){border-block:var(--m-section-border, 1px solid var(--m-backdrop-border));box-sizing:border-box}:host(.is-side-border){border-inline:var(--m-section-border, 1px solid var(--m-backdrop-border));box-sizing:border-box}:host(.is-left-border){border-inline-start:var(--m-section-border, 1px solid var(--m-backdrop-border));box-sizing:border-box}:host(.is-right-border){border-inline-end:var(--m-section-border, 1px solid var(--m-backdrop-border));box-sizing:border-box}.m-section__collapsible{display:grid;grid-template-columns:minmax(0,1fr);grid-template-rows:1fr;transition:grid-template-rows .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);opacity:1}.m-section__collapsible.is-collapsed{grid-template-rows:0fr;opacity:0;pointer-events:none}.m-section__collapsible-content{min-height:0;min-width:0;overflow:clip}.m-section__body{display:flex;flex-wrap:wrap;align-content:flex-start;align-items:stretch;max-width:var(--m-section-max-width);margin-inline:auto}:host(.align-left) .m-section__body{margin-inline-start:0;margin-inline-end:auto}:host(.align-right) .m-section__body{margin-inline-start:auto;margin-inline-end:0;justify-content:flex-end}:host(.align-center) .m-section__body{margin-inline:auto;justify-content:center}:host(.align-x-left) .m-section__body{justify-content:flex-start}:host(.align-x-center) .m-section__body{justify-content:center}:host(.align-x-right) .m-section__body{justify-content:flex-end}:host(.align-y-top) .m-section__body{align-items:flex-start;align-content:flex-start}:host(.align-y-center) .m-section__body{align-items:center;align-content:center}:host(.align-y-bottom) .m-section__body{align-items:flex-end;align-content:flex-end}:host(.is-full-height){height:100vh;min-height:100vh;overflow:auto}:host(.is-full-height) .m-section__body{flex:1;height:100%}:host(.is-full-height) .m-section__collapsible:not(.is-collapsed)>.m-section__collapsible-content{overflow:visible}\n"] }]
17655
+ }], ctorParameters: () => [], propDecorators: { badges: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SectionBadgesComponent), { isSignal: true }] }], toggle: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SectionToggleComponent), { isSignal: true }] }], action: [{ type: i0.ContentChild, args: [i0.forwardRef(() => ActionComponent), { isSignal: true }] }], back: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SectionBackComponent), { isSignal: true }] }], search: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SectionSearchComponent), { isSignal: true }] }], filter: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SectionFilterComponent), { isSignal: true }] }], filterGroup: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SectionFilterGroupComponent), { isSignal: true }] }], stepper: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SectionStepperComponent), { isSignal: true }] }], hero: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SectionHeroComponent), { isSignal: true }] }], jumbotron: [{ type: i0.ContentChild, args: [i0.forwardRef(() => JumbotronComponent), { isSignal: true }] }], carousel: [{ type: i0.ContentChild, args: [i0.forwardRef(() => CarouselComponent), { isSignal: true }] }], footer: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SectionFooterComponent), { isSignal: true }] }], pagination: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SectionPaginationComponent), { isSignal: true }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], maxWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxWidth", required: false }] }], heightMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "heightMode", required: false }] }], maxHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxHeight", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], align: [{ type: i0.Input, args: [{ isSignal: true, alias: "align", required: false }] }], alignX: [{ type: i0.Input, args: [{ isSignal: true, alias: "alignX", required: false }] }], alignY: [{ type: i0.Input, args: [{ isSignal: true, alias: "alignY", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], inView: [{ type: i0.Output, args: ["inView"] }] } });
17756
17656
 
17757
17657
  class UserApiService {
17758
17658
  http = inject(HttpService);
@@ -19619,25 +19519,166 @@ class RowComponent extends ConfigComponent {
19619
19519
  }, ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
19620
19520
  sectionContext = inject(SECTION_CONTEXT, { optional: true });
19621
19521
  noBorder = computed(() => this.sectionContext?.variant() === 'noBorder', ...(ngDevMode ? [{ debugName: "noBorder" }] : /* istanbul ignore next */ []));
19622
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RowComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
19623
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.9", type: RowComponent, isStandalone: true, selector: "m-row", inputs: { padding: { classPropertyName: "padding", publicName: "padding", isSignal: true, isRequired: false, transformFunction: null }, paddingX: { classPropertyName: "paddingX", publicName: "paddingX", isSignal: true, isRequired: false, transformFunction: null }, paddingY: { classPropertyName: "paddingY", publicName: "paddingY", isSignal: true, isRequired: false, transformFunction: null }, maxWidth: { classPropertyName: "maxWidth", publicName: "maxWidth", isSignal: true, isRequired: false, transformFunction: null }, center: { classPropertyName: "center", publicName: "center", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "style.--m-row-max-width": "resolvedMaxWidth()" }, classAttribute: "m-row" }, usesInheritance: true, ngImport: i0, template: `
19624
- <div class="m-row__body">
19625
- <ng-content />
19626
- </div>
19627
- `, isInline: true, styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}:host{display:block;grid-column:span 12;width:100%;box-sizing:border-box;border-bottom:1px solid var(--m-backdrop-border);min-height:5em}:host(.no-border){border-bottom:none}:host-context(.is-with-border):last-child,:host-context(.is-sandwich-border):last-child{border-bottom:none}:host.has-padding-y{padding-block:var(--m-row-py, var(--section-pt, var(--_section-pt, 1.5rem)))}.m-row__body{display:flex;flex-wrap:wrap;align-content:flex-start;max-width:var(--m-row-max-width);margin-inline:auto}:host.has-padding-x .m-row__body{padding-inline:var(--m-row-px, var(--section-px, var(--_section-px, 1rem)))}:host.is-center .m-row__body{display:flex;justify-content:center;align-items:center}:host(.align-left) .m-row__body{margin-inline-start:0;margin-inline-end:auto}:host(.align-right) .m-row__body{margin-inline-start:auto;margin-inline-end:0;justify-content:flex-end}:host(.align-center) .m-row__body{margin-inline:auto;justify-content:center}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
19522
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RowComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
19523
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.9", type: RowComponent, isStandalone: true, selector: "m-row", inputs: { padding: { classPropertyName: "padding", publicName: "padding", isSignal: true, isRequired: false, transformFunction: null }, paddingX: { classPropertyName: "paddingX", publicName: "paddingX", isSignal: true, isRequired: false, transformFunction: null }, paddingY: { classPropertyName: "paddingY", publicName: "paddingY", isSignal: true, isRequired: false, transformFunction: null }, maxWidth: { classPropertyName: "maxWidth", publicName: "maxWidth", isSignal: true, isRequired: false, transformFunction: null }, center: { classPropertyName: "center", publicName: "center", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "style.--m-row-max-width": "resolvedMaxWidth()" }, classAttribute: "m-row" }, usesInheritance: true, ngImport: i0, template: `
19524
+ <div class="m-row__body">
19525
+ <ng-content />
19526
+ </div>
19527
+ `, isInline: true, styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}:host{display:block;grid-column:span 12;width:100%;box-sizing:border-box;border-bottom:1px solid var(--m-backdrop-border);min-height:5em}:host(.no-border){border-bottom:none}:host-context(.is-with-border):last-child,:host-context(.is-sandwich-border):last-child{border-bottom:none}:host.has-padding-y{padding-block:var(--m-row-py, var(--section-pt, var(--_section-pt, 1.5rem)))}.m-row__body{display:flex;flex-wrap:wrap;align-content:flex-start;max-width:var(--m-row-max-width);margin-inline:auto}:host.has-padding-x .m-row__body{padding-inline:var(--m-row-px, var(--section-px, var(--_section-px, 1rem)))}:host.is-center .m-row__body{display:flex;justify-content:center;align-items:center}:host(.align-left) .m-row__body{margin-inline-start:0;margin-inline-end:auto}:host(.align-right) .m-row__body{margin-inline-start:auto;margin-inline-end:0;justify-content:flex-end}:host(.align-center) .m-row__body{margin-inline:auto;justify-content:center}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
19528
+ }
19529
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RowComponent, decorators: [{
19530
+ type: Component,
19531
+ args: [{ selector: 'm-row', template: `
19532
+ <div class="m-row__body">
19533
+ <ng-content />
19534
+ </div>
19535
+ `, changeDetection: ChangeDetectionStrategy.OnPush, host: {
19536
+ class: 'm-row',
19537
+ '[class]': 'classes()',
19538
+ '[style.--m-row-max-width]': 'resolvedMaxWidth()',
19539
+ }, 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;grid-column:span 12;width:100%;box-sizing:border-box;border-bottom:1px solid var(--m-backdrop-border);min-height:5em}:host(.no-border){border-bottom:none}:host-context(.is-with-border):last-child,:host-context(.is-sandwich-border):last-child{border-bottom:none}:host.has-padding-y{padding-block:var(--m-row-py, var(--section-pt, var(--_section-pt, 1.5rem)))}.m-row__body{display:flex;flex-wrap:wrap;align-content:flex-start;max-width:var(--m-row-max-width);margin-inline:auto}:host.has-padding-x .m-row__body{padding-inline:var(--m-row-px, var(--section-px, var(--_section-px, 1rem)))}:host.is-center .m-row__body{display:flex;justify-content:center;align-items:center}:host(.align-left) .m-row__body{margin-inline-start:0;margin-inline-end:auto}:host(.align-right) .m-row__body{margin-inline-start:auto;margin-inline-end:0;justify-content:flex-end}:host(.align-center) .m-row__body{margin-inline:auto;justify-content:center}\n"] }]
19540
+ }], propDecorators: { padding: [{ type: i0.Input, args: [{ isSignal: true, alias: "padding", required: false }] }], paddingX: [{ type: i0.Input, args: [{ isSignal: true, alias: "paddingX", required: false }] }], paddingY: [{ type: i0.Input, args: [{ isSignal: true, alias: "paddingY", required: false }] }], maxWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxWidth", required: false }] }], center: [{ type: i0.Input, args: [{ isSignal: true, alias: "center", required: false }] }] } });
19541
+
19542
+ // The line box each heading level draws, straight from `header.sass`: its font
19543
+ // size and its line-height. The icon beside a heading is boxed to the same
19544
+ // span so the two centre on one another — `--m-header-font-size` is read
19545
+ // first, so a caller resizing the heading moves the icon's box with it.
19546
+ const HEADER_LINE_BOX = {
19547
+ 1: 'calc(var(--m-header-font-size, 2.25rem) * 1.15)',
19548
+ 2: 'calc(var(--m-header-font-size, 1.75rem) * 1.2)',
19549
+ 3: 'calc(var(--m-header-font-size, 1.375rem) * 1.1)',
19550
+ 4: 'calc(var(--m-header-font-size, 1.125rem) * 1.1)',
19551
+ 5: 'calc(var(--m-header-font-size, 1rem) * 1.1)',
19552
+ 6: 'calc(var(--m-header-font-size, 0.875rem) * 1.1)',
19553
+ };
19554
+ class SectionHeaderComponent {
19555
+ sticky = input(false, ...(ngDevMode ? [{ debugName: "sticky" }] : /* istanbul ignore next */ []));
19556
+ level = input(3, ...(ngDevMode ? [{ debugName: "level" }] : /* istanbul ignore next */ []));
19557
+ label = input(...(ngDevMode ? [undefined, { debugName: "label" }] : /* istanbul ignore next */ []));
19558
+ subLabel = input(...(ngDevMode ? [undefined, { debugName: "subLabel" }] : /* istanbul ignore next */ []));
19559
+ // `label` and `subLabel` are authored text rather than translation keys —
19560
+ // forwarded to `m-header` for the label, and skipping `translate` for the
19561
+ // sub. What a bound label needs above all: a value read from data is the
19562
+ // text itself, and resolving it as a key renders nothing.
19563
+ noTranslate = input(false, ...(ngDevMode ? [{ debugName: "noTranslate" }] : /* istanbul ignore next */ []));
19564
+ // The [MessageVariable] values both lines are resolved with — one record for
19565
+ // the pair, because a page holds one record for every dynamic slot it draws
19566
+ // (m-one-ui ADR 0066) and two headings naming the same slot mean the same
19567
+ // datum. Ignored under `noTranslate`, where neither line is looked up.
19568
+ params = input(undefined, ...(ngDevMode ? [{ debugName: "params" }] : /* istanbul ignore next */ []));
19569
+ // Draw the sub line above the label instead of below it. The two nodes keep
19570
+ // their order — title first, sub second — whichever way the pair reads, so
19571
+ // reversing is a setting rather than a second way to arrange the children.
19572
+ reverse = input(false, ...(ngDevMode ? [{ debugName: "reverse" }] : /* istanbul ignore next */ []));
19573
+ icon = input(...(ngDevMode ? [undefined, { debugName: "icon" }] : /* istanbul ignore next */ []));
19574
+ menu = input(...(ngDevMode ? [undefined, { debugName: "menu" }] : /* istanbul ignore next */ []));
19575
+ menuName = input(...(ngDevMode ? [undefined, { debugName: "menuName" }] : /* istanbul ignore next */ []));
19576
+ visibilityRule = input(...(ngDevMode ? [undefined, { debugName: "visibilityRule" }] : /* istanbul ignore next */ []));
19577
+ disableRule = input(...(ngDevMode ? [undefined, { debugName: "disableRule" }] : /* istanbul ignore next */ []));
19578
+ extraData = input(...(ngDevMode ? [undefined, { debugName: "extraData" }] : /* istanbul ignore next */ []));
19579
+ align = input(undefined, ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
19580
+ // The header's own `align` alone. A Section's `align` places boxes — its
19581
+ // body box, and the header's content box below — and a header whose text
19582
+ // followed it could not be left-aligned inside a centred Section at all.
19583
+ alignment = computed(() => this.align() ?? 'left', ...(ngDevMode ? [{ debugName: "alignment" }] : /* istanbul ignore next */ []));
19584
+ showBack = input(false, ...(ngDevMode ? [{ debugName: "showBack" }] : /* istanbul ignore next */ []));
19585
+ actionButton = input(...(ngDevMode ? [undefined, { debugName: "actionButton" }] : /* istanbul ignore next */ []));
19586
+ // The action Button's accessible name — it renders icon-only, so without a
19587
+ // label a screen reader has nothing to announce.
19588
+ actionLabel = input(...(ngDevMode ? [undefined, { debugName: "actionLabel" }] : /* istanbul ignore next */ []));
19589
+ spacing = input(false, ...(ngDevMode ? [{ debugName: "spacing" }] : /* istanbul ignore next */ []));
19590
+ maxWidth = input(...(ngDevMode ? [undefined, { debugName: "maxWidth" }] : /* istanbul ignore next */ []));
19591
+ actionClick = output();
19592
+ action = output();
19593
+ back = output();
19594
+ translateService = inject(TranslateService);
19595
+ // A computed rather than the impure TranslatePipe, the same trade
19596
+ // HeaderComponent makes: one lookup per sub change instead of one per
19597
+ // change-detection tick, and it still repaints when the language moves.
19598
+ subText = computed(() => this.noTranslate()
19599
+ ? this.subLabel()
19600
+ : this.translateService.translate(this.subLabel(), this.params()), ...(ngDevMode ? [{ debugName: "subText" }] : /* istanbul ignore next */ []));
19601
+ scrollSticky = injectScrollSticky(120, 'none');
19602
+ sectionContext = inject(SECTION_CONTEXT, { optional: true });
19603
+ sidepanel = computed(() => this.sectionContext?.sidepanel() ?? false, ...(ngDevMode ? [{ debugName: "sidepanel" }] : /* istanbul ignore next */ []));
19604
+ noBorder = computed(() => this.sectionContext?.variant() === 'noBorder', ...(ngDevMode ? [{ debugName: "noBorder" }] : /* istanbul ignore next */ []));
19605
+ // Falls back to the Section's `maxWidth`: the header sits above the body and
19606
+ // the two are one column, so constraining the body alone left the heading
19607
+ // hanging off the edge of the content it titles. The border stays on the
19608
+ // host and keeps spanning the Section — only this inner box narrows.
19609
+ resolvedMaxWidth = computed(() => this.maxWidth() ?? this.sectionContext?.maxWidth?.(), ...(ngDevMode ? [{ debugName: "resolvedMaxWidth" }] : /* istanbul ignore next */ []));
19610
+ // Where that box sits once it is narrower than the row. The Section's
19611
+ // `align` — the same value that places `.m-section__body` — so header and
19612
+ // body stay in one column.
19613
+ boxAlign = computed(() => this.sectionContext?.align?.() ?? 'left', ...(ngDevMode ? [{ debugName: "boxAlign" }] : /* istanbul ignore next */ []));
19614
+ // The icon sits in the row, not in the heading, so it has no line box of its
19615
+ // own to centre against — it gets the heading's.
19616
+ iconBox = computed(() => HEADER_LINE_BOX[this.level()], ...(ngDevMode ? [{ debugName: "iconBox" }] : /* istanbul ignore next */ []));
19617
+ isSticky = computed(() => this.sticky() && this.scrollSticky(), ...(ngDevMode ? [{ debugName: "isSticky" }] : /* istanbul ignore next */ []));
19618
+ hasMenu = computed(() => !!this.menu() || !!this.menuName(), ...(ngDevMode ? [{ debugName: "hasMenu" }] : /* istanbul ignore next */ []));
19619
+ actionConfig = computed(() => {
19620
+ const icon = this.actionButton();
19621
+ if (!icon)
19622
+ return undefined;
19623
+ return {
19624
+ icon,
19625
+ label: this.actionLabel(),
19626
+ iconOnly: true,
19627
+ variant: 'ghost',
19628
+ };
19629
+ }, ...(ngDevMode ? [{ debugName: "actionConfig" }] : /* istanbul ignore next */ []));
19630
+ // Read through SECTION_CONTEXT rather than by injecting the directive:
19631
+ // every `<m-section>` provides the context, so the nearest one wins and a
19632
+ // header only ever draws the toggle of the Section it belongs to. Injecting
19633
+ // SectionAccordionDirective instead walks past that Section to any ancestor
19634
+ // carrying the behaviour, which put an arrow on every nested header. Null
19635
+ // where the Section has no active accordion (CONTEXT.md SectionAccordion).
19636
+ accordion = computed(() => this.sectionContext?.accordion?.() ?? null, ...(ngDevMode ? [{ debugName: "accordion" }] : /* istanbul ignore next */ []));
19637
+ // toggleIcon set: the glyph itself swaps between closed/open, already
19638
+ // "pointing" the right way, so it never rotates. toggleIcon absent: the
19639
+ // one glyph (icon, or the default chevron) rotates 180° instead.
19640
+ toggleIconName = computed(() => {
19641
+ const accordion = this.accordion();
19642
+ if (!accordion)
19643
+ return undefined;
19644
+ const toggleIcon = accordion.toggleIcon();
19645
+ if (toggleIcon) {
19646
+ return accordion.isOpen() ? toggleIcon : accordion.icon() ?? 'accordion_chevron';
19647
+ }
19648
+ return accordion.icon() ?? 'accordion_chevron';
19649
+ }, ...(ngDevMode ? [{ debugName: "toggleIconName" }] : /* istanbul ignore next */ []));
19650
+ toggleRotates = computed(() => !this.accordion()?.toggleIcon(), ...(ngDevMode ? [{ debugName: "toggleRotates" }] : /* istanbul ignore next */ []));
19651
+ onToggleClick() {
19652
+ this.accordion()?.toggle();
19653
+ }
19654
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SectionHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
19655
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: SectionHeaderComponent, isStandalone: true, selector: "m-section-header", inputs: { sticky: { classPropertyName: "sticky", publicName: "sticky", isSignal: true, isRequired: false, transformFunction: null }, level: { classPropertyName: "level", publicName: "level", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, subLabel: { classPropertyName: "subLabel", publicName: "subLabel", isSignal: true, isRequired: false, transformFunction: null }, noTranslate: { classPropertyName: "noTranslate", publicName: "noTranslate", isSignal: true, isRequired: false, transformFunction: null }, params: { classPropertyName: "params", publicName: "params", isSignal: true, isRequired: false, transformFunction: null }, reverse: { classPropertyName: "reverse", publicName: "reverse", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, menu: { classPropertyName: "menu", publicName: "menu", isSignal: true, isRequired: false, transformFunction: null }, menuName: { classPropertyName: "menuName", publicName: "menuName", isSignal: true, isRequired: false, transformFunction: null }, visibilityRule: { classPropertyName: "visibilityRule", publicName: "visibilityRule", isSignal: true, isRequired: false, transformFunction: null }, disableRule: { classPropertyName: "disableRule", publicName: "disableRule", isSignal: true, isRequired: false, transformFunction: null }, extraData: { classPropertyName: "extraData", publicName: "extraData", isSignal: true, isRequired: false, transformFunction: null }, align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, showBack: { classPropertyName: "showBack", publicName: "showBack", isSignal: true, isRequired: false, transformFunction: null }, actionButton: { classPropertyName: "actionButton", publicName: "actionButton", isSignal: true, isRequired: false, transformFunction: null }, actionLabel: { classPropertyName: "actionLabel", publicName: "actionLabel", isSignal: true, isRequired: false, transformFunction: null }, spacing: { classPropertyName: "spacing", publicName: "spacing", isSignal: true, isRequired: false, transformFunction: null }, maxWidth: { classPropertyName: "maxWidth", publicName: "maxWidth", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { actionClick: "actionClick", action: "action", back: "back" }, host: { properties: { "class.is-sticky-enabled": "sticky()", "class.is-sticky": "isSticky()", "class.has-menu": "hasMenu()", "class.align-left": "alignment() === \"left\"", "class.align-center": "alignment() === \"center\"", "class.align-right": "alignment() === \"right\"", "class.has-sidepanel": "sidepanel()", "class.no-border": "noBorder()", "class.spacing": "spacing()", "class.box-center": "boxAlign() === \"center\"", "class.box-right": "boxAlign() === \"right\"", "style.--m-section-header-max-width": "resolvedMaxWidth()", "style.--m-section-header-icon-box": "iconBox()" }, classAttribute: "m-section-header" }, ngImport: i0, template: "<!-- One declaration of the row, rendered by whichever branch `spacing` picks.\n Hoisted into a template rather than written twice: an `<ng-content>` may\n appear once per selector in a component, so the duplicated copy caught\n nothing and a header projecting a title rendered it in the `spacing`\n branch alone. -->\n<ng-template #body>\n @if (accordion(); as accordionRef) {\n <div\n class=\"section-header__toggle\"\n [class.section-header__toggle--rotate]=\"toggleRotates()\"\n [class.section-header__toggle--open]=\"accordionRef.isOpen()\"\n [id]=\"accordionRef.headerId\"\n [attr.aria-expanded]=\"accordionRef.isOpen()\"\n [attr.aria-controls]=\"accordionRef.bodyId\"\n >\n <m-button\n [config]=\"{ icon: toggleIconName(), iconOnly: true, variant: 'ghost' }\"\n (clicked)=\"onToggleClick()\" />\n </div>\n }\n @if (showBack()) {\n <div class=\"section-header__back\">\n <m-button\n [config]=\"{ icon: 'chevron-left', iconOnly: true }\"\n (clicked)=\"back.emit()\" />\n </div>\n } @else if (!label() && icon(); as iconName) {\n <!-- Only where no label is written. A header with one hands the icon to\n `m-header`, which draws it inside the heading's line box and so on the\n heading's own centre line. Beside a projected title there is no such\n box to borrow, so the glyph is boxed to the level's line box here and\n centred in it \u2014 otherwise it centres against the whole title column,\n which on the Canvas is the label slot's drop rect stacked above the\n heading. -->\n <div class=\"section-header__icon\">\n <m-icon [name]=\"iconName\" />\n </div>\n }\n <div\n class=\"section-header__title\"\n [class.section-header__title--reverse]=\"reverse()\"\n >\n <!-- The title slot is the catch-all rather than a `[label]` one: every\n header already projecting a heading writes it unselected, and a\n selector here would drop that content on the floor. What the design\n page emits \u2014 `<span label>` \u2014 is caught by it too, nothing else\n claiming the node. -->\n <ng-content />\n <!-- The written label, drawn beside the slot rather than as its\n `ng-content` fallback. A fallback renders only while *nothing* is\n projected, and the design Canvas always projects the slot span \u2014\n empty until a Control is dropped in it \u2014 so a fallback there would\n blank the label a header is still configured with. `label` answers\n instead, which no header projecting a title sets. -->\n @if (label()) {\n <m-header\n [level]=\"level()\"\n [label]=\"label()\"\n [icon]=\"icon()\"\n [params]=\"params()\"\n [noTranslate]=\"noTranslate()\" />\n }\n @if (subText(); as sub) {\n <span class=\"section-header__sub\">{{ sub }}</span>\n }\n </div>\n <!-- A FilterGroup projected into the header row, selected by tag rather than\n by an attribute \u2014 the same shape a Section catches its `m-action` with.\n A header has room for one icon and not for a row, so a group landing\n here is squeezed by placement (ADR 0025); nothing here enforces that,\n the caller binding `[squeeze]` on the tag it projects. -->\n <div class=\"section-header__filters\">\n <ng-content select=\"m-section-filter-group\" />\n </div>\n @if (actionConfig(); as action) {\n <div class=\"section-header__action\">\n <m-button [config]=\"action\" (clicked)=\"actionClick.emit()\" />\n </div>\n }\n @if (hasMenu()) {\n <div class=\"section-header__menu\">\n <m-context-menu\n [config]=\"menu()\"\n [name]=\"menuName()\"\n [visibilityRule]=\"visibilityRule()\"\n [disableRule]=\"disableRule()\"\n [extraData]=\"extraData()\"\n (action)=\"action.emit($event)\"\n />\n </div>\n }\n</ng-template>\n\n<!-- Always the same two boxes, whether or not a `maxWidth` is in force. The\n border and the sticky backdrop live on the host and keep spanning the\n Section's full width; only this container narrows and is placed by the\n Section's `align`, so the heading lines up with the body under it. -->\n<div class=\"section-header__container\">\n <div class=\"section-header__inner\">\n <ng-container [ngTemplateOutlet]=\"body\" />\n </div>\n</div>\n", styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}:host{display:flex;align-items:center;gap:.5rem;min-height:var(--section-header-min-height, calc(var(--section-header-py, .5rem) * 2 + 1.25rem));border-bottom:1px solid var(--m-backdrop-border);padding:var(--section-header-py, .85rem) var(--section-px, 1rem);width:100%;grid-column:1/-1}:host(.no-border){border-bottom:none}:host(.spacing){padding:0;width:100%}.section-header__container{width:100%;min-width:0;max-width:var(--m-section-header-max-width, none);margin-inline:0 auto}:host(.box-center) .section-header__container{margin-inline:auto}:host(.box-right) .section-header__container{margin-inline:auto 0}.section-header__inner{display:flex;align-items:center;gap:.5rem;width:100%;min-width:0}.section-header__inner .section-header__title{flex:1;min-width:0;gap:.5rem}:host(.spacing) .section-header__inner{padding:1rem 1.5rem}:host(.has-sidepanel){padding-right:50px}:host(.has-sidepanel.has-menu){padding-right:50px}:host(.spacing.has-sidepanel) .section-header__inner{padding-right:calc(1.5rem + 50px)}:host(.is-sticky-enabled){position:sticky;top:0;z-index:10}:host(.is-sticky-enabled){background:color-mix(in srgb,var(--m-background) 80%,transparent);backdrop-filter:blur(16px) saturate(180%);-webkit-backdrop-filter:blur(16px) saturate(180%)}.section-header__toggle{display:flex;flex-shrink:0}.section-header__toggle.section-header__toggle--rotate m-button{display:flex;transition:transform .3s cubic-bezier(.4,0,.2,1)}.section-header__toggle.section-header__toggle--rotate.section-header__toggle--open m-button{transform:rotate(180deg)}.section-header__title{flex:1;min-width:0;display:flex;flex-direction:column;gap:.1rem}m-header{min-width:0}.section-header__title--reverse{flex-direction:column-reverse}.section-header__sub{font-size:.8rem;color:var(--m-text-secondary);line-height:1.2}:host(.align-center){--m-header-justify: center}:host(.align-right){--m-header-justify: flex-end}:host(.has-menu){padding-right:0}:host(.spacing.has-menu) .section-header__inner{padding-right:0}.section-header__filters{display:contents}.section-header__filters m-section-filter-group{width:auto;flex-shrink:0;border-bottom:none}.section-header__back{display:flex;align-items:center;flex-shrink:0}.section-header__icon{display:flex;align-items:center;justify-content:center;flex-shrink:0;align-self:flex-start;height:var(--m-section-header-icon-box, 1.5125rem)}.section-header__menu,.section-header__action{margin-left:auto;flex-shrink:0;display:flex;align-items:center}.section-header__action+.section-header__menu{margin-left:0}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ContextMenuComponent, selector: "m-context-menu, m-one-context-menu", inputs: ["toggle", "remote", "exclude", "visibilityRule", "disableRule", "extraData", "inverted", "options"], outputs: ["toggleChange", "action"] }, { kind: "component", type: HeaderComponent$1, selector: "m-header", inputs: ["level", "label", "icon", "actionButton", "actionLabel", "noTranslate", "params"], outputs: ["actionClick"] }, { kind: "component", type: IconComponent, selector: "m-icon, m-one-icon", inputs: ["config", "name", "color", "size", "one", "baseUrl", "remote"], outputs: ["configChange"] }, { kind: "component", type: ButtonComponent, selector: "m-button,m-one-button", inputs: ["config", "color", "labelClass", "fullWidth", "nav", "navParams", "href", "disabled", "variant", "name", "baseUrl", "one", "remote", "label", "noTranslate", "params", "noNative", "icon", "isRightIcon", "iconOnly", "stacked", "imgSrc", "nonClickable", "inverted", "isSubmit", "tabindex"], outputs: ["configChange", "clicked"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
19628
19656
  }
19629
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RowComponent, decorators: [{
19657
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SectionHeaderComponent, decorators: [{
19630
19658
  type: Component,
19631
- args: [{ selector: 'm-row', template: `
19632
- <div class="m-row__body">
19633
- <ng-content />
19634
- </div>
19635
- `, changeDetection: ChangeDetectionStrategy.OnPush, host: {
19636
- class: 'm-row',
19637
- '[class]': 'classes()',
19638
- '[style.--m-row-max-width]': 'resolvedMaxWidth()',
19639
- }, 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;grid-column:span 12;width:100%;box-sizing:border-box;border-bottom:1px solid var(--m-backdrop-border);min-height:5em}:host(.no-border){border-bottom:none}:host-context(.is-with-border):last-child,:host-context(.is-sandwich-border):last-child{border-bottom:none}:host.has-padding-y{padding-block:var(--m-row-py, var(--section-pt, var(--_section-pt, 1.5rem)))}.m-row__body{display:flex;flex-wrap:wrap;align-content:flex-start;max-width:var(--m-row-max-width);margin-inline:auto}:host.has-padding-x .m-row__body{padding-inline:var(--m-row-px, var(--section-px, var(--_section-px, 1rem)))}:host.is-center .m-row__body{display:flex;justify-content:center;align-items:center}:host(.align-left) .m-row__body{margin-inline-start:0;margin-inline-end:auto}:host(.align-right) .m-row__body{margin-inline-start:auto;margin-inline-end:0;justify-content:flex-end}:host(.align-center) .m-row__body{margin-inline:auto;justify-content:center}\n"] }]
19640
- }], propDecorators: { padding: [{ type: i0.Input, args: [{ isSignal: true, alias: "padding", required: false }] }], paddingX: [{ type: i0.Input, args: [{ isSignal: true, alias: "paddingX", required: false }] }], paddingY: [{ type: i0.Input, args: [{ isSignal: true, alias: "paddingY", required: false }] }], maxWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxWidth", required: false }] }], center: [{ type: i0.Input, args: [{ isSignal: true, alias: "center", required: false }] }] } });
19659
+ args: [{ selector: 'm-section-header', imports: [
19660
+ NgTemplateOutlet,
19661
+ ContextMenuComponent,
19662
+ HeaderComponent$1,
19663
+ IconComponent,
19664
+ ButtonComponent,
19665
+ ], changeDetection: ChangeDetectionStrategy.OnPush, host: {
19666
+ class: 'm-section-header',
19667
+ '[class.is-sticky-enabled]': 'sticky()',
19668
+ '[class.is-sticky]': 'isSticky()',
19669
+ '[class.has-menu]': 'hasMenu()',
19670
+ '[class.align-left]': 'alignment() === "left"',
19671
+ '[class.align-center]': 'alignment() === "center"',
19672
+ '[class.align-right]': 'alignment() === "right"',
19673
+ '[class.has-sidepanel]': 'sidepanel()',
19674
+ '[class.no-border]': 'noBorder()',
19675
+ '[class.spacing]': 'spacing()',
19676
+ '[class.box-center]': 'boxAlign() === "center"',
19677
+ '[class.box-right]': 'boxAlign() === "right"',
19678
+ '[style.--m-section-header-max-width]': 'resolvedMaxWidth()',
19679
+ '[style.--m-section-header-icon-box]': 'iconBox()',
19680
+ }, template: "<!-- One declaration of the row, rendered by whichever branch `spacing` picks.\n Hoisted into a template rather than written twice: an `<ng-content>` may\n appear once per selector in a component, so the duplicated copy caught\n nothing and a header projecting a title rendered it in the `spacing`\n branch alone. -->\n<ng-template #body>\n @if (accordion(); as accordionRef) {\n <div\n class=\"section-header__toggle\"\n [class.section-header__toggle--rotate]=\"toggleRotates()\"\n [class.section-header__toggle--open]=\"accordionRef.isOpen()\"\n [id]=\"accordionRef.headerId\"\n [attr.aria-expanded]=\"accordionRef.isOpen()\"\n [attr.aria-controls]=\"accordionRef.bodyId\"\n >\n <m-button\n [config]=\"{ icon: toggleIconName(), iconOnly: true, variant: 'ghost' }\"\n (clicked)=\"onToggleClick()\" />\n </div>\n }\n @if (showBack()) {\n <div class=\"section-header__back\">\n <m-button\n [config]=\"{ icon: 'chevron-left', iconOnly: true }\"\n (clicked)=\"back.emit()\" />\n </div>\n } @else if (!label() && icon(); as iconName) {\n <!-- Only where no label is written. A header with one hands the icon to\n `m-header`, which draws it inside the heading's line box and so on the\n heading's own centre line. Beside a projected title there is no such\n box to borrow, so the glyph is boxed to the level's line box here and\n centred in it \u2014 otherwise it centres against the whole title column,\n which on the Canvas is the label slot's drop rect stacked above the\n heading. -->\n <div class=\"section-header__icon\">\n <m-icon [name]=\"iconName\" />\n </div>\n }\n <div\n class=\"section-header__title\"\n [class.section-header__title--reverse]=\"reverse()\"\n >\n <!-- The title slot is the catch-all rather than a `[label]` one: every\n header already projecting a heading writes it unselected, and a\n selector here would drop that content on the floor. What the design\n page emits \u2014 `<span label>` \u2014 is caught by it too, nothing else\n claiming the node. -->\n <ng-content />\n <!-- The written label, drawn beside the slot rather than as its\n `ng-content` fallback. A fallback renders only while *nothing* is\n projected, and the design Canvas always projects the slot span \u2014\n empty until a Control is dropped in it \u2014 so a fallback there would\n blank the label a header is still configured with. `label` answers\n instead, which no header projecting a title sets. -->\n @if (label()) {\n <m-header\n [level]=\"level()\"\n [label]=\"label()\"\n [icon]=\"icon()\"\n [params]=\"params()\"\n [noTranslate]=\"noTranslate()\" />\n }\n @if (subText(); as sub) {\n <span class=\"section-header__sub\">{{ sub }}</span>\n }\n </div>\n <!-- A FilterGroup projected into the header row, selected by tag rather than\n by an attribute \u2014 the same shape a Section catches its `m-action` with.\n A header has room for one icon and not for a row, so a group landing\n here is squeezed by placement (ADR 0025); nothing here enforces that,\n the caller binding `[squeeze]` on the tag it projects. -->\n <div class=\"section-header__filters\">\n <ng-content select=\"m-section-filter-group\" />\n </div>\n @if (actionConfig(); as action) {\n <div class=\"section-header__action\">\n <m-button [config]=\"action\" (clicked)=\"actionClick.emit()\" />\n </div>\n }\n @if (hasMenu()) {\n <div class=\"section-header__menu\">\n <m-context-menu\n [config]=\"menu()\"\n [name]=\"menuName()\"\n [visibilityRule]=\"visibilityRule()\"\n [disableRule]=\"disableRule()\"\n [extraData]=\"extraData()\"\n (action)=\"action.emit($event)\"\n />\n </div>\n }\n</ng-template>\n\n<!-- Always the same two boxes, whether or not a `maxWidth` is in force. The\n border and the sticky backdrop live on the host and keep spanning the\n Section's full width; only this container narrows and is placed by the\n Section's `align`, so the heading lines up with the body under it. -->\n<div class=\"section-header__container\">\n <div class=\"section-header__inner\">\n <ng-container [ngTemplateOutlet]=\"body\" />\n </div>\n</div>\n", styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}:host{display:flex;align-items:center;gap:.5rem;min-height:var(--section-header-min-height, calc(var(--section-header-py, .5rem) * 2 + 1.25rem));border-bottom:1px solid var(--m-backdrop-border);padding:var(--section-header-py, .85rem) var(--section-px, 1rem);width:100%;grid-column:1/-1}:host(.no-border){border-bottom:none}:host(.spacing){padding:0;width:100%}.section-header__container{width:100%;min-width:0;max-width:var(--m-section-header-max-width, none);margin-inline:0 auto}:host(.box-center) .section-header__container{margin-inline:auto}:host(.box-right) .section-header__container{margin-inline:auto 0}.section-header__inner{display:flex;align-items:center;gap:.5rem;width:100%;min-width:0}.section-header__inner .section-header__title{flex:1;min-width:0;gap:.5rem}:host(.spacing) .section-header__inner{padding:1rem 1.5rem}:host(.has-sidepanel){padding-right:50px}:host(.has-sidepanel.has-menu){padding-right:50px}:host(.spacing.has-sidepanel) .section-header__inner{padding-right:calc(1.5rem + 50px)}:host(.is-sticky-enabled){position:sticky;top:0;z-index:10}:host(.is-sticky-enabled){background:color-mix(in srgb,var(--m-background) 80%,transparent);backdrop-filter:blur(16px) saturate(180%);-webkit-backdrop-filter:blur(16px) saturate(180%)}.section-header__toggle{display:flex;flex-shrink:0}.section-header__toggle.section-header__toggle--rotate m-button{display:flex;transition:transform .3s cubic-bezier(.4,0,.2,1)}.section-header__toggle.section-header__toggle--rotate.section-header__toggle--open m-button{transform:rotate(180deg)}.section-header__title{flex:1;min-width:0;display:flex;flex-direction:column;gap:.1rem}m-header{min-width:0}.section-header__title--reverse{flex-direction:column-reverse}.section-header__sub{font-size:.8rem;color:var(--m-text-secondary);line-height:1.2}:host(.align-center){--m-header-justify: center}:host(.align-right){--m-header-justify: flex-end}:host(.has-menu){padding-right:0}:host(.spacing.has-menu) .section-header__inner{padding-right:0}.section-header__filters{display:contents}.section-header__filters m-section-filter-group{width:auto;flex-shrink:0;border-bottom:none}.section-header__back{display:flex;align-items:center;flex-shrink:0}.section-header__icon{display:flex;align-items:center;justify-content:center;flex-shrink:0;align-self:flex-start;height:var(--m-section-header-icon-box, 1.5125rem)}.section-header__menu,.section-header__action{margin-left:auto;flex-shrink:0;display:flex;align-items:center}.section-header__action+.section-header__menu{margin-left:0}\n"] }]
19681
+ }], propDecorators: { sticky: [{ type: i0.Input, args: [{ isSignal: true, alias: "sticky", required: false }] }], level: [{ type: i0.Input, args: [{ isSignal: true, alias: "level", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], subLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "subLabel", required: false }] }], noTranslate: [{ type: i0.Input, args: [{ isSignal: true, alias: "noTranslate", required: false }] }], params: [{ type: i0.Input, args: [{ isSignal: true, alias: "params", required: false }] }], reverse: [{ type: i0.Input, args: [{ isSignal: true, alias: "reverse", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], menu: [{ type: i0.Input, args: [{ isSignal: true, alias: "menu", required: false }] }], menuName: [{ type: i0.Input, args: [{ isSignal: true, alias: "menuName", required: false }] }], visibilityRule: [{ type: i0.Input, args: [{ isSignal: true, alias: "visibilityRule", required: false }] }], disableRule: [{ type: i0.Input, args: [{ isSignal: true, alias: "disableRule", required: false }] }], extraData: [{ type: i0.Input, args: [{ isSignal: true, alias: "extraData", required: false }] }], align: [{ type: i0.Input, args: [{ isSignal: true, alias: "align", required: false }] }], showBack: [{ type: i0.Input, args: [{ isSignal: true, alias: "showBack", required: false }] }], actionButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "actionButton", required: false }] }], actionLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "actionLabel", required: false }] }], spacing: [{ type: i0.Input, args: [{ isSignal: true, alias: "spacing", required: false }] }], maxWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxWidth", required: false }] }], actionClick: [{ type: i0.Output, args: ["actionClick"] }], action: [{ type: i0.Output, args: ["action"] }], back: [{ type: i0.Output, args: ["back"] }] } });
19641
19682
 
19642
19683
  const SECTION_TABLE_CONTEXT = new InjectionToken('SECTION_TABLE_CONTEXT');
19643
19684
 
@@ -21632,7 +21673,8 @@ var checkboxGroup = /*#__PURE__*/Object.freeze({
21632
21673
 
21633
21674
  class DropdownBoxComponent {
21634
21675
  options = input([], ...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
21635
- selected = input('', ...(ngDevMode ? [{ debugName: "selected" }] : /* istanbul ignore next */ []));
21676
+ /** The values ticked, as a list whichever Field drew the panel. */
21677
+ selected = input([], ...(ngDevMode ? [{ debugName: "selected" }] : /* istanbul ignore next */ []));
21636
21678
  multiple = input(false, ...(ngDevMode ? [{ debugName: "multiple" }] : /* istanbul ignore next */ []));
21637
21679
  activeIndex = input(-1, ...(ngDevMode ? [{ debugName: "activeIndex" }] : /* istanbul ignore next */ []));
21638
21680
  action = output();
@@ -21647,13 +21689,7 @@ class DropdownBoxComponent {
21647
21689
  .querySelectorAll('.dropdown-box__option')[index]?.scrollIntoView?.({ block: 'nearest' });
21648
21690
  });
21649
21691
  }
21650
- isSelected = (value) => {
21651
- const sel = this.selected();
21652
- if (Array.isArray(sel)) {
21653
- return sel.includes(value);
21654
- }
21655
- return sel === value;
21656
- };
21692
+ isSelected = (value) => this.selected().includes(value);
21657
21693
  // Only emit a selection event for enabled options.
21658
21694
  selectOption = (option) => {
21659
21695
  if (option.disabled)
@@ -21744,8 +21780,71 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
21744
21780
  `, changeDetection: ChangeDetectionStrategy.OnPush, styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}.dropdown-box{overflow-y:auto;max-height:15rem;margin:0;padding:.375rem;list-style:none;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);background:color-mix(in srgb,var(--m-focus) 2%,var(--m-background));box-shadow:0 .75rem 2rem color-mix(in srgb,var(--m-text) 12%,transparent);animation:dropdown-in .2s ease-out}.dropdown-box__checkbox{flex-shrink:0;width:14px;height:14px;margin-right:8px;pointer-events:none;accent-color:var(--m-mm);cursor:pointer}.dropdown-box__option{display:flex;align-items:center;padding:.625rem .75rem;border-radius:.375rem;cursor:pointer;font-size:.875rem;color:var(--m-text);transition:background .15s ease}.dropdown-box__option:hover,.dropdown-box__option--active{background:color-mix(in srgb,var(--m-focus) 8%,transparent)}.dropdown-box__option--selected{font-weight:600;color:var(--m-mm)}.dropdown-box__option--disabled{opacity:.4;pointer-events:none}.dropdown-box__empty{padding:.75rem;text-align:center;color:var(--m-text-tertiary);font-size:.875rem}@keyframes dropdown-in{0%{opacity:0;transform:scale(.95) translateY(-4px)}to{opacity:1;transform:scale(1) translateY(0)}}:host(.open-upward) .dropdown-box{animation:dropdown-in-up .2s ease-out}@keyframes dropdown-in-up{0%{opacity:0;transform:scale(.95) translateY(4px)}to{opacity:1;transform:scale(1) translateY(0)}}:host-context(.align-bottom) .dropdown-box{max-height:70vh;border:none;border-radius:0;background:transparent;box-shadow:none;animation:none}\n"] }]
21745
21781
  }], ctorParameters: () => [], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], selected: [{ type: i0.Input, args: [{ isSignal: true, alias: "selected", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], activeIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeIndex", required: false }] }], action: [{ type: i0.Output, args: ["action"] }] } });
21746
21782
 
21747
- class DropdownInputComponent extends BaseInputComponent {
21748
- value = model('', ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
21783
+ /** The trigger both option Fields draw: a searchable text input and a chevron. */
21784
+ const DROPDOWN_TEMPLATE = `
21785
+ @if (config(); as dropdown) {
21786
+ @if (dropdown.label) {
21787
+ <m-label
21788
+ [for]="dropdown.name ?? ''"
21789
+ [placeholder]="dropdown.label"
21790
+ [params]="dropdown.params"
21791
+ [required]="required()"
21792
+ [disabled]="disabled()"
21793
+ />
21794
+ }
21795
+ <div
21796
+ class="trigger-wrap"
21797
+ #wrapper
21798
+ [mSelector]="selectorConfig()"
21799
+ [disabled]="disabled() || readonly() || !!config()?.readonly"
21800
+ (opened)="onOpened()"
21801
+ (closed)="onClosed()"
21802
+ (focusin)="isFocused.set(true)"
21803
+ (focusout)="isFocused.set(false)"
21804
+ >
21805
+ <m-text-input
21806
+ [config]="triggerInputConfig()"
21807
+ [value]="displayValue()"
21808
+ [disabled]="disabled()"
21809
+ [invalid]="invalid()"
21810
+ [hideErrors]="true"
21811
+ [(touched)]="touched"
21812
+ [focused]="focused()"
21813
+ (valueChange)="onInput($event)"
21814
+ (click)="preventToggleWhenOpen($event)"
21815
+ (keydown.space)="$event.stopPropagation()"
21816
+ (keydown.enter)="onEnter($event)"
21817
+ (keydown.arrowdown)="onArrow($event, 1)"
21818
+ (keydown.arrowup)="onArrow($event, -1)"
21819
+ (keydown.tab)="$event.stopPropagation()"
21820
+ />
21821
+ <m-button [disabled]="disabled()" [config]="chevron()" />
21822
+ </div>
21823
+ @if (showErrors()) {
21824
+ @for (error of errors(); track $index) {
21825
+ <m-text-output
21826
+ variant="footer"
21827
+ color="error"
21828
+ [label]="error.message"
21829
+ />
21830
+ }
21831
+ }
21832
+ }
21833
+ `;
21834
+ const DROPDOWN_IMPORTS = [
21835
+ LabelComponent,
21836
+ TextOutputComponent,
21837
+ TextInputComponent,
21838
+ ButtonComponent,
21839
+ SelectorDirective,
21840
+ ];
21841
+ /**
21842
+ * Everything a Dropdown and a Multiselect share: the options, the search, the
21843
+ * keyboard walk and the panel. What differs is only what the Field holds — one
21844
+ * value or a list — so a subclass says which values are selected and what a
21845
+ * pick does to them.
21846
+ */
21847
+ class BaseDropdownComponent extends BaseInputComponent {
21749
21848
  config = input(...(ngDevMode ? [undefined, { debugName: "config" }] : /* istanbul ignore next */ []));
21750
21849
  required = input(false, ...(ngDevMode ? [{ debugName: "required" }] : /* istanbul ignore next */ []));
21751
21850
  disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
@@ -21777,7 +21876,6 @@ class DropdownInputComponent extends BaseInputComponent {
21777
21876
  // what clicking that input already does, so Tab walks past it.
21778
21877
  tabindex: -1,
21779
21878
  }), ...(ngDevMode ? [{ debugName: "chevron" }] : /* istanbul ignore next */ []));
21780
- isMultiselect = computed(() => this.config()?.type === InputType.MULTISELECT || !!this.config()?.multiple, ...(ngDevMode ? [{ debugName: "isMultiselect" }] : /* istanbul ignore next */ []));
21781
21879
  triggerInputConfig = computed(() => {
21782
21880
  const dropdown = this.config();
21783
21881
  return {
@@ -21791,9 +21889,8 @@ class DropdownInputComponent extends BaseInputComponent {
21791
21889
  dropdownOptions = computed(() => {
21792
21890
  const runtimeOptions = this.options();
21793
21891
  const source = runtimeOptions ?? this.config()?.options;
21794
- if (typeof source === 'function') {
21892
+ if (typeof source === 'function')
21795
21893
  return source();
21796
- }
21797
21894
  if (source?.length)
21798
21895
  return source;
21799
21896
  return this.assetOptions();
@@ -21814,7 +21911,8 @@ class DropdownInputComponent extends BaseInputComponent {
21814
21911
  return this.dropdownOptions();
21815
21912
  return this.dropdownOptions().filter((o) => {
21816
21913
  const label = this.optionLabel(o).toLowerCase();
21817
- return label.includes(search) || o.value.toLowerCase().includes(search);
21914
+ return (label.includes(search) ||
21915
+ String(o.value).toLowerCase().includes(search));
21818
21916
  });
21819
21917
  }, ...(ngDevMode ? [{ debugName: "filteredOptions" }] : /* istanbul ignore next */ []));
21820
21918
  /** The option ↑/↓ point at while the panel is open; -1 is none. Reset as the search narrows the list. */
@@ -21830,58 +21928,31 @@ class DropdownInputComponent extends BaseInputComponent {
21830
21928
  }
21831
21929
  return from;
21832
21930
  };
21833
- displayValue = computed(() => {
21834
- if (this.toggle())
21835
- return this.searchTerm();
21836
- const val = this.value();
21837
- if (this.isMultiselect()) {
21838
- if (Array.isArray(val)) {
21839
- if (val.length === 0)
21840
- return '';
21841
- if (val.length === 1) {
21842
- return this.optionLabel(this.dropdownOptions().find((o) => o.value === val[0]));
21843
- }
21844
- const translation = this.translateService.translate(`selected?count=${val.length}`);
21845
- return translation.includes('selected')
21846
- ? `${val.length} Selected`
21847
- : translation;
21848
- }
21931
+ /** One pick reads as its option's label, several as a count. */
21932
+ selectionLabel = computed(() => {
21933
+ const values = this.selectedValues();
21934
+ if (values.length === 0)
21849
21935
  return '';
21850
- }
21851
- else {
21852
- return this.optionLabel(this.dropdownOptions().find((o) => o.value === val));
21853
- }
21854
- }, ...(ngDevMode ? [{ debugName: "displayValue" }] : /* istanbul ignore next */ []));
21936
+ if (values.length === 1) {
21937
+ return this.optionLabel(this.dropdownOptions().find((o) => o.value === values[0]));
21938
+ }
21939
+ const translation = this.translateService.translate(`selected?count=${values.length}`);
21940
+ return translation.includes('selected')
21941
+ ? `${values.length} Selected`
21942
+ : translation;
21943
+ }, ...(ngDevMode ? [{ debugName: "selectionLabel" }] : /* istanbul ignore next */ []));
21944
+ displayValue = computed(() => this.toggle() ? this.searchTerm() : this.selectionLabel(), ...(ngDevMode ? [{ debugName: "displayValue" }] : /* istanbul ignore next */ []));
21855
21945
  placeholderText = computed(() => {
21856
- const config = this.config();
21857
21946
  if (this.toggle()) {
21858
- const val = this.value();
21859
- if (this.isMultiselect()) {
21860
- if (Array.isArray(val) && val.length > 0) {
21861
- if (val.length === 1) {
21862
- return this.optionLabel(this.dropdownOptions().find((o) => o.value === val[0]));
21863
- }
21864
- const translation = this.translateService.translate(`selected?count=${val.length}`);
21865
- return translation.includes('selected')
21866
- ? `${val.length} Selected`
21867
- : translation;
21868
- }
21869
- }
21870
- else {
21871
- const label = this.optionLabel(this.dropdownOptions().find((o) => o.value === val));
21872
- if (label)
21873
- return label;
21874
- }
21947
+ const label = this.selectionLabel();
21948
+ if (label)
21949
+ return label;
21875
21950
  }
21876
- return config?.placeholder
21877
- ? this.translateService.translate(config.placeholder)
21878
- : '';
21951
+ const placeholder = this.config()
21952
+ ?.placeholder;
21953
+ return placeholder ? this.translateService.translate(placeholder) : '';
21879
21954
  }, ...(ngDevMode ? [{ debugName: "placeholderText" }] : /* istanbul ignore next */ []));
21880
21955
  wrapperRef = viewChild('wrapper', ...(ngDevMode ? [{ debugName: "wrapperRef" }] : /* istanbul ignore next */ []));
21881
- setValue = (value) => {
21882
- this.value.set(value);
21883
- this.touched.set(true);
21884
- };
21885
21956
  selectorConfig = computed(() => ({
21886
21957
  component: DropdownBoxComponent,
21887
21958
  base: 'm-dropdown-input',
@@ -21890,38 +21961,22 @@ class DropdownInputComponent extends BaseInputComponent {
21890
21961
  dir: this.dir(),
21891
21962
  bindings: [
21892
21963
  inputBinding('options', this.filteredOptions),
21893
- inputBinding('selected', this.value),
21894
- inputBinding('multiple', this.isMultiselect),
21964
+ inputBinding('selected', this.selectedValues),
21965
+ inputBinding('multiple', () => this.multiple),
21895
21966
  inputBinding('activeIndex', this.activeIndex),
21896
- outputBinding('action', this.selectOption),
21967
+ outputBinding('action', (option) => this.selectOption(option)),
21897
21968
  ],
21898
21969
  }), ...(ngDevMode ? [{ debugName: "selectorConfig" }] : /* istanbul ignore next */ []));
21899
- selectOption = (option) => {
21900
- if (this.isMultiselect()) {
21901
- const val = this.value();
21902
- const current = Array.isArray(val) ? val : val ? [val] : [];
21903
- const index = current.indexOf(option.value);
21904
- let nextValue;
21905
- if (index > -1) {
21906
- nextValue = current.filter((v) => v !== option.value);
21907
- }
21908
- else {
21909
- nextValue = [...current, option.value];
21910
- }
21911
- this.setValue(nextValue);
21912
- }
21913
- else {
21914
- this.setValue(option.value);
21915
- this.toggle.set(false);
21916
- this.searchTerm.set('');
21917
- setTimeout(() => this.wrapperRef()?.nativeElement.click(), 0);
21918
- }
21970
+ /** Shuts the panel after a pick, the way a click on the trigger would. */
21971
+ closePanel = () => {
21972
+ this.toggle.set(false);
21973
+ this.searchTerm.set('');
21974
+ setTimeout(() => this.wrapperRef()?.nativeElement.click(), 0);
21919
21975
  };
21920
21976
  onOpened = () => {
21921
21977
  this.toggle.set(true);
21922
21978
  this.searchTerm.set('');
21923
- const val = this.value();
21924
- const current = Array.isArray(val) ? val[0] : val;
21979
+ const current = this.selectedValues()[0];
21925
21980
  this.activeIndex.set(this.filteredOptions().findIndex((o) => o.value === current));
21926
21981
  };
21927
21982
  // Focus stays in the trigger input (it is the search box), so ↑/↓ move the
@@ -21956,123 +22011,81 @@ class DropdownInputComponent extends BaseInputComponent {
21956
22011
  event.stopPropagation();
21957
22012
  }
21958
22013
  };
21959
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: DropdownInputComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
21960
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: DropdownInputComponent, isStandalone: true, selector: "m-dropdown-input", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, touched: { classPropertyName: "touched", publicName: "touched", isSignal: true, isRequired: false, transformFunction: null }, focused: { classPropertyName: "focused", publicName: "focused", isSignal: true, isRequired: false, transformFunction: null }, errors: { classPropertyName: "errors", publicName: "errors", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, dir: { classPropertyName: "dir", publicName: "dir", isSignal: true, isRequired: false, transformFunction: null }, toggle: { classPropertyName: "toggle", publicName: "toggle", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", touched: "touchedChange", toggle: "toggleChange" }, viewQueries: [{ propertyName: "wrapperRef", first: true, predicate: ["wrapper"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: `
21961
- @if (config(); as dropdown) {
21962
- @if (dropdown.label) {
21963
- <m-label
21964
- [for]="dropdown.name ?? ''"
21965
- [placeholder]="dropdown.label"
21966
- [params]="dropdown.params"
21967
- [required]="required()"
21968
- [disabled]="disabled()"
21969
- />
21970
- }
21971
- <div
21972
- class="trigger-wrap"
21973
- #wrapper
21974
- [mSelector]="selectorConfig()"
21975
- [disabled]="disabled() || readonly() || !!config()?.readonly"
21976
- (opened)="onOpened()"
21977
- (closed)="onClosed()"
21978
- (focusin)="isFocused.set(true)"
21979
- (focusout)="isFocused.set(false)"
21980
- >
21981
- <m-text-input
21982
- [config]="triggerInputConfig()"
21983
- [value]="displayValue()"
21984
- [disabled]="disabled()"
21985
- [invalid]="invalid()"
21986
- [hideErrors]="true"
21987
- [(touched)]="touched"
21988
- [focused]="focused()"
21989
- (valueChange)="onInput($event)"
21990
- (click)="preventToggleWhenOpen($event)"
21991
- (keydown.space)="$event.stopPropagation()"
21992
- (keydown.enter)="onEnter($event)"
21993
- (keydown.arrowdown)="onArrow($event, 1)"
21994
- (keydown.arrowup)="onArrow($event, -1)"
21995
- (keydown.tab)="$event.stopPropagation()"
21996
- />
21997
- <m-button [disabled]="disabled()" [config]="chevron()" />
21998
- </div>
21999
- @if (showErrors()) {
22000
- @for (error of errors(); track $index) {
22001
- <m-text-output
22002
- variant="footer"
22003
- color="error"
22004
- [label]="error.message"
22005
- />
22006
- }
22007
- }
22014
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: BaseDropdownComponent, deps: null, target: i0.ɵɵFactoryTarget.Directive });
22015
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "21.2.9", type: BaseDropdownComponent, isStandalone: true, inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, touched: { classPropertyName: "touched", publicName: "touched", isSignal: true, isRequired: false, transformFunction: null }, focused: { classPropertyName: "focused", publicName: "focused", isSignal: true, isRequired: false, transformFunction: null }, errors: { classPropertyName: "errors", publicName: "errors", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, dir: { classPropertyName: "dir", publicName: "dir", isSignal: true, isRequired: false, transformFunction: null }, toggle: { classPropertyName: "toggle", publicName: "toggle", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { touched: "touchedChange", toggle: "toggleChange" }, viewQueries: [{ propertyName: "wrapperRef", first: true, predicate: ["wrapper"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0 });
22016
+ }
22017
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: BaseDropdownComponent, decorators: [{
22018
+ type: Directive
22019
+ }], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], touched: [{ type: i0.Input, args: [{ isSignal: true, alias: "touched", required: false }] }, { type: i0.Output, args: ["touchedChange"] }], focused: [{ type: i0.Input, args: [{ isSignal: true, alias: "focused", required: false }] }], errors: [{ type: i0.Input, args: [{ isSignal: true, alias: "errors", required: false }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], dir: [{ type: i0.Input, args: [{ isSignal: true, alias: "dir", required: false }] }], toggle: [{ type: i0.Input, args: [{ isSignal: true, alias: "toggle", required: false }] }, { type: i0.Output, args: ["toggleChange"] }], wrapperRef: [{ type: i0.ViewChild, args: ['wrapper', { isSignal: true }] }] } });
22020
+
22021
+ /** One value from a list. A list of values is `m-multiselect-input`. */
22022
+ class DropdownInputComponent extends BaseDropdownComponent {
22023
+ value = model(undefined, ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
22024
+ multiple = false;
22025
+ selectedValues = computed(() => {
22026
+ const value = this.value();
22027
+ return value === undefined || value === '' ? [] : [value];
22028
+ }, ...(ngDevMode ? [{ debugName: "selectedValues" }] : /* istanbul ignore next */ []));
22029
+ setValue = (value) => {
22030
+ this.value.set(value);
22031
+ this.touched.set(true);
22032
+ };
22033
+ selectOption(option) {
22034
+ this.setValue(option.value);
22035
+ this.closePanel();
22008
22036
  }
22009
- `, isInline: true, styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}:host{display:contents}.trigger-wrap{position:relative;--m-text-input-padding-right: 2.25em }.trigger-wrap m-button{position:absolute;right:0;top:0;bottom:0;--m-button-size: 1em !important;height:100%;border-radius:0 var(--m-input-radius, calc(var(--input-size, 1em) * .5)) var(--m-input-radius, calc(var(--input-size, 1em) * .5)) 0;--m-button-radius: 0 var(--m-input-radius, calc(var(--input-size, 1em) * .5)) var(--m-input-radius, calc(var(--input-size, 1em) * .5)) 0}\n"], dependencies: [{ kind: "component", type: LabelComponent, selector: "m-label", inputs: ["for", "placeholder", "params", "required", "disabled", "color", "noTranslate"] }, { kind: "component", type: TextOutputComponent, selector: "m-text-output", inputs: ["config", "align", "variant", "color", "fontWeight", "label", "noTranslate", "params"], outputs: ["configChange", "clicked"] }, { kind: "component", type: TextInputComponent, selector: "m-text-input", inputs: ["value", "config", "required", "disabled", "invalid", "touched", "focused", "errors", "hideErrors"], outputs: ["valueChange", "touchedChange"] }, { kind: "component", type: ButtonComponent, selector: "m-button,m-one-button", inputs: ["config", "color", "labelClass", "fullWidth", "nav", "navParams", "href", "disabled", "variant", "name", "baseUrl", "one", "remote", "label", "noTranslate", "params", "noNative", "icon", "isRightIcon", "iconOnly", "stacked", "imgSrc", "nonClickable", "inverted", "isSubmit", "tabindex"], outputs: ["configChange", "clicked"] }, { kind: "directive", type: SelectorDirective, selector: "[mSelector]", inputs: ["mSelector", "disabled"], outputs: ["opened", "closed"], exportAs: ["mSelector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
22037
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: DropdownInputComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
22038
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: DropdownInputComponent, isStandalone: true, selector: "m-dropdown-input", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, usesInheritance: true, ngImport: i0, template: "\n @if (config(); as dropdown) {\n @if (dropdown.label) {\n <m-label\n [for]=\"dropdown.name ?? ''\"\n [placeholder]=\"dropdown.label\"\n [params]=\"dropdown.params\"\n [required]=\"required()\"\n [disabled]=\"disabled()\"\n />\n }\n <div\n class=\"trigger-wrap\"\n #wrapper\n [mSelector]=\"selectorConfig()\"\n [disabled]=\"disabled() || readonly() || !!config()?.readonly\"\n (opened)=\"onOpened()\"\n (closed)=\"onClosed()\"\n (focusin)=\"isFocused.set(true)\"\n (focusout)=\"isFocused.set(false)\"\n >\n <m-text-input\n [config]=\"triggerInputConfig()\"\n [value]=\"displayValue()\"\n [disabled]=\"disabled()\"\n [invalid]=\"invalid()\"\n [hideErrors]=\"true\"\n [(touched)]=\"touched\"\n [focused]=\"focused()\"\n (valueChange)=\"onInput($event)\"\n (click)=\"preventToggleWhenOpen($event)\"\n (keydown.space)=\"$event.stopPropagation()\"\n (keydown.enter)=\"onEnter($event)\"\n (keydown.arrowdown)=\"onArrow($event, 1)\"\n (keydown.arrowup)=\"onArrow($event, -1)\"\n (keydown.tab)=\"$event.stopPropagation()\"\n />\n <m-button [disabled]=\"disabled()\" [config]=\"chevron()\" />\n </div>\n @if (showErrors()) {\n @for (error of errors(); track $index) {\n <m-text-output\n variant=\"footer\"\n color=\"error\"\n [label]=\"error.message\"\n />\n }\n }\n }\n", isInline: true, styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}:host{display:contents}.trigger-wrap{position:relative;--m-text-input-padding-right: 2.25em }.trigger-wrap m-button{position:absolute;right:0;top:0;bottom:0;--m-button-size: 1em !important;height:100%;border-radius:0 var(--m-input-radius, calc(var(--input-size, 1em) * .5)) var(--m-input-radius, calc(var(--input-size, 1em) * .5)) 0;--m-button-radius: 0 var(--m-input-radius, calc(var(--input-size, 1em) * .5)) var(--m-input-radius, calc(var(--input-size, 1em) * .5)) 0}\n"], dependencies: [{ kind: "component", type: LabelComponent, selector: "m-label", inputs: ["for", "placeholder", "params", "required", "disabled", "color", "noTranslate"] }, { kind: "component", type: TextOutputComponent, selector: "m-text-output", inputs: ["config", "align", "variant", "color", "fontWeight", "label", "noTranslate", "params"], outputs: ["configChange", "clicked"] }, { kind: "component", type: TextInputComponent, selector: "m-text-input", inputs: ["value", "config", "required", "disabled", "invalid", "touched", "focused", "errors", "hideErrors"], outputs: ["valueChange", "touchedChange"] }, { kind: "component", type: ButtonComponent, selector: "m-button,m-one-button", inputs: ["config", "color", "labelClass", "fullWidth", "nav", "navParams", "href", "disabled", "variant", "name", "baseUrl", "one", "remote", "label", "noTranslate", "params", "noNative", "icon", "isRightIcon", "iconOnly", "stacked", "imgSrc", "nonClickable", "inverted", "isSubmit", "tabindex"], outputs: ["configChange", "clicked"] }, { kind: "directive", type: SelectorDirective, selector: "[mSelector]", inputs: ["mSelector", "disabled"], outputs: ["opened", "closed"], exportAs: ["mSelector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
22010
22039
  }
22011
22040
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: DropdownInputComponent, decorators: [{
22012
22041
  type: Component,
22013
- args: [{ selector: 'm-dropdown-input', template: `
22014
- @if (config(); as dropdown) {
22015
- @if (dropdown.label) {
22016
- <m-label
22017
- [for]="dropdown.name ?? ''"
22018
- [placeholder]="dropdown.label"
22019
- [params]="dropdown.params"
22020
- [required]="required()"
22021
- [disabled]="disabled()"
22022
- />
22023
- }
22024
- <div
22025
- class="trigger-wrap"
22026
- #wrapper
22027
- [mSelector]="selectorConfig()"
22028
- [disabled]="disabled() || readonly() || !!config()?.readonly"
22029
- (opened)="onOpened()"
22030
- (closed)="onClosed()"
22031
- (focusin)="isFocused.set(true)"
22032
- (focusout)="isFocused.set(false)"
22033
- >
22034
- <m-text-input
22035
- [config]="triggerInputConfig()"
22036
- [value]="displayValue()"
22037
- [disabled]="disabled()"
22038
- [invalid]="invalid()"
22039
- [hideErrors]="true"
22040
- [(touched)]="touched"
22041
- [focused]="focused()"
22042
- (valueChange)="onInput($event)"
22043
- (click)="preventToggleWhenOpen($event)"
22044
- (keydown.space)="$event.stopPropagation()"
22045
- (keydown.enter)="onEnter($event)"
22046
- (keydown.arrowdown)="onArrow($event, 1)"
22047
- (keydown.arrowup)="onArrow($event, -1)"
22048
- (keydown.tab)="$event.stopPropagation()"
22049
- />
22050
- <m-button [disabled]="disabled()" [config]="chevron()" />
22051
- </div>
22052
- @if (showErrors()) {
22053
- @for (error of errors(); track $index) {
22054
- <m-text-output
22055
- variant="footer"
22056
- color="error"
22057
- [label]="error.message"
22058
- />
22059
- }
22060
- }
22061
- }
22062
- `, imports: [
22063
- LabelComponent,
22064
- TextOutputComponent,
22065
- TextInputComponent,
22066
- ButtonComponent,
22067
- SelectorDirective,
22068
- ], changeDetection: ChangeDetectionStrategy.OnPush, styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}:host{display:contents}.trigger-wrap{position:relative;--m-text-input-padding-right: 2.25em }.trigger-wrap m-button{position:absolute;right:0;top:0;bottom:0;--m-button-size: 1em !important;height:100%;border-radius:0 var(--m-input-radius, calc(var(--input-size, 1em) * .5)) var(--m-input-radius, calc(var(--input-size, 1em) * .5)) 0;--m-button-radius: 0 var(--m-input-radius, calc(var(--input-size, 1em) * .5)) var(--m-input-radius, calc(var(--input-size, 1em) * .5)) 0}\n"] }]
22069
- }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], touched: [{ type: i0.Input, args: [{ isSignal: true, alias: "touched", required: false }] }, { type: i0.Output, args: ["touchedChange"] }], focused: [{ type: i0.Input, args: [{ isSignal: true, alias: "focused", required: false }] }], errors: [{ type: i0.Input, args: [{ isSignal: true, alias: "errors", required: false }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], dir: [{ type: i0.Input, args: [{ isSignal: true, alias: "dir", required: false }] }], toggle: [{ type: i0.Input, args: [{ isSignal: true, alias: "toggle", required: false }] }, { type: i0.Output, args: ["toggleChange"] }], wrapperRef: [{ type: i0.ViewChild, args: ['wrapper', { isSignal: true }] }] } });
22042
+ args: [{ selector: 'm-dropdown-input', template: DROPDOWN_TEMPLATE, imports: DROPDOWN_IMPORTS, changeDetection: ChangeDetectionStrategy.OnPush, styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}:host{display:contents}.trigger-wrap{position:relative;--m-text-input-padding-right: 2.25em }.trigger-wrap m-button{position:absolute;right:0;top:0;bottom:0;--m-button-size: 1em !important;height:100%;border-radius:0 var(--m-input-radius, calc(var(--input-size, 1em) * .5)) var(--m-input-radius, calc(var(--input-size, 1em) * .5)) 0;--m-button-radius: 0 var(--m-input-radius, calc(var(--input-size, 1em) * .5)) var(--m-input-radius, calc(var(--input-size, 1em) * .5)) 0}\n"] }]
22043
+ }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }] } });
22070
22044
 
22071
22045
  var dropdown = /*#__PURE__*/Object.freeze({
22072
22046
  __proto__: null,
22073
22047
  DropdownInputComponent: DropdownInputComponent
22074
22048
  });
22075
22049
 
22050
+ /** A list of values from a list. One value is `m-dropdown-input`. */
22051
+ class MultiselectInputComponent extends BaseDropdownComponent {
22052
+ value = model([], ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
22053
+ multiple = true;
22054
+ // Read defensively: an untyped form model can still hand over one bare value.
22055
+ selectedValues = computed(() => {
22056
+ const value = this.value();
22057
+ if (Array.isArray(value))
22058
+ return value;
22059
+ return typeof value === 'string' || typeof value === 'number'
22060
+ ? value === ''
22061
+ ? []
22062
+ : [value]
22063
+ : [];
22064
+ }, ...(ngDevMode ? [{ debugName: "selectedValues" }] : /* istanbul ignore next */ []));
22065
+ setValue = (value) => {
22066
+ this.value.set(value);
22067
+ this.touched.set(true);
22068
+ };
22069
+ // The panel stays open across picks; each one ticks or unticks its row.
22070
+ selectOption(option) {
22071
+ const current = this.selectedValues();
22072
+ this.setValue(current.includes(option.value)
22073
+ ? current.filter((v) => v !== option.value)
22074
+ : [...current, option.value]);
22075
+ }
22076
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: MultiselectInputComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
22077
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: MultiselectInputComponent, isStandalone: true, selector: "m-multiselect-input", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, usesInheritance: true, ngImport: i0, template: "\n @if (config(); as dropdown) {\n @if (dropdown.label) {\n <m-label\n [for]=\"dropdown.name ?? ''\"\n [placeholder]=\"dropdown.label\"\n [params]=\"dropdown.params\"\n [required]=\"required()\"\n [disabled]=\"disabled()\"\n />\n }\n <div\n class=\"trigger-wrap\"\n #wrapper\n [mSelector]=\"selectorConfig()\"\n [disabled]=\"disabled() || readonly() || !!config()?.readonly\"\n (opened)=\"onOpened()\"\n (closed)=\"onClosed()\"\n (focusin)=\"isFocused.set(true)\"\n (focusout)=\"isFocused.set(false)\"\n >\n <m-text-input\n [config]=\"triggerInputConfig()\"\n [value]=\"displayValue()\"\n [disabled]=\"disabled()\"\n [invalid]=\"invalid()\"\n [hideErrors]=\"true\"\n [(touched)]=\"touched\"\n [focused]=\"focused()\"\n (valueChange)=\"onInput($event)\"\n (click)=\"preventToggleWhenOpen($event)\"\n (keydown.space)=\"$event.stopPropagation()\"\n (keydown.enter)=\"onEnter($event)\"\n (keydown.arrowdown)=\"onArrow($event, 1)\"\n (keydown.arrowup)=\"onArrow($event, -1)\"\n (keydown.tab)=\"$event.stopPropagation()\"\n />\n <m-button [disabled]=\"disabled()\" [config]=\"chevron()\" />\n </div>\n @if (showErrors()) {\n @for (error of errors(); track $index) {\n <m-text-output\n variant=\"footer\"\n color=\"error\"\n [label]=\"error.message\"\n />\n }\n }\n }\n", isInline: true, styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}:host{display:contents}.trigger-wrap{position:relative;--m-text-input-padding-right: 2.25em }.trigger-wrap m-button{position:absolute;right:0;top:0;bottom:0;--m-button-size: 1em !important;height:100%;border-radius:0 var(--m-input-radius, calc(var(--input-size, 1em) * .5)) var(--m-input-radius, calc(var(--input-size, 1em) * .5)) 0;--m-button-radius: 0 var(--m-input-radius, calc(var(--input-size, 1em) * .5)) var(--m-input-radius, calc(var(--input-size, 1em) * .5)) 0}\n"], dependencies: [{ kind: "component", type: LabelComponent, selector: "m-label", inputs: ["for", "placeholder", "params", "required", "disabled", "color", "noTranslate"] }, { kind: "component", type: TextOutputComponent, selector: "m-text-output", inputs: ["config", "align", "variant", "color", "fontWeight", "label", "noTranslate", "params"], outputs: ["configChange", "clicked"] }, { kind: "component", type: TextInputComponent, selector: "m-text-input", inputs: ["value", "config", "required", "disabled", "invalid", "touched", "focused", "errors", "hideErrors"], outputs: ["valueChange", "touchedChange"] }, { kind: "component", type: ButtonComponent, selector: "m-button,m-one-button", inputs: ["config", "color", "labelClass", "fullWidth", "nav", "navParams", "href", "disabled", "variant", "name", "baseUrl", "one", "remote", "label", "noTranslate", "params", "noNative", "icon", "isRightIcon", "iconOnly", "stacked", "imgSrc", "nonClickable", "inverted", "isSubmit", "tabindex"], outputs: ["configChange", "clicked"] }, { kind: "directive", type: SelectorDirective, selector: "[mSelector]", inputs: ["mSelector", "disabled"], outputs: ["opened", "closed"], exportAs: ["mSelector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
22078
+ }
22079
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: MultiselectInputComponent, decorators: [{
22080
+ type: Component,
22081
+ args: [{ selector: 'm-multiselect-input', template: DROPDOWN_TEMPLATE, imports: DROPDOWN_IMPORTS, changeDetection: ChangeDetectionStrategy.OnPush, styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}:host{display:contents}.trigger-wrap{position:relative;--m-text-input-padding-right: 2.25em }.trigger-wrap m-button{position:absolute;right:0;top:0;bottom:0;--m-button-size: 1em !important;height:100%;border-radius:0 var(--m-input-radius, calc(var(--input-size, 1em) * .5)) var(--m-input-radius, calc(var(--input-size, 1em) * .5)) 0;--m-button-radius: 0 var(--m-input-radius, calc(var(--input-size, 1em) * .5)) var(--m-input-radius, calc(var(--input-size, 1em) * .5)) 0}\n"] }]
22082
+ }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }] } });
22083
+
22084
+ var multiselect = /*#__PURE__*/Object.freeze({
22085
+ __proto__: null,
22086
+ MultiselectInputComponent: MultiselectInputComponent
22087
+ });
22088
+
22076
22089
  const COLOR_PICKER_FILE_UPLOAD_CONFIG = {
22077
22090
  accept: ['image/*'],
22078
22091
  multiple: false,
@@ -23308,7 +23321,7 @@ class WrapperInputComponent extends ConfigComponent {
23308
23321
  break;
23309
23322
  }
23310
23323
  case InputType.TOGGLE: {
23311
- const { ToggleInputComponent } = await import('./magmonium-one-toggle-DELqFKZY.mjs');
23324
+ const { ToggleInputComponent } = await import('./magmonium-one-toggle-zniJyl09.mjs');
23312
23325
  this.createDynamicComponent(seq, ToggleInputComponent, [], true);
23313
23326
  break;
23314
23327
  }
@@ -23320,12 +23333,12 @@ class WrapperInputComponent extends ConfigComponent {
23320
23333
  break;
23321
23334
  }
23322
23335
  case InputType.PASSWORD: {
23323
- const { PasswordInputComponent } = await import('./magmonium-one-password-CT8y_iYQ.mjs');
23336
+ const { PasswordInputComponent } = await import('./magmonium-one-password-CX1OjX5P.mjs');
23324
23337
  this.createDynamicComponent(seq, PasswordInputComponent);
23325
23338
  break;
23326
23339
  }
23327
23340
  case InputType.OTP: {
23328
- const { OtpInputComponent } = await import('./magmonium-one-otp-Ct41thd0.mjs');
23341
+ const { OtpInputComponent } = await import('./magmonium-one-otp-CpjpaJdi.mjs');
23329
23342
  this.createDynamicComponent(seq, OtpInputComponent);
23330
23343
  break;
23331
23344
  }
@@ -23368,7 +23381,6 @@ class WrapperInputComponent extends ConfigComponent {
23368
23381
  this.createDynamicComponent(seq, TextareaInputComponent);
23369
23382
  break;
23370
23383
  }
23371
- case InputType.MULTISELECT:
23372
23384
  case InputType.DROPDOWN: {
23373
23385
  const { DropdownInputComponent } = await Promise.resolve().then(function () { return dropdown; });
23374
23386
  this.createDynamicComponent(seq, DropdownInputComponent, [
@@ -23377,6 +23389,14 @@ class WrapperInputComponent extends ConfigComponent {
23377
23389
  ]);
23378
23390
  break;
23379
23391
  }
23392
+ case InputType.MULTISELECT: {
23393
+ const { MultiselectInputComponent } = await Promise.resolve().then(function () { return multiselect; });
23394
+ this.createDynamicComponent(seq, MultiselectInputComponent, [
23395
+ inputBinding('options', this.options),
23396
+ inputBinding('dir', this.dir),
23397
+ ]);
23398
+ break;
23399
+ }
23380
23400
  case InputType.COLOR: {
23381
23401
  const { ColorPickerInputComponent } = await Promise.resolve().then(function () { return colorPicker; });
23382
23402
  this.createDynamicComponent(seq, ColorPickerInputComponent);
@@ -25039,7 +25059,7 @@ class FileUploadInputComponent extends BaseInputComponent {
25039
25059
  const modalStore = this.modalStore;
25040
25060
  if (!modalStore)
25041
25061
  return undefined;
25042
- const { ImageEditorComponent } = await import('./magmonium-one-image-editor-w_mIbhJH.mjs');
25062
+ const { ImageEditorComponent } = await import('./magmonium-one-image-editor-DN8v0YOv.mjs');
25043
25063
  const ratio = String(this.config()?.ratio ?? '');
25044
25064
  return new Promise((resolve) => {
25045
25065
  const modalRef = new ModalRef();
@@ -40663,5 +40683,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
40663
40683
  * Generated bundle index. Do not edit.
40664
40684
  */
40665
40685
 
40666
- export { CheckboxGroupComponent as $, ACCESS_DOMAINS as A, ButtonComponent as B, AssetUrlPipe as C, Assets as D, AuthActivityPageComponent as E, AuthApiService as F, AuthStore as G, HeaderComponent$1 as H, InputType as I, AutosizeDirective as J, BadgeComponent as K, LabelComponent as L, MODAL_REF as M, BandingComponent as N, BaseArrayInputComponent as O, BaseRootWebComponent as P, BaseWebComponent as Q, RangeInputComponent as R, ButtonGroupComponent as S, TranslatePipe as T, CALLING_APP_HEADER as U, COMPONENT_INPUT_REGISTRY as V, CardComponent as W, CardWrapperComponent as X, CarouselComponent as Y, ChartComponent as Z, ChatBubbleComponent as _, MIN_ZOOM as a, ICON_SOURCE as a$, CheckboxInputComponent as a0, ClearableInputComponent as a1, ClipboardService as a2, ColComponent as a3, ColorPickerInputComponent as a4, CommentItemComponent as a5, CommentsApiService as a6, CommentsComponent as a7, CommentsStore as a8, CompactNumberPipe as a9, DocComponent as aA, DocEditorComponent as aB, DomService as aC, Domain as aD, DotGridComponent as aE, DragListDirective as aF, DragListItemDirective as aG, DraggableDirective as aH, DropdownInputComponent as aI, FILTER_GROUP_CONTEXT as aJ, FILTER_RANGE_MODES as aK, FILTER_VARIANTS as aL, FLEX_VARIANTS as aM, FOLDER_PICK_LISTENER as aN, FORM_ASSET_FOLDER as aO, FileService as aP, FileUploadDirective as aQ, FileUploadInputComponent as aR, FlexComponent as aS, FlexItemComponent as aT, FormGroupComponent as aU, FrameComponent as aV, FreezeService as aW, GRID_BREAKPOINTS as aX, GetNavService as aY, HighlightDirective as aZ, HttpService as a_, ComponentInputComponent as aa, ComponentStepperComponent as ab, ConfigComponent as ac, ConfirmComponent as ad, ContextMenuComponent as ae, CustomIconClass as af, CustomIconEditComponent as ag, DEFAULT_DENIAL as ah, DEFAULT_DOC_DENSITY as ai, DEFAULT_DOC_VARIANT as aj, DEFAULT_FILTER_RANGE_MODE as ak, DEFAULT_FILTER_VARIANT as al, DEFAULT_NAV_PARAM as am, DEFAULT_NAV_SEGMENT as an, DEFAULT_SIZE as ao, DOCK_MIN_PAGE_REMAINDER as ap, DOCS_FOLDER as aq, DOC_ACTION_ICONS as ar, DOC_DENSITIES as as, DOC_EDIT_ACTIONS as at, DOC_TOOLBAR_GROUPS as au, DOC_VARIANTS as av, DashboardCardComponent as aw, DateInputComponent as ax, DatePickerComponent as ay, DeviceService as az, MAX_ZOOM as b, PLATFORM_NAV_MAP as b$, IS_SIDE_PANEL as b0, IconComponent as b1, ImgComponent as b2, InstrumentScoreComponent as b3, InterceptorObservables as b4, JumbotronComponent as b5, KeyValueComponent as b6, LAYOUT_ASSET_FOLDER as b7, LOGIN_COMPONENT as b8, LOGIN_STORE as b9, NAV_STORE_REF as bA, NAV_WC_COMPONENTS as bB, NAV_WIDGET_MAP as bC, NavComponent as bD, NavDetailsComponent as bE, NavHeaderComponent as bF, NavMenuComponent as bG, NavStore as bH, NavTrailComponent as bI, NothingComponent as bJ, NotificationElementComponent as bK, NotificationGroupComponent as bL, NotificationPopupComponent as bM, NotificationService as bN, NotificationStore as bO, NotificationType as bP, NotificationWidgetComponent as bQ, ONE_ASSET_BASE_URL as bR, OPTIONS_SOURCE as bS, OVERLAY_WIDGETS as bT, OneApp as bU, OptionsSourceDirective as bV, OverlayBodyComponent as bW, OverlayRef as bX, OverlayService as bY, PLATFORM_BUTTON_NAV_IDS as bZ, PLATFORM_EXTENSIBLE_NAV_IDS as b_, LanguageComponent as ba, ListComponent as bb, LogoComponent as bc, MAG_SOCKET_EVENT as bd, MHeroColorDirective as be, MHeroComponent as bf, MODAL_STORE_REF as bg, MOUNT_STATIC_SEGMENT as bh, MOUNT_TOKEN as bi, MRefDirective as bj, MStepComponent as bk, MURL_PARAM as bl, MURL_SEP as bm, ManifestEnrichmentService as bn, MarginDirective as bo, MenuComponent as bp, ModalDirective as bq, ModalRef as br, ModalStore as bs, MoneyPipe as bt, MultiRangeInputComponent as bu, MurlUrlSerializer as bv, NAV_DEFAULT_MURL as bw, NAV_ID_SEP as bx, NAV_MAIN_BUTTONS as by, NAV_SEGMENT_RE as bz, cropRect as c, SelectorDirective as c$, PLATFORM_ROOT_CHILDREN as c0, PaddingDirective as c1, PaginationComponent as c2, PanelComponent as c3, PercentagePipe as c4, PlaygroundComponent as c5, PositionDirective as c6, PwaInstallComponent as c7, RECENT_SEARCH_LIMIT as c8, REMOTE_PAGE_RELOAD as c9, SectionBackComponent as cA, SectionBadgesComponent as cB, SectionButtonGroupComponent as cC, SectionCardComponent as cD, SectionCarouselComponent as cE, SectionComponent as cF, SectionFilterComponent as cG, SectionFilterGroupComponent as cH, SectionFilterMenuComponent as cI, SectionFilterPanelComponent as cJ, SectionFilterRangePanelComponent as cK, SectionFooterComponent as cL, SectionFormComponent as cM, SectionFormItemComponent as cN, SectionHeaderComponent as cO, SectionHeroComponent as cP, SectionPaginationComponent as cQ, SectionSearchComponent as cR, SectionStepperComponent as cS, SectionTableCellComponent as cT, SectionTableComponent as cU, SectionTableRowComponent as cV, SectionTableSortPipe as cW, SectionTabsComponent as cX, SectionToggleComponent as cY, SectionToggleItemDirective as cZ, SelectableCardInputComponent as c_, ROOT_NAV$1 as ca, RadioGroupComponent as cb, RadioInputComponent as cc, RatingInputComponent as cd, ReactiveElementComponent as ce, RemoteComponent as cf, RemoteLoaderService as cg, ResizeElementComponent as ch, RouteContainer as ci, RowComponent as cj, SEARCH_QUERY as ck, SEARCH_RESULTS_EVENT as cl, SECTION_ACCORDION_GROUP as cm, SECTION_FORM_CONTEXT as cn, SECTION_TABLE_VARIANTS as co, SHARED_ICONS as cp, SIZE_CONTEXT as cq, SPACING_INWARD as cr, ScoreComponent as cs, ScrollComponent as ct, ScrollService as cu, SearchPanelComponent as cv, SearchStore as cw, SearchUserPanelComponent as cx, SectionAccordionDirective as cy, SectionAccordionGroupDirective as cz, drawFramed as d, bootstrapPwaInstall as d$, SettingsSearchBarComponent as d0, SettingsSearchService as d1, ShapeComponent as d2, SharedStoreRegistry as d3, SidePanelDirective as d4, Size as d5, SocketStore as d6, SortComponent as d7, StatComponent as d8, StepComponent as d9, TooltipComponent as dA, TranslateService as dB, TreeGridComponent as dC, URL_SEP as dD, USER_STORE_REF as dE, USER_TAB_MAP as dF, UniverseComponent as dG, UserApiService as dH, UserAvatarComponent as dI, UserComponent as dJ, UserNavComponent as dK, UserSettingsComponent as dL, UserStore as dM, WC_BUNDLE as dN, WC_NAVIGATE_EVENT as dO, WC_ROUTE_CHANGED_EVENT as dP, WC_SEARCH_GROUPS as dQ, WIN_USER_TAB_HOOK as dR, WIN_USER_TAB_KEY as dS, WatermarkComponent as dT, WcRouterStore as dU, WrapperInputComponent as dV, anchorNavId as dW, applyColorsToElement as dX, applyDocEdit as dY, assetOptions as dZ, bootstrapMagApp as d_, StepperComponent as da, StepsComponent as db, StorageService as dc, StrokeLinecap as dd, StrokeLinejoin as de, SummaryComponent as df, SvgGeneratorComponent as dg, SvgGeneratorService as dh, SvgService as di, TOTAL_COLUMNS as dj, TRANSLATION_SOURCE as dk, TableComponent as dl, TechnicalMeterComponent as dm, TextInputComponent as dn, TextareaInputComponent as dp, ThemeComponent as dq, ThemeDataService as dr, ThemeService as ds, ThemeStore as dt, TimeAgoPipe as du, TimelineComponent as dv, ToggleButtonComponent as dw, ToggleInputComponent as dx, ToggleRadioInputComponent as dy, ToolTipDirective as dz, encodeFramed as e, injectDefaultDenial as e$, buildWcBaseUrl as e0, calculateLuminance as e1, calculateRanks as e2, cellText as e3, checkDoc as e4, checkFilterCondition as e5, childNavId as e6, claimDenial as e7, classListSignal as e8, coerceSize as e9, filterOne as eA, filterPanelOf as eB, filterPanelWidth as eC, filterRange as eD, filterTreeGridRows as eE, filterValueList as eF, filterValues as eG, flattenTreeGridRows as eH, formatBadgeCount as eI, fullName as eJ, generateClipPath as eK, generateTransform as eL, getClassList as eM, getProperty as eN, getScrollParent as eO, getTierFromPreviewPath as eP, getTreeGridRow as eQ, getUniqueId as eR, getValue as eS, hasErrorComputed as eT, hexToRgb as eU, hslToRgb$1 as eV, initMagmoniumApp as eW, initialNotificationState as eX, initialState$2 as eY, initials as eZ, injectAuthenticate as e_, cornerEdge as ea, cornerSide as eb, createMap as ec, createPlatformNavMap as ed, definedWcTierOf as ee, deriveAvatarGradient as ef, deriveContrastColor as eg, deriveOppositeColor as eh, derivePropertyName as ei, docActionKey as ej, docAssetCandidates as ek, docProblemKey as el, docRemotePath as em, emailValidation as en, evaluate as eo, evaluateBool as ep, fieldBoolean as eq, fieldNumber as er, fieldString as es, filterHoldsList as et, filterHoldsOneBound as eu, filterHoldsOptions as ev, filterHoldsRange as ew, filterList as ex, filterNumber as ey, filterNumberList as ez, clampFraming as f, platformNavWidgets as f$, injectInstallApp as f0, injectParentSize as f1, injectScrollSticky as f2, isBootRedirect as f3, isButtonName as f4, isCancelledComputed as f5, isExtensiblePlatformNavId as f6, isJson as f7, isLoadingComputed as f8, isLocalhost as f9, minValidation as fA, miniMarkToHtml as fB, mountFor as fC, mountPatternProblem as fD, mountPatternText as fE, mountSegmentOf as fF, mountTokenOf as fG, navIdChain as fH, navIdFor as fI, navIdSegment as fJ, navIdToRoutePath as fK, navIdToSegments as fL, navParamOf as fM, navTailMatcher as fN, navToId as fO, navVisibilityGuard as fP, nextSectionTableSort as fQ, normalizeAssetOptions as fR, offsetOfLine as fS, parentNavId as fT, parseAddress as fU, parseColor as fV, parseMountPattern as fW, parsePatternNames as fX, patternValidation as fY, patternsValidation as fZ, permissionRefusal as f_, isNavInstanceConfig as fa, isNavMenuConfig as fb, isNavRowsConfig as fc, isNavVisibilityConfig as fd, isPlatformNavId as fe, isSize as ff, isTierPreview as fg, isUrlLocalhost as fh, isValidNavId as fi, isValidNavSegment as fj, isWebComponent as fk, linkToId as fl, linkToNav as fm, loadingActions as fn, mInterceptor as fo, manualValidation as fp, matchFieldValidation as fq, matchMount as fr, maxLengthValidation as fs, maxValidation as ft, mergePlatformNav as fu, mergeUnique as fv, mergeUniqueBy as fw, mergeUniqueWith as fx, minAgeValidation as fy, minLengthValidation as fz, BaseInputComponent as g, privateGuard as g0, processImageToSvg as g1, provideAppContext as g2, provideMagAppConfig as g3, provideMagWcConfig as g4, provideMagWcRoutes as g5, provideModalComponents as g6, provideMurlUrlSerializer as g7, provideNavWidgets as g8, provideOverlayWidgets as g9, setTreeGridChildren as gA, setWcTier as gB, settingsWidgets as gC, shouldShowBadge as gD, sortSectionTableRows as gE, splitNavId as gF, splitOnMatch as gG, stringToColor as gH, tailRouteOf as gI, toAttrBool as gJ, toAttrNumber as gK, toCssLength as gL, toHostNavId as gM, toLength$1 as gN, toLocalNavId as gO, toggleTreeGridRow as gP, unfetchedPlatformNav as gQ, ungroupedDocActions as gR, urlValidation as gS, wcTierOf as gT, providePlatformNavWidgets as ga, provideSearch as gb, provideSizeContext as gc, provideUserTabs as gd, publicGuard as ge, readFieldPatterns as gf, recordDefinedWcTier as gg, remoteOutletRoute as gh, renderAddress as gi, renderDocument as gj, requiredValidation as gk, resolveConfigAsset as gl, resolveIconSize as gm, resolvePallet as gn, resolvePatternRules as go, resolveSize as gp, resolveSpacing as gq, rgbToHex as gr, rgbToHsl as gs, rowHasChildren as gt, samePatterns as gu, sectionTableColumnId as gv, sectionTableColumnWidths as gw, sectionTableFrozenCount as gx, segmentsToNavId as gy, setProperty as gz, BaseTextInputComponent as h, initialFraming as i, TextOutputComponent as j, IS_DESIGN_MODE as k, APP_CONTEXT_REF as l, APP_LINK as m, ASSET_BASE_URL as n, outputSize as o, parseRatio as p, AccordionBodyDirective as q, renameForType as r, AccordionComponent as s, AccordionGroupComponent as t, ActionComponent as u, AnimatedGraphsComponent as v, AppCardComponent as w, AppRelationType as x, AppTileComponent as y, AssetStore as z };
40667
- //# sourceMappingURL=magmonium-one-magmonium-one-Cu45fHus.mjs.map
40686
+ export { CheckboxGroupComponent as $, ACCESS_DOMAINS as A, ButtonComponent as B, AssetUrlPipe as C, Assets as D, AuthActivityPageComponent as E, AuthApiService as F, AuthStore as G, HeaderComponent$1 as H, InputType as I, AutosizeDirective as J, BadgeComponent as K, LabelComponent as L, MODAL_REF as M, BandingComponent as N, BaseArrayInputComponent as O, BaseRootWebComponent as P, BaseWebComponent as Q, RangeInputComponent as R, ButtonGroupComponent as S, TranslatePipe as T, CALLING_APP_HEADER as U, COMPONENT_INPUT_REGISTRY as V, CardComponent as W, CardWrapperComponent as X, CarouselComponent as Y, ChartComponent as Z, ChatBubbleComponent as _, MIN_ZOOM as a, ICON_SOURCE as a$, CheckboxInputComponent as a0, ClearableInputComponent as a1, ClipboardService as a2, ColComponent as a3, ColorPickerInputComponent as a4, CommentItemComponent as a5, CommentsApiService as a6, CommentsComponent as a7, CommentsStore as a8, CompactNumberPipe as a9, DocComponent as aA, DocEditorComponent as aB, DomService as aC, Domain as aD, DotGridComponent as aE, DragListDirective as aF, DragListItemDirective as aG, DraggableDirective as aH, DropdownInputComponent as aI, FILTER_GROUP_CONTEXT as aJ, FILTER_RANGE_MODES as aK, FILTER_VARIANTS as aL, FLEX_VARIANTS as aM, FOLDER_PICK_LISTENER as aN, FORM_ASSET_FOLDER as aO, FileService as aP, FileUploadDirective as aQ, FileUploadInputComponent as aR, FlexComponent as aS, FlexItemComponent as aT, FormGroupComponent as aU, FrameComponent as aV, FreezeService as aW, GRID_BREAKPOINTS as aX, GetNavService as aY, HighlightDirective as aZ, HttpService as a_, ComponentInputComponent as aa, ComponentStepperComponent as ab, ConfigComponent as ac, ConfirmComponent as ad, ContextMenuComponent as ae, CustomIconClass as af, CustomIconEditComponent as ag, DEFAULT_DENIAL as ah, DEFAULT_DOC_DENSITY as ai, DEFAULT_DOC_VARIANT as aj, DEFAULT_FILTER_RANGE_MODE as ak, DEFAULT_FILTER_VARIANT as al, DEFAULT_NAV_PARAM as am, DEFAULT_NAV_SEGMENT as an, DEFAULT_SIZE as ao, DOCK_MIN_PAGE_REMAINDER as ap, DOCS_FOLDER as aq, DOC_ACTION_ICONS as ar, DOC_DENSITIES as as, DOC_EDIT_ACTIONS as at, DOC_TOOLBAR_GROUPS as au, DOC_VARIANTS as av, DashboardCardComponent as aw, DateInputComponent as ax, DatePickerComponent as ay, DeviceService as az, MAX_ZOOM as b, PLATFORM_EXTENSIBLE_NAV_IDS as b$, IS_SIDE_PANEL as b0, IconComponent as b1, ImgComponent as b2, InstrumentScoreComponent as b3, InterceptorObservables as b4, JumbotronComponent as b5, KeyValueComponent as b6, LAYOUT_ASSET_FOLDER as b7, LOGIN_COMPONENT as b8, LOGIN_STORE as b9, NAV_SEGMENT_RE as bA, NAV_STORE_REF as bB, NAV_WC_COMPONENTS as bC, NAV_WIDGET_MAP as bD, NavComponent as bE, NavDetailsComponent as bF, NavHeaderComponent as bG, NavMenuComponent as bH, NavStore as bI, NavTrailComponent as bJ, NothingComponent as bK, NotificationElementComponent as bL, NotificationGroupComponent as bM, NotificationPopupComponent as bN, NotificationService as bO, NotificationStore as bP, NotificationType as bQ, NotificationWidgetComponent as bR, ONE_ASSET_BASE_URL as bS, OPTIONS_SOURCE as bT, OVERLAY_WIDGETS as bU, OneApp as bV, OptionsSourceDirective as bW, OverlayBodyComponent as bX, OverlayRef as bY, OverlayService as bZ, PLATFORM_BUTTON_NAV_IDS as b_, LanguageComponent as ba, ListComponent as bb, LogoComponent as bc, MAG_SOCKET_EVENT as bd, MHeroColorDirective as be, MHeroComponent as bf, MODAL_STORE_REF as bg, MOUNT_STATIC_SEGMENT as bh, MOUNT_TOKEN as bi, MRefDirective as bj, MStepComponent as bk, MURL_PARAM as bl, MURL_SEP as bm, ManifestEnrichmentService as bn, MarginDirective as bo, MenuComponent as bp, ModalDirective as bq, ModalRef as br, ModalStore as bs, MoneyPipe as bt, MultiRangeInputComponent as bu, MultiselectInputComponent as bv, MurlUrlSerializer as bw, NAV_DEFAULT_MURL as bx, NAV_ID_SEP as by, NAV_MAIN_BUTTONS as bz, cropRect as c, SelectableCardInputComponent as c$, PLATFORM_NAV_MAP as c0, PLATFORM_ROOT_CHILDREN as c1, PaddingDirective as c2, PaginationComponent as c3, PanelComponent as c4, PercentagePipe as c5, PlaygroundComponent as c6, PositionDirective as c7, PwaInstallComponent as c8, RECENT_SEARCH_LIMIT as c9, SectionAccordionGroupDirective as cA, SectionBackComponent as cB, SectionBadgesComponent as cC, SectionButtonGroupComponent as cD, SectionCardComponent as cE, SectionCarouselComponent as cF, SectionComponent as cG, SectionFilterComponent as cH, SectionFilterGroupComponent as cI, SectionFilterMenuComponent as cJ, SectionFilterPanelComponent as cK, SectionFilterRangePanelComponent as cL, SectionFooterComponent as cM, SectionFormComponent as cN, SectionFormItemComponent as cO, SectionHeaderComponent as cP, SectionHeroComponent as cQ, SectionPaginationComponent as cR, SectionSearchComponent as cS, SectionStepperComponent as cT, SectionTableCellComponent as cU, SectionTableComponent as cV, SectionTableRowComponent as cW, SectionTableSortPipe as cX, SectionTabsComponent as cY, SectionToggleComponent as cZ, SectionToggleItemDirective as c_, REMOTE_PAGE_RELOAD as ca, ROOT_NAV$1 as cb, RadioGroupComponent as cc, RadioInputComponent as cd, RatingInputComponent as ce, ReactiveElementComponent as cf, RemoteComponent as cg, RemoteLoaderService as ch, ResizeElementComponent as ci, RouteContainer as cj, RowComponent as ck, SEARCH_QUERY as cl, SEARCH_RESULTS_EVENT as cm, SECTION_ACCORDION_GROUP as cn, SECTION_FORM_CONTEXT as co, SECTION_TABLE_VARIANTS as cp, SHARED_ICONS as cq, SIZE_CONTEXT as cr, SPACING_INWARD as cs, ScoreComponent as ct, ScrollComponent as cu, ScrollService as cv, SearchPanelComponent as cw, SearchStore as cx, SearchUserPanelComponent as cy, SectionAccordionDirective as cz, drawFramed as d, bootstrapMagApp as d$, SelectorDirective as d0, SettingsSearchBarComponent as d1, SettingsSearchService as d2, ShapeComponent as d3, SharedStoreRegistry as d4, SidePanelDirective as d5, Size as d6, SocketStore as d7, SortComponent as d8, StatComponent as d9, ToolTipDirective as dA, TooltipComponent as dB, TranslateService as dC, TreeGridComponent as dD, URL_SEP as dE, USER_STORE_REF as dF, USER_TAB_MAP as dG, UniverseComponent as dH, UserApiService as dI, UserAvatarComponent as dJ, UserComponent as dK, UserNavComponent as dL, UserSettingsComponent as dM, UserStore as dN, WC_BUNDLE as dO, WC_NAVIGATE_EVENT as dP, WC_ROUTE_CHANGED_EVENT as dQ, WC_SEARCH_GROUPS as dR, WIN_USER_TAB_HOOK as dS, WIN_USER_TAB_KEY as dT, WatermarkComponent as dU, WcRouterStore as dV, WrapperInputComponent as dW, anchorNavId as dX, applyColorsToElement as dY, applyDocEdit as dZ, assetOptions as d_, StepComponent as da, StepperComponent as db, StepsComponent as dc, StorageService as dd, StrokeLinecap as de, StrokeLinejoin as df, SummaryComponent as dg, SvgGeneratorComponent as dh, SvgGeneratorService as di, SvgService as dj, TOTAL_COLUMNS as dk, TRANSLATION_SOURCE as dl, TableComponent as dm, TechnicalMeterComponent as dn, TextInputComponent as dp, TextareaInputComponent as dq, ThemeComponent as dr, ThemeDataService as ds, ThemeService as dt, ThemeStore as du, TimeAgoPipe as dv, TimelineComponent as dw, ToggleButtonComponent as dx, ToggleInputComponent as dy, ToggleRadioInputComponent as dz, encodeFramed as e, injectAuthenticate as e$, bootstrapPwaInstall as e0, buildWcBaseUrl as e1, calculateLuminance as e2, calculateRanks as e3, cellText as e4, checkDoc as e5, checkFilterCondition as e6, childNavId as e7, claimDenial as e8, classListSignal as e9, filterNumberList as eA, filterOne as eB, filterPanelOf as eC, filterPanelWidth as eD, filterRange as eE, filterTreeGridRows as eF, filterValueList as eG, filterValues as eH, flattenTreeGridRows as eI, formatBadgeCount as eJ, fullName as eK, generateClipPath as eL, generateTransform as eM, getClassList as eN, getProperty as eO, getScrollParent as eP, getTierFromPreviewPath as eQ, getTreeGridRow as eR, getUniqueId as eS, getValue as eT, hasErrorComputed as eU, hexToRgb as eV, hslToRgb$1 as eW, initMagmoniumApp as eX, initialNotificationState as eY, initialState$2 as eZ, initials as e_, coerceSize as ea, cornerEdge as eb, cornerSide as ec, createMap as ed, createPlatformNavMap as ee, definedWcTierOf as ef, deriveAvatarGradient as eg, deriveContrastColor as eh, deriveOppositeColor as ei, derivePropertyName as ej, docActionKey as ek, docAssetCandidates as el, docProblemKey as em, docRemotePath as en, emailValidation as eo, evaluate as ep, evaluateBool as eq, fieldBoolean as er, fieldNumber as es, fieldString as et, filterHoldsList as eu, filterHoldsOneBound as ev, filterHoldsOptions as ew, filterHoldsRange as ex, filterList as ey, filterNumber as ez, clampFraming as f, permissionRefusal as f$, injectDefaultDenial as f0, injectInstallApp as f1, injectParentSize as f2, injectScrollSticky as f3, isBootRedirect as f4, isButtonName as f5, isCancelledComputed as f6, isExtensiblePlatformNavId as f7, isJson as f8, isLoadingComputed as f9, minLengthValidation as fA, minValidation as fB, miniMarkToHtml as fC, mountFor as fD, mountPatternProblem as fE, mountPatternText as fF, mountSegmentOf as fG, mountTokenOf as fH, navIdChain as fI, navIdFor as fJ, navIdSegment as fK, navIdToRoutePath as fL, navIdToSegments as fM, navParamOf as fN, navTailMatcher as fO, navToId as fP, navVisibilityGuard as fQ, nextSectionTableSort as fR, normalizeAssetOptions as fS, offsetOfLine as fT, parentNavId as fU, parseAddress as fV, parseColor as fW, parseMountPattern as fX, parsePatternNames as fY, patternValidation as fZ, patternsValidation as f_, isLocalhost as fa, isNavInstanceConfig as fb, isNavMenuConfig as fc, isNavRowsConfig as fd, isNavVisibilityConfig as fe, isPlatformNavId as ff, isSize as fg, isTierPreview as fh, isUrlLocalhost as fi, isValidNavId as fj, isValidNavSegment as fk, isWebComponent as fl, linkToId as fm, linkToNav as fn, loadingActions as fo, mInterceptor as fp, manualValidation as fq, matchFieldValidation as fr, matchMount as fs, maxLengthValidation as ft, maxValidation as fu, mergePlatformNav as fv, mergeUnique as fw, mergeUniqueBy as fx, mergeUniqueWith as fy, minAgeValidation as fz, BaseInputComponent as g, platformNavWidgets as g0, privateGuard as g1, processImageToSvg as g2, provideAppContext as g3, provideMagAppConfig as g4, provideMagWcConfig as g5, provideMagWcRoutes as g6, provideModalComponents as g7, provideMurlUrlSerializer as g8, provideNavWidgets as g9, setProperty as gA, setTreeGridChildren as gB, setWcTier as gC, settingsWidgets as gD, shouldShowBadge as gE, sortSectionTableRows as gF, splitNavId as gG, splitOnMatch as gH, stringToColor as gI, tailRouteOf as gJ, toAttrBool as gK, toAttrNumber as gL, toCssLength as gM, toHostNavId as gN, toLength$1 as gO, toLocalNavId as gP, toggleTreeGridRow as gQ, unfetchedPlatformNav as gR, ungroupedDocActions as gS, urlValidation as gT, wcTierOf as gU, provideOverlayWidgets as ga, providePlatformNavWidgets as gb, provideSearch as gc, provideSizeContext as gd, provideUserTabs as ge, publicGuard as gf, readFieldPatterns as gg, recordDefinedWcTier as gh, remoteOutletRoute as gi, renderAddress as gj, renderDocument as gk, requiredValidation as gl, resolveConfigAsset as gm, resolveIconSize as gn, resolvePallet as go, resolvePatternRules as gp, resolveSize as gq, resolveSpacing as gr, rgbToHex as gs, rgbToHsl as gt, rowHasChildren as gu, samePatterns as gv, sectionTableColumnId as gw, sectionTableColumnWidths as gx, sectionTableFrozenCount as gy, segmentsToNavId as gz, BaseTextInputComponent as h, initialFraming as i, TextOutputComponent as j, IS_DESIGN_MODE as k, APP_CONTEXT_REF as l, APP_LINK as m, ASSET_BASE_URL as n, outputSize as o, parseRatio as p, AccordionBodyDirective as q, renameForType as r, AccordionComponent as s, AccordionGroupComponent as t, ActionComponent as u, AnimatedGraphsComponent as v, AppCardComponent as w, AppRelationType as x, AppTileComponent as y, AssetStore as z };
40687
+ //# sourceMappingURL=magmonium-one-magmonium-one-DWeZSPCv.mjs.map