@angular/material 17.0.0 → 17.1.0-next.0

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 (182) hide show
  1. package/autocomplete/index.d.ts +0 -2
  2. package/button/_button-theme.scss +4 -0
  3. package/button/_icon-button-theme.scss +5 -1
  4. package/card/testing/index.d.ts +1 -1
  5. package/checkbox/index.d.ts +1 -1
  6. package/chips/index.d.ts +71 -67
  7. package/core/index.d.ts +1 -1
  8. package/core/ripple/_ripple-theme.scss +51 -19
  9. package/core/tokens/m2/_index.scss +29 -8
  10. package/datepicker/index.d.ts +21 -23
  11. package/datepicker/testing/index.d.ts +1 -1
  12. package/dialog/index.d.ts +1 -1
  13. package/dialog/testing/index.d.ts +1 -1
  14. package/esm2022/autocomplete/autocomplete-trigger.mjs +7 -7
  15. package/esm2022/button/icon-button.mjs +4 -4
  16. package/esm2022/card/testing/card-harness.mjs +9 -1
  17. package/esm2022/checkbox/checkbox.mjs +29 -14
  18. package/esm2022/chips/chip-action.mjs +14 -13
  19. package/esm2022/chips/chip-grid.mjs +29 -16
  20. package/esm2022/chips/chip-input.mjs +14 -17
  21. package/esm2022/chips/chip-listbox.mjs +19 -22
  22. package/esm2022/chips/chip-option.mjs +11 -10
  23. package/esm2022/chips/chip-row.mjs +4 -4
  24. package/esm2022/chips/chip-set.mjs +19 -18
  25. package/esm2022/chips/chip.mjs +49 -42
  26. package/esm2022/core/ripple/ripple-ref.mjs +10 -2
  27. package/esm2022/core/ripple/ripple-renderer.mjs +11 -11
  28. package/esm2022/core/version.mjs +1 -1
  29. package/esm2022/datepicker/calendar-body.mjs +2 -2
  30. package/esm2022/datepicker/date-range-input.mjs +10 -10
  31. package/esm2022/datepicker/datepicker-base.mjs +41 -49
  32. package/esm2022/datepicker/datepicker-input-base.mjs +6 -6
  33. package/esm2022/datepicker/datepicker-toggle.mjs +6 -6
  34. package/esm2022/datepicker/testing/calendar-harness.mjs +11 -4
  35. package/esm2022/dialog/dialog-ref.mjs +10 -4
  36. package/esm2022/dialog/testing/dialog-harness.mjs +11 -4
  37. package/esm2022/dialog/testing/public-api.mjs +2 -2
  38. package/esm2022/expansion/accordion.mjs +7 -13
  39. package/esm2022/expansion/expansion-panel-header.mjs +13 -13
  40. package/esm2022/expansion/expansion-panel.mjs +6 -6
  41. package/esm2022/expansion/testing/expansion-harness.mjs +14 -6
  42. package/esm2022/grid-list/testing/grid-tile-harness.mjs +9 -3
  43. package/esm2022/icon/icon.mjs +24 -28
  44. package/esm2022/icon/testing/icon-harness-filters.mjs +7 -2
  45. package/esm2022/icon/testing/icon-harness.mjs +4 -3
  46. package/esm2022/list/list-base.mjs +6 -6
  47. package/esm2022/list/testing/list-item-harness-base.mjs +18 -6
  48. package/esm2022/list/testing/public-api.mjs +2 -2
  49. package/esm2022/paginator/paginator.mjs +32 -35
  50. package/esm2022/progress-bar/progress-bar.mjs +25 -20
  51. package/esm2022/progress-spinner/progress-spinner.mjs +34 -33
  52. package/esm2022/radio/radio.mjs +40 -34
  53. package/esm2022/select/select.mjs +45 -37
  54. package/esm2022/slider/slider-input.mjs +23 -22
  55. package/esm2022/slider/slider-interface.mjs +16 -1
  56. package/esm2022/slider/slider-thumb.mjs +6 -6
  57. package/esm2022/slider/slider.mjs +73 -72
  58. package/esm2022/slider/testing/slider-harness-filters.mjs +7 -2
  59. package/esm2022/slider/testing/slider-harness.mjs +4 -3
  60. package/esm2022/slider/testing/slider-thumb-harness.mjs +3 -2
  61. package/esm2022/sort/sort-header.mjs +16 -24
  62. package/esm2022/sort/sort.mjs +12 -19
  63. package/esm2022/stepper/step-header.mjs +7 -12
  64. package/esm2022/stepper/stepper.mjs +1 -1
  65. package/esm2022/stepper/testing/step-harness-filters.mjs +7 -2
  66. package/esm2022/stepper/testing/stepper-harness.mjs +4 -3
  67. package/esm2022/tabs/paginated-tab-header.mjs +12 -18
  68. package/esm2022/tabs/tab-group.mjs +54 -70
  69. package/esm2022/tabs/tab-header.mjs +7 -13
  70. package/esm2022/tabs/tab-label-wrapper.mjs +12 -8
  71. package/esm2022/tabs/tab-nav-bar/tab-nav-bar.mjs +43 -37
  72. package/esm2022/tabs/tab.mjs +12 -12
  73. package/esm2022/toolbar/testing/toolbar-harness.mjs +7 -2
  74. package/esm2022/toolbar/toolbar.mjs +11 -16
  75. package/esm2022/tree/node.mjs +20 -20
  76. package/esm2022/tree/padding.mjs +11 -4
  77. package/expansion/index.d.ts +11 -19
  78. package/expansion/testing/index.d.ts +1 -1
  79. package/fesm2022/autocomplete.mjs +6 -6
  80. package/fesm2022/autocomplete.mjs.map +1 -1
  81. package/fesm2022/button.mjs +4 -4
  82. package/fesm2022/button.mjs.map +1 -1
  83. package/fesm2022/card/testing.mjs +9 -1
  84. package/fesm2022/card/testing.mjs.map +1 -1
  85. package/fesm2022/checkbox.mjs +29 -14
  86. package/fesm2022/checkbox.mjs.map +1 -1
  87. package/fesm2022/chips.mjs +144 -119
  88. package/fesm2022/chips.mjs.map +1 -1
  89. package/fesm2022/core.mjs +20 -12
  90. package/fesm2022/core.mjs.map +1 -1
  91. package/fesm2022/datepicker/testing.mjs +11 -4
  92. package/fesm2022/datepicker/testing.mjs.map +1 -1
  93. package/fesm2022/datepicker.mjs +57 -62
  94. package/fesm2022/datepicker.mjs.map +1 -1
  95. package/fesm2022/dialog/testing.mjs +11 -4
  96. package/fesm2022/dialog/testing.mjs.map +1 -1
  97. package/fesm2022/dialog.mjs +10 -4
  98. package/fesm2022/dialog.mjs.map +1 -1
  99. package/fesm2022/expansion/testing.mjs +14 -6
  100. package/fesm2022/expansion/testing.mjs.map +1 -1
  101. package/fesm2022/expansion.mjs +22 -26
  102. package/fesm2022/expansion.mjs.map +1 -1
  103. package/fesm2022/grid-list/testing.mjs +9 -3
  104. package/fesm2022/grid-list/testing.mjs.map +1 -1
  105. package/fesm2022/icon/testing.mjs +10 -3
  106. package/fesm2022/icon/testing.mjs.map +1 -1
  107. package/fesm2022/icon.mjs +24 -27
  108. package/fesm2022/icon.mjs.map +1 -1
  109. package/fesm2022/list/testing.mjs +18 -6
  110. package/fesm2022/list/testing.mjs.map +1 -1
  111. package/fesm2022/list.mjs +5 -5
  112. package/fesm2022/list.mjs.map +1 -1
  113. package/fesm2022/paginator.mjs +31 -34
  114. package/fesm2022/paginator.mjs.map +1 -1
  115. package/fesm2022/progress-bar.mjs +25 -19
  116. package/fesm2022/progress-bar.mjs.map +1 -1
  117. package/fesm2022/progress-spinner.mjs +34 -32
  118. package/fesm2022/progress-spinner.mjs.map +1 -1
  119. package/fesm2022/radio.mjs +41 -34
  120. package/fesm2022/radio.mjs.map +1 -1
  121. package/fesm2022/select.mjs +44 -36
  122. package/fesm2022/select.mjs.map +1 -1
  123. package/fesm2022/slider/testing.mjs +11 -4
  124. package/fesm2022/slider/testing.mjs.map +1 -1
  125. package/fesm2022/slider.mjs +109 -91
  126. package/fesm2022/slider.mjs.map +1 -1
  127. package/fesm2022/sort.mjs +25 -38
  128. package/fesm2022/sort.mjs.map +1 -1
  129. package/fesm2022/stepper/testing.mjs +10 -3
  130. package/fesm2022/stepper/testing.mjs.map +1 -1
  131. package/fesm2022/stepper.mjs +8 -12
  132. package/fesm2022/stepper.mjs.map +1 -1
  133. package/fesm2022/tabs.mjs +130 -141
  134. package/fesm2022/tabs.mjs.map +1 -1
  135. package/fesm2022/toolbar/testing.mjs +7 -2
  136. package/fesm2022/toolbar/testing.mjs.map +1 -1
  137. package/fesm2022/toolbar.mjs +11 -15
  138. package/fesm2022/toolbar.mjs.map +1 -1
  139. package/fesm2022/tree.mjs +22 -21
  140. package/fesm2022/tree.mjs.map +1 -1
  141. package/form-field/_form-field-theme.scss +85 -49
  142. package/grid-list/_grid-list-theme.scss +47 -14
  143. package/grid-list/testing/index.d.ts +1 -1
  144. package/icon/index.d.ts +10 -16
  145. package/icon/testing/index.d.ts +1 -1
  146. package/input/_input-theme.scss +39 -12
  147. package/list/_list-theme.scss +115 -83
  148. package/list/testing/index.d.ts +2 -2
  149. package/package.json +7 -7
  150. package/paginator/index.d.ts +16 -17
  151. package/prebuilt-themes/deeppurple-amber.css +1 -1
  152. package/prebuilt-themes/indigo-pink.css +1 -1
  153. package/prebuilt-themes/pink-bluegrey.css +1 -1
  154. package/prebuilt-themes/purple-green.css +1 -1
  155. package/progress-bar/index.d.ts +12 -15
  156. package/progress-spinner/index.d.ts +14 -15
  157. package/radio/index.d.ts +20 -22
  158. package/schematics/ng-add/index.js +2 -2
  159. package/schematics/ng-add/index.mjs +2 -2
  160. package/schematics/ng-generate/address-form/files/__path__/__name@dasherize@if-flat__/__name@dasherize__.component.html.template +28 -29
  161. package/schematics/ng-generate/dashboard/files/__path__/__name@dasherize@if-flat__/__name@dasherize__.component.html.template +21 -19
  162. package/schematics/ng-generate/mdc-migration/index_bundled.js +55 -48
  163. package/schematics/ng-generate/mdc-migration/index_bundled.js.map +3 -3
  164. package/schematics/ng-generate/navigation/files/__path__/__name@dasherize@if-flat__/__name@dasherize__.component.html.template +9 -8
  165. package/schematics/ng-generate/navigation/files/__path__/__name@dasherize@if-flat__/__name@dasherize__.component.ts.template +1 -2
  166. package/schematics/ng-update/index_bundled.js +31 -31
  167. package/select/index.d.ts +22 -17
  168. package/slide-toggle/_slide-toggle-theme.scss +78 -44
  169. package/slider/index.d.ts +30 -30
  170. package/slider/testing/index.d.ts +1 -1
  171. package/sort/_sort-theme.scss +51 -20
  172. package/sort/index.d.ts +15 -20
  173. package/stepper/_stepper-theme.scss +58 -25
  174. package/stepper/index.d.ts +5 -15
  175. package/stepper/testing/index.d.ts +1 -1
  176. package/table/_table-theme.scss +53 -20
  177. package/tabs/_tabs-theme.scss +87 -51
  178. package/tabs/index.d.ts +61 -64
  179. package/toolbar/index.d.ts +5 -12
  180. package/toolbar/testing/index.d.ts +1 -1
  181. package/tree/_tree-theme.scss +53 -21
  182. package/tree/index.d.ts +13 -15
