import React, {forwardRef, ReactElement, ReactNode, useState} from 'react'; import {FocusScope, useFocusManager} from '@react-aria/focus'; import {ListItemBase, ListItemBaseProps} from './list-item-base'; import clsx from 'clsx'; type Child = ReactElement | ReactElement[]; interface Props { className?: string; padding?: string; children: ReactNode; dataTestId?: string; } export function List({children, className, padding, dataTestId}: Props) { return (
    {children}
); } interface ListItemProps extends ListItemBaseProps { children: ReactNode; onSelected?: () => void; borderRadius?: string; } export const ListItem = forwardRef( ( { children, onSelected, borderRadius = 'rounded', className, ...listItemProps }, ref, ) => { const focusManager = useFocusManager(); const isSelectable = !!onSelected; const [isActive, setIsActive] = useState(false); const onKeyDown = (e: React.KeyboardEvent) => { switch (e.key) { case 'ArrowDown': e.preventDefault(); focusManager?.focusNext(); break; case 'ArrowUp': e.preventDefault(); focusManager?.focusPrevious(); break; case 'Home': e.preventDefault(); focusManager?.focusFirst(); break; case 'End': e.preventDefault(); focusManager?.focusLast(); break; case 'Enter': case 'Space': e.preventDefault(); onSelected?.(); break; } }; return (
  • { setIsActive((e.target as HTMLElement).matches(':focus-visible')); }} onBlur={() => { setIsActive(false); }} onClick={() => { onSelected?.(); }} ref={ref} role={isSelectable ? 'button' : undefined} onKeyDown={isSelectable ? onKeyDown : undefined} tabIndex={isSelectable && !listItemProps.isDisabled ? 0 : undefined} > {children}
  • ); }, );