@magmonium/one 0.4.99 → 0.4.101

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 (67) hide show
  1. package/fesm2022/{magmonium-one-attribute-value-CPh-lJPV.mjs → magmonium-one-attribute-value-BXEWw7xP.mjs} +3 -3
  2. package/fesm2022/{magmonium-one-attribute-value-CPh-lJPV.mjs.map → magmonium-one-attribute-value-BXEWw7xP.mjs.map} +1 -1
  3. package/fesm2022/{magmonium-one-base-checkbox-LdM6dqF_.mjs → magmonium-one-base-checkbox-CIUMxkzu.mjs} +2 -2
  4. package/fesm2022/{magmonium-one-base-checkbox-LdM6dqF_.mjs.map → magmonium-one-base-checkbox-CIUMxkzu.mjs.map} +1 -1
  5. package/fesm2022/{magmonium-one-base-dropdown-CmUfiOAb.mjs → magmonium-one-base-dropdown-BMsV5USo.mjs} +9 -11
  6. package/fesm2022/magmonium-one-base-dropdown-BMsV5USo.mjs.map +1 -0
  7. package/fesm2022/{magmonium-one-size-converter-BqkALIWA.mjs → magmonium-one-base-input-BeyBAbV4.mjs} +190 -3
  8. package/fesm2022/magmonium-one-base-input-BeyBAbV4.mjs.map +1 -0
  9. package/fesm2022/{magmonium-one-base-text-ChjG3GNw.mjs → magmonium-one-base-text-BBeMl8XM.mjs} +2 -2
  10. package/fesm2022/{magmonium-one-base-text-ChjG3GNw.mjs.map → magmonium-one-base-text-BBeMl8XM.mjs.map} +1 -1
  11. package/fesm2022/{magmonium-one-button-C5dk4R_m.mjs → magmonium-one-button-DC_fLy-J.mjs} +34 -8
  12. package/fesm2022/magmonium-one-button-DC_fLy-J.mjs.map +1 -0
  13. package/fesm2022/{magmonium-one-checkbox-BXNvtkzo.mjs → magmonium-one-checkbox-C85FEuTs.mjs} +5 -6
  14. package/fesm2022/magmonium-one-checkbox-C85FEuTs.mjs.map +1 -0
  15. package/fesm2022/{magmonium-one-color-utl-BA51l-Rw.mjs → magmonium-one-color-utl-DMLkkE-z.mjs} +2 -2
  16. package/fesm2022/{magmonium-one-color-utl-BA51l-Rw.mjs.map → magmonium-one-color-utl-DMLkkE-z.mjs.map} +1 -1
  17. package/fesm2022/{magmonium-one-directives-hJ7wkmQn.mjs → magmonium-one-directives-CJK7xDPK.mjs} +4 -4
  18. package/fesm2022/{magmonium-one-directives-hJ7wkmQn.mjs.map → magmonium-one-directives-CJK7xDPK.mjs.map} +1 -1
  19. package/fesm2022/{magmonium-one-group-bRamdzPO.mjs → magmonium-one-group-qu3xLiI8.mjs} +16 -9
  20. package/fesm2022/magmonium-one-group-qu3xLiI8.mjs.map +1 -0
  21. package/fesm2022/{magmonium-one-header-BZzD8uTJ.mjs → magmonium-one-header-BC-74GOn.mjs} +5 -4
  22. package/fesm2022/{magmonium-one-header-BZzD8uTJ.mjs.map → magmonium-one-header-BC-74GOn.mjs.map} +1 -1
  23. package/fesm2022/{magmonium-one-icon-CH-g8CUR.mjs → magmonium-one-icon-CXFTG4mD.mjs} +4 -4
  24. package/fesm2022/{magmonium-one-icon-CH-g8CUR.mjs.map → magmonium-one-icon-CXFTG4mD.mjs.map} +1 -1
  25. package/fesm2022/{magmonium-one-image-editor-BV0x-SA3.mjs → magmonium-one-image-editor-BAF7cdC2.mjs} +5 -4
  26. package/fesm2022/{magmonium-one-image-editor-BV0x-SA3.mjs.map → magmonium-one-image-editor-BAF7cdC2.mjs.map} +1 -1
  27. package/fesm2022/{magmonium-one-label-D-wnA_Fl.mjs → magmonium-one-label-BNxbDSwc.mjs} +2 -2
  28. package/fesm2022/{magmonium-one-label-D-wnA_Fl.mjs.map → magmonium-one-label-BNxbDSwc.mjs.map} +1 -1
  29. package/fesm2022/{magmonium-one-m-ref-DLIAzywu.mjs → magmonium-one-m-ref-CoK96ogW.mjs} +2 -2
  30. package/fesm2022/{magmonium-one-m-ref-DLIAzywu.mjs.map → magmonium-one-m-ref-CoK96ogW.mjs.map} +1 -1
  31. package/fesm2022/{magmonium-one-menu-CJjjxFfu.mjs → magmonium-one-menu-D_HAqfel.mjs} +7 -6
  32. package/fesm2022/{magmonium-one-menu-CJjjxFfu.mjs.map → magmonium-one-menu-D_HAqfel.mjs.map} +1 -1
  33. package/fesm2022/{magmonium-one-multi-range-C0S7udf5.mjs → magmonium-one-multi-range-DqtW4U_x.mjs} +5 -4
  34. package/fesm2022/magmonium-one-multi-range-DqtW4U_x.mjs.map +1 -0
  35. package/fesm2022/{magmonium-one-options-asset-BNd1hbLw.mjs → magmonium-one-options-asset-DWjdYQe0.mjs} +2 -2
  36. package/fesm2022/{magmonium-one-options-asset-BNd1hbLw.mjs.map → magmonium-one-options-asset-DWjdYQe0.mjs.map} +1 -1
  37. package/fesm2022/{magmonium-one-otp-CeSz8ZZ2.mjs → magmonium-one-otp-DOPvjYJz.mjs} +5 -5
  38. package/fesm2022/{magmonium-one-otp-CeSz8ZZ2.mjs.map → magmonium-one-otp-DOPvjYJz.mjs.map} +1 -1
  39. package/fesm2022/{magmonium-one-password-BKdXAZ_p.mjs → magmonium-one-password-BqdyEDF6.mjs} +7 -6
  40. package/fesm2022/{magmonium-one-password-BKdXAZ_p.mjs.map → magmonium-one-password-BqdyEDF6.mjs.map} +1 -1
  41. package/fesm2022/{magmonium-one-radio-DlS31qJG.mjs → magmonium-one-radio-DGTbRRXb.mjs} +3 -3
  42. package/fesm2022/{magmonium-one-radio-DlS31qJG.mjs.map → magmonium-one-radio-DGTbRRXb.mjs.map} +1 -1
  43. package/fesm2022/{magmonium-one-range-CR8go24u.mjs → magmonium-one-range-Dw4YACtP.mjs} +4 -4
  44. package/fesm2022/{magmonium-one-range-CR8go24u.mjs.map → magmonium-one-range-Dw4YACtP.mjs.map} +1 -1
  45. package/fesm2022/{magmonium-one-selector-BK48N5us.mjs → magmonium-one-selector-QB49Ju9l.mjs} +4 -4
  46. package/fesm2022/{magmonium-one-selector-BK48N5us.mjs.map → magmonium-one-selector-QB49Ju9l.mjs.map} +1 -1
  47. package/fesm2022/{magmonium-one-text-4zWYsKpH.mjs → magmonium-one-text-CMULvvAr.mjs} +6 -7
  48. package/fesm2022/{magmonium-one-text-4zWYsKpH.mjs.map → magmonium-one-text-CMULvvAr.mjs.map} +1 -1
  49. package/fesm2022/{magmonium-one-text-output-E6pe3IOL.mjs → magmonium-one-text-output-DiA4R1pw.mjs} +4 -4
  50. package/fesm2022/{magmonium-one-text-output-E6pe3IOL.mjs.map → magmonium-one-text-output-DiA4R1pw.mjs.map} +1 -1
  51. package/fesm2022/magmonium-one-theme-DEgFM1wD.mjs +1 -0
  52. package/fesm2022/{magmonium-one-toggle-BPInV6K-.mjs → magmonium-one-toggle-sUSXzxMl.mjs} +3 -5
  53. package/fesm2022/magmonium-one-toggle-sUSXzxMl.mjs.map +1 -0
  54. package/fesm2022/magmonium-one.mjs +109 -47
  55. package/fesm2022/magmonium-one.mjs.map +1 -1
  56. package/package.json +1 -1
  57. package/types/magmonium-one.d.ts +64 -38
  58. package/fesm2022/magmonium-one-base-dropdown-CmUfiOAb.mjs.map +0 -1
  59. package/fesm2022/magmonium-one-base-input-B92NOmxz.mjs +0 -183
  60. package/fesm2022/magmonium-one-base-input-B92NOmxz.mjs.map +0 -1
  61. package/fesm2022/magmonium-one-button-C5dk4R_m.mjs.map +0 -1
  62. package/fesm2022/magmonium-one-checkbox-BXNvtkzo.mjs.map +0 -1
  63. package/fesm2022/magmonium-one-group-bRamdzPO.mjs.map +0 -1
  64. package/fesm2022/magmonium-one-multi-range-C0S7udf5.mjs.map +0 -1
  65. package/fesm2022/magmonium-one-size-converter-BqkALIWA.mjs.map +0 -1
  66. package/fesm2022/magmonium-one-theme-BtQyLRdQ.mjs +0 -1
  67. package/fesm2022/magmonium-one-toggle-BPInV6K-.mjs.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@magmonium/one",
