@angular/material 14.0.0-next.3 → 14.0.0-next.4

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 (100) hide show
  1. package/button-toggle/_button-toggle-theme.scss +4 -2
  2. package/chips/chip-list.d.ts +12 -2
  3. package/core/common-behaviors/error-state.d.ts +1 -2
  4. package/core/ripple/ripple-ref.d.ts +2 -1
  5. package/core/ripple/ripple-renderer.d.ts +9 -2
  6. package/datepicker/date-range-input-parts.d.ts +4 -1
  7. package/esm2020/autocomplete/autocomplete-trigger.mjs +8 -3
  8. package/esm2020/button-toggle/button-toggle.mjs +2 -2
  9. package/esm2020/checkbox/checkbox.mjs +4 -2
  10. package/esm2020/chips/chip-list.mjs +12 -2
  11. package/esm2020/core/common-behaviors/error-state.mjs +1 -8
  12. package/esm2020/core/ripple/ripple-ref.mjs +5 -2
  13. package/esm2020/core/ripple/ripple-renderer.mjs +72 -37
  14. package/esm2020/core/version.mjs +1 -1
  15. package/esm2020/datepicker/date-range-input-parts.mjs +1 -1
  16. package/esm2020/form-field/form-field.mjs +14 -9
  17. package/esm2020/input/input.mjs +13 -3
  18. package/esm2020/radio/radio.mjs +3 -3
  19. package/esm2020/select/select.mjs +16 -4
  20. package/esm2020/sidenav/drawer.mjs +3 -3
  21. package/esm2020/sidenav/sidenav.mjs +3 -3
  22. package/esm2020/sort/sort-header.mjs +14 -6
  23. package/esm2020/sort/sort.mjs +1 -1
  24. package/esm2020/stepper/stepper-module.mjs +3 -7
  25. package/esm2020/stepper/stepper.mjs +8 -58
  26. package/esm2020/tabs/tab-header.mjs +3 -3
  27. package/fesm2015/autocomplete.mjs +7 -2
  28. package/fesm2015/autocomplete.mjs.map +1 -1
  29. package/fesm2015/button-toggle.mjs +2 -2
  30. package/fesm2015/checkbox.mjs +3 -1
  31. package/fesm2015/checkbox.mjs.map +1 -1
  32. package/fesm2015/chips.mjs +11 -1
  33. package/fesm2015/chips.mjs.map +1 -1
  34. package/fesm2015/core.mjs +77 -45
  35. package/fesm2015/core.mjs.map +1 -1
  36. package/fesm2015/datepicker.mjs.map +1 -1
  37. package/fesm2015/form-field.mjs +14 -8
  38. package/fesm2015/form-field.mjs.map +1 -1
  39. package/fesm2015/input.mjs +12 -2
  40. package/fesm2015/input.mjs.map +1 -1
  41. package/fesm2015/radio.mjs +2 -2
  42. package/fesm2015/radio.mjs.map +1 -1
  43. package/fesm2015/select.mjs +15 -3
  44. package/fesm2015/select.mjs.map +1 -1
  45. package/fesm2015/sidenav.mjs +4 -4
  46. package/fesm2015/sidenav.mjs.map +1 -1
  47. package/fesm2015/sort.mjs +119 -111
  48. package/fesm2015/sort.mjs.map +1 -1
  49. package/fesm2015/stepper.mjs +9 -62
  50. package/fesm2015/stepper.mjs.map +1 -1
  51. package/fesm2015/tabs.mjs +2 -2
  52. package/fesm2015/tabs.mjs.map +1 -1
  53. package/fesm2020/autocomplete.mjs +7 -2
  54. package/fesm2020/autocomplete.mjs.map +1 -1
  55. package/fesm2020/button-toggle.mjs +2 -2
  56. package/fesm2020/checkbox.mjs +3 -1
  57. package/fesm2020/checkbox.mjs.map +1 -1
  58. package/fesm2020/chips.mjs +11 -1
  59. package/fesm2020/chips.mjs.map +1 -1
  60. package/fesm2020/core.mjs +77 -45
  61. package/fesm2020/core.mjs.map +1 -1
  62. package/fesm2020/datepicker.mjs.map +1 -1
  63. package/fesm2020/form-field.mjs +13 -8
  64. package/fesm2020/form-field.mjs.map +1 -1
  65. package/fesm2020/input.mjs +12 -2
  66. package/fesm2020/input.mjs.map +1 -1
  67. package/fesm2020/radio.mjs +2 -2
  68. package/fesm2020/radio.mjs.map +1 -1
  69. package/fesm2020/select.mjs +15 -3
  70. package/fesm2020/select.mjs.map +1 -1
  71. package/fesm2020/sidenav.mjs +4 -4
  72. package/fesm2020/sidenav.mjs.map +1 -1
  73. package/fesm2020/sort.mjs +12 -4
  74. package/fesm2020/sort.mjs.map +1 -1
  75. package/fesm2020/stepper.mjs +9 -62
  76. package/fesm2020/stepper.mjs.map +1 -1
  77. package/fesm2020/tabs.mjs +2 -2
  78. package/fesm2020/tabs.mjs.map +1 -1
  79. package/form-field/form-field.d.ts +9 -5
  80. package/input/input.d.ts +11 -1
  81. package/package.json +2 -2
  82. package/prebuilt-themes/deeppurple-amber.css +1 -1
  83. package/prebuilt-themes/indigo-pink.css +1 -1
  84. package/prebuilt-themes/pink-bluegrey.css +1 -1
  85. package/prebuilt-themes/purple-green.css +1 -1
  86. package/schematics/ng-add/index.js +1 -1
  87. package/schematics/ng-add/index.mjs +1 -1
  88. package/schematics/ng-update/data/constructor-checks.js +5 -1
  89. package/schematics/ng-update/data/constructor-checks.mjs +5 -1
  90. package/schematics/ng-update/migrations/hammer-gestures-v9/hammer-gestures-migration.js +4 -4
  91. package/schematics/ng-update/migrations/hammer-gestures-v9/hammer-gestures-migration.mjs +4 -4
  92. package/schematics/ng-update/migrations/hammer-gestures-v9/import-manager.js +13 -13
  93. package/schematics/ng-update/migrations/hammer-gestures-v9/import-manager.mjs +13 -13
  94. package/schematics/ng-update/migrations/package-imports-v8/secondary-entry-points-migration.js +2 -13
  95. package/schematics/ng-update/migrations/package-imports-v8/secondary-entry-points-migration.mjs +2 -13
  96. package/select/select.d.ts +11 -0
  97. package/sort/sort-header.d.ts +4 -4
  98. package/sort/sort.d.ts +4 -0
  99. package/stepper/stepper-module.d.ts +1 -1
  100. package/stepper/stepper.d.ts +2 -35
