# ListCell

**📖 Live documentation:** https://cds.coinbase.com/components/data-display/ListCell/?platform=mobile

A versatile cell component used for displaying content in a list format, supporting various layouts and interactions.

## Import

```tsx
import { ListCell } from '@coinbase/cds-mobile/cells/ListCell'
```

## Examples

### Overview

A ListCell row is divided into the following 5 columns:

- Media
- Title & description
- Intermediary
- End (detail & subdetail or action)
- Accessory

#### Basic Usage

```tsx
<ListCell
  spacingVariant="condensed"
  title="Basic List Cell"
  description="A simple example of ListCell"
/>
```

:::tip
Prefer `spacingVariant="condensed"` for the new ListCell design. Both `normal` and `compact` are deprecated and may be removed in a future major release.
:::

#### Spacing Variant

```tsx
<VStack>
  {/* Preferred (new design) */}
  <ListCell
    accessory="arrow"
    description="New design (condensed)"
    detail="$12,345.00"
    spacingVariant="condensed"
    media={<Avatar src={assets.eth.imageUrl} size="m" />}
    onPress={console.log}
    title="Condensed"
    variant="positive"
  />

  {/* Deprecated options kept for backward compatibility */}
  <ListCell
    accessory="arrow"
    detail="$12,345.00"
    spacingVariant="compact"
    media={<Avatar src={assets.eth.imageUrl} size="m" />}
    onPress={console.log}
    title="Compact (deprecated)"
    variant="positive"
  />
  <ListCell
    accessory="arrow"
    detail="$12,345.00"
    spacingVariant="normal"
    media={<Avatar src={assets.eth.imageUrl} size="m" />}
    onPress={console.log}
    title="Normal (deprecated)"
    variant="positive"
  />
</VStack>
```

### Media

::::note
We have deprecated `CellMedia`; pass media directly as shown below.
::::

#### Leading Icon

```tsx
<ListCell
  spacingVariant="condensed"
  title="List Cell with Icon"
  description="Shows usage with a leading icon"
  media={<Icon active name="info" />}
/>
```

#### Leading Avatar

```tsx
<ListCell
  spacingVariant="condensed"
  title="List Cell with Icon"
  description="Shows usage with a leading icon"
  media={<Avatar src={assets.btc.imageUrl} size="l" />}
/>
```

### Title & Description

#### Title Line Limits

- In condensed spacing (`spacingVariant="condensed"`), the title shows up to two lines by default, regardless of whether a description is present.
- In normal and compact spacing, the title shows up to two lines when there is no description; if a description is present, the title is limited to one line.
- Use `disableMultilineTitle` to force the title to one line in all cases.
- When provided, the subtitle renders between the title and description and always truncates to a single line. Use `subtitleNode` if you need custom layout or multi-line behavior.

::::warning
The `title` and `description` props are rendered inside a CDS `Text` with default fonts and truncation. To render arbitrary React nodes without being wrapped by a `<Text>`, use `titleNode` and `descriptionNode`.
When using the Node props, you are responsible for styling, layout, and truncation behavior.
::::

#### Custom Title/Description via Node Props

```tsx
<ListCell
  spacingVariant="condensed"
  media={<Avatar src={assets.eth.imageUrl} size="m" />}
  titleNode={
    <HStack gap={1} alignItems="center">
      <Icon name="checkmark" />
      <span>Verified account</span>
    </HStack>
  }
  descriptionNode={
    <HStack gap={1} alignItems="center">
      <span>Composed description with any React nodes</span>
      <Icon name="info" />
    </HStack>
  }
/>
```

#### Subtitle

Use `subtitle` to add one line of supplementary context between the title and description. The subtitle always truncates to a single line; provide a `subtitleNode` when you need your own truncation or layout logic.

```tsx
<ListCell
  spacingVariant="condensed"
  media={<Avatar src={assets.btc.imageUrl} size="l" />}
  title="Bitcoin"
  subtitle="Deposit available in 1-2 days"
  description="Ending in ••42"
  detail="$12,345.00"
/>
```

#### Multiline Description

```tsx
<ListCell
  spacingVariant="condensed"
  title="Multiline Description"
  description="This is a longer description that demonstrates how the text wraps when the multiline prop is enabled. It can span multiple lines without truncating."
  multiline
/>
```

### Intermediary

```tsx
function Intermediary() {
  const dimensions = { width: 62, height: 18 };
  const sparklineData = prices
    .map((price) => parseFloat(price))
    .filter((price, index) => index % 10 === 0);
  const referenceY = sparklineData[Math.floor(sparklineData.length / 3)];

  const CompactChart = memo(
    ({ data, color = 'var(--color-fgPositive)', showArea = false, referenceY }) => (
      <Box style={{ padding: 1 }}>
        <LineChart
          {...dimensions}
          enableScrubbing={false}
          overflow="visible"
          inset={0}
          showArea={showArea}
          series={[
            {
              id: 'series',
              data,
              color,
            },
          ]}
        >
          <ReferenceLine dataY={referenceY} />
        </LineChart>
      </Box>
    ),
  );

  return (
    <ListCell
      media={<Avatar src={assets.btc.imageUrl} />}
      spacingVariant="condensed"
      title="Bitcoin"
      description="BTC"
      intermediary={<CompactChart data={sparklineData} referenceY={referenceY} />}
      detail="$334,239.03"
      subdetail="+4.06%"
      priority="start"
      variant="positive"
    />
  );
}
```

### End

#### Detail and Subdetail

```tsx
<ListCell
  spacingVariant="condensed"
  title="List Cell with Details"
  description="Shows usage with detail and subdetail"
  detail="Primary detail"
  subdetail="Secondary detail"
/>
```

::::warning
Like `title` and `description`, `detail` and `subdetail` props are also rendered inside a CDS `Text` with default fonts. To render arbitrary React nodes without being wrapped by a `<Text>`, use `detailNode` and `subdetailNode`.
::::

#### Custom Detail/Subdetail via Node Props

```tsx
<ListCell
  spacingVariant="condensed"
  media={<Avatar src={assets.btc.imageUrl} size="m" />}
  title="Custom end content"
  description="Detail and subdetail rendered with custom nodes"
  detailNode={
    <HStack gap={2} alignItems="center" justifyContent="flex-end">
      <Icon name="info" />
      <Text as="div" font="body" overflow="truncate" textAlign="end">
        $12,345.00
      </Text>
    </HStack>
  }
  subdetailNode={
    <HStack gap={1} alignItems="center" justifyContent="flex-end">
      <Icon name="info" />
      <Text as="div" color="fgPositive" font="label2" overflow="truncate" textAlign="end">
        +5.43%
      </Text>
    </HStack>
  }
/>
```

