Components
- Accordion new
- ActionSheet new
- Alert new
- Alert Dialog new
- Angle Slider new
- Autocomplete new
- Avatar new
- Badge new
- Breadcrumb new
- Button new
- Button Group new
- Card new
- Carousel new
- Checkbox new
- Clipboard new
- Collapsible new
- Color Picker new
- Date Input new
- Date Picker new
- Dialog new
- DialogCaller new
- Drawer beta
- Editable new
- Empty new
- Field new
- Fieldset new
- File Upload new
- Filters new
- Floating Panel new
- Hover Card new
- Image new
- Image Cropper new
- Input new
- Input Group new
- Json Tree View new
- Kbd new
- Listbox new
- Marquee new
- Menu new
- Number Input new
- Pagination new
- Password Input new
- PhoneField new
- Pin Input new
- Popover new
- Progress Circular new
- Progress Linear new
- Qr Code new
- Radio Group new
- Rating Group new
- Scroll Area new
- ScrollSpy new
- Segment Group new
- Select new
- Separator new
- Sidebar new
- Signature Pad new
- Skeleton new
- Slider new
- Splitter new
- Steps new
- Switch new
- Table new
- Tabs new
- Tags Input new
- Textarea new
- Timeline new
- Timer new
- Toast new
- Toc new
- Toggle new
- Toggle Group new
- Tooltip new
- Tour new
- Tree View new
- Typography new
Features
- Two directions — Stack items top-to-bottom (
vertical) or left-to-right (horizontal) - Side control — Place content on either side of the thread (
left/rightfor vertical,top/bottomfor horizontal) - Centered thread — Opt-in alternating layout with
align="center"for zigzag timelines - Dot or icon markers — Switch between a small dot or an icon slot via
Timeline.Media'svariantprop
Installation
Install from the Vuzeno registry:
bunx --bun shadcn-vue@latest add https://vuzeno.com/r/timeline.json
npx shadcn-vue@latest add https://vuzeno.com/r/timeline.json
yarn dlx shadcn-vue@latest add https://vuzeno.com/r/timeline.json
pnpm dlx shadcn-vue@latest add https://vuzeno.com/r/timeline.json
Usage
<script setup lang="ts">
import { Timeline } from "@/components/ui/timeline";
</script>
<template>
<Timeline.Root>
<Timeline.Item>
<Timeline.Media />
<Timeline.Content>
<Timeline.Header>
<Timeline.Title>Title</Timeline.Title>
<Timeline.Description>Description</Timeline.Description>
</Timeline.Header>
</Timeline.Content>
</Timeline.Item>
</Timeline.Root>
</template>
Composition
Timeline.Root
└── Timeline.Item
├── Timeline.Media
└── Timeline.Content
└── Timeline.Header
├── Timeline.Title
└── Timeline.Description
Anatomy
<template>
<Timeline.Root direction="vertical">
<Timeline.Item>
<Timeline.Media variant="icon" />
<Timeline.Content>
<Timeline.Header>
<Timeline.Title />
<Timeline.Description />
</Timeline.Header>
<!-- Content -->
</Timeline.Content>
</Timeline.Item>
</Timeline.Root>
</template>
Examples
Horizontal
Switch the orientation with direction="horizontal". The thread runs left-to-right and content stacks above or below each marker.
<script setup lang="ts">
import { Timeline } from "@/components/ui/timeline";
</script>
<template>
<Timeline.Root direction="horizontal" class="w-full">
<Timeline.Item>
<Timeline.Media />
<Timeline.Content>
<Timeline.Header>
<Timeline.Title>Draft</Timeline.Title>
<Timeline.Description>Idea captured</Timeline.Description>
</Timeline.Header>
</Timeline.Content>
</Timeline.Item>
<!-- more items... -->
</Timeline.Root>
</template>
Alternating sides
Use align="center" on Timeline.Root to center the thread, then set each Timeline.Item's side to left or right (or top/bottom for horizontal) to build an alternating layout.
<template>
<Timeline.Root align="center" class="w-full max-w-md">
<Timeline.Item side="left">
<Timeline.Media />
<Timeline.Content>
<Timeline.Header>
<Timeline.Title>Project kickoff</Timeline.Title>
<Timeline.Description>Monday · 9:00 AM</Timeline.Description>
</Timeline.Header>
</Timeline.Content>
</Timeline.Item>
<Timeline.Item side="right">
<Timeline.Media />
<Timeline.Content>
<Timeline.Header>
<Timeline.Title>Design review</Timeline.Title>
<Timeline.Description>Tuesday · 2:30 PM</Timeline.Description>
</Timeline.Header>
</Timeline.Content>
</Timeline.Item>
<!-- more items... -->
</Timeline.Root>
</template>
API Reference
Timeline.Root
| Prop | Type | Default |
|---|---|---|
direction | "vertical" | "horizontal" | "vertical" |
side | "left" | "right" | "top" | "bottom" | - |
align | "start" | "center" | "start" |
Timeline.Item
| Prop | Type | Default |
|---|---|---|
side | "left" | "right" | "top" | "bottom" | inherit |
Timeline.Media
| Prop | Type | Default |
|---|---|---|
variant | "dot" | "icon" | "dot" |
Notes
align="start"(the default) produces a thread on one side of each item. Mixing per-itemsidevalues instartmode will shift the thread between items — usealign="center"for alternating layouts.- The connector line is hidden on the last item via a
last:variant, so a single-item timeline shows only the marker.