@angular/animations 13.2.1 → 13.2.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 (38) hide show
  1. package/animations.d.ts +10 -2
  2. package/browser/browser.d.ts +19 -7
  3. package/browser/testing/testing.d.ts +2 -1
  4. package/esm2020/browser/src/dsl/animation.mjs +4 -5
  5. package/esm2020/browser/src/dsl/animation_ast_builder.mjs +13 -14
  6. package/esm2020/browser/src/dsl/animation_timeline_builder.mjs +3 -2
  7. package/esm2020/browser/src/dsl/animation_transition_expr.mjs +4 -3
  8. package/esm2020/browser/src/dsl/animation_transition_factory.mjs +1 -1
  9. package/esm2020/browser/src/dsl/animation_transition_instruction.mjs +1 -1
  10. package/esm2020/browser/src/dsl/animation_trigger.mjs +1 -1
  11. package/esm2020/browser/src/dsl/style_normalization/animation_style_normalizer.mjs +1 -1
  12. package/esm2020/browser/src/dsl/style_normalization/web_animations_style_normalizer.mjs +3 -2
  13. package/esm2020/browser/src/error_helpers.mjs +135 -0
  14. package/esm2020/browser/src/errors.mjs +9 -0
  15. package/esm2020/browser/src/private_export.mjs +2 -2
  16. package/esm2020/browser/src/render/animation_driver.mjs +8 -5
  17. package/esm2020/browser/src/render/animation_engine_next.mjs +3 -2
  18. package/esm2020/browser/src/render/shared.mjs +16 -5
  19. package/esm2020/browser/src/render/timeline_animation_engine.mjs +6 -5
  20. package/esm2020/browser/src/render/transition_animation_engine.mjs +45 -18
  21. package/esm2020/browser/src/render/web_animations/web_animations_driver.mjs +5 -2
  22. package/esm2020/browser/src/util.mjs +9 -8
  23. package/esm2020/browser/testing/src/mock_animation_driver.mjs +5 -2
  24. package/esm2020/src/animation_metadata.mjs +10 -2
  25. package/esm2020/src/version.mjs +1 -1
  26. package/fesm2015/animations.mjs +10 -2
  27. package/fesm2015/animations.mjs.map +1 -1
  28. package/fesm2015/browser/testing.mjs +5 -2
  29. package/fesm2015/browser/testing.mjs.map +1 -1
  30. package/fesm2015/browser.mjs +232 -60
  31. package/fesm2015/browser.mjs.map +1 -1
  32. package/fesm2020/animations.mjs +10 -2
  33. package/fesm2020/animations.mjs.map +1 -1
  34. package/fesm2020/browser/testing.mjs +5 -2
  35. package/fesm2020/browser/testing.mjs.map +1 -1
  36. package/fesm2020/browser.mjs +232 -60
  37. package/fesm2020/browser.mjs.map +1 -1
  38. package/package.json +2 -2
@@ -1,12 +1,146 @@
1
1
  /**
2
- * @license Angular v13.2.1
2
+ * @license Angular v13.2.4
3
3
  * (c) 2010-2022 Google LLC. https://angular.io/
4
4
  * License: MIT
5
5
  */
6
6
 
7
7
  import { ɵAnimationGroupPlayer, NoopAnimationPlayer, AUTO_STYLE, ɵPRE_STYLE, sequence, style } from '@angular/animations';
8
8
  import * as i0 from '@angular/core';
