UNPKG

@base-ui-components/react

Version:

Base UI is a library of headless ('unstyled') React components and low-level hooks. You gain complete control over your app's CSS and accessibility features.

41 lines (40 loc) 1.23 kB
'use client'; import * as React from 'react'; import { useMergedRefs } from '@base-ui-components/utils/useMergedRefs'; import { useCompositeRootContext } from "../root/CompositeRootContext.js"; import { useCompositeListItem } from "../list/useCompositeListItem.js"; export function useCompositeItem(params = {}) { const { highlightItemOnHover, highlightedIndex, onHighlightedIndexChange } = useCompositeRootContext(); const { ref, index } = useCompositeListItem(params); const isHighlighted = highlightedIndex === index; const itemRef = React.useRef(null); const mergedRef = useMergedRefs(ref, itemRef); const compositeProps = React.useMemo(() => ({ tabIndex: isHighlighted ? 0 : -1, onFocus() { onHighlightedIndexChange(index); }, onMouseMove() { const item = itemRef.current; if (!highlightItemOnHover || !item) { return; } const disabled = item.hasAttribute('disabled') || item.ariaDisabled === 'true'; if (!isHighlighted && !disabled) { item.focus(); } } }), [isHighlighted, onHighlightedIndexChange, index, highlightItemOnHover]); return { compositeProps, compositeRef: mergedRef, index }; }