#### End Action

When you pass the `end` prop, it overrides the `detail`/`subdetail`/`detailNode`/`subdetailNode`.

```tsx
<ListCell
  spacingVariant="condensed"
  title="End action"
  detail="This is overridden and won't show up"
  subdetail="This is overridden and won't show up"
  detailNode="This is overridden and won't show up"
  subdetailNode="This is overridden and won't show up"
  end={
    <Button
      compact
      onPress={() => {
        alert('Action clicked');
      }}
    >
      Action
    </Button>
  }
/>
```

### Accessory

#### Interactive Cell with Accessory

```tsx
<ListCell
  spacingVariant="condensed"
  title="Interactive List Cell"
  description="Click or tap to interact"
  accessory="arrow"
  onPress={() => alert('Cell clicked!')}
/>
```

#### Preserve Layout During Selection

Use the `unselected` accessory to reserve space for the selection checkmark when toggling the `selected` state.

```tsx
function PreserveLayoutExample() {
  const [isSelected, setIsSelected] = useState(false);

  return (
    <VStack gap={1}>
      <ListCell
        accessory={isSelected ? 'selected' : 'unselected'}
        description="Selected state uses the same space, no layout shift when selected"
        spacingVariant="condensed"
        title="Leverage unselected state"
        selected={isSelected}
        onPress={() => setIsSelected((prev) => !prev)}
      />
    </VStack>
  );
}
```

#### Custom Accessory via Node Prop

```tsx
<ListCell
  spacingVariant="condensed"
  title="Accessory Node"
  description="Custom accessory with its own onPress"
  media={<Avatar src={assets.eth.imageUrl} size="m" />}
  end={
    <Button
      compact
      onPress={() => {
        alert('Action clicked');
      }}
    >
      Action
    </Button>
  }
  accessoryNode={
    <Tooltip content="question">
      <Icon size="s" name="questionMark" compact variant="secondary" />
    </Tooltip>
  }
/>
```

### Accessibility Label

The accessibility props are only applied when the `<ListCell>` has a value for the `onPress` prop. Otherwise, content passed into the `<ListCell>` must use accessibility props and attributes as needed.

```tsx
<VStack gap={1}>
  <ListCell
    accessibilityLabel="Accessibility label. Describes content for entire list cell. Applied when onPress prop has a value"
    intermediary={<Icon name="chartLine" />}
    media={<Avatar src={assets.btc.imageUrl} />}
    onPress={() => window.alert('ListCell clicked!')}
    title="BTC"
    spacingVariant="condensed"
  />

  <ListCell
    intermediary={<Icon accessibilityLabel="Chart icon" name="chartLine" />}
    media={<Avatar accessibilityLabel="Bitcoin" src={assets.btc.imageUrl} />}
    title="BTC"
    spacingVariant="condensed"
  />
</VStack>
```

### Helper text

```tsx
<VStack gap={3}>
  <ListCell
    spacingVariant="condensed"
    title="List Cell with Helper Text"
    description="Shows usage with helper text below the cell"
    helperText={
      <CellHelperText font="label2" paddingStart={6}>
        This is a default helper message.
      </CellHelperText>
    }
    media={<Avatar src={assets.btc.imageUrl} />}
    end={<Button compact>Action</Button>}
  />
  <ListCell
    spacingVariant="condensed"
    title="List Cell with Warning"
    description="Shows usage with a warning message"
    helperText={
      <CellHelperText font="label2" variant="warning" paddingStart={6}>
        This is a warning message.
      </CellHelperText>
    }
    media={<Avatar src={assets.btc.imageUrl} />}
    end={<Button compact>Action</Button>}
  />
  <ListCell
    spacingVariant="condensed"
    title="List Cell with Error"
    description="Shows usage with an error message"
    helperText={
      <CellHelperText font="label2" variant="error" paddingStart={6}>
        This is an error message.
      </CellHelperText>
    }
    media={<Avatar src={assets.btc.imageUrl} />}
    end={<Button compact>Action</Button>}
  />
</VStack>
```

### ContentCell

```tsx
<ListCell
  multiline
  description={
    <Text color="fgMuted" font="body">
      Long description with multiple lines. This section can be arbitrarily long and occupy many
      many lines.
    </Text>
  }
  end={
    <HStack alignItems="center" gap={1}>
      <Text color="fgMuted" font="label2">
        Meta
      </Text>
      <Icon color="fg" name="caretRight" size="s" />
    </HStack>
  }
  media={<Avatar shape="circle" size="l" src={assets.eth.imageUrl} />}
  onPress={() => console.log('pressed')}
  priority="end"
  spacingVariant="condensed"
  styles={{
    media: {
      marginTop: theme.space[1],
      alignSelf: 'flex-start',
    },
    end: {
      marginTop: theme.space[1],
      alignSelf: 'flex-start',
    },
  }}
  subdetail="Subdetail"
  subtitle="Subtitle"
  title="Content-style layout"
/>
```

### Loading States

The ListCellFallback component provides loading state representations of ListCell. It uses placeholder rectangles to indicate where content will appear, creating a smooth loading experience. The web version uses percentage-based widths and custom layouts to match the ListCell's four-column structure.

```tsx
<VStack gap={3}>
  {/* Basic loading state */}
  <ListCellFallback title description spacingVariant="condensed" />

  {/* Loading state with media */}
  <ListCellFallback title description media="icon" spacingVariant="condensed" />

  {/* Loading state with details */}
  <ListCellFallback title description detail subdetail spacingVariant="condensed" />

  {/* Full loading state with custom widths */}
  <ListCellFallback
    spacingVariant="condensed"
    title
    description
    detail
    subdetail
    helperText
    media="icon"
    rectWidthVariant={2} // Creates a deterministic variant of the loading state
    disableRandomRectWidth
    styles={{ helperText: { paddingLeft: 48 } }}
  />
</VStack>
```

### Priority

The priority prop controls which parts of the cell are protected from shrinking and truncation when horizontal space is limited. It accepts start, middle, and end as a string or an array of strings.