9
- import { Injectable } from '@angular/core';
9
+ import { ɵRuntimeError, Injectable } from '@angular/core';
10
+
11
+ /**
12
+ * @license
13
+ * Copyright Google LLC All Rights Reserved.
14
+ *
15
+ * Use of this source code is governed by an MIT-style license that can be
16
+ * found in the LICENSE file at https://angular.io/license
17
+ */
18
+ const NG_DEV_MODE = typeof ngDevMode === 'undefined' || !!ngDevMode;
19
+ const LINE_START = '\n - ';
20
+ function invalidTimingValue(exp) {
21
+ return new ɵRuntimeError(3000 /* INVALID_TIMING_VALUE */, NG_DEV_MODE && `The provided timing value "${exp}" is invalid.`);
22
+ }
23
+ function negativeStepValue() {
24
+ return new ɵRuntimeError(3100 /* NEGATIVE_STEP_VALUE */, NG_DEV_MODE && 'Duration values below 0 are not allowed for this animation step.');
25
+ }
26
+ function negativeDelayValue() {
27
+ return new ɵRuntimeError(3101 /* NEGATIVE_DELAY_VALUE */, NG_DEV_MODE && 'Delay values below 0 are not allowed for this animation step.');
28
+ }
29
+ function invalidStyleParams(varName) {
30
+ return new ɵRuntimeError(3001 /* INVALID_STYLE_PARAMS */, NG_DEV_MODE &&
31
+ `Unable to resolve the local animation param ${varName} in the given list of values`);
32
+ }
33
+ function invalidParamValue(varName) {
34
+ return new ɵRuntimeError(3003 /* INVALID_PARAM_VALUE */, NG_DEV_MODE && `Please provide a value for the animation param ${varName}`);
35
+ }
36
+ function invalidNodeType(nodeType) {
37
+ return new ɵRuntimeError(3004 /* INVALID_NODE_TYPE */, NG_DEV_MODE && `Unable to resolve animation metadata node #${nodeType}`);
38
+ }
39
+ function invalidCssUnitValue(userProvidedProperty, value) {
40
+ return new ɵRuntimeError(3005 /* INVALID_CSS_UNIT_VALUE */, NG_DEV_MODE && `Please provide a CSS unit value for ${userProvidedProperty}:${value}`);
41
+ }
42
+ function invalidTrigger() {
43
+ return new ɵRuntimeError(3006 /* INVALID_TRIGGER */, NG_DEV_MODE &&
44
+ 'animation triggers cannot be prefixed with an `@` sign (e.g. trigger(\'@foo\', [...]))');
45
+ }
46
+ function invalidDefinition() {
47
+ return new ɵRuntimeError(3007 /* INVALID_DEFINITION */, NG_DEV_MODE && 'only state() and transition() definitions can sit inside of a trigger()');
48
+ }
49
+ function invalidState(metadataName, missingSubs) {
50
+ return new ɵRuntimeError(3008 /* INVALID_STATE */, NG_DEV_MODE &&
51
+ `state("${metadataName}", ...) must define default values for all the following style substitutions: ${missingSubs.join(', ')}`);
52
+ }
53
+ function invalidStyleValue(value) {
54
+ return new ɵRuntimeError(3002 /* INVALID_STYLE_VALUE */, NG_DEV_MODE && `The provided style string value ${value} is not allowed.`);
55
+ }
56
+ function invalidProperty(prop) {
57
+ return new ɵRuntimeError(3009 /* INVALID_PROPERTY */, NG_DEV_MODE &&
58
+ `The provided animation property "${prop}" is not a supported CSS property for animations`);
59
+ }
60
+ function invalidParallelAnimation(prop, firstStart, firstEnd, secondStart, secondEnd) {
61
+ return new ɵRuntimeError(3010 /* INVALID_PARALLEL_ANIMATION */, NG_DEV_MODE &&
62
+ `The CSS property "${prop}" that exists between the times of "${firstStart}ms" and "${firstEnd}ms" is also being animated in a parallel animation between the times of "${secondStart}ms" and "${secondEnd}ms"`);
63
+ }
64
+ function invalidKeyframes() {
65
+ return new ɵRuntimeError(3011 /* INVALID_KEYFRAMES */, NG_DEV_MODE && `keyframes() must be placed inside of a call to animate()`);
66
+ }
67
+ function invalidOffset() {
68
+ return new ɵRuntimeError(3012 /* INVALID_OFFSET */, NG_DEV_MODE && `Please ensure that all keyframe offsets are between 0 and 1`);
69
+ }
70
+ function keyframeOffsetsOutOfOrder() {
71
+ return new ɵRuntimeError(3200 /* KEYFRAME_OFFSETS_OUT_OF_ORDER */, NG_DEV_MODE && `Please ensure that all keyframe offsets are in order`);
72
+ }
73
+ function keyframesMissingOffsets() {
74
+ return new ɵRuntimeError(3202 /* KEYFRAMES_MISSING_OFFSETS */, NG_DEV_MODE && `Not all style() steps within the declared keyframes() contain offsets`);
75
+ }
76
+ function invalidStagger() {
77
+ return new ɵRuntimeError(3013 /* INVALID_STAGGER */, NG_DEV_MODE && `stagger() can only be used inside of query()`);
78
+ }
79
+ function invalidQuery(selector) {
80
+ return new ɵRuntimeError(3014 /* INVALID_QUERY */, NG_DEV_MODE &&
81
+ `\`query("${selector}")\` returned zero elements. (Use \`query("${selector}", { optional: true })\` if you wish to allow this.)`);
82
+ }
83
+ function invalidExpression(expr) {
84
+ return new ɵRuntimeError(3015 /* INVALID_EXPRESSION */, NG_DEV_MODE && `The provided transition expression "${expr}" is not supported`);
85
+ }
86
+ function invalidTransitionAlias(alias) {
87
+ return new ɵRuntimeError(3016 /* INVALID_TRANSITION_ALIAS */, NG_DEV_MODE && `The transition alias value "${alias}" is not supported`);
88
+ }
89
+ function validationFailed(errors) {
90
+ return new ɵRuntimeError(3500 /* VALIDATION_FAILED */, NG_DEV_MODE && `animation validation failed:\n${errors.map(err => err.message).join('\n')}`);
91
+ }
92
+ function buildingFailed(errors) {
93
+ return new ɵRuntimeError(3501 /* BUILDING_FAILED */, NG_DEV_MODE && `animation building failed:\n${errors.map(err => err.message).join('\n')}`);
94
+ }
95
+ function triggerBuildFailed(name, errors) {
96
+ return new ɵRuntimeError(3404 /* TRIGGER_BUILD_FAILED */, NG_DEV_MODE &&
97
+ `The animation trigger "${name}" has failed to build due to the following errors:\n - ${errors.map(err => err.message).join('\n - ')}`);
98
+ }
99
+ function animationFailed(errors) {
100
+ return new ɵRuntimeError(3502 /* ANIMATION_FAILED */, NG_DEV_MODE &&
101
+ `Unable to animate due to the following errors:${LINE_START}${errors.map(err => err.message).join(LINE_START)}`);
102
+ }
103
+ function registerFailed(errors) {
104
+ return new ɵRuntimeError(3503 /* REGISTRATION_FAILED */, NG_DEV_MODE &&
105
+ `Unable to build the animation due to the following errors: ${errors.map(err => err.message).join('\n')}`);
106
+ }
107
+ function missingOrDestroyedAnimation() {
108
+ return new ɵRuntimeError(3300 /* MISSING_OR_DESTROYED_ANIMATION */, NG_DEV_MODE && 'The requested animation doesn\'t exist or has already been destroyed');
109
+ }
110
+ function createAnimationFailed(errors) {
111
+ return new ɵRuntimeError(3504 /* CREATE_ANIMATION_FAILED */, NG_DEV_MODE &&
112
+ `Unable to create the animation due to the following errors:${errors.map(err => err.message).join('\n')}`);
113
+ }
114
+ function missingPlayer(id) {
115
+ return new ɵRuntimeError(3301 /* MISSING_PLAYER */, NG_DEV_MODE && `Unable to find the timeline player referenced by ${id}`);
116
+ }
117
+ function missingTrigger(phase, name) {
118
+ return new ɵRuntimeError(3302 /* MISSING_TRIGGER */, NG_DEV_MODE &&
119
+ `Unable to listen on the animation trigger event "${phase}" because the animation trigger "${name}" doesn\'t exist!`);
120
+ }
121
+ function missingEvent(name) {
122
+ return new ɵRuntimeError(3303 /* MISSING_EVENT */, NG_DEV_MODE &&
123
+ `Unable to listen on the animation trigger "${name}" because the provided event is undefined!`);
124
+ }
125
+ function unsupportedTriggerEvent(phase, name) {
126
+ return new ɵRuntimeError(3400 /* UNSUPPORTED_TRIGGER_EVENT */, NG_DEV_MODE &&
127
+ `The provided animation trigger event "${phase}" for the animation trigger "${name}" is not supported!`);
128
+ }
129
+ function unregisteredTrigger(name) {
130
+ return new ɵRuntimeError(3401 /* UNREGISTERED_TRIGGER */, NG_DEV_MODE && `The provided animation trigger "${name}" has not been registered!`);
131
+ }
132
+ function triggerTransitionsFailed(errors) {
133
+ return new ɵRuntimeError(3402 /* TRIGGER_TRANSITIONS_FAILED */, NG_DEV_MODE &&
134
+ `Unable to process animations due to the following failed trigger transitions\n ${errors.map(err => err.message).join('\n')}`);
135
+ }
136
+ function triggerParsingFailed(name, errors) {
137
+ return new ɵRuntimeError(3403 /* TRIGGER_PARSING_FAILED */, NG_DEV_MODE &&
138
+ `Animation parsing for the ${name} trigger have failed:${LINE_START}${errors.map(err => err.message).join(LINE_START)}`);
139
+ }
140
+ function transitionFailed(name, errors) {
141
+ return new ɵRuntimeError(3505 /* TRANSITION_FAILED */, NG_DEV_MODE &&
142
+ `@${name} has failed due to:\n ${errors.map(err => err.message).join('\n- ')}`);
143
+ }
10
144
 