package/radio/index.d.ts CHANGED
@@ -1,17 +1,12 @@
1
- import { _AbstractConstructor } from '@angular/material/core';
2
1
  import { AfterContentInit } from '@angular/core';
3
2
  import { AfterViewInit } from '@angular/core';
4
- import { BooleanInput } from '@angular/cdk/coercion';
5
- import { CanDisableRipple } from '@angular/material/core';
6
3
  import { ChangeDetectorRef } from '@angular/core';
7
- import { _Constructor } from '@angular/material/core';
8
4
  import { ControlValueAccessor } from '@angular/forms';
9
5
  import { DoCheck } from '@angular/core';
10
6
  import { ElementRef } from '@angular/core';
11
7
  import { EventEmitter } from '@angular/core';
12
8
  import { FocusMonitor } from '@angular/cdk/a11y';
13
9
  import { FocusOrigin } from '@angular/cdk/a11y';
14
- import { HasTabIndex } from '@angular/material/core';
15
10
  import * as i0 from '@angular/core';
16
11
  import * as i2 from '@angular/material/core';
17
12
  import * as i3 from '@angular/common';
@@ -53,7 +48,8 @@ export declare const MAT_RADIO_GROUP: InjectionToken<MatRadioGroup>;
53
48
  */
54
49
  export declare const MAT_RADIO_GROUP_CONTROL_VALUE_ACCESSOR: any;