```tsx
function PriorityContent() {
  const dimensions = { width: 62, height: 18 };
  const sparklineData = prices
    .map((price) => parseFloat(price))
    .filter((price, index) => index % 10 === 0);
  const referenceY = sparklineData[Math.floor(sparklineData.length / 3)];

  const CompactChart = memo(
    ({ data, color = 'var(--color-fgPositive)', showArea = false, referenceY }) => (
      <Box style={{ padding: 1 }}>
        <LineChart
          {...dimensions}
          enableScrubbing={false}
          overflow="visible"
          inset={0}
          showArea={showArea}
          series={[
            {
              id: 'series',
              data,
              color,
            },
          ]}
        >
          <ReferenceLine dataY={referenceY} />
        </LineChart>
      </Box>
    ),
  );

  return (
    <VStack gap={3} style={{ width: '100%', maxWidth: 320, overflow: 'hidden' }}>
      <ListCell
        spacingVariant="condensed"
        title="Asset with a really long name"
        description="Some description of the asset"
        intermediary={<CompactChart data={sparklineData} referenceY={referenceY} />}
        detail="$334,239.03"
        subdetail="+4.06%"
        priority="start"
        variant="positive"
      />
      <ListCell
        spacingVariant="condensed"
        title="Asset with a really long name"
        description="Some description of the asset"
        intermediary={<CompactChart data={sparklineData} referenceY={referenceY} />}
        detail="$334,239.03"
        subdetail="+4.06%"
        priority="middle"
        variant="positive"
      />
      <ListCell
        spacingVariant="condensed"
        title="Asset with a really long name"
        description="Some description of the asset"
        intermediary={<CompactChart data={sparklineData} referenceY={referenceY} />}
        detail="$334,239.03"
        subdetail="+4.06%"
        priority="end"
        variant="positive"
      />
      <ListCell
        spacingVariant="condensed"
        title="Asset with a really long name"
        description="Some description of the asset"
        intermediary={<CompactChart data={sparklineData} referenceY={referenceY} />}
        detail="$334,239.03"
        subdetail="+4.06%"
        priority={['start', 'middle', 'end']}
        variant="warning"
      />
    </VStack>
  );
}
```

### Anatomy

Without helper text (top-only layout):

```text
┌─────────────────────────────────────────────────────────────────────────────────────────┐
│                               root (Box)                                                │
│┌───────────────────────────────────────────────────────────────────────────────────────┐│
││                              pressable                                                ││
││┌─────────────────────────────────────────────────────────────────────────────────────┐││
│││                contentContainer & mainContent (HStack)                              │││
│││  ┌─────┐ ┌──────────────────────────────┐ ┌────────────┐ ┌────────────┐ ┌─────────┐ │││
│││  │media│ │ titleStackContainer (Box)    │ │intermediary│ │    end     │ │accessory│ │││
│││  │     │ │ ┌──────────────────────────┐ │ │            │ │ (detail    │ │         │ │││
│││  │     │ │ │ titleStack (VStack)      │ │ │            │ │    or      │ │         │ │││
│││  │     │ │ │ ┌──────────┐             │ │ │            │ │  action)   │ │         │ │││
│││  │     │ │ │ │  title   │             │ │ │            │ │            │ │         │ │││
│││  │     │ │ │ └──────────┘             │ │ │            │ │            │ │         │ │││
│││  │     │ │ │ ┌──────────┐             │ │ │            │ │            │ │         │ │││
│││  │     │ │ │ │ subtitle │             │ │ │            │ │            │ │         │ │││
│││  │     │ │ │ └──────────┘             │ │ │            │ │            │ │         │ │││
│││  │     │ │ │ ┌────────────┐           │ │ │            │ │            │ │         │ │││
│││  │     │ │ │ │ description│           │ │ │            │ │            │ │         │ │││
│││  │     │ │ │ └────────────┘           │ │ │            │ │            │ │         │ │││
│││  │     │ │ └──────────────────────────┘ │ │            │ │            │ │         │ │││
│││  └─────┘ └──────────────────────────────┘ └────────────┘ └────────────┘ └─────────┘ │││
││└─────────────────────────────────────────────────────────────────────────────────────┘││
│└───────────────────────────────────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────────────────────────────────┘
```

With helper text (top + bottom layout):

```text
┌───────────────────────────────────────────────────────────────────────────────────────────┐
│                                 root (Box)                                                │
│┌─────────────────────────────────────────────────────────────────────────────────────────┐│
││                                pressable                                                ││
││┌───────────────────────────────────────────────────────────────────────────────────────┐││
│││                        contentContainer (VStack)                                      │││
│││┌─────────────────────────────────────────────────────────────────────────────────────┐│││
││││                          mainContent (HStack)                                       ││││
││││  ┌─────┐ ┌──────────────────────────────┐ ┌────────────┐ ┌────────────┐ ┌─────────┐ ││││
││││  │media│ │ titleStackContainer (Box)    │ │intermediary│ │    end     │ │accessory│ ││││
││││  │     │ │ ┌──────────────────────────┐ │ │            │ │ (detail    │ │         │ ││││
││││  │     │ │ │ titleStack (VStack)      │ │ │            │ │    or      │ │         │ ││││
││││  │     │ │ │ ┌──────────┐             │ │ │            │ │  action)   │ │         │ ││││
││││  │     │ │ │ │  title   │             │ │ │            │ │            │ │         │ ││││
││││  │     │ │ │ └──────────┘             │ │ │            │ │            │ │         │ ││││
││││  │     │ │ │ ┌──────────┐             │ │ │            │ │            │ │         │ ││││
││││  │     │ │ │ │ subtitle │             │ │ │            │ │            │ │         │ ││││
││││  │     │ │ │ └──────────┘             │ │ │            │ │            │ │         │ ││││
││││  │     │ │ │ ┌────────────┐           │ │ │            │ │            │ │         │ ││││
││││  │     │ │ │ │ description│           │ │ │            │ │            │ │         │ ││││
││││  │     │ │ │ └────────────┘           │ │ │            │ │            │ │         │ ││││
││││  │     │ │ └──────────────────────────┘ │ │            │ │            │ │         │ ││││
││││  └─────┘ └──────────────────────────────┘ └────────────┘ └────────────┘ └─────────┘ ││││
│││└─────────────────────────────────────────────────────────────────────────────────────┘│││
│││┌─────────────────────────────────────────────────────────────────────────────────────┐│││
││││                              helperText                                             ││││
│││└─────────────────────────────────────────────────────────────────────────────────────┘│││
││└───────────────────────────────────────────────────────────────────────────────────────┘││
│└─────────────────────────────────────────────────────────────────────────────────────────┘│
└───────────────────────────────────────────────────────────────────────────────────────────┘
```