11
145
  /**
12
146
  * @license
@@ -72,8 +206,7 @@ function normalizeKeyframes(driver, normalizer, element, keyframes, preStyles =
72
206
  previousOffset = offset;
73
207
  });
74
208
  if (errors.length) {
75
- const LINE_START = '\n - ';
76
- throw new Error(`Unable to animate due to the following errors:${LINE_START}${errors.join(LINE_START)}`);
209
+ throw animationFailed(errors);
77
210
  }
78
211
  return normalizedKeyframes;
79
212
  }
@@ -129,6 +262,14 @@ let _contains = (elm1, elm2) => false;
129
262
  let _query = (element, selector, multi) => {
130
263
  return [];
131
264
  };
265
+ let _documentElement = null;
266
+ function getParentElement(element) {
267
+ const parent = element.parentNode || element.host; // consider host to support shadow DOM
268
+ if (parent === _documentElement) {
269
+ return null;
270
+ }
271
+ return parent;
272
+ }
132
273
  // Define utility methods for browsers and platform-server(domino) where Element
133
274
  // and utility methods exist.
134
275
  const _isNode = isNode();
@@ -137,12 +278,15 @@ if (_isNode || typeof Element !== 'undefined') {
137
278
  _contains = (elm1, elm2) => elm1.contains(elm2);
138
279
  }
139
280
  else {
281
+ // Read the document element in an IIFE that's been marked pure to avoid a top-level property
282
+ // read that may prevent tree-shaking.
283
+ _documentElement = /* @__PURE__ */ (() => document.documentElement)();
140
284
  _contains = (elm1, elm2) => {
141
- while (elm2 && elm2 !== document.documentElement) {
285
+ while (elm2) {
142
286
  if (elm2 === elm1) {
143
287
  return true;
144
288
  }
145
- elm2 = elm2.parentNode || elm2.host; // consider host to support shadow DOM
289
+ elm2 = getParentElement(elm2);
146
290
  }
147
291
  return false;
148
292
  };
@@ -215,6 +359,9 @@ class NoopAnimationDriver {
215
359
  containsElement(elm1, elm2) {
216
360
  return containsElement(elm1, elm2);
217
361
  }
362
+ getParentElement(element) {
363
+ return getParentElement(element);
364
+ }
218
365
  query(element, selector, multi) {
219
366
  return invokeQuery(element, selector, multi);
220
367
  }
@@ -225,9 +372,9 @@ class NoopAnimationDriver {
225
372
  return new NoopAnimationPlayer(duration, delay);
226
373
  }
227
374
  }
228
- NoopAnimationDriver.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.1", ngImport: i0, type: NoopAnimationDriver, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
229
- NoopAnimationDriver.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.1", ngImport: i0, type: NoopAnimationDriver });
230
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.1", ngImport: i0, type: NoopAnimationDriver, decorators: [{
375
+ NoopAnimationDriver.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.4", ngImport: i0, type: NoopAnimationDriver, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
376
+ NoopAnimationDriver.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.4", ngImport: i0, type: NoopAnimationDriver });
377
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.4", ngImport: i0, type: NoopAnimationDriver, decorators: [{
231
378
  type: Injectable
232
379
  }] });
