import type { JSX } from 'solid-js'; import { createComponent, mergeProps } from 'solid-js'; import { omitProps } from 'solid-use/props'; import type { DynamicProps, HeadlessPropsWithRef, ValidConstructor, } from '../../utils/dynamic-prop'; import { createForwardRef } from '../../utils/dynamic-prop'; import { createOwnerAttribute } from '../../utils/focus-navigator'; import { createARIADisabledState, createDisabledState } from '../../utils/state-props'; import { Button } from '../button'; import type { MenuChildProps } from './MenuChild'; import { MenuChild } from './MenuChild'; import { useMenuContext } from './MenuContext'; import { MENU_ITEM_TAG } from './tags'; export type MenuItemProps = HeadlessPropsWithRef< T, MenuChildProps >; /** * One action in a `Menu`. The arrow keys and type-ahead skip disabled items. * * Renders an `
  • ` by default. * * @see {@link https://github.com/lxsmnsyc/terracotta/blob/main/docs/components/menu.md} */ export function MenuItem(props: MenuItemProps): JSX.Element { const context = useMenuContext('MenuItem'); const [, setInternalRef] = createForwardRef(props); return createComponent( Button, mergeProps( MENU_ITEM_TAG, createOwnerAttribute(context.getId()), { get as() { return props.as ?? ('li' as T); }, role: 'menuitem', tabindex: -1, ref: setInternalRef, }, createDisabledState(() => props.disabled), createARIADisabledState(() => props.disabled), omitProps(props, ['as', 'disabled', 'ref', 'children']), { get children() { return createComponent(MenuChild, { get disabled() { return props.disabled; }, get children() { return props.children; }, }); }, }, ) as DynamicProps, ); }