Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

List - initial implementation #29760

Merged
merged 151 commits into from Mar 28, 2024
Merged
Show file tree
Hide file tree
Changes from 147 commits
Commits
Show all changes
151 commits
Select commit Hold shift + click to select a range
24f85f2
React Components V9: List - initial commit
george-cz Sep 1, 2023
33ba3aa
list wip, selection works
george-cz Sep 19, 2023
9652c2b
remove selection logic, update overflowin example
george-cz Oct 13, 2023
d3ecd34
extend docs, rename
george-cz Oct 13, 2023
d317d07
improve the whole story, especially virtualized list
george-cz Oct 16, 2023
4a2926b
update virtualized actionable desc
george-cz Oct 16, 2023
4377de3
Replace button slot with ListItemButton component
george-cz Oct 31, 2023
ecd54a3
remove focusable prop, update docs
george-cz Oct 31, 2023
e7ff8e8
fix storeis
george-cz Oct 31, 2023
cd87545
example list multiple actions
george-cz Oct 31, 2023
980fba1
Revert "remove selection logic, update overflowin example"
george-cz Nov 1, 2023
942b2c8
internal selection state handling
george-cz Nov 1, 2023
6deefb5
continue work on selection
george-cz Nov 1, 2023
6635c23
actually render li, rename
george-cz Nov 2, 2023
9ff61fa
controlled wip
george-cz Nov 2, 2023
75b9f75
checkmark, defaultSelected
george-cz Nov 3, 2023
9d5478b
docs
george-cz Nov 3, 2023
2eb24a8
tokens
george-cz Nov 3, 2023
eabf9ac
A lot of optimizations
george-cz Nov 6, 2023
0334feb
Merge remote-tracking branch 'upstream' into jirivyhnalek/selectable_…
george-cz Nov 6, 2023
af7aee1
Merge remote-tracking branch 'upstream' into jirivyhnalek/selectable_…
george-cz Nov 6, 2023
829dd73
changelog
george-cz Nov 6, 2023
bb03846
yarnlock
george-cz Nov 6, 2023
aea3ccc
bump outdated deps
george-cz Nov 6, 2023
78c75c5
api
george-cz Nov 6, 2023
91d3fbf
kick off spec, add MIGRATION.md
george-cz Nov 7, 2023
4f5d7db
Merge remote-tracking branch 'upstream/master' into jirivyhnalek/sele…
george-cz Nov 8, 2023
7b79c8c
revert change in react/utilities/index.ts
george-cz Nov 9, 2023
6116734
unused import
george-cz Nov 9, 2023
dcba5bb
remove unused file
george-cz Nov 9, 2023
bec92dd
Merge remote-tracking branch 'upstream/master' into jirivyhnalek/sele…
george-cz Nov 9, 2023
8f4b783
Replace ListLayout enum with a string literal
george-cz Nov 20, 2023
bf54418
Replace IList with ListComponentRef
george-cz Nov 20, 2023
a51d048
remove todos, replace styles with resetStyles
george-cz Nov 20, 2023
782fe5b
remove more todos
george-cz Nov 20, 2023
d9743e2
dont spread selection props unless selection is enabled
george-cz Nov 20, 2023
6fd6224
fix unnecessary ul/li in exmample
george-cz Nov 20, 2023
e9379f2
remove dl,dt,dd
george-cz Nov 20, 2023
d492c92
fix story
george-cz Nov 20, 2023
6e86bed
remove external data provders for names and countries
george-cz Nov 20, 2023
77ea0ef
remove decorator
george-cz Nov 21, 2023
937d61a
update selection logic, controlled/uncontrolled
george-cz Nov 21, 2023
14fb255
remove useListFeatures
george-cz Nov 21, 2023
dca63e7
get rid of getListPros and getListItemProps
george-cz Nov 21, 2023
2a4fa8c
Add validation for proper use of elements
george-cz Nov 22, 2023
a6006ec
remove customArrowNavigationOptions, let the user have full responsib…
george-cz Nov 22, 2023
e9e7298
remove item registration/deregistration logic
george-cz Nov 22, 2023
dcbb0af
remove unused items
george-cz Nov 22, 2023
942e611
Merge remote-tracking branch 'upstream/master' into jirivyhnalek/sele…
george-cz Nov 22, 2023
fa315de
remove unused items, fix compiler
george-cz Nov 22, 2023
e3bcb1d
bump dep versions to latest
george-cz Nov 22, 2023
b320476
tsconfig.base update
george-cz Nov 22, 2023
35f7ca4
Merge remote-tracking branch 'upstream/master' into jirivyhnalek/sele…
george-cz Nov 22, 2023
5964704
remove gitkeep
george-cz Nov 22, 2023
a9a459c
bad merge
george-cz Nov 22, 2023
48ff239
fix story
george-cz Nov 22, 2023
c860acc
Redesign completely the ListItemButton component, fix tests
george-cz Nov 27, 2023
a6151fc
API fix
george-cz Nov 27, 2023
0413fa4
remove outdated story
george-cz Nov 27, 2023
d5780de
fix tsc
george-cz Nov 27, 2023
00e777f
update stories to be memoized
george-cz Nov 27, 2023
cb1aae6
selection stories
george-cz Nov 27, 2023
2232eb8
Merge branch 'master' into jirivyhnalek/selectable_list
george-cz Nov 27, 2023
b73ef78
Update .github/CODEOWNERS
george-cz Nov 27, 2023
ee81b17
selectable determines mouse cursor instead of onClick
george-cz Nov 28, 2023
e33c2f4
PR feedback
george-cz Nov 28, 2023
d8c9c25
pr feedback from Shift, round 1
george-cz Nov 29, 2023
38841fb
pr feedback
george-cz Nov 29, 2023
0825b5f
api
george-cz Nov 29, 2023
c49ca57
big progress on complex lists
george-cz Feb 6, 2024
34be3d1
update stories
george-cz Feb 6, 2024
e88dbab
build stories for list
george-cz Feb 7, 2024
9c5af8c
Merge remote-tracking branch 'upstream/master' into jirivyhnalek/sele…
george-cz Feb 12, 2024
9e8e491
icons package
george-cz Feb 12, 2024
cb2cf8b
List a11y document
george-cz Feb 12, 2024
bcb72b4
remove duplicate dep
george-cz Feb 12, 2024
36e98ca
update deps
george-cz Feb 12, 2024
39234d0
fix build
george-cz Feb 12, 2024
52ad1a5
typo
george-cz Feb 12, 2024
16aebd6
remove unused stories, fix ssr test build
george-cz Feb 12, 2024
da29fc5
fix build
george-cz Feb 13, 2024
165ac90
api, change
george-cz Feb 13, 2024
0ad45ea
unprivate list
george-cz Feb 13, 2024
a6b633d
change - list unprivate
george-cz Feb 13, 2024
18c366e
update document, fix examples, add one more example
george-cz Feb 14, 2024
e652225
remove unused stories
george-cz Feb 14, 2024
d579247
spacebar toggles, but enter has different action, cleanup commented code
george-cz Feb 15, 2024
fb07223
dont toggle selection by pressing enter
george-cz Feb 15, 2024
7196216
remove focusableItems prop, remove horizontal/grid layout
george-cz Feb 16, 2024
91dfadb
Merge remote-tracking branch 'upstream/master' into jirivyhnalek/sele…
george-cz Feb 16, 2024
aaf055c
fix broken tab that should move to next focusable from the list item
george-cz Feb 19, 2024
9db5af1
update all stories and docs
george-cz Feb 19, 2024
c7576ea
Remove ListItemButton completely
george-cz Feb 19, 2024
e4c494e
fix label for single action list
george-cz Feb 20, 2024
5d193a7
Merge remote-tracking branch 'upstream/master' into jirivyhnalek/sele…
george-cz Feb 20, 2024
2e75a91
cleaned up examples, used more descriptive alerts
george-cz Feb 21, 2024
41cba52
toggle item on Enter if default hasn't been prevented
george-cz Feb 21, 2024
e0c875d
update the activeElement story to change selection n focus
george-cz Feb 21, 2024
0f111f9
use tabster custom events to navigate to next/prev item
george-cz Feb 22, 2024
35a10ac
remove unused destruct
george-cz Feb 22, 2024
d2051dd
this should not be here
george-cz Feb 23, 2024
6cd03b4
update research doc
george-cz Feb 27, 2024
cfd38f7
unit tests for List
george-cz Feb 27, 2024
586b919
add cypress tests to validate keyboard nav
george-cz Feb 27, 2024
e2381d7
remove selectable prop, as it is redundant
george-cz Feb 28, 2024
d0d4611
replace custom focus logic with tabster events
george-cz Feb 28, 2024
91b697b
add more tests
george-cz Feb 28, 2024
c8416bf
add tests for custom aria roles
george-cz Feb 28, 2024
4250a33
test snapshots of selectable/multiselectable
george-cz Feb 29, 2024
78bf29b
fix one story
george-cz Mar 4, 2024
b0a81ca
automatically defer proper aria roles
george-cz Mar 4, 2024
a4adc8d
only pass onClick if it actually does something
george-cz Mar 5, 2024
18bc954
Merge remote-tracking branch 'upstream/master' into jirivyhnalek/sele…
george-cz Mar 5, 2024
2b6623c
bump list deps to latest
george-cz Mar 5, 2024
df210bd
update changelog for removed ListItemButton
george-cz Mar 5, 2024
92f0c28
Remove export from react-components
george-cz Mar 6, 2024
79c1ba5
remove obsolete change record
george-cz Mar 6, 2024
73930df
remove suggestion to user aria-roledescription
george-cz Mar 6, 2024
1cadc6c
Merge remote-tracking branch 'upstream/master' into jirivyhnalek/sele…
george-cz Mar 18, 2024
503c379
bump deps
george-cz Mar 18, 2024
5e80112
yarn.lock
george-cz Mar 18, 2024
a5e67e9
fix bad merge
george-cz Mar 18, 2024
5c68e10
Merge branch 'master' into jirivyhnalek/selectable_list
george-cz Mar 19, 2024
6c4364d
PR feedback round 1
george-cz Mar 19, 2024
5040ace
update stories - do not promote use of style prop
george-cz Mar 19, 2024
a52855f
feedback from Ling: round 1
george-cz Mar 19, 2024
890ba51
revert breaking change
george-cz Mar 20, 2024
08483bd
Add navigable prop to List instead of relying on eventHandlers
george-cz Mar 20, 2024
4be0c79
rely on navigable instead of hasCustomClick
george-cz Mar 20, 2024
f78f898
rework active element example to less resemble tab interface
george-cz Mar 20, 2024
03647f9
add navigationMode prop and infer roles from it
george-cz Mar 22, 2024
bc76824
update warnings
george-cz Mar 22, 2024
1872a0f
update tests
george-cz Mar 22, 2024
c9f26d3
all validations happen in List for all ListItems
george-cz Mar 22, 2024
17538ac
reverts
george-cz Mar 22, 2024
7d892c7
update desc and best practices
george-cz Mar 25, 2024
9ca0171
update docs and warnings
george-cz Mar 25, 2024
433cacc
enable event propagation when custom onClick is passed
george-cz Mar 25, 2024
9b5922c
remove obsolete change record
george-cz Mar 25, 2024
ce5cb8e
use onAction instead of onClick
george-cz Mar 26, 2024
e13eaab
migration doc update
george-cz Mar 26, 2024
fd2a63a
api
george-cz Mar 26, 2024
80929f8
unused import in test
george-cz Mar 26, 2024
85e62b9
Update packages/react-components/react-list-preview/src/components/Li…
george-cz Mar 27, 2024
1ad70a4
refactor onKeyDown based on suggestions
george-cz Mar 27, 2024
56d9936
remove useListSelection, update stories as discussed
george-cz Mar 27, 2024
1f55f47
Merge branch 'master' into jirivyhnalek/selectable_list
george-cz Mar 27, 2024
0e5465c
prepare for a separate release
george-cz Mar 28, 2024
8a74d65
update stories
george-cz Mar 28, 2024
ccb10f1
Bernardos feedback
george-cz Mar 28, 2024
4cd3e7f
Merge branch 'master' into jirivyhnalek/selectable_list
george-cz Mar 28, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions apps/public-docsite-v9/package.json
bsunderhus marked this conversation as resolved.
Show resolved Hide resolved
Expand Up @@ -34,6 +34,7 @@
"@fluentui/react-storybook-addon": "*",
"@fluentui/react-storybook-addon-export-to-sandbox": "*",
"@fluentui/theme-designer": "*",
"@fluentui/react-list-preview": "*",
"@fluentui/react-search-preview": "*",
"@fluentui/react-swatch-picker-preview": "*",
"@fluentui/react-motion-preview": "*",
Expand Down
@@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "List: unmark private",
"packageName": "@fluentui/react-list-preview",
"email": "jirivyhnalek@microsoft.com",
"dependentChangeType": "patch"
}
@@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "deprecate unused ListItemButton exports",
"packageName": "@fluentui/react-shared-contexts",
"email": "jirivyhnalek@microsoft.com",
"dependentChangeType": "patch"
}
@@ -1 +1,3 @@
/** Jest test setup file. */

