Menu
adn-ui/menuFreeComponent
A dropdown menu displaying a list of actions with keyboard navigation.
Live preview
live · rendered by the registry
Rendered by adn-ui on their own page — this is the component running, not a screenshot of it.Install it
npx shadcn@latest add https://ui.awaiden.com/r/menu.jsonSource
1"use client";23import "./menu.css";4import { Menu as BaseMenu } from "@base-ui/react/menu";5import type React from "react";6import { cn } from "tailwind-variants";78import { MenuContext, useMenuContext } from "./menu.context";9import { menuVariants, type MenuVariants } from "./menu.variants";1011export type MenuProps = MenuVariants & React.ComponentProps<typeof BaseMenu.Root>;1213export const MenuRoot = ({ children, size, ...props }: MenuProps) => {14 const slots = menuVariants({ size });1516 return (17 <MenuContext.Provider value={{ slots }}>18 <BaseMenu.Root {...props}>{children}</BaseMenu.Root>19 </MenuContext.Provider>20 );21};2223export type MenuTriggerProps = React.ComponentProps<typeof BaseMenu.Trigger>;2425export const MenuTrigger = ({ className, ...props }: MenuTriggerProps) => {26 const { slots } = useMenuContext();27 return <BaseMenu.Trigger className={cn(slots.trigger(), className)} {...props} />;28};2930export type MenuPortalProps = React.ComponentProps<typeof BaseMenu.Portal>;3132export const MenuPortal = (props: MenuPortalProps) => {33 return <BaseMenu.Portal {...props} />;34};3536export type MenuPositionerProps = React.ComponentProps<typeof BaseMenu.Positioner>;3738export const MenuPositioner = ({ className, sideOffset = 4, ...props }: MenuPositionerProps) => {39 const { slots } = useMenuContext();40 return (41 <BaseMenu.Positioner42 className={cn(slots.positioner(), className)}43 sideOffset={sideOffset}44 {...props}45 />46 );47};4849export type MenuPopupProps = React.ComponentProps<typeof BaseMenu.Popup>;5051export const MenuPopup = ({ className, ...props }: MenuPopupProps) => {52 const { slots } = useMenuContext();53 return <BaseMenu.Popup className={cn(slots.popup(), className)} {...props} />;54};5556export type MenuItemProps = React.ComponentProps<typeof BaseMenu.Item>;5758export const MenuItem = ({ className, ...props }: MenuItemProps) => {59 const { slots } = useMenuContext();60 return <BaseMenu.Item className={cn(slots.item(), className)} {...props} />;61};6263export type MenuSeparatorProps = React.ComponentProps<typeof BaseMenu.Separator>;6465export const MenuSeparator = ({ className, ...props }: MenuSeparatorProps) => {66 const { slots } = useMenuContext();67 return <BaseMenu.Separator className={cn(slots.separator(), className)} {...props} />;68};6970export type MenuSubmenuRootProps = React.ComponentProps<typeof BaseMenu.SubmenuRoot>;7172export const MenuSubmenuRoot = (props: MenuSubmenuRootProps) => {73// … truncated
What it pulls in
npm packages
Files it writes
More from adn-ui
All 46 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Accordionaccordion | adn-ui | Components | Free | 2 deps · 5 files | |
| Alert Dialogalert-dialog | adn-ui | Components | Free | 2 deps · 5 files | |
| Aspect Ratioaspect-ratio | adn-ui | Components | Free | 1 dep · 5 files | |
| Autocompleteautocomplete | adn-ui | Components | Free | 2 deps · 5 files | |
| Avataravatar | adn-ui | Components | Free | 2 deps · 5 files | |
| Badgebadge | adn-ui | Components | Free | 1 dep · 5 files | |
| Breadcrumbbreadcrumb | adn-ui | Components | Free | 1 dep · 5 files | |
| Buttonbutton | adn-ui | Components | Free | 1 dep · 4 files |