package/fesm2015/core.mjs CHANGED
@@ -9,7 +9,7 @@ import { _isTestEnvironment, normalizePassiveListenerOptions } from '@angular/cd
9
9
  import * as i1 from '@angular/cdk/a11y';
10
10
  import { isFakeMousedownFromScreenReader, isFakeTouchstartFromScreenReader } from '@angular/cdk/a11y';
11
11
  import { coerceBooleanProperty, coerceNumberProperty, coerceElement } from '@angular/cdk/coercion';
12
- import { Subject, Observable } from 'rxjs';
12
+ import { Observable, Subject } from 'rxjs';
13
13
  import { startWith } from 'rxjs/operators';
14
14
  import { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations';
15
15
  import { ENTER, SPACE, hasModifierKey } from '@angular/cdk/keycodes';
@@ -22,7 +22,7 @@ import { ENTER, SPACE, hasModifierKey } from '@angular/cdk/keycodes';
22
22
  * found in the LICENSE file at https://angular.io/license
23
23
  */
24
24
  /** Current version of Angular Material. */
25
- const VERSION = new Version('14.0.0-next.3');
25
+ const VERSION = new Version('14.0.0-next.4');
26
26
 
27
27
  /**
28
28
  * @license
@@ -269,12 +269,6 @@ function mixinErrorState(base) {
269
269
  return class extends base {
270
270
  constructor(...args) {
271
271
  super(...args);
272
- // This class member exists as an interop with `MatFormFieldControl` which expects
273
- // a public `stateChanges` observable to emit whenever the form field should be updated.
274
- // The description is not specifically mentioning the error state, as classes using this
275
- // mixin can/should emit an event in other cases too.
276
- /** Emits whenever the component state changes. */
277
- this.stateChanges = new Subject();
278
272
  /** Whether the component is in an error state. */
279
273
  this.errorState = false;
280
274
  }
@@ -838,10 +832,13 @@ class RippleRef {
838
832
  /** Reference to the ripple HTML element. */
839
833
  element,
840
834
  /** Ripple configuration used for the ripple. */
841
- config) {
835
+ config,
836
+ /* Whether animations are forcibly disabled for ripples through CSS. */
837
+ _animationForciblyDisabledThroughCss = false) {
842
838
  this._renderer = _renderer;
843
839
  this.element = element;
844
840
  this.config = config;
841
+ this._animationForciblyDisabledThroughCss = _animationForciblyDisabledThroughCss;
845
842
  /** Current state of the ripple. */
846
843
  this.state = 3 /* HIDDEN */;
847
844
  }
