KQ-1630 · GRAPH/HORIZON

Graph Horizon

A strip of graph paper running to a horizon in perspective, its minor and major lines rolling toward you, plotted as it comes: a pen per series rides a rail halfway out and swings to each value as the paper passes, so every series is drawn in its own lane as a curve on the paper. As each sample reaches the reading line near the bottom, the curve there lifts off the paper toward you on the settle of springs.snap, a quick rise, a held peak and the faintest dip, with its shadow left on the paper and its values printed beside it, then lays back down. Drag the paper and the grabbed point stays under the pointer; a flick coasts and the roll picks up again. Arrow keys roll one sample at a time on the springs.glide constants and read it out, Space starts and stops the roll, Home and End go to the ends.

KQ-1630 · GRAPH/HORIZON

Gaugeworks · product metrics

Gaugeworks · weekly

Plotted as it comes

Gaugeworks weekly product metrics
SampleSessionsSign-upsChurn
W140.5k3.1k3.4%
W243.7k2.7k2.9%
W345.4k2.2k2.6%
W445.1k1.8k2.6%
W543.2k1.9k2.9%
W640.2k2.3k3.3%
W737.3k2.9k3.4%
W835.4k3.3k3.1%
W935.2k3.3k2.7%
W1036.9k2.9k2.4%
W1140.1k2.4k2.4%
W1244.1k2.0k2.7%
W1347.7k2.1k3.1%
W1450.1k2.6k3.2%
W1550.7k3.2k2.9%
W1649.4k3.5k2.5%
W1746.7k3.5k2.1%
W1843.7k3.0k2.2%
W1941.2k2.5k2.5%
W2040.2k2.3k2.9%
W2141.1k2.4k3.0%
W2243.8k2.9k2.7%
W2347.6k3.5k2.2%
W2451.5k3.8k1.9%
W2554.5k3.6k2.0%
W2655.9k3.2k2.3%
Arrow keys roll the paper a sample at a time and read it out; Space starts and stops the roll; Home and End go to the first and last sample.

rolling · W7 · sessions 37.3k

Install

One command — the source lands in your repo. Or copy it from the Code tab.

$ pnpm dlx shadcn@latest add @kinetiq/graph-horizon

Props

series
readonly GraphHorizonSeries[]
default defaultGraphHorizonSeries
The series, each plotted in its own lane: { label, values, color?, unit? }. Up to six.
labels
readonly string[]
default "W1", "W2"…
A label per sample, printed at the strip's margin and read out.
speed
number
default 0.6
How fast the paper rolls toward you, in samples a second.
tilt
number
default 22
How far the camera looks down at the paper, in degrees: low is a grazing view with a high horizon.
inkColor
"blue" | "green" | "sepia" | "graphite" | string
default "blue"
The grid's ink: a named ink or any CSS colour.
paper
string
default —
The paper, any CSS colour; by default the card colour tinted toward the ink, white paper on a light page and blueprint on a dark one.
lift
number
default 18
How far a reading lifts off the paper as it passes, in px.
readAt
number
default 0.8
Where the reading line sits, as a share of the height from the top, 0.55 to 0.95.
majorEvery
number
default 5
Minor cells per major cell, and per sample row.
format
(value: number, series: GraphHorizonSeries) => string
default —
How a reading is printed; by default one decimal and the series' unit.
playing / defaultPlaying
boolean
default true
Whether the paper is rolling, controlled or initial.
onPlayingChange
(playing: boolean) => void
default —
Fires from the key or the step that started or stopped the roll.
onSampleChange
(index: number) => void
default —
Fires when a new sample reaches the reading line, with its index.
interactive
boolean
default true
Drag and keys move the paper.
label
string
default "Weekly product metrics"
Names the chart for assistive technology.
children
React.ReactNode
default —
Content above the horizon: a heading, a figure.
dpr
number
default 2
Cap on the canvas's device pixel ratio, at most 2.
disabled
boolean
default false
Shows the paper still and takes no input.
className
string
default "h-56 w-full"
Sizes the box.