require('@testing-library/jest-dom');
@@ -0,0 +1,3 @@
import { baseConfig } from '@fluentui/scripts-cypress';

export default baseConfig;
243 changes: 243 additions & 0 deletions packages/react-components/react-list-preview/docs/ListA11y.md

Large diffs are not rendered by default.

203 changes: 203 additions & 0 deletions packages/react-components/react-list-preview/docs/MIGRATION.md
@@ -0,0 +1,203 @@
# List migration

## Migration from v8

### Composition over configuration

Compared to its v8 counterpart, the v9 `List` uses composition over configuration when it comes to rendering items, same as other components in Fluent UI React v9. This means that instead of passing an array of items to the `List` component, it's up to you to render `ListItem` components with appropriate content.

Take this example in v8:

```js
const items = [{ name: 'John' }, { name: 'Alice' }];

const MyList = () => {
return <List items={items} />;
};
```

becomes this in v9:

```js
const items = [{ name: 'John' }, { name: 'Alice' }];

const MyList = () => {
return (
<List>
{items.map(item => {
<ListItem key={item}>{item}</ListItem>;
})}
</List>
);
};
```

### Virtualization approach

Virtualization is **not part** of `List` in Fluent UI React v9. We don't want to force any particular solution for virtualization, but we provide [examples](https://react.fluentui.dev/?path=/story/preview-components-list--virtualized-list-with-actionable-items) how to use `List` with a popular library `react-window` to get the desired effect.

