# Timeline (/docs/timeline)





`Timeline` renders a vertical, chronological list of events. It's a pure Server Component — no state, no `"use client"` — so it drops straight into an RSC tree or an MDX page.

You compose it from `Timeline.Item` (one per event — it renders the bullet and the connecting line to the next item automatically), with two optional children: `Timeline.Label` for a leading date/timestamp, and `Timeline.Content` for the body, which can hold a `Timeline.Title`.

```tsx
import { Timeline } from "@42-central/ui-react/timeline";

<Timeline>
  <Timeline.Item color="green" variant="filled">
    <Timeline.Label>Mar 1, 2026</Timeline.Label>
    <Timeline.Content>
      <Timeline.Title>Libft submitted</Timeline.Title>
    </Timeline.Content>
  </Timeline.Item>
  <Timeline.Item variant="outline">
    <Timeline.Content>
      <Timeline.Title>Evaluation validated</Timeline.Title>
    </Timeline.Content>
  </Timeline.Item>
</Timeline>;
```

## Basic [#basic]

Without `Timeline.Label`, items lay out in a single column — the label track only exists when at least one item uses it (see [Labels](#labels)). An item with no `variant` gets `Timeline`'s own default — the same neutral, high-contrast (variant × color) `default` treatment as `Button`/`Card`, not a colored dot.

<Preview align="block" code="&#x22;<Timeline>\n  <Timeline.Item color=\&#x22;brand\&#x22; variant=\&#x22;filled\&#x22;>\n    <Timeline.Content>\n      <Timeline.Title>Application submitted</Timeline.Title>\n    </Timeline.Content>\n  </Timeline.Item>\n  <Timeline.Item color=\&#x22;brand\&#x22; variant=\&#x22;filled\&#x22;>\n    <Timeline.Content>\n      <Timeline.Title>Logic test passed</Timeline.Title>\n    </Timeline.Content>\n  </Timeline.Item>\n  <Timeline.Item>\n    <Timeline.Content>\n      <Timeline.Title>Piscine started</Timeline.Title>\n    </Timeline.Content>\n  </Timeline.Item>\n</Timeline>&#x22;">
  <Timeline className="w-full max-w-sm">
    <Timeline.Item color="brand" variant="filled">
      <Timeline.Content>
        <Timeline.Title>
          Application submitted
        </Timeline.Title>
      </Timeline.Content>
    </Timeline.Item>

    <Timeline.Item color="brand" variant="filled">
      <Timeline.Content>
        <Timeline.Title>
          Logic test passed
        </Timeline.Title>
      </Timeline.Content>
    </Timeline.Item>

    <Timeline.Item>
      <Timeline.Content>
        <Timeline.Title>
          Piscine started
        </Timeline.Title>
      </Timeline.Content>
    </Timeline.Item>
  </Timeline>
</Preview>

## Labels [#labels]

`Timeline.Label` renders into a leading column, sized to fit whatever the widest label is — not a fixed split. Add it to just one item and the column still appears (sized to that one label) without disturbing the others' alignment. Pass `color` to tint the label (and any icon inside it) to match the item's accent, and compose an icon in directly — `Timeline.Label` lays its children out in a row.

<Preview align="block" code="&#x22;<Timeline>\n  <Timeline.Item color=\&#x22;green\&#x22; variant=\&#x22;filled\&#x22;>\n    <Timeline.Label color=\&#x22;green\&#x22;><Calendar />Mar 1, 2026</Timeline.Label>\n    <Timeline.Content>\n      <Timeline.Title>Libft submitted</Timeline.Title>\n    </Timeline.Content>\n  </Timeline.Item>\n  <Timeline.Item color=\&#x22;green\&#x22; variant=\&#x22;filled\&#x22;>\n    <Timeline.Label color=\&#x22;green\&#x22;><Calendar />Mar 3, 2026</Timeline.Label>\n    <Timeline.Content>\n      <Timeline.Title>Evaluation booked</Timeline.Title>\n    </Timeline.Content>\n  </Timeline.Item>\n  <Timeline.Item>\n    <Timeline.Label><Calendar />Pending</Timeline.Label>\n    <Timeline.Content>\n      <Timeline.Title>ft_printf</Timeline.Title>\n    </Timeline.Content>\n  </Timeline.Item>\n</Timeline>&#x22;">
  <Timeline className="w-full max-w-sm">
    <Timeline.Item color="green" variant="filled">
      <Timeline.Label color="green">
        <Calendar />

        Mar 1, 2026
      </Timeline.Label>

      <Timeline.Content>
        <Timeline.Title>
          Libft submitted
        </Timeline.Title>
      </Timeline.Content>
    </Timeline.Item>

    <Timeline.Item color="green" variant="filled">
      <Timeline.Label color="green">
        <Calendar />

        Mar 3, 2026
      </Timeline.Label>

      <Timeline.Content>
        <Timeline.Title>
          Evaluation booked
        </Timeline.Title>
      </Timeline.Content>
    </Timeline.Item>

    <Timeline.Item>
      <Timeline.Label>
        <Calendar />

        Pending
      </Timeline.Label>

      <Timeline.Content>
        <Timeline.Title>
          ft_printf
        </Timeline.Title>
      </Timeline.Content>
    </Timeline.Item>
  </Timeline>
</Preview>

## Status colors & custom bullets [#status-colors--custom-bullets]

`color` and `variant` on `Timeline.Item` theme the bullet — the same (variant × color) axis as `Badge`/`Button`. `filled` rings its own fill with a background-colored gap, so it reads as a halo rather than a flat disc. Pass a `bullet` node (an icon, `<Spinner>`, anything) to replace the dot entirely, e.g. for an in-progress step.

<Preview align="block" code="&#x22;<Timeline>\n  <Timeline.Item color=\&#x22;green\&#x22; variant=\&#x22;filled\&#x22; bullet={<Check />}>\n    <Timeline.Content>\n      <Timeline.Title>Libft validated</Timeline.Title>\n    </Timeline.Content>\n  </Timeline.Item>\n  <Timeline.Item color=\&#x22;brand\&#x22; variant=\&#x22;filled\&#x22; bullet={<Users />}>\n    <Timeline.Content>\n      <Timeline.Title>ft_printf in evaluation</Timeline.Title>\n    </Timeline.Content>\n  </Timeline.Item>\n  <Timeline.Item color=\&#x22;brand\&#x22; variant=\&#x22;filled\&#x22; bullet={<Spinner />}>\n    <Timeline.Content>\n      <Timeline.Title>get_next_line in progress</Timeline.Title>\n    </Timeline.Content>\n  </Timeline.Item>\n  <Timeline.Item variant=\&#x22;outline\&#x22;>\n    <Timeline.Content>\n      <Timeline.Title>Minishell</Timeline.Title>\n    </Timeline.Content>\n  </Timeline.Item>\n</Timeline>&#x22;">
  <Timeline className="w-full max-w-sm">
    <Timeline.Item color="green" variant="filled" bullet="<Check />">
      <Timeline.Content>
        <Timeline.Title>
          Libft validated
        </Timeline.Title>
      </Timeline.Content>
    </Timeline.Item>

    <Timeline.Item color="brand" variant="filled" bullet="<Users />">
      <Timeline.Content>
        <Timeline.Title>
          ft_printf in evaluation
        </Timeline.Title>
      </Timeline.Content>
    </Timeline.Item>

    <Timeline.Item color="brand" variant="filled" bullet="<Spinner />">
      <Timeline.Content>
        <Timeline.Title>
          get_next_line in progress
        </Timeline.Title>
      </Timeline.Content>
    </Timeline.Item>

    <Timeline.Item variant="outline">
      <Timeline.Content>
        <Timeline.Title>
          Minishell
        </Timeline.Title>
      </Timeline.Content>
    </Timeline.Item>
  </Timeline>
</Preview>

## Line colors [#line-colors]

Every connecting line blends from its dot's color into the next dot's, so a run of statuses reads as one continuous path instead of hard color cuts at each bullet. Every line end is always the exact color its dot draws — whatever the variant, color, or state below — so the line never lands on a color the dot doesn't have.

### Blending between colors [#blending-between-colors]

Any two neighbours blend — palette colors, a gradient, and a `default` dot, in whatever order.

<Preview align="block" code="&#x22;<Timeline size=\&#x22;lg\&#x22;>\n  <Timeline.Item color=\&#x22;green\&#x22; variant=\&#x22;filled\&#x22;>\n    <Timeline.Content>\n      <Timeline.Title>Libft validated</Timeline.Title>\n      125/100 — bonus included.\n    </Timeline.Content>\n  </Timeline.Item>\n  <Timeline.Item color=\&#x22;yellow\&#x22; variant=\&#x22;filled\&#x22;>\n    <Timeline.Content>\n      <Timeline.Title>ft_printf retry</Timeline.Title>\n      Failed the first evaluation, booked a second slot.\n    </Timeline.Content>\n  </Timeline.Item>\n  <Timeline.Item color=\&#x22;red\&#x22; variant=\&#x22;outline\&#x22;>\n    <Timeline.Content>\n      <Timeline.Title>Blackhole in 12 days</Timeline.Title>\n      Validate a project to push it back.\n    </Timeline.Content>\n  </Timeline.Item>\n  <Timeline.Item variant=\&#x22;gradient\&#x22;>\n    <Timeline.Content>\n      <Timeline.Title>Common Core reached</Timeline.Title>\n      Gradient bullets blend through their own stops.\n    </Timeline.Content>\n  </Timeline.Item>\n  <Timeline.Item>\n    <Timeline.Content>\n      <Timeline.Title>Specialization</Timeline.Title>\n    </Timeline.Content>\n  </Timeline.Item>\n</Timeline>&#x22;">
  <Timeline size="lg" className="w-full max-w-sm">
    <Timeline.Item color="green" variant="filled">
      <Timeline.Content>
        <Timeline.Title>Libft validated</Timeline.Title>
        125/100 — bonus included.
      </Timeline.Content>
    </Timeline.Item>

    <Timeline.Item color="yellow" variant="filled">
      <Timeline.Content>
        <Timeline.Title>ft\_printf retry</Timeline.Title>
        Failed the first evaluation, booked a second slot.
      </Timeline.Content>
    </Timeline.Item>

    <Timeline.Item color="red" variant="outline">
      <Timeline.Content>
        <Timeline.Title>Blackhole in 12 days</Timeline.Title>
        Validate a project to push it back.
      </Timeline.Content>
    </Timeline.Item>

    <Timeline.Item variant="gradient">
      <Timeline.Content>
        <Timeline.Title>Common Core reached</Timeline.Title>
        Gradient bullets blend through their own stops.
      </Timeline.Content>
    </Timeline.Item>

    <Timeline.Item>
      <Timeline.Content>
        <Timeline.Title>
          Specialization
        </Timeline.Title>
      </Timeline.Content>
    </Timeline.Item>
  </Timeline>
</Preview>

### Every variant [#every-variant]

Each end takes the color its bullet draws with: `--c-solid` for `filled`, `outline` and `dashed`, a `gradient`'s own stops, and a `default` dot's inverted fill.

<Preview align="block" code="&#x22;<Timeline size=\&#x22;lg\&#x22;>\n  <Timeline.Item color=\&#x22;brand\&#x22; variant=\&#x22;filled\&#x22;>\n    <Timeline.Content>\n      <Timeline.Title>filled</Timeline.Title>\n      Ends in --c-solid, its fill.\n    </Timeline.Content>\n  </Timeline.Item>\n  <Timeline.Item color=\&#x22;brand\&#x22; variant=\&#x22;outline\&#x22;>\n    <Timeline.Content>\n      <Timeline.Title>outline</Timeline.Title>\n      Ends in --c-solid, its ring.\n    </Timeline.Content>\n  </Timeline.Item>\n  <Timeline.Item color=\&#x22;brand\&#x22; variant=\&#x22;dashed\&#x22;>\n    <Timeline.Content>\n      <Timeline.Title>dashed</Timeline.Title>\n      Ends in --c-solid, its dashed ring.\n    </Timeline.Content>\n  </Timeline.Item>\n  <Timeline.Item variant=\&#x22;gradient\&#x22;>\n    <Timeline.Content>\n      <Timeline.Title>gradient</Timeline.Title>\n      Entered at from, left at to.\n    </Timeline.Content>\n  </Timeline.Item>\n  <Timeline.Item>\n    <Timeline.Content>\n      <Timeline.Title>default</Timeline.Title>\n      Ends in its own inverted fill.\n    </Timeline.Content>\n  </Timeline.Item>\n</Timeline>&#x22;">
  <Timeline size="lg" className="w-full max-w-sm">
    <Timeline.Item color="brand" variant="filled">
      <Timeline.Content>
        <Timeline.Title>filled</Timeline.Title>
        Ends in --c-solid, its fill.
      </Timeline.Content>
    </Timeline.Item>

    <Timeline.Item color="brand" variant="outline">
      <Timeline.Content>
        <Timeline.Title>outline</Timeline.Title>
        Ends in --c-solid, its ring.
      </Timeline.Content>
    </Timeline.Item>

    <Timeline.Item color="brand" variant="dashed">
      <Timeline.Content>
        <Timeline.Title>dashed</Timeline.Title>
        Ends in --c-solid, its dashed ring.
      </Timeline.Content>
    </Timeline.Item>

    <Timeline.Item variant="gradient">
      <Timeline.Content>
        <Timeline.Title>gradient</Timeline.Title>
        Entered at from, left at to.
      </Timeline.Content>
    </Timeline.Item>

    <Timeline.Item>
      <Timeline.Content>
        <Timeline.Title>default</Timeline.Title>
        Ends in its own inverted fill.
      </Timeline.Content>
    </Timeline.Item>
  </Timeline>
</Preview>

### Uncolored bullets [#uncolored-bullets]

Without a `color`, a bullet draws in the neutral palette — and its line ends read the same slots, so they land on the neutral too.

<Preview align="block" code="&#x22;<Timeline size=\&#x22;lg\&#x22;>\n  <Timeline.Item variant=\&#x22;filled\&#x22;>\n    <Timeline.Content>\n      <Timeline.Title>filled</Timeline.Title>\n    </Timeline.Content>\n  </Timeline.Item>\n  <Timeline.Item variant=\&#x22;outline\&#x22;>\n    <Timeline.Content>\n      <Timeline.Title>outline</Timeline.Title>\n    </Timeline.Content>\n  </Timeline.Item>\n  <Timeline.Item variant=\&#x22;dashed\&#x22;>\n    <Timeline.Content>\n      <Timeline.Title>dashed</Timeline.Title>\n    </Timeline.Content>\n  </Timeline.Item>\n</Timeline>&#x22;">
  <Timeline size="lg" className="w-full max-w-sm">
    <Timeline.Item variant="filled">
      <Timeline.Content>
        <Timeline.Title>
          filled
        </Timeline.Title>
      </Timeline.Content>
    </Timeline.Item>

    <Timeline.Item variant="outline">
      <Timeline.Content>
        <Timeline.Title>
          outline
        </Timeline.Title>
      </Timeline.Content>
    </Timeline.Item>

    <Timeline.Item variant="dashed">
      <Timeline.Content>
        <Timeline.Title>
          dashed
        </Timeline.Title>
      </Timeline.Content>
    </Timeline.Item>
  </Timeline>
</Preview>

### Gradient stops [#gradient-stops]

A `gradient` bullet is entered at its `from` stop and left at its `to`, so chained gradients read as one continuous fade — each line runs from one bullet's `to` into the next one's `from`.

<Preview align="block" code="&#x22;<Timeline size=\&#x22;lg\&#x22;>\n  <Timeline.Item variant=\&#x22;gradient\&#x22; gradient={{ from: \&#x22;#f59e0b\&#x22;, to: \&#x22;#ef4444\&#x22; }}>\n    <Timeline.Content>\n      <Timeline.Title>Sunrise</Timeline.Title>\n      Amber → red.\n    </Timeline.Content>\n  </Timeline.Item>\n  <Timeline.Item variant=\&#x22;gradient\&#x22; gradient={{ from: \&#x22;#22d3ee\&#x22;, to: \&#x22;#6366f1\&#x22; }}>\n    <Timeline.Content>\n      <Timeline.Title>Ocean</Timeline.Title>\n      The line runs red → cyan.\n    </Timeline.Content>\n  </Timeline.Item>\n  <Timeline.Item variant=\&#x22;gradient\&#x22;>\n    <Timeline.Content>\n      <Timeline.Title>Default stops</Timeline.Title>\n      The line runs indigo → purple.\n    </Timeline.Content>\n  </Timeline.Item>\n  <Timeline.Item color=\&#x22;pink\&#x22; variant=\&#x22;filled\&#x22;>\n    <Timeline.Content>\n      <Timeline.Title>Pink</Timeline.Title>\n      Picks up from the pink stop.\n    </Timeline.Content>\n  </Timeline.Item>\n</Timeline>&#x22;">
  <Timeline size="lg" className="w-full max-w-sm">
    <Timeline.Item variant="gradient" gradient="{ from: &#x22;#f59e0b&#x22;, to: &#x22;#ef4444&#x22; }">
      <Timeline.Content>
        <Timeline.Title>Sunrise</Timeline.Title>
        Amber → red.
      </Timeline.Content>
    </Timeline.Item>

    <Timeline.Item variant="gradient" gradient="{ from: &#x22;#22d3ee&#x22;, to: &#x22;#6366f1&#x22; }">
      <Timeline.Content>
        <Timeline.Title>Ocean</Timeline.Title>
        The line runs red → cyan.
      </Timeline.Content>
    </Timeline.Item>

    <Timeline.Item variant="gradient">
      <Timeline.Content>
        <Timeline.Title>Default stops</Timeline.Title>
        The line runs indigo → purple.
      </Timeline.Content>
    </Timeline.Item>

    <Timeline.Item color="pink" variant="filled">
      <Timeline.Content>
        <Timeline.Title>Pink</Timeline.Title>
        Picks up from the pink stop.
      </Timeline.Content>
    </Timeline.Item>
  </Timeline>
</Preview>

### Dashes and icons [#dashes-and-icons]

Dashes are cut out of the line with a mask, so a dashed segment still blends. A custom `bullet` replaces only the dot's content — the line still follows the item's `color`, `variant` and state.

<Preview align="block" code="&#x22;<Timeline size=\&#x22;lg\&#x22; active={3}>\n  <Timeline.Item color=\&#x22;green\&#x22; variant=\&#x22;filled\&#x22; bullet={<Check />}>\n    <Timeline.Content>\n      <Timeline.Title>libft</Timeline.Title>\n      Solid, green → brand.\n    </Timeline.Content>\n  </Timeline.Item>\n  <Timeline.Item color=\&#x22;brand\&#x22; variant=\&#x22;filled\&#x22; bullet={<Users />} lineVariant=\&#x22;dashed\&#x22;>\n    <Timeline.Content>\n      <Timeline.Title>ft_printf</Timeline.Title>\n      Dashed below, brand → brand.\n    </Timeline.Content>\n  </Timeline.Item>\n  <Timeline.Item color=\&#x22;brand\&#x22; variant=\&#x22;filled\&#x22; bullet={<Spinner />} lineVariant=\&#x22;dashed\&#x22;>\n    <Timeline.Content>\n      <Timeline.Title>get_next_line</Timeline.Title>\n      Dashed below, brand → the active dot.\n    </Timeline.Content>\n  </Timeline.Item>\n  <Timeline.Item>\n    <Timeline.Content>\n      <Timeline.Title>minishell</Timeline.Title>\n      Active.\n    </Timeline.Content>\n  </Timeline.Item>\n  <Timeline.Item>\n    <Timeline.Content>\n      <Timeline.Title>philosophers</Timeline.Title>\n      Pending.\n    </Timeline.Content>\n  </Timeline.Item>\n</Timeline>&#x22;">
  <Timeline size="lg" active="3" className="w-full max-w-sm">
    <Timeline.Item color="green" variant="filled" bullet="<Check />">
      <Timeline.Content>
        <Timeline.Title>libft</Timeline.Title>
        Solid, green → brand.
      </Timeline.Content>
    </Timeline.Item>

    <Timeline.Item color="brand" variant="filled" bullet="<Users />" lineVariant="dashed">
      <Timeline.Content>
        <Timeline.Title>ft\_printf</Timeline.Title>
        Dashed below, brand → brand.
      </Timeline.Content>
    </Timeline.Item>

    <Timeline.Item color="brand" variant="filled" bullet="<Spinner />" lineVariant="dashed">
      <Timeline.Content>
        <Timeline.Title>get\_next\_line</Timeline.Title>
        Dashed below, brand → the active dot.
      </Timeline.Content>
    </Timeline.Item>

    <Timeline.Item>
      <Timeline.Content>
        <Timeline.Title>minishell</Timeline.Title>
        Active.
      </Timeline.Content>
    </Timeline.Item>

    <Timeline.Item>
      <Timeline.Content>
        <Timeline.Title>philosophers</Timeline.Title>
        Pending.
      </Timeline.Content>
    </Timeline.Item>
  </Timeline>
</Preview>

## Progress [#progress]

Pass `active` — the index of the current step among the `Timeline.Item`s — to turn a timeline into progress. Steps up to and including it render as usual, and the active one gets `aria-current="step"`. Steps after it are pending: every variant switches to the palette's disabled colors (colored ones included), a `default` dot shrinks to its bare outer ring, and a `gradient` flattens. Each item exposes its state as `data-state` (`complete`, `active` or `pending`) for your own styling.

<Preview align="block" code="&#x22;<Timeline size=\&#x22;lg\&#x22; active={2}>\n  <Timeline.Item color=\&#x22;green\&#x22; variant=\&#x22;filled\&#x22;>\n    <Timeline.Content>\n      <Timeline.Title>libft</Timeline.Title>\n      Complete.\n    </Timeline.Content>\n  </Timeline.Item>\n  <Timeline.Item>\n    <Timeline.Content>\n      <Timeline.Title>ft_printf</Timeline.Title>\n      Complete.\n    </Timeline.Content>\n  </Timeline.Item>\n  <Timeline.Item>\n    <Timeline.Content>\n      <Timeline.Title>get_next_line</Timeline.Title>\n      Active — aria-current=\&#x22;step\&#x22;.\n    </Timeline.Content>\n  </Timeline.Item>\n  <Timeline.Item>\n    <Timeline.Content>\n      <Timeline.Title>minitalk</Timeline.Title>\n      Pending — a bare ring.\n    </Timeline.Content>\n  </Timeline.Item>\n  <Timeline.Item color=\&#x22;red\&#x22; variant=\&#x22;filled\&#x22;>\n    <Timeline.Content>\n      <Timeline.Title>pipex</Timeline.Title>\n      Pending — colored items dim too.\n    </Timeline.Content>\n  </Timeline.Item>\n  <Timeline.Item variant=\&#x22;gradient\&#x22;>\n    <Timeline.Content>\n      <Timeline.Title>philosophers</Timeline.Title>\n      Pending — the gradient flattens.\n    </Timeline.Content>\n  </Timeline.Item>\n</Timeline>&#x22;">
  <TimelineProgressDemo />
</Preview>

### Marking the active item [#marking-the-active-item]

When the data already knows which entry is current, pass `active` on that `Timeline.Item` instead of computing an index. An item's `active` overrides the root's; if several items pass it, the first one wins, and `active={false}` is the same as leaving it unset.

<Preview align="block" code="&#x22;<Timeline size=\&#x22;lg\&#x22; active={0}>\n  <Timeline.Item color=\&#x22;brand\&#x22; variant=\&#x22;filled\&#x22;>\n    <Timeline.Content>\n      <Timeline.Title>Application</Timeline.Title>\n    </Timeline.Content>\n  </Timeline.Item>\n  <Timeline.Item color=\&#x22;brand\&#x22; variant=\&#x22;filled\&#x22;>\n    <Timeline.Content>\n      <Timeline.Title>Piscine</Timeline.Title>\n    </Timeline.Content>\n  </Timeline.Item>\n  <Timeline.Item active>\n    <Timeline.Content>\n      <Timeline.Title>Common Core</Timeline.Title>\n      Marked on the item — overrides the root.\n    </Timeline.Content>\n  </Timeline.Item>\n  <Timeline.Item>\n    <Timeline.Content>\n      <Timeline.Title>Specialization</Timeline.Title>\n    </Timeline.Content>\n  </Timeline.Item>\n</Timeline>&#x22;">
  <Timeline size="lg" active="0" className="w-full max-w-sm">
    <Timeline.Item color="brand" variant="filled">
      <Timeline.Content>
        <Timeline.Title>
          Application
        </Timeline.Title>
      </Timeline.Content>
    </Timeline.Item>

    <Timeline.Item color="brand" variant="filled">
      <Timeline.Content>
        <Timeline.Title>
          Piscine
        </Timeline.Title>
      </Timeline.Content>
    </Timeline.Item>

    <Timeline.Item>
      <Timeline.Content>
        <Timeline.Title>Common Core</Timeline.Title>
        Marked on the item — overrides the root.
      </Timeline.Content>
    </Timeline.Item>

    <Timeline.Item>
      <Timeline.Content>
        <Timeline.Title>
          Specialization
        </Timeline.Title>
      </Timeline.Content>
    </Timeline.Item>
  </Timeline>
</Preview>

### Out of range [#out-of-range]

An index past the last step marks every step complete; a negative one marks every step pending. Leave `active` unset on both levels for a plain event list — nothing dims, and the line between `default` dots is their own fill.

<Preview align="block" code="&#x22;<Timeline size=\&#x22;lg\&#x22; active={-1}>\n  <Timeline.Item>\n    <Timeline.Content>\n      <Timeline.Title>Joined the campus</Timeline.Title>\n    </Timeline.Content>\n  </Timeline.Item>\n  <Timeline.Item>\n    <Timeline.Content>\n      <Timeline.Title>Met the cohort</Timeline.Title>\n    </Timeline.Content>\n  </Timeline.Item>\n  <Timeline.Item>\n    <Timeline.Content>\n      <Timeline.Title>First project</Timeline.Title>\n    </Timeline.Content>\n  </Timeline.Item>\n</Timeline>&#x22;">
  <Timeline size="lg" active="-1" className="w-full max-w-sm">
    <Timeline.Item>
      <Timeline.Content>
        <Timeline.Title>
          Joined the campus
        </Timeline.Title>
      </Timeline.Content>
    </Timeline.Item>

    <Timeline.Item>
      <Timeline.Content>
        <Timeline.Title>
          Met the cohort
        </Timeline.Title>
      </Timeline.Content>
    </Timeline.Item>

    <Timeline.Item>
      <Timeline.Content>
        <Timeline.Title>
          First project
        </Timeline.Title>
      </Timeline.Content>
    </Timeline.Item>
  </Timeline>
</Preview>

The short stretch `axisOffset` opens above a shifted bullet is drawn in that bullet's own entry color — see [Gradient with axisOffset](#gradient-with-axisoffset).

## Dashed bullet [#dashed-bullet]

`variant="dashed"` draws the outline ring with a dashed stroke instead of solid — reads as a lighter-weight or "not yet reached" step, distinct from `outline`'s solid ring.

<Preview align="block" code="&#x22;<Timeline>\n  <Timeline.Item color=\&#x22;purple\&#x22; variant=\&#x22;filled\&#x22;>\n    <Timeline.Content>\n      <Timeline.Title>Evaluated</Timeline.Title>\n    </Timeline.Content>\n  </Timeline.Item>\n  <Timeline.Item color=\&#x22;purple\&#x22; variant=\&#x22;dashed\&#x22;>\n    <Timeline.Content>\n      <Timeline.Title>Evaluation scheduled</Timeline.Title>\n    </Timeline.Content>\n  </Timeline.Item>\n  <Timeline.Item color=\&#x22;purple\&#x22; variant=\&#x22;outline\&#x22;>\n    <Timeline.Content>\n      <Timeline.Title>Waiting for a slot</Timeline.Title>\n    </Timeline.Content>\n  </Timeline.Item>\n</Timeline>&#x22;">
  <Timeline className="w-full max-w-sm">
    <Timeline.Item color="purple" variant="filled">
      <Timeline.Content>
        <Timeline.Title>
          Evaluated
        </Timeline.Title>
      </Timeline.Content>
    </Timeline.Item>

    <Timeline.Item color="purple" variant="dashed">
      <Timeline.Content>
        <Timeline.Title>
          Evaluation scheduled
        </Timeline.Title>
      </Timeline.Content>
    </Timeline.Item>

    <Timeline.Item color="purple" variant="outline">
      <Timeline.Content>
        <Timeline.Title>
          Waiting for a slot
        </Timeline.Title>
      </Timeline.Content>
    </Timeline.Item>
  </Timeline>
</Preview>

## Gradient [#gradient]

`variant="gradient"` fills the bullet with a gradient instead of a flat color, the same `gradient` prop shape as `Badge`/`Card` (`from`/`to`/`via`/`dir`, defaulting to purple-300 → pink-400, left-to-right).

<Preview align="block" code="&#x22;<Timeline.Item variant=\&#x22;gradient\&#x22;>{/* … */}</Timeline.Item>\n<Timeline.Item variant=\&#x22;gradient\&#x22; gradient={{ from: '#f59e0b', to: '#ef4444', dir: 'to-br' }}>\n  {/* … */}\n</Timeline.Item>&#x22;">
  <Timeline className="w-full max-w-sm">
    <Timeline.Item variant="gradient">
      <Timeline.Content>
        <Timeline.Title>
          Bocal member
        </Timeline.Title>
      </Timeline.Content>
    </Timeline.Item>

    <Timeline.Item variant="gradient" gradient="{ from: &#x22;#f59e0b&#x22;, to: &#x22;#ef4444&#x22;, dir: &#x22;to-br&#x22; }">
      <Timeline.Content>
        <Timeline.Title>
          Blackhole warning
        </Timeline.Title>
      </Timeline.Content>
    </Timeline.Item>
  </Timeline>
</Preview>

## Gradient with axisOffset [#gradient-with-axisoffset]

`axisOffset` works the same regardless of `variant` — it only moves the bullet+line column, never the color. The connector above the shifted bullet still blends all the way into it, and the short stretch `axisOffset` opens above the bullet is drawn in that bullet's own entry color — for a gradient, its `from` stop — so the line meets it with no seam.

<Preview align="block" code="&#x22;<Timeline size=\&#x22;lg\&#x22;>\n  <Timeline.Item size=\&#x22;xl\&#x22; variant=\&#x22;gradient\&#x22; axisOffset=\&#x22;11px\&#x22;>\n    <Timeline.Content>\n      <Card padding=\&#x22;none\&#x22;>\n        <Card.Header>\n          <Card.Title>ft_transcendence</Card.Title>\n        </Card.Header>\n        <Card.Content>\n          <Text span c=\&#x22;muted\&#x22;>\n            In progress — gradient bullet aligned to this title via axisOffset.\n          </Text>\n        </Card.Content>\n      </Card>\n    </Timeline.Content>\n  </Timeline.Item>\n  <Timeline.Item variant=\&#x22;outline\&#x22; size=\&#x22;xs\&#x22; axisOffset=\&#x22;18px\&#x22;>\n    <Timeline.Content>\n      <Card padding=\&#x22;none\&#x22;>\n        <Card.Header>\n          <Card.Title>Common Core completed</Card.Title>\n        </Card.Header>\n      </Card>\n    </Timeline.Content>\n  </Timeline.Item>\n</Timeline>&#x22;">
  <Timeline size="lg" className="w-full max-w-sm">
    <Timeline.Item size="xl" variant="gradient" axisOffset="11px">
      <Timeline.Content>
        <Card padding="none">
          <Card.Header>
            <Card.Title>
              ft_transcendence
            </Card.Title>
          </Card.Header>

          <Card.Content>
            <Text c="muted">
              In progress — gradient bullet aligned to this title via
              axisOffset.
            </Text>
          </Card.Content>
        </Card>
      </Timeline.Content>
    </Timeline.Item>

    <Timeline.Item variant="outline" size="xs" axisOffset="18px">
      <Timeline.Content>
        <Card padding="none">
          <Card.Header>
            <Card.Title>
              Common Core completed
            </Card.Title>
          </Card.Header>
        </Card>
      </Timeline.Content>
    </Timeline.Item>
  </Timeline>
</Preview>

## Dashed line [#dashed-line]

`lineVariant="dashed"` on `Timeline` swaps every connecting line for a dashed one. A `Timeline.Item` can override just the segment below it with its own `lineVariant`, mixing solid and dashed within one timeline. Dashes are cut out of the line with a mask, so a dashed segment still blends between its two items' colors.

<Preview align="block" code="&#x22;<Timeline lineVariant=\&#x22;dashed\&#x22;>{/* … */}</Timeline>\n\n// Mixed, per segment:\n\n<Timeline>\n  <Timeline.Item color=\&#x22;brand\&#x22; variant=\&#x22;filled\&#x22;>{/* solid below */}</Timeline.Item>\n  <Timeline.Item lineVariant=\&#x22;dashed\&#x22;>{/* dashed below */}</Timeline.Item>\n  <Timeline.Item variant=\&#x22;outline\&#x22;>{/* … */}</Timeline.Item>\n</Timeline>&#x22;">
  <div className="flex w-full max-w-sm flex-col gap-6">
    <Timeline lineVariant="dashed">
      <Timeline.Item color="brand" variant="filled">
        <Timeline.Content>
          <Timeline.Title>
            libft pushed
          </Timeline.Title>
        </Timeline.Content>
      </Timeline.Item>

      <Timeline.Item>
        <Timeline.Content>
          <Timeline.Title>
            Awaiting evaluation
          </Timeline.Title>
        </Timeline.Content>
      </Timeline.Item>
    </Timeline>

    <Timeline>
      <Timeline.Item color="brand" variant="filled">
        <Timeline.Content>
          <Timeline.Title>
            ft_printf validated
          </Timeline.Title>
        </Timeline.Content>
      </Timeline.Item>

      <Timeline.Item color="brand" variant="dashed" lineVariant="dashed">
        <Timeline.Content>
          <Timeline.Title>
            minitalk in evaluation
          </Timeline.Title>
        </Timeline.Content>
      </Timeline.Item>

      <Timeline.Item variant="outline">
        <Timeline.Content>
          <Timeline.Title>
            pipex
          </Timeline.Title>
        </Timeline.Content>
      </Timeline.Item>
    </Timeline>
  </div>
</Preview>

## Density [#density]

`size` on `Timeline` scales the bullet, line thickness, spacing, and text from `xs` to `xl` (default `md`), reusing the kit's canonical `Size` scale. A `Timeline.Item` can override just its own bullet with its own `size` — everything else (line, spacing, text) still follows the timeline's density.

<Preview align="block" code="&#x22;<Timeline size=\&#x22;sm\&#x22;>{/* … */}</Timeline>\n<Timeline size=\&#x22;lg\&#x22;>{/* … */}</Timeline>&#x22;">
  <div className="flex w-full max-w-sm flex-col gap-6">
    <Timeline size="sm">
      <Timeline.Item color="brand" variant="filled">
        <Timeline.Content>
          <Timeline.Title>
            Compact (sm)
          </Timeline.Title>
        </Timeline.Content>
      </Timeline.Item>

      <Timeline.Item>
        <Timeline.Content>
          <Timeline.Title>
            Common Core project
          </Timeline.Title>
        </Timeline.Content>
      </Timeline.Item>
    </Timeline>

    <Timeline size="lg">
      <Timeline.Item color="brand" variant="filled">
        <Timeline.Content>
          <Timeline.Title>
            Roomy (lg)
          </Timeline.Title>
        </Timeline.Content>
      </Timeline.Item>

      <Timeline.Item>
        <Timeline.Content>
          <Timeline.Title>
            Common Core project
          </Timeline.Title>
        </Timeline.Content>
      </Timeline.Item>
    </Timeline>
  </div>
</Preview>

<Preview align="block" code="&#x22;<Timeline>\n  <Timeline.Item color=\&#x22;brand\&#x22; variant=\&#x22;filled\&#x22; size=\&#x22;xl\&#x22;>\n    <Timeline.Content>\n      <Timeline.Title>Piscine started — bigger dot, same line and spacing</Timeline.Title>\n    </Timeline.Content>\n  </Timeline.Item>\n  <Timeline.Item>\n    <Timeline.Content>\n      <Timeline.Title>Common Core project</Timeline.Title>\n    </Timeline.Content>\n  </Timeline.Item>\n</Timeline>&#x22;">
  <Timeline className="w-full max-w-sm">
    <Timeline.Item color="brand" variant="filled" size="xl">
      <Timeline.Content>
        <Timeline.Title>
          Piscine started — bigger dot, same line and spacing
        </Timeline.Title>
      </Timeline.Content>
    </Timeline.Item>

    <Timeline.Item>
      <Timeline.Content>
        <Timeline.Title>
          Common Core project
        </Timeline.Title>
      </Timeline.Content>
    </Timeline.Item>
  </Timeline>
</Preview>

## Course roadmap [#course-roadmap]

Because `Timeline.Content` takes any content, an item's body is often a full card, not just a title — a curriculum roadmap composes `Card` (+ `Badge` for status, `Button` for actions) inside each item. `active={0}` marks the first card as the current step: it keeps a larger, ringed `default` bullet and a brighter card border, while the upcoming steps render as small pending rings next to the card's own quieter default border. Each item's `axisOffset="Npx"` nudges the bullet *and* the connecting line down together to line up with that card's title — Timeline has no way to know a title sits inside its content on its own.

<Preview align="block" code="&#x22;<Timeline size=\&#x22;lg\&#x22; active={0}>\n  {/* axisOffset shifts the bullet+line column down to line up with this\n      card's title — Timeline can't see inside Timeline.Content to know\n      where a title sits on its own. */}\n  <Timeline.Item size=\&#x22;xl\&#x22; axisOffset=\&#x22;11px\&#x22;>\n    <Timeline.Content>\n      <Card padding=\&#x22;none\&#x22; className=\&#x22;border-gray-light-400 dark:border-gray-dark-400\&#x22;>\n        <Card.Header>\n          <div className=\&#x22;flex items-center justify-between gap-3\&#x22;>\n            <Card.Title>Shell Fundamentals</Card.Title>\n            <Badge variant=\&#x22;light\&#x22;>Available</Badge>\n          </div>\n        </Card.Header>\n        <Card.Content>\n          <Text span c=\&#x22;muted\&#x22;>\n            Learn the basics of using the shell, a command-line interpreter\n            that allows you to interact with your operating system.\n          </Text>\n        </Card.Content>\n        <Card.Footer>\n          <Button size=\&#x22;sm\&#x22;>Discover my project</Button>\n        </Card.Footer>\n      </Card>\n    </Timeline.Content>\n  </Timeline.Item>\n  <Timeline.Item size=\&#x22;xs\&#x22; axisOffset=\&#x22;18px\&#x22;>\n    <Timeline.Content>\n      <Card padding=\&#x22;none\&#x22;>\n        <Card.Header>\n          <div className=\&#x22;flex items-center justify-between gap-3\&#x22;>\n            <Card.Title>Git Fundamentals</Card.Title>\n            <Badge variant=\&#x22;light\&#x22; color=\&#x22;neutral\&#x22;>Unavailable</Badge>\n          </div>\n        </Card.Header>\n        <Card.Content>\n          <Text span c=\&#x22;muted\&#x22;>\n            Learn the basics of Git, a popular version control system used\n            to track changes in your code, collaborate with others, and\n            submit your work for evaluation.\n          </Text>\n        </Card.Content>\n      </Card>\n    </Timeline.Content>\n  </Timeline.Item>\n  <Timeline.Item size=\&#x22;xs\&#x22; axisOffset=\&#x22;18px\&#x22;>\n    <Timeline.Content>\n      <Card padding=\&#x22;none\&#x22;>\n        <Card.Header>\n          <div className=\&#x22;flex items-center justify-between gap-3\&#x22;>\n            <Card.Title>Shell searching and finding</Card.Title>\n            <Badge variant=\&#x22;light\&#x22; color=\&#x22;neutral\&#x22;>Unavailable</Badge>\n          </div>\n        </Card.Header>\n        <Card.Content>\n          <Text span c=\&#x22;muted\&#x22;>\n            Learn how to find files and information within your system\n            thanks to find and grep to locate specific files, search within\n            files, and filter results based on various criteria.\n          </Text>\n        </Card.Content>\n      </Card>\n    </Timeline.Content>\n  </Timeline.Item>\n  <Timeline.Item size=\&#x22;xs\&#x22; axisOffset=\&#x22;18px\&#x22;>\n    <Timeline.Content>\n      <Card padding=\&#x22;none\&#x22;>\n        <Card.Header>\n          <Card.Title>Exam 00</Card.Title>\n        </Card.Header>\n        <Card.Content>\n          <Text span c=\&#x22;muted\&#x22;>Exam details will soon be available.</Text>\n        </Card.Content>\n      </Card>\n    </Timeline.Content>\n  </Timeline.Item>\n  <Timeline.Item size=\&#x22;xs\&#x22; axisOffset=\&#x22;22px\&#x22;>\n    <Timeline.Content>\n      <Card padding=\&#x22;none\&#x22;>\n        <Card.Header>\n          <div className=\&#x22;flex items-center justify-between gap-3\&#x22;>\n            <Card.Title>Square</Card.Title>\n            <div className=\&#x22;flex gap-2\&#x22;>\n              <Button size=\&#x22;sm\&#x22;>Register</Button>\n              <Button variant=\&#x22;subtle\&#x22; color=\&#x22;white\&#x22; size=\&#x22;sm\&#x22;>Go to Rush</Button>\n            </div>\n          </div>\n        </Card.Header>\n      </Card>\n    </Timeline.Content>\n  </Timeline.Item>\n</Timeline>&#x22;">
  <Timeline size="lg" active="0" className="w-full max-w-xl">
    <Timeline.Item size="xl" axisOffset="11px">
      <Timeline.Content>
        <Card padding="none" className="border-gray-light-400 dark:border-gray-dark-400">
          <Card.Header>
            <div className="flex items-center justify-between gap-3">
              <Card.Title>
                Shell Fundamentals
              </Card.Title>

              <Badge variant="light" color="neutral">
                Available
              </Badge>
            </div>
          </Card.Header>

          <Card.Content>
            <Text c="muted">
              Learn the basics of using the shell, a command-line interpreter
              that allows you to interact with your operating system.
            </Text>
          </Card.Content>

          <Card.Footer>
            <Button size="sm">
              Discover my project
            </Button>
          </Card.Footer>
        </Card>
      </Timeline.Content>
    </Timeline.Item>

    <Timeline.Item size="xs" axisOffset="18px">
      <Timeline.Content>
        <Card padding="none">
          <Card.Header>
            <div className="flex items-center justify-between gap-3">
              <Card.Title>
                Git Fundamentals
              </Card.Title>

              <Badge variant="light" color="neutral">
                Unavailable
              </Badge>
            </div>
          </Card.Header>

          <Card.Content>
            <Text c="muted">
              Learn the basics of Git, a popular version control system used to
              track changes in your code, collaborate with others, and submit
              your work for evaluation.
            </Text>
          </Card.Content>
        </Card>
      </Timeline.Content>
    </Timeline.Item>

    <Timeline.Item size="xs" axisOffset="18px">
      <Timeline.Content>
        <Card padding="none">
          <Card.Header>
            <div className="flex items-center justify-between gap-3">
              <Card.Title>
                Shell searching and finding
              </Card.Title>

              <Badge variant="light" color="neutral">
                Unavailable
              </Badge>
            </div>
          </Card.Header>

          <Card.Content>
            <Text c="muted">
              Learn how to find files and information within your system thanks
              to find and grep to locate specific files, search within files,
              and filter results based on various criteria.
            </Text>
          </Card.Content>
        </Card>
      </Timeline.Content>
    </Timeline.Item>

    <Timeline.Item size="xs" axisOffset="18px">
      <Timeline.Content>
        <Card padding="none">
          <Card.Header>
            <Card.Title>
              Exam 00
            </Card.Title>
          </Card.Header>

          <Card.Content>
            <Text c="muted">
              Exam details will soon be available.
            </Text>
          </Card.Content>
        </Card>
      </Timeline.Content>
    </Timeline.Item>

    <Timeline.Item size="xs" axisOffset="22px">
      <Timeline.Content>
        <Card padding="none">
          <Card.Header>
            <div className="flex items-center justify-between gap-3">
              <Card.Title>
                Square
              </Card.Title>

              <div className="flex gap-2">
                <Button size="sm">
                  Register
                </Button>

                <Button variant="light" color="neutral" size="sm">
                  Go to Rush
                </Button>
              </div>
            </div>
          </Card.Header>
        </Card>
      </Timeline.Content>
    </Timeline.Item>
  </Timeline>
</Preview>

## Subcomponents [#subcomponents]

<TypeTable
  type="{
  Timeline: {
    type: &#x22;component&#x22;,
    description:
      &#x22;Root — a vertical `<ol>` grid of three shared column tracks (label / axis / content). Takes `size`, `lineVariant`; `className` targets this container. Takes its own `testId`.&#x22;,
  },
  &#x22;Timeline.Item&#x22;: {
    type: &#x22;component&#x22;,
    description:
      &#x22;One event (`<li>`). Owns the bullet and the connecting line to the next item — takes `color`, `variant`, `bullet`, `gradient`, `size`, `lineVariant`, `axisOffset` (nudges the bullet+line column together against custom content Timeline can't see into). Takes its own `testId`.&#x22;,
  },
  &#x22;Timeline.Label&#x22;: {
    type: &#x22;component&#x22;,
    description:
      &#x22;Optional leading zone (e.g. a date), aligned to the bullet. Takes `color` to tint its text/icons; lays children out in a row so an icon composes in directly. The whole label column disappears if no item in the tree uses it. Takes its own `testId`.&#x22;,
  },
  &#x22;Timeline.Content&#x22;: {
    type: &#x22;component&#x22;,
    description: &#x22;The main body zone for an item. Takes its own `testId`.&#x22;,
  },
  &#x22;Timeline.Title&#x22;: {
    type: &#x22;component&#x22;,
    description:
      &#x22;Bold lead-in line for Timeline.Content. Renders a block `<span>`, not a heading (a timeline can hold many items) or a `<p>` (safe to nest inside a consumer's own paragraph). Takes its own `testId`.&#x22;,
  },
}"
/>

