import * as Slider from "@radix-ui/react-slider"; import { formatDurationMilliseconds } from "@trigger.dev/core/v3"; import { useState } from "react"; import { Paragraph } from "~/components/primitives/Paragraph"; import { Switch } from "~/components/primitives/Switch"; import * as Timeline from "~/components/primitives/Timeline"; import type { SpanProps } from "~/components/primitives/Timeline"; import { cn } from "~/utils/cn"; const maxDuration = 10_000; type Element = { span?: { startMs: number; durationMs: number; }; points?: { ms: number; }[]; }; const elements: Element[] = [ { span: { startMs: 0, durationMs: 1_121, }, }, { span: { startMs: 19, durationMs: 1_121 - 19, }, }, { span: { startMs: 19 + 22, durationMs: 412, }, }, { span: { startMs: 19 + 22 + 3, durationMs: 412 - 3, }, points: [ { ms: 19 + 22 + 3 + 412 - 3, }, ], }, { points: [ { ms: 19 + 22 + 3 + 94, }, ], }, { span: { startMs: 19 + 22 + 3 + 94 + 3, durationMs: 3, }, }, { span: { startMs: 19 + 22 + 3 + 94 + 3 + 3, durationMs: 39, }, }, { span: { startMs: 19 + 22 + 3 + 94 + 3 + 3 + 40, durationMs: 192, }, }, ]; export default function Story() { const [scale, setScale] = useState(0.25); const [durationScale, setDurationScale] = useState(0.12); const [tickCount, setTickCount] = useState(5); const [showDuration, setShowDurations] = useState(true); const durationMs = maxDuration * durationScale; return (
Scale setScale(value[0])} min={0} max={1} step={0.01} >
Ticks {tickCount} setTickCount(value[0])} min={2} max={10} step={1} >
Duration {formatDurationMilliseconds(durationMs, { style: "short" })} setDurationScale(value[0])} min={0} max={1} step={0.01} >
{/* The main body */}
{/* Follows the cursor */} {(ms) => (
{formatDurationMilliseconds(ms, { style: "short", maxDecimalPoints: ms < 1000 ? 0 : 1, })}
)} {/* The duration labels */} {(ms: number, index: number) => ( {(ms) => (
{formatDurationMilliseconds(ms, { style: "short", maxDecimalPoints: ms < 1000 ? 0 : 1, })}
)}
)}
{/* Main timeline body */} {/* The vertical tick lines */} {(ms: number, index: number) => { if (index === 0) return null; return ( ); }} <> {elements.map((element, index) => { return ( console.log(`hover ${index}`)} > {element.span && ( )} {element.points?.map((point, pointIndex) => ( ))} ); })}
); } function SpanWithDuration({ showDuration, ...props }: SpanProps & { showDuration: boolean }) { return (
{formatDurationMilliseconds(props.durationMs, { style: "short", maxDecimalPoints: props.durationMs < 1000 ? 0 : 1, })}
); }