No data
; const w = 600; const pad = { l: 0, r: 0, t: 14, b: showLabels ? 18 : 2 }; const m = max(data, (d) => d.value) ?? 0; const y = scaleLinear().domain([0, m || 1]).range([height - pad.b, pad.t]); const bw = (w - pad.l - pad.r) / data.length; const every = Math.ceil(data.length / 12); return ( ); } /** Horizontal bars with labels — for rankings (top orgs, categories). Uses HTML for crisp text. */ export function HBars({ data, className, color = 'var(--series-1)', format = fmtCompact, max: maxOverride, href }: { data: { label: string; value: number; sub?: string; href?: string }[]; className?: string; color?: string; format?: (v: number) => string; max?: number; href?: (d: { label: string }) => string | undefined }) { if (!data.length) returnNo data
; const m = (maxOverride ?? max(data, (d) => d.value) ?? 0) || 1; return (Not enough history
; const w = 720; const pad = { l: 44, r: 16, t: 12, b: 24 }; const xs = all.map((p) => (p.x instanceof Date ? p.x.getTime() : Number(p.x))); const [x0, x1] = extent(xs) as [number, number]; const x = xTime ? scaleTime().domain([new Date(x0), new Date(x1 === x0 ? x0 + 86400000 : x1)]).range([pad.l, w - pad.r]) : scaleLinear().domain([x0, x1 === x0 ? x0 + 1 : x1]).range([pad.l, w - pad.r]); const ys = all.map((p) => p.y); let [y0, y1] = yDomain ?? (extent(ys) as [number, number]); if (y0 === y1) { y0 = y0 * 0.9; y1 = y1 * 1.1 || 1; } if (!yDomain && !log) y0 = Math.min(0, y0); if (log) { y0 = Math.max(Number.EPSILON, y0 <= 0 ? Math.min(...ys.filter((v) => v > 0)) : y0) / 1.25; y1 = y1 * 1.25; } const y = log ? scaleLog().domain([y0, y1]).range([height - pad.b, pad.t]) : scaleLinear().domain([y0, y1]).nice(4).range([height - pad.b, pad.t]); const toX = (p: Point) => x(p.x instanceof Date ? p.x : xTime ? new Date(Number(p.x)) : Number(p.x)) as number; const l = line