Data

Numbers, on air

The readout layer of the system: stats, metric tiles, KPI rows, progress bars, segmented meters, and dependency-free sparklines. Every figure is set in the condensed display face with tabular figures, so columns of numbers stay locked to the grid.

6-8 UI

Stat

A single readout: uppercase label, a display-face value with tabular figures, and an optional delta pill that reads green for a gain and red for a loss. Add an icon for a category cue.

Default
Points per game
24.8+2.3
Loss / danger delta
Field goal %
48.6%-1.2%
Inverted (lower is better)
Turnovers
2.1-0.6
Sizes
Assists
7.1+0.4
Rebounds
11.4+1.8
Blocks
1.9+0.3
Centered, no delta
Season record
41-19
With unit
Minutes
34.2MPG+1.1

6-8 UI

Metric Tile

A glass panel that frames a Stat, a full-width trend sparkline, and a short caption. It lifts and glows on hover; the accent hairline and chart tone follow the story.

Teal accent
Points per game
24.8+2.3

Up over the last eight, led by a 31-point night in Denver.

Yellow accent
Player efficiency
27.4+1.6

Career-high pace, trending toward All-Star selection.

Negative delta
Field goal %
43.1%-2.4%

Cooling off after a hot start; shot selection under review.

6-8 UI

KPI Row

A responsive grid of metric tiles for the top of a coach or league dashboard. Feed it an array of tiles; it steps from four-up down to a single column on phones.

Team dashboard: season to date
Record
41-19

Second in the conference, four games back of the top seed.

Net rating
+8.4+1.2

Third-best mark in the league since the new year.

Points per game
118.6+3.1

Offense humming behind a faster pace.

Opp. points
110.2-2.5

Defense tightening: fewer points allowed each week.

6-8 UI

Progress

A determinate bar on a Radix foundation. The teal gradient indicator glows and slides its width in with an ease-out transition. Switch to yellow for live or high-priority meters.

Labelled with value
Season played73%
Playoff odds88%
Salary cap used94%
Sizes
Tones
Home win rate71%
Games remaining26%

6-8 UI

Meter

A segmented pip gauge for ratings and readiness. Filled pips glow in the accent; empty pips sit dim, so the reading lands from across the room.

Scouting rating
Shooting8 / 10
Playmaking9 / 10
Defense7 / 10
Percent, custom format
Stamina62%
Load management38%
Sizes
Small
Medium
Large

6-8 UI

Sparkline

A dependency-free inline SVG trend, drawn straight from a number array with a soft area wash and an end-point marker. Pick a tone to match the direction of the story.

Tones
Line only
Inline with a stat
Points
24.8+2.3

Reference

Props

The core props for the data primitives. Every component also forwards native attributes and merges an incoming className.

Stat

PropTypeDefaultDescription
labelstring-Uppercase caption above the value.
valueReactNode-The headline figure, set in the display face.
unitstring-Small unit appended to the value, e.g. "%".
deltanumber-Signed change; drives the arrow and pill color.
invertDeltabooleanfalseTreat a decrease as positive (green).
iconLucideIcon-Leading icon shown in a teal chip.
size"sm" | "md" | "lg""md"Value and label scale.
align"left" | "center""left"Horizontal alignment.

MetricTile

PropTypeDefaultDescription
label / value / delta / iconStatProps-Forwarded to the inner Stat.
datanumber[]-Series for the full-width trend sparkline.
captionstring-Short supporting line beneath the chart.
accent"teal" | "yellow""teal"Hairline and default chart tone.
sparklineToneSparklineTone-Force the chart tone regardless of accent.

Progress · Meter · Sparkline

PropTypeDefaultDescription
Progress.valuenumber-Current value, measured against max (default 100).
Progress.tone"teal" | "yellow""teal"Indicator gradient.
Meter.value / maxnumber-Reading against full scale (max default 10).
Meter.segmentsnumber-Pip count; defaults to max.
Sparkline.datanumber[]-The series to plot.
Sparkline.stretchbooleanfalseFill the container width edge-to-edge.
Sparkline.toneSparklineTone"teal"teal · yellow · success · danger.
Copy
import { KpiRow } from "@/components/ui/kpi-row";
import { Target, Trophy } from "lucide-react";

<KpiRow
  cols={4}
  items={[
    { label: "Record", value: "41-19", icon: Trophy },
    {
      label: "Points per game",
      value: "118.6",
      delta: 3.1,
      icon: Target,
      data: [110, 114, 112, 119, 116, 121, 118, 118],
      caption: "Offense humming behind a faster pace.",
    },
  ]}
/>