ComponentsData display

Activity timeline

Chronological, human-readable history: dashboard activity, record history, approval and order steps. Groups by day ("Today", "Yesterday", "Friday, Nov 6"), shows relative times that stay fresh from one shared ticker, and renders people as Avatars and events as icons.

Native <ol> + Intl.RelativeTimeFormat components/activity-timeline.tsx, lib/data-islands.tsx, styles/data.csstheme · material · accent · density · font

Activity

  1. New submission on Contact form
  2. Ahmet K. commented on “QR menus guide”
  3. 12 images uploaded to Media
  4. Meltem scheduled a post

Installation

$ pnpm add @vamos-ui/react

The whole kit as one package — get updates by bumping the version. Add the styles to globals.css: @import "@vamos-ui/react/styles.css";

Usage

import { ActivityTimeline } from "@vamos-ui/react";
import { Inbox } from "lucide-react";

<ActivityTimeline groupBy="day" items={[
  { id: "1", at: "2026-11-10T09:12:00Z", icon: Inbox, title: <>New submission on <b>Contact form</b></> },
  { id: "2", at: "2026-11-09T16:40:00Z", avatar: { name: "Ahmet Kaya" }, actor: "Ahmet Kaya", title: "commented on “QR menus guide”" },
]} />

Examples

Grouped by day (CRM)

groupBy="day" splits in timeZone (pass your LocaleProvider's); inside groups times show the time of day.

Northwind renewal

Record history

    1. Ayşe Kaya moved the deal to Negotiation
    2. Proposal v3 opened by the client (2nd time)
    1. Call with Burak Şen · 18 min
    2. Deal value changed to $48,500
    1. Owner changed from Can Özkan to Ayşe Kaya

Steps

variant="steps": done / current / upcoming / failed, aria-current="step" and status text for screen readers.

Quote Q-2026-118

Harbor & Pine · loyalty app

  1. Completed
    Quote sent
  2. Completed
    Opened by client
  3. Current step
    Waiting for scope decision
    Native apps or web app first? Native adds two weeks.
  4. Upcoming
    Deposit invoice
  5. Upcoming
    Kick-off

Notes and comments

body holds a note or quote; actions add buttons under it.

Notes & comments

  1. Meltem Aydın left a note
    Client prefers WhatsApp over email. Best time to call is after 14:00.
  2. İlker Şahin commented on “Local SEO checklist for 2026”
    Can we add a section about Google Business Profile posts? Half our calls ask about it.
  3. Reminder: renew harborpine.com before Nov 19

Live feed

New events wait behind a "3 new updates" pill instead of shifting the list; announcement is a polite live region you batch.

Store activity

New events wait above the list

  1. Order #10482 paid · $124.00

Paginated history with filters

hasMore + onLoadMore show a busy load button; filter renders chips above the list.

Revision history

“A practical guide to QR menus”

    1. Samet published the post
    1. Ece edited the introduction
    2. Ece changed the featured image

API

ActivityTimeline

PropTypeDefault
items
Events.
TimelineEntry[]—
variant
Event feed or process steps.
"feed" | "steps""feed"
groupBy
Day sections.
"day" | "none""none"
order
Sort by time.
"desc" | "asc""desc" (steps: as given)
timeZone
Day boundaries for grouping.
string"UTC"
now
Pin the reference time (docs, tests).
Date | string | number—
timeMode
Default: relative, time of day inside groups.
"relative" | "absolute"—
density
Indicator size and spacing.
"inherit" | "compact" | "comfortable""inherit"
loading
Three skeleton items.
booleanfalse
empty
Empty state.
ReactNode"No activity yet"
hasMore / onLoadMore
Load-more button with busy state.
boolean / () => void | Promise<void>—
newCount / onShowNew
"3 new updates" pill for live feeds.
number / () => void—
announcement
Polite live-region text.
string—
filter
Chips above the list.
ReactNode—
labels
today, yesterday, empty, loadMore, loading, newItems, done, current, upcoming, failed.
Partial<TimelineLabels>—

TimelineEntry

PropTypeDefault
id / at
Key and time (ISO instant or YYYY-MM-DD).
string / Date | string—
title / body
What happened; note under it.
ReactNode—
icon
Indicator icon.
LucideIcon—
avatar
Actor's Avatar (wins over icon).
{ src?: string; name: string }—
actor
Bold name before the title.
string—
tone
Indicator tint.
"neutral" | "accent" | "success" | "warning" | "danger" | "info"—
href
Title links to the record.
string—
status
Steps state.
"done" | "current" | "upcoming" | "failed"—
actions
Buttons under the content.
ReactNode—

Parts

PropTypeDefault
Timeline
The <ol>.
variant, density—
TimelineGroup
Day section with a heading.
date | label, now—
TimelineItem
One <li>; highlight briefly tints a new item (not under reduced motion).
status, highlight—
TimelineIndicator
Opaque dot on the connector.
icon | avatar | status, tone—
TimelineContent / TimelineTitle / TimelineBody / TimelineActions
Text column parts.
HTMLAttributes—
TimelineBody variant
card: note on an inset surface. plain: unstyled text for typographic layouts.
"card" | "plain""card"
TimelineTime
<time> with relative text and the full date as title.
value, now, mode—
TimelineNewItems / TimelineSkeleton
Live pill and loading rows.
count / count—
RelativeTime
Standalone relative <time> (SSR shows absolute, client upgrades).
value, now, display, styleType—