# Timeline

> A timeline is a list of events in order, with an icon or an avatar per event and a card for its content, for activity feeds and histories.

Visualize events in chronological order with a timeline. Add icons, avatars, and text to present processes and activity feeds.

Source: https://docs.tabler.io/ui/components/timeline

---

## Overview

A timeline is a list of events in order. Build it from three parts:

- `.timeline` on a `ul` element wraps the whole list.
- `.timeline-event` on each `li` holds one event and draws the line to the next one.
- `.timeline-event-icon` marks the event, and `.timeline-event-card` holds its content.

The line between events is drawn by the events themselves, so the last one never gets a trailing line.

```html
<ul class="timeline">
  <li class="timeline-event">
    <div class="timeline-event-icon">
      <!-- Download SVG icon from http://tabler.io/icons/icon/check -->
      <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false" class="icon">
        <path d="M5 12l5 5l10 -10" />
      </svg>
    </div>
    <div class="card timeline-event-card">
      <div class="card-body">
        <div class="text-secondary float-end">1 day ago</div>
        <h4>Database backup completed</h4>
        <p class="text-secondary mb-0">The nightly backup finished without errors.</p>
      </div>
    </div>
  </li>
  <li class="timeline-event">
    <div class="timeline-event-icon">
      <!-- Download SVG icon from http://tabler.io/icons/icon/briefcase -->
      <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false" class="icon">
        <path d="M3 9a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v9a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2l0 -9" />
        <path d="M8 7v-2a2 2 0 0 1 2 -2h4a2 2 0 0 1 2 2v2" />
        <path d="M12 12l0 .01" />
        <path d="M3 13a20 20 0 0 0 18 0" />
      </svg>
    </div>
    <div class="card timeline-event-card">
      <div class="card-body">
        <div class="text-secondary float-end">2 hrs ago</div>
        <h4>3 new products were added</h4>
        <p class="text-secondary mb-0">They are already visible in the catalog.</p>
      </div>
    </div>
  </li>
</ul>
```

## Event icons

The icon marker is a plain box, so any [icon](/ui/components/icon) or [avatar](/ui/components/avatar) fits inside. Add a `bg-*-lt` class to tint it and tell event types apart at a glance.

```html
<ul class="timeline">
  <li class="timeline-event">
    <div class="timeline-event-icon bg-green-lt">
      <!-- Download SVG icon from http://tabler.io/icons/icon/check -->
      <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false" class="icon">
        <path d="M5 12l5 5l10 -10" />
      </svg>
    </div>
    <div class="card timeline-event-card">
      <div class="card-body">Deployment finished</div>
    </div>
  </li>
  <li class="timeline-event">
    <div class="timeline-event-icon bg-red-lt">
      <!-- Download SVG icon from http://tabler.io/icons/icon/alert-triangle -->
      <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false" class="icon">
        <path d="M12 9v4" />
        <path d="M10.363 3.591l-8.106 13.534a1.914 1.914 0 0 0 1.636 2.871h16.214a1.914 1.914 0 0 0 1.636 -2.87l-8.106 -13.536a1.914 1.914 0 0 0 -3.274 0" />
        <path d="M12 16h.01" />
      </svg>
    </div>
    <div class="card timeline-event-card">
      <div class="card-body">Build failed on the release branch</div>
    </div>
  </li>
  <li class="timeline-event">
    <div class="timeline-event-icon">
      <span class="avatar avatar-sm" style="background-image: url(/static/avatars/000m.jpg)"></span>
    </div>
    <div class="card timeline-event-card">
      <div class="card-body">Paweł Kuna commented on the pull request</div>
    </div>
  </li>
</ul>
```

## Simple timeline

Add `.timeline-simple` to hide the icons and pull the cards to the edge. Use it when the events need less decoration, for example in a narrow column.

