Skip to content
Data & ChartsPro

Bullet Chart

Bullet chart for a measure against its target and qualitative ranges — horizontal, vertical or as a KPI list.

Usage

Quarter KPIs

Bullet chart, 3 parts: Revenue 270, Profit 22, New customers 1.7k.
Quarter KPIs, data table
nameActualTargetpoorokgood
Revenue270250150225300
Profit2226202530
New customers1.7k2.1k1.4k2k2.5k

Installation

Bullet Chart comes with WunderUI Core and Pro, in the package from your plan. See the plans.

Then import what you need:

tsx
import {
  BulletChart,
  BulletChartProps,
  BulletChartVariant,
} from "@wunderui/react"

Examples

Bullet

Quarter KPIs

Bullet chart, 3 parts: Revenue 270, Profit 22, New customers 1.7k.
Quarter KPIs, data table
nameActualTargetpoorokgood
Revenue270250150225300
Profit2226202530
New customers1.7k2.1k1.4k2k2.5k

Vertical Bullet

Quarter KPIs

Bullet chart, 4 parts: Revenue 270, Profit 22, New customers 1.7k, Satisfaction 4.6.
Quarter KPIs, data table
nameActualTargetpoorokgood
Revenue270250150225300
Profit2226202530
New customers1.7k2.1k1.4k2k2.5k
Satisfaction4.64.43.54.35

Bullet List

Quarter KPIs

Bullet chart, 5 parts: Revenue 270, Profit 22, New customers 1.7k, Satisfaction 4.6, Uptime 99.4.
Quarter KPIs, data table
nameActualTargetpoorokgood
Revenue270250150225300
Profit2226202530
New customers1.7k2.1k1.4k2k2.5k
Satisfaction4.64.43.54.35
Uptime99.499.99899.5100

State – Loading

Quarter KPIs

Bullet chart, 3 parts: Revenue 270, Profit 22, New customers 1.7k.

In context

How the component is used inside real screens — the same compositions as the Usage section of the Figma page.

Quota Attainment per Rep

Closed won against quota per rep.

Quota attainment

Closed won against quota, this quarter (k$)

Bullet chart, 4 parts: Alina Lorenz 118k, Felix Brandt 92k, Mara Jensen 76k, Jonas Becker 104k.
Quota attainment, data table
nameActualTargetpoorokgood
Alina Lorenz118k100k60k90k130k
Felix Brandt92k100k60k90k130k
Mara Jensen76k100k60k90k130k
Jonas Becker104k100k60k90k130k

OKR Progress

Key results, current against target.

Key results

Bullet chart, 3 parts: Activation to 40% 34, Churn below 2% 2.4, NPS above 50 48.
OKR progress, data table
nameActualTargetpoorokgood
Activation to 40%3440203448
Churn below 2%2.4211.72.4
NPS above 5048502542.560

Budget vs Actual

Department spend against budget with KPI cards.

Budget

$970k

this year

Spent

$928k

96%

Over budget

Sales

+9%

Budget vs actual

Bullet chart, 4 parts: Marketing $182k, Sales $240k, R&D $410k, Support $96k.
Budget against actual, data table
nameActualTargetpoorokgood
Marketing$182k$200k$120k$180k$240k
Sales$240k$220k$132k$198k$264k
R&D$410k$450k$270k$405k$540k
Support$96k$100k$60k$90k$120k

API Reference

PropTypeDefault
variant"bullet" | "vertical-bullet" | "bullet-list""bullet"
dataRecord<string, unknown>[]—
indexstring—
valuestring"value"
colorsChartColor[]—
heightnumber280
state"ready" | "loading" | "empty" | "error""ready"
hiddenSeriesstring[]—
activeIndex / defaultActiveIndexnumber | null—
valueFormatter(v: number) => string—
animate · animationKeyboolean · string | number—
target · rangesstring · string[]"target" · ["poor", "ok", "good"]
activeIndexnumber | null—
animateboolean—
animationKeystring | number—
classNamestring—
defaultActiveIndexnumber | null—
descriptionstring—
emptyDescriptionstring—
emptyTitlestring—
errorDescriptionstring—
errorTitlestring—
labelstring—
onActiveIndexChange(index: number | null) => void—
onRetry() => void—
rangesreadonly string[]["poor", "ok", "good"]
targetstring"target"
tooltipboolean—
widthnumber—

Theming

The CSS variables this component reads. Set one on any wrapper to restyle everything inside it. More in Theming.

VariableUsed forDefault
Color
Value#E2E2E7
Value#555CF3
Value#FFFFFFdark #1C1D20
Value#A2A3A3dark #6E7078
Fill, value#000000dark #FFFFFF
Fill#454648dark #D1D1D1
Fill#6E6E70dark #A2A3A3