|
|
@ -15,45 +15,47 @@ interface DropdownProps { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
export function Dropdown(props: DropdownProps) { |
|
|
|
export function Dropdown(props: DropdownProps) { |
|
|
|
<div className="relative my-4 max-w-[18rem]"> |
|
|
|
return ( |
|
|
|
<Listbox value={props.selectedItem} onChange={props.setSelectedItem}> |
|
|
|
<div className="relative my-4 max-w-[18rem]"> |
|
|
|
{({ open }) => ( |
|
|
|
<Listbox value={props.selectedItem} onChange={props.setSelectedItem}> |
|
|
|
<> |
|
|
|
{({ open }) => ( |
|
|
|
<Listbox.Button className="relative w-full cursor-default rounded-lg bg-denim-500 py-2 pl-3 pr-10 text-left text-white shadow-md focus:outline-none focus-visible:border-indigo-500 focus-visible:ring-2 focus-visible:ring-bink-500 focus-visible:ring-opacity-75 focus-visible:ring-offset-2 focus-visible:ring-offset-bink-300 sm:text-sm"> |
|
|
|
<> |
|
|
|
<span className="block truncate">{props.selectedItem.name}</span> |
|
|
|
<Listbox.Button className="relative w-full cursor-default rounded-lg bg-denim-500 py-2 pl-3 pr-10 text-left text-white shadow-md focus:outline-none focus-visible:border-indigo-500 focus-visible:ring-2 focus-visible:ring-bink-500 focus-visible:ring-opacity-75 focus-visible:ring-offset-2 focus-visible:ring-offset-bink-300 sm:text-sm"> |
|
|
|
<span className="pointer-events-none absolute inset-y-0 right-0 flex items-center pr-2"> |
|
|
|
<span className="block truncate">{props.selectedItem.name}</span> |
|
|
|
<Icon |
|
|
|
<span className="pointer-events-none absolute inset-y-0 right-0 flex items-center pr-2"> |
|
|
|
icon={Icons.CHEVRON_DOWN} |
|
|
|
<Icon |
|
|
|
className={`transform transition-transform ${ |
|
|
|
icon={Icons.CHEVRON_DOWN} |
|
|
|
open ? "rotate-180" : "" |
|
|
|
className={`transform transition-transform ${ |
|
|
|
}`}
|
|
|
|
open ? "rotate-180" : "" |
|
|
|
/> |
|
|
|
}`}
|
|
|
|
</span> |
|
|
|
/> |
|
|
|
</Listbox.Button> |
|
|
|
</span> |
|
|
|
<Transition |
|
|
|
</Listbox.Button> |
|
|
|
as={Fragment} |
|
|
|
<Transition |
|
|
|
leave="transition ease-in duration-100" |
|
|
|
as={Fragment} |
|
|
|
leaveFrom="opacity-100" |
|
|
|
leave="transition ease-in duration-100" |
|
|
|
leaveTo="opacity-0" |
|
|
|
leaveFrom="opacity-100" |
|
|
|
> |
|
|
|
leaveTo="opacity-0" |
|
|
|
<Listbox.Options className="absolute bottom-11 left-0 right-0 z-10 mt-1 max-h-60 overflow-auto rounded-md bg-denim-500 py-1 text-white shadow-lg ring-1 ring-black ring-opacity-5 scrollbar-thin scrollbar-track-denim-400 scrollbar-thumb-denim-200 focus:outline-none sm:bottom-10 sm:text-sm"> |
|
|
|
> |
|
|
|
{props.options.map((opt) => ( |
|
|
|
<Listbox.Options className="absolute bottom-11 left-0 right-0 z-10 mt-1 max-h-60 overflow-auto rounded-md bg-denim-500 py-1 text-white shadow-lg ring-1 ring-black ring-opacity-5 scrollbar-thin scrollbar-track-denim-400 scrollbar-thumb-denim-200 focus:outline-none sm:bottom-10 sm:text-sm"> |
|
|
|
<Listbox.Option |
|
|
|
{props.options.map((opt) => ( |
|
|
|
className={({ active }) => |
|
|
|
<Listbox.Option |
|
|
|
`relative cursor-default select-none py-2 pl-10 pr-4 ${ |
|
|
|
className={({ active }) => |
|
|
|
active ? "bg-denim-400 text-bink-700" : "text-white" |
|
|
|
`relative cursor-default select-none py-2 pl-10 pr-4 ${ |
|
|
|
}` |
|
|
|
active ? "bg-denim-400 text-bink-700" : "text-white" |
|
|
|
} |
|
|
|
}` |
|
|
|
key={opt.id} |
|
|
|
} |
|
|
|
value={opt} |
|
|
|
key={opt.id} |
|
|
|
> |
|
|
|
value={opt} |
|
|
|
{opt.name} |
|
|
|
> |
|
|
|
</Listbox.Option> |
|
|
|
{opt.name} |
|
|
|
))} |
|
|
|
</Listbox.Option> |
|
|
|
</Listbox.Options> |
|
|
|
))} |
|
|
|
</Transition> |
|
|
|
</Listbox.Options> |
|
|
|
</> |
|
|
|
</Transition> |
|
|
|
)} |
|
|
|
</> |
|
|
|
</Listbox> |
|
|
|
)} |
|
|
|
</div>; |
|
|
|
</Listbox> |
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
) |
|
|
|
} |
|
|
|
} |
|
|
|