| 
                        1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 | 
                        - import { Popover, Transition } from '@headlessui/react'
 - import { Fragment, cloneElement, useRef } from 'react'
 - import s from './style.module.css'
 - 
 - type IPopover = {
 -   className?: string
 -   htmlContent: React.ReactNode
 -   trigger?: 'click' | 'hover'
 -   position?: 'bottom' | 'br'
 -   btnElement?: string | React.ReactNode
 -   btnClassName?: string | ((open: boolean) => string)
 - }
 - 
 - const timeoutDuration = 100
 - 
 - export default function CustomPopover({
 -   trigger = 'hover',
 -   position = 'bottom',
 -   htmlContent,
 -   btnElement,
 -   className,
 -   btnClassName,
 - }: IPopover) {
 -   const buttonRef = useRef<HTMLButtonElement>(null)
 -   const timeOutRef = useRef<NodeJS.Timeout | null>(null)
 - 
 -   const onMouseEnter = (isOpen: boolean) => {
 -     timeOutRef.current && clearTimeout(timeOutRef.current)
 -     !isOpen && buttonRef.current?.click()
 -   }
 - 
 -   const onMouseLeave = (isOpen: boolean) => {
 -     timeOutRef.current = setTimeout(() => {
 -       isOpen && buttonRef.current?.click()
 -     }, timeoutDuration)
 -   }
 - 
 -   return (
 -     <Popover className="relative">
 -       {({ open }: { open: boolean }) => {
 -         return (
 -           <>
 -             <div
 -               {...(trigger !== 'hover'
 -                 ? {}
 -                 : {
 -                   onMouseLeave: () => onMouseLeave(open),
 -                   onMouseEnter: () => onMouseEnter(open),
 -                 })
 -               }
 -             >
 -               <Popover.Button
 -                 ref={buttonRef}
 -                 className={`group ${s.popupBtn} ${open ? '' : 'bg-gray-100'} ${!btnClassName ? '' : typeof btnClassName === 'string' ? btnClassName : btnClassName?.(open)}`}
 -               >
 -                 {btnElement}
 -               </Popover.Button>
 -               <Transition
 -                 as={Fragment}
 -                 enter="transition ease-out duration-200"
 -                 enterFrom="opacity-0 translate-y-1"
 -                 enterTo="opacity-100 translate-y-0"
 -                 leave="transition ease-in duration-150"
 -                 leaveFrom="opacity-100 translate-y-0"
 -                 leaveTo="opacity-0 translate-y-1"
 -               >
 -                 <Popover.Panel
 -                   className={`${s.popupPanel} ${position === 'br' ? 'right-0' : 'transform -translate-x-1/2 left-1/2'} ${className}`}
 -                   {...(trigger !== 'hover'
 -                     ? {}
 -                     : {
 -                       onMouseLeave: () => onMouseLeave(open),
 -                       onMouseEnter: () => onMouseEnter(open),
 -                     })
 -                   }>
 -                   <div
 -                     className={s.panelContainer}
 -                     {...(trigger !== 'hover'
 -                       ? {}
 -                       : {
 -                         onMouseLeave: () => onMouseLeave(open),
 -                         onMouseEnter: () => onMouseEnter(open),
 -                       })
 -                     }
 -                   >
 -                     {cloneElement(htmlContent as React.ReactElement, {
 -                       onClose: () => onMouseLeave(open),
 -                     })}
 -                   </div>
 -                 </Popover.Panel>
 -               </Transition>
 -             </div>
 -           </>
 -         )
 -       }}
 -     </Popover>
 -   )
 - }
 
 
  |