---
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"
    }
  }
}
```
