'use client'; import { useState } from 'react'; import { compactNumber, fullNumber } from './scale'; export interface BarDatum { label: string; value: number; sublabel?: string; color?: string; href?: string; } /** * Horizontal bar chart (magnitude by category). Bars ≤ 24px thick, 4px rounded data-end, single * hue by default, per-mark hover tooltip, direct value label at the tip. */ export function BarChart({ data, currency = false, maxBars = 12, ariaLabel, className, percent = false }: { data: BarDatum[]; currency?: boolean; maxBars?: number; ariaLabel: string; className?: string; percent?: boolean }) { const [hover, setHover] = useState(null); const rows = data.slice(0, maxBars); if (!rows.length) return
No data
; const max = Math.max(...rows.map((r) => Math.abs(r.value)), 1e-9); const fmt = (v: number) => (percent ? `${(v * 100).toFixed(1)}%` : compactNumber(v, { currency })); const fmtFull = (v: number) => (percent ? `${(v * 100).toFixed(2)}%` : fullNumber(v, { currency })); return (
{hover !== null && rows[hover]?.sublabel ?
{rows[hover]!.sublabel}
: null}
); }