Something went wrong. Try again.
My website. cameron.stream
Something went wrong. Try again.
TypeScript
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192import type { ChartMeta, PlotArea, ValueFormat } from "./types.ts";
function stableIdHash(value: string): string { let hash = 0xcbf29ce484222325n; for (let index = 0; index < value.length; index += 1) { hash ^= BigInt(value.charCodeAt(index)); hash = BigInt.asUintN(64, hash * 0x100000001b3n); } return hash.toString(16).padStart(16, "0");}
export function chartId(meta: ChartMeta, suffix: string): string { const seed = meta.id?.trim() || meta.title; const normalized = seed .normalize("NFKD") .replace(/[\u0300-\u036f]/g, "") .toLowerCase() .replace(/[^a-z0-9]+/g, "-") .replace(/^-+|-+$/g, "") || "chart"; const boundedSlug = normalized.slice(0, 36); return `chart-${boundedSlug}-${stableIdHash(seed)}-${suffix}`;}
export function plotArea( width: number, height: number, margins: Partial<Pick<PlotArea, "marginLeft" | "marginRight" | "marginTop" | "marginBottom">> = {},): PlotArea { const marginLeft = margins.marginLeft ?? 62; const marginRight = margins.marginRight ?? 18; const marginTop = margins.marginTop ?? 18; const marginBottom = margins.marginBottom ?? 54; return { width, height, marginLeft, marginRight, marginTop, marginBottom, innerWidth: Math.max(1, width - marginLeft - marginRight), innerHeight: Math.max(1, height - marginTop - marginBottom), };}
export function finite(value: number): boolean { return Number.isFinite(value);}
export function finiteDomain( requested: [number, number] | undefined, fallback: [number, number],): [number, number] { const candidate = requested && requested.every(Number.isFinite) ? requested : fallback; if (candidate[0] === candidate[1]) { const padding = Math.abs(candidate[0]) > 0 ? Math.abs(candidate[0]) * 0.1 : 1; return [candidate[0] - padding, candidate[1] + padding]; } return candidate[0] < candidate[1] ? candidate : [candidate[1], candidate[0]];}
export function formatValue( value: number, format: ValueFormat = "number", digits = 2,): string { if (!Number.isFinite(value)) return "No data"; if (format === "percent") { return new Intl.NumberFormat("en-US", { style: "percent", maximumFractionDigits: digits, }).format(value); } if (format === "integer") { return new Intl.NumberFormat("en-US", { maximumFractionDigits: 0 }).format(value); } return new Intl.NumberFormat("en-US", { maximumFractionDigits: digits, }).format(value);}
export function truncateLabel(value: string, limit = 22): string { return value.length <= limit ? value : `${value.slice(0, Math.max(1, limit - 1)).trimEnd()}…`;}
export function invalidCount(values: number[]): number { return values.filter((value) => !Number.isFinite(value)).length;}