3
- "version": "0.4.99",
3
+ "version": "0.4.101",
4
4
  "description": "Magmonium One — Angular design-system primitives for mm Apps",
5
5
  "author": "magmonium",
6
6
  "license": "MIT",
@@ -1622,7 +1622,7 @@ export declare class DraggableDirective {
1622
1622
  readonly max: import("@angular/core").InputSignal<Position | undefined>;
1623
1623
  readonly dragStart: import("@angular/core").OutputEmitterRef<void>;
1624
1624
  readonly dragEnd: import("@angular/core").OutputEmitterRef<void>;
1625
- protected readonly cursor: import("@angular/core").Signal<"ew-resize" | "ns-resize" | "move">;
1625
+ protected readonly cursor: import("@angular/core").Signal<"move" | "ew-resize" | "ns-resize">;
1626
1626
  protected state: DraggableState;
1627
1627
  set pos(position: Position);
1628
1628
  /**
@@ -2892,6 +2892,7 @@ type Button = Config & {
2892
2892
  routerLink?: string | readonly (string | number)[];
2893
2893
  fullWidth?: boolean;
2894
2894
  iconOnly?: boolean;
2895
+ size?: Size | 'sm' | 'md' | 'lg';
2895
2896
  stacked?: boolean;
2896
2897
  badge?: ButtonBadge;
2897
2898
  imgSrc?: string;
@@ -2924,7 +2925,7 @@ export declare class ButtonComponent extends ReactiveElementComponent<Button> {
2924
2925
  navParams: import("@angular/core").InputSignal<Record<string, string | number> | undefined>;
2925
2926
  href: import("@angular/core").InputSignal<string | undefined>;
2926
2927
  disabled: import("@angular/core").InputSignal<boolean | undefined>;
2927
- variant: import("@angular/core").InputSignal<"primary" | "ghost" | "secondary" | "tab" | undefined>;
2928
+ variant: import("@angular/core").InputSignal<"ghost" | "primary" | "secondary" | "tab" | undefined>;
2928
2929
  name: import("@angular/core").InputSignal<string | undefined>;
2929
2930
  baseUrl: import("@angular/core").InputSignal<string | undefined>;
2930
2931
  one: import("@angular/core").InputSignal<boolean | undefined>;
@@ -2937,6 +2938,7 @@ export declare class ButtonComponent extends ReactiveElementComponent<Button> {
2937
2938
  icon: import("@angular/core").InputSignal<string | undefined>;
2938
2939
  isRightIcon: import("@angular/core").InputSignal<string | boolean | undefined>;
2939
2940
  iconOnly: import("@angular/core").InputSignal<string | boolean | undefined>;
2941
+ size: import("@angular/core").InputSignal<Size | "sm" | "md" | "lg" | undefined>;
2940
2942
  stacked: import("@angular/core").InputSignal<string | boolean | undefined>;
2941
2943
  imgSrc: import("@angular/core").InputSignal<string | undefined>;
2942
2944
  nonClickable: import("@angular/core").InputSignal<string | boolean | undefined>;
@@ -2948,6 +2950,8 @@ export declare class ButtonComponent extends ReactiveElementComponent<Button> {
2948
2950
  protected element: import("@angular/core").Signal<ElementRef<any> | undefined>;
2949
2951
  protected readonly className: import("@angular/core").Signal<string>;
2950
2952
  private readonly navRef;
2953
+ private readonly inGroup;
2954
+ protected readonly ownSizeLength: import("@angular/core").Signal<string | null>;
2951
2955
  protected readonly resolvesConfigAsset: boolean;
2952
2956
  readonly routerLinkRef: RouterLink | null;
2953
2957
  private readonly sectionForm;
@@ -3070,6 +3074,11 @@ export declare class ButtonComponent extends ReactiveElementComponent<Button> {
3070
3074
  "required": false;
3071
3075
  "isSignal": true;
3072
3076
  };
3077
+ "size": {
3078
+ "alias": "size";
3079
+ "required": false;
3080
+ "isSignal": true;
3081
+ };
3073
3082
  "stacked": {
3074
3083
  "alias": "stacked";
3075
3084
  "required": false;
@@ -3546,7 +3555,7 @@ export declare class ButtonGroupComponent extends ConfigComponent<ButtonGroup> {
3546
3555
  color?: string | keyof import("dist/libs/cli/src").ThemeColor;
3547
3556
  align?: ConfigAlign;
3548
3557
  isLoading?: boolean;
3549
- variant?: "primary" | "ghost" | "secondary" | "tab" | undefined;
3558
+ variant?: "ghost" | "primary" | "secondary" | "tab" | undefined;
3550
3559
  label?: string;
3551
3560
  noTranslate?: boolean;
3552
3561
  params?: Record<string, string>;
@@ -3560,6 +3569,7 @@ export declare class ButtonGroupComponent extends ConfigComponent<ButtonGroup> {
3560
3569
  routerLink?: string | readonly (string | number)[];
3561
3570
  fullWidth?: boolean;
3562
3571
  iconOnly?: boolean;
3572
+ size?: Size | "sm" | "md" | "lg";
3563
3573
  stacked?: boolean;
3564
3574
  badge?: ButtonBadge;
3565
3575
  imgSrc?: string;
@@ -3741,6 +3751,16 @@ declare function deriveGroupClass(group?: Partial<ButtonGroup>): string;
3741
3751
  * was never written.
3742
3752
  */
3743
3753
  declare const ACTION_BUTTON_HOST: InjectionToken<true>;
3754
+ /**
3755
+ * Published by `<m-button-group>` and `<m-section-button-group>` — the one
3756
+ * ButtonGroup seat (ADR 0008) — for the Buttons inside them.
3757
+ *
3758
+ * A standalone iconOnly Button may declare a Size of its own; one inside a
3759
+ * group may not, the group's Size being the one its Buttons share. This flag
3760
+ * is how a Button tells the two apart: SIZE_CONTEXT cannot, because a Section
3761
+ * provides it too.
3762
+ */
3763
+ declare const BUTTON_GROUP_HOST: InjectionToken<true>;
3744
3764
  type GridAlignX = 'left' | 'center' | 'right';
3745
3765
  type GridAlignY = 'top' | 'center' | 'bottom';
3746
3766
  type ColVariant = 'noBorder' | 'withBorder';
@@ -4339,6 +4359,11 @@ declare class BaseInputComponent<T extends Input = Input> {
4339
4359
  "touched": "touchedChange";
4340
4360
  }, never, never, true, never>;
4341
4361
  }
