@dnb/eufemia
Version:
DNB Eufemia Design System UI Library
1,471 lines (1,318 loc) • 44.4 kB
Markdown
---
title: 'List'
description: 'List is a layout component for displaying rows of content, with optional start/center/end slots and a navigable item variant.'
version: 10.104.0
generatedAt: 2026-04-17T18:46:09.882Z
checksum: cfe6a69b0b4d9a72429c007a43b5d8d0c88ee4f5e42f12ac3a9240b1625ac876
---
# List
## Import
```tsx
import { List } from '@dnb/eufemia'
```
## Description
`List` is a layout component for displaying rows of content. Use `List.Container` as the wrapper and `List.Item.Basic`, `List.Item.Action`, or `List.Item.Accordion` for each row.
- **List.Container** – Provides list context (e.g. variant) and wraps items in a vertical flex layout. Pass `separated` to insert gap between rows so each item gets its own rounding/outline instead of sharing borders.
- **List.Item.Basic** – A single row with optional `icon` and `title` props and cell children. Supports selected state, variant override, and loading states via `pending` (skeleton overlay) or `skeleton` (text placeholder).
- **List.Item.Action** – Clickable row with optional `icon` and `title` props (Enter/Space support) and a chevron icon. Use `chevronPosition="left"` or `"right"` (default) to place the chevron. Supports `pending` to show a loading overlay and disable interaction. Use `href` for navigation.
- **List.Item.Accordion** – Expandable row with optional `icon` and `title` props and `List.Item.Accordion.Content` for the expandable section. Use `open` for initial state, `chevronPosition="left"` or `"right"` (default) for chevron placement, and optional `id` for ARIA. Supports `pending` to disable toggling.
- **List.Cell.Start**, **List.Cell.Center**, **List.Cell.End**, **List.Cell.Footer** – Cell slots inside Basic/Action/Accordion for start, middle, end, and additional content.
- **List.Cell.Title** – Title block that can contain `List.Cell.Title.Overline` and `List.Cell.Title.Subline`. Use the nested helpers for structured header text, even though the drop-in `List.Cell.Title.Overline`/`List.Cell.Title.Subline` components still exist for backward compatibility.
All item components support [Space](/uilib/layout/space/properties) props (`top`, `bottom`, etc.) and forward standard HTML attributes.
## Relevant links
- [Figma](https://www.figma.com/design/cdtwQD8IJ7pTeE45U148r1/%F0%9F%92%BB-Eufemia---Web?node-id=47195-2954)
- [Source code](https://github.com/dnbexperience/eufemia/tree/main/packages/dnb-eufemia/src/components/list)
- [Docs code](https://github.com/dnbexperience/eufemia/tree/main/packages/dnb-design-system-portal/src/docs/uilib/components/list)
## Basic usage
```jsx
import { List } from '@dnb/eufemia'
render(
<List.Container>
<List.Item.Basic>Simple row</List.Item.Basic>
<List.Item.Basic title="Title" icon="bell">
<List.Cell.Start>Start</List.Cell.Start>
<List.Cell.Center>Center</List.Cell.Center>
<List.Cell.End>End</List.Cell.End>
</List.Item.Basic>
<List.Item.Basic>
<List.Cell.Center>
<List.Cell.Title>
<List.Cell.Title.Overline>Overline</List.Cell.Title.Overline>
Main title here
<List.Cell.Title.Subline>Subline</List.Cell.Title.Subline>
</List.Cell.Title>
</List.Cell.Center>
</List.Item.Basic>
<List.Item.Action
title="Click me"
icon="bell"
onClick={() => console.log('Clicked')}
>
<List.Cell.End>Value</List.Cell.End>
</List.Item.Action>
<List.Item.Action
title="Link"
icon="bell"
href="https://dnb.no"
target="_blank"
rel="noopener noreferrer"
>
<List.Cell.End>Value</List.Cell.End>
</List.Item.Action>
<List.Item.Accordion title="Expandable" icon="bell">
<List.Item.Accordion.Header>
<List.Cell.End>1234</List.Cell.End>
</List.Item.Accordion.Header>
<List.Item.Accordion.Content>
<P>Content when expanded.</P>
</List.Item.Accordion.Content>
</List.Item.Accordion>
<List.Item.Accordion title="Without explicit header" icon="bell">
<List.Item.Accordion.Content>
<P>Content when expanded.</P>
</List.Item.Accordion.Content>
</List.Item.Accordion>
</List.Container>
)
```
## Loading states
- **pending** – On `List.Item.Basic` or `List.Item.Action`: shows a skeleton overlay and disables pointer events. On `List.Item.Action`, click and keyboard are disabled (`tabIndex={-1}`, `aria-disabled`). Use while data is loading.
- **skeleton** – On `List.Item.Basic` or `List.Item.Action`: applies skeleton font styling (text placeholder) without the full overlay. Use for a lighter loading indication.
## Accessibility
- **List.Item.Action** uses `role="button"` so assistive technologies announce it as a button. It is focusable (`tabIndex={0}`) and activates on Enter and Space. When `pending` is true, it is not focusable and has `aria-disabled="true"`. You can override the role via the `role` prop (e.g. `role="link"`).
- **List.Item.Accordion** exposes full ARIA for expand/collapse: the header has `id`, `aria-controls`, and `aria-expanded`; the content region has `id`, `aria-labelledby`, `aria-hidden`, and `aria-expanded`. Pass an `id` prop for stable references, or leave it unset for an auto-generated id. When `pending` is true, the header is not focusable and has `aria-disabled="true"`.
- Use `aria-label` or other ARIA attributes on the container or items when needed for screen readers.
## Demos
### Rows with cells like Start, Center, End, Title
This example demonstrates different cell layouts and their placement.
```tsx
render(
<List.Container>
<List.Item.Basic>
<List.Cell.Start>Start</List.Cell.Start>
<List.Cell.Center>Center</List.Cell.Center>
<List.Cell.End>End</List.Cell.End>
</List.Item.Basic>
<List.Item.Basic title="Title" icon={fish_medium}>
<List.Cell.End>End</List.Cell.End>
</List.Item.Basic>
<List.Item.Basic>
<List.Cell.Title>
<List.Cell.Title.Overline>Overline</List.Cell.Title.Overline>
Title
<List.Cell.Title.Subline variant="description">
Subline
</List.Cell.Title.Subline>
</List.Cell.Title>
<List.Cell.End>End</List.Cell.End>
<List.Cell.Footer
style={{
background: 'var(--color-sand-yellow)',
}}
>
<P>Footer</P>
</List.Cell.Footer>
</List.Item.Basic>
</List.Container>
)
```
### Navigable item
```tsx
render(
<List.Container>
<List.Item.Action
icon={fish_medium}
title="Navigate to details"
onClick={() => console.log('Clicked')}
>
<List.Cell.End>
<NumberFormat currency value={1234} />
</List.Cell.End>
</List.Item.Action>
<List.Item.Action
chevronPosition="left"
title="Left aligned chevron"
onClick={() => console.log('Clicked')}
>
<List.Cell.End>
<NumberFormat currency value={1234} />
</List.Cell.End>
</List.Item.Action>
</List.Container>
)
```
### Navigable item with href
Use the `href` property on `List.Item.Action` to render a native link. Use `target` and `rel` for external links (e.g. `target="_blank"` with `rel="noopener noreferrer"`).
```tsx
render(
<List.Container>
<List.Item.Action
icon={fish_medium}
title="Link to details"
href="#details"
>
<List.Cell.End>
<NumberFormat currency value={1234} />
</List.Cell.End>
</List.Item.Action>
<List.Item.Action
icon={fish_medium}
title="External link (opens in new tab)"
href="https://eufemia.dnb.no/"
target="_blank"
rel="noopener noreferrer"
>
<List.Cell.End>
<NumberFormat currency value={5678} />
</List.Cell.End>
</List.Item.Action>
</List.Container>
)
```
### With anchor
List items containing [Anchor](/uilib/components/anchor) links.
```tsx
render(
<List.Container>
<List.Item.Basic title={<Anchor href="#">Link to page one</Anchor>} />
<List.Item.Basic
icon={fish_medium}
title={<Anchor href="#">Link with icon and end value</Anchor>}
>
<List.Cell.End>
<NumberFormat currency value={1234} />
</List.Cell.End>
</List.Item.Basic>
</List.Container>
)
```
### Accordion
Expandable list items using `List.Item.Accordion` with optional `icon` and `title` properties and `List.Item.Accordion.Content` for the expandable section. Use the `open` property to set the initial open state.
```tsx
render(
<List.Container>
<List.Item.Accordion icon={fish_medium} title="Accordion title">
<List.Item.Accordion.Header>
<List.Cell.End>
<NumberFormat currency value={1234} />
</List.Cell.End>
</List.Item.Accordion.Header>
<List.Item.Accordion.Content innerSpace>
<P>Accordion content goes here.</P>
</List.Item.Accordion.Content>
</List.Item.Accordion>
<List.Item.Accordion open title="Opened by default">
<List.Item.Accordion.Content innerSpace>
<P>This section is open initially.</P>
</List.Item.Accordion.Content>
</List.Item.Accordion>
<List.Item.Accordion
chevronPosition="left"
title="Chevron on the left"
>
<List.Item.Accordion.Header>
<List.Cell.End>
<NumberFormat currency value={1234} />
</List.Cell.End>
</List.Item.Accordion.Header>
<List.Item.Accordion.Content innerSpace>
<P>
Use <Code>chevronPosition="left"</Code> to place the chevron on
the left.
</P>
</List.Item.Accordion.Content>
</List.Item.Accordion>
</List.Container>
)
```
### With Badge
Use [Badge](/uilib/components/badge) in `List.Cell.End` to show status or counts.
```tsx
render(
<List.Container>
<List.Item.Action title="In Action Item" icon={fish_medium}>
<List.Cell.End>
<Badge content="Badge" />
</List.Cell.End>
</List.Item.Action>
<List.Item.Accordion title="In Accordion Item" icon={fish_medium}>
<List.Item.Accordion.Header>
<List.Cell.End>
<Flex.Horizontal>
<Badge
content={3}
label="Notifications"
variant="notification"
/>
<Value.Currency value={1234} />
</Flex.Horizontal>
</List.Cell.End>
</List.Item.Accordion.Header>
<List.Item.Accordion.Content innerSpace>
<P>Accordion content goes here.</P>
</List.Item.Accordion.Content>
</List.Item.Accordion>
</List.Container>
)
```
### Footer with buttons
Use `List.Cell.Footer` to place actions such as [Button](/uilib/components/button) in the list row.
```tsx
render(
<List.Container>
<List.Item.Basic title="Item with actions" icon={fish_medium}>
<List.Cell.End>
<NumberFormat currency value={1234} />
</List.Cell.End>
<List.Cell.Footer>
<Flex.Horizontal>
<Button text="Save" />
<Button variant="tertiary" text="Delete" />
</Flex.Horizontal>
</List.Cell.Footer>
</List.Item.Basic>
<List.Item.Action icon={fish_medium} title="Action item with button">
<List.Cell.End>
<Value.Currency value={5678} />
</List.Cell.End>
<List.Cell.Footer>
<Button variant="secondary" text="Open" />
</List.Cell.Footer>
</List.Item.Action>
<List.Item.Accordion chevronPosition="left" title="Accordion title">
<List.Item.Accordion.Header>
<List.Cell.End>
<NumberFormat currency value={1234} />
</List.Cell.End>
</List.Item.Accordion.Header>
<List.Cell.Footer
style={{
background: 'var(--color-sand-yellow)',
}}
>
<Button variant="tertiary" text="Next" icon="chevron_right" />
</List.Cell.Footer>
<List.Item.Accordion.Content innerSpace>
<P>Accordion content goes here.</P>
</List.Item.Accordion.Content>
</List.Item.Accordion>
</List.Container>
)
```
### Responsive Grid Layout
Using [Grid.Container](/uilib/layout/grid/container) with [Grid.Item](/uilib/layout/grid/item) for a 12-column responsive grid.
```tsx
render(
<Grid.Container
rowGap
columnGap
style={{
marginInline: 'auto',
maxInlineSize: 'var(--layout-medium)',
}}
>
<Grid.Item
span={{
small: 'full',
medium: [1, 4],
large: [5, 12],
}}
>
<List.Container>
<List.Item.Action icon={fish_medium} title="Navigate to details">
<List.Cell.End>
<NumberFormat currency value={1234} />
</List.Cell.End>
</List.Item.Action>
<List.Item.Action icon={fish_medium} title="Navigate to details">
<List.Cell.End>
<NumberFormat currency value={1234} />
</List.Cell.End>
</List.Item.Action>
</List.Container>
</Grid.Item>
<Grid.Item
span={{
small: 'full',
medium: [5, 6],
large: [1, 4],
}}
style={{
display: 'gid',
placeContent: 'center',
textAlign: 'center',
background: 'var(--color-sand-yellow)',
}}
>
<P>Second Grid Item</P>
</Grid.Item>
</Grid.Container>
)
```
### Separated lists
Use the `separated` property on `List.Container` to add row gap between list items.
```tsx
render(
<List.Container separated>
<List.Item.Basic icon={fish_medium} title="Title 1">
<List.Cell.End>
<Value.Currency value={1234} />
</List.Cell.End>
</List.Item.Basic>
<List.Item.Basic icon={fish_medium} title="Title 2">
<List.Cell.End>
<Value.Currency value={4567} />
</List.Cell.End>
</List.Item.Basic>
</List.Container>
)
```
### Dynamic list
```tsx
const myList = [
{
name: 'List item 1',
amount: 10000,
},
{
name: 'List item 2',
amount: 5000,
},
{
name: 'List item 3',
amount: 7500,
},
]
render(
<List.Container>
{myList.map((account) => (
<List.Item.Basic key={account.name} title={account.name}>
<List.Cell.End>
<Value.Currency value={account.amount} />
</List.Cell.End>
</List.Item.Basic>
))}
</List.Container>
)
```
### With DateFormat
Use [DateFormat](/uilib/components/date-format) in `List.Cell.Start` to show dates in the list row.
```tsx
render(
<List.Container>
<List.Item.Basic title="In Basic Item">
<List.Cell.Start fontSize="small">
<DateFormat
value={new Date('2026-02-07')}
dateStyle="medium"
hideCurrentYear
/>
</List.Cell.Start>
<List.Cell.End>
<Value.Currency value={1234} />
</List.Cell.End>
</List.Item.Basic>
<List.Item.Action>
<List.Cell.Title>
<List.Cell.Title.Overline>
<DateFormat
value={new Date('2026-02-07')}
dateStyle="medium"
hideCurrentYear
/>
</List.Cell.Title.Overline>
In Action Item
</List.Cell.Title>
<List.Cell.End>
<Value.Currency value={5678} />
</List.Cell.End>
</List.Item.Action>
<List.Item.Accordion>
<List.Item.Accordion.Header>
<List.Cell.Title>
<List.Cell.Title.Overline>
<DateFormat
value={new Date('2026-02-07')}
dateStyle="medium"
hideCurrentYear
/>
</List.Cell.Title.Overline>
In Accordion Item
</List.Cell.Title>
<List.Cell.End>
<Value.Currency value={1234} />
</List.Cell.End>
</List.Item.Accordion.Header>
<List.Item.Accordion.Content innerSpace>
<P>
Use <Code>chevronPosition="left"</Code> to place the chevron on
the left.
</P>
</List.Item.Accordion.Content>
</List.Item.Accordion>
</List.Container>
)
```
### With Subline
Use `List.Cell.Title.Subline` to add supporting text below the title. The `variant="description"` option uses smaller text for secondary information.
```tsx
render(
<List.Container>
<List.Item.Action icon={fish_medium}>
<List.Cell.Title>
<span>Item 1</span>
<List.Cell.Title.Subline>
<DateFormat
value={new Date('2026-02-07')}
dateStyle="medium"
hideCurrentYear
/>
</List.Cell.Title.Subline>
</List.Cell.Title>
<List.Cell.End>
<Value.Currency value={5678} />
</List.Cell.End>
</List.Item.Action>
<List.Item.Accordion icon={fish_medium}>
<List.Item.Accordion.Header>
<List.Cell.Title>
<span>Item 2</span>
<List.Cell.Title.Subline>Detail 1</List.Cell.Title.Subline>
<List.Cell.Title.Subline variant="description">
Detail 2
</List.Cell.Title.Subline>
<List.Cell.Title.Subline>
<Flex.Horizontal rowGap="x-small">
<Badge status="neutral" subtle content="Detail 3" />
<Badge status="neutral" subtle content="Detail 3" />
</Flex.Horizontal>
</List.Cell.Title.Subline>
</List.Cell.Title>
<List.Cell.End>
<Value.Currency value={5678} />
</List.Cell.End>
</List.Item.Accordion.Header>
<List.Item.Accordion.Content innerSpace>
<P>Accordion content goes here.</P>
</List.Item.Accordion.Content>
</List.Item.Accordion>
<List.Item.Action title="Title" icon={fish_medium}>
<List.Cell.End>
<Value.Currency value={5678} />
<List.Cell.Title.Subline variant="description">
Subline
</List.Cell.Title.Subline>
</List.Cell.End>
</List.Item.Action>
</List.Container>
)
```
### With form elements
Use [Field.Selection](/uilib/extensions/forms/base-fields/Selection/) and [Field.ArraySelection](/uilib/extensions/forms/base-fields/ArraySelection/) render prop children to compose list rows and `selected` state.
Place them inside `List.Cell.Start` to align them to the left side of the list row.
```tsx
render(
<Form.Handler
defaultData={{
mySelection: 'bar',
myArraySelection: ['bar'],
myDataPath: [
{
value: 'foo',
title: 'Foo!',
amount: 1234,
},
{
value: 'bar',
title: 'Baar!',
amount: 5678,
},
{
value: 'baz',
title: 'Baz!',
amount: 9999,
},
],
}}
>
<Flex.Stack>
<Field.Selection
label="Single choice"
variant="radio"
path="/mySelection"
dataPath="/myDataPath"
width="large"
>
{({ value: selectedValue, options = [] }) => {
return (
<List.Container>
{options.map(({ value, title, amount }) => {
return (
<List.Item.Basic
key={value}
selected={value === selectedValue}
>
<List.Cell.Start>
<Field.Option value={value} title={title} />
</List.Cell.Start>
<List.Cell.End>
<Value.Currency value={amount} />
</List.Cell.End>
</List.Item.Basic>
)
})}
</List.Container>
)
}}
</Field.Selection>
<Field.ArraySelection
label="Multiple choice"
variant="checkbox"
path="/myArraySelection"
dataPath="/myDataPath"
width="large"
>
{({ value = [], options = [] }) => {
return (
<List.Container>
{options.map(({ value: optionValue, title, amount }) => {
return (
<List.Item.Basic
key={optionValue}
selected={value.includes(optionValue)}
>
<List.Cell.Start>
<Field.Option value={optionValue} title={title} />
</List.Cell.Start>
<List.Cell.End>
<Value.Currency value={amount} />
</List.Cell.End>
</List.Item.Basic>
)
})}
</List.Container>
)
}}
</Field.ArraySelection>
</Flex.Stack>
</Form.Handler>
)
```
### With avatar
Use [Avatar](/uilib/components/avatar) in `List.Cell.Start` as the left content.
```tsx
render(
<List.Container>
<List.Item.Basic title="Alice Andersen">
<List.Cell.Start>
<Avatar size="medium">A</Avatar>
</List.Cell.Start>
<List.Cell.End>
<NumberFormat currency value={1234} />
</List.Cell.End>
</List.Item.Basic>
<List.Item.Action title="Bob Berg" onClick={() => {}}>
<List.Cell.Start>
<Avatar size="medium">B</Avatar>
</List.Cell.Start>
<List.Cell.End>
<Value.Currency value={5678} />
</List.Cell.End>
</List.Item.Action>
<List.Item.Accordion title="Carol with image">
<List.Item.Accordion.Header>
<List.Cell.Start>
<Avatar size="medium">C</Avatar>
</List.Cell.Start>
<List.Cell.End>Value</List.Cell.End>
</List.Item.Accordion.Header>
<List.Item.Accordion.Content innerSpace>
<P>Content goes here.</P>
</List.Item.Accordion.Content>
</List.Item.Accordion>
</List.Container>
)
```
### Selected state
Provide the `selected` property on `List.Item.Basic` for selectable rows. When a **checkbox** or **radio** is nested inside the row, this also enables the full-row hit area behavior.
```tsx
render(
<List.Container>
<List.Item.Basic>Normal row</List.Item.Basic>
<List.Item.Basic selected>Selected row</List.Item.Basic>
<List.Item.Basic>Another normal row</List.Item.Basic>
</List.Container>
)
```
### With custom background color
```tsx
render(
<List.Container>
<List.Item.Basic>Normal row</List.Item.Basic>
<List.Item.Basic
style={{
['--item-background-color' as string]:
'var(--color-mint-green-12)',
}}
>
Custom background color (not selected)
</List.Item.Basic>
<List.Item.Basic>Another normal row</List.Item.Basic>
</List.Container>
)
```
### Pending state
Use the `pending` property on `List.Item.Basic` or `List.Item.Action` to show a skeleton overlay. Click and keyboard are disabled while pending.
```tsx
render(
<List.Container>
<List.Item.Action icon={fish_medium} title="Pending item ..." pending>
<List.Cell.End>
<NumberFormat currency value={1234} />
</List.Cell.End>
</List.Item.Action>
</List.Container>
)
```
### Progress indicator
A single list item with a circular progress indicator in `List.Cell.Start`.
```tsx
render(
<List.Container>
<List.Item.Basic>
<List.Cell.Start>
<ProgressIndicator
size="medium"
showDefaultLabel
labelDirection="horizontal"
/>
</List.Cell.Start>
</List.Item.Basic>
</List.Container>
)
```
### Skeleton
Use the `skeleton` property on `List.Item.Basic`, `List.Item.Action` or `List.Item.Accordion` to show a skeleton overlay while content is loading.
```tsx
render(
<List.Container>
<List.Item.Action icon={fish_medium} title="Loading item…" skeleton>
<List.Cell.End>
<NumberFormat currency value={1234} />
</List.Cell.End>
</List.Item.Action>
</List.Container>
)
```
### Inside a Card
Use `List.Card` to wrap a list inside a [Card](/uilib/components/card) with built-in styling. Add `List.ScrollView` for a scrollable area with a `maxVisibleListItems` property.
```tsx
render(
<List.Card>
<Heading size="medium">Transactions</Heading>
<List.ScrollView maxVisibleListItems={4}>
<List.Container>
<List.Item.Action icon={fish_medium} title="Payment received">
<List.Cell.End>
<Value.Currency value={1234} />
</List.Cell.End>
</List.Item.Action>
<List.Item.Action icon={fish_medium} title="Transfer sent">
<List.Cell.End>
<Value.Currency value={-500} />
</List.Cell.End>
</List.Item.Action>
<List.Item.Action icon={fish_medium} title="Subscription">
<List.Cell.End>
<Value.Currency value={-99} />
</List.Cell.End>
</List.Item.Action>
<List.Item.Action icon={fish_medium} title="Refund">
<List.Cell.End>
<Value.Currency value={250} />
</List.Cell.End>
</List.Item.Action>
<List.Item.Action icon={fish_medium} title="Salary">
<List.Cell.End>
<Value.Currency value={45000} />
</List.Cell.End>
</List.Item.Action>
<List.Item.Action icon={fish_medium} title="Groceries">
<List.Cell.End>
<Value.Currency value={-320} />
</List.Cell.End>
</List.Item.Action>
</List.Container>
</List.ScrollView>
</List.Card>
)
```
#### Without ScrollView
`List.Card` also works without `List.ScrollView`. Side borders and redundant top/bottom borders on the first and last items are automatically removed.
```tsx
render(
<List.Card>
<List.Container>
<List.Item.Action
icon={fish_medium}
title="Payment received"
onClick={() => {}}
>
<List.Cell.End>
<Value.Currency value={1234} />
</List.Cell.End>
</List.Item.Action>
<List.Item.Action
icon={fish_medium}
title="Transfer sent"
onClick={() => {}}
>
<List.Cell.End>
<Value.Currency value={-500} />
</List.Cell.End>
</List.Item.Action>
<List.Item.Basic icon={fish_medium} title="Subscription">
<List.Cell.End>
<Value.Currency value={-99} />
</List.Cell.End>
</List.Item.Basic>
</List.Container>
</List.Card>
)
```
## List.Container
```json
{
"props": {
"separated": {
"doc": "When `true`, adds row gap between items so each row keeps its own outline and border radius instead of running edge-to-edge.",
"type": "boolean",
"status": "optional"
},
"skeleton": {
"doc": "When `true`, applies skeleton font styling to all child items. Individual items can override this with their own `skeleton` prop.",
"type": "boolean",
"status": "optional"
},
"disabled": {
"doc": "When `true`, all child items are visually dimmed and interaction is prevented. Individual items can override this with their own `disabled` prop.",
"type": "boolean",
"status": "optional"
},
"children": {
"doc": "List items. Use `List.Item.Basic`, `List.Item.Action`, or `List.Item.Accordion` as direct children.",
"type": "React.ReactNode",
"status": "required"
},
"[Space](/uilib/layout/space/properties)": {
"doc": "Spacing properties like `top` or `bottom` are supported.",
"type": ["string", "object"],
"status": "optional"
}
}
}
```
## List.Item.Basic
```json
{
"props": {
"selected": {
"doc": "When provided, the row is treated as a selectable item for nested checkbox/radio controls. When `true`, it also applies the selected state styling (e.g. background).",
"type": "boolean",
"status": "optional"
},
"pending": {
"doc": "If set to `true`, an overlaying skeleton with animation will be shown (loading state). Disables pointer events on the item.",
"type": "boolean",
"status": "optional"
},
"disabled": {
"doc": "If set to `true`, the item is visually dimmed and interaction is prevented. Sets `aria-disabled`, removes tabbing, and disables click/keyboard handlers.",
"type": "boolean",
"status": "optional"
},
"skeleton": {
"doc": "If set to `true`, applies skeleton font styling to the item (text placeholder animation). Use for loading state without the full overlay from `pending`.",
"type": "boolean",
"status": "optional"
},
"icon": {
"doc": "Optional icon (e.g. `fish_medium` or an icon element). Rendered at the start of the row.",
"type": "IconIcon",
"status": "optional"
},
"title": {
"doc": "Optional title. Rendered after the icon when provided.",
"type": "React.ReactNode",
"status": "optional"
},
"children": {
"doc": "Item content. Typically `List.Cell.Start`, `List.Cell.Center`, `List.Cell.End`, `List.Cell.Title` (use `List.Cell.Title.Overline`/`List.Cell.Title.Subline` for overline/subline text), or the drop-in `List.Cell.Title.Overline`/`List.Cell.Title.Subline` components, or `List.Cell.Footer`.",
"type": "React.ReactNode",
"status": "required"
},
"[Space](/uilib/layout/space/properties)": {
"doc": "Spacing properties like `top` or `bottom` are supported.",
"type": ["string", "object"],
"status": "optional"
}
}
}
```
## List.Item.Action
```json
{
"props": {
"title": {
"doc": "Optional title for the action item.",
"type": "React.ReactNode",
"status": "optional"
},
"icon": {
"doc": "Optional icon for the action item (e.g. `fish_medium`).",
"type": "IconIcon",
"status": "optional"
},
"href": {
"doc": "When set, renders as a native link (`<a>`) so the item navigates to the URL. Use for external or internal navigation. When not set, the item behaves as a button (use `onClick` for custom handling).",
"type": "string",
"status": "optional"
},
"to": {
"doc": "Use this prop only if you are using a router Link component as the `element` that uses the `to` property to declare the navigation url.",
"type": "string",
"status": "optional"
},
"element": {
"doc": "Define what HTML or React element should be used for the link (e.g. `element={Link}` for React Router). Only applicable when `href` or `to` is set.",
"type": "React.Element",
"status": "optional"
},
"elementProps": {
"doc": "Additional props forwarded to the `element` component (e.g. `{ replace: true, state: { from: \"list\" } }` for React Router Link).",
"type": "object",
"status": "optional"
},
"target": {
"doc": "Link target (e.g. `_blank` for new tab). Only applicable when `href` is set.",
"type": "string",
"status": "optional"
},
"rel": {
"doc": "Link rel (e.g. `noopener noreferrer` for external links). Only applicable when `href` is set.",
"type": "string",
"status": "optional"
},
"onClick": {
"doc": "Called when the user clicks or activates the item (Enter/Space key). Receives the native mouse event.",
"type": "(event) => void",
"status": "optional"
},
"chevronPosition": {
"doc": "Placement of the chevron icon. Defaults to `right`. Use `left` to show the chevron on the left side.",
"type": ["'left'", "'right'"],
"defaultValue": "'right'",
"status": "optional"
},
"pending": {
"doc": "If set to `true`, an overlaying skeleton with animation will be shown (loading state). Disables click and keyboard while active.",
"type": "boolean",
"status": "optional"
},
"disabled": {
"doc": "If set to `true`, the item is visually dimmed and interaction is prevented. Sets `aria-disabled`, removes tabbing, and disables click/keyboard handlers.",
"type": "boolean",
"status": "optional"
},
"skeleton": {
"doc": "If set to `true`, applies skeleton font styling to the item (text placeholder).",
"type": "boolean",
"status": "optional"
},
"children": {
"doc": "Additional cells (e.g. `List.Cell.End` for value). A chevron icon is rendered at the end automatically.",
"type": "React.ReactNode",
"status": "optional"
},
"[List.Item.Basic](/uilib/components/list/properties/#listitembasic)": {
"doc": "Inherits List.Item.Basic properties (variant, selected, spacing, etc.).",
"type": "Various",
"status": "optional"
},
"[Space](/uilib/layout/space/properties)": {
"doc": "Spacing properties like `top` or `bottom` are supported.",
"type": ["string", "object"],
"status": "optional"
}
}
}
```
## List.Item.Accordion
```json
{
"props": {
"icon": {
"doc": "Optional icon for the accordion header (e.g. `fish_medium`).",
"type": "IconIcon",
"status": "optional"
},
"title": {
"doc": "Optional title for the accordion header.",
"type": "React.ReactNode",
"status": "optional"
},
"chevronPosition": {
"doc": "Placement of the chevron icon. Defaults to `right`. Use `left` to show the chevron on the left side.",
"type": ["'left'", "'right'"],
"defaultValue": "'right'",
"status": "optional"
},
"open": {
"doc": "Initial open state. Defaults to `false`. The accordion can be toggled by the user via the header.",
"type": "boolean",
"defaultValue": "false",
"status": "optional"
},
"keepInDOM": {
"doc": "When `true`, keeps the accordion content in the DOM when closed. Defaults to `false`.",
"type": "boolean",
"defaultValue": "false",
"status": "optional"
},
"disabled": {
"doc": "If set to `true`, the accordion is visually dimmed and interaction is prevented. Sets `aria-disabled`, removes tabbing, and disables click/keyboard handlers.",
"type": "boolean",
"defaultValue": "false",
"status": "optional"
},
"onChange": {
"doc": "Called when the accordion open state changes. Receives an object with the `expanded` state.",
"type": "({ expanded }) => void",
"status": "optional"
},
"children": {
"doc": "Header cells (e.g. `List.Cell.Start`, `List.Cell.Title`/`List.Cell.Title.Overline`, `List.Cell.End`) and optionally `List.Item.Accordion.Content` for the expandable section.",
"type": "React.ReactNode",
"status": "required"
},
"[List.Item.Basic](/uilib/components/list/properties/#listitembasic)": {
"doc": "Inherits List.Item.Basic properties (variant, pending, spacing, etc.).",
"type": "Various",
"status": "optional"
}
}
}
```
## List.Item.Accordion.Header
```json
{
"props": {
"children": {
"doc": "Header cells (e.g. `List.Cell.Start`, `List.Cell.Title.Overline`, `List.Cell.End`). The chevron, icon, and title from the parent accordion are rendered automatically.",
"type": "React.ReactNode",
"status": "optional"
},
"[Flex.Item](/uilib/layout/flex/item/properties)": {
"doc": "Renders as a `Flex.Item`. Supports all `Flex.Item` properties.",
"type": "Various",
"status": "optional"
},
"[Space](/uilib/layout/space/properties)": {
"doc": "Spacing properties like `top` or `bottom` are supported.",
"type": ["string", "object"],
"status": "optional"
}
}
}
```
## List.Item.Accordion.Content
```json
{
"props": {
"children": {
"doc": "Content displayed inside the expandable accordion body.",
"type": "React.ReactNode",
"status": "required"
},
"[Space](/uilib/layout/space/properties)": {
"doc": "Spacing properties like `top` or `bottom` are supported.",
"type": ["string", "object"],
"status": "optional"
}
}
}
```
## List.Cell.Title
```json
{
"props": {
"fontSize": {
"doc": "Font size of the title content. Defaults to `basis`. Use `small` for smaller text.",
"type": ["'small'", "'basis'"],
"defaultValue": "'basis'",
"status": "optional"
},
"children": {
"doc": "Title content of the list item. Equivalent to using the `title` prop on `List.Item.Basic` or `List.Item.Action`. You can nest `List.Cell.Title.Overline`/`List.Cell.Title.Subline` inside the component for the overline/subline text.",
"type": "React.ReactNode",
"status": "required"
},
"[Space](/uilib/layout/space/properties)": {
"doc": "Spacing properties like `top` or `bottom` are supported.",
"type": ["string", "object"],
"status": "optional"
}
}
}
```
## List.Cell.Title.Overline
```json
{
"props": {
"fontSize": {
"doc": "Font size of the overline content. Defaults to `x-small`.",
"type": ["'basis'", "'small'", "'x-small'"],
"defaultValue": "'x-small'",
"status": "optional"
},
"fontWeight": {
"doc": "Font weight of the overline content. Defaults to `medium`.",
"type": ["'regular'", "'medium'"],
"defaultValue": "'medium'",
"status": "optional"
},
"children": {
"doc": "Overline content of the list item, shown above the main title row. Use via `List.Cell.Title.Overline` when nesting inside the title block (or drop-in as `List.Cell.Title.Overline`). Pairs with `List.Cell.Title.Subline` inside the block.",
"type": "React.ReactNode",
"status": "required"
},
"[Space](/uilib/layout/space/properties)": {
"doc": "Spacing properties like `top` or `bottom` are supported.",
"type": ["string", "object"],
"status": "optional"
}
}
}
```
## List.Cell.Title.Subline
```json
{
"props": {
"variant": {
"doc": "Visual variant. Use `description` for smaller, muted text style.",
"type": ["'description'"],
"status": "optional"
},
"fontSize": {
"doc": "Font size of the subline content. Defaults to `small`. When `variant=\"description\"`, defaults to `x-small`.",
"type": ["'basis'", "'small'", "'x-small'"],
"defaultValue": "'small'",
"status": "optional"
},
"fontWeight": {
"doc": "Font weight of the subline content. Defaults to `regular`.",
"type": ["'regular'", "'medium'"],
"defaultValue": "'regular'",
"status": "optional"
},
"children": {
"doc": "Subline content of the list item, shown below the title. Use via `List.Cell.Title.Subline` when nesting inside the title block (or as standalone `List.Cell.Title.Subline`). Pairs with List.Cell.Title.Overline or `List.Cell.Title.Overline`.",
"type": "React.ReactNode",
"status": "required"
},
"[Space](/uilib/layout/space/properties)": {
"doc": "Spacing properties like `top` or `bottom` are supported.",
"type": ["string", "object"],
"status": "optional"
}
}
}
```
## List.Cell.Start
```json
{
"props": {
"fontSize": {
"doc": "Font size of the start content. Defaults to `basis`. Use `small` for smaller text.",
"type": ["'small'", "'basis'"],
"defaultValue": "'basis'",
"status": "optional"
},
"fontWeight": {
"doc": "Font weight of the start content. Defaults to `regular`.",
"type": ["'regular'", "'medium'"],
"defaultValue": "'regular'",
"status": "optional"
},
"children": {
"doc": "Start content of the list item (e.g. icon, label).",
"type": "React.ReactNode",
"status": "required"
},
"[Space](/uilib/layout/space/properties)": {
"doc": "Spacing properties like `top` or `bottom` are supported.",
"type": ["string", "object"],
"status": "optional"
}
}
}
```
## List.Cell.Center
```json
{
"props": {
"fontSize": {
"doc": "Font size of the center content. Defaults to `basis`. Use `small` for smaller text.",
"type": ["'small'", "'basis'"],
"defaultValue": "'basis'",
"status": "optional"
},
"fontWeight": {
"doc": "Font weight of the center content. Defaults to `regular`.",
"type": ["'regular'", "'medium'"],
"defaultValue": "'regular'",
"status": "optional"
},
"children": {
"doc": "Center content of the list item. Grows to fill available space.",
"type": "React.ReactNode",
"status": "required"
},
"[Space](/uilib/layout/space/properties)": {
"doc": "Spacing properties like `top` or `bottom` are supported.",
"type": ["string", "object"],
"status": "optional"
}
}
}
```
## List.Cell.End
```json
{
"props": {
"fontWeight": {
"doc": "Font weight of the end content. Defaults to `medium`.",
"type": ["'regular'", "'medium'"],
"defaultValue": "'medium'",
"status": "optional"
},
"fontSize": {
"doc": "Font size of the end content. Defaults to `basis`. Use `small` for smaller text.",
"type": ["'small'", "'basis'"],
"defaultValue": "'basis'",
"status": "optional"
},
"children": {
"doc": "End content of the list item (e.g. value, action).",
"type": "React.ReactNode",
"status": "required"
},
"[Space](/uilib/layout/space/properties)": {
"doc": "Spacing properties like `top` or `bottom` are supported.",
"type": ["string", "object"],
"status": "optional"
}
}
}
```
## List.Cell.Footer
```json
{
"props": {
"children": {
"doc": "Footer content of the list item. Grows to fill available space.",
"type": "React.ReactNode",
"status": "required"
},
"[Space](/uilib/layout/space/properties)": {
"doc": "Spacing properties like `top` or `bottom` are supported.",
"type": ["string", "object"],
"status": "optional"
}
}
}
```
## List.Card
```json
{
"props": {
"children": {
"doc": "Card content. Typically a `List.Container` (optionally wrapped in `List.ScrollView`). The card provides a visual container with border-radius resets and scrollbar integration for the list inside it.",
"type": "React.ReactNode",
"status": "required"
},
"responsive": {
"doc": "When `true`, the card adjusts its layout for smaller screens. Defaults to `true`.",
"type": "boolean",
"defaultValue": "true",
"status": "optional"
},
"[Card](/uilib/components/card/properties)": {
"doc": "All [Card](/uilib/components/card) properties are supported. The card renders with `stack` layout by default.",
"type": "Various",
"status": "optional"
},
"[Space](/uilib/layout/space/properties)": {
"doc": "Spacing properties like `top` or `bottom` are supported.",
"type": ["string", "object"],
"status": "optional"
}
}
}
```
## List.ScrollView
```json
{
"props": {
"children": {
"doc": "Scrollable content. Typically a `List.Container` with list items.",
"type": "React.ReactNode",
"status": "required"
},
"maxVisibleListItems": {
"doc": "Sets the maximum visible list items before the content scrolls. The component measures the rendered height of the first visible items. An explicit `style.maxHeight` overrides this.",
"type": "number",
"status": "optional"
},
"skeleton": {
"doc": "When `true`, applies skeleton font styling to all child items inside the scroll view. Propagated via context so nested `List.Container` and items inherit it.",
"type": "boolean",
"status": "optional"
},
"disabled": {
"doc": "When `true`, dims all child items and prevents interaction. Propagated via context so nested `List.Container` and items inherit it.",
"type": "boolean",
"status": "optional"
},
"[Space](/uilib/layout/space/properties)": {
"doc": "Spacing properties like `top` or `bottom` are supported.",
"type": ["string", "object"],
"status": "optional"
}
}
}
```
## List.Item.Action Events
```json
{
"props": {
"onClick": {
"doc": "Fired when the user clicks or activates `List.Item.Action` (click or Enter/Space key). Receives the native event. Only applicable to `List.Item.Action`.",
"type": "(event) => void",
"status": "optional"
}
}
}
```
## List.Item.Accordion Events
```json
{
"props": {
"onClick": {
"doc": "Fired when the user clicks or activates the accordion header (click or Enter/Space key). In controlled mode (when `open` is provided), use this to update the `open` prop. Receives the native event.",
"type": "(event) => void",
"status": "optional"
}
}
}
```