import { type ComponentPropsWithRef, type ReactNode, type RefAttributes } from "react"; import type { DialogProps as AriaDialogProps, ModalOverlayProps as AriaModalOverlayProps, ModalRenderProps as AriaModalRenderProps, } from "react-aria-components"; import { Dialog as AriaDialog, DialogTrigger as AriaDialogTrigger, Modal as AriaModal, ModalOverlay as AriaModalOverlay } from "react-aria-components"; import { CloseButton } from "@/components/base/buttons/close-button"; import { cx } from "@/utils/cx"; interface ModalOverlayProps extends AriaModalOverlayProps, RefAttributes {} export const ModalOverlay = (props: ModalOverlayProps) => { return ( cx( "fixed inset-0 z-50 flex min-h-dvh w-full items-center justify-end bg-overlay/70 pl-6 outline-hidden ease-linear md:pl-10", state.isEntering && "duration-300 animate-in fade-in", state.isExiting && "duration-500 animate-out fade-out", typeof props.className === "function" ? props.className(state) : props.className, ) } /> ); }; ModalOverlay.displayName = "ModalOverlay"; interface ModalProps extends AriaModalOverlayProps, RefAttributes {} export const Modal = (props: ModalProps) => ( cx( "inset-y-0 right-0 h-full w-full max-w-100 shadow-xl transition", state.isEntering && "duration-300 animate-in slide-in-from-right", state.isExiting && "duration-500 animate-out slide-out-to-right", typeof props.className === "function" ? props.className(state) : props.className, ) } /> ); Modal.displayName = "Modal"; interface DialogProps extends AriaDialogProps, RefAttributes {} export const Dialog = (props: DialogProps) => ( ); Dialog.displayName = "Dialog"; interface SlideoutMenuProps extends Omit, RefAttributes { children: ReactNode | ((children: AriaModalRenderProps & { close: () => void }) => ReactNode); dialogClassName?: string; } const Menu = ({ children, dialogClassName, ...props }: SlideoutMenuProps) => { return ( cx(typeof props.className === "function" ? props.className(state) : props.className)}> {(state) => ( {({ close }) => { return typeof children === "function" ? children({ ...state, close }) : children; }} )} ); }; Menu.displayName = "SlideoutMenu"; const Content = ({ role = "main", ...props }: ComponentPropsWithRef<"div">) => { return
; }; Content.displayName = "SlideoutContent"; interface SlideoutHeaderProps extends ComponentPropsWithRef<"header"> { onClose?: () => void; } const Header = ({ className, children, onClose, ...props }: SlideoutHeaderProps) => { return (
{children}
); }; Header.displayName = "SlideoutHeader"; const Footer = (props: ComponentPropsWithRef<"footer">) => { return