```html
<ul class="timeline timeline-simple">
  <li class="timeline-event">
    <div class="timeline-event-icon bg-x text-x-fg">
      <!-- Download SVG icon from http://tabler.io/icons/icon/brand-x -->
      <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false" class="icon">
        <path d="M4 4l11.733 16h4.267l-11.733 -16l-4.267 0" />
        <path d="M4 20l6.768 -6.768m2.46 -2.46l6.772 -6.772" />
      </svg>
    </div>
    <div class="card timeline-event-card">
      <div class="card-body">
        <div class="text-secondary float-end">10 hrs ago</div>
        <h4>+1150 Followers</h4>
        <p class="text-secondary">You’re getting more and more followers, keep it up!</p>
      </div>
    </div>
  </li>
  <li class="timeline-event">
    <div class="timeline-event-icon">
      <!-- Download SVG icon from http://tabler.io/icons/icon/briefcase -->
      <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false" class="icon">
        <path d="M3 9a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v9a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2l0 -9" />
        <path d="M8 7v-2a2 2 0 0 1 2 -2h4a2 2 0 0 1 2 2v2" />
        <path d="M12 12l0 .01" />
        <path d="M3 13a20 20 0 0 0 18 0" />
      </svg>
    </div>
    <div class="card timeline-event-card">
      <div class="card-body">
        <div class="text-secondary float-end">2 hrs ago</div>
        <h4>+3 New Products were added!</h4>
        <p class="text-secondary">Congratulations!</p>
      </div>
    </div>
  </li>
  <li class="timeline-event">
    <div class="timeline-event-icon">
      <!-- Download SVG icon from http://tabler.io/icons/icon/check -->
      <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false" class="icon">
        <path d="M5 12l5 5l10 -10" />
      </svg>
    </div>
    <div class="card timeline-event-card">
      <div class="card-body">
        <div class="text-secondary float-end">1 day ago</div>
        <h4>Database backup completed!</h4>
        <p class="text-secondary">Download the <a href="#">latest backup</a>.</p>
      </div>
    </div>
  </li>
  <li class="timeline-event">
    <div class="timeline-event-icon bg-facebook text-facebook-fg">
      <!-- Download SVG icon from http://tabler.io/icons/icon/brand-facebook -->
      <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false" class="icon">
        <path d="M7 10v4h3v7h4v-7h3l1 -4h-4v-2a1 1 0 0 1 1 -1h3v-4h-3a5 5 0 0 0 -5 5v2h-3" />
      </svg>
    </div>
    <div class="card timeline-event-card">
      <div class="card-body">
        <div class="text-secondary float-end">1 day ago</div>
        <h4>+290 Page Likes</h4>
        <p class="text-secondary">This is great, keep it up!</p>
      </div>
    </div>
  </li>
  <li class="timeline-event">
    <div class="timeline-event-icon">
      <!-- Download SVG icon from http://tabler.io/icons/icon/user-plus -->
      <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false" class="icon">
        <path d="M8 7a4 4 0 1 0 8 0a4 4 0 0 0 -8 0" />
        <path d="M16 19h6" />
        <path d="M19 16v6" />
        <path d="M6 21v-2a4 4 0 0 1 4 -4h4" />
      </svg>
    </div>
    <div class="card timeline-event-card">
      <div class="card-body">
        <div class="text-secondary float-end">2 days ago</div>
        <h4>+3 Friend Requests</h4>
        <div class="avatar-list mt-3">
          <span style="background-image: url(/static/avatars/000m.jpg)" class="avatar">
            <span class="badge bg-success" aria-label="Online"></span>
          </span>
          <span style="background-image: url(/static/avatars/052f.jpg)" class="avatar">
            <span class="badge bg-success" aria-label="Online"></span>
          </span>
          <span style="background-image: url(/static/avatars/002m.jpg)" class="avatar">
            <span class="badge bg-success" aria-label="Online"></span>
          </span>
        </div>
      </div>
    </div>
  </li>
  <li class="timeline-event">
    <div class="timeline-event-icon">
      <!-- Download SVG icon from http://tabler.io/icons/icon/photo -->
      <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false" class="icon">
        <path d="M15 8h.01" />
        <path d="M3 6a3 3 0 0 1 3 -3h12a3 3 0 0 1 3 3v12a3 3 0 0 1 -3 3h-12a3 3 0 0 1 -3 -3v-12" />
        <path d="M3 16l5 -5c.928 -.893 2.072 -.893 3 0l5 5" />
        <path d="M14 14l1 -1c.928 -.893 2.072 -.893 3 0l3 3" />
      </svg>
    </div>
    <div class="card timeline-event-card">
      <div class="card-body">
        <div class="text-secondary float-end">3 days ago</div>
        <h4>+3 New photos</h4>
        <div class="mt-3">
          <div class="row g-2">
            <div class="col-4">
              <!-- Photo -->
              <img src="/static/photos/blue-sofa-with-pillows-in-a-designer-living-room-interior.jpg" class="rounded" alt="Blue sofa with pillows in a designer living room interior">
            </div>
            <div class="col-4">
              <!-- Photo -->
              <img src="/static/photos/home-office-desk-with-macbook-iphone-calendar-watch-and-organizer.jpg" class="rounded" alt="Home office desk with Macbook, iPhone, calendar, watch &amp; organizer">
            </div>
            <div class="col-4">
              <!-- Photo -->
              <img src="/static/photos/young-woman-working-in-a-cafe.jpg" class="rounded" alt="Young woman working in a cafe">
            </div>
          </div>
        </div>
      </div>
    </div>
  </li>
  <li class="timeline-event">
    <div class="timeline-event-icon">
      <!-- Download SVG icon from http://tabler.io/icons/icon/settings -->
      <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false" class="icon">
        <path d="M10.325 4.317c.426 -1.756 2.924 -1.756 3.35 0a1.724 1.724 0 0 0 2.573 1.066c1.543 -.94 3.31 .826 2.37 2.37a1.724 1.724 0 0 0 1.065 2.572c1.756 .426 1.756 2.924 0 3.35a1.724 1.724 0 0 0 -1.066 2.573c.94 1.543 -.826 3.31 -2.37 2.37a1.724 1.724 0 0 0 -2.572 1.065c-.426 1.756 -2.924 1.756 -3.35 0a1.724 1.724 0 0 0 -2.573 -1.066c-1.543 .94 -3.31 -.826 -2.37 -2.37a1.724 1.724 0 0 0 -1.065 -2.572c-1.756 -.426 -1.756 -2.924 0 -3.35a1.724 1.724 0 0 0 1.066 -2.573c-.94 -1.543 .826 -3.31 2.37 -2.37c1 .608 2.296 .07 2.572 -1.065" />
        <path d="M9 12a3 3 0 1 0 6 0a3 3 0 0 0 -6 0" />
      </svg>
    </div>
    <div class="card timeline-event-card">
      <div class="card-body">
        <div class="text-secondary float-end">2 weeks ago</div>
        <h4>System updated to v2.02</h4>
        <p class="text-secondary">Check the complete changelog at the <a href="#">activity page</a>.</p>
      </div>
    </div>
  </li>
</ul>
```

