Gooey Dropdown Menu

Pro

A capsule trigger drips a menu out of its underside. Arrow keys, live shortcuts, and a clear Delete row come built in.

menudropdowngoomorphliquidpopovercontext menuactions
Gooey Dropdown Menu component preview

Overview

Gooey Dropdown Menu is a React and Tailwind CSS animated dropdown menu with a liquid gooey effect, in Next.js or any React app, built on Framer Motion. The menu drips out of a capsule trigger through an SVG goo filter, and viscosity sets how far the blend spreads. It is a real ARIA menu: arrow keys, Home, End, and Escape work, a single letter shortcut fires its row while open, and a row with the ⌫ hint answers Backspace. Rows take icons, dividers, and a destructive style. The menu floats over the page, so avoid parents with overflow hidden.

Installation

Run the following command

~/your-project
pnpm dlx wensity@latest add gooey-dropdown

Usage

Import GooeyDropdown from @/components/wensity/gooey-dropdown and render it anywhere in your React or Next.js app. The source lands in your own repo, so every prop, class and animation below is yours to edit.

app/example.tsx
import { IconArchive, IconCopy, IconPencil, IconTrash } from "@tabler/icons-react";
import { GooeyDropdown } from "@/components/wensity/gooey-dropdown";
export default function Example() {
return (
<GooeyDropdown
label="Actions"
actions={[
{ id: "rename", label: "Rename", icon: <IconPencil size={18} />, shortcut: "R" },
{ id: "duplicate", label: "Duplicate", icon: <IconCopy size={18} />, shortcut: "D" },
{ id: "archive", label: "Archive", icon: <IconArchive size={18} />, shortcut: "A" },
{
id: "delete",
label: "Delete",
icon: <IconTrash size={18} />,
shortcut: "⌫",
divider: true,
destructive: true,
onSelect: () => console.log("delete"),
},
]}
/>
);
}

Props

PropTypeDefaultDescription
labelstringActionsText on the trigger pill.
actionsGooeyDropdownAction[]5 file actionsRows in the menu. Each needs an id and a label. detail, icon, shortcut, divider, destructive, and onSelect are optional.
menuWidthnumber240Width of the open menu, in pixels.
anchor"start" | "center" | "end""start"Which trigger edge the menu lines up with. center drips straight down.
gapnumber14Clear space between the trigger and the open menu, in pixels.
viscositynumber7How far the blend spreads while the menu pours. 0 keeps hard edges.
defaultOpenbooleanfalseOpen on first render.
fillstringtheme foregroundColor of the trigger and the menu. Leave it unset and the blob follows the active theme.
inkstringtheme backgroundText color on the blob. Leave it unset and the type uses the inverse theme color.
dangerstringtheme-aware redText color for destructive rows. Leave it unset for a red that stays readable on both theme blobs.