Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | import { Transition } from '@headlessui/react'; import { Link } from '@inertiajs/react'; import { createContext, useContext, useState } from 'react'; const DropDownContext = createContext(); const Dropdown = ({ children }) => { const [open, setOpen] = useState(false); const toggleOpen = () => { setOpen((previousState) => !previousState); }; return ( <DropDownContext.Provider value={{ open, setOpen, toggleOpen }}> <div className="relative">{children}</div> </DropDownContext.Provider> ); }; const Trigger = ({ children }) => { const { open, setOpen, toggleOpen } = useContext(DropDownContext); return ( <> <div onClick={toggleOpen}>{children}</div> {open && ( <div className="fixed inset-0 z-40" onClick={() => setOpen(false)} ></div> )} </> ); }; const Content = ({ align = 'right', width = '48', contentClasses = 'py-1 bg-white dark:bg-gray-700', children, }) => { const { open, setOpen } = useContext(DropDownContext); let alignmentClasses = 'origin-top'; if (align === 'left') { alignmentClasses = 'ltr:origin-top-left rtl:origin-top-right start-0'; } else if (align === 'right') { alignmentClasses = 'ltr:origin-top-right rtl:origin-top-left end-0'; } let widthClasses = ''; if (width === '48') { widthClasses = 'w-48'; } return ( <> <Transition show={open} enter="transition ease-out duration-200" enterFrom="opacity-0 scale-95" enterTo="opacity-100 scale-100" leave="transition ease-in duration-75" leaveFrom="opacity-100 scale-100" leaveTo="opacity-0 scale-95" > <div className={`absolute z-50 mt-2 rounded-md shadow-lg ${alignmentClasses} ${widthClasses}`} onClick={() => setOpen(false)} > <div className={ `rounded-md ring-1 ring-black ring-opacity-5 ` + contentClasses } > {children} </div> </div> </Transition> </> ); }; const DropdownLink = ({ className = '', children, ...props }) => { return ( <Link {...props} className={ 'block w-full px-4 py-2 text-start text-sm leading-5 text-gray-700 transition duration-150 ease-in-out hover:bg-gray-100 focus:bg-gray-100 focus:outline-none dark:text-gray-300 dark:hover:bg-gray-800 dark:focus:bg-gray-800 ' + className } > {children} </Link> ); }; Dropdown.Trigger = Trigger; Dropdown.Content = Content; Dropdown.Link = DropdownLink; export default Dropdown; |