@@ -910,7 +907,7 @@ class RippleRenderer {
910
907
  const radius = config.radius || distanceToFurthestCorner(x, y, containerRect);
911
908
  const offsetX = x - containerRect.left;
912
909
  const offsetY = y - containerRect.top;
913
- const duration = animationConfig.enterDuration;
910
+ const enterDuration = animationConfig.enterDuration;
914
911
  const ripple = document.createElement('div');
915
912
  ripple.classList.add('mat-ripple-element');
916
913
  ripple.style.left = `${offsetX - radius}px`;
@@ -922,35 +919,49 @@ class RippleRenderer {
922
919
  if (config.color != null) {
923
920
  ripple.style.backgroundColor = config.color;
924
921
  }
925
- ripple.style.transitionDuration = `${duration}ms`;
922
+ ripple.style.transitionDuration = `${enterDuration}ms`;
926
923
  this._containerElement.appendChild(ripple);
927
924
  // By default the browser does not recalculate the styles of dynamically created
928
- // ripple elements. This is critical because then the `scale` would not animate properly.
929
- enforceStyleRecalculation(ripple);
930
- // We use a 3d transform here in order to avoid an issue in Safari where
925
+ // ripple elements. This is critical to ensure that the `scale` animates properly.
926
+ // We enforce a style recalculation by calling `getComputedStyle` and *accessing* a property.
927
+ // See: https://gist.github.com/paulirish/5d52fb081b3570c81e3a
928
+ const computedStyles = window.getComputedStyle(ripple);
929
+ const userTransitionProperty = computedStyles.transitionProperty;
930
+ const userTransitionDuration = computedStyles.transitionDuration;
931
+ // Note: We detect whether animation is forcibly disabled through CSS by the use of
932
+ // `transition: none`. This is technically unexpected since animations are controlled
933
+ // through the animation config, but this exists for backwards compatibility. This logic does
934
+ // not need to be super accurate since it covers some edge cases which can be easily avoided by users.
935
+ const animationForciblyDisabledThroughCss = userTransitionProperty === 'none' ||
936
+ // Note: The canonical unit for serialized CSS `<time>` properties is seconds. Additionally
937
+ // some browsers expand the duration for every property (in our case `opacity` and `transform`).
938
+ userTransitionDuration === '0s' ||
939
+ userTransitionDuration === '0s, 0s';
940
+ // Exposed reference to the ripple that will be returned.
941
+ const rippleRef = new RippleRef(this, ripple, config, animationForciblyDisabledThroughCss);
942
+ // Start the enter animation by setting the transform/scale to 100%. The animation will
943
+ // execute as part of this statement because we forced a style recalculation before.
944
+ // Note: We use a 3d transform here in order to avoid an issue in Safari where
931
945
  // the ripples aren't clipped when inside the shadow DOM (see #24028).
932
946
  ripple.style.transform = 'scale3d(1, 1, 1)';
933
- // Exposed reference to the ripple that will be returned.
934
- const rippleRef = new RippleRef(this, ripple, config);
935
947
  rippleRef.state = 0 /* FADING_IN */;
936
948
  // Add the ripple reference to the list of all active ripples.
937
949
  this._activeRipples.add(rippleRef);
938
950
  if (!config.persistent) {
939
951
  this._mostRecentTransientRipple = rippleRef;
940
952
  }
941
- // Wait for the ripple element to be completely faded in.
942
- // Once it's faded in, the ripple can be hidden immediately if the mouse is released.
943
- this._runTimeoutOutsideZone(() => {
944
- const isMostRecentTransientRipple = rippleRef === this._mostRecentTransientRipple;
945
- rippleRef.state = 1 /* VISIBLE */;
946
- // When the timer runs out while the user has kept their pointer down, we want to
947
- // keep only the persistent ripples and the latest transient ripple. We do this,
948
- // because we don't want stacked transient ripples to appear after their enter
949
- // animation has finished.
950
- if (!config.persistent && (!isMostRecentTransientRipple || !this._isPointerDown)) {
951
- rippleRef.fadeOut();
952
- }
953
- }, duration);
953
+ // Do not register the `transition` event listener if fade-in and fade-out duration
954
+ // are set to zero. The events won't fire anyway and we can save resources here.
955
+ if (!animationForciblyDisabledThroughCss && (enterDuration || animationConfig.exitDuration)) {
956
+ this._ngZone.runOutsideAngular(() => {
957
+ ripple.addEventListener('transitionend', () => this._finishRippleTransition(rippleRef));
958
+ });
959
+ }
960
+ // In case there is no fade-in transition duration, we need to manually call the transition
961
+ // end listener because `transitionend` doesn't fire if there is no transition.
962
+ if (animationForciblyDisabledThroughCss || !enterDuration) {
963
+ this._finishRippleTransition(rippleRef);
964
+ }
954
965
  return rippleRef;
955
966
  }
956
967
  /** Fades out a ripple reference. */
@@ -969,14 +980,16 @@ class RippleRenderer {
969
980
  }
970
981
  const rippleEl = rippleRef.element;
971
982
  const animationConfig = Object.assign(Object.assign({}, defaultRippleAnimationConfig), rippleRef.config.animation);
983
+ // This starts the fade-out transition and will fire the transition end listener that
984
+ // removes the ripple element from the DOM.
972
985
  rippleEl.style.transitionDuration = `${animationConfig.exitDuration}ms`;
973
986
  rippleEl.style.opacity = '0';
974
987
  rippleRef.state = 2 /* FADING_OUT */;
975
- // Once the ripple faded out, the ripple can be safely removed from the DOM.
976
- this._runTimeoutOutsideZone(() => {
977
- rippleRef.state = 3 /* HIDDEN */;
978
- rippleEl.remove();
979
- }, animationConfig.exitDuration);
988
+ // In case there is no fade-out transition duration, we need to manually call the
989
+ // transition end listener because `transitionend` doesn't fire if there is no transition.
990
+ if (rippleRef._animationForciblyDisabledThroughCss || !animationConfig.exitDuration) {
991
+ this._finishRippleTransition(rippleRef);
992
+ }
980
993
  }