4362
+ /**
4363
+ * Whether a field holds something a rule can judge. A boolean is never filled:
4364
+ * an unchecked required box is the empty case, not a prefill.
4365
+ */
4366
+ declare const isFilledValue: (value: unknown) => boolean;
4342
4367
  declare class BaseTextInputComponent<T extends Input = TextInput> extends BaseInputComponent<T> implements FormValueControl<string> {
4343
4368
  value: ModelSignal<string>;
4344
4369
  private inputElement;
@@ -4347,7 +4372,7 @@ declare class BaseTextInputComponent<T extends Input = TextInput> extends BaseIn
4347
4372
  private autofocused;
4348
4373
  constructor();
4349
4374
  readonly isFocused: import("@angular/core").WritableSignal<boolean>;
4350
- readonly iconColor: import("@angular/core").Signal<"error" | "border" | "focus">;
4375
+ readonly iconColor: import("@angular/core").Signal<"error" | "focus" | "border">;
4351
4376
  protected readonly setValue: (value: string) => void;
4352
4377
  static ɵfac: i0.ɵɵFactoryDeclaration<BaseTextInputComponent<any>, never>;
4353
4378
  static ɵdir: i0.ɵɵDirectiveDeclaration<BaseTextInputComponent<any>, never, never, {
@@ -4968,7 +4993,7 @@ export declare class SectionFilterGroupComponent {
4968
4993
  readonly paddingX: import("@angular/core").InputSignal<boolean | undefined>;
4969
4994
  readonly paddingY: import("@angular/core").InputSignal<boolean | undefined>;
4970
4995
  readonly maxWidth: import("@angular/core").InputSignal<string | undefined>;
4971
- readonly align: import("@angular/core").InputSignal<"center" | "left" | "right" | undefined>;
4996
+ readonly align: import("@angular/core").InputSignal<"left" | "center" | "right" | undefined>;
4972
4997
  readonly config: import("@angular/core").InputSignal<SectionFilterGroupConfig | undefined>;
4973
4998
  /**
4974
4999
  * The whole group's selection, keyed by each Filter's `name` — one key per
@@ -4986,7 +5011,7 @@ export declare class SectionFilterGroupComponent {
4986
5011
  protected readonly resolvedPadding: import("@angular/core").Signal<boolean>;
4987
5012
  protected readonly resolvedPaddingX: import("@angular/core").Signal<boolean>;
4988
5013
  protected readonly resolvedPaddingY: import("@angular/core").Signal<boolean>;
4989
- protected readonly resolvedAlign: import("@angular/core").Signal<"center" | "left" | "right">;
5014
+ protected readonly resolvedAlign: import("@angular/core").Signal<"left" | "center" | "right">;
4990
5015
  protected readonly resolvedMaxWidth: import("@angular/core").Signal<string | undefined>;
4991
5016
  protected readonly noBorder: import("@angular/core").Signal<boolean>;
4992
5017
  /**
@@ -5091,7 +5116,7 @@ export declare class SectionStepperComponent implements OnDestroy {
5091
5116
  readonly lg: import("@angular/core").InputSignal<number | undefined>;
5092
5117
  readonly xl: import("@angular/core").InputSignal<number | undefined>;
5093
5118
  readonly xxl: import("@angular/core").InputSignal<number | undefined>;
5094
- readonly orientation: import("@angular/core").InputSignal<"vertical" | "horizontal" | undefined>;
5119
+ readonly orientation: import("@angular/core").InputSignal<"horizontal" | "vertical" | undefined>;
5095
5120
  readonly stepChange: import("@angular/core").OutputEmitterRef<number>;
5096
5121
  private readonly isCompact;
5097
5122
  private readonly mediaMatched;
@@ -5165,7 +5190,7 @@ export declare class SectionStepperComponent implements OnDestroy {
5165
5190
  export declare class SectionBadgesComponent {
5166
5191
  readonly wrap: import("@angular/core").InputSignal<boolean>;
5167
5192
  readonly border: import("@angular/core").InputSignal<boolean>;
5168
- readonly align: import("@angular/core").InputSignal<"center" | "left" | "right">;
5193
+ readonly align: import("@angular/core").InputSignal<"left" | "center" | "right">;
5169
5194
  private readonly sectionContext;
5170
5195
  protected readonly hasBorder: import("@angular/core").Signal<boolean>;
5171
5196
  static ɵfac: i0.ɵɵFactoryDeclaration<SectionBadgesComponent, never>;
@@ -5313,7 +5338,7 @@ export declare class SectionPaginationComponent {
5313
5338
  * Entries that are not positive numbers drop rather than throw.
5314
5339
  */
5315
5340
  readonly perPageOptions: import("@angular/core").InputSignal<string | undefined>;
5316
- readonly align: import("@angular/core").InputSignal<"center" | "left" | "right">;
5341
+ readonly align: import("@angular/core").InputSignal<"left" | "center" | "right">;
5317
5342
  readonly showPerPage: import("@angular/core").InputSignal<boolean>;
5318
5343
  /** Hides the band outright once everything fits one page. */
5319
5344
  readonly hideOnSinglePage: import("@angular/core").InputSignal<boolean>;
@@ -5651,7 +5676,7 @@ export declare class SectionComponent extends ConfigComponent<SectionConfig> {
5651
5676
  readonly align: import("@angular/core").InputSignal<SectionAlign | undefined>;
5652
5677
  readonly alignX: import("@angular/core").InputSignal<GridAlignX | undefined>;
5653
5678
  readonly alignY: import("@angular/core").InputSignal<GridAlignY | undefined>;
5654
- readonly size: import("@angular/core").InputSignal<"sm" | "md" | "lg" | Size | undefined>;
5679
+ readonly size: import("@angular/core").InputSignal<Size | "sm" | "md" | "lg" | undefined>;
5655
5680
  private readonly parentSize;
5656
5681
  readonly resolvedSize: import("@angular/core").Signal<Size>;
5657
5682
  protected readonly sizeLength: import("@angular/core").Signal<string>;
@@ -5822,8 +5847,8 @@ export declare class SectionHeaderComponent {
5822
5847
  readonly visibilityRule: import("@angular/core").InputSignal<((key: string, data?: unknown) => boolean) | undefined>;
5823
5848
  readonly disableRule: import("@angular/core").InputSignal<((key: string, data?: unknown) => boolean) | undefined>;
5824
5849
  readonly extraData: import("@angular/core").InputSignal<unknown>;
5825
- readonly align: import("@angular/core").InputSignal<"center" | "left" | "right" | undefined>;
5826
- readonly alignment: import("@angular/core").Signal<"center" | "left" | "right">;
5850
+ readonly align: import("@angular/core").InputSignal<"left" | "center" | "right" | undefined>;
5851
+ readonly alignment: import("@angular/core").Signal<"left" | "center" | "right">;
5827
5852
  readonly badge: import("@angular/core").InputSignal<BadgeCount | undefined>;
5828
5853
  readonly showBack: import("@angular/core").InputSignal<boolean>;
5829
5854
  readonly actionButton: import("@angular/core").InputSignal<string | undefined>;
@@ -5842,7 +5867,7 @@ export declare class SectionHeaderComponent {
5842
5867
  protected readonly sidepanel: import("@angular/core").Signal<boolean>;
5843
5868
  protected readonly noBorder: import("@angular/core").Signal<boolean>;
5844
5869
  protected readonly resolvedMaxWidth: import("@angular/core").Signal<string | undefined>;
5845
- protected readonly boxAlign: import("@angular/core").Signal<"center" | "left" | "right">;
5870
+ protected readonly boxAlign: import("@angular/core").Signal<"left" | "center" | "right">;
5846
5871
  protected readonly iconBox: import("@angular/core").Signal<string>;
5847
5872
  protected readonly stickyOn: import("@angular/core").Signal<boolean>;
5848
5873
  protected readonly isSticky: import("@angular/core").Signal<boolean>;
@@ -5990,7 +6015,7 @@ export declare class SectionButtonGroupComponent extends ConfigComponent<Section
5990
6015
  readonly vertical: import("@angular/core").InputSignal<boolean | undefined>;
5991
6016
  readonly align: import("@angular/core").InputSignal<ConfigAlign>;
5992
6017
  readonly variant: import("@angular/core").InputSignal<"spaced" | "joined" | undefined>;
5993
- readonly size: import("@angular/core").InputSignal<"sm" | "md" | "lg" | Size | undefined>;
6018
+ readonly size: import("@angular/core").InputSignal<Size | "sm" | "md" | "lg" | undefined>;
5994
6019
  readonly fullWidth: import("@angular/core").InputSignal<boolean | undefined>;
5995
6020
  private readonly parentSize;
5996
6021
  readonly resolvedSize: import("@angular/core").Signal<Size>;
@@ -5998,7 +6023,7 @@ export declare class SectionButtonGroupComponent extends ConfigComponent<Section
5998
6023
  protected readonly resolvedFullWidth: import("@angular/core").Signal<boolean>;
5999
6024
  protected readonly resolvedVertical: import("@angular/core").Signal<boolean>;
6000
6025
  protected readonly resolvedVariant: import("@angular/core").Signal<"spaced" | "joined">;
6001
- protected readonly resolvedAlign: import("@angular/core").Signal<"center" | "left" | "right" | "bottom" | "top">;
6026
+ protected readonly resolvedAlign: import("@angular/core").Signal<"left" | "top" | "bottom" | "center" | "right">;
6002
6027
  static ɵfac: i0.ɵɵFactoryDeclaration<SectionButtonGroupComponent, never>;
6003
6028
  static ɵcmp: i0.ɵɵComponentDeclaration<SectionButtonGroupComponent, "m-section-button-group", never, {
6004
6029
  "vertical": {
@@ -6030,7 +6055,7 @@ export declare class SectionButtonGroupComponent extends ConfigComponent<Section
6030
6055
  }
6031
6056
  export declare class SectionFooterComponent {
6032
6057
  readonly sticky: import("@angular/core").InputSignal<boolean>;
6033
- readonly align: import("@angular/core").InputSignal<"center" | "left" | "right">;
6058
+ readonly align: import("@angular/core").InputSignal<"left" | "center" | "right">;
6034
6059
  readonly maxWidth: import("@angular/core").InputSignal<string | undefined>;
6035
6060
  readonly fullWidth: import("@angular/core").InputSignal<boolean>;
6036
6061
  private readonly isDesignMode;
@@ -6041,7 +6066,7 @@ export declare class SectionFooterComponent {
6041
6066
  protected readonly sidepanel: import("@angular/core").Signal<boolean>;
6042
6067
  protected readonly noBorder: import("@angular/core").Signal<boolean>;
6043
6068
  protected readonly resolvedMaxWidth: import("@angular/core").Signal<string | undefined>;
6044
- protected readonly boxAlign: import("@angular/core").Signal<"center" | "left" | "right">;
6069
+ protected readonly boxAlign: import("@angular/core").Signal<"left" | "center" | "right">;
6045
6070
  static ɵfac: i0.ɵɵFactoryDeclaration<SectionFooterComponent, never>;
6046
6071
  static ɵcmp: i0.ɵɵComponentDeclaration<SectionFooterComponent, "m-section-footer", never, {
6047
6072
  "sticky": {
@@ -6156,10 +6181,16 @@ export declare class SectionTableComponent<Id extends string = string> extends C
6156
6181
  * where it was written, never by a setting here.
6157
6182
  */
6158
6183
  export declare class SectionTableRowComponent {
6184
+ /**
6185
+ * A click that lands on one of these inside a cell is that control's own
6186
+ * action, not the row's: a cell's button or link must not also follow the row.
6187
+ */
6188
+ private static readonly OWN_CLICK;
6159
6189
  /** The Repeat item codegen gives a repeated row; absent for a static row. */
6160
6190
  readonly item: import("@angular/core").InputSignal<unknown>;
6161
6191
  /** The repeated row's item, or `undefined` for a static row. */
6162
6192
  readonly rowClick: import("@angular/core").OutputEmitterRef<unknown>;
6193
+ protected readonly onClick: (event: MouseEvent) => void;
6163
6194
  static ɵfac: i0.ɵɵFactoryDeclaration<SectionTableRowComponent, never>;
6164
6195
  static ɵcmp: i0.ɵɵComponentDeclaration<SectionTableRowComponent, "tr[m-section-table-row]", never, {
6165
6196
  "item": {
@@ -7771,7 +7802,6 @@ export declare class TextInputComponent extends BaseTextInputComponent<TextOrNum
7771
7802
  touched: import("@angular/core").ModelSignal<boolean>;
7772
7803
  focused: import("@angular/core").InputSignal<boolean>;
7773
7804
  errors: import("@angular/core").InputSignal<readonly WithOptionalFieldTree<ValidationError>[]>;
7774
- showErrors: import("@angular/core").Signal<boolean>;
7775
7805
  readonly hideErrors: import("@angular/core").InputSignal<boolean>;
7776
7806
  protected readonly isNumber: import("@angular/core").Signal<boolean>;
7777
7807
  protected onInput(event: Event): void;
@@ -7837,7 +7867,6 @@ export declare class ClearableInputComponent extends BaseTextInputComponent {
7837
7867
  focused: import("@angular/core").InputSignal<boolean>;
7838
7868
  touched: import("@angular/core").ModelSignal<boolean>;
7839
7869
  errors: import("@angular/core").InputSignal<readonly WithOptionalFieldTree<ValidationError>[]>;
7840
- showErrors: import("@angular/core").Signal<boolean>;
7841
7870
  icon: import("@angular/core").InputSignal<string | undefined>;
7842
7871
  placeholder: import("@angular/core").InputSignal<string>;
7843
7872
  type: import("@angular/core").InputSignal<string>;
@@ -8098,7 +8127,6 @@ export declare class CheckboxInputComponent extends BaseCheckboxInputComponent i
8098
8127
  touched: ModelSignal<boolean>;
8099
8128
  focused: import("@angular/core").InputSignal<boolean>;
8100
8129
  errors: import("@angular/core").InputSignal<readonly WithOptionalFieldTree<ValidationError>[]>;
8101
- showErrors: import("@angular/core").Signal<boolean>;
8102
8130
  readonly optionValue: import("@angular/core").InputSignal<string | undefined>;
8103
8131
  readonly label: import("@angular/core").InputSignal<string | undefined>;
8104
8132
  readonly noTranslate: import("@angular/core").InputSignal<string | boolean | undefined>;
@@ -8406,7 +8434,7 @@ declare class DropdownBoxComponent {
8406
8434
  }
8407
8435
  /** The trigger both option Fields draw: a searchable text input and a chevron. */
8408
8436
  declare const DROPDOWN_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";
8409
- declare const DROPDOWN_IMPORTS: (typeof ButtonComponent | typeof LabelComponent | typeof SelectorDirective | typeof TextOutputComponent | typeof TextInputComponent)[];
8437
+ declare const DROPDOWN_IMPORTS: (typeof LabelComponent | typeof TextOutputComponent | typeof TextInputComponent | typeof ButtonComponent | typeof SelectorDirective)[];
8410
8438
  /**
8411
8439
  * Everything a Dropdown and a Multiselect share: the options, the search, the
8412
8440
  * keyboard walk and the panel. What differs is only what the Field holds — one
@@ -8421,7 +8449,6 @@ declare abstract class BaseDropdownComponent extends BaseInputComponent<Dropdown
8421
8449
  touched: import("@angular/core").ModelSignal<boolean>;
8422
8450
  focused: import("@angular/core").InputSignal<boolean>;
8423
8451
  errors: import("@angular/core").InputSignal<readonly WithOptionalFieldTree<ValidationError>[]>;
8424
- showErrors: Signal<boolean>;
8425
8452
  readonly options: import("@angular/core").InputSignal<DropdownOption<DropdownValue>[] | Signal<DropdownOption<DropdownValue>[]> | undefined>;
8426
8453
  readonly dir: import("@angular/core").InputSignal<Direction$2 | undefined>;
8427
8454
  readonly toggle: import("@angular/core").ModelSignal<boolean>;
@@ -8590,7 +8617,7 @@ declare class ColorPickerBoxComponent implements AfterViewInit, OnDestroy {
8590
8617
  protected readonly _eyedropperConfig: import("@magmonium/one").Button;
8591
8618
  protected readonly _headerContextMenu: ContextMenu;
8592
8619
  protected readonly themeSwatches: import("@angular/core").Signal<{
8593
- key: "text" | "error" | "focus" | "mm" | "mmLite" | "mmDark" | "background" | "border" | "textSecondary" | "errorLight" | "warning" | "successLite" | "success" | "highlight" | "wealth";
8620
+ key: "error" | "focus" | "border" | "background" | "text" | "textSecondary" | "mm" | "mmLite" | "mmDark" | "errorLight" | "warning" | "successLite" | "success" | "highlight" | "wealth";
8594
8621
  color: string;
8595
8622
  }[]>;
8596
8623
  hue: import("@angular/core").WritableSignal<number>;
@@ -9159,7 +9186,6 @@ export declare class RatingInputComponent extends BaseInputComponent<RatingInput
9159
9186
  touched: import("@angular/core").ModelSignal<boolean>;
9160
9187
  focused: import("@angular/core").InputSignal<boolean>;
9161
9188
  errors: import("@angular/core").InputSignal<readonly WithOptionalFieldTree<ValidationError>[]>;
9162
- showErrors: import("@angular/core").Signal<boolean>;
9163
9189
  private readonly themeStore;
9164
9190
  protected readonly stars: number[];
9165
9191
  /** Selected-star fill; undefined leaves the stylesheet's gold in place. */
@@ -9335,7 +9361,7 @@ export declare class FileUploadInputComponent extends BaseInputComponent<FileUpl
9335
9361
  private readonly editorSize;
9336
9362
  private readonly maxSize;
9337
9363
  protected readonly isLocked: import("@angular/core").Signal<boolean>;
9338
- protected readonly dropZoneIconColor: import("@angular/core").Signal<"error" | "border" | "focus">;
9364
+ protected readonly dropZoneIconColor: import("@angular/core").Signal<"error" | "focus" | "border">;
9339
9365
  /** Object URLs of the previews on show, keyed by what the value holds. */
9340
9366
  private readonly previews;
9341
9367
  protected readonly heldFiles: import("@angular/core").Signal<HeldFile[]>;
@@ -9789,17 +9815,17 @@ export declare class SectionFormComponent<T extends object = Record<string, unkn
9789
9815
  protected readonly resolvesConfigAsset = false;
9790
9816
  readonly variant: import("@angular/core").InputSignal<string | undefined>;
9791
9817
  readonly maxWidth: import("@angular/core").InputSignal<string | undefined>;
9792
- readonly heightMode: import("@angular/core").InputSignal<"fixed" | "full" | undefined>;
9818
+ readonly heightMode: import("@angular/core").InputSignal<"full" | "fixed" | undefined>;
9793
9819
  readonly maxHeight: import("@angular/core").InputSignal<string | number | undefined>;
9794
9820
  readonly height: import("@angular/core").InputSignal<string | number | undefined>;
9795
- readonly align: import("@angular/core").InputSignal<"center" | "left" | "right" | undefined>;
9821
+ readonly align: import("@angular/core").InputSignal<"left" | "center" | "right" | undefined>;
9796
9822
  readonly padding: import("@angular/core").InputSignal<string | number | undefined>;
9797
9823
  readonly paddingX: import("@angular/core").InputSignal<string | number | undefined>;
9798
9824
  readonly paddingY: import("@angular/core").InputSignal<string | number | undefined>;
9799
9825
  readonly margin: import("@angular/core").InputSignal<string | number | undefined>;
9800
9826
  readonly marginX: import("@angular/core").InputSignal<string | number | undefined>;
9801
9827
  readonly marginY: import("@angular/core").InputSignal<string | number | undefined>;
9802
- readonly size: import("@angular/core").InputSignal<"sm" | "md" | "lg" | Size | undefined>;
9828
+ readonly size: import("@angular/core").InputSignal<Size | "sm" | "md" | "lg" | undefined>;
9803
9829
  readonly autofocus: import("@angular/core").InputSignal<boolean>;
9804
9830
  data: import("@angular/core").InputSignal<T | undefined>;
9805
9831
  readonly dataChange: import("@angular/core").OutputEmitterRef<T>;
@@ -9844,7 +9870,7 @@ export declare class SectionFormComponent<T extends object = Record<string, unkn
9844
9870
  protected readonly handleSubmit: (event: Event) => void;
9845
9871
  readonly resolvedSize: import("@angular/core").Signal<Size>;
9846
9872
  protected readonly sizeLength: import("@angular/core").Signal<string | null>;
9847
- readonly resolvedAlign: import("@angular/core").Signal<"center" | "left" | "right">;
9873
+ readonly resolvedAlign: import("@angular/core").Signal<"left" | "center" | "right">;
9848
9874
  readonly resolvedVariant: import("@angular/core").Signal<string | undefined>;
9849
9875
  readonly resolvedMaxWidth: import("@angular/core").Signal<string | number | undefined>;
9850
9876
  private readonly resolvedPadding;
@@ -9856,7 +9882,7 @@ export declare class SectionFormComponent<T extends object = Record<string, unkn
9856
9882
  readonly resolvedMinHeight: import("@angular/core").Signal<string | undefined>;
9857
9883
  readonly resolvedMinWidth: import("@angular/core").Signal<string | undefined>;
9858
9884
  readonly resolvedMaxHeight: import("@angular/core").Signal<string | number | undefined>;
9859
- readonly resolvedHeightMode: import("@angular/core").Signal<"fixed" | "full" | undefined>;
9885
+ readonly resolvedHeightMode: import("@angular/core").Signal<"full" | "fixed" | undefined>;
9860
9886
  readonly isFullHeight: import("@angular/core").Signal<boolean>;
9861
9887
  readonly cssMaxHeight: import("@angular/core").Signal<string | undefined>;
9862
9888
  constructor();
@@ -10526,7 +10552,7 @@ export declare class StepperComponent extends ConfigComponent<Stepper> {
10526
10552
  constructor();
10527
10553
  protected readonly isReadonly: import("@angular/core").Signal<boolean>;
10528
10554
  protected readonly stepperDisabled: import("@angular/core").Signal<boolean>;
10529
- protected readonly orientation: import("@angular/core").Signal<"compact" | "vertical">;
10555
+ protected readonly orientation: import("@angular/core").Signal<"vertical" | "compact">;
10530
10556
  protected readonly currentStepLabel: import("@angular/core").Signal<string>;
10531
10557
  protected readonly nextStepLabel: import("@angular/core").Signal<string>;
10532
10558
  protected readonly isLastStep: import("@angular/core").Signal<boolean>;
@@ -10710,7 +10736,7 @@ export declare class ComponentStepperComponent {
10710
10736
  components: import("@angular/core").InputSignal<Type<unknown>[]>;
10711
10737
  labels: import("@angular/core").InputSignal<string[] | undefined>;
10712
10738
  currentIndex: import("@angular/core").InputSignal<number>;
10713
- variant: import("@angular/core").InputSignal<"vertical" | "horizontal">;
10739
+ variant: import("@angular/core").InputSignal<"horizontal" | "vertical">;
10714
10740
  context: import("@angular/core").InputSignal<Record<string, unknown> | undefined>;
10715
10741
  readonly stepChange: import("@angular/core").OutputEmitterRef<number>;
10716
10742
  static ɵfac: i0.ɵɵFactoryDeclaration<ComponentStepperComponent, never>;
@@ -12135,7 +12161,7 @@ export declare class ScoreSetItemComponent {
12135
12161
  private readonly themeStore;
12136
12162
  protected readonly tipId: string;
12137
12163
  protected readonly tipDismissed: import("@angular/core").WritableSignal<boolean>;
12138
- protected readonly shape: import("@angular/core").Signal<"none" | "row" | "primary">;
12164
+ protected readonly shape: import("@angular/core").Signal<"primary" | "none" | "row">;
12139
12165
  protected readonly tone: import("@angular/core").Signal<string | null>;
12140
12166
  protected readonly model: import("@angular/core").Signal<{
12141
12167
  value: number | null;
@@ -12449,7 +12475,7 @@ export declare class PriceLadderComponent {
12449
12475
  protected readonly current: import("@angular/core").Signal<number | null>;
12450
12476
  /** The forecast point: a `forecast` mark, else the `target` input. */
12451
12477
  private readonly targetPoint;
12452
- protected readonly shownAs: import("@angular/core").Signal<"line" | "list">;
12478
+ protected readonly shownAs: import("@angular/core").Signal<"list" | "line">;
12453
12479
  /** Every drawable mark, the `current` and `forecast` stand-ins included. */
12454
12480
  private readonly everyMark;
12455
12481
  /** The reference levels drawn as ticks and labels. */
@@ -12792,7 +12818,7 @@ export declare class ScaleComponent {
12792
12818
  private readonly formatter;
12793
12819
  /** A value as text: a `percent` value is already in percent (12.5 → 12.5%). */
12794
12820
  readonly formatValue: (v: number) => string;
12795
- protected readonly shownAs: import("@angular/core").Signal<"vertical" | "horizontal">;
12821
+ protected readonly shownAs: import("@angular/core").Signal<"horizontal" | "vertical">;
12796
12822
  private readonly marks;
12797
12823
  protected readonly primary: import("@angular/core").Signal<Mark | null>;
12798
12824
  private readonly relations;
@@ -13543,7 +13569,7 @@ export type DocAiPhase = 'idle' | 'asking' | 'question' | 'outline' | 'writing'
13543
13569
  */
13544
13570
  export declare class DocEditorComponent implements ControlValueAccessor {
13545
13571
  protected readonly groups: readonly import("@magmonium/one").DocToolbarGroup[];
13546
- protected readonly icons: Record<"code" | "link" | "table" | "strike" | "list" | "bold" | "heading" | "italic" | "quote", string>;
13572
+ protected readonly icons: Record<"bold" | "italic" | "strike" | "heading" | "list" | "quote" | "link" | "code" | "table", string>;
13547
13573
  protected readonly docActionKey: typeof docActionKey;
13548
13574
  private readonly translate;
13549
13575
  protected readonly value: import("@angular/core").WritableSignal<string>;
@@ -15552,7 +15578,7 @@ export declare class ConfirmComponent {
15552
15578
  * every confirmation drawn before this.
15553
15579
  */
15554
15580
  params: import("@angular/core").InputSignal<Record<string, string>>;
15555
- type: import("@angular/core").InputSignal<"warning" | "success" | "info" | "danger">;
15581
+ type: import("@angular/core").InputSignal<"warning" | "success" | "danger" | "info">;
15556
15582
  /**
15557
15583
  * Whether the question can be refused. `yes` is an acknowledgement — the one
15558
15584
  * button commits and there is nothing else to press — and stays the default,
@@ -15569,7 +15595,7 @@ export declare class ConfirmComponent {
15569
15595
  cancelLabel: import("@angular/core").InputSignal<string>;
15570
15596
  protected readonly confirmText: import("@angular/core").Signal<string>;
15571
15597
  protected readonly cancelText: import("@angular/core").Signal<string>;
15572
- protected readonly accent: import("@angular/core").Signal<"error" | "mm" | "success" | "warning">;
15598
+ protected readonly accent: import("@angular/core").Signal<"error" | "warning" | "success" | "mm">;
15573
15599
  protected readonly iconName: import("@angular/core").Signal<"exclamation-triangle" | "info" | "trash" | "check-circle">;
15574
15600
  protected accept(): void;
15575
15601
  protected decline(): void;
@@ -1 +0,0 @@
1
- {"version":3,"file":"magmonium-one-base-dropdown-CmUfiOAb.mjs","names":[],"sources":["../../../../libs/one/src/lib/shared/ui/input/ui/dropdown/dropdown-box.ts","../../../../libs/one/src/lib/shared/ui/input/ui/dropdown/base-dropdown.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n effect,\n ElementRef,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { TranslatePipe } from '../../../../pipe/translate';\nimport { DropdownOption, DropdownValue } from '../../model/input';\n\n@Component({\n selector: 'm-dropdown-box',\n imports: [TranslatePipe],\n template: `\n <ul class=\"dropdown-box\" role=\"listbox\">\n @for (option of options(); track option.value; let i = $index) {\n @let selectedState = isSelected(option.value);\n <li\n class=\"dropdown-box__option\"\n [class.dropdown-box__option--selected]=\"selectedState\"\n [class.dropdown-box__option--disabled]=\"option.disabled\"\n [class.dropdown-box__option--active]=\"i === activeIndex()\"\n [style.--m-dropdown-option-depth]=\"option.depth\"\n role=\"option\"\n [attr.aria-selected]=\"selectedState\"\n [attr.data-value]=\"option.value\"\n (click)=\"selectOption(option)\"\n (keydown.enter)=\"selectOption(option)\"\n tabindex=\"0\"\n >\n <!-- A group header is a row, never a choice: no box to tick. -->\n @if (multiple() && !option.disabled) {\n <input\n type=\"checkbox\"\n class=\"dropdown-box__checkbox\"\n [checked]=\"selectedState\"\n tabindex=\"-1\"\n (click)=\"$event.preventDefault()\"\n />\n }\n @if (option.noTranslate) {\n {{ option.label }}\n } @else {\n {{ option.label | translate }}\n }\n </li>\n } @empty {\n <li class=\"dropdown-box__empty\">\n {{ 'no-results-found' | translate }}\n </li>\n }\n </ul>\n `,\n styleUrl: './dropdown-box.sass',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DropdownBoxComponent {\n readonly options = input<DropdownOption<DropdownValue>[]>([]);\n /** The values ticked, as a list whichever Field drew the panel. */\n readonly selected = input<readonly DropdownValue[]>([]);\n readonly multiple = input<boolean>(false);\n readonly activeIndex = input<number>(-1);\n readonly action = output<DropdownOption<DropdownValue>>();\n\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n\n // Keep the keyboard-active option in view as ↑/↓ walk a scrolled list.\n constructor() {\n effect(() => {\n const index = this.activeIndex();\n if (index < 0) return;\n this.host.nativeElement\n .querySelectorAll('.dropdown-box__option')\n [index]?.scrollIntoView?.({ block: 'nearest' });\n });\n }\n\n protected readonly isSelected = (value: DropdownValue): boolean =>\n this.selected().includes(value);\n\n // Only emit a selection event for enabled options.\n protected readonly selectOption = (\n option: DropdownOption<DropdownValue>\n ): void => {\n if (option.disabled) return;\n this.action.emit(option);\n };\n}\n","import {\n computed,\n Directive,\n ElementRef,\n inject,\n input,\n inputBinding,\n linkedSignal,\n model,\n outputBinding,\n Signal,\n signal,\n viewChild,\n} from '@angular/core';\nimport { ValidationError, WithOptionalFieldTree } from '@angular/forms/signals';\nimport { LabelComponent } from '../label';\nimport { TextOutputComponent } from '../../../text-output';\nimport { BaseInputComponent } from '../../lib/base-input';\nimport { Button } from '../../../button/type/button';\nimport { ButtonComponent } from '../../../button/ui/button';\nimport { TranslateService } from '../../../../services';\nimport { SelectorConfig, SelectorDirective } from '../../../../directives';\nimport { Direction } from '../../../../directives/selector/selector-type';\nimport { DropdownBoxComponent } from './dropdown-box';\nimport {\n DropdownInput,\n DropdownOption,\n DropdownValue,\n TextInput,\n} from '../../model/input';\nimport { TextInputComponent } from '../text/text';\nimport { assetOptions } from '../../lib/options-asset';\n\n/** The trigger both option Fields draw: a searchable text input and a chevron. */\nexport const DROPDOWN_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`;\n\nexport const DROPDOWN_IMPORTS = [\n LabelComponent,\n TextOutputComponent,\n TextInputComponent,\n ButtonComponent,\n SelectorDirective,\n];\n\n/**\n * Everything a Dropdown and a Multiselect share: the options, the search, the\n * keyboard walk and the panel. What differs is only what the Field holds — one\n * value or a list — so a subclass says which values are selected and what a\n * pick does to them.\n */\n@Directive()\nexport abstract class BaseDropdownComponent extends BaseInputComponent<DropdownInput> {\n public override config = input<Partial<DropdownInput> | undefined>();\n public override required = input<boolean>(false);\n public override disabled = input<boolean>(false);\n public override invalid = input<boolean>(false);\n public override touched = model<boolean>(false);\n public override focused = input<boolean>(false);\n public override errors = input<readonly WithOptionalFieldTree<ValidationError>[]>(\n []\n );\n public override showErrors = computed(() => this.touched() && this.invalid());\n\n readonly options = input<\n DropdownOption<DropdownValue>[] | Signal<DropdownOption<DropdownValue>[]>\n >();\n readonly dir = input<Direction>();\n readonly toggle = model(false);\n readonly searchTerm = signal('');\n readonly isFocused = signal(false);\n readonly chevron = computed(\n () =>\n <Button>{\n icon: this.toggle() ? 'chevron-up' : 'chevron-down',\n one: true,\n variant: 'ghost',\n // In-Field control, never the form's submit — without this the Button\n // reads as the submit control and greys out while the form is invalid.\n type: 'button',\n // Chevron tracks the trigger's border like the text input's own icon:\n // red while the Field shows errors, focus tint while focused, border at rest.\n color: this.showErrors()\n ? 'error'\n : this.isFocused()\n ? 'focus'\n : 'border',\n // The trigger input is the Field's tab stop; the chevron only repeats\n // what clicking that input already does, so Tab walks past it.\n tabindex: -1,\n }\n );\n\n /** The values the Field holds now, as a list whichever kind it is. */\n protected abstract readonly selectedValues: Signal<readonly DropdownValue[]>;\n /** Whether the panel ticks rows and stays open across picks. */\n protected abstract readonly multiple: boolean;\n /** What picking `option` does to the Field's value. */\n protected abstract selectOption(option: DropdownOption<DropdownValue>): void;\n\n protected readonly triggerInputConfig = computed(() => {\n const dropdown = this.config() as DropdownInput | undefined;\n return <Partial<TextInput>>{\n name: dropdown?.name,\n icon: dropdown?.icon,\n one: dropdown?.one,\n placeholder: this.placeholderText(),\n readonly: this.readonly() || !!dropdown?.readonly,\n };\n });\n\n protected readonly dropdownOptions = computed(\n (): DropdownOption<DropdownValue>[] => {\n const runtimeOptions = this.options();\n const source =\n runtimeOptions ?? (this.config() as DropdownInput | undefined)?.options;\n if (typeof source === 'function') return source();\n if (source?.length) return source;\n return this.assetOptions();\n }\n );\n\n private readonly translateService = inject(TranslateService);\n\n protected readonly assetOptions = assetOptions(\n () => (this.config() as DropdownInput | undefined)?.optionsAsset\n );\n\n /** An option's text: authored as it stands, a key translated. */\n private readonly optionLabel = (\n option?: DropdownOption<DropdownValue>\n ): string => {\n if (!option?.label) return '';\n return option.noTranslate\n ? option.label\n : this.translateService.translate(option.label);\n };\n\n protected readonly filteredOptions = computed(\n (): DropdownOption<DropdownValue>[] => {\n const search = this.searchTerm().toLowerCase();\n if (!search) return this.dropdownOptions();\n return this.dropdownOptions().filter((o) => {\n const label = this.optionLabel(o).toLowerCase();\n return (\n label.includes(search) ||\n String(o.value).toLowerCase().includes(search)\n );\n });\n }\n );\n\n /** The option ↑/↓ point at while the panel is open; -1 is none. Reset as the search narrows the list. */\n protected readonly activeIndex = linkedSignal<\n DropdownOption<DropdownValue>[],\n number\n >({\n source: this.filteredOptions,\n computation: (options) =>\n this.searchTerm() ? this.nextEnabled(options, -1, 1) : -1,\n });\n\n /** The enabled option `step` rows past `from`, wrapping; `from` itself when none. */\n private readonly nextEnabled = (\n options: DropdownOption<DropdownValue>[],\n from: number,\n step: 1 | -1\n ): number => {\n for (let i = 1; i <= options.length; i++) {\n const index =\n (((from + step * i) % options.length) + options.length) %\n options.length;\n if (!options[index].disabled) return index;\n }\n return from;\n };\n\n /** One pick reads as its option's label, several as a count. */\n private readonly selectionLabel = computed((): string => {\n const values = this.selectedValues();\n if (values.length === 0) return '';\n if (values.length === 1) {\n return this.optionLabel(\n this.dropdownOptions().find((o) => o.value === values[0])\n );\n }\n const translation = this.translateService.translate(\n `selected?count=${values.length}`\n );\n return translation.includes('selected')\n ? `${values.length} Selected`\n : translation;\n });\n\n protected readonly displayValue = computed((): string =>\n this.toggle() ? this.searchTerm() : this.selectionLabel()\n );\n\n protected readonly placeholderText = computed((): string => {\n if (this.toggle()) {\n const label = this.selectionLabel();\n if (label) return label;\n }\n const placeholder = (this.config() as DropdownInput | undefined)\n ?.placeholder;\n return placeholder ? this.translateService.translate(placeholder) : '';\n });\n\n private readonly wrapperRef =\n viewChild<ElementRef<HTMLDivElement>>('wrapper');\n\n protected readonly selectorConfig = computed<\n SelectorConfig<DropdownBoxComponent>\n >(() => ({\n component: DropdownBoxComponent,\n base: 'm-dropdown-input',\n matchTriggerWidth: true,\n toggle: true,\n dir: this.dir(),\n bindings: [\n inputBinding('options', this.filteredOptions),\n inputBinding('selected', this.selectedValues),\n inputBinding('multiple', () => this.multiple),\n inputBinding('activeIndex', this.activeIndex),\n outputBinding<DropdownOption<DropdownValue>>('action', (option) =>\n this.selectOption(option)\n ),\n ],\n }));\n\n /** Shuts the panel after a pick, the way a click on the trigger would. */\n protected readonly closePanel = (): void => {\n this.toggle.set(false);\n this.searchTerm.set('');\n setTimeout(() => this.wrapperRef()?.nativeElement.click(), 0);\n };\n\n protected readonly onOpened = (): void => {\n this.toggle.set(true);\n this.searchTerm.set('');\n const current = this.selectedValues()[0];\n this.activeIndex.set(\n this.filteredOptions().findIndex((o) => o.value === current)\n );\n };\n\n // Focus stays in the trigger input (it is the search box), so ↑/↓ move the\n // active option rather than DOM focus. Closed, ArrowDown bubbles on to\n // SelectorDirective, which opens the panel.\n protected readonly onArrow = (event: Event, step: 1 | -1): void => {\n if (!this.toggle()) return;\n event.preventDefault();\n this.activeIndex.update((index) =>\n this.nextEnabled(this.filteredOptions(), index, step)\n );\n };\n\n // Enter never reaches SelectorDirective (it would toggle the panel); open,\n // it picks the active option.\n protected readonly onEnter = (event: Event): void => {\n event.stopPropagation();\n if (!this.toggle()) return;\n event.preventDefault();\n const option = this.filteredOptions()[this.activeIndex()];\n if (option && !option.disabled) this.selectOption(option);\n };\n\n protected readonly onClosed = (): void => {\n this.toggle.set(false);\n this.searchTerm.set('');\n };\n\n protected readonly onInput = (value: string): void => {\n this.searchTerm.set(value);\n };\n\n protected readonly preventToggleWhenOpen = (event: Event): void => {\n if (this.toggle() || this.readonly() || this.config()?.readonly) {\n event.stopPropagation();\n }\n };\n}\n"],"mappings":"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"}