@angular/core 20.3.0-rc.0 → 20.3.1

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 (70) hide show
  1. package/api.d.d.ts +1 -1
  2. package/chrome_dev_tools_performance.d.d.ts +1 -1
  3. package/discovery.d.d.ts +43 -3
  4. package/effect.d.d.ts +1 -1
  5. package/event_dispatcher.d.d.ts +1 -1
  6. package/fesm2022/attribute.mjs +1 -1
  7. package/fesm2022/attribute.mjs.map +1 -1
  8. package/fesm2022/core.mjs +4 -27
  9. package/fesm2022/core.mjs.map +1 -1
  10. package/fesm2022/debug_node.mjs +505 -483
  11. package/fesm2022/debug_node.mjs.map +1 -1
  12. package/fesm2022/effect.mjs +1 -1
  13. package/fesm2022/effect.mjs.map +1 -1
  14. package/fesm2022/not_found.mjs +1 -1
  15. package/fesm2022/not_found.mjs.map +1 -1
  16. package/fesm2022/primitives/di.mjs +1 -1
  17. package/fesm2022/primitives/di.mjs.map +1 -1
  18. package/fesm2022/primitives/event-dispatch.mjs +1 -1
  19. package/fesm2022/primitives/event-dispatch.mjs.map +1 -1
  20. package/fesm2022/primitives/signals.mjs +2 -2
  21. package/fesm2022/primitives/signals.mjs.map +1 -1
  22. package/fesm2022/resource.mjs +1 -1
  23. package/fesm2022/resource.mjs.map +1 -1
  24. package/fesm2022/root_effect_scheduler.mjs +47 -27
  25. package/fesm2022/root_effect_scheduler.mjs.map +1 -1
  26. package/fesm2022/rxjs-interop.mjs +3 -1
  27. package/fesm2022/rxjs-interop.mjs.map +1 -1
  28. package/fesm2022/signal.mjs +32 -11
  29. package/fesm2022/signal.mjs.map +1 -1
  30. package/fesm2022/testing.mjs +1 -1
  31. package/fesm2022/testing.mjs.map +1 -1
  32. package/fesm2022/weak_ref.mjs +1 -1
  33. package/fesm2022/weak_ref.mjs.map +1 -1
  34. package/graph.d.d.ts +24 -4
  35. package/index.d.ts +10 -94
  36. package/package.json +2 -2
  37. package/primitives/di/index.d.ts +1 -1
  38. package/primitives/event-dispatch/index.d.ts +1 -1
  39. package/primitives/signals/index.d.ts +2 -2
  40. package/rxjs-interop/index.d.ts +3 -1
  41. package/schematics/bundles/add-bootstrap-context-to-server-main.cjs +5 -5
  42. package/schematics/bundles/{apply_import_manager-CeOmw2t5.cjs → apply_import_manager-C8vgfoJx.cjs} +3 -3
  43. package/schematics/bundles/cleanup-unused-imports.cjs +5 -5
  44. package/schematics/bundles/{compiler_host-CXabxf2P.cjs → compiler_host-DC7Yquzy.cjs} +2 -2
  45. package/schematics/bundles/control-flow-migration.cjs +3 -3
  46. package/schematics/bundles/document-core.cjs +5 -5
  47. package/schematics/bundles/imports-CIX-JgAN.cjs +1 -1
  48. package/schematics/bundles/{index-CLpTl6rd.cjs → index-B5lv9x1v.cjs} +101 -29
  49. package/schematics/bundles/{index-CKtFJ_6n.cjs → index-Bufm9_1r.cjs} +4 -4
  50. package/schematics/bundles/inject-flags.cjs +5 -5
  51. package/schematics/bundles/inject-migration.cjs +3 -3
  52. package/schematics/bundles/leading_space-D9nQ8UQC.cjs +1 -1
  53. package/schematics/bundles/{migrate_ts_type_references-CjIN7lkE.cjs → migrate_ts_type_references-Ctl6-8qO.cjs} +5 -5
  54. package/schematics/bundles/ng_decorators-B5HCqr20.cjs +1 -1
  55. package/schematics/bundles/nodes-B16H9JUd.cjs +1 -1
  56. package/schematics/bundles/output-migration.cjs +6 -6
  57. package/schematics/bundles/{project_paths-CGqaSutM.cjs → project_paths-CIUSEdn4.cjs} +3 -3
  58. package/schematics/bundles/{project_tsconfig_paths-RAvhwg8f.cjs → project_tsconfig_paths-crm5NKE7.cjs} +168 -198
  59. package/schematics/bundles/property_name-BBwFuqMe.cjs +1 -1
  60. package/schematics/bundles/route-lazy-loading.cjs +48 -4
  61. package/schematics/bundles/router-current-navigation.cjs +4 -4
  62. package/schematics/bundles/self-closing-tags-migration.cjs +4 -4
  63. package/schematics/bundles/signal-input-migration.cjs +17 -9
  64. package/schematics/bundles/signal-queries-migration.cjs +7 -7
  65. package/schematics/bundles/signals.cjs +7 -7
  66. package/schematics/bundles/standalone-migration.cjs +4 -4
  67. package/schematics/bundles/symbol-VPWguRxr.cjs +1 -1
  68. package/schematics/bundles/test-bed-get.cjs +4 -4
  69. package/testing/index.d.ts +1 -1
  70. package/weak_ref.d.d.ts +1 -1
@@ -1,10 +1,10 @@
1
1
  /**
2
- * @license Angular v20.3.0-rc.0
2
+ * @license Angular v20.3.1
3
3
  * (c) 2010-2025 Google LLC. https://angular.io/
4
4
  * License: MIT
5
5
  */
6
6
 
7
- import { attachInjectFlag, _global, ɵɵdefineInjectable as __defineInjectable, ɵɵdefineInjector as __defineInjector, ɵɵinject as __inject, ɵɵinvalidFactoryDep as __invalidFactoryDep, resolveForwardRef, newArray, EMPTY_OBJ, assertString, assertNotEqual, FLAGS, assertEqual, isInCheckNoChangesMode, PREORDER_HOOK_FLAGS, assertFirstCreatePass, assertDefined, throwError, assertNumber, assertGreaterThan, HEADER_OFFSET, DECLARATION_VIEW, NG_FACTORY_DEF, isForwardRef, getFactoryDef, assertIndexInRange, assertTNodeForLView, enterDI, runInInjectorProfilerContext, getCurrentTNode, getLView, emitInjectorToCreateInstanceEvent, emitInstanceCreatedByInjectorEvent, throwProviderNotFoundError, leaveDI, assertNodeInjector, stringifyForError, cyclicDependencyErrorWithDetails, cyclicDependencyError, setInjectorProfilerContext, setInjectImplementation, assertDirectiveDef, NG_ELEMENT_ID, convertToBitFlags, isRootView, T_HOST, TVIEW, injectRootLimpMode, isComponentDef, EMBEDDED_VIEW_INJECTOR, INJECTOR$1 as INJECTOR, DECLARATION_COMPONENT_VIEW, isComponentHost, RuntimeError, NG_PROV_DEF, getClosureSafeProperty, getNativeByTNode, flatten, arrayEquals, ID, isLView, assertDomNode, unwrapRNode, getComponentLViewByIndex, CONTEXT, EMPTY_ARRAY, assertLView, HOST, CHILD_HEAD, NEXT, isLContainer, getLViewParent, Injector, CLEANUP, getComponentDef, getDirectiveDef, InjectionToken, inject, isInSkipHydrationBlock as isInSkipHydrationBlock$1, HYDRATION, isContentQueryHost, setCurrentQueryIndex, XSS_SECURITY_URL, renderStringify, ENVIRONMENT, makeEnvironmentProviders, isDirectiveHost, formatRuntimeError, resetPreOrderHookFlags, PARENT, RENDERER, CHILD_TAIL, assertSame, assertFirstUpdatePass, getSelectedIndex, getTView, assertIndexInDeclRange, setSelectedIndex, assertLContainer, MOVED_VIEWS, isDestroyed, REACTIVE_TEMPLATE_CONSUMER, DECLARATION_LCONTAINER, QUERIES, assertNotReactive, ON_DESTROY_HOOKS, assertFunction, EFFECTS, assertProjectionSlots, NATIVE, assertParentView, CONTAINER_HEADER_OFFSET, assertNotSame, setCurrentDirectiveIndex, setCurrentTNode, getElementDepthCount, increaseElementDepthCount, wasLastNodeCreated, isCurrentTNodeParent, setCurrentTNodeAsNotParent, assertHasParent, INTERNAL_APPLICATION_ERROR_HANDLER, stringify, getCurrentDirectiveIndex, unwrapLView, isCreationMode, enterView, leaveView, AFTER_RENDER_SEQUENCES_TO_ADD, markAncestorsForTraversal, markViewForRefresh, setIsRefreshingViews, isExhaustiveCheckNoChanges, requiresRefreshOrTraversal, setIsInCheckNoChangesMode, CheckNoChangesMode, setBindingIndex, EFFECTS_TO_SCHEDULE, viewAttachedToChangeDetector, setBindingRootForHostBindings, isRefreshingViews, removeFromArray, addToArray, updateAncestorTraversalFlagsOnAttach, storeLViewOnDestroy, VIEW_REFS, assertGreaterThanOrEqual, isInI18nBlock, assertTNodeForTView, getCurrentParentTNode, getCurrentTNodePlaceholderOk, assertTNode, assertTIcu, assertNumberInRange, DEHYDRATED_VIEWS, getNgModuleDef, getPipeDef as getPipeDef$1, getNgModuleDefOrThrow, isStandalone, concatStringsWithSpace, assertInjectImplementationNotEqual, emitInjectEvent, getConstant, assertLessThan, getOrCreateTViewCleanup, getOrCreateLViewCleanup, assertNotDefined, nextBindingIndex, getSelectedTNode, getDirectiveDefOrThrow, getTNode, assertComponentType, debugStringifyTypeForError, ChangeDetectionScheduler, EnvironmentInjector, SVG_NAMESPACE, MATH_ML_NAMESPACE, viewAttachedToContainer, storeCleanupWithContext, signal, createInjectorWithoutInjectorInstances, R3Injector, getNullInjector, internalImportProvidersFrom, initNgDevMode, fillProperties, getBindingsEnabled, lastNodeWasCreated, isInInjectionContext, DestroyRef, PendingTasksInternal, noop, ErrorHandler, assertNotInReactiveContext, assertInInjectionContext, ViewContext, removeLViewOnDestroy, walkUpViews, getNativeByIndex, assertElement, arrayInsert2, arraySplice, setInjectorProfiler, NullInjector, ENVIRONMENT_INITIALIZER, INJECTOR_DEF_TYPES, walkProviderTree, getInjectorDef, deepForEach, isTypeProvider, isSignal, runInInjectionContext, ZONELESS_ENABLED, EffectScheduler, PendingTasks, getAnimationElementRemovalRegistry, assertTNodeCreationIndex, isSkipHydrationRootTNode, leaveSkipHydrationBlock, decreaseElementDepthCount, getNamespace, enterSkipHydrationBlock, getCurrentDirectiveDef, assertIndexInExpandoRange, getBindingIndex, assertOneOf, setInI18nBlock, nextContextImpl, getCurrentQueryIndex, getContextLView, load, keyValueArrayIndexOf, keyValueArraySet, keyValueArrayGet, incrementBindingIndex, isWritableSignal, store, providerToFactory, emitProviderConfiguredEvent, isClassProvider, setAnimationElementRemovalRegistry, getBindingRoot, NG_COMP_DEF, ɵɵresetView as __resetView, ɵɵnamespaceHTML as __namespaceHTML, ɵɵnamespaceMathML as __namespaceMathML, ɵɵnamespaceSVG as __namespaceSVG, ɵɵenableBindings as __enableBindings, ɵɵdisableBindings as __disableBindings, ɵɵrestoreView as __restoreView, forwardRef, NG_MOD_DEF, NG_INJ_DEF, NG_DIR_DEF, NG_PIPE_DEF, ZONELESS_SCHEDULER_DISABLED, SCHEDULE_IN_ROOT_ZONE, PROVIDED_ZONELESS, getNativeByTNodeOrNull } from './root_effect_scheduler.mjs';
7
+ import { attachInjectFlag, _global, ɵɵdefineInjectable as __defineInjectable, ɵɵdefineInjector as __defineInjector, ɵɵinject as __inject, ɵɵinvalidFactoryDep as __invalidFactoryDep, resolveForwardRef, newArray, EMPTY_OBJ, assertString, assertNotEqual, FLAGS, assertEqual, isInCheckNoChangesMode, PREORDER_HOOK_FLAGS, assertFirstCreatePass, assertDefined, throwError, assertNumber, assertGreaterThan, HEADER_OFFSET, DECLARATION_VIEW, NG_FACTORY_DEF, isForwardRef, getFactoryDef, assertIndexInRange, assertTNodeForLView, enterDI, runInInjectorProfilerContext, getCurrentTNode, getLView, emitInjectorToCreateInstanceEvent, emitInstanceCreatedByInjectorEvent, throwProviderNotFoundError, leaveDI, assertNodeInjector, stringifyForError, cyclicDependencyErrorWithDetails, cyclicDependencyError, setInjectorProfilerContext, setInjectImplementation, assertDirectiveDef, NG_ELEMENT_ID, convertToBitFlags, isRootView, T_HOST, TVIEW, injectRootLimpMode, isComponentDef, EMBEDDED_VIEW_INJECTOR, INJECTOR$1 as INJECTOR, DECLARATION_COMPONENT_VIEW, isComponentHost, RuntimeError, NG_PROV_DEF, getClosureSafeProperty, getNativeByTNode, flatten, arrayEquals, ID, isLView, assertDomNode, unwrapRNode, getComponentLViewByIndex, CONTEXT, EMPTY_ARRAY, assertLView, HOST, CHILD_HEAD, NEXT, isLContainer, getLViewParent, Injector, CLEANUP, getComponentDef, getDirectiveDef, InjectionToken, inject, isInSkipHydrationBlock as isInSkipHydrationBlock$1, HYDRATION, isContentQueryHost, setCurrentQueryIndex, XSS_SECURITY_URL, renderStringify, ENVIRONMENT, makeEnvironmentProviders, isDirectiveHost, formatRuntimeError, resetPreOrderHookFlags, PARENT, RENDERER, CHILD_TAIL, assertSame, assertFirstUpdatePass, getSelectedIndex, getTView, assertIndexInDeclRange, setSelectedIndex, assertLContainer, MOVED_VIEWS, isDestroyed, REACTIVE_TEMPLATE_CONSUMER, DECLARATION_LCONTAINER, QUERIES, assertNotReactive, ON_DESTROY_HOOKS, assertFunction, EFFECTS, assertProjectionSlots, NATIVE, ANIMATIONS, assertParentView, CONTAINER_HEADER_OFFSET, assertNotSame, setCurrentDirectiveIndex, setCurrentTNode, getElementDepthCount, increaseElementDepthCount, wasLastNodeCreated, isCurrentTNodeParent, setCurrentTNodeAsNotParent, assertHasParent, INTERNAL_APPLICATION_ERROR_HANDLER, stringify, getCurrentDirectiveIndex, unwrapLView, isCreationMode, enterView, leaveView, AFTER_RENDER_SEQUENCES_TO_ADD, markAncestorsForTraversal, markViewForRefresh, setIsRefreshingViews, isExhaustiveCheckNoChanges, requiresRefreshOrTraversal, setIsInCheckNoChangesMode, CheckNoChangesMode, setBindingIndex, EFFECTS_TO_SCHEDULE, viewAttachedToChangeDetector, setBindingRootForHostBindings, isRefreshingViews, removeFromArray, addToArray, updateAncestorTraversalFlagsOnAttach, storeLViewOnDestroy, VIEW_REFS, assertGreaterThanOrEqual, isInI18nBlock, assertTNodeForTView, getCurrentParentTNode, getCurrentTNodePlaceholderOk, assertTNode, assertTIcu, assertNumberInRange, DEHYDRATED_VIEWS, getNgModuleDef, getPipeDef as getPipeDef$1, getNgModuleDefOrThrow, isStandalone, concatStringsWithSpace, assertInjectImplementationNotEqual, emitInjectEvent, getConstant, assertLessThan, getOrCreateTViewCleanup, getOrCreateLViewCleanup, assertNotDefined, nextBindingIndex, getSelectedTNode, getDirectiveDefOrThrow, getTNode, assertComponentType, debugStringifyTypeForError, ChangeDetectionScheduler, EnvironmentInjector, SVG_NAMESPACE, MATH_ML_NAMESPACE, viewAttachedToContainer, storeCleanupWithContext, signal, createInjectorWithoutInjectorInstances, R3Injector, getNullInjector, internalImportProvidersFrom, initNgDevMode, fillProperties, getBindingsEnabled, lastNodeWasCreated, isInInjectionContext, DestroyRef, PendingTasksInternal, noop, ErrorHandler, assertNotInReactiveContext, assertInInjectionContext, ViewContext, removeLViewOnDestroy, walkUpViews, getNativeByIndex, assertElement, arrayInsert2, arraySplice, setInjectorProfiler, NullInjector, ENVIRONMENT_INITIALIZER, INJECTOR_DEF_TYPES, walkProviderTree, getInjectorDef, deepForEach, isTypeProvider, isSignal, runInInjectionContext, ZONELESS_ENABLED, EffectScheduler, PendingTasks, assertTNodeCreationIndex, isSkipHydrationRootTNode, leaveSkipHydrationBlock, decreaseElementDepthCount, getNamespace, enterSkipHydrationBlock, getCurrentDirectiveDef, assertIndexInExpandoRange, getBindingIndex, assertOneOf, setInI18nBlock, nextContextImpl, getCurrentQueryIndex, getContextLView, load, keyValueArrayIndexOf, keyValueArraySet, keyValueArrayGet, incrementBindingIndex, isWritableSignal, store, providerToFactory, emitProviderConfiguredEvent, isClassProvider, getBindingRoot, NG_COMP_DEF, ɵɵresetView as __resetView, ɵɵnamespaceHTML as __namespaceHTML, ɵɵnamespaceMathML as __namespaceMathML, ɵɵnamespaceSVG as __namespaceSVG, ɵɵenableBindings as __enableBindings, ɵɵdisableBindings as __disableBindings, ɵɵrestoreView as __restoreView, forwardRef, NG_MOD_DEF, NG_INJ_DEF, NG_DIR_DEF, NG_PIPE_DEF, ZONELESS_SCHEDULER_DISABLED, SCHEDULE_IN_ROOT_ZONE, PROVIDED_ZONELESS, getNativeByTNodeOrNull } from './root_effect_scheduler.mjs';
8
8
  import { setActiveConsumer, SIGNAL, consumerDestroy, REACTIVE_NODE, consumerPollProducersForChange, consumerBeforeComputation, getActiveConsumer, consumerAfterComputation, createComputed, setThrowInvalidWriteToSignalError } from './signal.mjs';
