11'use client' ;
22
3- import { type CSSProperties , type RefObject , useEffect , useMemo } from 'react' ;
3+ import { type CSSProperties , type RefObject , useEffect , useMemo , useState } from 'react' ;
44
55import { useAnimationsFinished } from './use-animations-finished' ;
66import { type TransitionStatus , useTransitionStatus } from './use-transition-status' ;
77
88export interface UseTransitionOptions {
99 open : boolean ;
1010 ref : RefObject < HTMLElement | null > ;
11+ animateOnMount ?: boolean ;
1112}
1213
1314export interface TransitionProps {
@@ -38,8 +39,12 @@ export interface UseTransitionReturn {
3839 * transitions (via `[data-starting-style]` / `[data-ending-style]`) and
3940 * CSS keyframe animations (via `[data-open]` / `[data-closed]`).
4041 */
41- export function useTransition ( { open, ref } : UseTransitionOptions ) : UseTransitionReturn {
42+ export function useTransition ( { open, ref, animateOnMount = true } : UseTransitionOptions ) : UseTransitionReturn {
4243 const { mounted, transitionStatus, setMounted } = useTransitionStatus ( open ) ;
44+ const [ skipEnter , setSkipEnter ] = useState ( open && ! animateOnMount ) ;
45+ if ( skipEnter && transitionStatus !== 'starting' ) {
46+ setSkipEnter ( false ) ;
47+ }
4348 const runOnAnimationsFinished = useAnimationsFinished ( ref , open ) ;
4449
4550 useEffect ( ( ) => {
@@ -62,13 +67,15 @@ export function useTransition({ open, ref }: UseTransitionOptions): UseTransitio
6267 props [ 'data-closed' ] = '' ;
6368 }
6469 if ( transitionStatus === 'starting' ) {
65- props [ 'data-starting-style' ] = '' ;
70+ if ( ! skipEnter ) {
71+ props [ 'data-starting-style' ] = '' ;
72+ }
6673 props . style = { transition : 'none' } ;
6774 } else if ( transitionStatus === 'ending' ) {
6875 props [ 'data-ending-style' ] = '' ;
6976 }
7077 return props ;
71- } , [ open , mounted , transitionStatus ] ) ;
78+ } , [ open , mounted , transitionStatus , skipEnter ] ) ;
7279
7380 return { mounted, transitionStatus, transitionProps } ;
7481}
0 commit comments