From e0300acb6dfff701052941847006a16c417bd798 Mon Sep 17 00:00:00 2001 From: Lncvrt Date: Mon, 13 Apr 2026 15:12:15 -0700 Subject: [PATCH] Dropdown opening animation This part is vibecoded --- src/components/Dropdown.tsx | 35 +++++++++++++++--------------- src/styles/dropdown.css | 43 +++++++++++++++++++++++++++++++------ 2 files changed, 54 insertions(+), 24 deletions(-) diff --git a/src/components/Dropdown.tsx b/src/components/Dropdown.tsx index 6c4c8e8..2d1d4aa 100644 --- a/src/components/Dropdown.tsx +++ b/src/components/Dropdown.tsx @@ -39,24 +39,23 @@ export default function Dropdown ({ value, options, onChange }: Props) { className={`dropdown-arrow ${open ? 'open' : ''}`} /> - {open && ( -
- {options.map(option => ( -
{ - await onChange(option.value) - setOpen(false) - }} - > - {option.label} -
- ))} -
- )} +
+ {options.map((option, i) => ( +
{ + await onChange(option.value) + setOpen(false) + }} + > + {option.label} +
+ ))} +
) } diff --git a/src/styles/dropdown.css b/src/styles/dropdown.css index e35f492..b12b579 100644 --- a/src/styles/dropdown.css +++ b/src/styles/dropdown.css @@ -1,11 +1,14 @@ -@import 'tailwindcss'; +@import "tailwindcss"; .dropdown { @apply relative w-40; } .dropdown-btn { - @apply w-full flex items-center justify-between px-3 py-1.5 rounded-md cursor-pointer bg-(--col2) hover:bg-(--col3) border border-(--col4) hover:border-(--col5) text-white; + @apply w-full flex items-center justify-between px-3 py-1.5 rounded-md cursor-pointer + bg-(--col2) hover:bg-(--col3) + border border-(--col4) hover:border-(--col5) + text-white; } .dropdown-arrow { @@ -17,13 +20,41 @@ } .dropdown-menu { - @apply absolute z-50 mt-1 w-full rounded-md shadow-lg overflow-hidden bg-(--col2) border border-(--col4) divide-y divide-(--col4); + @apply absolute z-50 mt-1 w-full rounded-md shadow-lg overflow-hidden + bg-(--col2) border border-(--col4) + origin-top + opacity-0 scale-95 -translate-y-1 pointer-events-none + transition-[opacity,transform] duration-150 ease-out; +} + +.dropdown-menu.open { + @apply opacity-100 scale-100 translate-y-0 pointer-events-auto; } .dropdown-item { - @apply px-3 py-1.5 cursor-pointer transition-colors hover:bg-(--col3); + @apply px-3 py-1.5 cursor-pointer text-white transition-colors; + + opacity: 0; + transform: translateY(-10px); } +.dropdown-item:hover, .dropdown-item.active { - @apply bg-(--col3) hover:bg-(--col4); -} \ No newline at end of file + @apply bg-(--col3); +} + +.dropdown-menu.open .dropdown-item { + animation: dropIn 220ms ease-out forwards; + animation-delay: calc(var(--i) * 40ms); +} + +@keyframes dropIn { + from { + opacity: 0; + transform: translateY(-10px); + } + to { + opacity: 1; + transform: translateY(0); + } +}