"use client"; import { Menu as MenuPrimitive, useMenuContext, useMenuItemContext } from "@seed-design/react-menu"; import { menu, type MenuVariantProps } from "@seed-design/css/recipes/menu"; import { menuItem, type MenuItemVariantProps } from "@seed-design/css/recipes/menu-item"; import { Primitive, type PrimitiveProps } from "@seed-design/react-primitive"; import clsx from "clsx"; import * as React from "react"; import { createSlotRecipeContext } from "../../utils/createSlotRecipeContext"; import { createWithStateProps } from "../../utils/createWithStateProps"; const { ClassNamesProvider, withContext, useClassNames } = createSlotRecipeContext(menu); const { PropsProvider: ItemPropsProvider, useProps: useItemProps, withContext: withItemContext, ClassNamesProvider: ItemClassNamesProvider, } = createSlotRecipeContext(menuItem); const withStateProps = createWithStateProps([useMenuContext]); const withItemStateProps = createWithStateProps([useMenuItemContext]); //////////////////////////////////////////////////////////////////////////////////// export interface MenuRootProps extends MenuVariantProps, MenuPrimitive.RootProps {} export const MenuRoot = (props: MenuRootProps) => { const [variantProps, otherProps] = menu.splitVariantProps(props); const classNames = menu(variantProps); return ( ); }; //////////////////////////////////////////////////////////////////////////////////// export interface MenuAnchorProps extends MenuPrimitive.AnchorProps {} export const MenuAnchor = MenuPrimitive.Anchor; //////////////////////////////////////////////////////////////////////////////////// export interface MenuTriggerProps extends MenuPrimitive.TriggerProps {} export const MenuTrigger = MenuPrimitive.Trigger; //////////////////////////////////////////////////////////////////////////////////// export interface MenuPositionerProps extends MenuPrimitive.PositionerProps, PrimitiveProps, React.HTMLAttributes {} export const MenuPositioner = React.forwardRef( ({ className, ...props }, ref) => { const classNames = useClassNames(); return ( ); }, ); MenuPositioner.displayName = "MenuPositioner"; //////////////////////////////////////////////////////////////////////////////////// export interface MenuContentProps extends MenuPrimitive.ContentProps {} export const MenuContent = withContext( MenuPrimitive.Content, "content", ); //////////////////////////////////////////////////////////////////////////////////// export interface MenuScrollAreaProps extends PrimitiveProps, React.HTMLAttributes {} export const MenuScrollArea = withContext( withStateProps(Primitive.div), "scrollArea", ); //////////////////////////////////////////////////////////////////////////////////// export interface MenuGroupProps extends MenuPrimitive.GroupProps {} export const MenuGroup = withContext(MenuPrimitive.Group, "group"); //////////////////////////////////////////////////////////////////////////////////// export interface MenuGroupLabelProps extends MenuPrimitive.GroupLabelProps {} export const MenuGroupLabel = withContext( MenuPrimitive.GroupLabel, "groupLabel", ); //////////////////////////////////////////////////////////////////////////////////// export interface MenuItemProps extends MenuItemVariantProps, MenuPrimitive.ItemProps {} export const MenuItem = React.forwardRef( ({ className: propClassName, ...props }, ref) => { const [variantProps, otherProps] = menuItem.splitVariantProps(props); const parentProps = useItemProps(); const classNames = menuItem({ ...parentProps, ...variantProps }); return ( ); }, ); MenuItem.displayName = "MenuItem"; //////////////////////////////////////////////////////////////////////////////////// export interface MenuItemBodyProps extends PrimitiveProps, React.HTMLAttributes {} export const MenuItemBody = withItemContext( withItemStateProps(Primitive.div), "body", ); //////////////////////////////////////////////////////////////////////////////////// export interface MenuItemLabelProps extends PrimitiveProps, React.HTMLAttributes {} export const MenuItemLabel = withItemContext( withItemStateProps(Primitive.span), "label", ); //////////////////////////////////////////////////////////////////////////////////// export interface MenuItemDescriptionProps extends PrimitiveProps, React.HTMLAttributes {} export const MenuItemDescription = withItemContext( withItemStateProps(Primitive.span), "description", );