55
50
 
56
- export declare class MatRadioButton extends _MatRadioButtonMixinBase implements OnInit, AfterViewInit, DoCheck, OnDestroy, CanDisableRipple, HasTabIndex {
51
+ export declare class MatRadioButton implements OnInit, AfterViewInit, DoCheck, OnDestroy {
52
+ protected _elementRef: ElementRef;
57
53
  private _changeDetector;
58
54
  private _focusMonitor;
59
55
  private _radioDispatcher;
@@ -69,9 +65,13 @@ export declare class MatRadioButton extends _MatRadioButtonMixinBase implements
69
65
  ariaLabelledby: string;
70
66
  /** The 'aria-describedby' attribute is read after the element's label and field type. */
71
67
  ariaDescribedby: string;
68
+ /** Whether ripples are disabled inside the radio button */
69
+ disableRipple: boolean;
70
+ /** Tabindex of the radio button. */
71
+ tabIndex: number;
72
72
  /** Whether this radio button is checked. */
73
73
  get checked(): boolean;
74
- set checked(value: BooleanInput);
74
+ set checked(value: boolean);
75
75
  /** The value of this radio button. */
76
76
  get value(): any;
77
77
  set value(value: any);
@@ -81,10 +81,10 @@ export declare class MatRadioButton extends _MatRadioButtonMixinBase implements
81
81
  private _labelPosition;
82
82
  /** Whether the radio button is disabled. */
83
83
  get disabled(): boolean;
84
- set disabled(value: BooleanInput);
84
+ set disabled(value: boolean);
85
85
  /** Whether the radio button is required. */
86
86
  get required(): boolean;
87
- set required(value: BooleanInput);
87
+ set required(value: boolean);
88
88
  /** Theme color of the radio button. */
89
89
  get color(): ThemePalette;
90
90
  set color(newValue: ThemePalette);
@@ -115,7 +115,7 @@ export declare class MatRadioButton extends _MatRadioButtonMixinBase implements
115
115
  _inputElement: ElementRef<HTMLInputElement>;
116
116
  /** Whether animations are disabled. */
117
117
  _noopAnimations: boolean;
118
- constructor(radioGroup: MatRadioGroup, elementRef: ElementRef, _changeDetector: ChangeDetectorRef, _focusMonitor: FocusMonitor, _radioDispatcher: UniqueSelectionDispatcher, animationMode?: string, _providerOverride?: MatRadioDefaultOptions | undefined, tabIndex?: string);
118
+ constructor(radioGroup: MatRadioGroup, _elementRef: ElementRef, _changeDetector: ChangeDetectorRef, _focusMonitor: FocusMonitor, _radioDispatcher: UniqueSelectionDispatcher, animationMode?: string, _providerOverride?: MatRadioDefaultOptions | undefined, tabIndex?: string);
119
119
  /** Focuses the radio button. */
120
120
  focus(options?: FocusOptions, origin?: FocusOrigin): void;
121
121
  /**
@@ -141,18 +141,14 @@ export declare class MatRadioButton extends _MatRadioButtonMixinBase implements
141
141
  /** Gets the tabindex for the underlying input element. */
142
142
  private _updateTabIndex;
143
143
  static ɵfac: i0.ɵɵFactoryDeclaration<MatRadioButton, [{ optional: true; }, null, null, null, null, { optional: true; }, { optional: true; }, { attribute: "tabindex"; }]>;
144
- static ɵcmp: i0.ɵɵComponentDeclaration<MatRadioButton, "mat-radio-button", ["matRadioButton"], { "disableRipple": { "alias": "disableRipple"; "required": false; }; "tabIndex": { "alias": "tabIndex"; "required": false; }; "id": { "alias": "id"; "required": false; }; "name": { "alias": "name"; "required": false; }; "ariaLabel": { "alias": "aria-label"; "required": false; }; "ariaLabelledby": { "alias": "aria-labelledby"; "required": false; }; "ariaDescribedby": { "alias": "aria-describedby"; "required": false; }; "checked": { "alias": "checked"; "required": false; }; "value": { "alias": "value"; "required": false; }; "labelPosition": { "alias": "labelPosition"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "required": { "alias": "required"; "required": false; }; "color": { "alias": "color"; "required": false; }; }, { "change": "change"; }, never, ["*"], false, never>;
144
+ static ɵcmp: i0.ɵɵComponentDeclaration<MatRadioButton, "mat-radio-button", ["matRadioButton"], { "id": { "alias": "id"; "required": false; }; "name": { "alias": "name"; "required": false; }; "ariaLabel": { "alias": "aria-label"; "required": false; }; "ariaLabelledby": { "alias": "aria-labelledby"; "required": false; }; "ariaDescribedby": { "alias": "aria-describedby"; "required": false; }; "disableRipple": { "alias": "disableRipple"; "required": false; }; "tabIndex": { "alias": "tabIndex"; "required": false; }; "checked": { "alias": "checked"; "required": false; }; "value": { "alias": "value"; "required": false; }; "labelPosition": { "alias": "labelPosition"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "required": { "alias": "required"; "required": false; }; "color": { "alias": "color"; "required": false; }; }, { "change": "change"; }, never, ["*"], false, never>;
145
+ static ngAcceptInputType_disableRipple: unknown;
146
+ static ngAcceptInputType_tabIndex: unknown;
147
+ static ngAcceptInputType_checked: unknown;
148
+ static ngAcceptInputType_disabled: unknown;
149
+ static ngAcceptInputType_required: unknown;
145
150
  }
146
151
 
147
- /** @docs-private */
148
- declare abstract class MatRadioButtonBase {
149
- _elementRef: ElementRef;
150
- abstract disabled: boolean;
151
- constructor(_elementRef: ElementRef);
152
- }
153
-
154
- declare const _MatRadioButtonMixinBase: _Constructor<CanDisableRipple> & _AbstractConstructor<CanDisableRipple> & _Constructor<HasTabIndex> & _AbstractConstructor<HasTabIndex> & typeof MatRadioButtonBase;
155
-
156
152
  /** Change event object emitted by radio button and radio group. */
157
153
  export declare class MatRadioChange {
158
154
  /** The radio button that emits the change event. */
@@ -231,10 +227,10 @@ export declare class MatRadioGroup implements AfterContentInit, OnDestroy, Contr
231
227
  set selected(selected: MatRadioButton | null);
232
228
  /** Whether the radio group is disabled */
233
229
  get disabled(): boolean;
234
- set disabled(value: BooleanInput);
230
+ set disabled(value: boolean);
235
231
  /** Whether the radio group is required */
236
232
  get required(): boolean;
237
- set required(value: BooleanInput);
233
+ set required(value: boolean);
238
234
  constructor(_changeDetector: ChangeDetectorRef);
239
235
  /**
240
236
  * Initialize properties once content children are available.
@@ -277,6 +273,8 @@ export declare class MatRadioGroup implements AfterContentInit, OnDestroy, Contr
277
273
  setDisabledState(isDisabled: boolean): void;
278
274
  static ɵfac: i0.ɵɵFactoryDeclaration<MatRadioGroup, never>;
279
275
  static ɵdir: i0.ɵɵDirectiveDeclaration<MatRadioGroup, "mat-radio-group", ["matRadioGroup"], { "color": { "alias": "color"; "required": false; }; "name": { "alias": "name"; "required": false; }; "labelPosition": { "alias": "labelPosition"; "required": false; }; "value": { "alias": "value"; "required": false; }; "selected": { "alias": "selected"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "required": { "alias": "required"; "required": false; }; }, { "change": "change"; }, ["_radios"], never, false, never>;
276
+ static ngAcceptInputType_disabled: unknown;
277
+ static ngAcceptInputType_required: unknown;
280
278
  }
281
279
 
282
280
  export declare class MatRadioModule {
@@ -18,7 +18,7 @@ const package_config_1 = require("./package-config");
18
18
  * Note that the fallback version range does not use caret, but tilde because that is
19
19
  * the default for Angular framework dependencies in CLI projects.
20
20
  */
21
- const fallbackMaterialVersionRange = `~17.0.0`;
21
+ const fallbackMaterialVersionRange = `~17.1.0-next.0`;
22
22
  /**
23
23
  * Schematic factory entry-point for the `ng-add` schematic. The ng-add schematic will be
24
24
  * automatically executed if developers run `ng add @angular/material`.
@@ -33,7 +33,7 @@ function default_1(options) {
33
33
  // have the same version tag if possible.
34
34
  const ngCoreVersionTag = (0, package_config_1.getPackageVersionFromPackageJson)(host, '@angular/core');
35
35
  const materialVersionRange = (0, package_config_1.getPackageVersionFromPackageJson)(host, '@angular/material');
36
- const angularDependencyVersion = ngCoreVersionTag || `^17.0.0 || ^18.0.0`;
36
+ const angularDependencyVersion = ngCoreVersionTag || `^17.0.0-0 || ^17.1.0-0 || ^17.2.0-0 || ^17.3.0-0 || ^18.0.0-0`;
37
37
  // The CLI inserts `@angular/material` into the `package.json` before this schematic runs.
38
38
  // This means that we do not need to insert Angular Material into `package.json` files again.
39
39
  // In some cases though, it could happen that this schematic runs outside of the CLI `ng add`
@@ -18,7 +18,7 @@ const package_config_1 = require("./package-config");
18
18
  * Note that the fallback version range does not use caret, but tilde because that is
19
19
  * the default for Angular framework dependencies in CLI projects.
20
20
  */
21
- const fallbackMaterialVersionRange = `~17.0.0`;
21
+ const fallbackMaterialVersionRange = `~17.1.0-next.0`;
22
22
  /**
23
23
  * Schematic factory entry-point for the `ng-add` schematic. The ng-add schematic will be
24
24
  * automatically executed if developers run `ng add @angular/material`.
@@ -33,7 +33,7 @@ function default_1(options) {
33
33
  // have the same version tag if possible.
34
34
  const ngCoreVersionTag = (0, package_config_1.getPackageVersionFromPackageJson)(host, '@angular/core');
35
35
  const materialVersionRange = (0, package_config_1.getPackageVersionFromPackageJson)(host, '@angular/material');
36
- const angularDependencyVersion = ngCoreVersionTag || `^17.0.0 || ^18.0.0`;
36
+ const angularDependencyVersion = ngCoreVersionTag || `^17.0.0-0 || ^17.1.0-0 || ^17.2.0-0 || ^17.3.0-0 || ^18.0.0-0`;
37
37
  // The CLI inserts `@angular/material` into the `package.json` before this schematic runs.
38
38
  // This means that we do not need to insert Angular Material into `package.json` files again.
39
39
  // In some cases though, it could happen that this schematic runs outside of the CLI `ng add`
@@ -15,17 +15,17 @@
15
15
  <div class="col">
16
16
  <mat-form-field class="full-width">
17
17
  <input matInput placeholder="First name" formControlName="firstName">
18
- <mat-error *ngIf="addressForm.controls['firstName'].hasError('required')">
19
- First name is <strong>required</strong>
20
- </mat-error>
18
+ @if (addressForm.controls['firstName'].hasError('required')) {
19
+ <mat-error>First name is <strong>required</strong></mat-error>
20
+ }
21
21
  </mat-form-field>
22
22
  </div>
23
23
  <div class="col">
24
24
  <mat-form-field class="full-width">
25
25
  <input matInput placeholder="Last name" formControlName="lastName">
26
- <mat-error *ngIf="addressForm.controls['lastName'].hasError('required')">
27
- Last name is <strong>required</strong>
28
- </mat-error>
26
+ @if (addressForm.controls['lastName'].hasError('required')) {
27
+ <mat-error>Last name is <strong>required</strong></mat-error>
28
+ }
29
29
  </mat-form-field>
30
30
  </div>
31
31
  </div>
@@ -33,45 +33,44 @@
33
33
  <div class="col">
34
34
  <mat-form-field class="full-width">
35
35
  <textarea matInput placeholder="Address" formControlName="address"></textarea>
36
- <mat-error *ngIf="addressForm.controls['address'].hasError('required')">
37
- Address is <strong>required</strong>
38
- </mat-error>
36
+ @if (addressForm.controls['address'].hasError('required')) {
37
+ <mat-error>Address is <strong>required</strong></mat-error>
38
+ }
39
39
  </mat-form-field>
40
40
  </div>
41
41
  </div>
42
- <div class="row" *ngIf="!hasUnitNumber">
43
- <div class="col">
44
- <button mat-button type="button" (click)="hasUnitNumber = !hasUnitNumber">
45
- + Add C/O, Apt, Suite, Unit
46
- </button>
47
- </div>
48
- </div>
49
- <div class="row" *ngIf="hasUnitNumber">
42
+ <div class="row">
50
43
  <div class="col">
51
- <mat-form-field class="full-width">
52
- <textarea matInput placeholder="Address 2" formControlName="address2"></textarea>
53
- </mat-form-field>
44
+ @if (hasUnitNumber) {
45
+ <mat-form-field class="full-width">
46
+ <textarea matInput placeholder="Address 2" formControlName="address2"></textarea>
47
+ </mat-form-field>
48
+ } @else {
49
+ <button mat-button type="button" (click)="hasUnitNumber = !hasUnitNumber">
50
+ + Add C/O, Apt, Suite, Unit
51
+ </button>
52
+ }
54
53
  </div>
55
54
  </div>
56
55
  <div class="row">
57
56
  <div class="col">
58
57
  <mat-form-field class="full-width">
59
58
  <input matInput placeholder="City" formControlName="city">
60
- <mat-error *ngIf="addressForm.controls['city'].hasError('required')">
61
- City is <strong>required</strong>
62
- </mat-error>
59
+ @if (addressForm.controls['city'].hasError('required')) {
60
+ <mat-error>City is <strong>required</strong></mat-error>
61
+ }
63
62
  </mat-form-field>
64
63
  </div>
65
64
  <div class="col">
66
65
  <mat-form-field class="full-width">
67
66
  <mat-select placeholder="State" formControlName="state">
68
- <mat-option *ngFor="let state of states" [value]="state.abbreviation">
69
- {{ state.name }}
70
- </mat-option>
67
+ @for (state of states; track state) {
68
+ <mat-option [value]="state.abbreviation">{{ state.name }}</mat-option>
69
+ }
71
70
  </mat-select>
72
- <mat-error *ngIf="addressForm.controls['state'].hasError('required')">
73
- State is <strong>required</strong>
74
- </mat-error>
71
+ @if (addressForm.controls['state'].hasError('required')) {
72
+ <mat-error>State is <strong>required</strong></mat-error>
73
+ }
75
74
  </mat-form-field>
76
75
  </div>
77
76
  </div>
@@ -1,24 +1,26 @@
1
1
  <div class="grid-container">
2
2
  <h1 class="mat-h1">Dashboard</h1>
3
3
  <mat-grid-list cols="2" rowHeight="350px">
4
- <mat-grid-tile *ngFor="let card of cards | async" [colspan]="card.cols" [rowspan]="card.rows">
5
- <mat-card class="dashboard-card">
6
- <mat-card-header>
7
- <mat-card-title>
8
- {{card.title}}
9
- <button mat-icon-button class="more-button" [matMenuTriggerFor]="menu" aria-label="Toggle menu">
10
- <mat-icon>more_vert</mat-icon>
11
- </button>
12
- <mat-menu #menu="matMenu" xPosition="before">
13
- <button mat-menu-item>Expand</button>
14
- <button mat-menu-item>Remove</button>
15
- </mat-menu>
16
- </mat-card-title>
17
- </mat-card-header>
18
- <mat-card-content class="dashboard-card-content">
19
- <div>Card Content Here</div>
20
- </mat-card-content>
21
- </mat-card>
22
- </mat-grid-tile>
4
+ @for (card of cards | async) {
5
+ <mat-grid-tile [colspan]="card.cols" [rowspan]="card.rows">
6
+ <mat-card class="dashboard-card">
7
+ <mat-card-header>
8
+ <mat-card-title>
9
+ {{card.title}}
10
+ <button mat-icon-button class="more-button" [matMenuTriggerFor]="menu" aria-label="Toggle menu">
11
+ <mat-icon>more_vert</mat-icon>
12
+ </button>
13
+ <mat-menu #menu="matMenu" xPosition="before">
14
+ <button mat-menu-item>Expand</button>
15
+ <button mat-menu-item>Remove</button>
16
+ </mat-menu>
17
+ </mat-card-title>
18
+ </mat-card-header>
19
+ <mat-card-content class="dashboard-card-content">
20
+ <div>Card Content Here</div>
21
+ </mat-card-content>
22
+ </mat-card>
23
+ </mat-grid-tile>
24
+ }
23
25
  </mat-grid-list>
24
26
  </div>