981
994
  /** Fades out all currently active ripples. */
982
995
  fadeOutAll() {
@@ -1023,6 +1036,36 @@ class RippleRenderer {
1023
1036
  this._pointerUpEventsRegistered = true;
1024
1037
  }
1025
1038
  }
1039
+ /** Method that will be called if the fade-in or fade-in transition completed. */
1040
+ _finishRippleTransition(rippleRef) {
1041
+ if (rippleRef.state === 0 /* FADING_IN */) {
1042
+ this._startFadeOutTransition(rippleRef);
1043
+ }
1044
+ else if (rippleRef.state === 2 /* FADING_OUT */) {
1045
+ this._destroyRipple(rippleRef);
1046
+ }
1047
+ }
1048
+ /**
1049
+ * Starts the fade-out transition of the given ripple if it's not persistent and the pointer
1050
+ * is not held down anymore.
1051
+ */
1052
+ _startFadeOutTransition(rippleRef) {
1053
+ const isMostRecentTransientRipple = rippleRef === this._mostRecentTransientRipple;
1054
+ const { persistent } = rippleRef.config;
1055
+ rippleRef.state = 1 /* VISIBLE */;
1056
+ // When the timer runs out while the user has kept their pointer down, we want to
1057
+ // keep only the persistent ripples and the latest transient ripple. We do this,
1058
+ // because we don't want stacked transient ripples to appear after their enter
1059
+ // animation has finished.
1060
+ if (!persistent && (!isMostRecentTransientRipple || !this._isPointerDown)) {
1061
+ rippleRef.fadeOut();
1062
+ }
1063
+ }
1064
+ /** Destroys the given ripple by removing it from the DOM and updating its state. */
1065
+ _destroyRipple(rippleRef) {
1066
+ rippleRef.state = 3 /* HIDDEN */;
1067
+ rippleRef.element.remove();
1068
+ }
1026
1069
  /** Function being called whenever the trigger is being pressed using mouse. */
1027
1070
  _onMousedown(event) {
1028
1071
  // Screen readers will fire fake mouse events for space/enter. Skip launching a
@@ -1068,10 +1111,6 @@ class RippleRenderer {
1068
1111
  }
1069
1112
  });
1070
1113
  }
1071
- /** Runs a timeout outside of the Angular zone to avoid triggering the change detection. */
1072
- _runTimeoutOutsideZone(fn, delay = 0) {
1073
- this._ngZone.runOutsideAngular(() => setTimeout(fn, delay));
1074
- }
1075
1114
  /** Registers event listeners for a given list of events. */
1076
1115
  _registerEvents(eventTypes) {
1077
1116
  this._ngZone.runOutsideAngular(() => {
@@ -1094,13 +1133,6 @@ class RippleRenderer {
1094
1133
  }
1095
1134
  }
1096
1135
  }
1097
- /** Enforces a style recalculation of a DOM element by computing its styles. */
1098
- function enforceStyleRecalculation(element) {
1099
- // Enforce a style recalculation by calling `getComputedStyle` and accessing any property.
1100
- // Calling `getPropertyValue` is important to let optimizers know that this is not a noop.
1101
- // See: https://gist.github.com/paulirish/5d52fb081b3570c81e3a
1102
- window.getComputedStyle(element).getPropertyValue('opacity');
1103
- }
1104
1136
  /**
1105
1137
  * Returns the distance from the point (x, y) to the furthest corner of a rectangle.
1106
1138
  */