import type { Directive, PropsConfig, SSRHTMLElement, Widget } from '../../types'; /** * Function that implements a transition. */ export type TransitionFn = ( /** * Element on which the transition should be applied. */ element: SSRHTMLElement, /** * Whether the element should be shown or hidden. */ direction: 'show' | 'hide', /** * Whether the transition should be animated. */ animated: boolean, /** * Signal allowing to stop the transition while running. */ signal: AbortSignal, /** * Context of the current transition. It is reused between calls if the previous transition was stopped while running on the same element. */ context: object) => Promise | void; /** * Properties for configuring a transition. */ export interface TransitionProps { /** * Transition to be called. */ transition: TransitionFn; /** * Whether the element should be visible when the transition is completed. */ visible: boolean; /** * Whether the transition should be animated. */ animated: boolean; /** * If the element is initially visible, whether the element should be animated when first displayed. */ animatedOnInit: boolean; /** * Whether initialization is finished. It determines which setting between {@link TransitionProps.animated} * and {@link TransitionProps.animatedOnInit} is used to enable or disable animations. * @remarks * If it is `true`, initialization is considered finished, and {@link TransitionProps.animatedOnInit} is no longer used. * Otherwise, initialization is considered unfinished and {@link TransitionProps.animatedOnInit} is used instead of {@link TransitionProps.animated}. * If it is `null`, it will be set to `true` automatically when the directive is called with a DOM element. * If it is `false`, it will not be updated automatically. */ initDone: boolean | null; /** * Function to be called when the transition is completed and the element is visible. */ onShown: () => void; /** * Function to be called when the transition is completed and the element is not visible. */ onHidden: () => void; /** * Function to be called when the visible property changes. * * @param visible - new value of the visible property */ onVisibleChange: (visible: boolean) => void; } /** * Transition state. */ export interface TransitionState { /** * Whether the element is visible or will be visible when the transition is completed. */ visible: boolean; /** * Whether the element to be animated is present in the DOM. */ elementPresent: boolean; /** * Reference to the DOM element. */ element: HTMLElement | null; /** * Whether a transition is currently running. */ transitioning: boolean; /** * Equals: {@link TransitionState.visible | visible} && ! {@link TransitionState.transitioning | transitioning} */ shown: boolean; /** * Equals: ! {@link TransitionState.visible | visible} && ! {@link TransitionState.transitioning | transitioning} */ hidden: boolean; } /** * Interface representing the API for managing transitions of an element. */ export interface TransitionApi { /** * Runs the transition to show the element. It is equivalent to {@link TransitionApi.toggle | toggle} with true as the first parameter. * * @param animated - whether the transition should be animated. If the parameter is not defined, the {@link TransitionProps.animated | animated } property is used. * * @returns A promise that is fulfilled when the transition is completed. If the transition is canceled, or if the same transition was * already running, the promise never completes. */ show: (animated?: boolean) => Promise; /** * Runs the transition to hide the element. It is equivalent to {@link TransitionApi.toggle | toggle} with false as the first parameter. * * @param animated - whether the transition should be animated. If the parameter is not defined, the {@link TransitionProps.animated | animated } property is used. * * @returns A promise that is fulfilled when the transition is completed. If the transition is canceled, or if the same transition was * already running, the promise never completes. */ hide: (animated?: boolean) => Promise; /** * Runs the transition to show or hide the element depending on the first parameter. * * @param visible - whether the element should be made visible or not. If the parameter is not defined, the opposite of the current {@link TransitionProps.visible | visible } property is used. * @param animated - whether the transition should be animated. If the parameter is not defined, the {@link TransitionProps.animated | animated } property is used. * * @returns A promise that is fulfilled when the transition is completed. If the transition is canceled, or if the same transition was * already running, the promise never completes. */ toggle: (visible?: boolean, animated?: boolean) => Promise; } /** * Interface representing transition directives. */ export interface TransitionDirectives { /** * the transition directive */ directive: Directive; } /** * Represents a widget that handles transitions. * * @template TransitionProps - The properties required for the transition. * @template TransitionState - The state management for the transition. * @template TransitionApi - The API interface for the transition. * @template TransitionDirectives - The directives used in the transition. */ export type TransitionWidget = Widget; /** * A transition to show / hide an element without any animated. It uses the HTML `display` attribute. * * @param element - the element to animate * @param direction - the direction */ export declare const noAnimation: TransitionFn; /** * Create a transition widget. * * The widget will include a patch function, stores to track the animation states and a directive to apply the animation to an element. * * @param config - the props config of the transition * @returns the transition widget */ export declare const createTransition: (config?: PropsConfig) => TransitionWidget;