mirror of
				https://github.com/langgenius/dify.git
				synced 2025-11-03 20:33:00 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			87 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import { Fragment, useCallback } from 'react'
 | 
						|
import type { ElementType, ReactNode } from 'react'
 | 
						|
import { Dialog, Transition } from '@headlessui/react'
 | 
						|
import classNames from 'classnames'
 | 
						|
 | 
						|
// https://headlessui.com/react/dialog
 | 
						|
 | 
						|
type 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}>
 | 
						|
        <Transition.Child
 | 
						|
          as={Fragment}
 | 
						|
          enter="ease-out duration-300"
 | 
						|
          enterFrom="opacity-0"
 | 
						|
          enterTo="opacity-100"
 | 
						|
          leave="ease-in duration-200"
 | 
						|
          leaveFrom="opacity-100"
 | 
						|
          leaveTo="opacity-0"
 | 
						|
        >
 | 
						|
          <div className="fixed inset-0 bg-black bg-opacity-25" />
 | 
						|
        </Transition.Child>
 | 
						|
 | 
						|
        <div className="fixed inset-0 overflow-y-auto">
 | 
						|
          <div className="flex items-center justify-center min-h-full p-4 text-center">
 | 
						|
            <Transition.Child
 | 
						|
              as={Fragment}
 | 
						|
              enter="ease-out duration-300"
 | 
						|
              enterFrom="opacity-0 scale-95"
 | 
						|
              enterTo="opacity-100 scale-100"
 | 
						|
              leave="ease-in duration-200"
 | 
						|
              leaveFrom="opacity-100 scale-100"
 | 
						|
              leaveTo="opacity-0 scale-95"
 | 
						|
            >
 | 
						|
              <Dialog.Panel className={classNames('w-full max-w-[800px] p-0 overflow-hidden text-left text-gray-900 align-middle transition-all transform bg-white shadow-xl rounded-2xl', className)}>
 | 
						|
                {Boolean(title) && (
 | 
						|
                  <Dialog.Title
 | 
						|
                    as={titleAs || 'h3'}
 | 
						|
                    className={classNames('px-8 py-6 text-lg font-medium leading-6 text-gray-900', titleClassName)}
 | 
						|
                  >
 | 
						|
                    {title}
 | 
						|
                  </Dialog.Title>
 | 
						|
                )}
 | 
						|
                <div className={classNames('px-8 text-lg font-medium leading-6', bodyClassName)}>
 | 
						|
                  {children}
 | 
						|
                </div>
 | 
						|
                {Boolean(footer) && (
 | 
						|
                  <div className={classNames('flex items-center justify-end gap-2 px-8 py-6', footerClassName)}>
 | 
						|
                    {footer}
 | 
						|
                  </div>
 | 
						|
                )}
 | 
						|
              </Dialog.Panel>
 | 
						|
            </Transition.Child>
 | 
						|
          </div>
 | 
						|
        </div>
 | 
						|
      </Dialog>
 | 
						|
    </Transition >
 | 
						|
  )
 | 
						|
}
 | 
						|
 | 
						|
export default CustomDialog
 |