/**
 * @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 {
  AnimationTriggerMetadata,
  animate,
  state,
  style,
  transition,
  trigger,
} from '@angular/animations';

/**
 * Animations used by the Material tabs.
 * @docs-private
 */
export const matTabsAnimations: {
  readonly translateTab: AnimationTriggerMetadata;
} = {
  /** Animation translates a tab along the X axis. */
  translateTab: trigger('translateTab', [
    // Transitions to `none` instead of 0, because some browsers might blur the content.
    state(
      'center, void, left-origin-center, right-origin-center',
      style({transform: 'none', visibility: 'visible'}),
    ),

    // If the tab is either on the left or right, we additionally add a `min-height` of 1px
    // in order to ensure that the element has a height before its state changes. This is
    // necessary because Chrome does seem to skip the transition in RTL mode if the element does
    // not have a static height and is not rendered. See related issue: #9465
    state(
      'left',
      style({
        transform: 'translate3d(-100%, 0, 0)',
        minHeight: '1px',

        // Normally this is redundant since we detach the content from the DOM, but if the user
        // opted into keeping the content in the DOM, we have to hide it so it isn't focusable.
        visibility: 'hidden',
      }),
    ),
    state(
      'right',
      style({
        transform: 'translate3d(100%, 0, 0)',
        minHeight: '1px',
        visibility: 'hidden',
      }),
    ),

    transition(
      '* => left, * => right, left => center, right => center',
      animate('{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)'),
    ),
    transition('void => left-origin-center', [
      style({transform: 'translate3d(-100%, 0, 0)', visibility: 'hidden'}),
      animate('{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)'),
    ]),
    transition('void => right-origin-center', [
      style({transform: 'translate3d(100%, 0, 0)', visibility: 'hidden'}),
      animate('{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)'),
    ]),
  ]),
};