9
9
  import { Subject, Subscription } from 'rxjs';
10
10
  import { setActiveConsumer as setActiveConsumer$1 } from '@angular/core/primitives/signals';
@@ -7209,11 +7209,123 @@ function ensureIcuContainerVisitorLoaded(loader) {
7209
7209
  }
7210
7210
  }
7211
7211
 
7212
+ /** Parses a CSS time value to milliseconds. */
7213
+ function parseCssTimeUnitsToMs(value) {
7214
+ // Some browsers will return it in seconds, whereas others will return milliseconds.
7215
+ const multiplier = value.toLowerCase().indexOf('ms') > -1 ? 1 : 1000;
7216
+ return parseFloat(value) * multiplier;
7217
+ }
7218
+ /** Parses out multiple values from a computed style into an array. */
7219
+ function parseCssPropertyValue(computedStyle, name) {
7220
+ const value = computedStyle.getPropertyValue(name);
7221
+ return value.split(',').map((part) => part.trim());
7222
+ }
7223
+ /** Gets the transform transition duration, including the delay, of an element in milliseconds. */
7224
+ function getLongestComputedTransition(computedStyle) {
7225
+ const transitionedProperties = parseCssPropertyValue(computedStyle, 'transition-property');
7226
+ const rawDurations = parseCssPropertyValue(computedStyle, 'transition-duration');
7227
+ const rawDelays = parseCssPropertyValue(computedStyle, 'transition-delay');
7228
+ const longest = { propertyName: '', duration: 0, animationName: undefined };
7229
+ for (let i = 0; i < transitionedProperties.length; i++) {
7230
+ const duration = parseCssTimeUnitsToMs(rawDelays[i]) + parseCssTimeUnitsToMs(rawDurations[i]);
7231
+ if (duration > longest.duration) {
7232
+ longest.propertyName = transitionedProperties[i];
7233
+ longest.duration = duration;
7234
+ }
7235
+ }
7236
+ return longest;
7237
+ }
7238
+ function getLongestComputedAnimation(computedStyle) {
7239
+ const rawNames = parseCssPropertyValue(computedStyle, 'animation-name');
7240
+ const rawDelays = parseCssPropertyValue(computedStyle, 'animation-delay');
7241
+ const rawDurations = parseCssPropertyValue(computedStyle, 'animation-duration');
7242
+ const longest = { animationName: '', propertyName: undefined, duration: 0 };
7243
+ for (let i = 0; i < rawNames.length; i++) {
7244
+ const duration = parseCssTimeUnitsToMs(rawDelays[i]) + parseCssTimeUnitsToMs(rawDurations[i]);
7245
+ if (duration > longest.duration) {
7246
+ longest.animationName = rawNames[i];
7247
+ longest.duration = duration;
7248
+ }
7249
+ }
7250
+ return longest;
7251
+ }
7252
+ function isShorterThanExistingAnimation(existing, longest) {
7253
+ return existing !== undefined && existing.duration > longest.duration;
7254
+ }
7255
+ function longestExists(longest) {
7256
+ return ((longest.animationName != undefined || longest.propertyName != undefined) &&
7257
+ longest.duration > 0);
7258
+ }
7259
+ /**
7260
+ * Determines the longest animation, but with `getComputedStyles` instead of `getAnimations`. This
7261
+ * is ultimately safer than getAnimations because it can be used when recalculations are in
7262
+ * progress. `getAnimations()` will be empty in that case.
7263
+ */
7264
+ function determineLongestAnimationFromComputedStyles(el, animationsMap) {
7265
+ const computedStyle = getComputedStyle(el);
7266
+ const longestAnimation = getLongestComputedAnimation(computedStyle);
7267
+ const longestTransition = getLongestComputedTransition(computedStyle);
7268
+ const longest = longestAnimation.duration > longestTransition.duration ? longestAnimation : longestTransition;
7269
+ if (isShorterThanExistingAnimation(animationsMap.get(el), longest))
7270
+ return;
7271
+ if (longestExists(longest)) {
7272
+ animationsMap.set(el, longest);
7273
+ }
7274
+ }
7275
+ /**
7276
+ * Multiple animations can be set on an element. This grabs an element and
7277
+ * determines which of those will be the longest duration. If we didn't do
7278
+ * this, elements would be removed whenever the first animation completes.
7279
+ * This ensures we get the longest running animation and only remove when
7280
+ * that animation completes.
7281
+ */
7282
+ function determineLongestAnimation(el, animationsMap, areAnimationSupported) {
7283
+ if (!areAnimationSupported)
7284
+ return;
7285
+ const animations = el.getAnimations();
7286
+ return animations.length === 0
7287
+ ? // fallback to computed styles if getAnimations is empty. This would happen if styles are
7288
+ // currently recalculating due to a reflow happening elsewhere.
7289
+ determineLongestAnimationFromComputedStyles(el, animationsMap)
7290
+ : determineLongestAnimationFromElementAnimations(el, animationsMap, animations);
7291
+ }
7292
+ function determineLongestAnimationFromElementAnimations(el, animationsMap, animations) {
7293
+ let longest = {
7294
+ animationName: undefined,
7295
+ propertyName: undefined,
7296
+ duration: 0,
7297
+ };
7298
+ for (const animation of animations) {
7299
+ const timing = animation.effect?.getTiming();
7300
+ // duration can be a string 'auto' or a number.
7301
+ const animDuration = typeof timing?.duration === 'number' ? timing.duration : 0;
7302
+ let duration = (timing?.delay ?? 0) + animDuration;
7303
+ let propertyName;
7304
+ let animationName;
7305
+ if (animation.animationName) {
7306
+ animationName = animation.animationName;
7307
+ }
7308
+ else {
7309
+ // Check for CSSTransition specific property
7310
+ propertyName = animation.transitionProperty;
7311
+ }
7312
+ if (duration >= longest.duration) {
7313
+ longest = { animationName, propertyName, duration };
7314
+ }
7315
+ }
7316
+ if (isShorterThanExistingAnimation(animationsMap.get(el), longest))
7317
+ return;
7318
+ if (longestExists(longest)) {
7319
+ animationsMap.set(el, longest);
7320
+ }
7321
+ }
7322
+ const allLeavingAnimations = new Set();
7323
+
7212
7324
  /**
7213
7325
  * NOTE: for performance reasons, the possible actions are inlined within the function instead of
7214
7326
  * being passed as an argument.
7215
7327
  */