This makes the API of `List` much simpler.

### v8 Property mapping

Most of the v8 props are for it's virtualization functionality. Since the v9 `List` takes a different approach, most of the props cannot be directly migrated.

| v8 List | v9 List |
| ------------------------- | -------------------------------- |
| `className` | `className` |
| `componentRef` | `componentRef` |
| `getItemCountForPage` | N/A |
| `getKey` | N/A as you control the ListItems |
| `getPageHeight` | N/A |
| `getPageSpecification` | N/A |
| `getPageStyle` | N/A |
| `ignoreScrollingState` | N/A |
| `items` | render `<ListItem>` instead |
| `onPageAdded` | N/A |
| `onPagesUpdated` | N/A |
| `onRenderCell` | N/A |
| `onRenderCellConditional` | N/A |
| `onRenderPage` | N/A |
| `onRenderRoot` | N/A |
| `onRenderSurface` | N/A |
| `onShouldVirtualize` | N/A |
| `renderCount` | N/A |
| `renderEarly` | N/A |
| `renderedWindowsAhead` | N/A |
| `renderedWindowsBehind` | N/A |
| `role` | `role` |
| `startIndex` | N/A |
| `usePageCache` | N/A |
| `version` | N/A |
| - | `defaultSelectedItems` |
| - | `onSelectionChange` |
| - | `selectionMode` |

