@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
JavaScript
'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
};
}