Menu

Change language

GitHub repo

Timeline

timelineui

Vertical or horizontal sequence of events with connectors and node markers. Statuses (pending, current, completed, failed) tint the connector. Use for activity feeds, audit logs, and progress tracking.

When to use which

Decision Guide

Timeline showcases chronological events and milestones past-to-present. Stepper guides users through a linear, multi-step workflow requiring active user progression.

ComponentRole
Timelinecurrent

Chronological feeds, delivery tracking logs, audit trails, and product roadmap milestones.

Activity & Milestone Stream
Stepper

Multi-step wizards, checkout sequences, onboarding flows, and form completion tracking.

Workflow Progression
  • Activity logs, tracking events, & milestones → Timeline
  • Multi-step wizard or form progression → Stepper (view)

Installation

$npx shadcn-svelte@latest add https://uipkge.dev/r/svelte/timeline.json
Manifest:https://uipkge.dev/r/svelte/timeline.jsonInstalls to:src/lib/components/ui/timeline/

Examples

Loading interactive previews…

Props

NameType / ValuesDefaultRequired
variant
'dot''icon''avatar''outline'
dotoptional
status
'default''current''success''warning''error''info''muted'
defaultoptional
directionTimelineDirectionverticaloptional
alignTimelineAlignstartoptional
sideTimelineSide—optional
densityTimelineDensitydefaultoptional
refHTMLDivElement | null—optional

npm dependencies

Used by

Files installed (12)

  • src/lib/components/ui/timeline/Timeline.svelte1.2 kB
    <script lang="ts" module>
      import type { HTMLAttributes } from 'svelte/elements'
      import type { TimelineAlign, TimelineDensity, TimelineDirection, TimelineSide } from './context.svelte'
    
      export interface TimelineProps extends HTMLAttributes<HTMLDivElement> {
        direction?: TimelineDirection
        align?: TimelineAlign
        side?: TimelineSide
        density?: TimelineDensity
        ref?: HTMLDivElement | null
      }
    </script>
    
    <script lang="ts">
      import { cn } from '$lib/utils'
      import { TimelineContextState, setTimelineContext } from './context.svelte'
    
      let {
        class: className,
        direction = 'vertical',
        align = 'start',
        side,
        density = 'default',
        children,
        ref = $bindable(null),
        ...restProps
      }: TimelineProps = $props()
    
      const ctx = new TimelineContextState()
      setTimelineContext(ctx)
    
      $effect(() => {
        ctx.direction = direction
        ctx.align = align
        ctx.side = side ?? (direction === 'horizontal' ? 'top' : 'left')
        ctx.density = density
      })
    </script>
    
    <div
      bind:this={ref}
      data-uipkge=""
      data-slot="timeline"
      data-direction={direction}
      data-align={align}
      class={cn('relative', direction === 'vertical' ? 'flex flex-col' : 'flex flex-row', className)}
      {...restProps}
    >
      {@render children?.()}
    </div>
    
  • src/lib/components/ui/timeline/TimelineItem.svelte5.8 kB
  • src/lib/components/ui/timeline/TimelineMedia.svelte3 kB
  • src/lib/components/ui/timeline/TimelineSeparator.svelte1.6 kB
  • src/lib/components/ui/timeline/TimelineContent.svelte0.5 kB
  • src/lib/components/ui/timeline/TimelineHeader.svelte0.6 kB
  • src/lib/components/ui/timeline/TimelineTitle.svelte0.7 kB
  • src/lib/components/ui/timeline/TimelineDescription.svelte0.6 kB
  • src/lib/components/ui/timeline/TimelineDate.svelte0.6 kB
  • src/lib/components/ui/timeline/context.svelte.ts1.7 kB
  • src/lib/components/ui/timeline/timeline.variants.ts4.2 kB
  • src/lib/components/ui/timeline/index.ts1.2 kB

Raw manifest:https://uipkge.dev/r/svelte/timeline.json