Every part renders `testId` as `data-testid` on its own DOM node — see [Testing](/docs/testing).

## API [#api]

### Timeline [#timeline]

<TypeTable
  type="{
  size: {
    type: &#x22;'xs' | 'sm' | 'md' | 'lg' | 'xl'&#x22;,
    default: &#x22;'md'&#x22;,
    description:
      &#x22;Density — scales the bullet, line thickness, spacing, and text.&#x22;,
  },
  lineVariant: {
    type: &#x22;'solid' | 'dashed'&#x22;,
    default: &#x22;'solid'&#x22;,
    description:
      &#x22;Default connecting-line style for every item; a Timeline.Item can override its own segment.&#x22;,
  },
  active: {
    type: &#x22;number&#x22;,
    description:
      &#x22;Index of the current step among the `Timeline.Item` children (other children aren't counted). Earlier steps are complete, later ones pending: dimmed to the disabled colors, with a `default` dot reduced to its outer ring. Past the end marks every step complete; negative marks every step pending. A `Timeline.Item`'s own `active` overrides it. See [Progress](#progress).&#x22;,
  },
  className: {
    type: &#x22;string&#x22;,
    description: &#x22;Styles the root `<ol>`.&#x22;,
  },
  asChild: {
    type: &#x22;boolean&#x22;,
    default: &#x22;false&#x22;,
    description: &#x22;Render children as the root element (Ark UI polymorphism).&#x22;,
  },
  testId: {
    type: &#x22;string&#x22;,
    description:
      &#x22;Renders as `data-testid` on the root `<ol>`. See [Testing](/docs/testing).&#x22;,
  },
}"
/>