## Migration from v0

### Composition, also known as "Children API"

In Fluent UI React v9 we prefer to use composition over configuration where possible. List is no exception. the v0 list also supports composition API under a name of "Children API".

#### Children API component mapping

Migrating from a v9 Children API to v9 composition API is quite straighforward. You can replace the components like this:

- Use v9 `List` instead of v0 `List`
- Use v9 `ListItem` instead of v0 `List.Item`

For props please refer to [Property mapping](#v0-property-mapping) section.

#### Shorthand API

For Shorthand API things are a bit more complicated, as your code needs to me updated to use composition.

Take this example in v0:

```js
const items = [
{
key: 'robert',
header: 'Robert Tolbert',
content: 'Program the sensor to the SAS alarm through the haptic SQL card!',
},
{
key: 'celeste',
header: 'Celeste Burton',
content: 'Use the online FTP application to input the multi-byte application!',
},
];

const MyList = () => {
return <List items={items} />;
};
```

becomes this in v9:

```js
const items = [
{
key: 'robert',
header: 'Robert Tolbert',
content: 'Program the sensor to the SAS alarm through the haptic SQL card!',
},
{
key: 'celeste',
header: 'Celeste Burton',
content: 'Use the online FTP application to input the multi-byte application!',
},
];

const MyList = () => {
return (
<List>
{items.map(item => {
<ListItem key={item.key}>
<h2>{item.header}</h2>
<p>{item.content}></p>
</ListItem>;
})}
</List>
);
};
```

### v0 Property mapping

Compared to its v0 counterpart, the v9 List implementation is much more generic and it **doesn't have any opinion** on how it's content should look like. This means that you will **not** find layout specific props like `header`, `headerMedia`, `content` or layout specific components. This allows for much more flexible use of the component.

We recommend using a component like `Persona` where possible, or creating a custom layout component where necessary.

#### List

| v0 List | v9 List |
| ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `accessibility` | built in, customize with `useArrowNavigationGroup` from `tabster` |
| `as` | `as` |
| `className` | `className` |
| `debug` | N/A |
| `defaultSelectedIndex` | `defaultSelectedItems` |
| `design` | N/A |
| `horizontal` | N/A - will be added in the future |
| `items` | N/A - use `ListItem` components as Children |
| `navigable` | `navigable` |
| `onSelectedIndexChange` | `onSelectionChange` |
| `ref` | `ref` |
| `selectable` | use `selectionMode` of value `single` or `multiselect` |
| `selectedIndex` | only in controlled mode, use `selection` state; see [example](https://react.fluentui.dev/?path=/story/preview-components-list--list-selection-controlled). |
| `styles` | use slots in combination with `className` |
| `truncateContent` | N/A - the `List` is not concerned about it's content |
| `truncateHeader` | N/A - the `List` is not concerned about it's content |
| `variables` | N/A - use slots in combination with `className` |
| `wrap` | N/A - the `List` is not concerned about it's content |

#### ListItem

| v0 ListItem | v9 ListItem |
| ----------------- | ------------------------------------------------------------------------------------- |
| `accessibility` | N/A |
| `as` | `as` |
| `className` | `className` |
| `content` | N/A - use children |
| `contentMedia` | N/A - use children |
| `debug` | N/A |
| `design` | N/A |
| `endMedia` | N/A - use children |
| `header` | N/A - use children |
| `headerMedia` | N/A - use children |
| `important` | N/A |
| `index` | N/A |
| `media` | N/A - use children |
| `navigable` | N/A - use `tabIndex={0}` or `navigable` on the `List` |
| `onClick` | `onAction` |
| `ref` | ref |
| `selectable` | N/A - use `List` props like `selectionMode`, `selectedItems` and `onSelectionChange` |
| `selected` | N/A - use `selectedItems` (or tracked internally when `defaultSelectedItems` is used) |
| `styles` | N/A - use `className` for any slot |
| `truncateContent` | N/A - the `List` is not concerned about it's content |
| `truncateHeader` | N/A - the `List` is not concerned about it's content |

#### Other

Other components like `ListItemContent`, `ListItemContentMedia`, `ListItemEndMedia`, `ListItemHeader`,`ListItemHeaderMedia` and `ListItemMedia` are _not_ currently present in v9 `List` implementation for the reasons mentioned above.
16 changes: 10 additions & 6 deletions packages/react-components/react-list-preview/docs/Spec.md
Expand Up @@ -2,15 +2,19 @@

## Background

_Description and use cases of this component_
A List is a component that displays a set of vertically stacked components.

## Prior Art
If you are displaying more than one dimension of the data, the List probably isn't the proper component to use, instead, consider using Table or DataGrid.

The List supports plain list items, interactive list items with one action or multiple actions. It also has support for single and multi selection built in. This can be utilized in either uncontrolled or controlled way.

_Include background research done for this component_
All of the List scenarios are also accessible, as the whole component was built with accessibility in mind. It is easily navigable with a keyboard and supports different screen reader applications.

## Prior Art

- _Link to Open UI research_
- _Link to comparison of v7 and v0_
- _Link to GitHub epic issue for the converged component_
- [Fluent UI v0 docs](https://fluentsite.z22.web.core.windows.net/components/list/definition)
- [Fluent UI v8 docs](https://developer.microsoft.com/en-us/fluentui#/controls/web/list)
- [Open UI research](https://open-ui.org/components/list.research/)

## Sample Code

Expand Down
Expand Up @@ -4,84 +4,78 @@

```ts

/// <reference types="react" />

import { Checkbox } from '@fluentui/react-checkbox';
import type { ComponentProps } from '@fluentui/react-utilities';
import type { ComponentState } from '@fluentui/react-utilities';
import type { EventData } from '@fluentui/react-utilities';
import type { EventHandler } from '@fluentui/react-utilities';
import type { ForwardRefComponent } from '@fluentui/react-utilities';
import * as React_2 from 'react';
import { SelectionItemId } from '@fluentui/react-utilities';
import type { SelectionMode as SelectionMode_2 } from '@fluentui/react-utilities';
import type { Slot } from '@fluentui/react-utilities';
import type { SlotClassNames } from '@fluentui/react-utilities';

// @public
// @public (undocumented)
export const List: ForwardRefComponent<ListProps>;

// @public (undocumented)
export const listClassNames: SlotClassNames<ListSlots>;

// @public
export const ListItem: ForwardRefComponent<ListItemProps>;

// @public
export const ListItemButton: ForwardRefComponent<ListItemButtonProps>;

// @public (undocumented)
export const listItemButtonClassNames: SlotClassNames<ListItemButtonSlots>;

// @public
export type ListItemButtonProps = ComponentProps<ListItemButtonSlots> & {};

// @public (undocumented)
export type ListItemButtonSlots = {
root: Slot<'div'>;
};

// @public
export type ListItemButtonState = ComponentState<ListItemButtonSlots>;
export const ListItem: ForwardRefComponent<ListItemProps>;

// @public (undocumented)
export const listItemClassNames: SlotClassNames<ListItemSlots>;

// @public
export type ListItemProps = ComponentProps<ListItemSlots> & {};
export type ListItemProps = ComponentProps<ListItemSlots> & {
value?: string | number;
onAction?: (e: ListItemActionEvent) => void;
};

// @public (undocumented)
export type ListItemSlots = {
root: Slot<'div'>;
root: NonNullable<Slot<'li', 'div'>>;
checkmark?: Slot<typeof Checkbox>;
};

// @public
export type ListItemState = ComponentState<ListItemSlots>;
export type ListItemState = ComponentState<ListItemSlots> & {
selectable: boolean;
navigable: boolean;
};

// @public
export type ListProps = ComponentProps<ListSlots> & {};
export type ListProps = ComponentProps<ListSlots> & {
navigationMode?: ListNavigationMode;
selectionMode?: SelectionMode_2;
selectedItems?: SelectionItemId[];
defaultSelectedItems?: SelectionItemId[];
onSelectionChange?: EventHandler<OnListSelectionChangeData>;
};

// @public (undocumented)
export type ListSlots = {
root: Slot<'div'>;
root: NonNullable<Slot<'ul', 'div' | 'ol'>>;
};

// @public
export type ListState = ComponentState<ListSlots>;
export type ListState = ComponentState<ListSlots> & ListContextValue;

// @public
export const renderList_unstable: (state: ListState) => JSX.Element;
export const renderList_unstable: (state: ListState, contextValues: ListContextValues) => JSX.Element;

// @public
export const renderListItem_unstable: (state: ListItemState) => JSX.Element;

// @public
export const renderListItemButton_unstable: (state: ListItemButtonState) => JSX.Element;

// @public
export const useList_unstable: (props: ListProps, ref: React_2.Ref<HTMLDivElement>) => ListState;

// @public
export const useListItem_unstable: (props: ListItemProps, ref: React_2.Ref<HTMLDivElement>) => ListItemState;

// @public
export const useListItemButton_unstable: (props: ListItemButtonProps, ref: React_2.Ref<HTMLDivElement>) => ListItemButtonState;
export const useList_unstable: (props: ListProps, ref: React_2.Ref<HTMLDivElement | HTMLUListElement>) => ListState;

// @public
export const useListItemButtonStyles_unstable: (state: ListItemButtonState) => ListItemButtonState;
export const useListItem_unstable: (props: ListItemProps, ref: React_2.Ref<HTMLLIElement | HTMLDivElement>) => ListItemState;

// @public
export const useListItemStyles_unstable: (state: ListItemState) => ListItemState;
Expand Down