@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.
47 lines (46 loc) • 1.53 kB
JavaScript
;
'use client';
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useCompositeItem = useCompositeItem;
var React = _interopRequireWildcard(require("react"));
var _useMergedRefs = require("@base-ui-components/utils/useMergedRefs");
var _CompositeRootContext = require("../root/CompositeRootContext");
var _useCompositeListItem = require("../list/useCompositeListItem");
function useCompositeItem(params = {}) {
const {
highlightItemOnHover,
highlightedIndex,
onHighlightedIndexChange
} = (0, _CompositeRootContext.useCompositeRootContext)();
const {
ref,
index
} = (0, _useCompositeListItem.useCompositeListItem)(params);
const isHighlighted = highlightedIndex === index;
const itemRef = React.useRef(null);
const mergedRef = (0, _useMergedRefs.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
};
}