@yamada-ui/transitions
Version:
Yamada UI transitions components
143 lines (141 loc) • 3.62 kB
JavaScript
"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