@solid-primitives/transition-group
Version:
Reactive primitives for implementing transition effects in SolidJS
119 lines (118 loc) • 5.41 kB
TypeScript
import { type Accessor } from "solid-js";
export type TransitionMode = "out-in" | "in-out" | "parallel";
export type OnTransition<T> = (el: T, done: () => void) => void;
export type SwitchTransitionOptions<T> = {
/**
* a function to be called when a new element is entering. {@link OnTransition}
*
* It receives the element and a callback to be called when the transition is done.
*/
onEnter?: OnTransition<T>;
/**
* a function to be called when an exiting element is leaving. {@link OnTransition}
*
* It receives the element and a callback to be called when the transition is done.
* The element is kept in the DOM until the done() callback is called.
*/
onExit?: OnTransition<T>;
/**
* transition mode. {@link TransitionMode}
*
* Defaults to `"parallel"`. Other options are `"out-in"` and `"in-out"`.
*/
mode?: TransitionMode;
/** whether to run the transition on the initial elements. Defaults to `false` */
appear?: boolean;
};
/**
* Create an element transition interface for switching between single elements.
* It can be used to implement own transition effect, or a custom `<Transition>`-like component.
*
* It will observe {@link source} and return a signal with array of elements to be rendered (current one and exiting ones).
*
* @param source a signal with the current element. Any nullish value will mean there is no element.
* Any object can used as the source, but most likely you will want to use a `HTMLElement` or `SVGElement`.
* @param options transition options {@link SwitchTransitionOptions}
* @returns a signal with an array of the current element and exiting previous elements.
*
* @see https://github.com/solidjs-community/solid-primitives/tree/main/packages/transition-group#createSwitchTransition
*
* @example
* const [el, setEl] = createSignal<HTMLDivElement>();
*
* const rendered = createSwitchTransition(el, {
* onEnter(el, done) {
* // the enter callback is called before the element is inserted into the DOM
* // so run the animation in the next animation frame / microtask
* queueMicrotask(() => { ... })
* },
* onExit(el, done) {
* // the exitting element is kept in the DOM until the done() callback is called
* },
* })
*
* // change the source to trigger the transition
* setEl(refToHtmlElement);
*/
export declare function createSwitchTransition<T>(source: Accessor<T>, options: SwitchTransitionOptions<NonNullable<T>>): Accessor<NonNullable<T>[]>;
export type OnListChange<T> = (payload: {
/** full list of elements to be rendered */
list: T[];
/** list of elements that were added since the last change */
added: T[];
/** list of elements that were removed since the last change */
removed: T[];
/** list of elements that were already added before, and are not currently exiting */
unchanged: T[];
/** Callback for finishing the transition of exiting elements - removes them from rendered array */
finishRemoved: (els: T[]) => void;
}) => void;
export type ExitMethod = "remove" | "move-to-end" | "keep-index";
export type ListTransitionOptions<T> = {
/**
* A function to be called when the list changes. {@link OnListChange}
*
* It receives the list of current, added, removed, and unchanged elements.
* It also receives a callback to be called when the removed elements are finished animating (they can be removed from the DOM).
*/
onChange: OnListChange<T>;
/** whether to run the transition on the initial elements. Defaults to `false` */
appear?: boolean;
/**
* This controls how the elements exit. {@link ExitMethod}
* - `"remove"` removes the element immediately.
* - `"move-to-end"` (default) will move elements which have exited to the end of the array.
* - `"keep-index"` will splice them in at their previous index.
*/
exitMethod?: ExitMethod;
};
/**
* Create an element list transition interface for changes to the list of elements.
* It can be used to implement own transition effect, or a custom `<TransitionGroup>`-like component.
*
* It will observe {@link source} and return a signal with array of elements to be rendered (current ones and exiting ones).
*
* @param source a signal with the current list of elements.
* Any object can used as the element, but most likely you will want to use a `HTMLElement` or `SVGElement`.
* @param options transition options {@link ListTransitionOptions}
*
* @see https://github.com/solidjs-community/solid-primitives/tree/main/packages/transition-group#createListTransition
*
* @example
* const [els, setEls] = createSignal<HTMLElement[]>([]);
*
* const rendered = createListTransition(els, {
* onChange({ list, added, removed, unchanged, finishRemoved }) {
* // the callback is called before the added elements are inserted into the DOM
* // so run the animation in the next animation frame / microtask
* queueMicrotask(() => { ... })
*
* // the removed elements are kept in the DOM until the finishRemoved() callback is called
* finishRemoved(removed);
* }
* })
*
* // change the source to trigger the transition
* setEls([...refsToHTMLElements]);
*/
export declare function createListTransition<T extends object>(source: Accessor<readonly T[]>, options: ListTransitionOptions<T>): Accessor<T[]>;