import React from 'react'; import { Header, Menu as AriaMenu, MenuItem as AriaMenuItem, MenuSection as AriaMenuSection, MenuTrigger as AriaMenuTrigger, Separator as AriaSeparator, SubmenuTrigger as AriaSubmenuTrigger, composeRenderProps, type MenuItemProps, type MenuProps, type MenuSectionProps, type MenuTriggerProps as AriaMenuTriggerProps, type SeparatorProps, type SubmenuTriggerProps, } from 'react-aria-components'; import { tv } from 'tailwind-variants'; import { twMerge } from 'tailwind-merge'; import { CheckboxIcon, ChevronrightIcon } from '../icons'; import { Popover, type PopoverProps } from '../Popover/Popover.quanta'; import { composeTailwindRenderProps, focusRing } from '../utils'; import { getMenuTriggerChildren } from './menuTriggerChildren'; export function Menu(props: MenuProps) { return ( ); } const menuItemStyles = tv({ extend: focusRing, base: ` group relative flex cursor-default items-center gap-4 rounded-lg py-2 pr-3 pl-3 text-sm no-underline forced-color-adjust-none select-none [-webkit-tap-highlight-color:transparent] selected:pr-1 [&[href]]:cursor-pointer `, variants: { isDisabled: { false: ` text-neutral-900 dark:text-neutral-100 `, true: ` text-neutral-300 dark:text-neutral-600 forced-colors:text-[GrayText] `, }, isPressed: { true: ` bg-neutral-100 dark:bg-neutral-800 `, }, isFocused: { true: ` bg-blue-600 text-white forced-colors:bg-[Highlight] forced-colors:text-[HighlightText] `, }, }, compoundVariants: [ { isFocused: false, isOpen: true, className: ` bg-neutral-100 dark:bg-neutral-700/60 `, }, ], }); export function MenuItem(props: MenuItemProps) { const textValue = props.textValue || (typeof props.children === 'string' ? props.children : undefined); return ( menuItemStyles({ ...renderProps, className }), )} > {composeRenderProps( props.children, (children, { selectionMode, isSelected, hasSubmenu }) => ( <> {selectionMode !== 'none' && ( {isSelected && } )} {children} {hasSubmenu && ( )} ), )} ); } export function MenuSeparator(props: SeparatorProps) { return ( ); } export function MenuSection(props: MenuSectionProps) { return ( {props.children} ); } export function MenuSectionHeader(props: React.ComponentProps) { return (
); } interface MenuTriggerProps extends AriaMenuTriggerProps { placement?: PopoverProps['placement']; } export function MenuTrigger(props: MenuTriggerProps) { const [trigger, menu] = getMenuTriggerChildren(props.children, 'MenuTrigger'); return ( {trigger} {menu} ); } export function SubmenuTrigger(props: SubmenuTriggerProps) { const [trigger, menu] = getMenuTriggerChildren( props.children, 'SubmenuTrigger', ); return ( {trigger} {menu} ); }