"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",
);