caliper uidocs

Performance report

Pro

Objectives with status, progress and commentary.

Installs components/ui/performance-report.tsxDepends on @radix-ui/react-slot, lucide-reactMotion none in component source
pnpm dlx shadcn@latest add @caliper/performance-report

October performance

Oct 1 – Oct 31, 2025

Objectives against target
ObjectiveActualStatus
Growth
Monthly revenueRavi Patel$184,300On track
New customersKofi Mensah142Off track
Product
Weekly active teamsNoor Haddad1,260At risk
Activation within 7 daysNoor Haddad54%Off track
Reliability
p95 API latencyLena Fischer238 msAt risk
UptimeLena Fischer99.97%On track

When to use #

Use it for

  • A periodic review of goals.

Skip it when

  • You need only a chart.

Installation #

terminal
pnpm dlx shadcn@latest add @caliper/performance-report

Adds its 5 files to components/ui/, each with its own stylesheet, and installs their packages. Pro installs with your access token, set up once per project. See Pro access. The first part also adds Caliper UI’s tokens; import them once as in Installation.

Usage #

Import it from your copy of the source. The example behind the preview comes with the source. It is built from PerformanceReport and objectiveStatus.

example.tsx
import { PerformanceReport, objectiveStatus } from "@/components/ui/performance-report"

The worked example comes with Pro

The 23-line example behind the preview opens here with a Pro or Team licence.

Checking your licence…

API reference #

PerformanceReport

component
PropTypeDefault
title *string—
period *string—
objectives *readonly Objective[]—
notesstring—
onNotesChange((notes: string) => void)—
onExport(() => void)—
classNamestring—

objectiveStatus

component
PropTypeDefault
id *string—
area *string—
label *string—
actual *number—
target *number—
lowerIsBetterboolean—
series *readonly number[]—
format((n: number) => string)—
ownerstring—

Accessibility #

It exposes group and status semantics, with aria-label, aria-hidden and aria-pressed kept in step with state. Changes that matter are announced through a live region.

No custom key handling; Tab and the native activation keys do the work.

Motion #

It declares no animation in its component source. Any transition comes from its stylesheet, which uses the duration tokens that collapse to instant under prefers-reduced-motion.