Sparkline
SM · 950B gzip budgetInline mini chart for trend visualization.
- Category
- Data display
- Budget
- sm, single-purpose control
- External runtime
- React / React DOM only
axe fixtureSSR rendersource scanbundle budget
Preview
Live fixtureTry the component here. Locale-aware formatting and direction follow the selected language; example content and labels are not automatically translated. Overlay demos use interactive launchers.
Install
npx shadcn@latest add https://gear5-ui.vercel.app/r/sparkline.jsonCopies the source into your project. Pulls in 1 shared registry item: cn.
New here? Set up Tailwind and import aliases first →Source & props
Edit on GitHub ↗Prop types and inline documentation are included below. This is repository source; the installer rewrites shared imports for your project.
import { useMemo } from "react";
import { cn } from "../lib/cn";
export interface SparklineProps {
data: number[];
width?: number;
height?: number;
color?: string;
strokeWidth?: number;
label: string;
className?: string;
}
/**
* Inline mini SVG sparkline chart. The `aria-label` includes the data values
* for screen readers. The SVG itself is `aria-hidden="true"` since the label
* carries all the information.
*/
export function Sparkline({
data,
width = 120,
height = 32,
color = "rgb(37, 99, 235)",
strokeWidth = 2,
label,
className,
}: SparklineProps) {
const pathD = useMemo(() => {
if (data.length < 2) return "";
const min = Math.min(...data);
const max = Math.max(...data);
const range = max - min || 1;
const padding = strokeWidth;
return data
.map((value, index) => {
const x = padding + (index / (data.length - 1)) * (width - padding * 2);
const y = padding + (1 - (value - min) / range) * (height - padding * 2);
return `${index === 0 ? "M" : "L"} ${x} ${y}`;
})
.join(" ");
}, [data, width, height, strokeWidth]);
const ariaLabel = `${label}: ${data.join(", ")}`;
return (
<svg
role="img"
aria-label={ariaLabel}
width={width}
height={height}
viewBox={`0 0 ${width} ${height}`}
className={cn("inline-block", className)}
>
<title>{ariaLabel}</title>
<path
d={pathD}
fill="none"
stroke={color}
strokeWidth={strokeWidth}
strokeLinecap="round"
strokeLinejoin="round"
/>
</svg>
);
}
What CI checks
Quality contract- Bundled, minified and gzipped against its tier budget
- Audited by axe in the state previewed above
- Rendered through react-dom/server with no browser globals
- Scanned for network calls, dangerous sinks, and unguarded animation