7216
- function applyToElementOrContainer(action, renderer, parent, lNodeToHandle, beforeNode) {
7328
+ function applyToElementOrContainer(action, renderer, parent, lNodeToHandle, beforeNode, parentLView) {
7217
7329
  // If this slot was allocated for a text node dynamically created by i18n, the text node itself
7218
7330
  // won't be created until i18nApply() in the update block, so this node should be skipped.
7219
7331
  // For more info, see "ICU expressions should work inside an ngTemplateOutlet inside an ngFor"
@@ -7245,10 +7357,14 @@ function applyToElementOrContainer(action, renderer, parent, lNodeToHandle, befo
7245
7357
  nativeInsertBefore(renderer, parent, rNode, beforeNode || null, true);
7246
7358
  }
7247
7359
  else if (action === 2 /* WalkTNodeTreeAction.Detach */) {
7248
- nativeRemoveNode(renderer, rNode, isComponent);
7360
+ runLeaveAnimationsWithCallback(parentLView, () => {
7361
+ nativeRemoveNode(renderer, rNode, isComponent);
7362
+ });
7249
7363
  }
7250
7364
  else if (action === 3 /* WalkTNodeTreeAction.Destroy */) {
7251
- renderer.destroyNode(rNode);
7365
+ runLeaveAnimationsWithCallback(parentLView, () => {
7366
+ renderer.destroyNode(rNode);
7367
+ });
7252
7368
  }
7253
7369
  if (lContainer != null) {
7254
7370
  applyContainer(renderer, action, lContainer, parent, beforeNode);
@@ -7428,6 +7544,37 @@ function cleanUpView(tView, lView) {
7428
7544
  setActiveConsumer(prevConsumer);
7429
7545
  }
7430
7546
  }
7547
+ function runLeaveAnimationsWithCallback(lView, callback) {
7548
+ if (lView && lView[ANIMATIONS] && lView[ANIMATIONS].leave) {
7549
+ if (lView[ANIMATIONS].skipLeaveAnimations) {
7550
+ lView[ANIMATIONS].skipLeaveAnimations = false;
7551
+ }
7552
+ else {
7553
+ const leaveAnimations = lView[ANIMATIONS].leave;
7554
+ const runningAnimations = [];
7555
+ for (let index = 0; index < leaveAnimations.length; index++) {
7556
+ const animateFn = leaveAnimations[index];
7557
+ runningAnimations.push(animateFn());
7558
+ }
7559
+ lView[ANIMATIONS].running = Promise.allSettled(runningAnimations);
7560
+ lView[ANIMATIONS].leave = undefined;
7561
+ }
7562
+ }
7563
+ runAfterLeaveAnimations(lView, callback);
7564
+ }
7565
+ function runAfterLeaveAnimations(lView, callback) {
7566
+ if (lView && lView[ANIMATIONS] && lView[ANIMATIONS].running) {
7567
+ lView[ANIMATIONS].running.then(() => {
7568
+ if (lView[ANIMATIONS] && lView[ANIMATIONS].running) {
7569
+ lView[ANIMATIONS].running = undefined;
7570
+ }
7571
+ allLeavingAnimations.delete(lView);
7572
+ callback();
7573
+ });
7574
+ return;
7575
+ }
7576
+ callback();
7577
+ }
7431
7578
  /** Removes listeners and unsubscribes from output subscriptions */
7432
7579
  function processCleanups(tView, lView) {
7433
7580
  ngDevMode && assertNotReactive(processCleanups.name);
@@ -7765,22 +7912,22 @@ function applyNodes(renderer, action, tNode, lView, parentRElement, beforeNode,
7765
7912
  if (!isDetachedByI18n(tNode)) {
7766
7913
  if (tNodeType & 8 /* TNodeType.ElementContainer */) {
7767
7914
  applyNodes(renderer, action, tNode.child, lView, parentRElement, beforeNode, false);
7768
- applyToElementOrContainer(action, renderer, parentRElement, rawSlotValue, beforeNode);
7915
+ applyToElementOrContainer(action, renderer, parentRElement, rawSlotValue, beforeNode, lView);
7769
7916
  }
7770
7917
  else if (tNodeType & 32 /* TNodeType.Icu */) {
7771
7918
  const nextRNode = icuContainerIterate(tNode, lView);
7772
7919
  let rNode;
7773
7920
  while ((rNode = nextRNode())) {
7774
- applyToElementOrContainer(action, renderer, parentRElement, rNode, beforeNode);
7921
+ applyToElementOrContainer(action, renderer, parentRElement, rNode, beforeNode, lView);
7775
7922
  }
7776
- applyToElementOrContainer(action, renderer, parentRElement, rawSlotValue, beforeNode);
7923
+ applyToElementOrContainer(action, renderer, parentRElement, rawSlotValue, beforeNode, lView);
7777
7924
  }
7778
7925
  else if (tNodeType & 16 /* TNodeType.Projection */) {
7779
7926
  applyProjectionRecursive(renderer, action, lView, tNode, parentRElement, beforeNode);
7780
7927
  }
7781
7928
  else {
7782
7929
  ngDevMode && assertTNodeType(tNode, 3 /* TNodeType.AnyRNode */ | 4 /* TNodeType.Container */);
7783
- applyToElementOrContainer(action, renderer, parentRElement, rawSlotValue, beforeNode);
7930
+ applyToElementOrContainer(action, renderer, parentRElement, rawSlotValue, beforeNode, lView);
7784
7931
  }
7785
7932
  }
7786
7933
  tNode = isProjection ? tNode.projectionNext : tNode.next;
@@ -7834,7 +7981,7 @@ function applyProjectionRecursive(renderer, action, lView, tProjectionNode, pare
7834
7981
  // This should be refactored and cleaned up.
7835
7982
  for (let i = 0; i < nodeToProjectOrRNodes.length; i++) {
7836
7983
  const rNode = nodeToProjectOrRNodes[i];
7837
- applyToElementOrContainer(action, renderer, parentRElement, rNode, beforeNode);
7984
+ applyToElementOrContainer(action, renderer, parentRElement, rNode, beforeNode, lView);
7838
7985
  }
7839
7986
  }
7840
7987
  else {
@@ -8974,6 +9121,7 @@ function refreshView(tView, lView, templateFn, context) {
8974
9121
  if (templateFn !== null) {
8975
9122
  executeTemplate(tView, lView, templateFn, 2 /* RenderFlags.Update */, context);
8976
9123
  }
9124
+ runEnterAnimations(lView);
8977
9125
  const hooksInitPhaseCompleted = (flags & 3 /* LViewFlags.InitPhaseStateMask */) === 3 /* InitPhaseState.InitPhaseCompleted */;
8978
9126
  // execute pre-order hooks (OnInit, OnChanges, DoCheck)
8979
9127
  // PERF WARNING: do NOT extract this to a separate function without running benchmarks
@@ -9101,6 +9249,15 @@ function refreshView(tView, lView, templateFn, context) {
9101
9249
  leaveView();
9102
9250
  }
9103
9251
  }
9252
+ function runEnterAnimations(lView) {
9253
+ const animationData = lView[ANIMATIONS];
9254
+ if (animationData?.enter) {
9255
+ for (const animateFn of animationData.enter) {
9256
+ animateFn();
9257
+ }
9258
+ animationData.enter = undefined;
9259
+ }
9260
+ }
9104
9261
  /**
9105
9262
  * Goes over embedded views (ones created through ViewContainerRef APIs) and refreshes
9106
9263
  * them by executing an associated template function.
@@ -9740,15 +9897,20 @@ class ViewRef {
9740
9897
  * introduce other changes.
9741
9898
  */
9742
9899
  checkNoChanges() {
9743
- if (!ngDevMode)
9744
- return;
9745
- try {
9746
- this.exhaustive ??= this._lView[INJECTOR].get(UseExhaustiveCheckNoChanges, USE_EXHAUSTIVE_CHECK_NO_CHANGES_DEFAULT);
9747
- }
9748
- catch {
9749
- this.exhaustive = USE_EXHAUSTIVE_CHECK_NO_CHANGES_DEFAULT;
9900
+ // Note: we use `if (ngDevMode) { ... }` instead of an early return.
9901
+ // ESBuild is conservative about removing dead code that follows `return;`
9902
+ // inside a function body, so the block may remain in the bundle.
9903
+ // Using a conditional ensures the dev-only logic is reliably tree-shaken
9904
+ // in production builds.
9905
+ if (ngDevMode) {
9906
+ try {
9907
+ this.exhaustive ??= this._lView[INJECTOR].get(UseExhaustiveCheckNoChanges, USE_EXHAUSTIVE_CHECK_NO_CHANGES_DEFAULT);
9908
+ }
9909
+ catch {
9910
+ this.exhaustive = USE_EXHAUSTIVE_CHECK_NO_CHANGES_DEFAULT;
9911
+ }
9912
+ checkNoChangesInternal(this._lView, this.exhaustive);
9750
9913
  }
9751
- checkNoChangesInternal(this._lView, this.exhaustive);
9752
9914
  }
9753
9915
  attachToViewContainerRef() {
9754
9916
  if (this._appRef) {
@@ -13053,13 +13215,21 @@ function listenToDomEvent(tNode, tView, lView, eventTargetResolver, renderer, ev
13053
13215
  const target = eventTargetResolver ? eventTargetResolver(native) : native;
13054
13216
  stashEventListenerImpl(lView, target, eventName, wrappedListener);
13055
13217
  const cleanupFn = renderer.listen(target, eventName, wrappedListener);
13056
- const idxOrTargetGetter = eventTargetResolver
13057
- ? (_lView) => eventTargetResolver(unwrapRNode(_lView[tNode.index]))
13058
- : tNode.index;
13059
- storeListenerCleanup(idxOrTargetGetter, tView, lView, eventName, wrappedListener, cleanupFn, false);
13218
+ // We skip cleaning up animation event types to ensure leaving animation events can be used.
13219
+ // These events should be automatically garbage collected anyway after the element is
13220
+ // removed from the DOM.
13221
+ if (!isAnimationEventType(eventName)) {
13222
+ const idxOrTargetGetter = eventTargetResolver
13223
+ ? (_lView) => eventTargetResolver(unwrapRNode(_lView[tNode.index]))
13224
+ : tNode.index;
13225
+ storeListenerCleanup(idxOrTargetGetter, tView, lView, eventName, wrappedListener, cleanupFn, false);
13226
+ }
13060
13227
  }
13061
13228
  return hasCoalesced;
13062
13229
  }
13230
+ function isAnimationEventType(eventName) {
13231
+ return eventName.startsWith('animation') || eventName.startsWith('transition');
13232
+ }
13063
13233
  /**
13064
13234
  * A utility function that checks if a given element has already an event handler registered for an
13065
13235
  * event with a specified name. The TView.cleanup data structure is used to find out which events
@@ -13521,7 +13691,7 @@ class ComponentFactory extends ComponentFactory$1 {
13521
13691
  }
13522
13692
  function createRootTView(rootSelectorOrNode, componentDef, componentBindings, directives) {
13523
13693
  const tAttributes = rootSelectorOrNode
13524
- ? ['ng-version', '20.3.0-rc.0']
13694
+ ? ['ng-version', '20.3.1']
13525
13695
  : // Extract attributes and classes from the first selector only to match VE behavior.
13526
13696
  extractAttrsAndClassesFromSelector(componentDef.selectors[0]);
13527
13697
  let creationBindings = null;
@@ -20528,6 +20698,22 @@ function remove(list, el) {
20528
20698
  }
20529
20699
  }
20530
20700
 
20701
+ /**
20702
+ * Replace with `Promise.withResolvers()` once it's available.
20703
+ * NET September 2026
20704
+ *
20705
+ * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/withResolvers.
20706
+ */
20707
+ function promiseWithResolvers() {
20708
+ let resolve;
20709
+ let reject;
20710
+ const promise = new Promise((res, rej) => {
20711
+ resolve = res;
20712
+ reject = rej;
20713
+ });
20714
+ return { promise, resolve, reject };
20715
+ }
20716
+
20531
20717
  /**
20532
20718
  * Schedules triggering of a defer block for `on idle` and `on timer` conditions.
20533
20719
  */
@@ -20897,7 +21083,7 @@ function cleanupRemainingHydrationQueue(hydrationQueue, dehydratedBlockRegistry)
20897
21083
  */
20898
21084
  function populateHydratingStateForQueue(registry, queue) {
20899
21085
  for (let blockId of queue) {
20900
- registry.hydrating.set(blockId, Promise.withResolvers());
21086
+ registry.hydrating.set(blockId, promiseWithResolvers());
20901
21087
  }
20902
21088
  }
20903
21089
  // Waits for the next render cycle to complete
@@ -21745,278 +21931,88 @@ const MAX_ANIMATION_TIMEOUT = new InjectionToken(typeof ngDevMode !== 'undefined
21745
21931
  });
21746
21932
  const MAX_ANIMATION_TIMEOUT_DEFAULT = 4000;
21747
21933
 
21934
+ const DEFAULT_ANIMATIONS_DISABLED = false;
21935
+ const areAnimationSupported = (typeof ngServerMode === 'undefined' || !ngServerMode) &&
21936
+ typeof document !== 'undefined' &&
21937
+ // tslint:disable-next-line:no-toplevel-property-access
21938
+ typeof document?.documentElement?.getAnimations === 'function';
21748
21939
  /**
21749
- * Registers elements for delayed removal action for animation in the case
21750
- * that `animate.leave` is used. This stores the target element and any
21751
- * classes, class resolvers, and callback functions that may be needed
21752
- * to apply the removal animation, and then stashes the actual element
21753
- * removal function from the dom renderer to be called after the
21754
- * animation is finished.
21755
- */
21756
- class ElementRegistry {
21757
- outElements = new WeakMap();
21758
- remove(el) {
21759
- this.outElements.delete(el);
21760
- }
21761
- /** Used when animate.leave is only applying classes */
21762
- trackClasses(details, classes) {
21763
- const classList = getClassListFromValue(classes);
21764
- if (!classList)
21765
- return;
21766
- for (let klass of classList) {
21767
- details.classes?.add(klass);
21768
- }
21940
+ * Helper function to check if animations are disabled via injection token
21941
+ */
21942
+ function areAnimationsDisabled(lView) {
21943
+ const injector = lView[INJECTOR];
21944
+ return injector.get(ANIMATIONS_DISABLED, DEFAULT_ANIMATIONS_DISABLED);
21945
+ }
21946
+ /**
21947
+ * Asserts a value passed in is actually an animation type and not something else
21948
+ */
21949
+ function assertAnimationTypes(value, instruction) {
21950
+ if (value == null || (typeof value !== 'string' && typeof value !== 'function')) {
21951
+ throw new RuntimeError(650 /* RuntimeErrorCode.ANIMATE_INVALID_VALUE */, `'${instruction}' value must be a string of CSS classes or an animation function, got ${stringify(value)}`);
21769
21952
  }
21770
- /** Used when animate.leave is applying classes via a bound attribute
21771
- * which requires resolving the binding function at the right time
21772
- * to get the proper class list. There may be multiple resolvers due
21773
- * to composition via host bindings.
21774
- */
21775
- trackResolver(details, resolver) {
21776
- if (!details.classFns) {
21777
- details.classFns = [resolver];
21778
- }
21779
- else {
21780
- details.classFns.push(resolver);
21781
- }
21953
+ }
21954
+ /**
21955
+ * Asserts a given native element is an actual Element node and not something like a comment node.
21956
+ */
21957
+ function assertElementNodes(nativeElement, instruction) {
21958
+ if (nativeElement.nodeType !== Node.ELEMENT_NODE) {
21959
+ throw new RuntimeError(650 /* RuntimeErrorCode.ANIMATE_INVALID_VALUE */, `'${instruction}' can only be used on an element node, got ${stringify(nativeElement.nodeType)}`);
21782
21960
  }
21783
- /** Used when `animate.leave` is using the function signature and will have a
21784
- * callback function, rather than a list of classes.
21785
- */
21786
- addCallback(el, value, animateWrapperFn) {
21787
- const details = this.outElements.get(el) ?? {
21788
- classes: null,
21789
- animateFn: () => { },
21790
- isEventBinding: true,
21791
- };
21792
- details.animateFn = animateWrapperFn(el, value);
21793
- this.outElements.set(el, details);
21794
- }
21795
- /** Used when `animate.leave` is using classes. */
21796
- add(el, value, animateWrapperFn) {
21797
- const details = this.outElements.get(el) ?? {
21798
- classes: new Set(),
21799
- animateFn: () => { },
21800
- isEventBinding: false,
21801
- };
21802
- if (typeof value === 'function') {
21803
- this.trackResolver(details, value);
21961
+ }
21962
+ /**
21963
+ * trackEnterClasses is necessary in the case of composition where animate.enter
21964
+ * is used on the same element in multiple places, like on the element and in a
21965
+ * host binding. When removing classes, we need the entire list of animation classes
21966
+ * added to properly remove them when the longest animation fires.
21967
+ */
21968
+ function trackEnterClasses(el, classList, cleanupFns) {
21969
+ const elementData = enterClassMap.get(el);
21970
+ if (elementData) {
21971
+ for (const klass of classList) {
21972
+ elementData.classList.push(klass);
21804
21973
  }
21805
- else {
21806
- this.trackClasses(details, value);
21974
+ for (const fn of cleanupFns) {
21975
+ elementData.cleanupFns.push(fn);
21807
21976
  }
21808
- details.animateFn = animateWrapperFn(el, details.classes, details.classFns);
21809
- this.outElements.set(el, details);
21810
21977
  }
21811
- has(el) {
21812
- return this.outElements.has(el);
21978
+ else {
21979
+ enterClassMap.set(el, { classList, cleanupFns });
21813
21980
  }
21814
- /** This is called by the dom renderer to actually initiate the animation
21815
- * using the animateFn stored in the registry. The DOM renderer passes in
21816
- * the removal function to be fired off when the animation finishes.
21817
- */
21818
- animate(el, removeFn, maxAnimationTimeout) {
21819
- if (!this.outElements.has(el))
21820
- return removeFn();
21821
- const details = this.outElements.get(el);
21822
- let timeoutId;
21823
- let called = false;
21824
- const remove = () => {
21825
- // This called check is to prevent a rare race condition where the timing of removal
21826
- // might result in the removal function being called twice.
21827
- if (called)
21828
- return;
21829
- called = true;
21830
- clearTimeout(timeoutId);
21831
- this.remove(el);
21832
- removeFn();
21833
- };
21834
- // this timeout is used to ensure elements actually get removed in the case
21835
- // that the user forgot to call the remove callback. The timeout is cleared
21836
- // in the DOM renderer during the remove child process. It only applies
21837
- // to the event binding use case.
21838
- if (details.isEventBinding) {
21839
- timeoutId = setTimeout(remove, maxAnimationTimeout);
21981
+ }
21982
+ /**
21983
+ * Helper function to cleanup enterClassMap data safely
21984
+ */
21985
+ function cleanupEnterClassData(element) {
21986
+ const elementData = enterClassMap.get(element);
21987
+ if (elementData) {
21988
+ for (const fn of elementData.cleanupFns) {
21989
+ fn();
21840
21990
  }
21841
- details.animateFn(remove);
21991
+ enterClassMap.delete(element);
21842
21992
  }
21993
+ longestAnimations.delete(element);
21843
21994
  }
21844
- function getClassListFromValue(value) {
21845
- const classes = typeof value === 'function' ? value() : value;
21846
- let classList = Array.isArray(classes) ? classes : null;
21847
- if (typeof classes === 'string') {
21848
- classList = classes
21849
- .trim()
21850
- .split(/\s+/)
21851
- .filter((k) => k);
21852
- }
21853
- return classList;
21854
- }
21855
-
21856
- /** Parses a CSS time value to milliseconds. */
21857
- function parseCssTimeUnitsToMs(value) {
21858
- // Some browsers will return it in seconds, whereas others will return milliseconds.
21859
- const multiplier = value.toLowerCase().indexOf('ms') > -1 ? 1 : 1000;
21860
- return parseFloat(value) * multiplier;
21861
- }
21862
- /** Parses out multiple values from a computed style into an array. */
21863
- function parseCssPropertyValue(computedStyle, name) {
21864
- const value = computedStyle.getPropertyValue(name);
21865
- return value.split(',').map((part) => part.trim());
21866
- }
21867
- /** Gets the transform transition duration, including the delay, of an element in milliseconds. */
21868
- function getLongestComputedTransition(computedStyle) {
21869
- const transitionedProperties = parseCssPropertyValue(computedStyle, 'transition-property');
21870
- const rawDurations = parseCssPropertyValue(computedStyle, 'transition-duration');
21871
- const rawDelays = parseCssPropertyValue(computedStyle, 'transition-delay');
21872
- const longest = { propertyName: '', duration: 0, animationName: undefined };
21873
- for (let i = 0; i < transitionedProperties.length; i++) {
21874
- const duration = parseCssTimeUnitsToMs(rawDelays[i]) + parseCssTimeUnitsToMs(rawDurations[i]);
21875
- if (duration > longest.duration) {
21876
- longest.propertyName = transitionedProperties[i];
21877
- longest.duration = duration;
21878
- }
21879
- }
21880
- return longest;
21881
- }
21882
- function getLongestComputedAnimation(computedStyle) {
21883
- const rawNames = parseCssPropertyValue(computedStyle, 'animation-name');
21884
- const rawDelays = parseCssPropertyValue(computedStyle, 'animation-delay');
21885
- const rawDurations = parseCssPropertyValue(computedStyle, 'animation-duration');
21886
- const longest = { animationName: '', propertyName: undefined, duration: 0 };
21887
- for (let i = 0; i < rawNames.length; i++) {
21888
- const duration = parseCssTimeUnitsToMs(rawDelays[i]) + parseCssTimeUnitsToMs(rawDurations[i]);
21889
- if (duration > longest.duration) {
21890
- longest.animationName = rawNames[i];
21891
- longest.duration = duration;
21892
- }
21893
- }
21894
- return longest;
21895
- }
21896
- function isShorterThanExistingAnimation(existing, longest) {
21897
- return existing !== undefined && existing.duration > longest.duration;
21898
- }
21899
- function longestExists(longest) {
21900
- return ((longest.animationName != undefined || longest.propertyName != undefined) &&
21901
- longest.duration > 0);
21902
- }
21903
- /**
21904
- * Determines the longest animation, but with `getComputedStyles` instead of `getAnimations`. This
21905
- * is ultimately safer than getAnimations because it can be used when recalculations are in
21906
- * progress. `getAnimations()` will be empty in that case.
21907
- */
21908
- function determineLongestAnimationFromComputedStyles(el, animationsMap) {
21909
- const computedStyle = getComputedStyle(el);
21910
- const longestAnimation = getLongestComputedAnimation(computedStyle);
21911
- const longestTransition = getLongestComputedTransition(computedStyle);
21912
- const longest = longestAnimation.duration > longestTransition.duration ? longestAnimation : longestTransition;
21913
- if (isShorterThanExistingAnimation(animationsMap.get(el), longest))
21914
- return;
21915
- if (longestExists(longest)) {
21916
- animationsMap.set(el, longest);
21917
- }
21918
- }
21919
- /**
21920
- * Multiple animations can be set on an element. This grabs an element and
21921
- * determines which of those will be the longest duration. If we didn't do
21922
- * this, elements would be removed whenever the first animation completes.
21923
- * This ensures we get the longest running animation and only remove when
21924
- * that animation completes.
21925
- */
21926
- function determineLongestAnimation(el, animationsMap, areAnimationSupported) {
21927
- if (!areAnimationSupported)
21928
- return;
21929
- const animations = el.getAnimations();
21930
- return animations.length === 0
21931
- ? // fallback to computed styles if getAnimations is empty. This would happen if styles are
21932
- // currently recalculating due to a reflow happening elsewhere.
21933
- determineLongestAnimationFromComputedStyles(el, animationsMap)
21934
- : determineLongestAnimationFromElementAnimations(el, animationsMap, animations);
21935
- }
21936
- function determineLongestAnimationFromElementAnimations(el, animationsMap, animations) {
21937
- let longest = {
21938
- animationName: undefined,
21939
- propertyName: undefined,
21940
- duration: 0,
21941
- };
21942
- for (const animation of animations) {
21943
- const timing = animation.effect?.getTiming();
21944
- // duration can be a string 'auto' or a number.
21945
- const animDuration = typeof timing?.duration === 'number' ? timing.duration : 0;
21946
- let duration = (timing?.delay ?? 0) + animDuration;
21947
- let propertyName;
21948
- let animationName;
21949
- if (animation.animationName) {
21950
- animationName = animation.animationName;
21951
- }
21952
- else {
21953
- // Check for CSSTransition specific property
21954
- propertyName = animation.transitionProperty;
21955
- }
21956
- if (duration >= longest.duration) {
21957
- longest = { animationName, propertyName, duration };
21958
- }
21959
- }
21960
- if (isShorterThanExistingAnimation(animationsMap.get(el), longest))
21961
- return;
21962
- if (longestExists(longest)) {
21963
- animationsMap.set(el, longest);
21964
- }
21965
- }
21966
-
21967
- const DEFAULT_ANIMATIONS_DISABLED = false;
21968
- const areAnimationSupported = (typeof ngServerMode === 'undefined' || !ngServerMode) &&
21969
- typeof document !== 'undefined' &&
21970
- // tslint:disable-next-line:no-toplevel-property-access
21971
- typeof document?.documentElement?.getAnimations === 'function';
21972
- /**
21973
- * Helper function to check if animations are disabled via injection token
21974
- */
21975
- function areAnimationsDisabled(lView) {
21976
- const injector = lView[INJECTOR];
21977
- return injector.get(ANIMATIONS_DISABLED, DEFAULT_ANIMATIONS_DISABLED);
21978
- }
21979
- /**
21980
- * Helper function to setup element registry cleanup when LView is destroyed
21981
- */
21982
- function setupElementRegistryCleanup(elementRegistry, lView, tView, nativeElement) {
21983
- if (lView[FLAGS] & 8 /* LViewFlags.FirstLViewPass */) {
21984
- storeCleanupWithContext(tView, lView, nativeElement, (elToClean) => {
21985
- elementRegistry.elements.remove(elToClean);
21986
- });
21987
- }
21988
- }
21989
- /**
21990
- * Helper function to cleanup enterClassMap data safely
21991
- */
21992
- function cleanupEnterClassData(element) {
21993
- const elementData = enterClassMap.get(element);
21994
- if (elementData) {
21995
- for (const fn of elementData.cleanupFns) {
21996
- fn();
21997
- }
21998
- enterClassMap.delete(element);
21999
- }
22000
- longestAnimations.delete(element);
22001
- }
22002
- const noOpAnimationComplete = () => { };
22003
- // Tracks the list of classes added to a DOM node from `animate.enter` calls to ensure
22004
- // we remove all of the classes in the case of animation composition via host bindings.
22005
- const enterClassMap = new WeakMap();
22006
- const longestAnimations = new WeakMap();
22007
- // Tracks nodes that are animating away for the duration of the animation. This is
22008
- // used to prevent duplicate nodes from showing up when nodes have been toggled quickly
22009
- // from an `@if` or `@for`.
22010
- const leavingNodes = new WeakMap();
22011
- function clearLeavingNodes(tNode, el) {
22012
- const nodes = leavingNodes.get(tNode);
22013
- if (nodes && nodes.length > 0) {
22014
- const ix = nodes.findIndex((node) => node === el);
22015
- if (ix > -1)
22016
- nodes.splice(ix, 1);
22017
- }
22018
- if (nodes?.length === 0) {
22019
- leavingNodes.delete(tNode);
21995
+ const noOpAnimationComplete = () => { };
21996
+ // Tracks the list of classes added to a DOM node from `animate.enter` calls to ensure
21997
+ // we remove all of the classes in the case of animation composition via host bindings.
21998
+ const enterClassMap = new WeakMap();
21999
+ const longestAnimations = new WeakMap();
22000
+ // Tracks nodes that are animating away for the duration of the animation. This is
22001
+ // used to prevent duplicate nodes from showing up when nodes have been toggled quickly
22002
+ // from an `@if` or `@for`.
22003
+ const leavingNodes = new WeakMap();
22004
+ /**
22005
+ * This actually removes the leaving HTML Element in the TNode
22006
+ */
22007
+ function clearLeavingNodes(tNode, el) {
22008
+ const nodes = leavingNodes.get(tNode);
22009
+ if (nodes && nodes.length > 0) {
22010
+ const ix = nodes.findIndex((node) => node === el);
22011
+ if (ix > -1)
22012
+ nodes.splice(ix, 1);
22013
+ }
22014
+ if (nodes?.length === 0) {
22015
+ leavingNodes.delete(tNode);
22020
22016
  }
22021
22017
  }
22022
22018
  /**
@@ -22031,7 +22027,9 @@ function cancelLeavingNodes(tNode, lView) {
22031
22027
  // this is the insertion point for the new TNode element.
22032
22028
  // it will be inserted before the declaring containers anchor.
22033
22029
  const beforeNode = getBeforeNodeForView(tNode.index, lContainer);
22034
- // here we need to check the previous sibling of that anchor
22030
+ // here we need to check the previous sibling of that anchor. The first
22031
+ // previousSibling node will be the new element added. The second
22032
+ // previousSibling will be the one that's being removed.
22035
22033
  const previousNode = beforeNode?.previousSibling;
22036
22034
  // We really only want to cancel animations if the leaving node is the
22037
22035
  // same as the node before where the new node will be inserted. This is
@@ -22041,6 +22039,11 @@ function cancelLeavingNodes(tNode, lView) {
22041
22039
  }
22042
22040
  }
22043
22041
  }
22042
+ /**
22043
+ * Tracks the nodes list of nodes that are leaving the DOM so we can cancel any leave animations
22044
+ * and remove the node before adding a new entering instance of the DOM node. This prevents
22045
+ * duplicates from showing up on screen mid-animation.
22046
+ */
22044
22047
  function trackLeavingNodes(tNode, el) {
22045
22048
  // We need to track this tNode's element just to be sure we don't add
22046
22049
  // a new RNode for this TNode while this one is still animating away.
@@ -22052,6 +22055,80 @@ function trackLeavingNodes(tNode, el) {
22052
22055
  leavingNodes.set(tNode, [el]);
22053
22056
  }
22054
22057
  }
22058
+ /**
22059
+ * Retrieves the list of specified enter animations from the lView
22060
+ */
22061
+ function getLViewEnterAnimations(lView) {
22062
+ const animationData = (lView[ANIMATIONS] ??= {});
22063
+ return (animationData.enter ??= []);
22064
+ }
22065
+ /**
22066
+ * Retrieves the list of specified leave animations from the lView
22067
+ */
22068
+ function getLViewLeaveAnimations(lView) {
22069
+ const animationData = (lView[ANIMATIONS] ??= {});
22070
+ return (animationData.leave ??= []);
22071
+ }
22072
+ /**
22073
+ * Gets the list of classes from a passed in value
22074
+ */
22075
+ function getClassListFromValue(value) {
22076
+ const classes = typeof value === 'function' ? value() : value;
22077
+ let classList = Array.isArray(classes) ? classes : null;
22078
+ if (typeof classes === 'string') {
22079
+ classList = classes
22080
+ .trim()
22081
+ .split(/\s+/)
22082
+ .filter((k) => k);
22083
+ }
22084
+ return classList;
22085
+ }
22086
+ /**
22087
+ * Cancels any running enter animations on a given element to prevent them from interfering
22088
+ * with leave animations.
22089
+ */
22090
+ function cancelAnimationsIfRunning(element, renderer) {
22091
+ if (!areAnimationSupported)
22092
+ return;
22093
+ const elementData = enterClassMap.get(element);
22094
+ if (elementData &&
22095
+ elementData.classList.length > 0 &&
22096
+ elementHasClassList(element, elementData.classList)) {
22097
+ for (const klass of elementData.classList) {
22098
+ renderer.removeClass(element, klass);
22099
+ }
22100
+ }
22101
+ // We need to prevent any enter animation listeners from firing if they exist.
22102
+ cleanupEnterClassData(element);
22103
+ }
22104
+ /**
22105
+ * Checks if a given element contains the classes is a provided list
22106
+ */
22107
+ function elementHasClassList(element, classList) {
22108
+ for (const className of classList) {
22109
+ if (element.classList.contains(className))
22110
+ return true;
22111
+ }
22112
+ return false;
22113
+ }
22114
+ /**
22115
+ * Determines if the animation or transition event is currently the expected longest animation
22116
+ * based on earlier determined data in `longestAnimations`
22117
+ *
22118
+ * @param event
22119
+ * @param nativeElement
22120
+ * @returns
22121
+ */
22122
+ function isLongestAnimation(event, nativeElement) {
22123
+ const longestAnimation = longestAnimations.get(nativeElement);
22124
+ return (nativeElement === event.target &&
22125
+ longestAnimation !== undefined &&
22126
+ ((longestAnimation.animationName !== undefined &&
22127
+ event.animationName === longestAnimation.animationName) ||
22128
+ (longestAnimation.propertyName !== undefined &&
22129
+ event.propertyName === longestAnimation.propertyName)));
22130
+ }
22131
+
22055
22132
  /**
22056
22133
  * Instruction to handle the `animate.enter` behavior for class bindings.
22057
22134
  *
@@ -22071,6 +22148,11 @@ function ɵɵanimateEnter(value) {
22071
22148
  return ɵɵanimateEnter;
22072
22149
  }
22073
22150
  const tNode = getCurrentTNode();
22151
+ cancelLeavingNodes(tNode, lView);
22152
+ getLViewEnterAnimations(lView).push(() => runEnterAnimation(lView, tNode, value));
22153
+ return ɵɵanimateEnter; // For chaining
22154
+ }
22155
+ function runEnterAnimation(lView, tNode, value) {
22074
22156
  const nativeElement = getNativeByTNode(tNode, lView);
22075
22157
  ngDevMode && assertElementNodes(nativeElement, 'animate.enter');
22076
22158
  const renderer = lView[RENDERER];
@@ -22083,23 +22165,22 @@ function ɵɵanimateEnter(value) {
22083
22165
  // to get the longest animation to ensure we don't complete animations early.
22084
22166
  // This also allows us to setup cancellation of animations in progress if the
22085
22167
  // gets removed early.
22086
- const handleAnimationStart = (event) => {
22168
+ const handleEnterAnimationStart = (event) => {
22087
22169
  const eventName = event instanceof AnimationEvent ? 'animationend' : 'transitionend';
22088
22170
  ngZone.runOutsideAngular(() => {
22089
- cleanupFns.push(renderer.listen(nativeElement, eventName, handleInAnimationEnd));
22171
+ cleanupFns.push(renderer.listen(nativeElement, eventName, handleEnterAnimationEnd));
22090
22172
  });
22091
22173
  };
22092
22174
  // When the longest animation ends, we can remove all the classes
22093
- const handleInAnimationEnd = (event) => {
22094
- animationEnd(event, nativeElement, renderer);
22175
+ const handleEnterAnimationEnd = (event) => {
22176
+ enterAnimationEnd(event, nativeElement, renderer);
22095
22177
  };
22096
22178
  // We only need to add these event listeners if there are actual classes to apply
22097
22179
  if (activeClasses && activeClasses.length > 0) {
22098
22180
  ngZone.runOutsideAngular(() => {
22099
- cleanupFns.push(renderer.listen(nativeElement, 'animationstart', handleAnimationStart));
22100
- cleanupFns.push(renderer.listen(nativeElement, 'transitionstart', handleAnimationStart));
22181
+ cleanupFns.push(renderer.listen(nativeElement, 'animationstart', handleEnterAnimationStart));
22182
+ cleanupFns.push(renderer.listen(nativeElement, 'transitionstart', handleEnterAnimationStart));
22101
22183
  });
22102
- cancelLeavingNodes(tNode, lView);
22103
22184
  trackEnterClasses(nativeElement, activeClasses, cleanupFns);
22104
22185
  for (const klass of activeClasses) {
22105
22186
  renderer.addClass(nativeElement, klass);
@@ -22119,26 +22200,21 @@ function ɵɵanimateEnter(value) {
22119
22200
  });
22120
22201
  });
22121
22202
  }
22122
- return ɵɵanimateEnter; // For chaining
22123
22203
  }
22124
- /**
22125
- * trackEnterClasses is necessary in the case of composition where animate.enter
22126
- * is used on the same element in multiple places, like on the element and in a
22127
- * host binding. When removing classes, we need the entire list of animation classes
22128
- * added to properly remove them when the longest animation fires.
22129
- */
22130
- function trackEnterClasses(el, classList, cleanupFns) {
22131
- const elementData = enterClassMap.get(el);
22132
- if (elementData) {
22133
- for (const klass of classList) {
22134
- elementData.classList.push(klass);
22135
- }
22136
- for (const fn of cleanupFns) {
22137
- elementData.cleanupFns.push(fn);
22204
+ function enterAnimationEnd(event, nativeElement, renderer) {
22205
+ const elementData = enterClassMap.get(nativeElement);
22206
+ if (!elementData)
22207
+ return;
22208
+ if (isLongestAnimation(event, nativeElement)) {
22209
+ // Now that we've found the longest animation, there's no need
22210
+ // to keep bubbling up this event as it's not going to apply to
22211
+ // other elements further up. We don't want it to inadvertently
22212
+ // affect any other animations on the page.
22213
+ event.stopImmediatePropagation();
22214
+ for (const klass of elementData.classList) {
22215
+ renderer.removeClass(nativeElement, klass);
22138
22216
  }
22139
- }
22140
- else {
22141
- enterClassMap.set(el, { classList, cleanupFns });
22217
+ cleanupEnterClassData(nativeElement);
22142
22218
  }
22143
22219
  }
22144
22220
  /**
@@ -22161,16 +22237,22 @@ function ɵɵanimateEnterListener(value) {
22161
22237
  return ɵɵanimateEnterListener;
22162
22238
  }
22163
22239
  const tNode = getCurrentTNode();
22240
+ cancelLeavingNodes(tNode, lView);
22241
+ getLViewEnterAnimations(lView).push(() => runEnterAnimationFunction(lView, tNode, value));
22242
+ return ɵɵanimateEnterListener;
22243
+ }
22244
+ /**
22245
+ * runs enter animations when a custom function is provided
22246
+ */
22247
+ function runEnterAnimationFunction(lView, tNode, value) {
22164
22248
  const nativeElement = getNativeByTNode(tNode, lView);
22165
22249
  ngDevMode && assertElementNodes(nativeElement, 'animate.enter');
22166
- cancelLeavingNodes(tNode, lView);
22167
22250
  value.call(lView[CONTEXT], { target: nativeElement, animationComplete: noOpAnimationComplete });
22168
- return ɵɵanimateEnterListener;
22169
22251
  }
22170
22252
  /**
22171
22253
  * Instruction to handle the `animate.leave` behavior for class animations.
22172
- * It registers an animation with the ElementRegistry to be run when the element
22173
- * is scheduled for removal from the DOM.
22254
+ * It creates a leave animation function that's tracked in the LView to
22255
+ * be run before DOM node removal and cleanup.
22174
22256
  *
22175
22257
  * @param value The value bound to `animate.leave`, which can be a string or a function.
22176
22258
  * @returns This function returns itself so that it may be chained.
@@ -22188,170 +22270,34 @@ function ɵɵanimateLeave(value) {
22188
22270
  if (animationsDisabled) {
22189
22271
  return ɵɵanimateLeave;
22190
22272
  }
22191
- const tView = getTView();
22192
22273
  const tNode = getCurrentTNode();
22193
- const nativeElement = getNativeByTNode(tNode, lView);
22194
- ngDevMode && assertElementNodes(nativeElement, 'animate.leave');
22195
- // This instruction is called in the update pass.
22196
- const renderer = lView[RENDERER];
22197
- const elementRegistry = getAnimationElementRemovalRegistry();
22198
- ngDevMode &&
22199
- assertDefined(elementRegistry.elements, 'Expected `ElementRegistry` to be present in animations subsystem');
22200
- const ngZone = lView[INJECTOR].get(NgZone);
22201
- // This function gets stashed in the registry to be used once the element removal process
22202
- // begins. We pass in the values and resolvers so as to evaluate the resolved classes
22203
- // at the latest possible time, meaning we evaluate them right before the animation
22204
- // begins.
22205
- const animate = (el, value, resolvers) => {
22206
- return (removalFn) => {
22207
- animateLeaveClassRunner(el, tNode, getClassList(value, resolvers), removalFn, renderer, animationsDisabled, ngZone);
22208
- };
22209
- };
22210
- // Ensure cleanup if the LView is destroyed before the animation runs.
22211
- setupElementRegistryCleanup(elementRegistry, lView, tView, nativeElement);
22212
- elementRegistry.elements.add(nativeElement, value, animate);
22274
+ getLViewLeaveAnimations(lView).push(() => runLeaveAnimations(lView, tNode, value, animationsDisabled));
22213
22275
  return ɵɵanimateLeave; // For chaining
22214
22276
  }
22215
- /**
22216
- * Instruction to handle the `(animate.leave)` behavior for event bindings, aka when
22217
- * a user wants to use a custom animation function rather than a class. It registers
22218
- * an animation with the ElementRegistry to be run when the element is scheduled for
22219
- * removal from the DOM.
22220
- *
22221
- * @param value The value bound to `(animate.leave)`, an AnimationFunction.
22222
- * @returns This function returns itself so that it may be chained.
22223
- *
22224
- * @codeGenApi
22225
- */
22226
- function ɵɵanimateLeaveListener(value) {
22227
- performanceMarkFeature('NgAnimateLeave');
22228
- if ((typeof ngServerMode !== 'undefined' && ngServerMode) || !areAnimationSupported) {
22229
- return ɵɵanimateLeaveListener;
22230
- }
22231
- ngDevMode && assertAnimationTypes(value, 'animate.leave');
22232
- // Even when animations are disabled, we still need to register the element for removal
22233
- // to ensure proper cleanup and allow developers to handle element removal in tests
22234
- // So we don't have an early return here.
22235
- const lView = getLView();
22236
- const tNode = getCurrentTNode();
22237
- const tView = getTView();
22277
+ function runLeaveAnimations(lView, tNode, value, animationsDisabled) {
22278
+ const { promise, resolve } = promiseWithResolvers();
22238
22279
  const nativeElement = getNativeByTNode(tNode, lView);
22239
22280
  ngDevMode && assertElementNodes(nativeElement, 'animate.leave');
22240
- const elementRegistry = getAnimationElementRemovalRegistry();
22241
- ngDevMode &&
22242
- assertDefined(elementRegistry.elements, 'Expected `ElementRegistry` to be present in animations subsystem');
22243
22281
  const renderer = lView[RENDERER];
22244
- const animationsDisabled = areAnimationsDisabled(lView);
22245
22282
  const ngZone = lView[INJECTOR].get(NgZone);
22246
- const animate = (_el, value) => {
22247
- return (removeFn) => {
22248
- if (animationsDisabled) {
22249
- removeFn();
22250
- }
22251
- else {
22252
- const event = {
22253
- target: nativeElement,
22254
- animationComplete: () => {
22255
- clearLeavingNodes(tNode, _el);
22256
- removeFn();
22257
- },
22258
- };
22259
- trackLeavingNodes(tNode, _el);
22260
- ngZone.runOutsideAngular(() => {
22261
- renderer.listen(_el, 'animationend', () => removeFn(), { once: true });
22262
- });
22263
- value.call(lView[CONTEXT], event);
22264
- }
22265
- };
22266
- };
22267
- // Ensure cleanup if the LView is destroyed before the animation runs.
22268
- setupElementRegistryCleanup(elementRegistry, lView, tView, nativeElement);
22269
- elementRegistry.elements.addCallback(nativeElement, value, animate);
22270
- return ɵɵanimateLeaveListener; // For chaining
22271
- }
22272
- /**
22273
- * Builds the list of classes to apply to an element based on either the passed in list of strings
22274
- * or the set of resolver functions that are coming from bindings. Those resolver functions should
22275
- * resolve into either a string or a string array. There may be multiple to support composition.
22276
- */
22277
- function getClassList(value, resolvers) {
22278
- const classList = new Set(value);
22279
- if (resolvers && resolvers.length) {
22280
- for (const resolverFn of resolvers) {
22281
- const resolvedValue = getClassListFromValue(resolverFn);
22282
- if (resolvedValue) {
22283
- for (const rv of resolvedValue) {
22284
- classList.add(rv);
22285
- }
22286
- }
22287
- }
22288
- }
22289
- return classList;
22290
- }
22291
- function cancelAnimationsIfRunning(element, renderer) {
22292
- if (!areAnimationSupported)
22293
- return;
22294
- const elementData = enterClassMap.get(element);
22295
- if (elementData &&
22296
- elementData.classList.length > 0 &&
22297
- elementHasClassList(element, elementData.classList)) {
22298
- for (const klass of elementData.classList) {
22299
- renderer.removeClass(element, klass);
22300
- }
22301
- }
22302
- // We need to prevent any enter animation listeners from firing if they exist.
22303
- cleanupEnterClassData(element);
22304
- }
22305
- function elementHasClassList(element, classList) {
22306
- for (const className of classList) {
22307
- if (element.classList.contains(className))
22308
- return true;
22309
- }
22310
- return false;
22311
- }
22312
- function isLongestAnimation(event, nativeElement) {
22313
- const longestAnimation = longestAnimations.get(nativeElement);
22314
- return (nativeElement === event.target &&
22315
- longestAnimation !== undefined &&
22316
- ((longestAnimation.animationName !== undefined &&
22317
- event.animationName === longestAnimation.animationName) ||
22318
- (longestAnimation.propertyName !== undefined &&
22319
- event.propertyName === longestAnimation.propertyName)));
22320
- }
22321
- function animationEnd(event, nativeElement, renderer) {
22322
- const elementData = enterClassMap.get(nativeElement);
22323
- if (!elementData)
22324
- return;
22325
- if (isLongestAnimation(event, nativeElement)) {
22326
- // Now that we've found the longest animation, there's no need
22327
- // to keep bubbling up this event as it's not going to apply to
22328
- // other elements further up. We don't want it to inadvertently
22329
- // affect any other animations on the page.
22330
- event.stopImmediatePropagation();
22331
- for (const klass of elementData.classList) {
22332
- renderer.removeClass(nativeElement, klass);
22333
- }
22334
- cleanupEnterClassData(nativeElement);
22335
- }
22336
- }
22337
- function assertAnimationTypes(value, instruction) {
22338
- if (value == null || (typeof value !== 'string' && typeof value !== 'function')) {
22339
- throw new RuntimeError(650 /* RuntimeErrorCode.ANIMATE_INVALID_VALUE */, `'${instruction}' value must be a string of CSS classes or an animation function, got ${stringify(value)}`);
22283
+ allLeavingAnimations.add(lView);
22284
+ const activeClasses = getClassListFromValue(value);
22285
+ if (activeClasses && activeClasses.length > 0) {
22286
+ animateLeaveClassRunner(nativeElement, tNode, activeClasses, renderer, animationsDisabled, ngZone, resolve);
22340
22287
  }
22341
- }
22342
- function assertElementNodes(nativeElement, instruction) {
22343
- if (nativeElement.nodeType !== Node.ELEMENT_NODE) {
22344
- throw new RuntimeError(650 /* RuntimeErrorCode.ANIMATE_INVALID_VALUE */, `'${instruction}' can only be used on an element node, got ${stringify(nativeElement.nodeType)}`);
22288
+ else {
22289
+ resolve();
22345
22290
  }
22291
+ return promise;
22346
22292
  }
22347
22293
  /**
22348
22294
  * This function actually adds the classes that animate element that's leaving the DOM.
22349
22295
  * Once it finishes, it calls the remove function that was provided by the DOM renderer.
22350
22296
  */
22351
- function animateLeaveClassRunner(el, tNode, classList, finalRemoveFn, renderer, animationsDisabled, ngZone) {
22297
+ function animateLeaveClassRunner(el, tNode, classList, renderer, animationsDisabled, ngZone, resolver) {
22352
22298
  if (animationsDisabled) {
22353
22299
  longestAnimations.delete(el);
22354
- finalRemoveFn();
22300
+ resolver();
22355
22301
  return;
22356
22302
  }
22357
22303
  cancelAnimationsIfRunning(el, renderer);
@@ -22364,8 +22310,16 @@ function animateLeaveClassRunner(el, tNode, classList, finalRemoveFn, renderer,
22364
22310
  event.stopImmediatePropagation();
22365
22311
  longestAnimations.delete(el);
22366
22312
  clearLeavingNodes(tNode, el);
22367
- finalRemoveFn();
22313
+ if (Array.isArray(tNode.projection)) {
22314
+ // in the content projection case, the element is not destroyed.
22315
+ // So we need to remove the class at the end so that it isn't left
22316
+ // behind for whenever the item shows up again.
22317
+ for (const item of classList) {
22318
+ renderer.removeClass(el, item);
22319
+ }
22320
+ }
22368
22321
  }
22322
+ resolver();
22369
22323
  };
22370
22324
  ngZone.runOutsideAngular(() => {
22371
22325
  renderer.listen(el, 'animationend', handleOutAnimationEnd);
@@ -22383,11 +22337,75 @@ function animateLeaveClassRunner(el, tNode, classList, finalRemoveFn, renderer,
22383
22337
  determineLongestAnimation(el, longestAnimations, areAnimationSupported);
22384
22338
  if (!longestAnimations.has(el)) {
22385
22339
  clearLeavingNodes(tNode, el);
22386
- finalRemoveFn();
22340
+ resolver();
22387
22341
  }
22388
22342
  });
22389
22343
  });
22390
22344
  }
22345
+ /**
22346
+ * Instruction to handle the `(animate.leave)` behavior for event bindings, aka when
22347
+ * a user wants to use a custom animation function rather than a class. It registers
22348
+ * a leave animation function in the LView to be run at right before removal from the
22349
+ * DOM.
22350
+ *
22351
+ * @param value The value bound to `(animate.leave)`, an AnimationFunction.
22352
+ * @returns This function returns itself so that it may be chained.
22353
+ *
22354
+ * @codeGenApi
22355
+ */
22356
+ function ɵɵanimateLeaveListener(value) {
22357
+ performanceMarkFeature('NgAnimateLeave');
22358
+ if ((typeof ngServerMode !== 'undefined' && ngServerMode) || !areAnimationSupported) {
22359
+ return ɵɵanimateLeaveListener;
22360
+ }
22361
+ ngDevMode && assertAnimationTypes(value, 'animate.leave');
22362
+ // Even when animations are disabled, we still need to register the element for removal
22363
+ // to ensure proper cleanup and allow developers to handle element removal in tests
22364
+ // So we don't have an early return here.
22365
+ const lView = getLView();
22366
+ const tNode = getCurrentTNode();
22367
+ allLeavingAnimations.add(lView);
22368
+ getLViewLeaveAnimations(lView).push(() => runLeaveAnimationFunction(lView, tNode, value));
22369
+ return ɵɵanimateLeaveListener; // For chaining
22370
+ }
22371
+ /**
22372
+ * runs leave animations when a custom function is provided
22373
+ */
22374
+ function runLeaveAnimationFunction(lView, tNode, value) {
22375
+ const { promise, resolve } = promiseWithResolvers();
22376
+ const nativeElement = getNativeByTNode(tNode, lView);
22377
+ ngDevMode && assertElementNodes(nativeElement, 'animate.leave');
22378
+ const renderer = lView[RENDERER];
22379
+ const animationsDisabled = areAnimationsDisabled(lView);
22380
+ const ngZone = lView[INJECTOR].get(NgZone);
22381
+ const maxAnimationTimeout = lView[INJECTOR].get(MAX_ANIMATION_TIMEOUT);
22382
+ if (animationsDisabled) {
22383
+ resolve();
22384
+ }
22385
+ else {
22386
+ const timeoutId = setTimeout(() => {
22387
+ clearLeavingNodes(tNode, nativeElement);
22388
+ resolve();
22389
+ }, maxAnimationTimeout);
22390
+ const event = {
22391
+ target: nativeElement,
22392
+ animationComplete: () => {
22393
+ clearLeavingNodes(tNode, nativeElement);
22394
+ clearTimeout(timeoutId);
22395
+ resolve();
22396
+ },
22397
+ };
22398
+ trackLeavingNodes(tNode, nativeElement);
22399
+ ngZone.runOutsideAngular(() => {
22400
+ renderer.listen(nativeElement, 'animationend', () => {
22401
+ resolve();
22402
+ }, { once: true });
22403
+ });
22404
+ value.call(lView[CONTEXT], event);
22405
+ }
22406
+ // Ensure cleanup if the LView is destroyed before the animation runs.
22407
+ return promise;
22408
+ }
22391
22409
 
22392
22410
  /*!
22393
22411
  * @license
@@ -22438,7 +22456,11 @@ class LiveCollection {
22438
22456
  }
22439
22457
  }
22440
22458
  move(prevIndex, newIdx) {
22441
- this.attach(newIdx, this.detach(prevIndex));
22459
+ // For move operations, the detach code path is the same one used for removing
22460
+ // DOM nodes, which would trigger `animate.leave` bindings. We need to skip
22461
+ // those animations in the case of a move operation so the moving elements don't
22462
+ // unexpectedly disappear.
22463
+ this.attach(newIdx, this.detach(prevIndex, true /* skipLeaveAnimations */));
22442
22464
  }
22443
22465
  }
22444
22466
  function valuesMatching(liveIdx, liveValue, newIdx, newValue, trackBy) {
@@ -23010,8 +23032,10 @@ class LiveCollectionLContainerImpl extends LiveCollection {
23010
23032
  this.needsIndexUpdate ||= index !== this.length;
23011
23033
  addLViewToLContainer(this.lContainer, lView, index, shouldAddViewToDom(this.templateTNode, dehydratedView));
23012
23034
  }
23013
- detach(index) {
23035
+ detach(index, skipLeaveAnimations) {
23014
23036
  this.needsIndexUpdate ||= index !== this.length - 1;
23037
+ if (skipLeaveAnimations)
23038
+ setSkipLeaveAnimations(this.lContainer, index);
23015
23039
  return detachExistingView(this.lContainer, index);
23016
23040
  }
23017
23041
  create(index, value) {
@@ -23117,6 +23141,15 @@ function getLContainer(lView, index) {
23117
23141
  ngDevMode && assertLContainer(lContainer);
23118
23142
  return lContainer;
23119
23143
  }
23144
+ function setSkipLeaveAnimations(lContainer, index) {
23145
+ if (lContainer.length <= CONTAINER_HEADER_OFFSET)
23146
+ return;
23147
+ const indexInContainer = CONTAINER_HEADER_OFFSET + index;
23148
+ const viewToDetach = lContainer[indexInContainer];
23149
+ if (viewToDetach && viewToDetach[ANIMATIONS]) {
23150
+ viewToDetach[ANIMATIONS].skipLeaveAnimations = true;
23151
+ }
23152
+ }
23120
23153
  function detachExistingView(lContainer, index) {
23121
23154
  const existingLView = detachView(lContainer, index);
23122
23155
  ngDevMode && assertLView(existingLView);
@@ -23604,7 +23637,7 @@ function plural(val) {
23604
23637
  return 1;
23605
23638
  return 5;
23606
23639
  }
23607
- var localeEn = ["en", [["a", "p"], ["AM", "PM"], u], [["AM", "PM"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 0, [6, 0], ["M/d/yy", "MMM d, y", "MMMM d, y", "EEEE, MMMM d, y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "USD", "$", "US Dollar", {}, "ltr", plural];
23640
+ var localeEn = ["en", [["a", "p"], ["AM", "PM"]], [["AM", "PM"]], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 0, [6, 0], ["M/d/yy", "MMM d, y", "MMMM d, y", "EEEE, MMMM d, y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "USD", "$", "US Dollar", {}, "ltr", plural];
23608
23641
 
23609
23642
  /**
23610
23643
  * This const is used to store the locale data registered with `registerLocaleData`
@@ -23772,6 +23805,7 @@ const ICU_MARKER = {
23772
23805
  */
23773
23806
  var I18nCreateOpCode;
23774
23807
  (function (I18nCreateOpCode) {
23808
+ /* tslint:disable:no-duplicate-enum-values */
23775
23809
  /**
23776
23810
  * Number of bits to shift index so that it can be combined with the `APPEND_EAGERLY` and
23777
23811
  * `COMMENT`.
@@ -23785,6 +23819,7 @@ var I18nCreateOpCode;
23785
23819
  * If set the node should be comment (rather than a text) node.
23786
23820
  */
23787
23821
  I18nCreateOpCode[I18nCreateOpCode["COMMENT"] = 2] = "COMMENT";
23822
+ /* tslint:enable:no-duplicate-enum-values */
23788
23823
  })(I18nCreateOpCode || (I18nCreateOpCode = {}));
23789
23824
 
23790
23825
  /**
@@ -28310,18 +28345,6 @@ function ɵɵExternalStylesFeature(styleUrls) {
28310
28345
  };
28311
28346
  }
28312
28347
 
28313
- /**
28314
- * This feature adds the element registry for delayed element removal when animate.leave
28315
- * is utilized.
28316
- *
28317
- * @codeGenApi
28318
- */
28319
- function ɵɵAnimationsFeature() {
28320
- return () => {
28321
- setAnimationElementRemovalRegistry(new ElementRegistry());
28322
- };
28323
- }
28324
-
28325
28348
  /**
28326
28349
  * Generated next to NgModules to monkey-patch directive and pipe references onto a component's
28327
28350
  * definition, when generating a direct reference in the component file would otherwise create an
@@ -29280,7 +29303,6 @@ const angularCoreEnv = (() => ({
29280
29303
  'ɵɵCopyDefinitionFeature': ɵɵCopyDefinitionFeature,
29281
29304
  'ɵɵInheritDefinitionFeature': ɵɵInheritDefinitionFeature,
29282
29305
  'ɵɵExternalStylesFeature': ɵɵExternalStylesFeature,
29283
- 'ɵɵAnimationsFeature': ɵɵAnimationsFeature,
29284
29306
  'ɵɵnextContext': ɵɵnextContext,
29285
29307
  'ɵɵnamespaceHTML': __namespaceHTML,
29286
29308
  'ɵɵnamespaceMathML': __namespaceMathML,
@@ -31827,5 +31849,5 @@ function getDebugNode(nativeNode) {
31827
31849
  return null;
31828
31850
  }
31829
31851
 
31830
- export { AFTER_RENDER_PHASES, ANIMATIONS_DISABLED, ANIMATION_MODULE_TYPE, APP_BOOTSTRAP_LISTENER, APP_ID, APP_INITIALIZER, AcxChangeDetectionStrategy, AcxViewEncapsulation, AfterRenderImpl, AfterRenderManager, AfterRenderSequence, ApplicationInitStatus, ApplicationRef, Attribute, COMPILER_OPTIONS, CONTAINERS, CSP_NONCE, CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionSchedulerImpl, ChangeDetectionStrategy, Compiler, CompilerFactory, Component, ComponentFactory, ComponentFactory$1, ComponentFactoryResolver$1 as ComponentFactoryResolver, ComponentRef$1 as ComponentRef, ComponentRef as ComponentRef$1, Console, DEFAULT_CURRENCY_CODE, DEFAULT_LOCALE_ID, DEFER_BLOCK_CONFIG, DEFER_BLOCK_DEPENDENCY_INTERCEPTOR, DEFER_BLOCK_ID, DEFER_BLOCK_SSR_ID_ATTRIBUTE, DEFER_BLOCK_STATE$1 as DEFER_BLOCK_STATE, DEFER_BLOCK_STATE as DEFER_BLOCK_STATE$1, DEFER_HYDRATE_TRIGGERS, DEFER_PARENT_BLOCK_ID, DEHYDRATED_BLOCK_REGISTRY, DISCONNECTED_NODES, DebugElement, DebugEventListener, DebugNode, DeferBlockBehavior, DeferBlockState, DehydratedBlockRegistry, Directive, ELEMENT_CONTAINERS, EVENT_REPLAY_ENABLED_DEFAULT, ElementRef, ElementRegistry, EnvironmentNgModuleRefAdapter, EventEmitter, Framework, Host, HostBinding, HostListener, HydrationStatus, I18N_DATA, IMAGE_CONFIG, IMAGE_CONFIG_DEFAULTS, IS_ENABLED_BLOCKING_INITIAL_NAVIGATION, IS_EVENT_REPLAY_ENABLED, IS_HYDRATION_DOM_REUSE_ENABLED, IS_I18N_HYDRATION_ENABLED, IS_INCREMENTAL_HYDRATION_ENABLED, Inject, Injectable, Input, JSACTION_BLOCK_ELEMENT_MAP, JSACTION_EVENT_CONTRACT, LContext, LOCALE_ID, LocaleDataIndex, MAX_ANIMATION_TIMEOUT, MULTIPLIER, MissingTranslationStrategy, ModuleWithComponentFactories, NGH_ATTR_NAME, NGH_DATA_KEY, NGH_DEFER_BLOCKS_KEY, NODES, NOOP_AFTER_RENDER_REF, NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR, NO_CHANGE, NO_ERRORS_SCHEMA, NUM_ROOT_NODES, NgModule, NgModuleFactory, NgModuleFactory$1, NgModuleRef, NgModuleRef$1, NgProbeToken, NgZone, NoopNgZone, Optional, Output, PACKAGE_ROOT_URL, PLATFORM_ID, PLATFORM_INITIALIZER, PRESERVE_HOST_CONTENT, PROVIDED_NG_ZONE, Pipe, QueryList, ReflectionCapabilities, Renderer2, RendererFactory2, RendererStyleFlags2, SKIP_HYDRATION_ATTR_NAME, SSR_CONTENT_INTEGRITY_MARKER, Sanitizer, SecurityContext, Self, SimpleChange, SkipSelf, TEMPLATES, TEMPLATE_ID, TESTABILITY, TESTABILITY_GETTER, TRANSLATIONS, TRANSLATIONS_FORMAT, TemplateRef, Testability, TestabilityRegistry, TimerScheduler, TracingAction, TracingService, TransferState, Type, UseExhaustiveCheckNoChanges, ViewContainerRef, ViewEncapsulation, ViewRef, _sanitizeHtml, _sanitizeUrl, afterEveryRender, afterNextRender, allowSanitizationBypassAndThrow, angularCoreEnv, appendDeferBlocksToJSActionMap, asNativeElements, assertComponentDef, assertStandaloneComponentType, bypassSanitizationTrustHtml, bypassSanitizationTrustResourceUrl, bypassSanitizationTrustScript, bypassSanitizationTrustStyle, bypassSanitizationTrustUrl, calcPathForNode, checkNoChangesInternal, cleanupDehydratedViews, clearResolutionOfComponentResourcesQueue, collectNativeNodes, collectNativeNodesInLContainer, compileComponent, compileDirective, compileNgModule, compileNgModuleDefs, compilePipe, convertHydrateTriggersToJsAction, countBlocksSkippedByHydration, createEnvironmentInjector, createMultiResultQuerySignalFn, createNgModule, createNgModuleRef, createNgModuleRefWithProviders, createSingleResultOptionalQuerySignalFn, createSingleResultRequiredQuerySignalFn, depsTracker, devModeEqual, enableApplyRootElementTransformImpl, enableClaimDehydratedIcuCaseImpl, enableFindMatchingDehydratedViewImpl, enableLocateOrCreateContainerAnchorImpl, enableLocateOrCreateContainerRefImpl, enableLocateOrCreateElementContainerNodeImpl, enableLocateOrCreateElementNodeImpl, enableLocateOrCreateI18nNodeImpl, enableLocateOrCreateTextNodeImpl, enablePrepareI18nBlockForHydrationImpl, enableProfiling, enableRetrieveDeferBlockDataImpl, enableRetrieveHydrationInfoImpl, enableStashEventListenerImpl, findLocaleData, flushModuleScopingQueueAsMuchAsPossible, gatherDeferBlocksCommentNodes, generateStandaloneInDeclarationsError, getAsyncClassMetadataFn, getCompilerFacade, getDebugNode, getDeferBlocks$1 as getDeferBlocks, getDirectives, getDocument, getHostElement, getLContext, getLDeferBlockDetails, getLNodeForHydration, getLocaleCurrencyCode, getLocalePluralCase, getNgZone, getNgZoneOptions, getOrComputeI18nChildren, getRegisteredNgModuleType, getSanitizationBypassType, getTDeferBlockDetails, getTransferState, inferTagNameFromDefinition, inputBinding, internalProvideZoneChangeDetection, invokeListeners, isBoundToModule, isComponentDefPendingResolution, isComponentResourceResolutionQueueEmpty, isDeferBlock, isDetachedByI18n, isDisconnectedNode, isI18nHydrationEnabled, isI18nHydrationSupportEnabled, isInSkipHydrationBlock, isIncrementalHydrationEnabled, isJsObject, isLetDeclaration, isListLikeIterable, isNgModule, isPromise, isSubscribable, isTNodeShape, isViewDirty, iterateListLike, makePropDecorator, makeStateKey, markForRefresh, noSideEffects, optionsReducer, outputBinding, patchComponentDefWithScope, performanceMarkFeature, processAndInitTriggers, processBlockData, processTextNodeBeforeSerialization, profiler, provideAppInitializer, provideNgReflectAttributes, provideZoneChangeDetection, provideZonelessChangeDetection, publishDefaultGlobalUtils, publishExternalGlobalUtil, publishSignalConfiguration, readHydrationInfo, readPatchedLView, registerLocaleData, registerNgModuleType, remove, removeListeners, renderDeferBlockState, resetCompiledComponents, resetJitOptions, resolveComponentResources, restoreComponentResolutionQueue, setAllowDuplicateNgModuleIdsForTest, setClassMetadata, setClassMetadataAsync, setDocument, setIsI18nHydrationSupportEnabled, setJSActionAttributes, setJitOptions, setLocaleId, setStashFn, setTestabilityGetter, sharedMapFunction, sharedStashFunction, transitiveScopesFor, triggerHydrationFromBlockName, triggerResourceLoading, trySerializeI18nBlock, twoWayBinding, unregisterAllLocaleData, unsupportedProjectionOfDomNodes, unwrapSafeValue, validateMatchingNode, validateNodeExists, verifySsrContentsIntegrity, ɵgetUnknownElementStrictMode, ɵgetUnknownPropertyStrictMode, ɵsetClassDebugInfo, ɵsetUnknownElementStrictMode, ɵsetUnknownPropertyStrictMode, ɵɵAnimationsFeature, ɵɵCopyDefinitionFeature, ɵɵExternalStylesFeature, ɵɵHostDirectivesFeature, ɵɵInheritDefinitionFeature, ɵɵNgOnChangesFeature, ɵɵProvidersFeature, ɵɵadvance, ɵɵanimateEnter, ɵɵanimateEnterListener, ɵɵanimateLeave, ɵɵanimateLeaveListener, ɵɵariaProperty, ɵɵattachSourceLocations, ɵɵattribute, ɵɵclassMap, ɵɵclassProp, ɵɵcomponentInstance, ɵɵconditional, ɵɵconditionalBranchCreate, ɵɵconditionalCreate, ɵɵcontentQuery, ɵɵcontentQuerySignal, ɵɵdeclareLet, ɵɵdefer, ɵɵdeferEnableTimerScheduling, ɵɵdeferHydrateNever, ɵɵdeferHydrateOnHover, ɵɵdeferHydrateOnIdle, ɵɵdeferHydrateOnImmediate, ɵɵdeferHydrateOnInteraction, ɵɵdeferHydrateOnTimer, ɵɵdeferHydrateOnViewport, ɵɵdeferHydrateWhen, ɵɵdeferOnHover, ɵɵdeferOnIdle, ɵɵdeferOnImmediate, ɵɵdeferOnInteraction, ɵɵdeferOnTimer, ɵɵdeferOnViewport, ɵɵdeferPrefetchOnHover, ɵɵdeferPrefetchOnIdle, ɵɵdeferPrefetchOnImmediate, ɵɵdeferPrefetchOnInteraction, ɵɵdeferPrefetchOnTimer, ɵɵdeferPrefetchOnViewport, ɵɵdeferPrefetchWhen, ɵɵdeferWhen, ɵɵdefineComponent, ɵɵdefineDirective, ɵɵdefineNgModule, ɵɵdefinePipe, ɵɵdirectiveInject, ɵɵdomElement, ɵɵdomElementContainer, ɵɵdomElementContainerEnd, ɵɵdomElementContainerStart, ɵɵdomElementEnd, ɵɵdomElementStart, ɵɵdomListener, ɵɵdomProperty, ɵɵdomTemplate, ɵɵelement, ɵɵelementContainer, ɵɵelementContainerEnd, ɵɵelementContainerStart, ɵɵelementEnd, ɵɵelementStart, ɵɵgetComponentDepsFactory, ɵɵgetCurrentView, ɵɵgetInheritedFactory, ɵɵgetReplaceMetadataURL, ɵɵi18n, ɵɵi18nApply, ɵɵi18nAttributes, ɵɵi18nEnd, ɵɵi18nExp, ɵɵi18nPostprocess, ɵɵi18nStart, ɵɵinjectAttribute, ɵɵinterpolate, ɵɵinterpolate1, ɵɵinterpolate2, ɵɵinterpolate3, ɵɵinterpolate4, ɵɵinterpolate5, ɵɵinterpolate6, ɵɵinterpolate7, ɵɵinterpolate8, ɵɵinterpolateV, ɵɵinvalidFactory, ɵɵlistener, ɵɵloadQuery, ɵɵnextContext, ɵɵpipe, ɵɵpipeBind1, ɵɵpipeBind2, ɵɵpipeBind3, ɵɵpipeBind4, ɵɵpipeBindV, ɵɵprojection, ɵɵprojectionDef, ɵɵproperty, ɵɵpureFunction0, ɵɵpureFunction1, ɵɵpureFunction2, ɵɵpureFunction3, ɵɵpureFunction4, ɵɵpureFunction5, ɵɵpureFunction6, ɵɵpureFunction7, ɵɵpureFunction8, ɵɵpureFunctionV, ɵɵqueryAdvance, ɵɵqueryRefresh, ɵɵreadContextLet, ɵɵreference, ɵɵrepeater, ɵɵrepeaterCreate, ɵɵrepeaterTrackByIdentity, ɵɵrepeaterTrackByIndex, ɵɵreplaceMetadata, ɵɵresolveBody, ɵɵresolveDocument, ɵɵresolveWindow, ɵɵsanitizeHtml, ɵɵsanitizeResourceUrl, ɵɵsanitizeScript, ɵɵsanitizeStyle, ɵɵsanitizeUrl, ɵɵsanitizeUrlOrResourceUrl, ɵɵsetComponentScope, ɵɵsetNgModuleScope, ɵɵstoreLet, ɵɵstyleMap, ɵɵstyleProp, ɵɵsyntheticHostListener, ɵɵsyntheticHostProperty, ɵɵtemplate, ɵɵtemplateRefExtractor, ɵɵtext, ɵɵtextInterpolate, ɵɵtextInterpolate1, ɵɵtextInterpolate2, ɵɵtextInterpolate3, ɵɵtextInterpolate4, ɵɵtextInterpolate5, ɵɵtextInterpolate6, ɵɵtextInterpolate7, ɵɵtextInterpolate8, ɵɵtextInterpolateV, ɵɵtrustConstantHtml, ɵɵtrustConstantResourceUrl, ɵɵtwoWayBindingSet, ɵɵtwoWayListener, ɵɵtwoWayProperty, ɵɵvalidateIframeAttribute, ɵɵviewQuery, ɵɵviewQuerySignal };
31852
+ export { AFTER_RENDER_PHASES, ANIMATIONS_DISABLED, ANIMATION_MODULE_TYPE, APP_BOOTSTRAP_LISTENER, APP_ID, APP_INITIALIZER, AcxChangeDetectionStrategy, AcxViewEncapsulation, AfterRenderImpl, AfterRenderManager, AfterRenderSequence, ApplicationInitStatus, ApplicationRef, Attribute, COMPILER_OPTIONS, CONTAINERS, CSP_NONCE, CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionSchedulerImpl, ChangeDetectionStrategy, Compiler, CompilerFactory, Component, ComponentFactory, ComponentFactory$1, ComponentFactoryResolver$1 as ComponentFactoryResolver, ComponentRef$1 as ComponentRef, ComponentRef as ComponentRef$1, Console, DEFAULT_CURRENCY_CODE, DEFAULT_LOCALE_ID, DEFER_BLOCK_CONFIG, DEFER_BLOCK_DEPENDENCY_INTERCEPTOR, DEFER_BLOCK_ID, DEFER_BLOCK_SSR_ID_ATTRIBUTE, DEFER_BLOCK_STATE$1 as DEFER_BLOCK_STATE, DEFER_BLOCK_STATE as DEFER_BLOCK_STATE$1, DEFER_HYDRATE_TRIGGERS, DEFER_PARENT_BLOCK_ID, DEHYDRATED_BLOCK_REGISTRY, DISCONNECTED_NODES, DebugElement, DebugEventListener, DebugNode, DeferBlockBehavior, DeferBlockState, DehydratedBlockRegistry, Directive, ELEMENT_CONTAINERS, EVENT_REPLAY_ENABLED_DEFAULT, ElementRef, EnvironmentNgModuleRefAdapter, EventEmitter, Framework, Host, HostBinding, HostListener, HydrationStatus, I18N_DATA, IMAGE_CONFIG, IMAGE_CONFIG_DEFAULTS, IS_ENABLED_BLOCKING_INITIAL_NAVIGATION, IS_EVENT_REPLAY_ENABLED, IS_HYDRATION_DOM_REUSE_ENABLED, IS_I18N_HYDRATION_ENABLED, IS_INCREMENTAL_HYDRATION_ENABLED, Inject, Injectable, Input, JSACTION_BLOCK_ELEMENT_MAP, JSACTION_EVENT_CONTRACT, LContext, LOCALE_ID, LocaleDataIndex, MAX_ANIMATION_TIMEOUT, MULTIPLIER, MissingTranslationStrategy, ModuleWithComponentFactories, NGH_ATTR_NAME, NGH_DATA_KEY, NGH_DEFER_BLOCKS_KEY, NODES, NOOP_AFTER_RENDER_REF, NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR, NO_CHANGE, NO_ERRORS_SCHEMA, NUM_ROOT_NODES, NgModule, NgModuleFactory, NgModuleFactory$1, NgModuleRef, NgModuleRef$1, NgProbeToken, NgZone, NoopNgZone, Optional, Output, PACKAGE_ROOT_URL, PLATFORM_ID, PLATFORM_INITIALIZER, PRESERVE_HOST_CONTENT, PROVIDED_NG_ZONE, Pipe, QueryList, ReflectionCapabilities, Renderer2, RendererFactory2, RendererStyleFlags2, SKIP_HYDRATION_ATTR_NAME, SSR_CONTENT_INTEGRITY_MARKER, Sanitizer, SecurityContext, Self, SimpleChange, SkipSelf, TEMPLATES, TEMPLATE_ID, TESTABILITY, TESTABILITY_GETTER, TRANSLATIONS, TRANSLATIONS_FORMAT, TemplateRef, Testability, TestabilityRegistry, TimerScheduler, TracingAction, TracingService, TransferState, Type, UseExhaustiveCheckNoChanges, ViewContainerRef, ViewEncapsulation, ViewRef, _sanitizeHtml, _sanitizeUrl, afterEveryRender, afterNextRender, allLeavingAnimations, allowSanitizationBypassAndThrow, angularCoreEnv, appendDeferBlocksToJSActionMap, asNativeElements, assertComponentDef, assertStandaloneComponentType, bypassSanitizationTrustHtml, bypassSanitizationTrustResourceUrl, bypassSanitizationTrustScript, bypassSanitizationTrustStyle, bypassSanitizationTrustUrl, calcPathForNode, checkNoChangesInternal, cleanupDehydratedViews, clearResolutionOfComponentResourcesQueue, collectNativeNodes, collectNativeNodesInLContainer, compileComponent, compileDirective, compileNgModule, compileNgModuleDefs, compilePipe, convertHydrateTriggersToJsAction, countBlocksSkippedByHydration, createEnvironmentInjector, createMultiResultQuerySignalFn, createNgModule, createNgModuleRef, createNgModuleRefWithProviders, createSingleResultOptionalQuerySignalFn, createSingleResultRequiredQuerySignalFn, depsTracker, devModeEqual, enableApplyRootElementTransformImpl, enableClaimDehydratedIcuCaseImpl, enableFindMatchingDehydratedViewImpl, enableLocateOrCreateContainerAnchorImpl, enableLocateOrCreateContainerRefImpl, enableLocateOrCreateElementContainerNodeImpl, enableLocateOrCreateElementNodeImpl, enableLocateOrCreateI18nNodeImpl, enableLocateOrCreateTextNodeImpl, enablePrepareI18nBlockForHydrationImpl, enableProfiling, enableRetrieveDeferBlockDataImpl, enableRetrieveHydrationInfoImpl, enableStashEventListenerImpl, findLocaleData, flushModuleScopingQueueAsMuchAsPossible, gatherDeferBlocksCommentNodes, generateStandaloneInDeclarationsError, getAsyncClassMetadataFn, getCompilerFacade, getDebugNode, getDeferBlocks$1 as getDeferBlocks, getDirectives, getDocument, getHostElement, getLContext, getLDeferBlockDetails, getLNodeForHydration, getLocaleCurrencyCode, getLocalePluralCase, getNgZone, getNgZoneOptions, getOrComputeI18nChildren, getRegisteredNgModuleType, getSanitizationBypassType, getTDeferBlockDetails, getTransferState, inferTagNameFromDefinition, inputBinding, internalProvideZoneChangeDetection, invokeListeners, isBoundToModule, isComponentDefPendingResolution, isComponentResourceResolutionQueueEmpty, isDeferBlock, isDetachedByI18n, isDisconnectedNode, isI18nHydrationEnabled, isI18nHydrationSupportEnabled, isInSkipHydrationBlock, isIncrementalHydrationEnabled, isJsObject, isLetDeclaration, isListLikeIterable, isNgModule, isPromise, isSubscribable, isTNodeShape, isViewDirty, iterateListLike, makePropDecorator, makeStateKey, markForRefresh, noSideEffects, optionsReducer, outputBinding, patchComponentDefWithScope, performanceMarkFeature, processAndInitTriggers, processBlockData, processTextNodeBeforeSerialization, profiler, provideAppInitializer, provideNgReflectAttributes, provideZoneChangeDetection, provideZonelessChangeDetection, publishDefaultGlobalUtils, publishExternalGlobalUtil, publishSignalConfiguration, readHydrationInfo, readPatchedLView, registerLocaleData, registerNgModuleType, remove, removeListeners, renderDeferBlockState, resetCompiledComponents, resetJitOptions, resolveComponentResources, restoreComponentResolutionQueue, setAllowDuplicateNgModuleIdsForTest, setClassMetadata, setClassMetadataAsync, setDocument, setIsI18nHydrationSupportEnabled, setJSActionAttributes, setJitOptions, setLocaleId, setStashFn, setTestabilityGetter, sharedMapFunction, sharedStashFunction, transitiveScopesFor, triggerHydrationFromBlockName, triggerResourceLoading, trySerializeI18nBlock, twoWayBinding, unregisterAllLocaleData, unsupportedProjectionOfDomNodes, unwrapSafeValue, validateMatchingNode, validateNodeExists, verifySsrContentsIntegrity, ɵgetUnknownElementStrictMode, ɵgetUnknownPropertyStrictMode, ɵsetClassDebugInfo, ɵsetUnknownElementStrictMode, ɵsetUnknownPropertyStrictMode, ɵɵCopyDefinitionFeature, ɵɵExternalStylesFeature, ɵɵHostDirectivesFeature, ɵɵInheritDefinitionFeature, ɵɵNgOnChangesFeature, ɵɵProvidersFeature, ɵɵadvance, ɵɵanimateEnter, ɵɵanimateEnterListener, ɵɵanimateLeave, ɵɵanimateLeaveListener, ɵɵariaProperty, ɵɵattachSourceLocations, ɵɵattribute, ɵɵclassMap, ɵɵclassProp, ɵɵcomponentInstance, ɵɵconditional, ɵɵconditionalBranchCreate, ɵɵconditionalCreate, ɵɵcontentQuery, ɵɵcontentQuerySignal, ɵɵdeclareLet, ɵɵdefer, ɵɵdeferEnableTimerScheduling, ɵɵdeferHydrateNever, ɵɵdeferHydrateOnHover, ɵɵdeferHydrateOnIdle, ɵɵdeferHydrateOnImmediate, ɵɵdeferHydrateOnInteraction, ɵɵdeferHydrateOnTimer, ɵɵdeferHydrateOnViewport, ɵɵdeferHydrateWhen, ɵɵdeferOnHover, ɵɵdeferOnIdle, ɵɵdeferOnImmediate, ɵɵdeferOnInteraction, ɵɵdeferOnTimer, ɵɵdeferOnViewport, ɵɵdeferPrefetchOnHover, ɵɵdeferPrefetchOnIdle, ɵɵdeferPrefetchOnImmediate, ɵɵdeferPrefetchOnInteraction, ɵɵdeferPrefetchOnTimer, ɵɵdeferPrefetchOnViewport, ɵɵdeferPrefetchWhen, ɵɵdeferWhen, ɵɵdefineComponent, ɵɵdefineDirective, ɵɵdefineNgModule, ɵɵdefinePipe, ɵɵdirectiveInject, ɵɵdomElement, ɵɵdomElementContainer, ɵɵdomElementContainerEnd, ɵɵdomElementContainerStart, ɵɵdomElementEnd, ɵɵdomElementStart, ɵɵdomListener, ɵɵdomProperty, ɵɵdomTemplate, ɵɵelement, ɵɵelementContainer, ɵɵelementContainerEnd, ɵɵelementContainerStart, ɵɵelementEnd, ɵɵelementStart, ɵɵgetComponentDepsFactory, ɵɵgetCurrentView, ɵɵgetInheritedFactory, ɵɵgetReplaceMetadataURL, ɵɵi18n, ɵɵi18nApply, ɵɵi18nAttributes, ɵɵi18nEnd, ɵɵi18nExp, ɵɵi18nPostprocess, ɵɵi18nStart, ɵɵinjectAttribute, ɵɵinterpolate, ɵɵinterpolate1, ɵɵinterpolate2, ɵɵinterpolate3, ɵɵinterpolate4, ɵɵinterpolate5, ɵɵinterpolate6, ɵɵinterpolate7, ɵɵinterpolate8, ɵɵinterpolateV, ɵɵinvalidFactory, ɵɵlistener, ɵɵloadQuery, ɵɵnextContext, ɵɵpipe, ɵɵpipeBind1, ɵɵpipeBind2, ɵɵpipeBind3, ɵɵpipeBind4, ɵɵpipeBindV, ɵɵprojection, ɵɵprojectionDef, ɵɵproperty, ɵɵpureFunction0, ɵɵpureFunction1, ɵɵpureFunction2, ɵɵpureFunction3, ɵɵpureFunction4, ɵɵpureFunction5, ɵɵpureFunction6, ɵɵpureFunction7, ɵɵpureFunction8, ɵɵpureFunctionV, ɵɵqueryAdvance, ɵɵqueryRefresh, ɵɵreadContextLet, ɵɵreference, ɵɵrepeater, ɵɵrepeaterCreate, ɵɵrepeaterTrackByIdentity, ɵɵrepeaterTrackByIndex, ɵɵreplaceMetadata, ɵɵresolveBody, ɵɵresolveDocument, ɵɵresolveWindow, ɵɵsanitizeHtml, ɵɵsanitizeResourceUrl, ɵɵsanitizeScript, ɵɵsanitizeStyle, ɵɵsanitizeUrl, ɵɵsanitizeUrlOrResourceUrl, ɵɵsetComponentScope, ɵɵsetNgModuleScope, ɵɵstoreLet, ɵɵstyleMap, ɵɵstyleProp, ɵɵsyntheticHostListener, ɵɵsyntheticHostProperty, ɵɵtemplate, ɵɵtemplateRefExtractor, ɵɵtext, ɵɵtextInterpolate, ɵɵtextInterpolate1, ɵɵtextInterpolate2, ɵɵtextInterpolate3, ɵɵtextInterpolate4, ɵɵtextInterpolate5, ɵɵtextInterpolate6, ɵɵtextInterpolate7, ɵɵtextInterpolate8, ɵɵtextInterpolateV, ɵɵtrustConstantHtml, ɵɵtrustConstantResourceUrl, ɵɵtwoWayBindingSet, ɵɵtwoWayListener, ɵɵtwoWayProperty, ɵɵvalidateIframeAttribute, ɵɵviewQuery, ɵɵviewQuerySignal };
31831
31853
  //# sourceMappingURL=debug_node.mjs.map