233
380
  /**
@@ -282,7 +429,7 @@ function parseTimeExpression(exp, errors, allowNegativeValues) {
282
429
  if (typeof exp === 'string') {
283
430
  const matches = exp.match(regex);
284
431
  if (matches === null) {
285
- errors.push(`The provided timing value "${exp}" is invalid.`);
432
+ errors.push(invalidTimingValue(exp));
286
433
  return { duration: 0, delay: 0, easing: '' };
287
434
  }
288
435
  duration = _convertTimeValueToMS(parseFloat(matches[1]), matches[2]);
@@ -302,15 +449,15 @@ function parseTimeExpression(exp, errors, allowNegativeValues) {
302
449
  let containsErrors = false;
303
450
  let startIndex = errors.length;
304
451
  if (duration < 0) {
305
- errors.push(`Duration values below 0 are not allowed for this animation step.`);
452
+ errors.push(negativeStepValue());
306
453
  containsErrors = true;
307
454
  }
308
455
  if (delay < 0) {
309
- errors.push(`Delay values below 0 are not allowed for this animation step.`);
456
+ errors.push(negativeDelayValue());
310
457
  containsErrors = true;
311
458
  }
312
459
  if (containsErrors) {
313
- errors.splice(startIndex, 0, `The provided timing value "${exp}" is invalid.`);
460
+ errors.splice(startIndex, 0, invalidTimingValue(exp));
314
461
  }
315
462
  }
316
463
  return { duration, delay, easing };
@@ -416,7 +563,7 @@ function validateStyleParams(value, options, errors) {
416
563
  if (matches.length) {
417
564
  matches.forEach(varName => {
418
565
  if (!params.hasOwnProperty(varName)) {
419
- errors.push(`Unable to resolve the local animation param ${varName} in the given list of values`);
566
+ errors.push(invalidStyleParams(varName));
420
567
  }
421
568
  });
422
569
  }
@@ -439,7 +586,7 @@ function interpolateParams(value, params, errors) {
439
586
  let localVal = params[varName];
440
587
  // this means that the value was never overridden by the data passed in by the user
441
588
  if (!params.hasOwnProperty(varName)) {
442
- errors.push(`Please provide a value for the animation param ${varName}`);
589
+ errors.push(invalidParamValue(varName));
443
590
  localVal = '';
444
591
  }
445
592
  return localVal.toString();
@@ -518,7 +665,7 @@ function visitDslNode(visitor, node, context) {
518
665
  case 12 /* Stagger */:
519
666
  return visitor.visitStagger(node, context);
520
667
  default:
521
- throw new Error(`Unable to resolve animation metadata node #${node.type}`);
668
+ throw invalidNodeType(node.type);
522
669
  }
523
670
  }
524
671
  function computeStyle(element, prop) {
@@ -554,7 +701,7 @@ function parseInnerTransitionStr(eventStr, expressions, errors) {
554
701
  }
555
702
  const match = eventStr.match(/^(\*|[-\w]+)\s*(<?[=-]>)\s*(\*|[-\w]+)$/);
556
703
  if (match == null || match.length < 4) {
557
- errors.push(`The provided transition expression "${eventStr}" is not supported`);
704
+ errors.push(invalidExpression(eventStr));
558
705
  return expressions;
559
706
  }
560
707
  const fromState = match[1];
@@ -577,7 +724,7 @@ function parseAnimationAlias(alias, errors) {
577
724
  case ':decrement':
578
725
  return (fromState, toState) => parseFloat(toState) < parseFloat(fromState);
579
726
  default:
580
- errors.push(`The transition alias value "${alias}" is not supported`);
727
+ errors.push(invalidTransitionAlias(alias));
581
728
  return '* => *';
582
729
  }
583
730
  }
@@ -673,7 +820,7 @@ class AnimationAstBuilderVisitor {
673
820
  const states = [];
674
821
  const transitions = [];
675
822
  if (metadata.name.charAt(0) == '@') {
676
- context.errors.push('animation triggers cannot be prefixed with an `@` sign (e.g. trigger(\'@foo\', [...]))');
823
+ context.errors.push(invalidTrigger());
677
824
  }
678
825
  metadata.definitions.forEach(def => {
679
826
  this._resetContextStyleTimingState(context);
@@ -693,7 +840,7 @@ class AnimationAstBuilderVisitor {
693
840
  transitions.push(transition);
694
841
  }
695
842
  else {
696
- context.errors.push('only state() and transition() definitions can sit inside of a trigger()');
843
+ context.errors.push(invalidDefinition());
697
844
  }
698
845
  });
699
846
  return {
@@ -726,8 +873,7 @@ class AnimationAstBuilderVisitor {
726
873
  });
727
874
  if (missingSubs.size) {
728
875
  const missingSubsArr = iteratorToArray(missingSubs.values());
729
- context.errors.push(`state("${metadata
730
- .name}", ...) must define default values for all the following style substitutions: ${missingSubsArr.join(', ')}`);
876
+ context.errors.push(invalidState(metadata.name, missingSubsArr));
731
877
  }
732
878
  }
733
879
  return {
@@ -820,7 +966,7 @@ class AnimationAstBuilderVisitor {
820
966
  styles.push(styleTuple);
821
967
  }
822
968
  else {
823
- context.errors.push(`The provided style string value ${styleTuple} is not allowed.`);
969
+ context.errors.push(invalidStyleValue(styleTuple));
824
970
  }
825
971
  }
