Floating List
Provides the ability to create composable children APIs for list components
import {FloatingList, useListItem} from '@floating-ui/react';This is useful to prevent the need to keep track of a list item’s
index for useListNavigation or
useTypeahead.
Manually specifying an index poses problems when wrapper tags surround list items, such as with grouping.
An example of a composable children API looks like the following,
where <Select> does not receive an array prop but rather
children:
<Select>
  <OptionGroup label="Fruits">
    <Option>Apple</Option>
    <Option>Strawberry</Option>
    <Option>Banana</Option>
  </OptionGroup>
  <OptionGroup label="Vegetables">
    <Option>Carrot</Option>
    <Option>Green Peas</Option>
    <Option>Cauliflower</Option>
  </OptionGroup>
</Select>Examples
Usage
FloatingList
This component is a context provider that receives two props:
- elementsRef — 
useListNavigation()’slistRefprop (array of elements). - labelsRef — 
useTypeahead()’slistRefprop (array of strings; optional). 
const elementsRef = useRef([]);
const labelsRef = useRef([]);
 
const listNav = useListNavigation(context, {
  listRef: elementsRef,
});
const typeahead = useTypeahead(context, {
  listRef: labelsRef,
});
 
return (
  <FloatingList elementsRef={elementsRef} labelsRef={labelsRef}>
    {/* floating element with list item children */}
  </FloatingList>
);useListItem()
This Hook is used to register a list item and its index (DOM
position) in the FloatingList. It returns two properties:
ref and index.
function Option() {
  const {activeIndex} = useSelectContext();
  const {ref, index} = useListItem();
 
  const isActive = activeIndex === index;
 
  return <div ref={ref} tabIndex={isActive ? 0 : -1} />;
}The Hook optionally accepts a label prop, which is used to
determine the string that can be matched with typeahead:
function Option({label}) {
  const {activeIndex} = useSelectContext();
  const {ref, index} = useListItem({
    label,
  });
 
  // ...
}The label can be null for disabled items, which will be
ignored for typeahead.