/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
import {
  animate,
  state,
  style,
  transition,
  trigger,
  AnimationTriggerMetadata,
  group,
  query,
  animateChild,
} from '@angular/animations';

export const DEFAULT_HORIZONTAL_ANIMATION_DURATION = '500ms';
export const DEFAULT_VERTICAL_ANIMATION_DURATION = '225ms';

/**
 * Animations used by the Material steppers.
 * @docs-private
 */
export const matStepperAnimations: {
  readonly horizontalStepTransition: AnimationTriggerMetadata;
  readonly verticalStepTransition: AnimationTriggerMetadata;
} = {
  /** Animation that transitions the step along the X axis in a horizontal stepper. */
  horizontalStepTransition: trigger('horizontalStepTransition', [
    state('previous', style({transform: 'translate3d(-100%, 0, 0)', visibility: 'hidden'})),
    // Transition to `inherit`, rather than `visible`,
    // because visibility on a child element the one from the parent,
    // making this element focusable inside of a `hidden` element.
    state('current', style({transform: 'none', visibility: 'inherit'})),
    state('next', style({transform: 'translate3d(100%, 0, 0)', visibility: 'hidden'})),
    transition(
      '* => *',
      group([
        animate('{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)'),
        query('@*', animateChild(), {optional: true}),
      ]),
      {
        params: {'animationDuration': DEFAULT_HORIZONTAL_ANIMATION_DURATION},
      },
    ),
  ]),

  /** Animation that transitions the step along the Y axis in a vertical stepper. */
  verticalStepTransition: trigger('verticalStepTransition', [
    state('previous', style({height: '0px', visibility: 'hidden'})),
    state('next', style({height: '0px', visibility: 'hidden'})),
    // Transition to `inherit`, rather than `visible`,
    // because visibility on a child element the one from the parent,
    // making this element focusable inside of a `hidden` element.
    state('current', style({height: '*', visibility: 'inherit'})),
    transition(
      '* <=> current',
      group([
        animate('{{animationDuration}} cubic-bezier(0.4, 0.0, 0.2, 1)'),
        query('@*', animateChild(), {optional: true}),
      ]),
      {
        params: {'animationDuration': DEFAULT_VERTICAL_ANIMATION_DURATION},
      },
    ),
  ]),
};
