| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 | import { Fragment, useCallback, useEffect } from 'react'import type { ReactNode } from 'react'import { Dialog, DialogPanel, Transition, TransitionChild } from '@headlessui/react'import cn from '@/utils/classnames'type DialogProps = {  className?: string  children: ReactNode  show: boolean  onClose?: () => void}const MenuDialog = ({  className,  children,  show,  onClose,}: DialogProps) => {  const close = useCallback(() => onClose?.(), [onClose])  useEffect(() => {    const handleKeyDown = (event: KeyboardEvent) => {      if (event.key === 'Escape') {        event.preventDefault()        close()      }    }    document.addEventListener('keydown', handleKeyDown)    return () => {      document.removeEventListener('keydown', handleKeyDown)    }  }, [close])  return (    <Transition appear show={show} as={Fragment}>      <Dialog as="div" className="relative z-[60]" onClose={() => { }}>        <div className="fixed inset-0">          <div className="flex min-h-full flex-col items-center justify-center">            <TransitionChild>              <DialogPanel className={cn(                'relative h-full w-full grow overflow-hidden bg-background-sidenav-bg p-0 text-left align-middle backdrop-blur-md transition-all',                'duration-300 ease-in data-[closed]:scale-95 data-[closed]:opacity-0',                'data-[enter]:scale-100 data-[enter]:opacity-100',                'data-[enter]:scale-95 data-[leave]:opacity-0',                className,              )}>                <div className='absolute right-0 top-0 h-full w-1/2 bg-components-panel-bg' />                {children}              </DialogPanel>            </TransitionChild>          </div>        </div>      </Dialog>    </Transition >  )}export default MenuDialog
 |