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.
Activity
- New submission on Contact form
- Ahmet K. commented on “QR menus guide”
- 12 images uploaded to Media
- Meltem scheduled a post
Installation
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
- Ayşe Kaya moved the deal to Negotiation
- Proposal v3 opened by the client (2nd time)
- Call with Burak Şen · 18 min
- Deal value changed to $48,500
- 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
- CompletedQuote sent
- CompletedOpened by client
- Current stepWaiting for scope decisionNative apps or web app first? Native adds two weeks.
- UpcomingDeposit invoice
- UpcomingKick-off
Notes and comments
body holds a note or quote; actions add buttons under it.
Notes & comments
- Meltem Aydın left a noteClient prefers WhatsApp over email. Best time to call is after 14:00.
- İ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.
- 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
- 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”
- Samet published the post
- Ece edited the introduction
- Ece changed the featured image
API
ActivityTimeline
| Prop | Type | Default |
|---|---|---|
itemsEvents. | TimelineEntry[] | — |
variantEvent feed or process steps. | "feed" | "steps" | "feed" |
groupByDay sections. | "day" | "none" | "none" |
orderSort by time. | "desc" | "asc" | "desc" (steps: as given) |
timeZoneDay boundaries for grouping. | string | "UTC" |
nowPin the reference time (docs, tests). | Date | string | number | — |
timeModeDefault: relative, time of day inside groups. | "relative" | "absolute" | — |
densityIndicator size and spacing. | "inherit" | "compact" | "comfortable" | "inherit" |
loadingThree skeleton items. | boolean | false |
emptyEmpty state. | ReactNode | "No activity yet" |
hasMore / onLoadMoreLoad-more button with busy state. | boolean / () => void | Promise<void> | — |
newCount / onShowNew"3 new updates" pill for live feeds. | number / () => void | — |
announcementPolite live-region text. | string | — |
filterChips above the list. | ReactNode | — |
labelstoday, yesterday, empty, loadMore, loading, newItems, done, current, upcoming, failed. | Partial<TimelineLabels> | — |
TimelineEntry
| Prop | Type | Default |
|---|---|---|
id / atKey and time (ISO instant or YYYY-MM-DD). | string / Date | string | — |
title / bodyWhat happened; note under it. | ReactNode | — |
iconIndicator icon. | LucideIcon | — |
avatarActor's Avatar (wins over icon). | { src?: string; name: string } | — |
actorBold name before the title. | string | — |
toneIndicator tint. | "neutral" | "accent" | "success" | "warning" | "danger" | "info" | — |
hrefTitle links to the record. | string | — |
statusSteps state. | "done" | "current" | "upcoming" | "failed" | — |
actionsButtons under the content. | ReactNode | — |
Parts
| Prop | Type | Default |
|---|---|---|
TimelineThe <ol>. | variant, density | — |
TimelineGroupDay section with a heading. | date | label, now | — |
TimelineItemOne <li>; highlight briefly tints a new item (not under reduced motion). | status, highlight | — |
TimelineIndicatorOpaque dot on the connector. | icon | avatar | status, tone | — |
TimelineContent / TimelineTitle / TimelineBody / TimelineActionsText column parts. | HTMLAttributes | — |
TimelineBody variantcard: 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 / TimelineSkeletonLive pill and loading rows. | count / count | — |
RelativeTimeStandalone relative <time> (SSR shows absolute, client upgrades). | value, now, display, styleType | — |