Files
helix-engage/src/components/application/modals/modal.tsx

40 lines
1.8 KiB
TypeScript

import type { DialogProps as AriaDialogProps, ModalOverlayProps as AriaModalOverlayProps } from "react-aria-components";
import { Dialog as AriaDialog, DialogTrigger as AriaDialogTrigger, Modal as AriaModal, ModalOverlay as AriaModalOverlay } from "react-aria-components";
import { cx } from "@/utils/cx";
export const DialogTrigger = AriaDialogTrigger;
export const ModalOverlay = (props: AriaModalOverlayProps) => {
return (
<AriaModalOverlay
{...props}
className={(state) =>
cx(
"fixed inset-0 z-50 flex min-h-dvh w-full items-end justify-center overflow-y-auto bg-overlay/70 px-4 pt-4 pb-[clamp(16px,8vh,64px)] outline-hidden backdrop-blur-[6px] sm:items-center sm:justify-center sm:p-8",
state.isEntering && "duration-300 ease-out animate-in fade-in",
state.isExiting && "duration-200 ease-in animate-out fade-out",
typeof props.className === "function" ? props.className(state) : props.className,
)
}
/>
);
};
export const Modal = (props: AriaModalOverlayProps) => (
<AriaModal
{...props}
className={(state) =>
cx(
"max-h-full w-full align-middle outline-hidden max-sm:overflow-y-auto max-sm:rounded-xl",
state.isEntering && "duration-300 ease-out animate-in zoom-in-95",
state.isExiting && "duration-200 ease-in animate-out zoom-out-95",
typeof props.className === "function" ? props.className(state) : props.className,
)
}
/>
);
export const Dialog = (props: AriaDialogProps) => (
<AriaDialog {...props} className={cx("flex w-full items-center justify-center outline-hidden", props.className)} />
);