Radix Dropdown Menu Demo

PreviousNext

Demo showing an animated radix dropdown menu.

Docs
animate-uiui

Preview

Loading preview…
registry/demo/primitives/radix/dropdown-menu/index.tsx
'use client';

import {
  ChevronRight,
  CreditCard,
  Keyboard,
  LogOut,
  Mail,
  MessageSquare,
  Plus,
  PlusCircle,
  Settings,
  User,
  UserPlus,
  Users,
} from 'lucide-react';
import {
  DropdownMenu,
  DropdownMenuContent,
  DropdownMenuGroup,
  DropdownMenuHighlight,
  DropdownMenuHighlightItem,
  DropdownMenuItem,
  DropdownMenuLabel,
  DropdownMenuSeparator,
  DropdownMenuShortcut,
  DropdownMenuSub,
  DropdownMenuSubContent,
  DropdownMenuSubTrigger,
  DropdownMenuTrigger,
} from '@/components/animate-ui/primitives/radix/dropdown-menu';

const itemClassName =
  'relative z-[1] focus:text-accent-foreground select-none flex items-center gap-2 px-2 py-1.5 text-sm outline-none [&_svg]:size-4 [&_span]:data-[slot=dropdown-menu-shortcut]:text-xs [&_span]:data-[slot=dropdown-menu-shortcut]:ml-auto';
const separatorClassName = '-mx-1 my-1 h-px bg-border';

interface RadixDropdownMenuDemoProps {
  side?: 'top' | 'bottom' | 'left' | 'right';
  sideOffset?: number;
  align?: 'start' | 'center' | 'end';
  alignOffset?: number;
}

export const RadixDropdownMenuDemo = ({
  side,
  sideOffset,
  align,
  alignOffset,
}: RadixDropdownMenuDemoProps) => {
  return (
    <DropdownMenu>
      <DropdownMenuTrigger>Open</DropdownMenuTrigger>
      <DropdownMenuContent
        side={side}
        sideOffset={sideOffset}
        align={align}
        alignOffset={alignOffset}
        className="w-56 max-h-[var(--radix-dropdown-menu-content-available-height)] min-w-[8rem] overflow-y-auto overflow-x-hidden border bg-background p-1 z-50"
      >
        <DropdownMenuHighlight className="absolute inset-0 bg-accent z-0">
          <DropdownMenuLabel className="px-2 py-1.5 text-sm font-semibold">
            My Account
          </DropdownMenuLabel>
          <DropdownMenuSeparator className={separatorClassName} />
          <DropdownMenuGroup>
            <DropdownMenuHighlightItem>
              <DropdownMenuItem className={itemClassName}>
                <User />
                <span>Profile</span>
                <DropdownMenuShortcut>⇧⌘P</DropdownMenuShortcut>
              </DropdownMenuItem>
            </DropdownMenuHighlightItem>
            <DropdownMenuHighlightItem>
              <DropdownMenuItem className={itemClassName}>
                <CreditCard />
                <span>Billing</span>
                <DropdownMenuShortcut>⌘B</DropdownMenuShortcut>
              </DropdownMenuItem>
            </DropdownMenuHighlightItem>
            <DropdownMenuHighlightItem>
              <DropdownMenuItem className={itemClassName}>
                <Settings />
                <span>Settings</span>
                <DropdownMenuShortcut>⌘S</DropdownMenuShortcut>
              </DropdownMenuItem>
            </DropdownMenuHighlightItem>
            <DropdownMenuHighlightItem>
              <DropdownMenuItem className={itemClassName}>
                <Keyboard />
                <span>Keyboard shortcuts</span>
                <DropdownMenuShortcut>⌘K</DropdownMenuShortcut>
              </DropdownMenuItem>
            </DropdownMenuHighlightItem>
          </DropdownMenuGroup>
          <DropdownMenuSeparator className={separatorClassName} />
          <DropdownMenuGroup>
            <DropdownMenuHighlightItem>
              <DropdownMenuItem className={itemClassName}>
                <Users />
                <span>Team</span>
              </DropdownMenuItem>
            </DropdownMenuHighlightItem>
            <DropdownMenuSub>
              <DropdownMenuHighlightItem>
                <DropdownMenuSubTrigger className={itemClassName}>
                  <UserPlus />
                  <span>Invite users</span>
                  <ChevronRight data-chevron className="ml-auto size-4" />
                </DropdownMenuSubTrigger>
              </DropdownMenuHighlightItem>

              <DropdownMenuSubContent className="overflow-hidden min-w-[8rem] overflow-y-auto overflow-x-hidden border bg-background p-1 z-50">
                <DropdownMenuHighlightItem>
                  <DropdownMenuItem className={itemClassName}>
                    <Mail />
                    <span>Email</span>
                  </DropdownMenuItem>
                </DropdownMenuHighlightItem>
                <DropdownMenuHighlightItem>
                  <DropdownMenuItem className={itemClassName}>
                    <MessageSquare />
                    <span>Message</span>
                  </DropdownMenuItem>
                </DropdownMenuHighlightItem>
                <DropdownMenuSeparator className={separatorClassName} />
                <DropdownMenuHighlightItem>
                  <DropdownMenuItem className={itemClassName}>
                    <PlusCircle />
                    <span>More...</span>
                  </DropdownMenuItem>
                </DropdownMenuHighlightItem>
              </DropdownMenuSubContent>
            </DropdownMenuSub>
            <DropdownMenuHighlightItem>
              <DropdownMenuItem className={itemClassName}>
                <Plus />
                <span>New Team</span>
                <DropdownMenuShortcut>⌘+T</DropdownMenuShortcut>
              </DropdownMenuItem>
            </DropdownMenuHighlightItem>
          </DropdownMenuGroup>
          <DropdownMenuSeparator className={separatorClassName} />
          <DropdownMenuHighlightItem>
            <DropdownMenuItem className={itemClassName}>
              <LogOut />
              <span>Log out</span>
              <DropdownMenuShortcut>⇧⌘Q</DropdownMenuShortcut>
            </DropdownMenuItem>
          </DropdownMenuHighlightItem>
        </DropdownMenuHighlight>
      </DropdownMenuContent>
    </DropdownMenu>
  );
};

Installation

npx shadcn@latest add @animate-ui/demo-primitives-radix-dropdown-menu

Usage

import { DemoPrimitivesRadixDropdownMenu } from "@/components/ui/demo-primitives-radix-dropdown-menu"
<DemoPrimitivesRadixDropdownMenu />