Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

menu-dialog.tsx 1.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import { Fragment, useCallback, useEffect } from 'react'
  2. import type { ReactNode } from 'react'
  3. import { Dialog, DialogPanel, Transition, TransitionChild } from '@headlessui/react'
  4. import cn from '@/utils/classnames'
  5. import { noop } from 'lodash-es'
  6. type DialogProps = {
  7. className?: string
  8. children: ReactNode
  9. show: boolean
  10. onClose?: () => void
  11. }
  12. const MenuDialog = ({
  13. className,
  14. children,
  15. show,
  16. onClose,
  17. }: DialogProps) => {
  18. const close = useCallback(() => onClose?.(), [onClose])
  19. useEffect(() => {
  20. const handleKeyDown = (event: KeyboardEvent) => {
  21. if (event.key === 'Escape') {
  22. event.preventDefault()
  23. close()
  24. }
  25. }
  26. document.addEventListener('keydown', handleKeyDown)
  27. return () => {
  28. document.removeEventListener('keydown', handleKeyDown)
  29. }
  30. }, [close])
  31. return (
  32. <Transition appear show={show} as={Fragment}>
  33. <Dialog as="div" className="relative z-[60]" onClose={noop}>
  34. <div className="fixed inset-0">
  35. <div className="flex min-h-full flex-col items-center justify-center">
  36. <TransitionChild>
  37. <DialogPanel className={cn(
  38. 'relative h-full w-full grow overflow-hidden bg-background-sidenav-bg p-0 text-left align-middle backdrop-blur-md transition-all',
  39. 'duration-300 ease-in data-[closed]:scale-95 data-[closed]:opacity-0',
  40. 'data-[enter]:scale-100 data-[enter]:opacity-100',
  41. 'data-[enter]:scale-95 data-[leave]:opacity-0',
  42. className,
  43. )}>
  44. <div className='absolute right-0 top-0 h-full w-1/2 bg-components-panel-bg' />
  45. {children}
  46. </DialogPanel>
  47. </TransitionChild>
  48. </div>
  49. </div>
  50. </Dialog>
  51. </Transition >
  52. )
  53. }
  54. export default MenuDialog