### Timeline.Item [#timelineitem]

<TypeTable
  type="{
  color: {
    type: &#x22;string&#x22;,
    description:
      'Accent palette for the bullet. Ignored when variant=&#x22;gradient&#x22;. Re-exported as `Color` from `@42-central/ui-react`.',
  },
  variant: {
    type: &#x22;'filled' | 'outline' | 'dashed' | 'default' | 'gradient'&#x22;,
    default: &#x22;'default'&#x22;,
    description:
      &#x22;Bullet shape treatment — the same axis as Badge/Button, plus dashed (a dashed-stroke ring). default mirrors Button's inverted neutral treatment, not a colored dot.&#x22;,
  },
  bullet: {
    type: &#x22;ReactNode&#x22;,
    description:
      &#x22;Overrides the default dot — an icon, `<Avatar>`, or a `<Spinner>` for an in-progress item.&#x22;,
  },
  gradient: {
    type: &#x22;{ from?: string; to?: string; via?: string; dir?: GradientDir }&#x22;,
    description:
      'Gradient stops/direction. Only applied when variant=&#x22;gradient&#x22;; unset fields fall back to purple-300 → pink-400, to-r.',
  },
  size: {
    type: &#x22;'xs' | 'sm' | 'md' | 'lg' | 'xl'&#x22;,
    description:
      &#x22;Overrides just this item's bullet diameter; defaults to the timeline's own `size`. Doesn't affect line thickness or spacing.&#x22;,
  },
  lineVariant: {
    type: &#x22;'solid' | 'dashed'&#x22;,
    description:
      &#x22;Overrides Timeline's connecting-line style for just the segment below this item.&#x22;,
  },
  active: {
    type: &#x22;boolean&#x22;,
    description:
      &#x22;Marks this item as the current step, overriding Timeline's `active` index. If several items pass it, the first one wins; `false` is the same as leaving it unset. See [Marking the active item](#marking-the-active-item).&#x22;,
  },
  axisOffset: {
    type: &#x22;string&#x22;,
    description:
      &#x22;Shifts the bullet+line column down by a CSS length (e.g. '11px') to line the bullet up with something inside a custom Timeline.Content, like a card's title, that Timeline has no visibility into. A shared CSS variable, not a plain className, since the connecting line is a separate sibling element that has to shift by the same amount to keep meeting the bullet's edge.&#x22;,
  },
  testId: {
    type: &#x22;string&#x22;,
    description:
      &#x22;Renders as `data-testid` on the item's `<li>`. See [Testing](/docs/testing).&#x22;,
  },
}"
/>
