Clip timeline

Positions supplied clips within a declared duration, with contained horizontal scrolling, accessible selection, and optional seeking.

Assembly

0 to 60 seconds

Video

Inspect an assembly

First cut · seconds

Sequence

0 to 60 seconds

Video
Dialogue

Use it for

  • Caller-owned tracks and clips measured explicitly in seconds or whole frames.
  • onSelectClip for selection requests and onSeek for a native position control; update the supplied selectedClipId and position.
  • Separate rows within each track keep overlapping clips visible without implying an edit.

Not for

  • Expecting drag editing, playback, trimming, or a media backend.
  • Hiding invalid or unassigned clips; their text records remain visible.

Three ways in. They share one source, so the pixels match whichever you pick.

1. Import the package

npm install @noorddev/vlak-react

// once, next to your app's root
import "@noorddev/vlak-react/css";

import { ClipTimeline } from "@noorddev/vlak-react";

Precompiled React and one stylesheet. No compiler to configure. Per-component imports work too: @noorddev/vlak-react/components/clip-timeline.

2. Vendor the source

npx @noorddev/vlak-cli add clip-timeline

The StyleX leaf lands in components/vlak/, for your own compiler to own. See StyleX.

3. Through shadcn

npx shadcn add https://vlak.dev/r/clip-timeline.json

The same registry item, installed by shadcn's CLI.

CSS only

<link rel="stylesheet" href="node_modules/@noorddev/vlak/css/vlak.css" />

No React. Link vlak.css and use the markup and classes below.

import { ClipTimeline } from "@noorddev/vlak-react";

<ClipTimeline label="Assembly" duration={60} unit="seconds" tracks={[{ id: "video", label: "Video" }]} clips={[{ id: "opening", trackId: "video", label: "Opening", start: 6, duration: 18 }]} />

ClipTimeline

Supplied clip positions, with separate reachable selection and seek controls.

PropTypeDefaultDescription
labelrequiredReactNode
tracksrequiredClipTrack[]
clipsrequiredTimelineClip[]
durationrequirednumber
unitrequired"seconds" | "frames"
positionnumber | null
selectedClipIdstring | null
onSeek(position: number) => void
onSelectClip(id: string) => void
disabledboolean

Also accepts HTMLAttributes<HTMLDivElement>.

KeysDoes
TabMoves through the optional seek control, scrollable track region, and selection buttons.
Arrow keys, Home, EndUses native seeking on the range input; arrow keys scroll the focused track region.
Enter, SpaceRequests selection from a focused clip button.
<div class="rs-clip-timeline"><p class="rs-clip-timeline-label" id="assembly-label">Assembly</p><p class="rs-clip-timeline-note">0 to 60 seconds</p><div class="rs-clip-timeline-viewport" role="region" aria-labelledby="assembly-label" tabindex="0"><div class="rs-clip-timeline-track"><span>Video</span><div class="rs-clip-timeline-lane" aria-hidden="true"><span class="rs-clip-timeline-clip" style="inset-inline-start:10%;width:30%">Opening</span></div></div></div><ul class="rs-clip-timeline-rows"><li><span>Opening · Video · 6–24 seconds</span></li></ul></div>
.rs-clip-timeline.rs-clip-timeline-label.rs-clip-timeline-note.rs-clip-timeline-seek.rs-clip-timeline-range.rs-clip-timeline-viewport.rs-clip-timeline-track.rs-clip-timeline-clips.rs-clip-timeline-lane.rs-clip-timeline-clip.rs-clip-timeline-selected.rs-clip-timeline-rows.rs-clip-timeline-button