## Examples

A timeline works well as an activity feed, where each event mixes text, links and its own time.

```html
<ul class="timeline">
  <li class="timeline-event">
    <div class="timeline-event-icon bg-x text-x-fg">
      <!-- Download SVG icon from http://tabler.io/icons/icon/brand-x -->
      <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false" class="icon">
        <path d="M4 4l11.733 16h4.267l-11.733 -16l-4.267 0" />
        <path d="M4 20l6.768 -6.768m2.46 -2.46l6.772 -6.772" />
      </svg>
    </div>
    <div class="card timeline-event-card">
      <div class="card-body">
        <div class="text-secondary float-end">10 hrs ago</div>
        <h4>+1150 Followers</h4>
        <p class="text-secondary">You’re getting more and more followers, keep it up!</p>
      </div>
    </div>
  </li>
  <li class="timeline-event">
    <div class="timeline-event-icon">
      <!-- Download SVG icon from http://tabler.io/icons/icon/briefcase -->
      <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false" class="icon">
        <path d="M3 9a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v9a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2l0 -9" />
        <path d="M8 7v-2a2 2 0 0 1 2 -2h4a2 2 0 0 1 2 2v2" />
        <path d="M12 12l0 .01" />
        <path d="M3 13a20 20 0 0 0 18 0" />
      </svg>
    </div>
    <div class="card timeline-event-card">
      <div class="card-body">
        <div class="text-secondary float-end">2 hrs ago</div>
        <h4>+3 New Products were added!</h4>
        <p class="text-secondary">Congratulations!</p>
      </div>
    </div>
  </li>
  <li class="timeline-event">
    <div class="timeline-event-icon">
      <!-- Download SVG icon from http://tabler.io/icons/icon/check -->
      <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false" class="icon">
        <path d="M5 12l5 5l10 -10" />
      </svg>
    </div>
    <div class="card timeline-event-card">
      <div class="card-body">
        <div class="text-secondary float-end">1 day ago</div>
        <h4>Database backup completed!</h4>
        <p class="text-secondary">Download the <a href="#">latest backup</a>.</p>
      </div>
    </div>
  </li>
  <li class="timeline-event">
    <div class="timeline-event-icon bg-facebook text-facebook-fg">
      <!-- Download SVG icon from http://tabler.io/icons/icon/brand-facebook -->
      <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false" class="icon">
        <path d="M7 10v4h3v7h4v-7h3l1 -4h-4v-2a1 1 0 0 1 1 -1h3v-4h-3a5 5 0 0 0 -5 5v2h-3" />
      </svg>
    </div>
    <div class="card timeline-event-card">
      <div class="card-body">
        <div class="text-secondary float-end">1 day ago</div>
        <h4>+290 Page Likes</h4>
        <p class="text-secondary">This is great, keep it up!</p>
      </div>
    </div>
  </li>
  <li class="timeline-event">
    <div class="timeline-event-icon">
      <!-- Download SVG icon from http://tabler.io/icons/icon/user-plus -->
      <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false" class="icon">
        <path d="M8 7a4 4 0 1 0 8 0a4 4 0 0 0 -8 0" />
        <path d="M16 19h6" />
        <path d="M19 16v6" />
        <path d="M6 21v-2a4 4 0 0 1 4 -4h4" />
      </svg>
    </div>
    <div class="card timeline-event-card">
      <div class="card-body">
        <div class="text-secondary float-end">2 days ago</div>
        <h4>+3 Friend Requests</h4>
        <div class="avatar-list mt-3">
          <span style="background-image: url(/static/avatars/000m.jpg)" class="avatar">
            <span class="badge bg-success" aria-label="Online"></span>
          </span>
          <span style="background-image: url(/static/avatars/052f.jpg)" class="avatar">
            <span class="badge bg-success" aria-label="Online"></span>
          </span>
          <span style="background-image: url(/static/avatars/002m.jpg)" class="avatar">
            <span class="badge bg-success" aria-label="Online"></span>
          </span>
        </div>
      </div>
    </div>
  </li>
  <li class="timeline-event">
    <div class="timeline-event-icon">
      <!-- Download SVG icon from http://tabler.io/icons/icon/photo -->
      <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false" class="icon">
        <path d="M15 8h.01" />
        <path d="M3 6a3 3 0 0 1 3 -3h12a3 3 0 0 1 3 3v12a3 3 0 0 1 -3 3h-12a3 3 0 0 1 -3 -3v-12" />
        <path d="M3 16l5 -5c.928 -.893 2.072 -.893 3 0l5 5" />
        <path d="M14 14l1 -1c.928 -.893 2.072 -.893 3 0l3 3" />
      </svg>
    </div>
    <div class="card timeline-event-card">
      <div class="card-body">
        <div class="text-secondary float-end">3 days ago</div>
        <h4>+3 New photos</h4>
        <div class="mt-3">
          <div class="row g-2">
            <div class="col-4">
              <!-- Photo -->
              <img src="/static/photos/blue-sofa-with-pillows-in-a-designer-living-room-interior.jpg" class="rounded" alt="Blue sofa with pillows in a designer living room interior">
            </div>
            <div class="col-4">
              <!-- Photo -->
              <img src="/static/photos/home-office-desk-with-macbook-iphone-calendar-watch-and-organizer.jpg" class="rounded" alt="Home office desk with Macbook, iPhone, calendar, watch &amp; organizer">
            </div>
            <div class="col-4">
              <!-- Photo -->
              <img src="/static/photos/young-woman-working-in-a-cafe.jpg" class="rounded" alt="Young woman working in a cafe">
            </div>
          </div>
        </div>
      </div>
    </div>
  </li>
  <li class="timeline-event">
    <div class="timeline-event-icon">
      <!-- Download SVG icon from http://tabler.io/icons/icon/settings -->
      <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false" class="icon">
        <path d="M10.325 4.317c.426 -1.756 2.924 -1.756 3.35 0a1.724 1.724 0 0 0 2.573 1.066c1.543 -.94 3.31 .826 2.37 2.37a1.724 1.724 0 0 0 1.065 2.572c1.756 .426 1.756 2.924 0 3.35a1.724 1.724 0 0 0 -1.066 2.573c.94 1.543 -.826 3.31 -2.37 2.37a1.724 1.724 0 0 0 -2.572 1.065c-.426 1.756 -2.924 1.756 -3.35 0a1.724 1.724 0 0 0 -2.573 -1.066c-1.543 .94 -3.31 -.826 -2.37 -2.37a1.724 1.724 0 0 0 -1.065 -2.572c-1.756 -.426 -1.756 -2.924 0 -3.35a1.724 1.724 0 0 0 1.066 -2.573c-.94 -1.543 .826 -3.31 2.37 -2.37c1 .608 2.296 .07 2.572 -1.065" />
        <path d="M9 12a3 3 0 1 0 6 0a3 3 0 0 0 -6 0" />
      </svg>
    </div>
    <div class="card timeline-event-card">
      <div class="card-body">
        <div class="text-secondary float-end">2 weeks ago</div>
        <h4>System updated to v2.02</h4>
        <p class="text-secondary">Check the complete changelog at the <a href="#">activity page</a>.</p>
      </div>
    </div>
  </li>
</ul>
```

## Accessibility

A timeline is a list of events, so keep the list markup and let the content say what happened.

- Use `ul` and `li` elements. A screen reader then announces how many events there are and where the reader is in the list.
- Put the event time in a `time` element with a `datetime` attribute, so "2 hrs ago" also has an exact value.
- The icon is decoration on top of the text. Keep the meaning in the heading or the body of the card, never in the icon color alone.
- Keep heading levels in order. `h4` inside a card only sets the look - pick the level that fits the page outline.

## SCSS variables

The size of the icon marker comes from one custom property, which also sets where the line is drawn:

| Variable                    | Description                        | Default  |
|-----------------------------|------------------------------------|----------|
| `--tblr-timeline-icon-size` | Width and height of the event icon | `2.5rem` |
