1
0
Fork 0
mirror of https://github.com/sussy-code/smov.git synced 2024-12-23 15:07:43 +01:00
smov/src/components/Transition.tsx

86 lines
2.1 KiB
TypeScript
Raw Normal View History

2023-02-07 20:03:01 +01:00
import { Fragment, ReactNode } from "react";
2023-02-07 18:19:31 +01:00
import {
Transition as HeadlessTransition,
TransitionClasses,
} from "@headlessui/react";
2023-02-04 01:01:54 +01:00
type TransitionAnimations = "slide-down" | "slide-up" | "fade" | "none";
2023-02-04 01:01:54 +01:00
interface Props {
show?: boolean;
durationClass?: string;
2023-02-04 01:01:54 +01:00
animation: TransitionAnimations;
className?: string;
children?: ReactNode;
appearOnMount?: boolean;
isChild?: boolean;
2023-02-04 01:01:54 +01:00
}
function getClasses(
animation: TransitionAnimations,
duration: string
2023-02-07 18:19:31 +01:00
): TransitionClasses {
2023-02-04 01:01:54 +01:00
if (animation === "slide-down") {
return {
2023-02-07 20:03:01 +01:00
leave: `transition-[transform,opacity] ${duration}`,
2023-02-07 18:19:31 +01:00
leaveFrom: "opacity-100 translate-y-0",
leaveTo: "-translate-y-4 opacity-0",
2023-02-07 20:03:01 +01:00
enter: `transition-[transform,opacity] ${duration}`,
2023-02-07 18:19:31 +01:00
enterFrom: "opacity-0 -translate-y-4",
enterTo: "translate-y-0 opacity-100",
2023-02-04 01:01:54 +01:00
};
}
if (animation === "slide-up") {
return {
2023-02-07 20:03:01 +01:00
leave: `transition-[transform,opacity] ${duration}`,
2023-02-07 18:19:31 +01:00
leaveFrom: "opacity-100 translate-y-0",
leaveTo: "translate-y-4 opacity-0",
2023-02-07 20:03:01 +01:00
enter: `transition-[transform,opacity] ${duration}`,
2023-02-07 18:19:31 +01:00
enterFrom: "opacity-0 translate-y-4",
enterTo: "translate-y-0 opacity-100",
2023-02-04 01:01:54 +01:00
};
}
if (animation === "fade") {
return {
2023-02-07 20:03:01 +01:00
leave: `transition-[transform,opacity] ${duration}`,
2023-02-07 18:19:31 +01:00
leaveFrom: "opacity-100",
leaveTo: "opacity-0",
2023-02-07 20:03:01 +01:00
enter: `transition-[transform,opacity] ${duration}`,
2023-02-07 18:19:31 +01:00
enterFrom: "opacity-0",
enterTo: "opacity-100",
};
}
2023-02-04 01:01:54 +01:00
return {};
}
export function Transition(props: Props) {
const duration = props.durationClass ?? "duration-200";
2023-02-07 20:03:01 +01:00
const classes = getClasses(props.animation, duration);
2023-02-04 01:01:54 +01:00
if (props.isChild) {
return (
<HeadlessTransition.Child
as={Fragment}
appear={props.appearOnMount}
{...classes}
>
<div className={props.className}>{props.children}</div>
</HeadlessTransition.Child>
);
}
2023-02-04 01:01:54 +01:00
return (
<HeadlessTransition
show={props.show}
as={Fragment}
appear={props.appearOnMount}
{...classes}
>
2023-02-07 20:03:01 +01:00
<div className={props.className}>{props.children}</div>
</HeadlessTransition>
2023-02-04 01:01:54 +01:00
);
}