826
972
  else {
@@ -873,7 +1019,7 @@ class AnimationAstBuilderVisitor {
873
1019
  return;
874
1020
  Object.keys(tuple).forEach(prop => {
875
1021
  if (!this._driver.validateStyleProperty(prop)) {
876
- context.errors.push(`The provided animation property "${prop}" is not a supported CSS property for animations`);
1022
+ context.errors.push(invalidProperty(prop));
877
1023
  return;
878
1024
  }
879
1025
  const collectedStyles = context.collectedStyles[context.currentQuerySelector];
@@ -882,8 +1028,7 @@ class AnimationAstBuilderVisitor {
882
1028
  if (collectedEntry) {
883
1029
  if (startTime != endTime && startTime >= collectedEntry.startTime &&
884
1030
  endTime <= collectedEntry.endTime) {
885
- context.errors.push(`The CSS property "${prop}" that exists between the times of "${collectedEntry.startTime}ms" and "${collectedEntry
886
- .endTime}ms" is also being animated in a parallel animation between the times of "${startTime}ms" and "${endTime}ms"`);
1031
+ context.errors.push(invalidParallelAnimation(prop, collectedEntry.startTime, collectedEntry.endTime, startTime, endTime));
887
1032
  updateCollectedStyle = false;
888
1033
  }
889
1034
  // we always choose the smaller start time value since we
@@ -903,7 +1048,7 @@ class AnimationAstBuilderVisitor {
903
1048
  visitKeyframes(metadata, context) {
904
1049
  const ast = { type: 5 /* Keyframes */, styles: [], options: null };
905
1050
  if (!context.currentAnimateTimings) {
906
- context.errors.push(`keyframes() must be placed inside of a call to animate()`);
1051
+ context.errors.push(invalidKeyframes());
907
1052
  return ast;
908
1053
  }
909
1054
  const MAX_KEYFRAME_OFFSET = 1;
@@ -927,15 +1072,15 @@ class AnimationAstBuilderVisitor {
927
1072
  return style;
928
1073
  });
929
1074
  if (keyframesOutOfRange) {
930
- context.errors.push(`Please ensure that all keyframe offsets are between 0 and 1`);
1075
+ context.errors.push(invalidOffset());
931
1076
  }
932
1077
  if (offsetsOutOfOrder) {
933
- context.errors.push(`Please ensure that all keyframe offsets are in order`);
1078
+ context.errors.push(keyframeOffsetsOutOfOrder());
934
1079
  }
935
1080
  const length = metadata.steps.length;
936
1081
  let generatedOffset = 0;
937
1082
  if (totalKeyframesWithOffsets > 0 && totalKeyframesWithOffsets < length) {
938
- context.errors.push(`Not all style() steps within the declared keyframes() contain offsets`);
1083
+ context.errors.push(keyframesMissingOffsets());
939
1084
  }
940
1085
  else if (totalKeyframesWithOffsets == 0) {
941
1086
  generatedOffset = MAX_KEYFRAME_OFFSET / (length - 1);
@@ -1001,7 +1146,7 @@ class AnimationAstBuilderVisitor {
1001
1146
  }
1002
1147
  visitStagger(metadata, context) {
1003
1148
  if (!context.currentQuery) {
1004
- context.errors.push(`stagger() can only be used inside of query()`);
1149
+ context.errors.push(invalidStagger());
1005
1150
  }
1006
1151
  const timings = metadata.timings === 'full' ?
1007
1152
  { duration: 0, delay: 0, easing: 'full' } :
@@ -1624,7 +1769,7 @@ class AnimationTimelineContext {
1624
1769
  results.push(...elements);
1625
1770
  }
1626
1771
  if (!optional && results.length == 0) {
1627
- errors.push(`\`query("${originalSelector}")\` returned zero elements. (Use \`query("${originalSelector}", { optional: true })\` if you wish to allow this.)`);
1772
+ errors.push(invalidQuery(originalSelector));
1628
1773
  }
1629
1774
  return results;
1630
1775
  }
@@ -1912,8 +2057,7 @@ class Animation {
1912
2057
  const errors = [];
1913
2058
  const ast = buildAnimationAst(_driver, input, errors);
1914
2059
  if (errors.length) {
1915
- const errorMessage = `animation validation failed:\n${errors.join('\n')}`;
1916
- throw new Error(errorMessage);
2060
+ throw validationFailed(errors);
1917
2061
  }
1918
2062
  this._animationAst = ast;
1919
2063
  }
@@ -1926,8 +2070,7 @@ class Animation {
1926
2070
  subInstructions = subInstructions || new ElementInstructionMap();
1927
2071
  const result = buildAnimationTimelines(this._driver, element, this._animationAst, ENTER_CLASSNAME, LEAVE_CLASSNAME, start, dest, options, subInstructions, errors);
1928
2072
  if (errors.length) {
1929
- const errorMessage = `animation building failed:\n${errors.join('\n')}`;
1930
- throw new Error(errorMessage);
2073
+ throw buildingFailed(errors);
1931
2074
  }
1932
2075
  return result;
1933
2076
  }
@@ -1978,7 +2121,7 @@ class WebAnimationsStyleNormalizer extends AnimationStyleNormalizer {
1978
2121
  else {
1979
2122
  const valAndSuffixMatch = value.match(/^[+-]?[\d\.]+([a-z]*)$/);
1980
2123
  if (valAndSuffixMatch && valAndSuffixMatch[1].length == 0) {
1981
- errors.push(`Please provide a CSS unit value for ${userProvidedProperty}:${value}`);
2124
+ errors.push(invalidCssUnitValue(userProvidedProperty, value));
1982
2125
  }
1983
2126
  }
1984
2127
  }
@@ -2177,7 +2320,7 @@ class TimelineAnimationEngine {
2177
2320
  const errors = [];
2178
2321
  const ast = buildAnimationAst(this._driver, metadata, errors);
2179
2322
  if (errors.length) {
2180
- throw new Error(`Unable to build the animation due to the following errors: ${errors.join('\n')}`);
2323
+ throw registerFailed(errors);
2181
2324
  }
2182
2325
  else {
2183
2326
  this._animations[id] = ast;
@@ -2201,11 +2344,11 @@ class TimelineAnimationEngine {
2201
2344
  });
2202
2345
  }
2203
2346
  else {
2204
- errors.push('The requested animation doesn\'t exist or has already been destroyed');
2347
+ errors.push(missingOrDestroyedAnimation());
2205
2348
  instructions = [];
2206
2349
  }
2207
2350
  if (errors.length) {
2208
- throw new Error(`Unable to create the animation due to the following errors: ${errors.join('\n')}`);
2351
+ throw createAnimationFailed(errors);
2209
2352
  }
2210
2353
  autoStylesMap.forEach((styles, element) => {
2211
2354
  Object.keys(styles).forEach(prop => {
@@ -2234,7 +2377,7 @@ class TimelineAnimationEngine {
2234
2377
  _getPlayer(id) {
2235
2378
  const player = this._playersById[id];
2236
2379
  if (!player) {
2237
- throw new Error(`Unable to find the timeline player referenced by ${id}`);
2380
+ throw missingPlayer(id);
2238
2381
  }
2239
2382
  return player;
2240
2383
  }
@@ -2362,13 +2505,13 @@ class AnimationTransitionNamespace {
2362
2505
  }
2363
2506
  listen(element, name, phase, callback) {
2364
2507
  if (!this._triggers.hasOwnProperty(name)) {
2365
- throw new Error(`Unable to listen on the animation trigger event "${phase}" because the animation trigger "${name}" doesn\'t exist!`);
2508
+ throw missingTrigger(phase, name);
2366
2509
  }
2367
2510
  if (phase == null || phase.length == 0) {
2368
- throw new Error(`Unable to listen on the animation trigger "${name}" because the provided event is undefined!`);
2511
+ throw missingEvent(name);
2369
2512
  }
2370
2513
  if (!isTriggerEventValid(phase)) {
2371
- throw new Error(`The provided animation trigger event "${phase}" for the animation trigger "${name}" is not supported!`);
2514
+ throw unsupportedTriggerEvent(phase, name);
2372
2515
  }
2373
2516
  const listeners = getOrSetAsInMap(this._elementListeners, element, []);
2374
2517
  const data = { name, phase, callback };
@@ -2407,7 +2550,7 @@ class AnimationTransitionNamespace {
2407
2550
  _getTrigger(name) {
2408
2551
  const trigger = this._triggers[name];
2409
2552
  if (!trigger) {
2410
- throw new Error(`The provided animation trigger "${name}" has not been registered!`);
2553
+ throw unregisteredTrigger(name);
2411
2554
  }
2412
2555
  return trigger;
2413
2556
  }
@@ -2763,25 +2906,52 @@ class TransitionAnimationEngine {
2763
2906
  return this._namespaceLookup[namespaceId] = ns;
2764
2907
  }
2765
2908
  _balanceNamespaceList(ns, hostElement) {
2766
- const limit = this._namespaceList.length - 1;
2909
+ const namespaceList = this._namespaceList;
2910
+ const namespacesByHostElement = this.namespacesByHostElement;
2911
+ const limit = namespaceList.length - 1;
2767
2912
  if (limit >= 0) {
2768
2913
  let found = false;
2769
- for (let i = limit; i >= 0; i--) {
2770
- const nextNamespace = this._namespaceList[i];
2771
- if (this.driver.containsElement(nextNamespace.hostElement, hostElement)) {
2772
- this._namespaceList.splice(i + 1, 0, ns);
2773
- found = true;
2774
- break;
2914
+ if (this.driver.getParentElement !== undefined) {
2915
+ // Fast path for when the driver implements `getParentElement`, which allows us to find the
2916
+ // closest ancestor with an existing namespace that we can then insert `ns` after, without
2917
+ // having to inspect all existing namespaces.
2918
+ let ancestor = this.driver.getParentElement(hostElement);
2919
+ while (ancestor) {
2920
+ const ancestorNs = namespacesByHostElement.get(ancestor);
2921
+ if (ancestorNs) {
2922
+ // An animation namespace has been registered for this ancestor, so we insert `ns`
2923
+ // right after it to establish top-down ordering of animation namespaces.
2924
+ const index = namespaceList.indexOf(ancestorNs);
2925
+ namespaceList.splice(index + 1, 0, ns);
2926
+ found = true;
2927
+ break;
2928
+ }
2929
+ ancestor = this.driver.getParentElement(ancestor);
2930
+ }
2931
+ }
2932
+ else {
2933
+ // Slow path for backwards compatibility if the driver does not implement
2934
+ // `getParentElement`, to be removed once `getParentElement` is a required method.
2935
+ for (let i = limit; i >= 0; i--) {
2936
+ const nextNamespace = namespaceList[i];
2937
+ if (this.driver.containsElement(nextNamespace.hostElement, hostElement)) {
2938
+ namespaceList.splice(i + 1, 0, ns);
2939
+ found = true;
2940
+ break;
2941
+ }
2775
2942
  }
2776
2943
  }
2777
2944
  if (!found) {
2778
- this._namespaceList.splice(0, 0, ns);
2945
+ // No namespace exists that is an ancestor of `ns`, so `ns` is inserted at the front to
2946
+ // ensure that any existing descendants are ordered after `ns`, retaining the desired
2947
+ // top-down ordering.
2948
+ namespaceList.unshift(ns);
2779
2949
  }
2780
2950
  }
2781
2951
  else {
2782
- this._namespaceList.push(ns);
2952
+ namespaceList.push(ns);
2783
2953
  }
2784
- this.namespacesByHostElement.set(hostElement, ns);
2954
+ namespacesByHostElement.set(hostElement, ns);
2785
2955
  return ns;
2786
2956
  }
2787
2957
  register(namespaceId, hostElement) {
@@ -3047,7 +3217,7 @@ class TransitionAnimationEngine {
3047
3217
  }
3048
3218
  }
3049
3219
  reportError(errors) {
3050
- throw new Error(`Unable to process animations due to the following failed trigger transitions\n ${errors.join('\n')}`);
3220
+ throw triggerTransitionsFailed(errors);
3051
3221
  }
3052
3222
  _flushAnimations(cleanupFns, microtaskId) {
3053
3223
  const subTimelines = new ElementInstructionMap();
@@ -3209,8 +3379,7 @@ class TransitionAnimationEngine {
3209
3379
  if (erroneousTransitions.length) {
3210
3380
  const errors = [];
3211
3381
  erroneousTransitions.forEach(instruction => {
3212
- errors.push(`@${instruction.triggerName} has failed due to:\n`);
3213
- instruction.errors.forEach(error => errors.push(`- ${error}\n`));
3382
+ errors.push(transitionFailed(instruction.triggerName, instruction.errors));
3214
3383
  });
3215
3384
  allPlayers.forEach(player => player.destroy());
3216
3385
  this.reportError(errors);
@@ -3825,7 +3994,7 @@ class AnimationEngine {
3825
3994
  const errors = [];
3826
3995
  const ast = buildAnimationAst(this._driver, metadata, errors);
3827
3996
  if (errors.length) {
3828
- throw new Error(`The animation trigger "${name}" has failed to build due to the following errors:\n - ${errors.join('\n - ')}`);
3997
+ throw triggerBuildFailed(name, errors);
3829
3998
  }
3830
3999
  trigger = buildTrigger(name, ast, this._normalizer);
3831
4000
  this._triggerCache[cacheKey] = trigger;
@@ -4148,6 +4317,9 @@ class WebAnimationsDriver {
4148
4317
  containsElement(elm1, elm2) {
4149
4318
  return containsElement(elm1, elm2);
4150
4319
  }
4320
+ getParentElement(element) {
4321
+ return getParentElement(element);
4322
+ }
4151
4323
  query(element, selector, multi) {
4152
4324
  return invokeQuery(element, selector, multi);
4153
4325
  }
@@ -4213,5 +4385,5 @@ class WebAnimationsDriver {
4213
4385
  * Generated bundle index. Do not edit.
4214
4386
  */
4215
4387
 
4216
- export { AnimationDriver, Animation as ɵAnimation, AnimationEngine as ɵAnimationEngine, AnimationStyleNormalizer as ɵAnimationStyleNormalizer, NoopAnimationDriver as ɵNoopAnimationDriver, NoopAnimationStyleNormalizer as ɵNoopAnimationStyleNormalizer, WebAnimationsDriver as ɵWebAnimationsDriver, WebAnimationsPlayer as ɵWebAnimationsPlayer, WebAnimationsStyleNormalizer as ɵWebAnimationsStyleNormalizer, allowPreviousPlayerStylesMerge as ɵallowPreviousPlayerStylesMerge, containsElement as ɵcontainsElement, invokeQuery as ɵinvokeQuery, validateStyleProperty as ɵvalidateStyleProperty };
4388
+ export { AnimationDriver, Animation as ɵAnimation, AnimationEngine as ɵAnimationEngine, AnimationStyleNormalizer as ɵAnimationStyleNormalizer, NoopAnimationDriver as ɵNoopAnimationDriver, NoopAnimationStyleNormalizer as ɵNoopAnimationStyleNormalizer, WebAnimationsDriver as ɵWebAnimationsDriver, WebAnimationsPlayer as ɵWebAnimationsPlayer, WebAnimationsStyleNormalizer as ɵWebAnimationsStyleNormalizer, allowPreviousPlayerStylesMerge as ɵallowPreviousPlayerStylesMerge, containsElement as ɵcontainsElement, getParentElement as ɵgetParentElement, invokeQuery as ɵinvokeQuery, validateStyleProperty as ɵvalidateStyleProperty };
4217
4389
  //# sourceMappingURL=browser.mjs.map