| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 | import { Fragment, useCallback } from 'react'import type { ElementType, ReactNode } from 'react'import { Dialog, DialogPanel, DialogTitle, Transition, TransitionChild } from '@headlessui/react'import classNames from '@/utils/classnames'// https://headlessui.com/react/dialogtype DialogProps = {  className?: string  titleClassName?: string  bodyClassName?: string  footerClassName?: string  titleAs?: ElementType  title?: ReactNode  children: ReactNode  footer?: ReactNode  show: boolean  onClose?: () => void}const CustomDialog = ({  className,  titleClassName,  bodyClassName,  footerClassName,  titleAs,  title,  children,  footer,  show,  onClose,}: DialogProps) => {  const close = useCallback(() => onClose?.(), [onClose])  return (    <Transition appear show={show} as={Fragment}>      <Dialog as="div" className="relative z-40" onClose={close}>        <TransitionChild>          <div className={classNames(            'fixed inset-0 bg-background-overlay-backdrop backdrop-blur-[6px]',            'duration-300 ease-in data-[closed]:opacity-0',            'data-[enter]:opacity-100',            'data-[leave]:opacity-0',          )} />        </TransitionChild>        <div className="fixed inset-0 overflow-y-auto">          <div className="flex min-h-full items-center justify-center">            <TransitionChild>              <DialogPanel className={classNames(                'w-full max-w-[800px] p-6 overflow-hidden transition-all transform bg-components-panel-bg border-[0.5px] border-components-panel-border shadow-xl rounded-2xl',                'duration-100 ease-in data-[closed]:opacity-0 data-[closed]:scale-95',                'data-[enter]:opacity-100 data-[enter]:scale-100',                'data-[leave]:opacity-0 data-[enter]:scale-95',                className,              )}>                {Boolean(title) && (                  <DialogTitle                    as={titleAs || 'h3'}                    className={classNames('pr-8 pb-3 title-2xl-semi-bold text-text-primary', titleClassName)}                  >                    {title}                  </DialogTitle>                )}                <div className={classNames(bodyClassName)}>                  {children}                </div>                {Boolean(footer) && (                  <div className={classNames('flex items-center justify-end gap-2 px-6 pb-6 pt-3', footerClassName)}>                    {footer}                  </div>                )}              </DialogPanel>            </TransitionChild>          </div>        </div>      </Dialog>    </Transition >  )}export default CustomDialog
 |