UNPKG

@yamada-ui/transitions

Version:

Yamada UI transitions components

143 lines (141 loc) 3.62 kB
"use client" // src/collapse.tsx import { omitThemeProps, useComponentStyle } from "@yamada-ui/core"; import { AnimatePresence, motion, MOTION_TRANSITION_EASINGS, motionForwardRef, transitionEnter, transitionExit } from "@yamada-ui/motion"; import { createdDom, cx } from "@yamada-ui/utils"; import { useEffect, useMemo, useState } from "react"; import { jsx } from "react/jsx-runtime"; var isNumeric = (value) => value != null && parseFloat(value.toString()) > 0; var variants = { enter: ({ animationOpacity, delay, duration, endingHeight: height, enter, transition, transitionEnd } = {}) => ({ ...animationOpacity ? { opacity: 1 } : {}, height, transition: transitionEnter(transition == null ? void 0 : transition.enter)(delay, duration), transitionEnd: transitionEnd == null ? void 0 : transitionEnd.enter, ...enter }), exit: ({ animationOpacity, delay, duration, exit, startingHeight: height, transition, transitionEnd } = {}) => ({ ...animationOpacity ? { opacity: isNumeric(height) ? 1 : 0 } : {}, height, transition: transitionExit(transition == null ? void 0 : transition.exit)(delay, duration), transitionEnd: transitionEnd == null ? void 0 : transitionEnd.exit, ...exit }) }; var collapseProps = { animate: "enter", exit: "exit", initial: "exit", variants }; var Collapse = motionForwardRef((props, ref) => { const [style, mergedProps] = useComponentStyle("Collapse", props); const { className, animationOpacity, delay, duration, endingHeight, isOpen, open = isOpen, startingHeight, transition: transitionProp, transitionEnd, unmountOnExit, __css, ...rest } = omitThemeProps(mergedProps); const [mounted, setMounted] = useState(false); const animate = open || unmountOnExit ? "enter" : "exit"; const resolvedOpen = unmountOnExit ? open : true; const transition = useMemo(() => { if (!mounted) { return { enter: { duration: 0 } }; } else if (transitionProp) { return transitionProp; } else { return { enter: { height: { duration: duration != null ? duration : 0.3, ease: MOTION_TRANSITION_EASINGS.ease }, opacity: { duration: duration != null ? duration : 0.4, ease: MOTION_TRANSITION_EASINGS.ease } }, exit: { height: { duration: duration != null ? duration : 0.3, ease: MOTION_TRANSITION_EASINGS.ease }, opacity: { duration: duration != null ? duration : 0.4, ease: MOTION_TRANSITION_EASINGS.ease } } }; } }, [mounted, duration, transitionProp]); const custom = { animationOpacity, delay, duration, endingHeight, startingHeight, transition, transitionEnd }; const css = { ...style, ...__css }; useEffect(() => { if (createdDom()) setMounted(true); }, []); return /* @__PURE__ */ jsx(AnimatePresence, { custom, initial: false, children: resolvedOpen ? /* @__PURE__ */ jsx( motion.div, { ref, className: cx("ui-collapse", className), ...rest, ...collapseProps, style: { overflow: "hidden", ...rest.style }, animate, custom, initial: unmountOnExit ? "exit" : false, __css: css } ) : null }); }); Collapse.displayName = "Collapse"; Collapse.__ui__ = "Collapse"; export { collapseProps, Collapse }; //# sourceMappingURL=chunk-PVIILLZA.mjs.map