import clsx from 'clsx'; import { Fragment } from 'react'; import { Dialog, Transition } from '@headlessui/react'; import { XMarkIcon } from '@heroicons/react/24/outline'; export type SlideOutSize = 'lg' | 'md' | 'sm' | 'xl'; export type SlideOutEnterFrom = 'end' | 'start'; type Props = Readonly<{ children: React.ReactNode; className?: string; enterFrom?: SlideOutEnterFrom; isShown?: boolean; onClose?: () => void; size: SlideOutSize; title?: string; }>; const sizeClasses: Record = { lg: 'max-w-lg', md: 'max-w-md', sm: 'max-w-sm', xl: 'max-w-xl', }; const enterFromClasses: Record< SlideOutEnterFrom, Readonly<{ hidden: string; position: string; shown: string }> > = { end: { hidden: 'translate-x-full', position: 'ml-auto', shown: 'translate-x-0', }, start: { hidden: '-translate-x-full', position: 'mr-auto', shown: 'translate-x-0', }, }; export default function SlideOut({ children, className, enterFrom = 'end', isShown = false, size, title, onClose, }: Props) { const enterFromClass = enterFromClasses[enterFrom]; return ( onClose?.()}>

{title}

{children}
); }