1 звезда на GitHub = 1 новый компонент.

Поставить звезду
Графики и статистикаchartsvgzero-dependencysparklineinlinemicrotrend

Sparkline Chart

Компактный спарклайн (линия, область или микро-столбцы) для таблиц, KPI-карточек и текста.

Живое превью

Использование

Скопируйте и вставьте этот код в ваш React-компонент:

tsx
import { SparklineChart } from 'react-component-kit-ui/charts';

<SparklineChart data={[12, 15, 11, 18, 22, 19, 25]} variant="area" size="md" label="Signups, last 7 days" />

Ручная установка

Если вы не используете пакет npm, создайте файл и вставьте следующий код: src/components/SparklineChart.tsx + SparklineChart.css:

SparklineChart.tsx
'use client';

import { scaleLinear, smoothPath, areaPath, POSITIVE, NEGATIVE, type Point } from './chart-utils';
import './SparklineChart.css';

/**
 * SparklineChart — Compact inline trend line for tables, KPI tiles and text.
 * Marks the last point and optionally the min/max.
 *
 * @param {number[]} data - Values to plot.
 * @param {string} label - Accessible description (e.g. 'Revenue, last 30 days').
 * @param {string} variant - Visual style (line|area|bars).
 * @param {string} size - Dimensions (sm|md|lg).
 * @param {string} color - Stroke/fill color; defaults to trend status color.
 * @param {boolean} showExtremes - Mark the min and max points.
 * @param {string} className - Extra CSS class.
 */
export interface SparklineChartProps {
  data?: number[];
  label?: string;
  variant?: 'line' | 'area' | 'bars';
  size?: 'sm' | 'md' | 'lg';
  color?: string;
  showExtremes?: boolean;
  className?: string;
}

export function SparklineChart({
  data = [12, 15, 11, 18, 17, 22, 19, 25, 24, 29, 27, 33],
  label = 'Trend, last 12 periods',
  variant = 'area',
  size = 'md',
  color,
  showExtremes = false,
  className = '',
}: SparklineChartProps) {
  const dims = { sm: [80, 24], md: [140, 36], lg: [220, 56] }[size];
  const [W, H] = dims;
  const pad = 3;
  const trendUp = data[data.length - 1] >= data[0];
  const stroke = color ?? (trendUp ? POSITIVE : NEGATIVE);
  const y = scaleLinear(Math.min(...data), Math.max(...data), H - pad, pad);
  const x = (i: number) => pad + (i / Math.max(1, data.length - 1)) * (W - pad * 2);
  const pts: Point[] = data.map((v, i) => [x(i), y(v)]);
  const last = pts[pts.length - 1];
  const minI = data.indexOf(Math.min(...data));
  const maxI = data.indexOf(Math.max(...data));
  const barW = (W - pad * 2) / data.length - 2;
  const change = data[0] ? (((data[data.length - 1] - data[0]) / Math.abs(data[0])) * 100).toFixed(0) : '0';
  return (
    <>
      <svg className={`spark spark--${size} ${className}`} viewBox={`0 0 ${W} ${H}`} width={W} height={H} role="img" aria-label={`${label}: from ${data[0]} to ${data[data.length - 1]} (${trendUp ? '+' : ''}${change}%)`} data-rk-cd2e33="">
        {variant === 'bars' ? (
          data.map((v, i) => {
            const top = y(v);
            return <rect x={pad + i * (barW + 2)} y={top} width={Math.max(1, barW)} height={Math.max(1, H - pad - top)} rx="1.5" fill={stroke} opacity={i === data.length - 1 ? 1 : 0.55} data-rk-cd2e33="" />;
          })
        ) : (
          <>
            {variant === 'area' && <path d={areaPath(pts, H)} fill={stroke} fillOpacity="0.16" data-rk-cd2e33="" />}
            <path d={smoothPath(pts)} fill="none" stroke={stroke} strokeWidth="1.75" strokeLinecap="round" strokeLinejoin="round" data-rk-cd2e33="" />
            {showExtremes && (
              <>
                <circle cx={pts[minI][0]} cy={pts[minI][1]} r="2.5" fill="var(--c-text-3, #8a8a8a)" data-rk-cd2e33="" />
                <circle cx={pts[maxI][0]} cy={pts[maxI][1]} r="2.5" fill="var(--c-text-1, #fff)" data-rk-cd2e33="" />
              </>
            )}
            <circle cx={last[0]} cy={last[1]} r="3" fill={stroke} stroke="var(--chart-surface, #0d0d0f)" strokeWidth="1.5" data-rk-cd2e33="" />
          </>
        )}
      </svg>
    </>
  );
}

export default SparklineChart;
SparklineChart.css
/* SparklineChart — ported from astro-component-kit (charts/SparklineChart.astro) */

.spark:where([data-rk-cd2e33]) {
  display: inline-block;
  vertical-align: middle;
  overflow: visible;
  max-width: 100%;
  height: auto;
}

Краткая информация

Категория
Графики и статистика
Имя файла
SparklineChart.tsx
Зависимости
Нет — чистый React + CSS
Теги
chartsvgzero-dependencysparklineinlinemicrotrend