Timelines, designed for real interfaces.

Accessible, motion-rich React timelines and progress bars. 14 layouts — from a simple vertical line to roadmaps, Gantt charts and changelogs — on one data model, with zero dependencies.

npm install m2timeline-motion

0 runtime dependencies14 layouts≈ 10.8 kB per layoutTypeScript · ESM + CJS · SSR

Step 3 of 5
  1. Completed

    Create account

    Email verified
  2. Completed

    Set up workspace

    Name, logo and region
  3. In progress

    3 of 5 invites sent
  4. Upcoming

    Connect data

    Postgres, BigQuery or CSV
  5. Upcoming

    Go live

    Publish your first dashboard
Live component · Account onboarding

Playground

Tune it live, copy the code

Every control maps to a real prop on the real component. Edit the events in the Data tab, then copy a snippet that matches what you see.

  1. Completed

    main @ 4f2c9e1

    Duration
    38s
  2. Completed

    Duration
    1m 12s
  3. Completed

    1,284 tests passed across 3 shards.
    Duration
    3m 41s
  4. Completed

    Bundle
    412 kB
  5. In progress

    Rolling out to 3 of 5 staging pods.
    Maya Patel (Release captain)
  6. Upcoming

    Checkout, sign-in and search flows.
  7. Upcoming

    Requires one approval.
Import
VerticalTimeline.tsx
import { VerticalTimeline, type TimelineEvent } from 'm2timeline-motion';
import 'm2timeline-motion/styles.css';

const events: TimelineEvent[] = [
  {
    id: 'checkout',
    title: 'Checkout & install',
    date: '2026-10-18T11:06:00Z',
    status: 'completed',
    icon: '📦',
    category: 'Build',
    subtitle: 'main @ 4f2c9e1',
    meta: [
      { label: 'Duration', value: '38s' },
    ],
  },
  {
    id: 'lint',
    title: 'Lint & typecheck',
    date: '2026-10-18T11:09:00Z',
    status: 'completed',
    icon: '🧹',
    category: 'Build',
    meta: [
      { label: 'Duration', value: '1m 12s' },
    ],
  },
  {
    id: 'tests',
    title: 'Unit & integration tests',
    date: '2026-10-18T11:12:00Z',
    status: 'completed',
    icon: '🧪',
    category: 'Test',
    description: '1,284 tests passed across 3 shards.',
    meta: [
      { label: 'Duration', value: '3m 41s' },
    ],
  },
] // …4 more;

export function PipelineTimeline() {
  return (
    <VerticalTimeline
      events={events}
      theme="dark"
      onEventClick={(event) => console.log('Clicked', event.id)}
    />
  );
}

Callback log

Click or expand an event to see callbacks fire.

Layouts

14 layouts, one data model

Every layout reads the same events, so switching is one prop. Pick a layout to see it live, read its code, or open it in the playground.

Vertical <VerticalTimeline />

The classic: a single line with cards on the left or right.

Best for Company milestones, docs, about pages

CI/CD deployment pipeline
  1. Completed

    Checkout & install

    main @ 4f2c9e1

    Duration
    38s
  2. Completed

    Lint & typecheck

    Duration
    1m 12s
  3. Completed

    Unit & integration tests

    1,284 tests passed across 3 shards.
    Duration
    3m 41s
  4. Completed

    Production build

    Bundle
    412 kB
  5. In progress

    Rolling out to 3 of 5 staging pods.
    Maya Patel (Release captain)

Progress

Bars, steppers and gauges in the same theme

Four progress components for uploads, onboarding, checkout and scores — accessible, animated and themed like the timelines.

  • Uploading assets

    Progress bar <ProgressBar />

    1. Cart, completed
    2. Shipping, current step
    3. Payment, not started
    4. Done, not started

    Stepper <StepProgress />

  • Chunks6 / 10

    Segmented <SegmentedProgress />

  • 70%Score

    Gauge <CircularProgress />

Explore the progress components

Quick start

Three ways in

Import the stylesheet once. Built for React 18 or 19, and ready for the Next.js App Router.

  • Server Components ready. Every component module carries a 'use client' directive; the pure helpers stay server-safe.
  • Your look. Theme with props or CSS variables such as --m2t-accent and --m2t-radius.
QuickStart.tsx
import { Timeline, type TimelineEvent } from 'm2timeline-motion';
import 'm2timeline-motion/styles.css';

const events: TimelineEvent[] = [
  { id: 1, title: 'Company founded', date: '2018-03', description: 'Two founders and a big idea.' },
  { id: 2, title: 'First 100 customers', date: '2019-11', status: 'completed' },
  { id: 3, title: 'Series A', date: '2023-04', highlight: true, details: 'Led by Atlas Partners.' },
  { id: 4, title: 'Global launch', date: '2026-06', status: 'current', progress: 60 },
];

export function QuickStart() {
  return <Timeline events={events} variant="alternating" animation="reveal" />;
}

Accessibility

Keyboards, screen readers and calm motion

Real structure and real controls, not decorative markup — and motion that steps aside when the system asks for less.

KeyAction
TabMoves between interactive events and controls — every event is a real button.
↑ ↓ ← →Move focus between events.
Home / EndJump to the first or last event.
Enter / SpaceExpand or collapse an event’s details.
  • Real structure. A labelled region, ordered lists, real headings and <time dateTime> elements.
  • Not colour alone. Status is always conveyed as text as well as colour; steppers expose aria-current="step".
  • Reduced motion. Entrance animations and connector fills respect prefers-reduced-motion automatically.
  • Tested. Every layout is checked with axe-core in the package’s test suite.

API

Props at a glance

Every prop is typed. The documentation has the full reference — layout props, callbacks, event data, hooks and CSS variables.

PropTypeDefaultDescription
eventsrequiredReadonlyArray<TimelineEvent>—The data. Safe to update at any time; new items animate in.
variantTimelineVariant'vertical'<Timeline> only. Import a layout component directly for smaller bundles.
theme'light' | 'dark' | 'auto''auto'auto follows prefers-color-scheme. Apps with their own theme toggle should pass their current theme.
appearance'modern' | 'minimal' | 'glass' | 'editorial' | 'vibrant''modern'Visual style preset.
accentstring | [string, string]themeAccent colour, or a [from, to] pair for gradients.
density'compact' | 'comfortable' | 'spacious''comfortable'Spacing and type scale.
radiusnumber | stringappearanceCard corner radius (number = px).
marker'dot' | 'ring' | 'square' | 'diamond' | 'number' | 'none''dot'Marker shape. Events with an icon render it inside the marker.
connector'solid' | 'dashed' | 'dotted' | 'gradient' | 'none''solid'Connector line style.
connectorAnimatedbooleanfalseFlowing dashes or a travelling light along the line.
glowbooleantrueGlow on current, active and highlighted milestones.
animation'none' | 'fade' | 'rise' | 'slide' | 'scale' | 'blur' | 'reveal''rise'Entrance preset. Disabled automatically with prefers-reduced-motion.
Full API reference