Mapping to `styles` keys:

- root: outer `Box` wrapping the entire cell
- pressable: interactive overlay when `href` / `onPress` event handlers are present
- contentContainer: container around top and optional bottom content
- mainContent: inner horizontal layout that holds the main pieces
- titleStackContainer: wrapper around the title stack (controls flex behavior)
- titleStack: stacked text column (title/subtitle/description)
- title/subtitle/description: individual text nodes within `titleStack`
- media: leading media container
- intermediary: middle container between main and end
- end: container for `detail` / `subdetail` or `end` prop you pass in
- accessory: trailing accessory container
- helperText: container below main content to display helper text

## Props

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `accessory` | `more \| selected \| arrow \| unselected` | No | `-` | Accessory to display at the end of the cell. |
| `accessoryNode` | `null \| string \| number \| bigint \| false \| true \| ReactElement<unknown, string \| JSXElementConstructor<any>> \| Iterable<ReactNode> \| ReactPortal \| Promise<AwaitedReactNode>` | No | `-` | Custom accessory node rendered at the end of the cell. Takes precedence over accessory. |
| `action` | `null \| string \| number \| bigint \| false \| true \| ReactElement<unknown, string \| JSXElementConstructor<any>> \| Iterable<ReactNode> \| ReactPortal \| Promise<AwaitedReactNode>` | No | `-` | - |
| `adjustsFontSizeToFit` | `boolean` | No | `-` | Specifies whether font should be scaled down automatically to fit given style constraints. |
| `alignContent` | `flex-start \| flex-end \| center \| stretch \| space-between \| space-around \| space-evenly` | No | `-` | - |
| `alignItems` | `flex-start \| flex-end \| center \| stretch \| baseline` | No | `-` | - |
| `alignSelf` | `auto \| FlexAlignType` | No | `-` | - |
| `animated` | `boolean` | No | `-` | - |
| `aspectRatio` | `string \| number` | No | `-` | - |
| `background` | `currentColor \| fg \| fgMuted \| fgInverse \| fgPrimary \| fgWarning \| fgPositive \| fgNegative \| bg \| bgAlternate \| bgInverse \| bgOverlay \| bgElevation1 \| bgElevation2 \| bgPrimary \| bgPrimaryWash \| bgSecondary \| bgTertiary \| bgSecondaryWash \| bgNegative \| bgNegativeWash \| bgPositive \| bgPositiveWash \| bgWarning \| bgWarningWash \| bgLine \| bgLineHeavy \| bgLineInverse \| bgLinePrimary \| bgLinePrimarySubtle \| accentSubtleRed \| accentBoldRed \| accentSubtleGreen \| accentBoldGreen \| accentSubtleBlue \| accentBoldBlue \| accentSubtlePurple \| accentBoldPurple \| accentSubtleYellow \| accentBoldYellow \| accentSubtleGray \| accentBoldGray \| transparent` | No | `-` | - |
| `blendStyles` | `InteractableBlendStyles` | No | `-` | - |
| `borderBottomLeftRadius` | `0 \| 100 \| 200 \| 300 \| 400 \| 500 \| 600 \| 700 \| 800 \| 900 \| 1000` | No | `-` | - |
| `borderBottomRightRadius` | `0 \| 100 \| 200 \| 300 \| 400 \| 500 \| 600 \| 700 \| 800 \| 900 \| 1000` | No | `-` | - |
| `borderBottomWidth` | `0 \| 100 \| 200 \| 300 \| 400 \| 500` | No | `-` | - |
| `borderColor` | `currentColor \| fg \| fgMuted \| fgInverse \| fgPrimary \| fgWarning \| fgPositive \| fgNegative \| bg \| bgAlternate \| bgInverse \| bgOverlay \| bgElevation1 \| bgElevation2 \| bgPrimary \| bgPrimaryWash \| bgSecondary \| bgTertiary \| bgSecondaryWash \| bgNegative \| bgNegativeWash \| bgPositive \| bgPositiveWash \| bgWarning \| bgWarningWash \| bgLine \| bgLineHeavy \| bgLineInverse \| bgLinePrimary \| bgLinePrimarySubtle \| accentSubtleRed \| accentBoldRed \| accentSubtleGreen \| accentBoldGreen \| accentSubtleBlue \| accentBoldBlue \| accentSubtlePurple \| accentBoldPurple \| accentSubtleYellow \| accentBoldYellow \| accentSubtleGray \| accentBoldGray \| transparent` | No | `-` | - |
| `borderEndWidth` | `0 \| 100 \| 200 \| 300 \| 400 \| 500` | No | `-` | - |
| `borderRadius` | `0 \| 100 \| 200 \| 300 \| 400 \| 500 \| 600 \| 700 \| 800 \| 900 \| 1000` | No | `-` | - |
| `borderStartWidth` | `0 \| 100 \| 200 \| 300 \| 400 \| 500` | No | `-` | - |
| `borderTopLeftRadius` | `0 \| 100 \| 200 \| 300 \| 400 \| 500 \| 600 \| 700 \| 800 \| 900 \| 1000` | No | `-` | - |
| `borderTopRightRadius` | `0 \| 100 \| 200 \| 300 \| 400 \| 500 \| 600 \| 700 \| 800 \| 900 \| 1000` | No | `-` | - |
| `borderTopWidth` | `0 \| 100 \| 200 \| 300 \| 400 \| 500` | No | `-` | - |
| `borderWidth` | `0 \| 100 \| 200 \| 300 \| 400 \| 500` | No | `-` | - |
| `bordered` | `boolean` | No | `-` | Add a border around all sides of the box. |
| `borderedBottom` | `boolean` | No | `-` | Add a border to the bottom side of the box. |
| `borderedEnd` | `boolean` | No | `-` | Add a border to the trailing side of the box. |
| `borderedHorizontal` | `boolean` | No | `-` | Add a border to the leading and trailing sides of the box. |
| `borderedStart` | `boolean` | No | `-` | Add a border to the leading side of the box. |
| `borderedTop` | `boolean` | No | `-` | Add a border to the top side of the box. |
| `borderedVertical` | `boolean` | No | `-` | Add a border to the top and bottom sides of the box. |
| `bottom` | `null \| number \| AnimatedNode \| auto \| ${number}%` | No | `-` | - |
| `bottomContent` | `null \| string \| number \| bigint \| false \| true \| ReactElement<unknown, string \| JSXElementConstructor<any>> \| Iterable<ReactNode> \| ReactPortal \| Promise<AwaitedReactNode>` | No | `-` | The content to display below the main cell content. |
| `color` | `currentColor \| fg \| fgMuted \| fgInverse \| fgPrimary \| fgWarning \| fgPositive \| fgNegative \| bg \| bgAlternate \| bgInverse \| bgOverlay \| bgElevation1 \| bgElevation2 \| bgPrimary \| bgPrimaryWash \| bgSecondary \| bgTertiary \| bgSecondaryWash \| bgNegative \| bgNegativeWash \| bgPositive \| bgPositiveWash \| bgWarning \| bgWarningWash \| bgLine \| bgLineHeavy \| bgLineInverse \| bgLinePrimary \| bgLinePrimarySubtle \| accentSubtleRed \| accentBoldRed \| accentSubtleGreen \| accentBoldGreen \| accentSubtleBlue \| accentBoldBlue \| accentSubtlePurple \| accentBoldPurple \| accentSubtleYellow \| accentBoldYellow \| accentSubtleGray \| accentBoldGray \| transparent` | No | `-` | - |
| `columnGap` | `0 \| 1 \| 2 \| 3 \| 4 \| 5 \| 6 \| 7 \| 8 \| 9 \| 10 \| 0.25 \| 0.5 \| 0.75 \| 1.5` | No | `-` | - |
| `compact` | `boolean` | No | `-` | - |
| `dangerouslySetBackground` | `string` | No | `-` | - |
| `description` | `null \| string \| number \| bigint \| false \| true \| ReactElement<unknown, string \| JSXElementConstructor<any>> \| Iterable<ReactNode> \| ReactPortal \| Promise<AwaitedReactNode>` | No | `-` | Description of content. Max 1 line (with title) or 2 lines (without), otherwise will truncate. This prop is only intended to accept a string or Text component; other use cases, while allowed, are not supported and may result in unexpected behavior. For arbitrary content, use descriptionNode. |
| `descriptionNode` | `null \| string \| number \| bigint \| false \| true \| ReactElement<unknown, string \| JSXElementConstructor<any>> \| Iterable<ReactNode> \| ReactPortal \| Promise<AwaitedReactNode>` | No | `-` | React node to render description. Takes precedence over description. When provided, styles.description is not applied. |
| `detail` | `null \| string \| number \| bigint \| false \| true \| ReactElement<unknown, string \| JSXElementConstructor<any>> \| Iterable<ReactNode> \| ReactPortal \| Promise<AwaitedReactNode>` | No | `-` | Label and/or extra detail. This prop is only intended to accept a string or Text component; other use cases, while allowed, are not supported and may result in unexpected behavior. For arbitrary content, use detailNode. |
| `detailNode` | `null \| string \| number \| bigint \| false \| true \| ReactElement<unknown, string \| JSXElementConstructor<any>> \| Iterable<ReactNode> \| ReactPortal \| Promise<AwaitedReactNode>` | No | `-` | React node to render label and/or extra detail. Takes precedence over detail. |
| `detailWidth` | `null \| number \| AnimatedNode \| auto \| ${number}%` | No | `-` | - |
| `disableMultilineTitle` | `boolean` | No | `false When there is no description the title will take up two lines by default. When this is set to true multiline title behavior is overwritten, and regardless of description text state the title will take up a single line truncating with ellipses.` | - |
| `disableSelectionAccessory` | `boolean` | No | `-` | Disable the default accessory that is displayed when the cell is selected. If accessory is provided, that will continue to be displayed, otherwise no accessory will be displayed when the cell is selected. |
| `disabled` | `boolean` | No | `-` | Is the cell disabled? Will apply opacity and disable interaction. |
| `display` | `flex \| none \| contents` | No | `-` | - |
| `elevation` | `0 \| 1 \| 2` | No | `-` | Determines box shadow styles. Parent should have overflow set to visible to ensure styles are not clipped. |
| `end` | `null \| string \| number \| bigint \| false \| true \| ReactElement<unknown, string \| JSXElementConstructor<any>> \| Iterable<ReactNode> \| ReactPortal \| Promise<AwaitedReactNode>` | No | `-` | End-aligned content (e.g., value, status). Replaces the deprecated detail prop. End-aligned content (e.g., CTA, form element, metric). Replacement for the deprecated action prop, and takes precedence over it. If the content is a action (like button, link, etc), we recommand avoid using alongside onPress. If used alongside onClick, the end action is triggered first and then the onClick handler. |
| `flexBasis` | `null \| number \| AnimatedNode \| auto \| ${number}%` | No | `-` | - |
| `flexDirection` | `row \| column \| row-reverse \| column-reverse` | No | `-` | - |
| `flexGrow` | `number` | No | `-` | - |
| `flexShrink` | `number` | No | `-` | - |
| `flexWrap` | `wrap \| nowrap \| wrap-reverse` | No | `-` | - |
| `font` | `inherit \| FontFamily` | No | `-` | - |
| `fontFamily` | `inherit \| FontFamily` | No | `-` | - |
| `fontSize` | `inherit \| FontSize` | No | `-` | - |
| `fontWeight` | `inherit \| FontWeight` | No | `-` | - |
| `gap` | `0 \| 1 \| 2 \| 3 \| 4 \| 5 \| 6 \| 7 \| 8 \| 9 \| 10 \| 0.25 \| 0.5 \| 0.75 \| 1.5` | No | `-` | - |
| `height` | `null \| number \| AnimatedNode \| auto \| ${number}%` | No | `-` | - |
| `helperText` | `null \| string \| number \| bigint \| false \| true \| ReactElement<unknown, string \| JSXElementConstructor<any>> \| Iterable<ReactNode> \| ReactPortal \| Promise<AwaitedReactNode>` | No | `-` | Assistive message to display below the cell content. |
| `innerSpacing` | `CellSpacing` | No | `-` | The spacing to use on the inner content of Cell |
| `intermediary` | `null \| string \| number \| bigint \| false \| true \| ReactElement<unknown, string \| JSXElementConstructor<any>> \| Iterable<ReactNode> \| ReactPortal \| Promise<AwaitedReactNode>` | No | `-` | Middle content between main content and detail. For internal use only. |
| `justifyContent` | `flex-start \| flex-end \| center \| space-between \| space-around \| space-evenly` | No | `-` | - |
| `left` | `null \| number \| AnimatedNode \| auto \| ${number}%` | No | `-` | - |
| `lineHeight` | `inherit \| LineHeight` | No | `-` | - |
| `margin` | `0 \| -1 \| -2 \| -3 \| -4 \| -5 \| -6 \| -7 \| -8 \| -9 \| -10 \| -0.25 \| -0.5 \| -0.75 \| -1.5` | No | `-` | - |
| `marginBottom` | `0 \| -1 \| -2 \| -3 \| -4 \| -5 \| -6 \| -7 \| -8 \| -9 \| -10 \| -0.25 \| -0.5 \| -0.75 \| -1.5` | No | `-` | - |
| `marginEnd` | `0 \| -1 \| -2 \| -3 \| -4 \| -5 \| -6 \| -7 \| -8 \| -9 \| -10 \| -0.25 \| -0.5 \| -0.75 \| -1.5` | No | `-` | - |
| `marginStart` | `0 \| -1 \| -2 \| -3 \| -4 \| -5 \| -6 \| -7 \| -8 \| -9 \| -10 \| -0.25 \| -0.5 \| -0.75 \| -1.5` | No | `-` | - |
| `marginTop` | `0 \| -1 \| -2 \| -3 \| -4 \| -5 \| -6 \| -7 \| -8 \| -9 \| -10 \| -0.25 \| -0.5 \| -0.75 \| -1.5` | No | `-` | - |
| `marginX` | `0 \| -1 \| -2 \| -3 \| -4 \| -5 \| -6 \| -7 \| -8 \| -9 \| -10 \| -0.25 \| -0.5 \| -0.75 \| -1.5` | No | `-` | - |
| `marginY` | `0 \| -1 \| -2 \| -3 \| -4 \| -5 \| -6 \| -7 \| -8 \| -9 \| -10 \| -0.25 \| -0.5 \| -0.75 \| -1.5` | No | `-` | - |
| `maxHeight` | `null \| number \| AnimatedNode \| auto \| ${number}%` | No | `-` | - |
| `maxWidth` | `null \| number \| AnimatedNode \| auto \| ${number}%` | No | `-` | - |
| `media` | `ReactElement<unknown, string \| JSXElementConstructor<any>>` | No | `-` | Media rendered at the start of the cell (icon, avatar, image, etc). |
| `minHeight` | `null \| number \| AnimatedNode \| auto \| ${number}%` | No | `-` | - |
| `minWidth` | `null \| number \| AnimatedNode \| auto \| ${number}%` | No | `-` | - |
| `multiline` | `boolean` | No | `-` | Allow the description to span multiple lines. This *will* break fixed height requirements, so should not be used in a FlatList. |
| `onLayout` | `((event: LayoutChangeEvent) => void)` | No | `-` | Measure the dimensions of the cell. Invoked on mount and layout changes with  {nativeEvent: { layout: {x, y, width, height}}}. |
| `onPointerCancel` | `((event: PointerEvent) => void)` | No | `-` | - |
| `onPointerCancelCapture` | `((event: PointerEvent) => void)` | No | `-` | - |
| `onPointerDown` | `((event: PointerEvent) => void)` | No | `-` | - |
| `onPointerDownCapture` | `((event: PointerEvent) => void)` | No | `-` | - |
| `onPointerEnter` | `((event: PointerEvent) => void)` | No | `-` | - |
| `onPointerEnterCapture` | `((event: PointerEvent) => void)` | No | `-` | - |
| `onPointerLeave` | `((event: PointerEvent) => void)` | No | `-` | - |
| `onPointerLeaveCapture` | `((event: PointerEvent) => void)` | No | `-` | - |
| `onPointerMove` | `((event: PointerEvent) => void)` | No | `-` | - |
| `onPointerMoveCapture` | `((event: PointerEvent) => void)` | No | `-` | - |
| `onPointerUp` | `((event: PointerEvent) => void)` | No | `-` | - |
| `onPointerUpCapture` | `((event: PointerEvent) => void)` | No | `-` | - |
| `onPress` | `((event: GestureResponderEvent) => void) \| null` | No | `-` | Called when a single tap gesture is detected. |
| `opacity` | `number \| AnimatedNode` | No | `-` | - |
| `outerSpacing` | `CellSpacing` | No | `-` | The spacing to use on the parent wrapper of Cell |
| `overflow` | `visible \| hidden \| scroll` | No | `-` | - |
| `padding` | `0 \| 1 \| 2 \| 3 \| 4 \| 5 \| 6 \| 7 \| 8 \| 9 \| 10 \| 0.25 \| 0.5 \| 0.75 \| 1.5` | No | `-` | - |
| `paddingBottom` | `0 \| 1 \| 2 \| 3 \| 4 \| 5 \| 6 \| 7 \| 8 \| 9 \| 10 \| 0.25 \| 0.5 \| 0.75 \| 1.5` | No | `-` | - |
| `paddingEnd` | `0 \| 1 \| 2 \| 3 \| 4 \| 5 \| 6 \| 7 \| 8 \| 9 \| 10 \| 0.25 \| 0.5 \| 0.75 \| 1.5` | No | `-` | - |
| `paddingStart` | `0 \| 1 \| 2 \| 3 \| 4 \| 5 \| 6 \| 7 \| 8 \| 9 \| 10 \| 0.25 \| 0.5 \| 0.75 \| 1.5` | No | `-` | - |
| `paddingTop` | `0 \| 1 \| 2 \| 3 \| 4 \| 5 \| 6 \| 7 \| 8 \| 9 \| 10 \| 0.25 \| 0.5 \| 0.75 \| 1.5` | No | `-` | - |
| `paddingX` | `0 \| 1 \| 2 \| 3 \| 4 \| 5 \| 6 \| 7 \| 8 \| 9 \| 10 \| 0.25 \| 0.5 \| 0.75 \| 1.5` | No | `-` | - |
| `paddingY` | `0 \| 1 \| 2 \| 3 \| 4 \| 5 \| 6 \| 7 \| 8 \| 9 \| 10 \| 0.25 \| 0.5 \| 0.75 \| 1.5` | No | `-` | - |
| `pin` | `top \| bottom \| left \| right \| all` | No | `-` | Direction in which to absolutely pin the box. |
| `position` | `absolute \| relative \| static` | No | `-` | - |
| `priority` | `end \| start \| middle \| (end \| start \| middle)[]` | No | `-` | Which piece of content has the highest priority in regards to text truncation, growing, and shrinking. |
| `right` | `null \| number \| AnimatedNode \| auto \| ${number}%` | No | `-` | - |
| `rowGap` | `0 \| 1 \| 2 \| 3 \| 4 \| 5 \| 6 \| 7 \| 8 \| 9 \| 10 \| 0.25 \| 0.5 \| 0.75 \| 1.5` | No | `-` | - |
| `selected` | `boolean` | No | `-` | Is the cell selected? Will apply a background and selected accessory. |
| `spacingVariant` | `normal \| compact \| condensed` | No | `'normal'` | Spacing variant configuration. Deprecated values: normal and compact. Prefer condensed.  When spacingVariant=normal: 1. min-height is 80px 2. padding is var(--space-2) var(--space-3) 3. border-radius is var(--borderRadius-200) 4. when there is a description, titles numberOfLines={1} otherwise titles numberOfLines={2} 5. description and subdetail have font body  When spacingVariant=compact: 1. same as spacingVariant=normal, except min-height is 40px  When spacingVariant=condensed: 1. min-height is undefined 2. padding is var(--space-1) var(--space-2) 3. border-radius is --borderRadius-0 4. titles numberOfLines={2} 5. description and subdetail have font label2 |
| `style` | `false \|  \| RegisteredStyle<ViewStyle> \| Value \| AnimatedInterpolation<string \| number> \| WithAnimatedObject<ViewStyle> \| WithAnimatedArray<Falsy \| ViewStyle \| RegisteredStyle<ViewStyle> \| RecursiveArray<Falsy \| ViewStyle \| RegisteredStyle<ViewStyle>> \| readonly (Falsy \| ViewStyle \| RegisteredStyle<ViewStyle>)[]> \| null` | No | `-` | - |
| `styles` | `({ root?: StyleProp<ViewStyle>; contentContainer?: StyleProp<ViewStyle>; topContent?: StyleProp<ViewStyle>; bottomContent?: StyleProp<ViewStyle>; pressable?: StyleProp<ViewStyle>; media?: StyleProp<ViewStyle>; childrenContainer?: StyleProp<ViewStyle>; intermediary?: StyleProp<ViewStyle>; end?: StyleProp<ViewStyle>; accessory?: StyleProp<ViewStyle>; } & { root?: StyleProp<ViewStyle>; media?: StyleProp<ViewStyle>; intermediary?: StyleProp<ViewStyle>; end?: StyleProp<ViewStyle>; accessory?: StyleProp<ViewStyle>; contentContainer?: StyleProp<ViewStyle>; pressable?: StyleProp<ViewStyle>; mainContent?: StyleProp<ViewStyle>; titleStack?: StyleProp<ViewStyle>; titleStackContainer?: StyleProp<ViewStyle>; helperText?: StyleProp<ViewStyle>; title?: StyleProp<TextStyle>; subtitle?: StyleProp<TextStyle>; description?: StyleProp<TextStyle>; })` | No | `-` | Custom styles for individual elements of the Cell component Styles for subcomponents, ignored when the corresponding xxNode prop is used |
| `subdetail` | `null \| string \| number \| bigint \| false \| true \| ReactElement<unknown, string \| JSXElementConstructor<any>> \| Iterable<ReactNode> \| ReactPortal \| Promise<AwaitedReactNode>` | No | `-` | Subdetail providing more information. This prop is only intended to accept a string or Text component; other use cases, while allowed, are not supported and may result in unexpected behavior. For arbitrary content, use subdetailNode. |
| `subdetailFont` | `inherit \| FontFamily` | No | `-` | Font to apply to the subdetail text. |
| `subdetailNode` | `null \| string \| number \| bigint \| false \| true \| ReactElement<unknown, string \| JSXElementConstructor<any>> \| Iterable<ReactNode> \| ReactPortal \| Promise<AwaitedReactNode>` | No | `-` | React node to render subdetail. Takes precedence over subdetail. |
| `subtitle` | `null \| string \| number \| bigint \| false \| true \| ReactElement<unknown, string \| JSXElementConstructor<any>> \| Iterable<ReactNode> \| ReactPortal \| Promise<AwaitedReactNode>` | No | `-` | Subtitle to display below the title and above the description. This prop is only intended to accept a string or Text component; other use cases, while allowed, are not supported and may result in unexpected behavior. For arbitrary content, use subtitleNode. |
| `subtitleNode` | `null \| string \| number \| bigint \| false \| true \| ReactElement<unknown, string \| JSXElementConstructor<any>> \| Iterable<ReactNode> \| ReactPortal \| Promise<AwaitedReactNode>` | No | `-` | React node to render subtitle. Takes precedence over subtitle. When provided, styles.subtitle is not applied. |
| `testID` | `string` | No | `-` | Used to locate this element in unit and end-to-end tests. Under the hood, testID translates to data-testid on Web. On Mobile, testID stays the same - testID Used to locate this view in end-to-end tests. |
| `textAlign` | `left \| right \| auto \| center \| justify` | No | `-` | - |
| `textDecorationLine` | `none \| underline \| line-through \| underline line-through` | No | `-` | - |
| `textDecorationStyle` | `solid \| dotted \| dashed \| double` | No | `-` | - |
| `textTransform` | `none \| capitalize \| uppercase \| lowercase` | No | `-` | - |
| `title` | `null \| string \| number \| bigint \| false \| true \| ReactElement<unknown, string \| JSXElementConstructor<any>> \| Iterable<ReactNode> \| ReactPortal \| Promise<AwaitedReactNode>` | No | `-` | Title of content. Max 1 line (with description) or 2 lines (without), otherwise will truncate. This prop is only intended to accept a string or Text component; other use cases, while allowed, are not supported and may result in unexpected behavior. For arbitrary content, use titleNode. |
| `titleNode` | `null \| string \| number \| bigint \| false \| true \| ReactElement<unknown, string \| JSXElementConstructor<any>> \| Iterable<ReactNode> \| ReactPortal \| Promise<AwaitedReactNode>` | No | `-` | React node to render title. Takes precedence over title. When provided, styles.title is not applied. |
| `top` | `null \| number \| AnimatedNode \| auto \| ${number}%` | No | `-` | - |
| `transform` | `string \| readonly (({ scaleX: AnimatableNumericValue; } & { scaleY?: undefined; translateX?: undefined; translateY?: undefined; perspective?: undefined; rotate?: undefined; rotateX?: undefined; rotateY?: undefined; rotateZ?: undefined; scale?: undefined; skewX?: undefined; skewY?: undefined; matrix?: undefined; }) \| ({ scaleY: AnimatableNumericValue; } & { scaleX?: undefined; translateX?: undefined; translateY?: undefined; perspective?: undefined; rotate?: undefined; rotateX?: undefined; rotateY?: undefined; rotateZ?: undefined; scale?: undefined; skewX?: undefined; skewY?: undefined; matrix?: undefined; }) \| ({ translateX: AnimatableNumericValue \| ${number}%; } & { scaleX?: undefined; scaleY?: undefined; translateY?: undefined; perspective?: undefined; rotate?: undefined; rotateX?: undefined; rotateY?: undefined; rotateZ?: undefined; scale?: undefined; skewX?: undefined; skewY?: undefined; matrix?: undefined; }) \| ({ translateY: AnimatableNumericValue \| ${number}%; } & { scaleX?: undefined; scaleY?: undefined; translateX?: undefined; perspective?: undefined; rotate?: undefined; rotateX?: undefined; rotateY?: undefined; rotateZ?: undefined; scale?: undefined; skewX?: undefined; skewY?: undefined; matrix?: undefined; }) \| ({ perspective: AnimatableNumericValue; } & { scaleX?: undefined; scaleY?: undefined; translateX?: undefined; translateY?: undefined; rotate?: undefined; rotateX?: undefined; rotateY?: undefined; rotateZ?: undefined; scale?: undefined; skewX?: undefined; skewY?: undefined; matrix?: undefined; }) \| ({ rotate: AnimatableStringValue; } & { scaleX?: undefined; scaleY?: undefined; translateX?: undefined; translateY?: undefined; perspective?: undefined; rotateX?: undefined; rotateY?: undefined; rotateZ?: undefined; scale?: undefined; skewX?: undefined; skewY?: undefined; matrix?: undefined; }) \| ({ rotateX: AnimatableStringValue; } & { scaleX?: undefined; scaleY?: undefined; translateX?: undefined; translateY?: undefined; perspective?: undefined; rotate?: undefined; rotateY?: undefined; rotateZ?: undefined; scale?: undefined; skewX?: undefined; skewY?: undefined; matrix?: undefined; }) \| ({ rotateY: AnimatableStringValue; } & { scaleX?: undefined; scaleY?: undefined; translateX?: undefined; translateY?: undefined; perspective?: undefined; rotate?: undefined; rotateX?: undefined; rotateZ?: undefined; scale?: undefined; skewX?: undefined; skewY?: undefined; matrix?: undefined; }) \| ({ rotateZ: AnimatableStringValue; } & { scaleX?: undefined; scaleY?: undefined; translateX?: undefined; translateY?: undefined; perspective?: undefined; rotate?: undefined; rotateX?: undefined; rotateY?: undefined; scale?: undefined; skewX?: undefined; skewY?: undefined; matrix?: undefined; }) \| ({ scale: AnimatableNumericValue; } & { scaleX?: undefined; scaleY?: undefined; translateX?: undefined; translateY?: undefined; perspective?: undefined; rotate?: undefined; rotateX?: undefined; rotateY?: undefined; rotateZ?: undefined; skewX?: undefined; skewY?: undefined; matrix?: undefined; }) \| ({ skewX: AnimatableStringValue; } & { scaleX?: undefined; scaleY?: undefined; translateX?: undefined; translateY?: undefined; perspective?: undefined; rotate?: undefined; rotateX?: undefined; rotateY?: undefined; rotateZ?: undefined; scale?: undefined; skewY?: undefined; matrix?: undefined; }) \| ({ skewY: AnimatableStringValue; } & { scaleX?: undefined; scaleY?: undefined; translateX?: undefined; translateY?: undefined; perspective?: undefined; rotate?: undefined; rotateX?: undefined; rotateY?: undefined; rotateZ?: undefined; scale?: undefined; skewX?: undefined; matrix?: undefined; }) \| ({ matrix: AnimatableNumericValue[]; } & { scaleX?: undefined; scaleY?: undefined; translateX?: undefined; translateY?: undefined; perspective?: undefined; rotate?: undefined; rotateX?: undefined; rotateY?: undefined; rotateZ?: undefined; scale?: undefined; skewX?: undefined; skewY?: undefined; }))[]` | No | `-` | - |
| `userSelect` | `none \| auto \| text \| contain \| all` | No | `-` | - |
| `variant` | `warning \| positive \| negative \| foregroundMuted` | No | `-` | Variant color to apply to the subdetail text. |
| `width` | `null \| number \| AnimatedNode \| auto \| ${number}%` | No | `-` | - |
| `zIndex` | `number` | No | `-` | - |


## Styles

| Selector | Static class name | Description |
| --- | --- | --- |
| `root` | `-` | Root element |
| `contentContainer` | `-` | Content container element |
| `topContent` | `-` | Top content element |
| `bottomContent` | `-` | Bottom content element |
| `pressable` | `-` | Pressable wrapper element |
| `media` | `-` | Media element |
| `childrenContainer` | `-` | Children container wrapper, controls flex behavior |
| `intermediary` | `-` | Intermediary element |
| `end` | `-` | End element (detail or action container) End element |
| `accessory` | `-` | Accessory element |
| `mainContent` | `-` | Main content element |
| `titleStack` | `-` | Title stack element (title/subtitle/description VStack) |
| `titleStackContainer` | `-` | Title stack container wrapper, controls flex behavior |
| `helperText` | `-` | Helper text element |
| `title` | `-` | Title text element |
| `subtitle` | `-` | Subtitle text element |
| `description` | `-` | Description text element |


