@lamatemaga/sterling 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/SterlingFigure.tsx","../src/palette.ts","../src/SterlingLegend.tsx","../src/SterlingFigureActions.tsx","../src/dataExport.ts","../src/editorial.tsx","../src/charts.tsx","../src/plot.tsx","../src/visualStyle.ts","../src/canonicalCharts.tsx","../src/tailwind.ts","../src/mdx.tsx"],"sourcesContent":["import { isValidElement, type CSSProperties, type ReactNode } from \"react\";\nimport { SterlingInlineLegend, type SterlingLegendItem } from \"./SterlingLegend\";\nimport { SterlingFigureActions } from \"./SterlingFigureActions\";\nimport { inferSterlingDataExport, type SterlingDataExport } from \"./dataExport\";\nimport { sterlingCredit, type SterlingEditorial } from \"./editorial\";\nimport { sterlingPaletteStyle, type SterlingPalette } from \"./palette\";\nimport type { SterlingLocale } from \"./types\";\n\nexport type SterlingFigureSize = \"compact\" | \"medium\" | \"wide\" | \"full\";\n\nexport interface SterlingFigureProps {\n locale?: SterlingLocale;\n labelPrimary: string;\n labelSecondary: string;\n title: string;\n subtitle: ReactNode;\n legend?: SterlingLegendItem[];\n source: ReactNode;\n children: ReactNode;\n size?: SterlingFigureSize;\n className?: string;\n style?: CSSProperties;\n /** Keep Sterling by default, or replace any subset with CSS colors/variables. */\n palette?: SterlingPalette;\n /** Overrides the localized default without changing the figure structure. */\n signature?: ReactNode | false;\n sourceLabel?: ReactNode;\n /** Optional destination for the QED-like period after the title. */\n titleMarkHref?: string;\n /** Portable house-style overrides. Individual legacy props take precedence. */\n editorial?: SterlingEditorial;\n /** Processed rows used by this figure. They can be downloaded as a CSV. */\n dataExport?: SterlingDataExport;\n}\n\nexport function SterlingFigure({\n locale = \"en\",\n labelPrimary,\n labelSecondary,\n title,\n subtitle,\n legend,\n source,\n children,\n size = \"medium\",\n className,\n style,\n palette,\n signature,\n sourceLabel,\n titleMarkHref,\n editorial,\n dataExport,\n}: SterlingFigureProps) {\n const defaults: SterlingEditorial = { titleMark: \".\", signature: sterlingCredit({}, locale) };\n const titleMark = editorial?.titleMark === undefined ? defaults.titleMark : editorial.titleMark;\n const resolvedTitleMarkHref = titleMarkHref ?? editorial?.titleMarkHref;\n const resolvedSourceLabel = sourceLabel ?? editorial?.sourceLabel ?? (locale === \"es\" ? \"Fuente\" : \"Source\");\n const resolvedSignature = signature ?? editorial?.signature ?? defaults.signature;\n const inferredDataExport = isValidElement(children)\n ? inferSterlingDataExport(children.props as Record<string, unknown>)\n : undefined;\n\n return (\n <figure\n className={[\"sterling-figure\", className].filter(Boolean).join(\" \")}\n data-size={size}\n style={{ ...sterlingPaletteStyle(palette), ...style }}\n >\n <div className=\"sterling-figure__inner\">\n <header className=\"sterling-figure__header\">\n <div className=\"sterling-figure__topline\">\n <div className=\"sterling-figure__labels\" aria-label={`${labelPrimary}, ${labelSecondary}`}>\n <span>{labelPrimary}</span>\n <span>{labelSecondary}</span>\n </div>\n <SterlingFigureActions locale={locale} title={title} dataExport={dataExport ?? inferredDataExport} />\n </div>\n <h3 className=\"sterling-figure__title\">\n {title}\n {titleMark === false ? null : resolvedTitleMarkHref ? (\n <a\n className=\"sterling-figure__period\"\n href={resolvedTitleMarkHref}\n aria-label={editorial?.titleMarkLabel ?? (locale === \"es\" ? \"Ir al inicio\" : \"Go home\")}\n >\n {titleMark}\n </a>\n ) : (\n <span className=\"sterling-figure__period\" aria-hidden=\"true\">{titleMark}</span>\n )}\n </h3>\n <p className=\"sterling-figure__subtitle\">\n {subtitle}\n {legend?.length ? <SterlingInlineLegend items={legend} locale={locale} /> : null}\n </p>\n </header>\n\n <div className=\"sterling-figure__chart\">{children}</div>\n\n <figcaption className=\"sterling-figure__caption\">\n <span>\n <span className=\"sterling-figure__caption-label\">{resolvedSourceLabel}:</span> {source}\n </span>\n {resolvedSignature === false ? null : <span className=\"sterling-figure__signature\">{resolvedSignature}</span>}\n </figcaption>\n </div>\n </figure>\n );\n}\n","import type { CSSProperties } from \"react\";\n\nexport type SterlingMode = \"light\" | \"dark\" | \"print\";\n\nexport interface SterlingSurfacePalette {\n paper?: string;\n plot?: string;\n plotAlt?: string;\n text?: string;\n muted?: string;\n grid?: string;\n edge?: string;\n period?: string;\n}\n\n/**\n * Optional theme overrides for the Sterling grammar. Omitted values keep the\n * Sterling defaults. Values may be CSS variables, which lets a consuming site\n * provide its own light and dark definitions without changing the components.\n */\nexport interface SterlingPalette {\n surface?: SterlingSurfacePalette;\n categorical?: readonly string[];\n legend?: readonly string[];\n sequential?: readonly string[];\n divergent?: readonly string[];\n heat?: readonly string[];\n ramps?: readonly (readonly string[])[];\n}\n\ntype SterlingCssVariables = CSSProperties & Record<`--sterling-${string}`, string>;\n\n/** Identity helper that preserves literal color values in TypeScript. */\nexport function defineSterlingPalette<const T extends SterlingPalette>(palette: T): T {\n return palette;\n}\n\n/** Convert a palette override into the CSS variables consumed by every chart. */\nexport function sterlingPaletteStyle(palette?: SterlingPalette): SterlingCssVariables {\n const variables = {} as SterlingCssVariables;\n if (!palette) return variables;\n\n const surfaceTokens: Record<keyof SterlingSurfacePalette, string> = {\n paper: \"paper\",\n plot: \"surface\",\n plotAlt: \"surface-2\",\n text: \"text\",\n muted: \"muted\",\n grid: \"grid\",\n edge: \"edge\",\n period: \"period\",\n };\n\n for (const [key, value] of Object.entries(palette.surface ?? {})) {\n if (value) variables[`--sterling-${surfaceTokens[key as keyof SterlingSurfacePalette]}`] = value;\n }\n\n const assignSeries = (name: string, values?: readonly string[]) => {\n values?.forEach((value, index) => {\n if (value) variables[`--sterling-${name}-${index + 1}`] = value;\n });\n };\n\n assignSeries(\"cat\", palette.categorical);\n assignSeries(\"legend\", palette.legend);\n assignSeries(\"seq\", palette.sequential);\n assignSeries(\"div\", palette.divergent);\n assignSeries(\"heat\", palette.heat);\n palette.ramps?.forEach((ramp, familyIndex) => {\n ramp.forEach((value, stopIndex) => {\n if (value) variables[`--sterling-ramp-${familyIndex + 1}-${stopIndex + 1}`] = value;\n });\n });\n\n return variables;\n}\n\nexport const sterlingCategorical = {\n light: [\n \"#9A79E7\",\n \"#25A08D\",\n \"#D45AC7\",\n \"#E4A43A\",\n \"#5A83D7\",\n \"#E87864\",\n \"#96AB51\",\n \"#536B78\",\n ],\n dark: [\n \"#B69AF2\",\n \"#5EC9AE\",\n \"#E88BDD\",\n \"#F2C46D\",\n \"#86A8E8\",\n \"#F29A88\",\n \"#B7C974\",\n \"#B7C8D1\",\n ],\n print: [\n \"#8E68D8\",\n \"#218C7C\",\n \"#C653BC\",\n \"#D39A32\",\n \"#4F73C6\",\n \"#DC6A55\",\n \"#879347\",\n \"#607986\",\n ],\n} as const satisfies Record<SterlingMode, readonly string[]>;\n\nexport const sterlingColorNames = [\n \"Violet\",\n \"Teal\",\n \"Orchid\",\n \"Amber\",\n \"Blue\",\n \"Coral\",\n \"Moss\",\n \"Payne\",\n] as const;\n\n/** CSS variables let one SVG respond to the site's light and dark themes. */\nexport const sterlingChartColors = sterlingColorNames.map(\n (_, index) => `var(--sterling-cat-${index + 1})`,\n);\n\n/** Hue-matched text colors keep inline legends readable in both themes. */\nexport const sterlingLegendColors = sterlingColorNames.map(\n (_, index) => `var(--sterling-legend-${index + 1})`,\n);\n\nexport const sterlingDivergentColors = Array.from(\n { length: 11 },\n (_, index) => `var(--sterling-div-${index + 1})`,\n);\n\n/** A single-hue ramp for ordered magnitudes such as histogram frequency. */\nexport const sterlingSequentialColors = Array.from(\n { length: 10 },\n (_, index) => `var(--sterling-seq-${index + 1})`,\n);\n\n/** Multi-hue ordered ramp from the v1.5 topography field test. */\nexport const sterlingHeatColors = Array.from(\n { length: 11 },\n (_, index) => `var(--sterling-heat-${index + 1})`,\n);\n\n/** Stops available in every per-family sequential ramp (ramp stops 200-800). */\nexport const sterlingRampStops = 7;\n\n/**\n * One sequential ramp per categorical family, mirroring `lm_ramps` in\n * `theme_lamatemaga.R`. `family` is the categorical index (0 = Violet, 1 = Teal,\n * ...) and `stop` runs 1..7 from faintest to strongest. The token order mirrors\n * per theme, so a higher stop always reads as the higher-contrast tone.\n *\n * The band runs 200-800, not the full 100-950. The 900-950 end is nearly flat in\n * luminance (Δ 0.014) so those tones stop reading as separate steps and turn\n * light mode heavy; the 100 end is a near-white tint that all but disappears\n * against the chart surface (contrast 1.11).\n */\nexport function sterlingRamp(family: number, stop: number): string {\n const familyIndex = ((family % sterlingColorNames.length) + sterlingColorNames.length) % sterlingColorNames.length;\n const clamped = Math.max(1, Math.min(sterlingRampStops, Math.round(stop)));\n return `var(--sterling-ramp-${familyIndex + 1}-${clamped})`;\n}\n","import type { CSSProperties } from \"react\";\nimport { sterlingChartColors, sterlingLegendColors } from \"./palette\";\nimport type { SterlingLocale } from \"./types\";\n\nexport type SterlingLegendShape = \"circle\" | \"square\" | \"triangle\" | \"line\";\n\nexport interface SterlingLegendItem {\n label: string;\n colorIndex?: number;\n color?: string;\n textColor?: string;\n shape?: SterlingLegendShape;\n}\n\nfunction LegendMark({ shape = \"circle\" }: { shape?: SterlingLegendShape }) {\n if (shape === \"square\") {\n return <rect x=\"2\" y=\"2\" width=\"8\" height=\"8\" rx=\"1\" />;\n }\n\n if (shape === \"triangle\") {\n return <path d=\"M 6 1 L 11 10 L 1 10 Z\" />;\n }\n\n if (shape === \"line\") {\n return <path d=\"M 1 6 H 11\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" />;\n }\n\n return <circle cx=\"6\" cy=\"6\" r=\"4.5\" />;\n}\n\nexport function SterlingInlineLegend({\n items,\n locale,\n}: {\n items: SterlingLegendItem[];\n locale: SterlingLocale;\n}) {\n const parts = new Intl.ListFormat(locale, {\n style: \"long\",\n type: \"conjunction\",\n }).formatToParts(items.map((item) => item.label));\n let itemIndex = 0;\n\n return (\n <span className=\"sterling-inline-legend\">\n {parts.map((part, partIndex) => {\n if (part.type !== \"element\") {\n return <span key={`literal-${partIndex}`}>{part.value}</span>;\n }\n\n const item = items[itemIndex++];\n const colorIndex = Math.max(0, Math.min(sterlingChartColors.length - 1, item.colorIndex ?? 0));\n const style = {\n \"--sterling-legend-mark\": item.color ?? sterlingChartColors[colorIndex],\n \"--sterling-legend-text\": item.textColor ?? sterlingLegendColors[colorIndex],\n } as CSSProperties;\n\n return (\n <span key={`${item.label}-${partIndex}`} className=\"sterling-inline-legend__item\" style={style}>\n <svg viewBox=\"0 0 12 12\" aria-hidden=\"true\" focusable=\"false\">\n <LegendMark shape={item.shape} />\n </svg>\n <span>{item.label}</span>\n </span>\n );\n })}\n </span>\n );\n}\n","\"use client\";\n\nimport { Check, ClipboardCopy, Download, LoaderCircle, MoreHorizontal, Share2 } from \"lucide-react\";\nimport { toPng } from \"html-to-image\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { sterlingRowsToCsv, type SterlingDataExport } from \"./dataExport\";\nimport type { SterlingLocale } from \"./types\";\n\ntype ActionState =\n | \"idle\"\n | \"copying\"\n | \"copied\"\n | \"downloading-image\"\n | \"downloading-data\"\n | \"sharing\"\n | \"shared\"\n | \"error\";\n\nconst copy = {\n es: {\n copy: \"Copiar imagen\",\n copied: \"Imagen copiada\",\n more: \"Exportar o compartir\",\n downloadImage: \"Descargar imagen PNG\",\n downloadData: \"Descargar datos de la figura (.csv)\",\n share: \"Compartir figura\",\n shared: \"Compartida\",\n error: \"No se pudo completar la acción\",\n },\n en: {\n copy: \"Copy image\",\n copied: \"Image copied\",\n more: \"Export or share\",\n downloadImage: \"Download PNG image\",\n downloadData: \"Download figure data (.csv)\",\n share: \"Share figure\",\n shared: \"Shared\",\n error: \"The action could not be completed\",\n },\n} as const;\n\nfunction fileName(title: string, extension: \"png\" | \"csv\") {\n const slug = title\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n return `${slug || \"sterling-figure\"}.${extension}`;\n}\n\nfunction resolveSvgColors(root: HTMLElement) {\n const snapshots: Array<{ element: SVGElement; style: string | null }> = [];\n const properties = [\"color\", \"fill\", \"stroke\", \"stop-color\", \"flood-color\"] as const;\n\n root.querySelectorAll<SVGElement>(\"svg, svg *\").forEach((element) => {\n snapshots.push({ element, style: element.getAttribute(\"style\") });\n const computed = getComputedStyle(element);\n\n for (const property of properties) {\n const value = computed.getPropertyValue(property).trim();\n if (value && value !== \"none\" && !value.startsWith(\"url(\")) {\n element.style.setProperty(property, value);\n }\n }\n });\n\n return () => {\n for (const { element, style } of snapshots) {\n if (style === null) element.removeAttribute(\"style\");\n else element.setAttribute(\"style\", style);\n }\n };\n}\n\nfunction triggerDownload(href: string, name: string) {\n const link = document.createElement(\"a\");\n link.download = name;\n link.href = href;\n document.body.append(link);\n link.click();\n link.remove();\n}\n\nexport function SterlingFigureActions({\n locale,\n title,\n dataExport,\n}: {\n locale: SterlingLocale;\n title: string;\n dataExport?: SterlingDataExport;\n}) {\n const actionsRef = useRef<HTMLDivElement>(null);\n const menuRef = useRef<HTMLDetailsElement>(null);\n const resetTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const [state, setState] = useState<ActionState>(\"idle\");\n const t = copy[locale];\n const busy = [\"copying\", \"downloading-image\", \"downloading-data\", \"sharing\"].includes(state);\n\n useEffect(() => () => {\n if (resetTimer.current) clearTimeout(resetTimer.current);\n }, []);\n\n async function renderCard() {\n const figure = actionsRef.current?.closest(\".sterling-figure\");\n const card = figure?.querySelector<HTMLElement>(\".sterling-figure__inner\");\n if (!card) throw new Error(\"Sterling figure not found\");\n await document.fonts.ready;\n\n const actions = card.querySelector<HTMLElement>(\".sterling-figure__actions\");\n const actionsVisibility = actions?.style.visibility ?? \"\";\n if (actions) actions.style.visibility = \"hidden\";\n\n const bounds = card.getBoundingClientRect();\n const backgroundColor = getComputedStyle(card).backgroundColor;\n const restoreSvgColors = resolveSvgColors(card);\n\n try {\n return await toPng(card, {\n backgroundColor,\n cacheBust: true,\n width: Math.ceil(bounds.width),\n height: Math.ceil(bounds.height),\n pixelRatio: 2,\n });\n } finally {\n restoreSvgColors();\n if (actions) actions.style.visibility = actionsVisibility;\n }\n }\n\n function closeMenu() {\n if (menuRef.current) menuRef.current.open = false;\n }\n\n function resetSoon(next: ActionState) {\n setState(next);\n if (resetTimer.current) clearTimeout(resetTimer.current);\n resetTimer.current = setTimeout(() => setState(\"idle\"), 1800);\n }\n\n async function copyImage() {\n try {\n setState(\"copying\");\n const dataUrl = await renderCard();\n const blob = await fetch(dataUrl).then((response) => response.blob());\n if (!navigator.clipboard?.write || typeof ClipboardItem === \"undefined\") {\n throw new Error(\"Image clipboard is not available\");\n }\n await navigator.clipboard.write([new ClipboardItem({ \"image/png\": blob })]);\n resetSoon(\"copied\");\n } catch {\n resetSoon(\"error\");\n }\n }\n\n async function downloadImage() {\n try {\n setState(\"downloading-image\");\n const dataUrl = await renderCard();\n triggerDownload(dataUrl, fileName(title, \"png\"));\n closeMenu();\n resetSoon(\"idle\");\n } catch {\n resetSoon(\"error\");\n }\n }\n\n function downloadData() {\n if (!dataExport) return;\n try {\n setState(\"downloading-data\");\n const csv = sterlingRowsToCsv(dataExport.rows);\n const blob = new Blob([\"\\uFEFF\", csv], { type: \"text/csv;charset=utf-8\" });\n const url = URL.createObjectURL(blob);\n triggerDownload(url, dataExport.fileName ? `${dataExport.fileName}.csv` : fileName(title, \"csv\"));\n window.setTimeout(() => URL.revokeObjectURL(url), 0);\n closeMenu();\n resetSoon(\"idle\");\n } catch {\n resetSoon(\"error\");\n }\n }\n\n async function shareFigure() {\n try {\n setState(\"sharing\");\n const dataUrl = await renderCard();\n const blob = await fetch(dataUrl).then((response) => response.blob());\n const image = new File([blob], fileName(title, \"png\"), { type: \"image/png\" });\n const shareData = { title, text: title, url: window.location.href, files: [image] };\n\n if (navigator.share && (!navigator.canShare || navigator.canShare(shareData))) {\n closeMenu();\n await navigator.share(shareData);\n resetSoon(\"shared\");\n return;\n }\n\n if (!navigator.clipboard?.writeText) throw new Error(\"Sharing is not available\");\n await navigator.clipboard.writeText(window.location.href);\n closeMenu();\n resetSoon(\"shared\");\n } catch (error) {\n // Cancelling a native share sheet is not an error worth alarming the reader about.\n if (error instanceof DOMException && error.name === \"AbortError\") {\n setState(\"idle\");\n return;\n }\n resetSoon(\"error\");\n }\n }\n\n const copyLabel = state === \"copied\" ? t.copied : state === \"error\" ? t.error : t.copy;\n const moreLabel = state === \"shared\" ? t.shared : state === \"error\" ? t.error : t.more;\n\n return (\n <div ref={actionsRef} className=\"sterling-figure__actions\">\n <button\n type=\"button\"\n onClick={copyImage}\n disabled={busy}\n data-state={state}\n aria-label={copyLabel}\n title={copyLabel}\n >\n {state === \"copying\" ? <LoaderCircle aria-hidden=\"true\" /> : state === \"copied\" ? <Check aria-hidden=\"true\" /> : <ClipboardCopy aria-hidden=\"true\" />}\n </button>\n <details ref={menuRef} className=\"sterling-figure__action-menu\">\n <summary aria-label={moreLabel} title={moreLabel}>\n {busy && state !== \"copying\" ? <LoaderCircle aria-hidden=\"true\" data-state={state} /> : state === \"shared\" ? <Check aria-hidden=\"true\" /> : <MoreHorizontal aria-hidden=\"true\" />}\n </summary>\n <div role=\"menu\" className=\"sterling-figure__action-popover\">\n <button type=\"button\" role=\"menuitem\" onClick={downloadImage} disabled={busy}>\n <Download aria-hidden=\"true\" /> <span>{t.downloadImage}</span>\n </button>\n {dataExport ? (\n <button type=\"button\" role=\"menuitem\" onClick={downloadData} disabled={busy}>\n <Download aria-hidden=\"true\" /> <span>{t.downloadData}</span>\n </button>\n ) : null}\n <button type=\"button\" role=\"menuitem\" onClick={shareFigure} disabled={busy}>\n <Share2 aria-hidden=\"true\" /> <span>{t.share}</span>\n </button>\n </div>\n </details>\n </div>\n );\n}\n","/**\n * The table that produced a figure, after any transformations used by the\n * wrapper. This deliberately does not claim to be the original source file.\n */\nexport interface SterlingDataExport {\n rows: readonly Record<string, unknown>[];\n /** Optional stem for the generated CSV. The title is used when omitted. */\n fileName?: string;\n}\n\nfunction csvCell(value: unknown) {\n if (value === null || value === undefined) return \"\";\n if (value instanceof Date) return value.toISOString();\n if (typeof value === \"object\") return JSON.stringify(value);\n return String(value);\n}\n\nfunction escapeCsvCell(value: unknown) {\n const cell = csvCell(value);\n return /[\\\",\\n\\r]/.test(cell) ? `\"${cell.replace(/\"/g, '\"\"')}\"` : cell;\n}\n\n/** Turn the exact rows supplied to a Sterling figure into a portable UTF-8 CSV. */\nexport function sterlingRowsToCsv(rows: SterlingDataExport[\"rows\"]) {\n const columns = [...new Set(rows.flatMap((row) => Object.keys(row)))];\n return [\n columns.map(escapeCsvCell).join(\",\"),\n ...rows.map((row) => columns.map((column) => escapeCsvCell(row[column])).join(\",\")),\n ].join(\"\\r\\n\");\n}\n\nfunction rowsFromArray(values: unknown[]) {\n return values.map((value) => {\n if (Array.isArray(value)) {\n return Object.fromEntries(value.map((cell, index) => [`value_${index + 1}`, cell]));\n }\n if (value && typeof value === \"object\") return value as Record<string, unknown>;\n return { value };\n });\n}\n\n/**\n * A graceful fallback for wrappers that have not supplied `dataExport` yet.\n * It only inspects the already-processed props passed to common primitives;\n * explicit `dataExport` is preferable when field names need editorial care.\n */\nexport function inferSterlingDataExport(props: Record<string, unknown>): SterlingDataExport | undefined {\n if (Array.isArray(props.data)) return { rows: rowsFromArray(props.data) };\n if (Array.isArray(props.rows)) return { rows: rowsFromArray(props.rows) };\n if (Array.isArray(props.links)) return { rows: rowsFromArray(props.links) };\n if (Array.isArray(props.points)) return { rows: rowsFromArray(props.points) };\n\n if (Array.isArray(props.groups)) {\n const groups = props.groups as Array<{ label?: unknown; values?: unknown }>;\n if (groups.every((group) => Array.isArray(group.values))) {\n return {\n rows: groups.flatMap((group) => (group.values as unknown[]).map((value) => ({ group: group.label, value }))),\n };\n }\n }\n\n if (Array.isArray(props.values)) {\n const values = props.values as unknown[];\n if (values.every((value) => typeof value === \"number\")) return { rows: values.map((value) => ({ value })) };\n\n if (values.every(Array.isArray)) {\n const rowLabels = Array.isArray(props.rowLabels) ? props.rowLabels : [];\n const columnLabels = Array.isArray(props.columnLabels) ? props.columnLabels : [];\n return {\n rows: values.flatMap((row, rowIndex) => (row as unknown[]).map((value, columnIndex) => ({\n row: rowLabels[rowIndex] ?? rowIndex + 1,\n column: columnLabels[columnIndex] ?? columnIndex + 1,\n value,\n }))),\n };\n }\n }\n\n if (Array.isArray(props.series) && Array.isArray(props.labels)) {\n const labels = props.labels as unknown[];\n const series = props.series as Array<{ label?: unknown; values?: unknown }>;\n if (series.every((item) => Array.isArray(item.values))) {\n return {\n rows: labels.map((label, index) => Object.fromEntries([\n [\"label\", label],\n ...series.map((item) => [String(item.label ?? \"value\"), (item.values as unknown[])[index]]),\n ])),\n };\n }\n }\n\n if (Array.isArray(props.nodes)) return { rows: rowsFromArray(props.nodes) };\n return undefined;\n}\n","import type { ReactNode } from \"react\";\nimport type { SterlingLocale } from \"./types\";\n\n/** Writing conventions around a figure, kept separate from every chart primitive. */\nexport interface SterlingEditorial {\n /** Use `false` to remove the QED-like title mark, or supply another mark. */\n titleMark?: ReactNode | false;\n /** Optional destination for an interactive title mark. */\n titleMarkHref?: string;\n /** Accessible label for an interactive title mark. */\n titleMarkLabel?: string;\n /** Use `false` to omit the credit from the caption. */\n signature?: ReactNode | false;\n /** Replaces the localized Source/Fuente label. */\n sourceLabel?: ReactNode;\n}\n\nexport interface SterlingCreditOptions {\n author?: ReactNode;\n productName?: ReactNode;\n /** Link the product name to its public documentation. Defaults to true. */\n linkToSterling?: boolean;\n sterlingUrl?: string;\n}\n\n/** A portable credit, e.g. “Made by Ada with Sterling ✦”. */\nexport function sterlingCredit(\n {\n author,\n productName = \"Sterling\",\n linkToSterling = true,\n sterlingUrl = \"https://www.lamatemaga.com/sterling\",\n }: SterlingCreditOptions,\n locale: SterlingLocale = \"en\",\n): ReactNode {\n const product = linkToSterling\n ? <a className=\"sterling-figure__credit-link\" href={sterlingUrl}>{productName} ✦</a>\n : <>{productName} ✦</>;\n\n if (locale === \"es\") {\n return author ? <>Hecho por {author} con {product}</> : <>Hecho con {product}</>;\n }\n\n return author ? <>Made by {author} with {product}</> : <>Made with {product}</>;\n}\n","import { chord as d3Chord, ribbon as d3Ribbon } from \"d3-chord\";\nimport type { Chord, ChordGroup, ChordSubgroup } from \"d3-chord\";\nimport { sankey as d3Sankey, sankeyLinkHorizontal } from \"d3-sankey\";\nimport { arc as d3Arc } from \"d3-shape\";\nimport { sterlingChartColors, sterlingHeatColors, sterlingSequentialColors } from \"./palette\";\nimport {\n AxisBottom,\n AxisLeft,\n Gridlines,\n TimeAxisBottom,\n bandCenters,\n divergentSignedColor,\n divergentSignedRamp,\n frame,\n linearScale,\n timeScale,\n tukeySummary,\n} from \"./plot\";\nimport { sterlingVisualStyle } from \"./visualStyle\";\n\nconst chartText = \"var(--sterling-text)\";\nconst chartMuted = \"var(--sterling-muted)\";\nconst chartGrid = \"var(--sterling-grid)\";\n\nexport interface BarDatum {\n label: string;\n value: number;\n colorIndex?: number;\n}\n\nexport function SterlingBarChart({\n data,\n ariaLabel,\n unit = \"\",\n xLabel,\n}: {\n data: BarDatum[];\n ariaLabel: string;\n unit?: string;\n xLabel?: string;\n}) {\n const rowHeight = 46;\n const top = 12;\n const barHeight = 28;\n const axisBottom = xLabel ? 50 : 34;\n const x0 = 150;\n const x1 = 684;\n const height = top + data.length * rowHeight + axisBottom;\n const baseline = top + data.length * rowHeight;\n const x = linearScale(data.map((datum) => datum.value), [x0, x1], { zero: true });\n\n return (\n <svg className=\"sterling-chart\" viewBox={`0 0 720 ${height}`} role=\"img\" aria-label={ariaLabel}>\n {x.ticks(6).map((value) => (\n <line key={value} x1={x(value)} x2={x(value)} y1={top} y2={baseline} stroke={chartGrid} strokeWidth={sterlingVisualStyle.stroke.grid} />\n ))}\n {data.map((datum, index) => {\n const y = top + index * rowHeight + (rowHeight - barHeight) / 2 - 6;\n const width = x(datum.value) - x0;\n return (\n <g key={datum.label}>\n <text x={x0 - 12} y={y + barHeight / 2 + 4} textAnchor=\"end\" fill={chartText} fontSize=\"12\" fontFamily=\"var(--font-mono)\">\n {datum.label}\n </text>\n <rect\n x={x0}\n y={y}\n width={Math.max(width, 2)}\n height={barHeight}\n rx=\"3\"\n fill={sterlingChartColors[datum.colorIndex ?? index % sterlingChartColors.length]}\n >\n <title>{`${datum.label}: ${datum.value}${unit}`}</title>\n </rect>\n <text x={x(datum.value) + 8} y={y + barHeight / 2 + 4} fill={chartMuted} fontSize=\"12\" fontFamily=\"var(--font-mono)\">\n {datum.value}{unit}\n </text>\n </g>\n );\n })}\n <AxisBottom scale={x} y={baseline} count={6} title={xLabel} format={(value) => `${value}${unit}`} />\n </svg>\n );\n}\n\nexport interface ScatterDatum {\n x: number;\n y: number;\n group: string;\n label?: string;\n}\n\nfunction scatterMark(shape: number, x: number, y: number, color: string, key: string, title: string) {\n if (shape % 3 === 1) {\n return (\n <rect key={key} x={x - 4.5} y={y - 4.5} width=\"9\" height=\"9\" rx=\"1\" fill={color}>\n <title>{title}</title>\n </rect>\n );\n }\n if (shape % 3 === 2) {\n return (\n <path key={key} d={`M ${x} ${y - 5.5} L ${x + 5.2} ${y + 4.5} L ${x - 5.2} ${y + 4.5} Z`} fill={color}>\n <title>{title}</title>\n </path>\n );\n }\n return (\n <circle key={key} cx={x} cy={y} r=\"4.8\" fill={color}>\n <title>{title}</title>\n </circle>\n );\n}\n\nexport function SterlingScatterPlot({\n data,\n ariaLabel,\n xLabel,\n yLabel,\n showLegend = false,\n zeroX = false,\n zeroY = false,\n}: {\n data: ScatterDatum[];\n ariaLabel: string;\n xLabel: string;\n yLabel: string;\n showLegend?: boolean;\n zeroX?: boolean;\n zeroY?: boolean;\n}) {\n const groups = [...new Set(data.map((datum) => datum.group))];\n const f = frame(720, 380);\n const x = linearScale(data.map((datum) => datum.x), [f.x0, f.x1], { zero: zeroX });\n const y = linearScale(data.map((datum) => datum.y), [f.y1, f.y0], { zero: zeroY });\n\n return (\n <svg className=\"sterling-chart\" viewBox={`0 0 ${f.width} ${f.height}`} role=\"img\" aria-label={ariaLabel}>\n <Gridlines scale={y} x0={f.x0} x1={f.x1} count={5} />\n {data.map((datum, index) => {\n const groupIndex = groups.indexOf(datum.group);\n return scatterMark(\n groupIndex,\n x(datum.x),\n y(datum.y),\n sterlingChartColors[groupIndex],\n `${datum.group}-${index}`,\n datum.label ?? `${datum.group}: ${datum.x}, ${datum.y}`,\n );\n })}\n <AxisLeft scale={y} x={f.x0} count={5} title={yLabel} />\n <AxisBottom scale={x} y={f.y1} count={6} title={xLabel} />\n {showLegend\n ? groups.map((group, index) => (\n <g key={group} transform={`translate(${f.x1 - 150 + (index % 2) * 92} ${f.y0 + 2 + Math.floor(index / 2) * 20})`}>\n {scatterMark(index, 0, 0, sterlingChartColors[index], `legend-${group}`, group)}\n <text x=\"11\" y=\"4\" fill={chartMuted} fontSize=\"10.5\" fontFamily=\"var(--font-mono)\">{group}</text>\n </g>\n ))\n : null}\n </svg>\n );\n}\n\nexport interface LineSeries {\n label: string;\n values: number[];\n}\n\nexport function SterlingLineChart({\n labels,\n series,\n ariaLabel,\n yLabel,\n xLabel,\n times,\n markers,\n showLegend = false,\n}: {\n labels: string[];\n series: LineSeries[];\n ariaLabel: string;\n yLabel: string;\n xLabel?: string;\n /** Epoch-ms per point (parallel to labels); enables the adaptive time axis. */\n times?: number[];\n /** Draw a dot at every point. Off by default for dense time series. */\n markers?: boolean;\n showLegend?: boolean;\n}) {\n const f = frame(720, 380);\n const values = series.flatMap((item) => item.values);\n const y = linearScale(values, [f.y1, f.y0], { zero: true });\n const isTime = Array.isArray(times) && times.length === labels.length && labels.length > 1;\n const time = isTime ? timeScale([times![0], times![times!.length - 1]], [f.x0, f.x1]) : null;\n const xAt = (index: number) =>\n time ? time(new Date(times![index])) : f.x0 + (index / Math.max(labels.length - 1, 1)) * (f.x1 - f.x0);\n const showMarkers = markers ?? labels.length <= 40;\n\n // Fallback categorical ticks (only when no time scale) with collision guard.\n const labelStep = Math.max(1, Math.ceil(labels.length / 8));\n const lastIndex = labels.length - 1;\n const showCatTick = (index: number) => {\n if (index === lastIndex) return true;\n if (index % labelStep !== 0) return false;\n return lastIndex - index >= labelStep * 0.55;\n };\n\n return (\n <svg className=\"sterling-chart\" viewBox={`0 0 ${f.width} ${f.height}`} role=\"img\" aria-label={ariaLabel}>\n <Gridlines scale={y} x0={f.x0} x1={f.x1} count={5} />\n {series.map((item, seriesIndex) => {\n const path = item.values.map((value, index) => `${index === 0 ? \"M\" : \"L\"} ${xAt(index)} ${y(value)}`).join(\" \");\n return (\n <g key={item.label}>\n <path d={path} fill=\"none\" stroke={sterlingChartColors[seriesIndex]} strokeWidth={sterlingVisualStyle.stroke.series} strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n {showMarkers\n ? item.values.map((value, index) => (\n <circle key={index} cx={xAt(index)} cy={y(value)} r=\"3.4\" fill={sterlingChartColors[seriesIndex]}>\n <title>{`${item.label}, ${labels[index]}: ${value}`}</title>\n </circle>\n ))\n : null}\n </g>\n );\n })}\n <AxisLeft scale={y} x={f.x0} count={5} title={yLabel} />\n {time ? (\n <TimeAxisBottom scale={time} y={f.y1} title={xLabel} />\n ) : (\n <g>\n <line x1={f.x0} x2={f.x1} y1={f.y1} y2={f.y1} stroke=\"var(--sterling-edge)\" />\n {labels.map((label, index) =>\n showCatTick(index) ? (\n <g key={`${label}-${index}`}>\n <line x1={xAt(index)} x2={xAt(index)} y1={f.y1} y2={f.y1 + 5} stroke=\"var(--sterling-edge)\" />\n <text x={xAt(index)} y={f.y1 + 18} textAnchor=\"middle\" fill={chartMuted} fontSize=\"11\" fontFamily=\"var(--font-mono)\">\n {label}\n </text>\n </g>\n ) : null,\n )}\n {xLabel ? (\n <text x={(f.x0 + f.x1) / 2} y={f.y1 + 42} textAnchor=\"middle\" fill={chartMuted} fontSize=\"12\" fontFamily=\"var(--font-mono)\">\n {xLabel}\n </text>\n ) : null}\n </g>\n )}\n {showLegend\n ? series.map((item, index) => (\n <g key={item.label} transform={`translate(${f.x0 + 28 + index * 176} ${f.y0 - 2})`}>\n <line x1=\"0\" x2=\"22\" stroke={sterlingChartColors[index]} strokeWidth={sterlingVisualStyle.stroke.series} />\n <text x=\"30\" y=\"4\" fill={chartMuted} fontSize=\"11\" fontFamily=\"var(--font-mono)\">{item.label}</text>\n </g>\n ))\n : null}\n </svg>\n );\n}\n\nexport function SterlingHeatmap({\n values,\n rowLabels,\n columnLabels,\n ariaLabel,\n domain,\n legendTitle,\n showValues = false,\n}: {\n values: number[][];\n rowLabels: string[];\n columnLabels: string[];\n ariaLabel: string;\n /** Symmetric color domain [-domain, +domain]; defaults to the data's max |value|. */\n domain?: number;\n legendTitle?: string;\n showValues?: boolean;\n}) {\n const flat = values.flat();\n const maxAbs = domain ?? Math.max(1, Math.ceil(Math.max(...flat.map((value) => Math.abs(value))) * 10) / 10);\n // Landscape layout: wide, short cells so every row and the legend stay in view.\n const width = 720;\n const startX = 168;\n const startY = 46;\n const rightPad = 24;\n const gridWidth = width - startX - rightPad;\n const cellW = gridWidth / Math.max(columnLabels.length, 1);\n const cellH = Math.min(cellW * 0.5, 46);\n const gap = 3;\n const gridHeight = cellH * rowLabels.length;\n const height = startY + gridHeight + 60;\n const legendWidth = Math.min(gridWidth, 340);\n\n return (\n <svg className=\"sterling-chart\" viewBox={`0 0 ${width} ${height}`} role=\"img\" aria-label={ariaLabel}>\n {columnLabels.map((label, index) => (\n <text key={label} x={startX + index * cellW + cellW / 2} y={startY - 12} textAnchor=\"middle\" fill={chartText} fontSize=\"11\" fontFamily=\"var(--font-mono)\">\n {label}\n </text>\n ))}\n {rowLabels.map((label, row) => (\n <g key={label}>\n <text x={startX - 12} y={startY + row * cellH + cellH / 2 + 4} textAnchor=\"end\" fill={chartText} fontSize=\"11\" fontFamily=\"var(--font-mono)\">\n {label}\n </text>\n {columnLabels.map((column, columnIndex) => {\n const value = values[row]?.[columnIndex] ?? 0;\n return (\n <g key={column}>\n <rect\n x={startX + columnIndex * cellW}\n y={startY + row * cellH}\n width={cellW - gap}\n height={cellH - gap}\n rx=\"3\"\n fill={divergentSignedColor(value, maxAbs)}\n >\n <title>{`${label}, ${column}: ${value.toFixed(2)}`}</title>\n </rect>\n {showValues ? (\n <text\n x={startX + columnIndex * cellW + (cellW - gap) / 2}\n y={startY + row * cellH + (cellH - gap) / 2 + 4}\n textAnchor=\"middle\"\n fill={Math.abs(value) > maxAbs * 0.55 ? \"var(--sterling-surface)\" : chartText}\n fontSize=\"10.5\"\n fontFamily=\"var(--font-mono)\"\n >\n {value.toFixed(1)}\n </text>\n ) : null}\n </g>\n );\n })}\n </g>\n ))}\n {/* Honest legend: teal (negative) -> violet (positive), real data range. */}\n {legendTitle ? (\n <text x={startX} y={height - 38} fill={chartMuted} fontSize=\"10.5\" fontFamily=\"var(--font-mono)\">{legendTitle}</text>\n ) : null}\n {divergentSignedRamp.map((color, index) => (\n <rect key={`${color}-${index}`} x={startX + (index * legendWidth) / divergentSignedRamp.length} y={height - 28} width={legendWidth / divergentSignedRamp.length + 0.5} height=\"13\" fill={color} />\n ))}\n <text x={startX} y={height - 5} fill={chartMuted} fontSize=\"10\" fontFamily=\"var(--font-mono)\">{-maxAbs}</text>\n <text x={startX + legendWidth / 2} y={height - 5} textAnchor=\"middle\" fill={chartMuted} fontSize=\"10\" fontFamily=\"var(--font-mono)\">0</text>\n <text x={startX + legendWidth} y={height - 5} textAnchor=\"end\" fill={chartMuted} fontSize=\"10\" fontFamily=\"var(--font-mono)\">{`+${maxAbs}`}</text>\n </svg>\n );\n}\n\nexport function SterlingSequentialSurface({\n values: suppliedValues,\n ariaLabel,\n lowLabel = \"low / bajo\",\n highLabel = \"high / alto\",\n}: {\n values?: number[][];\n ariaLabel: string;\n lowLabel?: string;\n highLabel?: string;\n}) {\n const defaultRows = 10;\n const defaultColumns = 18;\n const generatedValues = Array.from({ length: defaultRows }, (_, row) => Array.from({ length: defaultColumns }, (_, column) => {\n const x = column / (defaultColumns - 1);\n const y = row / (defaultRows - 1);\n const firstPeak = Math.exp(-(((x - 0.3) / 0.19) ** 2 + ((y - 0.34) / 0.25) ** 2));\n const secondPeak = 0.76 * Math.exp(-(((x - 0.72) / 0.23) ** 2 + ((y - 0.67) / 0.2) ** 2));\n const saddle = 0.22 * Math.sin(x * Math.PI * 2.4) * Math.cos(y * Math.PI * 1.7);\n return firstPeak + secondPeak + saddle;\n }));\n const values = suppliedValues?.length && suppliedValues.some((row) => row.length)\n ? suppliedValues\n : generatedValues;\n const rows = values.length;\n const columns = Math.max(1, ...values.map((row) => row.length));\n const flat = values.flat();\n const min = Math.min(...flat);\n const max = Math.max(...flat);\n const cellWidth = 558 / columns;\n const cellHeight = 240 / Math.max(rows, 1);\n return (\n <svg className=\"sterling-chart\" viewBox=\"0 0 720 340\" role=\"img\" aria-label={ariaLabel}>\n <g transform=\"translate(82 34)\">\n {values.flatMap((rowValues, row) => rowValues.map((value, column) => {\n const index = Math.max(0, Math.min(sterlingHeatColors.length - 1, Math.round(((value - min) / Math.max(max - min, 1)) * (sterlingHeatColors.length - 1))));\n return <rect key={`${row}-${column}`} x={column * cellWidth} y={row * cellHeight} width={cellWidth + 0.35} height={cellHeight + 0.35} fill={sterlingHeatColors[index]}>\n <title>{`x ${column + 1}, y ${row + 1}: ${value.toFixed(2)}`}</title>\n </rect>;\n }))}\n </g>\n <text x=\"82\" y=\"302\" fill={chartMuted} fontSize=\"10\" fontFamily=\"var(--font-mono)\">{lowLabel}</text>\n {sterlingHeatColors.map((color, index) => <rect key={color} x={152 + index * 34} y=\"289\" width=\"34\" height=\"15\" fill={color} />)}\n <text x=\"540\" y=\"302\" fill={chartMuted} fontSize=\"10\" fontFamily=\"var(--font-mono)\">{highLabel}</text>\n </svg>\n );\n}\n\nexport function SterlingCorrelogram({\n values,\n labels,\n ariaLabel,\n}: {\n values: number[][];\n labels: string[];\n ariaLabel: string;\n}) {\n const cell = 67;\n const startX = 112;\n const startY = 34;\n const size = labels.length * cell;\n\n return (\n <svg className=\"sterling-chart\" viewBox={`0 0 ${startX + size + 54} ${startY + size + 72}`} role=\"img\" aria-label={ariaLabel}>\n {labels.flatMap((rowLabel, row) => labels.map((columnLabel, column) => {\n const value = values[row]?.[column] ?? 0;\n const color = divergentSignedColor(value, 1);\n const centerX = startX + column * cell + cell / 2;\n const centerY = startY + row * cell + cell / 2;\n return (\n <g key={`${rowLabel}-${columnLabel}`}>\n <rect x={startX + column * cell} y={startY + row * cell} width={cell} height={cell} fill=\"none\" stroke={chartGrid} />\n {row === column ? (\n <text x={centerX} y={centerY + 4} textAnchor=\"middle\" fill={chartText} fontSize=\"10.5\" fontFamily=\"var(--font-mono)\">{rowLabel}</text>\n ) : row > column ? (\n <ellipse\n cx={centerX}\n cy={centerY}\n rx=\"25\"\n ry={Math.max(2.5, 25 * (1 - Math.abs(value)))}\n transform={`rotate(${value >= 0 ? -45 : 45} ${centerX} ${centerY})`}\n fill={color}\n fillOpacity={sterlingVisualStyle.opacity.secondaryMark}\n stroke={color}\n >\n <title>{`${rowLabel}, ${columnLabel}: ${value.toFixed(2)}`}</title>\n </ellipse>\n ) : (\n <text x={centerX} y={centerY + 5} textAnchor=\"middle\" fill={Math.abs(value) >= 0.3 ? color : chartMuted} fontSize=\"15\" fontFamily=\"var(--font-mono)\" fontWeight=\"700\">\n {value.toFixed(2)}\n </text>\n )}\n </g>\n );\n }))}\n <text x={startX} y={startY + size + 41} fill={chartMuted} fontSize=\"10\" fontFamily=\"var(--font-mono)\">-1</text>\n {divergentSignedRamp.map((color, index) => (\n <rect key={`${color}-${index}`} x={startX + 28 + index * 27} y={startY + size + 27} width=\"27\" height=\"16\" fill={color} />\n ))}\n <text x={startX + 340} y={startY + size + 41} fill={chartMuted} fontSize=\"10\" fontFamily=\"var(--font-mono)\">+1</text>\n </svg>\n );\n}\n\nexport function SterlingHistogram({\n values,\n bins = 16,\n ariaLabel,\n xLabel,\n yLabel,\n}: {\n values: number[];\n bins?: number;\n ariaLabel: string;\n xLabel: string;\n yLabel?: string;\n}) {\n const min = Math.min(...values);\n const max = Math.max(...values);\n const step = Math.max((max - min) / bins, Number.EPSILON);\n const counts = Array.from({ length: bins }, () => 0);\n values.forEach((value) => {\n counts[Math.min(bins - 1, Math.floor((value - min) / step))] += 1;\n });\n const top = Math.max(...counts, 1);\n const f = frame(720, 380);\n const x = linearScale([min, max], [f.x0, f.x1]);\n const y = linearScale([0, top], [f.y1, f.y0], { zero: true });\n const barWidth = (x(min + step) - x(min));\n\n return (\n <svg className=\"sterling-chart\" viewBox={`0 0 ${f.width} ${f.height}`} role=\"img\" aria-label={ariaLabel}>\n <Gridlines scale={y} x0={f.x0} x1={f.x1} count={5} />\n {counts.map((count, index) => {\n const lower = min + index * step;\n const upper = lower + step;\n return (\n <rect\n key={index}\n x={x(lower) + 1}\n y={y(count)}\n width={Math.max(barWidth - 2, 1)}\n height={f.y1 - y(count)}\n fill={sterlingChartColors[0]}\n >\n <title>{`${lower.toFixed(1)}-${upper.toFixed(1)}: ${count}`}</title>\n </rect>\n );\n })}\n <AxisLeft scale={y} x={f.x0} count={5} title={yLabel} format={(value) => `${Math.round(value)}`} />\n <AxisBottom scale={x} y={f.y1} count={7} title={xLabel} />\n </svg>\n );\n}\n\nexport interface BoxPlotGroup {\n label: string;\n values: number[];\n}\n\nexport function SterlingBoxPlot({ groups, ariaLabel, yLabel }: { groups: BoxPlotGroup[]; ariaLabel: string; yLabel: string }) {\n const all = groups.flatMap((group) => group.values);\n const top = 24;\n const rowH = 80;\n const axisBottom = 48;\n const height = top + groups.length * rowH + axisBottom;\n const baseline = top + groups.length * rowH + 6;\n const x0 = 168;\n const x1 = 690;\n const x = linearScale(all, [x0, x1]);\n const boxHalf = 24;\n\n return (\n <svg className=\"sterling-chart\" viewBox={`0 0 720 ${height}`} role=\"img\" aria-label={ariaLabel}>\n {x.ticks(6).map((value) => (\n <line key={value} x1={x(value)} x2={x(value)} y1={top} y2={baseline} stroke={chartGrid} strokeWidth={sterlingVisualStyle.stroke.grid} />\n ))}\n {groups.map((group, index) => {\n const summary = tukeySummary(group.values);\n const center = top + index * rowH + rowH / 2 - 4;\n const color = sterlingChartColors[index];\n return (\n <g key={group.label}>\n <text x={x0 - 12} y={center + 4} textAnchor=\"end\" fill={chartText} fontSize=\"12\" fontFamily=\"var(--font-mono)\">{group.label}</text>\n {/* Whiskers to the 1.5*IQR fences */}\n <line x1={x(summary.whiskerLow)} x2={x(summary.q1)} y1={center} y2={center} stroke={color} strokeWidth={sterlingVisualStyle.stroke.mark} />\n <line x1={x(summary.q3)} x2={x(summary.whiskerHigh)} y1={center} y2={center} stroke={color} strokeWidth={sterlingVisualStyle.stroke.mark} />\n <line x1={x(summary.whiskerLow)} x2={x(summary.whiskerLow)} y1={center - 12} y2={center + 12} stroke={color} strokeWidth={sterlingVisualStyle.stroke.mark} />\n <line x1={x(summary.whiskerHigh)} x2={x(summary.whiskerHigh)} y1={center - 12} y2={center + 12} stroke={color} strokeWidth={sterlingVisualStyle.stroke.mark} />\n <rect x={x(summary.q1)} y={center - boxHalf} width={Math.max(x(summary.q3) - x(summary.q1), 2)} height={boxHalf * 2} rx=\"3\" fill={color} fillOpacity={sterlingVisualStyle.opacity.interval} stroke={color} strokeWidth={sterlingVisualStyle.stroke.mark}>\n <title>{`${group.label}: n=${group.values.length}, median ${summary.median.toFixed(2)}, IQR ${summary.q1.toFixed(2)}-${summary.q3.toFixed(2)}`}</title>\n </rect>\n <line x1={x(summary.median)} x2={x(summary.median)} y1={center - boxHalf} y2={center + boxHalf} stroke={color} strokeWidth={sterlingVisualStyle.stroke.emphasis} />\n {/* Tukey outliers beyond the fences */}\n {summary.outliers.map((value, outlierIndex) => (\n <circle key={outlierIndex} cx={x(value)} cy={center} r=\"3.4\" fill=\"none\" stroke={color} strokeWidth={sterlingVisualStyle.stroke.detail}>\n <title>{`${group.label} outlier: ${value.toFixed(2)}`}</title>\n </circle>\n ))}\n </g>\n );\n })}\n <AxisBottom scale={x} y={baseline} count={6} title={yLabel} />\n </svg>\n );\n}\n\nexport interface DumbbellDatum {\n label: string;\n left: number;\n right: number;\n}\n\nexport function SterlingDumbbellChart({\n data,\n ariaLabel,\n leftLabel,\n rightLabel,\n xLabel,\n}: {\n data: DumbbellDatum[];\n ariaLabel: string;\n leftLabel: string;\n rightLabel: string;\n xLabel?: string;\n}) {\n const top = 56;\n const rowH = 66;\n const axisBottom = xLabel ? 50 : 34;\n const x0 = 150;\n const x1 = 660;\n const height = top + data.length * rowH + axisBottom;\n const baseline = top + data.length * rowH;\n const x = linearScale(data.flatMap((datum) => [datum.left, datum.right]), [x0, x1], { zero: true });\n return (\n <svg className=\"sterling-chart\" viewBox={`0 0 720 ${height}`} role=\"img\" aria-label={ariaLabel}>\n {x.ticks(6).map((value) => (\n <line key={value} x1={x(value)} x2={x(value)} y1={top - 20} y2={baseline} stroke={chartGrid} strokeWidth={sterlingVisualStyle.stroke.grid} />\n ))}\n {data.map((datum, index) => {\n const y = top + index * rowH + rowH / 2 - 4;\n return (\n <g key={datum.label}>\n <text x={x0 - 14} y={y + 4} textAnchor=\"end\" fill={chartText} fontSize=\"12\" fontFamily=\"var(--font-mono)\">{datum.label}</text>\n <line x1={x(datum.left)} x2={x(datum.right)} y1={y} y2={y} stroke={chartGrid} strokeWidth={sterlingVisualStyle.stroke.series} strokeLinecap=\"round\" />\n <circle cx={x(datum.left)} cy={y} r=\"8\" fill={sterlingChartColors[0]}><title>{`${datum.label}, ${leftLabel}: ${datum.left.toFixed(2)}`}</title></circle>\n <circle cx={x(datum.right)} cy={y} r=\"8\" fill={sterlingChartColors[3]}><title>{`${datum.label}, ${rightLabel}: ${datum.right.toFixed(2)}`}</title></circle>\n </g>\n );\n })}\n <AxisBottom scale={x} y={baseline} count={6} title={xLabel} />\n </svg>\n );\n}\n\nexport function kernelDensity(values: number[], steps = 64, domain?: [number, number]) {\n const min = domain?.[0] ?? Math.min(...values);\n const max = domain?.[1] ?? Math.max(...values);\n const mean = values.reduce((sum, value) => sum + value, 0) / values.length;\n const spread = Math.sqrt(values.reduce((sum, value) => sum + (value - mean) ** 2, 0) / Math.max(values.length - 1, 1));\n const bandwidth = Math.max(1.06 * spread * values.length ** -0.2, (max - min) / 100, 0.001);\n return Array.from({ length: steps }, (_, index) => {\n const value = min + (index / (steps - 1)) * (max - min);\n const density = values.reduce((sum, observation) => {\n const z = (value - observation) / bandwidth;\n return sum + Math.exp(-0.5 * z * z) / Math.sqrt(2 * Math.PI);\n }, 0) / (values.length * bandwidth);\n return { value, density };\n });\n}\n\nexport function SterlingDensityChart({ values, ariaLabel, xLabel, yLabel }: { values: number[]; ariaLabel: string; xLabel: string; yLabel?: string }) {\n const density = kernelDensity(values);\n const maxDensity = Math.max(...density.map((point) => point.density), Number.EPSILON);\n const f = frame(720, 380);\n const x = linearScale([density[0].value, density[density.length - 1].value], [f.x0, f.x1], { padFraction: 0 });\n const y = linearScale([0, maxDensity], [f.y1, f.y0], { zero: true });\n const line = density.map((point, index) => `${index === 0 ? \"M\" : \"L\"} ${x(point.value)} ${y(point.density)}`).join(\" \");\n const area = `${line} L ${x(density[density.length - 1].value)} ${f.y1} L ${x(density[0].value)} ${f.y1} Z`;\n return (\n <svg className=\"sterling-chart\" viewBox={`0 0 ${f.width} ${f.height}`} role=\"img\" aria-label={ariaLabel}>\n <Gridlines scale={y} x0={f.x0} x1={f.x1} count={5} />\n <path d={area} fill={sterlingSequentialColors[4]} fillOpacity={sterlingVisualStyle.opacity.area} />\n <path d={line} fill=\"none\" stroke={sterlingSequentialColors[7]} strokeWidth={sterlingVisualStyle.stroke.series} strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <AxisLeft scale={y} x={f.x0} count={5} title={yLabel} />\n <AxisBottom scale={x} y={f.y1} count={7} title={xLabel} />\n </svg>\n );\n}\n\nexport interface ViolinGroup {\n label: string;\n values: number[];\n}\n\nexport function SterlingViolinPlot({ groups, ariaLabel, yLabel }: { groups: ViolinGroup[]; ariaLabel: string; yLabel: string }) {\n const all = groups.flatMap((group) => group.values);\n const observedMin = Math.min(...all);\n const observedMax = Math.max(...all);\n // Extend the estimation domain by ~3 kernel bandwidths past the data so each\n // silhouette tapers to zero instead of being sliced off at the extremes.\n const bandwidthOf = (values: number[]) => {\n const mean = values.reduce((sum, value) => sum + value, 0) / values.length;\n const spread = Math.sqrt(values.reduce((sum, value) => sum + (value - mean) ** 2, 0) / Math.max(values.length - 1, 1));\n return Math.max(1.06 * spread * values.length ** -0.2, 1e-6);\n };\n const maxBandwidth = Math.max(...groups.map((group) => bandwidthOf(group.values)));\n const margin = Math.max((observedMax - observedMin) * 0.05, maxBandwidth * 3);\n const domain: [number, number] = [observedMin - margin, observedMax + margin];\n const f = frame(720, 390, { top: 26, right: 26, bottom: 44, left: 70 });\n const y = linearScale(domain, [f.y1, f.y0], { padFraction: 0 });\n const { centers } = bandCenters(groups.length, f.x0, f.x1);\n const halfWidth = Math.min(46, ((f.x1 - f.x0) / groups.length) * 0.42);\n return (\n <svg className=\"sterling-chart\" viewBox={`0 0 ${f.width} ${f.height}`} role=\"img\" aria-label={ariaLabel}>\n <Gridlines scale={y} x0={f.x0} x1={f.x1} count={5} />\n {groups.map((group, groupIndex) => {\n const estimate = kernelDensity(group.values, 96, domain);\n const peak = Math.max(...estimate.map((point) => point.density), Number.EPSILON);\n // Stop the outline once the tail is effectively zero-width, otherwise\n // the two sides converge into a long vertical needle.\n const cutoff = peak * 0.01;\n const firstIndex = estimate.findIndex((point) => point.density >= cutoff);\n const lastIndex = estimate.length - 1 - [...estimate].reverse().findIndex((point) => point.density >= cutoff);\n const density = estimate.slice(Math.max(0, firstIndex - 1), Math.min(estimate.length - 1, lastIndex + 1) + 1);\n const center = centers[groupIndex];\n const right = density.map((point) => `${center + (point.density / peak) * halfWidth} ${y(point.value)}`);\n const left = [...density].reverse().map((point) => `${center - (point.density / peak) * halfWidth} ${y(point.value)}`);\n const path = `M ${right.join(\" L \")} L ${left.join(\" L \")} Z`;\n // Same Tukey summary the box plot uses, drawn inside the silhouette.\n const summary = tukeySummary(group.values);\n const color = sterlingChartColors[groupIndex];\n return (\n <g key={group.label}>\n <path d={path} fill={color} fillOpacity={sterlingVisualStyle.opacity.area} stroke={color} strokeWidth={sterlingVisualStyle.stroke.series}>\n <title>{`${group.label}: n=${group.values.length}, median ${summary.median.toFixed(1)}, IQR ${summary.q1.toFixed(1)}-${summary.q3.toFixed(1)}`}</title>\n </path>\n {/* Whiskers to the 1.5*IQR fences */}\n <line x1={center} x2={center} y1={y(summary.whiskerLow)} y2={y(summary.whiskerHigh)} stroke={color} strokeWidth={sterlingVisualStyle.stroke.detail} />\n <line x1={center - 5} x2={center + 5} y1={y(summary.whiskerLow)} y2={y(summary.whiskerLow)} stroke={color} strokeWidth={sterlingVisualStyle.stroke.detail} />\n <line x1={center - 5} x2={center + 5} y1={y(summary.whiskerHigh)} y2={y(summary.whiskerHigh)} stroke={color} strokeWidth={sterlingVisualStyle.stroke.detail} />\n {/* The wide band is the interquartile range, not a generic outline. */}\n <line x1={center} x2={center} y1={y(summary.q3)} y2={y(summary.q1)} stroke={color} strokeWidth={sterlingVisualStyle.stroke.interval} strokeLinecap=\"round\" />\n <circle cx={center} cy={y(summary.median)} r=\"4.5\" fill=\"var(--sterling-surface)\" stroke={color} strokeWidth={sterlingVisualStyle.stroke.emphasis} />\n {/* Tukey outliers beyond the fences */}\n {summary.outliers.map((value, outlierIndex) => (\n <circle key={outlierIndex} cx={center} cy={y(value)} r=\"3\" fill=\"none\" stroke={color} strokeWidth={sterlingVisualStyle.stroke.detail}>\n <title>{`${group.label} outlier: ${value.toFixed(1)}`}</title>\n </circle>\n ))}\n <text x={center} y={f.y1 + 18} textAnchor=\"middle\" fill={chartMuted} fontSize=\"10.5\" fontFamily=\"var(--font-mono)\">{group.label}</text>\n </g>\n );\n })}\n <AxisLeft scale={y} x={f.x0} count={5} title={yLabel} />\n <line x1={f.x0} x2={f.x1} y1={f.y1} y2={f.y1} stroke=\"var(--sterling-edge)\" />\n </svg>\n );\n}\n\nexport interface DonutDatum {\n label: string;\n value: number;\n}\n\nexport function SterlingDonutChart({ data, ariaLabel, centerLabel, centerValue }: { data: DonutDatum[]; ariaLabel: string; centerLabel: string; centerValue?: string }) {\n const total = data.reduce((sum, datum) => sum + datum.value, 0);\n const radius = 96;\n const circumference = 2 * Math.PI * radius;\n let offset = 0;\n return (\n <svg className=\"sterling-chart\" viewBox=\"0 0 720 350\" role=\"img\" aria-label={ariaLabel}>\n <g transform=\"translate(360 174) rotate(-90)\">\n {data.map((datum, index) => {\n const length = (datum.value / total) * circumference;\n const currentOffset = offset;\n offset += length;\n return (\n <circle\n key={datum.label}\n cx=\"0\"\n cy=\"0\"\n r={radius}\n fill=\"none\"\n stroke={sterlingChartColors[index]}\n strokeWidth={sterlingVisualStyle.stroke.ring}\n strokeDasharray={`${length} ${circumference - length}`}\n strokeDashoffset={-currentOffset}\n >\n <title>{`${datum.label}: ${datum.value} (${((datum.value / total) * 100).toFixed(1)}%)`}</title>\n </circle>\n );\n })}\n </g>\n <text x=\"360\" y=\"171\" textAnchor=\"middle\" fill={chartText} fontSize=\"30\" fontFamily=\"var(--font-display)\" fontWeight=\"600\">{centerValue ?? total.toLocaleString()}</text>\n <text x=\"360\" y=\"195\" textAnchor=\"middle\" fill={chartMuted} fontSize=\"11\" fontFamily=\"var(--font-mono)\">{centerLabel}</text>\n </svg>\n );\n}\n\nexport function SterlingLollipopChart({ data, ariaLabel, unit = \"\", xLabel }: { data: BarDatum[]; ariaLabel: string; unit?: string; xLabel?: string }) {\n const top = 30;\n const rowH = 56;\n const axisBottom = xLabel ? 50 : 34;\n const x0 = 200;\n const x1 = 660;\n const height = top + data.length * rowH + axisBottom;\n const baseline = top + data.length * rowH;\n const x = linearScale(data.map((datum) => datum.value), [x0, x1], { zero: true });\n return (\n <svg className=\"sterling-chart\" viewBox={`0 0 720 ${height}`} role=\"img\" aria-label={ariaLabel}>\n {x.ticks(6).map((value) => (\n <line key={value} x1={x(value)} x2={x(value)} y1={top} y2={baseline} stroke={chartGrid} strokeWidth={sterlingVisualStyle.stroke.grid} />\n ))}\n {data.map((datum, index) => {\n const y = top + index * rowH + rowH / 2 - 4;\n const color = sterlingChartColors[index];\n return (\n <g key={datum.label}>\n <text x={x0 - 14} y={y + 4} textAnchor=\"end\" fill={chartText} fontSize=\"12\" fontFamily=\"var(--font-mono)\">{datum.label}</text>\n <line x1={x(0)} x2={x(datum.value)} y1={y} y2={y} stroke={color} strokeOpacity={sterlingVisualStyle.opacity.secondaryMark} strokeWidth={sterlingVisualStyle.stroke.series} />\n <circle cx={x(datum.value)} cy={y} r=\"8\" fill={color}>\n <title>{`${datum.label}: ${datum.value}${unit}`}</title>\n </circle>\n <text x={x(datum.value) + 15} y={y + 4} fill={chartMuted} fontSize=\"11\" fontFamily=\"var(--font-mono)\">{datum.value}{unit}</text>\n </g>\n );\n })}\n <AxisBottom scale={x} y={baseline} count={6} title={xLabel} format={(value) => `${value}${unit}`} />\n </svg>\n );\n}\n\nfunction polarPoint(centerX: number, centerY: number, radius: number, angle: number) {\n const radians = ((angle - 90) * Math.PI) / 180;\n return { x: centerX + radius * Math.cos(radians), y: centerY + radius * Math.sin(radians) };\n}\n\nfunction pieArc(centerX: number, centerY: number, radius: number, startAngle: number, endAngle: number) {\n const start = polarPoint(centerX, centerY, radius, endAngle);\n const end = polarPoint(centerX, centerY, radius, startAngle);\n return `M ${centerX} ${centerY} L ${start.x} ${start.y} A ${radius} ${radius} 0 ${endAngle - startAngle > 180 ? 1 : 0} 0 ${end.x} ${end.y} Z`;\n}\n\nexport function SterlingPieChart({ data, ariaLabel }: { data: DonutDatum[]; ariaLabel: string }) {\n const total = data.reduce((sum, datum) => sum + datum.value, 0);\n let angle = 0;\n return (\n <svg className=\"sterling-chart\" viewBox=\"0 0 720 390\" role=\"img\" aria-label={ariaLabel}>\n {data.map((datum, index) => {\n const start = angle;\n const end = angle + (datum.value / total) * 360;\n angle = end;\n return (\n <path key={datum.label} d={pieArc(360, 194, 138, start, end)} fill={sterlingChartColors[index]} stroke=\"var(--sterling-surface)\" strokeWidth={sterlingVisualStyle.stroke.mark}>\n <title>{`${datum.label}: ${datum.value.toLocaleString()} (${((datum.value / total) * 100).toFixed(1)}%)`}</title>\n </path>\n );\n })}\n </svg>\n );\n}\n\nexport function SterlingChordChart({\n rowLabels,\n columnLabels,\n values,\n ariaLabel,\n}: {\n rowLabels: string[];\n columnLabels: string[];\n values: number[][];\n ariaLabel: string;\n}) {\n const labels = [...rowLabels, ...columnLabels];\n const matrix = Array.from({ length: labels.length }, () => Array(labels.length).fill(0));\n values.forEach((row, rowIndex) => row.forEach((value, columnIndex) => {\n matrix[rowIndex][rowLabels.length + columnIndex] = value;\n matrix[rowLabels.length + columnIndex][rowIndex] = value;\n }));\n const chords = d3Chord().padAngle(0.055).sortSubgroups((left, right) => right - left)(matrix);\n const arcPath = d3Arc<ChordGroup>()\n .innerRadius(126)\n .outerRadius(145)\n .cornerRadius(3)\n .startAngle((group) => group.startAngle)\n .endAngle((group) => group.endAngle);\n const ribbonPath = d3Ribbon<Chord, ChordSubgroup>().radius(122);\n return (\n <svg className=\"sterling-chart\" viewBox=\"0 0 720 420\" role=\"img\" aria-label={ariaLabel}>\n <g transform=\"translate(360 204)\">\n {chords.map((item, index) => (\n <path key={`${item.source.index}-${item.target.index}-${index}`} d={ribbonPath(item) ?? undefined} fill={sterlingChartColors[item.source.index]} fillOpacity={sterlingVisualStyle.opacity.relationship}>\n <title>{`${labels[item.source.index]} + ${labels[item.target.index]}: ${item.source.value}`}</title>\n </path>\n ))}\n {chords.groups.map((group) => (\n <path key={group.index} d={arcPath(group) ?? undefined} fill={sterlingChartColors[group.index]} stroke=\"var(--sterling-surface)\" strokeWidth={sterlingVisualStyle.stroke.mark} />\n ))}\n {chords.groups.map((group) => {\n const angle = (group.startAngle + group.endAngle) / 2;\n const x = Math.sin(angle) * 170;\n const y = -Math.cos(angle) * 170;\n return <text key={`label-${group.index}`} x={x} y={y + 4} textAnchor={x < -8 ? \"end\" : x > 8 ? \"start\" : \"middle\"} fill={chartText} fontSize=\"10\" fontFamily=\"var(--font-mono)\">{labels[group.index]}</text>;\n })}\n </g>\n </svg>\n );\n}\n\nexport interface SankeyLinkDatum {\n source: string;\n target: string;\n value: number;\n}\n\nexport function SterlingSankeyChart({ links, ariaLabel }: { links: SankeyLinkDatum[]; ariaLabel: string }) {\n const sources = [...new Set(links.map((link) => link.source))];\n const targets = [...new Set(links.map((link) => link.target))];\n const labels = [...sources, ...targets];\n type NodeExtra = { name: string; colorIndex: number };\n type LinkExtra = { sourceName: string; targetName: string; colorIndex: number };\n const graph = d3Sankey<NodeExtra, LinkExtra>()\n .nodeWidth(14)\n .nodePadding(12)\n .extent([[112, 36], [608, 360]])({\n nodes: labels.map((name, index) => ({ name, colorIndex: index })),\n links: links.map((link) => ({\n source: labels.indexOf(link.source),\n target: labels.indexOf(link.target),\n value: link.value,\n sourceName: link.source,\n targetName: link.target,\n colorIndex: sources.indexOf(link.source),\n })),\n });\n const linkPath = sankeyLinkHorizontal<NodeExtra, LinkExtra>();\n return (\n <svg className=\"sterling-chart\" viewBox=\"0 0 720 420\" role=\"img\" aria-label={ariaLabel}>\n {graph.links.map((link, index) => (\n <path\n key={`${link.sourceName}-${link.targetName}-${index}`}\n d={linkPath(link) ?? undefined}\n fill=\"none\"\n stroke={sterlingChartColors[link.colorIndex]}\n strokeOpacity={sterlingVisualStyle.opacity.relationship}\n strokeWidth={Math.max(sterlingVisualStyle.stroke.flowMinimum, link.width ?? sterlingVisualStyle.stroke.flowMinimum)}\n >\n <title>{`${link.sourceName} → ${link.targetName}: ${link.value}`}</title>\n </path>\n ))}\n {graph.nodes.map((node) => {\n const x0 = node.x0 ?? 0;\n const x1 = node.x1 ?? x0;\n const y0 = node.y0 ?? 0;\n const y1 = node.y1 ?? y0;\n const sourceSide = (node.depth ?? 0) === 0;\n return (\n <g key={node.name}>\n <rect x={x0} y={y0} width={Math.max(1, x1 - x0)} height={Math.max(1, y1 - y0)} rx=\"2\" fill={sterlingChartColors[node.colorIndex]} />\n <text x={sourceSide ? x0 - 10 : x1 + 10} y={(y0 + y1) / 2 + 4} textAnchor={sourceSide ? \"end\" : \"start\"} fill={chartText} fontSize=\"11\" fontFamily=\"var(--font-mono)\">{node.name}</text>\n </g>\n );\n })}\n </svg>\n );\n}\n","import { scaleLinear, scaleTime } from \"d3-scale\";\nimport type { ScaleLinear, ScaleTime } from \"d3-scale\";\nimport { sterlingDivergentColors } from \"./palette\";\nimport { sterlingVisualStyle } from \"./visualStyle\";\n\n/**\n * Shared cartesian foundation for every Sterling chart.\n *\n * One geometry, one axis grammar: gridlines, tick marks, tick labels, and axis\n * titles are drawn the same way everywhere so the whole catalog reads as a\n * single visualization package. Colors come from the theme tokens only.\n */\n\nexport const axisText = \"var(--sterling-text)\";\nexport const axisMuted = \"var(--sterling-muted)\";\nexport const axisGrid = \"var(--sterling-grid)\";\nexport const axisLine = \"var(--sterling-edge)\";\nconst MONO = \"var(--font-mono)\";\n\nexport const TICK = 5;\nexport const TICK_LABEL = 11;\nexport const AXIS_TITLE = 12;\n\nexport interface Margin {\n top: number;\n right: number;\n bottom: number;\n left: number;\n}\n\n/** Room on the left/bottom for tick labels plus an axis title. */\nexport const defaultMargin: Margin = { top: 26, right: 26, bottom: 56, left: 70 };\n\nexport interface Frame {\n width: number;\n height: number;\n x0: number;\n x1: number;\n y0: number;\n y1: number;\n}\n\nexport function frame(width: number, height: number, margin: Margin = defaultMargin): Frame {\n return {\n width,\n height,\n x0: margin.left,\n x1: width - margin.right,\n y0: margin.top,\n y1: height - margin.bottom,\n };\n}\n\n/** Linear scale with a nice domain; `zero` anchors magnitude charts at 0. */\nexport function linearScale(\n values: number[],\n range: [number, number],\n { zero = false, padFraction = 0.05 }: { zero?: boolean; padFraction?: number } = {},\n): ScaleLinear<number, number> {\n let min = Math.min(...values);\n let max = Math.max(...values);\n if (!Number.isFinite(min) || !Number.isFinite(max)) {\n min = 0;\n max = 1;\n }\n if (min === max) {\n // Degenerate range: open it up so ticks and the mark stay visible.\n const bump = Math.abs(min) || 1;\n min -= bump;\n max += bump;\n }\n if (zero) {\n min = Math.min(0, min);\n max = Math.max(0, max);\n } else {\n const pad = (max - min) * padFraction;\n min -= pad;\n max += pad;\n }\n return scaleLinear().domain([min, max]).nice().range(range);\n}\n\nexport function timeScale(domain: [number, number], range: [number, number]): ScaleTime<number, number> {\n return scaleTime().domain(domain).range(range).nice();\n}\n\nfunction tickValues(scale: ScaleLinear<number, number>, count: number): number[] {\n return scale.ticks(count);\n}\n\n/** Horizontal gridlines aligned to the left-axis ticks. */\nexport function Gridlines({\n scale,\n x0,\n x1,\n count = 5,\n}: {\n scale: ScaleLinear<number, number>;\n x0: number;\n x1: number;\n count?: number;\n}) {\n return (\n <g aria-hidden=\"true\">\n {tickValues(scale, count).map((value) => (\n <line key={value} x1={x0} x2={x1} y1={scale(value)} y2={scale(value)} stroke={axisGrid} strokeWidth={sterlingVisualStyle.stroke.grid} />\n ))}\n </g>\n );\n}\n\nexport function AxisLeft({\n scale,\n x,\n gridX1,\n count = 5,\n title,\n format,\n}: {\n scale: ScaleLinear<number, number>;\n x: number;\n gridX1?: number;\n count?: number;\n title?: string;\n format?: (value: number) => string;\n}) {\n const values = tickValues(scale, count);\n const fmt = format ?? ((value: number) => scale.tickFormat(count)(value));\n const [yBottom, yTop] = scale.range();\n return (\n <g>\n {gridX1 !== undefined\n ? values.map((value) => (\n <line key={`g${value}`} x1={x} x2={gridX1} y1={scale(value)} y2={scale(value)} stroke={axisGrid} strokeWidth={sterlingVisualStyle.stroke.grid} />\n ))\n : null}\n <line x1={x} x2={x} y1={yBottom} y2={yTop} stroke={axisLine} />\n {values.map((value) => (\n <g key={value}>\n <line x1={x - TICK} x2={x} y1={scale(value)} y2={scale(value)} stroke={axisLine} />\n <text x={x - TICK - 4} y={scale(value) + 3.6} textAnchor=\"end\" fill={axisMuted} fontSize={TICK_LABEL} fontFamily={MONO}>\n {fmt(value)}\n </text>\n </g>\n ))}\n {title ? (\n <text\n transform={`translate(${x - 48} ${(yBottom + yTop) / 2}) rotate(-90)`}\n textAnchor=\"middle\"\n fill={axisMuted}\n fontSize={AXIS_TITLE}\n fontFamily={MONO}\n >\n {title}\n </text>\n ) : null}\n </g>\n );\n}\n\nexport function AxisBottom({\n scale,\n y,\n count = 6,\n title,\n format,\n titleGap = 42,\n}: {\n scale: ScaleLinear<number, number>;\n y: number;\n count?: number;\n title?: string;\n format?: (value: number) => string;\n titleGap?: number;\n}) {\n const values = tickValues(scale, count);\n const fmt = format ?? ((value: number) => scale.tickFormat(count)(value));\n const [x0, x1] = scale.range();\n return (\n <g>\n <line x1={x0} x2={x1} y1={y} y2={y} stroke={axisLine} />\n {values.map((value) => (\n <g key={value}>\n <line x1={scale(value)} x2={scale(value)} y1={y} y2={y + TICK} stroke={axisLine} />\n <text x={scale(value)} y={y + TICK + 13} textAnchor=\"middle\" fill={axisMuted} fontSize={TICK_LABEL} fontFamily={MONO}>\n {fmt(value)}\n </text>\n </g>\n ))}\n {title ? (\n <text x={(x0 + x1) / 2} y={y + titleGap} textAnchor=\"middle\" fill={axisMuted} fontSize={AXIS_TITLE} fontFamily={MONO}>\n {title}\n </text>\n ) : null}\n </g>\n );\n}\n\n/**\n * Time axis whose interval adapts to the span and the available width: d3\n * chooses days, weeks, months, or years and formats each tick to match. One\n * tick roughly every `targetPx` pixels keeps labels from ever colliding.\n */\nexport function TimeAxisBottom({\n scale,\n y,\n title,\n targetPx = 96,\n titleGap = 42,\n}: {\n scale: ScaleTime<number, number>;\n y: number;\n title?: string;\n targetPx?: number;\n titleGap?: number;\n}) {\n const [x0, x1] = scale.range();\n const count = Math.max(2, Math.round((x1 - x0) / targetPx));\n const values = scale.ticks(count);\n const fmt = scale.tickFormat(count);\n return (\n <g>\n <line x1={x0} x2={x1} y1={y} y2={y} stroke={axisLine} />\n {values.map((value) => (\n <g key={+value}>\n <line x1={scale(value)} x2={scale(value)} y1={y} y2={y + TICK} stroke={axisLine} />\n <text x={scale(value)} y={y + TICK + 13} textAnchor=\"middle\" fill={axisMuted} fontSize={TICK_LABEL} fontFamily={MONO}>\n {fmt(value)}\n </text>\n </g>\n ))}\n {title ? (\n <text x={(x0 + x1) / 2} y={y + titleGap} textAnchor=\"middle\" fill={axisMuted} fontSize={AXIS_TITLE} fontFamily={MONO}>\n {title}\n </text>\n ) : null}\n </g>\n );\n}\n\n/** Evenly spaced band centers for categorical axes. */\nexport function bandCenters(count: number, x0: number, x1: number): { centers: number[]; step: number } {\n const step = (x1 - x0) / Math.max(count, 1);\n const centers = Array.from({ length: count }, (_, index) => x0 + step * (index + 0.5));\n return { centers, step };\n}\n\n/**\n * Signed diverging color with the brand orientation: violet encodes positive,\n * teal encodes negative. The palette token order is violet -> ... -> teal, so a\n * positive value maps to the low (violet) end. Palette values are never mutated.\n */\nexport function divergentSignedColor(value: number, maxAbs: number): string {\n const stops = sterlingDivergentColors.length - 1;\n const t = Math.max(0, Math.min(1, (value + maxAbs) / (2 * maxAbs))); // 0 = most negative, 1 = most positive\n return sterlingDivergentColors[Math.round((1 - t) * stops)];\n}\n\n/** Legend ramp for signed diverging scales, left (negative/teal) to right (positive/violet). */\nexport const divergentSignedRamp: readonly string[] = [...sterlingDivergentColors].reverse();\n\n/** Tukey five-number summary with 1.5*IQR fences and the outliers beyond them. */\nexport function tukeySummary(values: number[]) {\n const sorted = [...values].sort((left, right) => left - right);\n const q = (p: number) => {\n if (sorted.length === 0) return 0;\n const position = (sorted.length - 1) * p;\n const lower = Math.floor(position);\n const upper = Math.ceil(position);\n if (lower === upper) return sorted[lower];\n return sorted[lower] + (sorted[upper] - sorted[lower]) * (position - lower);\n };\n const q1 = q(0.25);\n const median = q(0.5);\n const q3 = q(0.75);\n const iqr = q3 - q1;\n const lowerFence = q1 - 1.5 * iqr;\n const upperFence = q3 + 1.5 * iqr;\n const inside = sorted.filter((value) => value >= lowerFence && value <= upperFence);\n const whiskerLow = inside.length ? inside[0] : q1;\n const whiskerHigh = inside.length ? inside[inside.length - 1] : q3;\n const outliers = sorted.filter((value) => value < lowerFence || value > upperFence);\n return { q1, median, q3, iqr, whiskerLow, whiskerHigh, outliers, min: sorted[0], max: sorted[sorted.length - 1] };\n}\n","/**\n * Shared optical weights for Sterling primitives. Values are intentionally\n * modest: data marks lead, while axes and construction lines recede.\n */\nexport const sterlingVisualStyle = {\n stroke: {\n grid: 1,\n detail: 1.5,\n candle: 1.75,\n mark: 2,\n series: 2.25,\n emphasis: 2.5,\n interval: 7,\n halo: 3,\n ring: 44,\n flowMinimum: 1,\n },\n opacity: {\n ghost: 0.04,\n contour: 0.08,\n surface: 0.1,\n area: 0.24,\n ridge: 0.34,\n interval: 0.28,\n relationship: 0.42,\n secondaryMark: 0.66,\n guide: 0.7,\n signal: 0.84,\n mutedMark: 0.34,\n },\n} as const;\n","import type { ReactElement } from \"react\";\nimport { geoAlbersUsa, geoPath } from \"d3-geo\";\nimport { hierarchy, treemap, treemapSquarify } from \"d3-hierarchy\";\nimport { feature } from \"topojson-client\";\nimport { sterlingChartColors, sterlingDivergentColors, sterlingRamp, sterlingRampStops, sterlingSequentialColors } from \"./palette\";\nimport { kernelDensity } from \"./charts\";\nimport { AxisBottom, AxisLeft, Gridlines, bandCenters, divergentSignedColor, frame, linearScale } from \"./plot\";\nimport { sterlingVisualStyle } from \"./visualStyle\";\n\nconst muted = \"var(--sterling-muted)\";\nconst grid = \"var(--sterling-grid)\";\nconst surface = \"var(--sterling-surface)\";\nconst text = \"var(--sterling-text)\";\n\nexport function SterlingVerticalBarChart({ data, ariaLabel, yLabel, xLabel }: { data: Array<[string, number]>; ariaLabel: string; yLabel?: string; xLabel?: string }) {\n const f = frame(720, 380, { top: 26, right: 26, bottom: 56, left: 70 });\n const y = linearScale([0, Math.max(...data.map(([, value]) => value), 1)], [f.y1, f.y0], { zero: true });\n const { centers, step } = bandCenters(data.length, f.x0, f.x1);\n const width = Math.min(70, step * 0.62);\n return (\n <svg className=\"sterling-chart\" viewBox={`0 0 ${f.width} ${f.height}`} role=\"img\" aria-label={ariaLabel}>\n <Gridlines scale={y} x0={f.x0} x1={f.x1} count={5} />\n {data.map(([label, value], index) => {\n const cx = centers[index];\n return <g key={label}>\n <rect x={cx - width / 2} y={y(value)} width={width} height={f.y1 - y(value)} rx=\"6\" fill={sterlingChartColors[index]}><title>{`${label}: ${value.toFixed(1)}`}</title></rect>\n <text x={cx} y={y(value) - 8} textAnchor=\"middle\" fill={muted} fontSize=\"11\" fontFamily=\"var(--font-mono)\">{value.toFixed(1)}</text>\n <text x={cx} y={f.y1 + 18} textAnchor=\"middle\" fill={text} fontSize=\"12\" fontFamily=\"var(--font-mono)\">{label}</text>\n </g>;\n })}\n <AxisLeft scale={y} x={f.x0} count={5} title={yLabel} />\n <line x1={f.x0} x2={f.x1} y1={f.y1} y2={f.y1} stroke=\"var(--sterling-edge)\" />\n {xLabel ? <text x={(f.x0 + f.x1) / 2} y={f.y1 + 42} textAnchor=\"middle\" fill={muted} fontSize=\"12\" fontFamily=\"var(--font-mono)\">{xLabel}</text> : null}\n </svg>\n );\n}\n\nexport function SterlingCandlestickChart({ rows, ariaLabel, yLabel, xLabel }: { rows: Array<[string, number, number, number, number]>; ariaLabel: string; yLabel?: string; xLabel?: string }) {\n const values = rows.flatMap(([, open, high, low, close]) => [open, high, low, close]);\n const f = frame(720, 380, { top: 26, right: 26, bottom: 56, left: 70 });\n const y = linearScale(values, [f.y1, f.y0], { padFraction: 0.06 });\n const { centers, step } = bandCenters(rows.length, f.x0, f.x1);\n const bodyWidth = Math.min(15, step * 0.62);\n // Brand orientation: violet = up (positive), teal = down (negative).\n const rising = sterlingDivergentColors[2];\n const falling = sterlingDivergentColors[8];\n const labelStep = Math.max(1, Math.ceil(rows.length / 8));\n const lastIndex = rows.length - 1;\n const showDate = (index: number) => index === lastIndex || (index % labelStep === 0 && lastIndex - index >= labelStep * 0.55);\n return <svg className=\"sterling-chart\" viewBox={`0 0 ${f.width} ${f.height}`} role=\"img\" aria-label={ariaLabel}>\n <Gridlines scale={y} x0={f.x0} x1={f.x1} count={5} />\n {rows.map(([date, open, high, low, close], index) => {\n const x = centers[index];\n const up = close >= open;\n const color = up ? rising : falling;\n const top = y(Math.max(open, close));\n const bottom = y(Math.min(open, close));\n return <g key={date}>\n <title>{`${date}: open ${open}, high ${high}, low ${low}, close ${close}`}</title>\n <line x1={x} x2={x} y1={y(high)} y2={y(low)} stroke={color} strokeWidth={sterlingVisualStyle.stroke.candle} />\n <rect x={x - bodyWidth / 2} y={top} width={bodyWidth} height={Math.max(2, bottom - top)} rx=\"1.5\" fill={up ? color : surface} stroke={color} strokeWidth={sterlingVisualStyle.stroke.candle} />\n {showDate(index) ? <text x={x} y={f.y1 + 18} textAnchor=\"middle\" fill={muted} fontSize=\"10\" fontFamily=\"var(--font-mono)\">{date}</text> : null}\n </g>;\n })}\n <AxisLeft scale={y} x={f.x0} count={5} title={yLabel} format={(value) => value.toFixed(0)} />\n <line x1={f.x0} x2={f.x1} y1={f.y1} y2={f.y1} stroke=\"var(--sterling-edge)\" />\n {xLabel ? <text x={(f.x0 + f.x1) / 2} y={f.y1 + 42} textAnchor=\"middle\" fill={muted} fontSize=\"12\" fontFamily=\"var(--font-mono)\">{xLabel}</text> : null}\n </svg>;\n}\n\nfunction polar(cx: number, cy: number, radius: number, index: number, count: number) {\n const angle = -Math.PI / 2 + index * Math.PI * 2 / count;\n return [cx + Math.cos(angle) * radius, cy + Math.sin(angle) * radius] as const;\n}\n\nexport function SterlingRadarChart({ labels, series, domain, ariaLabel, unit = \"\" }: { labels: string[]; series: Array<[string, ...number[]]>; domain: number[]; ariaLabel: string; unit?: string }) {\n const cx = 360, cy = 196, radius = 130;\n const scale = (value: number) => ((value - domain[0]) / Math.max(domain[1] - domain[0], 1)) * radius;\n const levels = [0.2, 0.4, 0.6, 0.8, 1];\n // Radial tick values so the rings can actually be read.\n const ringValue = (level: number) => domain[0] + level * (domain[1] - domain[0]);\n const format = (value: number) => `${Number.isInteger(value) ? value : value.toFixed(1)}${unit}`;\n return <svg className=\"sterling-chart\" viewBox=\"0 0 720 390\" role=\"img\" aria-label={ariaLabel}>\n {levels.map((level) => <polygon key={level} points={labels.map((_, index) => polar(cx, cy, radius * level, index, labels.length).join(\",\")).join(\" \")} fill=\"none\" stroke={grid} />)}\n {labels.map((label, index) => {\n const [x, y] = polar(cx, cy, radius, index, labels.length);\n const [lx, ly] = polar(cx, cy, radius + 24, index, labels.length);\n return <g key={label}><line x1={cx} y1={cy} x2={x} y2={y} stroke={grid} /><text x={lx} y={ly + 4} textAnchor=\"middle\" fill={muted} fontSize=\"10\" fontFamily=\"var(--font-mono)\">{label}</text></g>;\n })}\n {series.map(([name, ...values], index) => {\n const color = sterlingSequentialColors[Math.min(9, index + 2)];\n const latest = index === series.length - 1;\n return <polygon key={name} points={values.map((value, axis) => polar(cx, cy, scale(value), axis, labels.length).join(\",\")).join(\" \")} fill={latest ? color : \"none\"} fillOpacity={sterlingVisualStyle.opacity.surface} stroke={color} strokeWidth={sterlingVisualStyle.stroke.detail} strokeOpacity={latest ? 1 : sterlingVisualStyle.opacity.guide}><title>{`${name}: ${values.join(\", \")}`}</title></polygon>;\n })}\n {/* Radial value axis: labelled rings along the vertical spoke. The halo\n keeps them readable where series polygons cross underneath. */}\n {[0, ...levels].map((level) => (\n <text\n key={`r-${level}`}\n x={cx + 6}\n y={cy - radius * level + 3}\n fill={muted}\n fontSize=\"9\"\n fontFamily=\"var(--font-mono)\"\n stroke={surface}\n strokeWidth={sterlingVisualStyle.stroke.halo}\n paintOrder=\"stroke\"\n >\n {format(ringValue(level))}\n </text>\n ))}\n </svg>;\n}\n\nexport function SterlingRidgelineChart({ groups, ariaLabel, xLabel, unit = \"\" }: { groups: Array<{ label: string; values: number[] }>; ariaLabel: string; xLabel?: string; unit?: string }) {\n const all = groups.flatMap((group) => group.values);\n const observedMin = Math.min(...all);\n const observedMax = Math.max(...all);\n // Estimate density past the data so ridges taper instead of clipping.\n const margin = (observedMax - observedMin) * 0.08;\n const domain: [number, number] = [observedMin - margin, observedMax + margin];\n const x0 = 118, x1 = 664;\n const baseline = 338;\n const rowStep = (baseline - 60) / Math.max(groups.length, 1);\n const amplitude = rowStep * 1.9; // overlap so ridges interleave\n const x = linearScale(domain, [x0, x1], { padFraction: 0 });\n const peak = Math.max(\n ...groups.map((group) => Math.max(...kernelDensity(group.values, 96, domain).map((point) => point.density))),\n Number.EPSILON,\n );\n return <svg className=\"sterling-chart\" viewBox=\"0 0 720 390\" role=\"img\" aria-label={ariaLabel}>\n {x.ticks(6).map((value) => <line key={value} x1={x(value)} x2={x(value)} y1={26} y2={baseline} stroke={grid} strokeWidth={sterlingVisualStyle.stroke.grid} />)}\n {groups.map((source, index) => {\n // Draw top-to-bottom so nearer (lower) ridges occlude the ones behind them.\n const base = 60 + index * rowStep;\n const density = kernelDensity(source.values, 96, domain);\n const points = density.map((point) => `${x(point.value)} ${base - (point.density / peak) * amplitude}`);\n const color = sterlingChartColors[index % sterlingChartColors.length];\n return <g key={source.label}>\n <text x={x0 - 12} y={base + 3} textAnchor=\"end\" fill={text} fontSize=\"10\" fontFamily=\"var(--font-mono)\">{source.label}</text>\n <path d={`M ${x(domain[0])} ${base} L ${points.join(\" L \")} L ${x(domain[1])} ${base} Z`} fill={color} fillOpacity={sterlingVisualStyle.opacity.ridge} stroke={color} strokeWidth={sterlingVisualStyle.stroke.series} strokeLinejoin=\"round\" />\n </g>;\n })}\n <AxisBottom scale={x} y={baseline} count={6} title={xLabel} format={(value) => `${value}${unit}`} />\n </svg>;\n}\n\nexport function SterlingDensity2DChart({ points, regionLabels, ariaLabel, xLabel, yLabel }: { points: Array<[number, number, number]>; regionLabels: string[]; ariaLabel: string; xLabel?: string; yLabel?: string }) {\n const f = frame(720, 380, { top: 26, right: 26, bottom: 56, left: 74 });\n const x = linearScale(points.map((point) => point[0]), [f.x0, f.x1]);\n const y = linearScale(points.map((point) => point[1]), [f.y1, f.y0]);\n const pxX = Math.abs(x(1000) - x(0)) / 1000;\n const pxY = Math.abs(y(1) - y(0));\n const specs = [[4570,71.26,559,.74,.36],[4012,69.71,605,1.02,.46],[4611,71.77,283,1.04,-.03],[4703,71.23,664,1.35,-.29]];\n return <svg className=\"sterling-chart\" viewBox={`0 0 ${f.width} ${f.height}`} role=\"img\" aria-label={ariaLabel}>\n <Gridlines scale={y} x0={f.x0} x1={f.x1} count={5} />\n {specs.flatMap(([meanX, meanY, sdX, sdY, correlation], index) => [1, .68, .38].map((level) => <ellipse key={`${index}-${level}`} cx={x(meanX)} cy={y(meanY)} rx={sdX * pxX * 1.7 * level} ry={sdY * pxY * 1.7 * level} transform={`rotate(${-correlation * 35} ${x(meanX)} ${y(meanY)})`} fill={sterlingChartColors[index]} fillOpacity={sterlingVisualStyle.opacity.contour} stroke={sterlingChartColors[index]} strokeWidth={sterlingVisualStyle.stroke.detail} />))}\n {points.map(([income, life, group], index) => <circle key={index} cx={x(income)} cy={y(life)} r=\"4\" fill={sterlingChartColors[group]} fillOpacity={sterlingVisualStyle.opacity.secondaryMark}><title>{`${regionLabels[group]}: ${income}, ${life}`}</title></circle>)}\n <AxisLeft scale={y} x={f.x0} count={5} title={yLabel} />\n <AxisBottom scale={x} y={f.y1} count={6} title={xLabel} format={(value) => `${(value / 1000).toFixed(1)}k`} />\n </svg>;\n}\n\nexport function SterlingTreemapChart({ rows, ariaLabel }: { rows: Array<[string, string, string, number]>; ariaLabel: string }) {\n const continents = [...new Set(rows.map(([continent]) => continent))];\n type TreeDatum = { name: string; continent?: string; value?: number; children?: TreeDatum[] };\n // Continent -> country directly. The sub-region level was invisible and made\n // the gaps between neighbouring tiles uneven (padding stacked per nesting).\n const rootData: TreeDatum = {\n name: \"world\",\n children: continents.map((continent) => ({\n name: continent,\n continent,\n children: rows\n .filter(([name]) => name === continent)\n .map(([, , country, value]) => ({ name: country, continent, value })),\n })),\n };\n // Rank within each continent drives the sequential stop, so the ramp reads as\n // an ordered scale instead of collapsing: population is power-law shaped, and\n // a proportional mapping puts most countries on the same one or two tones.\n const rankByCountry = new Map<string, { rank: number; total: number }>();\n continents.forEach((continent) => {\n const list = rows.filter(([name]) => name === continent).sort((left, right) => right[3] - left[3]);\n list.forEach(([, , country], index) => rankByCountry.set(country, { rank: index, total: list.length }));\n });\n // The ramp band is already trimmed to legible stops, so rank spans it fully.\n const stopFor = (country: string) => {\n const entry = rankByCountry.get(country);\n if (!entry || entry.total < 2) return sterlingRampStops;\n return Math.round(sterlingRampStops - (entry.rank * (sterlingRampStops - 1)) / (entry.total - 1));\n };\n const treeRoot = hierarchy(rootData)\n .sum((datum) => datum.value ?? 0)\n .sort((left, right) => (right.value ?? 0) - (left.value ?? 0));\n const root = treemap<TreeDatum>()\n .tile(treemapSquarify)\n .size([680, 330])\n // One nesting level means one uniform gap between tiles; the slightly wider\n // outer inset is what separates continents.\n .paddingInner(3)\n .paddingOuter(4)\n .paddingTop((node) => (node.depth === 1 ? 21 : 0))\n .round(true)(treeRoot);\n return (\n <svg className=\"sterling-chart\" viewBox=\"0 0 720 370\" role=\"img\" aria-label={ariaLabel}>\n <g transform=\"translate(20 20)\">\n {root.descendants().filter((node) => node.depth === 1).map((node) => {\n const color = sterlingChartColors[continents.indexOf(node.data.name)];\n return <g key={`group-${node.data.name}`}>\n <rect x={node.x0} y={node.y0} width={node.x1 - node.x0} height={node.y1 - node.y0} rx=\"3\" fill=\"none\" stroke={color} strokeWidth={sterlingVisualStyle.stroke.detail} />\n <text x={node.x0 + 6} y={node.y0 + 13} fill={color} fontSize=\"9\" fontFamily=\"var(--font-mono)\" fontWeight=\"700\">{node.data.name}</text>\n </g>;\n })}\n {root.leaves().map((leaf) => {\n const continent = leaf.data.continent ?? \"\";\n const width = leaf.x1 - leaf.x0;\n const height = leaf.y1 - leaf.y0;\n const fontSize = width > 120 ? 10 : 8;\n const stop = stopFor(leaf.data.name);\n const fits = width > leaf.data.name.length * fontSize * 0.62 + 10 && height > fontSize * 2.4;\n return <g key={leaf.data.name}>\n <rect x={leaf.x0} y={leaf.y0} width={width} height={height} rx=\"2\" fill={sterlingRamp(continents.indexOf(continent), stop)}>\n <title>{`${leaf.data.name}: ${(leaf.value ?? 0).toLocaleString()}`}</title>\n </rect>\n {/* Strong stops carry surface-colored type; faint ones need ink. A\n halo was tried here and reads as a heavy outline at this size. */}\n {fits ? <text x={leaf.x0 + 6} y={leaf.y0 + fontSize + 5} fill={stop > sterlingRampStops / 2 ? surface : text} fontSize={fontSize} fontFamily=\"var(--font-mono)\">{leaf.data.name}</text> : null}\n </g>;\n })}\n </g>\n </svg>\n );\n}\n\nexport function SterlingNetworkChart({ nodes, edges, ariaLabel }: { nodes: Array<[string,number,number,number,number]>; edges: Array<[number,number]>; ariaLabel: string }) {\n return <svg className=\"sterling-chart\" viewBox=\"0 0 560 300\" role=\"img\" aria-label={ariaLabel}>\n {edges.map(([source,target], index) => <line key={index} x1={nodes[source][1]+42} y1={nodes[source][2]} x2={nodes[target][1]+42} y2={nodes[target][2]} stroke={grid} strokeWidth={sterlingVisualStyle.stroke.detail} />)}\n {nodes.map(([name,x,y,degree,community]) => { const radius=5+(degree-10)*.45; return <g key={name}><circle cx={x+42} cy={y} r={radius} fill={sterlingChartColors[community]} stroke={surface} strokeWidth={sterlingVisualStyle.stroke.mark}><title>{`${name}: ${degree}`}</title></circle>{degree>=19||name===\"Y Holtz\"?<text x={x+42} y={y-radius-7} textAnchor=\"middle\" fill={muted} fontSize=\"7.5\" fontFamily=\"var(--font-mono)\">{name}</text>:null}</g>; })}\n </svg>;\n}\n\nexport function SterlingDendrogramChart({ labels, merge, height, order, groups, ariaLabel, yLabel, cutLabel }: { labels:string[]; merge:Array<[number,number]>; height:number[]; order:number[]; groups:number[][]; ariaLabel:string; yLabel?:string; cutLabel?:string }) {\n const leafY=270, maximum=Math.max(...height), axisX=78, step=(666-axisX-24)/(order.length-1);\n const leafX=new Map(order.map((leaf,position)=>[leaf,axisX+12+position*step]));\n const groupByLeaf=new Map<number,number>(); groups.forEach((members,group)=>members.forEach(leaf=>groupByLeaf.set(leaf,group)));\n // Shared linear scale so the merge heights read as real distances.\n const dist=linearScale([0,maximum],[leafY,leafY-206],{zero:true});\n type Node={x:number;y:number;members:number[];group:number|null}; const clusters:Node[]=[];\n const child=(reference:number):Node=>reference<0?{x:leafX.get(-reference)??axisX,y:leafY,members:[-reference],group:groupByLeaf.get(-reference)??null}:clusters[reference-1];\n const branches=merge.map(([leftRef,rightRef],index)=>{const left=child(leftRef),right=child(rightRef),nodeY=dist(height[index]),members=[...left.members,...right.members],memberships=[...new Set(members.map(leaf=>groupByLeaf.get(leaf)))],group=memberships.length===1?(memberships[0]??null):null;clusters.push({x:(left.x+right.x)/2,y:nodeY,members,group});return {left,right,y:nodeY,group};});\n const cut=0.388,cutY=dist(cut);\n return <svg className=\"sterling-chart\" viewBox=\"0 0 720 390\" role=\"img\" aria-label={ariaLabel}>\n <AxisLeft scale={dist} x={axisX} gridX1={666} count={5} title={yLabel}/>\n <line x1={axisX} x2=\"666\" y1={cutY} y2={cutY} stroke={muted} strokeDasharray=\"5 5\"/>\n {cutLabel?<text x=\"666\" y={cutY-6} textAnchor=\"end\" fill={muted} fontSize=\"9\" fontFamily=\"var(--font-mono)\">{`${cutLabel} ${cut}`}</text>:null}\n {groups.map((members,index)=>{const positions=members.map(leaf=>leafX.get(leaf)??0);const x0=Math.min(...positions)-9,x1=Math.max(...positions)+9;return <rect key={index} x={x0} y={cutY} width={x1-x0} height={leafY-cutY+50} rx=\"6\" fill={sterlingChartColors[index]} fillOpacity={sterlingVisualStyle.opacity.ghost} stroke={sterlingChartColors[index]} strokeWidth={sterlingVisualStyle.stroke.detail}/>;})}\n {branches.map(({left,right,y,group},index)=><g key={index}><path d={`M ${left.x} ${left.y} V ${y}`} stroke={left.group===null?muted:sterlingChartColors[left.group]} fill=\"none\" strokeWidth={sterlingVisualStyle.stroke.detail}/><path d={`M ${right.x} ${right.y} V ${y}`} stroke={right.group===null?muted:sterlingChartColors[right.group]} fill=\"none\" strokeWidth={sterlingVisualStyle.stroke.detail}/><path d={`M ${left.x} ${y} H ${right.x}`} stroke={group===null?muted:sterlingChartColors[group]} fill=\"none\" strokeWidth={sterlingVisualStyle.stroke.detail}/></g>)}\n {order.map(leaf=>{const x=leafX.get(leaf)??0,group=groupByLeaf.get(leaf)??0;return <g key={leaf}><circle cx={x} cy={leafY} r=\"3.5\" fill={sterlingChartColors[group]}/><text x={x+3} y={leafY+12} transform={`rotate(50 ${x+3} ${leafY+12})`} fill={muted} fontSize=\"7.5\" fontFamily=\"var(--font-mono)\">{labels[leaf-1]}</text></g>;})}\n </svg>;\n}\n\nexport function SterlingVolcanoChart({ hex, labels, ariaLabel, xLabel, yLabel }: { hex: string; labels: Array<[string,number,number]>; ariaLabel: string; xLabel?: string; yLabel?: string }) {\n const genes = Array.from({ length: hex.length / 4 }, (_, index) => { const offset=index*4; return [(parseInt(hex.slice(offset,offset+2),16)/255)*12-6,(parseInt(hex.slice(offset+2,offset+4),16)/255)*5] as const; });\n const f = frame(720, 380, { top: 26, right: 26, bottom: 56, left: 70 });\n const x = linearScale([-6, 6], [f.x0, f.x1], { padFraction: 0 });\n const y = linearScale([0, 5], [f.y1, f.y0], { zero: true });\n return <svg className=\"sterling-chart\" viewBox={`0 0 ${f.width} ${f.height}`} role=\"img\" aria-label={ariaLabel}>\n <Gridlines scale={y} x0={f.x0} x1={f.x1} count={5}/>\n <line x1={x(0)} x2={x(0)} y1={f.y0} y2={f.y1} stroke={grid} strokeWidth={sterlingVisualStyle.stroke.grid}/>{[-1,1].map(v=><line key={v} x1={x(v)} x2={x(v)} y1={f.y0} y2={f.y1} stroke={sterlingChartColors[7]} strokeDasharray=\"5 5\" strokeOpacity={sterlingVisualStyle.opacity.guide} strokeWidth={sterlingVisualStyle.stroke.grid}/>)}<line x1={f.x0} x2={f.x1} y1={y(1.3)} y2={y(1.3)} stroke={sterlingChartColors[7]} strokeDasharray=\"5 5\" strokeOpacity={sterlingVisualStyle.opacity.guide} strokeWidth={sterlingVisualStyle.stroke.grid}/>\n {genes.map(([effect,evidence],index)=>{const significant=Math.abs(effect)>=1&&evidence>=1.3; const color=significant?(effect<0?sterlingChartColors[2]:sterlingChartColors[1]):sterlingChartColors[7]; return <circle key={index} cx={x(effect)} cy={y(evidence)} r={significant?2.5:1.6} fill={color} fillOpacity={significant ? sterlingVisualStyle.opacity.signal : sterlingVisualStyle.opacity.mutedMark}/>;})}\n {labels.map(([gene,effect,evidence])=><g key={gene}><circle cx={x(effect)} cy={y(evidence)} r=\"4\" fill={effect<0?sterlingChartColors[2]:sterlingChartColors[1]} stroke={surface}/><text x={x(effect)} y={y(evidence)-8} textAnchor=\"middle\" fill={text} fontSize=\"8\" fontFamily=\"var(--font-mono)\">{gene}</text></g>)}\n <AxisLeft scale={y} x={f.x0} count={5} title={yLabel}/>\n <AxisBottom scale={x} y={f.y1} count={7} title={xLabel}/>\n </svg>;\n}\n\nexport function SterlingManhattanChart({ hex, labels, chromosomeCenters, ariaLabel, xLabel, yLabel }: { hex:string; labels:Array<[string,number,number,number]>; chromosomeCenters:number[]; ariaLabel:string; xLabel?:string; yLabel?:string }) {\n const points=Array.from({length:hex.length/8},(_,index)=>{const offset=index*8;return [parseInt(hex.slice(offset,offset+4),16)/65535,(parseInt(hex.slice(offset+4,offset+6),16)/255)*9,parseInt(hex.slice(offset+6,offset+8),16)] as const;});\n const f = frame(720, 380, { top: 26, right: 26, bottom: 56, left: 70 });\n const x=(v:number)=>f.x0+v*(f.x1-f.x0);\n const y = linearScale([0, 9], [f.y1, f.y0], { zero: true });\n const threshold=-Math.log10(5e-8);\n return <svg className=\"sterling-chart\" viewBox={`0 0 ${f.width} ${f.height}`} role=\"img\" aria-label={ariaLabel}>\n <Gridlines scale={y} x0={f.x0} x1={f.x1} count={5}/>\n <line x1={f.x0} x2={f.x1} y1={y(threshold)} y2={y(threshold)} stroke={sterlingChartColors[5]} strokeDasharray=\"5 5\"/>\n {points.map(([position,evidence,chromosome],index)=><circle key={index} cx={x(position)} cy={y(evidence)} r={evidence>=threshold?3:1.5} fill={sterlingChartColors[chromosome%2===0?4:0]} fillOpacity={evidence>=threshold?1:sterlingVisualStyle.opacity.secondaryMark}/>)}\n {labels.slice(0,1).map(([name,chromosome,position,evidence])=><g key={name}><circle cx={x(position)} cy={y(evidence)} r=\"4\" fill={sterlingChartColors[chromosome%2===0?4:0]} stroke={surface}/><text x={x(position)+8} y={y(evidence)-8} fill={text} fontSize=\"8\" fontFamily=\"var(--font-mono)\">{`chr${chromosome} · ${name}`}</text></g>)}\n <AxisLeft scale={y} x={f.x0} count={5} title={yLabel}/>\n <line x1={f.x0} x2={f.x1} y1={f.y1} y2={f.y1} stroke=\"var(--sterling-edge)\"/>\n {chromosomeCenters.map((position,index)=><text key={index} x={x(position)} y={f.y1 + 16} textAnchor=\"middle\" fill={muted} fontSize=\"8\" fontFamily=\"var(--font-mono)\">{index+1}</text>)}\n {xLabel ? <text x={(f.x0 + f.x1) / 2} y={f.y1 + 42} textAnchor=\"middle\" fill={muted} fontSize=\"12\" fontFamily=\"var(--font-mono)\">{xLabel}</text> : null}\n </svg>;\n}\n\nfunction correlation(left:number[],right:number[]) { const lm=left.reduce((a,b)=>a+b,0)/left.length,rm=right.reduce((a,b)=>a+b,0)/right.length;let n=0,ls=0,rs=0;left.forEach((value,index)=>{const l=value-lm,r=right[index]-rm;n+=l*r;ls+=l*l;rs+=r*r;});return n/Math.sqrt(ls*rs); }\n\ntype ClusterNode = { members: number[]; left: ClusterNode | null; right: ClusterNode | null; height: number; group: number | null };\n\n/** Average-linkage hierarchical clustering on correlation distance (1 - r). */\nfunction clusterVectors(vectors: number[][], memberships: number[]): ClusterNode {\n const distances = vectors.map((left, li) => vectors.map((right, ri) => (li === ri ? 0 : 1 - correlation(left, right))));\n let clusters: ClusterNode[] = vectors.map((_, i) => ({ members: [i], left: null, right: null, height: 0, group: memberships[i] }));\n const meanMembership = (c: ClusterNode) => c.members.reduce((s, m) => s + memberships[m], 0) / c.members.length;\n while (clusters.length > 1) {\n let bestLeft = 0, bestRight = 1, bestDistance = Number.POSITIVE_INFINITY;\n for (let i = 0; i < clusters.length; i += 1) {\n for (let j = i + 1; j < clusters.length; j += 1) {\n const L = clusters[i], R = clusters[j];\n const d = L.members.reduce((sum, lm) => sum + R.members.reduce((inner, rm) => inner + distances[lm][rm], 0), 0) / (L.members.length * R.members.length);\n if (d < bestDistance) { bestDistance = d; bestLeft = i; bestRight = j; }\n }\n }\n let L = clusters[bestLeft], R = clusters[bestRight];\n if (meanMembership(L) > meanMembership(R)) { [L, R] = [R, L]; }\n const members = [...L.members, ...R.members];\n const groupSet = [...new Set(members.map((m) => memberships[m]))];\n const merged: ClusterNode = { members, left: L, right: R, height: bestDistance, group: groupSet.length === 1 ? groupSet[0] : null };\n clusters = clusters.filter((_, index) => index !== bestLeft && index !== bestRight);\n clusters.push(merged);\n }\n return clusters[0];\n}\n\nfunction leafOrder(node: ClusterNode): number[] {\n return node.left ? [...leafOrder(node.left), ...leafOrder(node.right as ClusterNode)] : node.members;\n}\n\n/**\n * Clustered correlation heatmap of NCI60 expression profiles. Rows and columns\n * are reordered by hierarchical clustering so shared signatures surface as\n * diagonal blocks; dendrograms, type annotations, and region frames match the\n * canonical v1.5 figure. Violet = positive correlation, teal = negative.\n */\nexport function SterlingExpressionChart({ hex, groups, types, ariaLabel }: { hex:string; groups:number[]; types:string[]; ariaLabel:string }) {\n const columns = groups.length;\n const raw = Array.from({ length: hex.length / 2 }, (_, index) => (parseInt(hex.slice(index * 2, index * 2 + 2), 16) / 255) * 5 - 2.5);\n const genes = raw.length / columns;\n const matrix = Array.from({ length: genes }, (_, row) => raw.slice(row * columns, (row + 1) * columns));\n const columnVectors = Array.from({ length: columns }, (_, column) => matrix.map((row) => row[column]));\n const tree = clusterVectors(columnVectors, groups);\n const order = leafOrder(tree);\n\n const cell = 9.25;\n const startX = 132;\n const startY = 86;\n const matrixSize = columns * cell;\n const columnCenter = (visible: number) => startX + visible * cell + cell / 2;\n const rowCenter = (visible: number) => startY + visible * cell + cell / 2;\n const branchColor = (node: ClusterNode) => (node.group === null ? muted : sterlingChartColors[node.group]);\n const maxHeight = Math.max(tree.height, 0.0001);\n\n // Reorder lookups\n const visibleIndex = new Map(order.map((original, visible) => [original, visible]));\n\n const cells = order.flatMap((row, visibleRow) =>\n order.map((column, visibleColumn) => {\n const value = correlation(columnVectors[row], columnVectors[column]);\n return <rect key={`${visibleRow}-${visibleColumn}`} x={startX + visibleColumn * cell} y={startY + visibleRow * cell} width={cell + 0.1} height={cell + 0.1} fill={divergentSignedColor(value, 1)}>\n <title>{`${types[groups[row]]} × ${types[groups[column]]}: r ${value.toFixed(2)}`}</title>\n </rect>;\n }),\n );\n\n const topAnnotations = order.map((column, visible) => <rect key={`ta-${visible}`} x={startX + visible * cell} y=\"78\" width={cell + 0.1} height=\"5\" fill={sterlingChartColors[groups[column]]} />);\n const leftAnnotations = order.map((row, visible) => <rect key={`la-${visible}`} x=\"124\" y={startY + visible * cell} width=\"5\" height={cell + 0.1} fill={sterlingChartColors[groups[row]]} />);\n\n // Region frames around diagonal runs of one type\n const runs: Array<{ group: number; start: number; length: number }> = [];\n order.forEach((column, index) => {\n const group = groups[column];\n const previous = runs[runs.length - 1];\n if (previous && previous.group === group) previous.length += 1;\n else runs.push({ group, start: index, length: 1 });\n });\n const regionFrames = runs.map(({ group, start, length }, index) => (\n <rect key={`rf-${index}`} x={startX + start * cell + 0.7} y={startY + start * cell + 0.7} width={length * cell - 1.4} height={length * cell - 1.4} fill=\"none\" stroke={sterlingChartColors[group]} strokeWidth={sterlingVisualStyle.stroke.series} />\n ));\n\n // Dendrograms\n const topMarks: ReactElement[] = [];\n let topKey = 0;\n const renderTop = (node: ClusterNode): { x: number; y: number } => {\n if (!node.left) return { x: columnCenter(visibleIndex.get(node.members[0]) as number), y: 75 };\n const l = renderTop(node.left);\n const r = renderTop(node.right as ClusterNode);\n const y = 75 - (node.height / maxHeight) * 55;\n const x = (l.x + r.x) / 2;\n topMarks.push(<path key={`tm-${topKey++}`} d={`M${l.x} ${l.y} V${y}`} fill=\"none\" stroke={branchColor(node.left)} strokeWidth={sterlingVisualStyle.stroke.grid} />);\n topMarks.push(<path key={`tm-${topKey++}`} d={`M${r.x} ${r.y} V${y}`} fill=\"none\" stroke={branchColor(node.right as ClusterNode)} strokeWidth={sterlingVisualStyle.stroke.grid} />);\n topMarks.push(<path key={`tm-${topKey++}`} d={`M${l.x} ${y} H${r.x}`} fill=\"none\" stroke={branchColor(node)} strokeWidth={sterlingVisualStyle.stroke.grid} />);\n return { x, y };\n };\n renderTop(tree);\n\n const leftMarks: ReactElement[] = [];\n let leftKey = 0;\n const renderLeft = (node: ClusterNode): { x: number; y: number } => {\n if (!node.left) return { x: 121, y: rowCenter(visibleIndex.get(node.members[0]) as number) };\n const l = renderLeft(node.left);\n const r = renderLeft(node.right as ClusterNode);\n const x = 121 - (node.height / maxHeight) * 78;\n const y = (l.y + r.y) / 2;\n leftMarks.push(<path key={`lm-${leftKey++}`} d={`M${l.x} ${l.y} H${x}`} fill=\"none\" stroke={branchColor(node.left)} strokeWidth={sterlingVisualStyle.stroke.grid} />);\n leftMarks.push(<path key={`lm-${leftKey++}`} d={`M${r.x} ${r.y} H${x}`} fill=\"none\" stroke={branchColor(node.right as ClusterNode)} strokeWidth={sterlingVisualStyle.stroke.grid} />);\n leftMarks.push(<path key={`lm-${leftKey++}`} d={`M${x} ${l.y} V${r.y}`} fill=\"none\" stroke={branchColor(node)} strokeWidth={sterlingVisualStyle.stroke.grid} />);\n return { x, y };\n };\n renderLeft(tree);\n\n const rowLabels = order.map((row, visible) => (\n <text key={`rl-${visible}`} x={startX + matrixSize + 7} y={startY + visible * cell + 6.3} fill={muted} fontSize=\"6\" fontFamily=\"var(--font-mono)\">{`${types[groups[row]]} ${row % 4 + 1}`}</text>\n ));\n\n const legendStops = Array.from({ length: 21 }, (_, index) => {\n const value = -1 + (index / 20) * 2;\n return <rect key={`ls-${index}`} x={132 + index * 5} y=\"394\" width=\"5.2\" height=\"8\" fill={divergentSignedColor(value, 1)} />;\n });\n\n // The cancer-type key already lives in the figure subtitle, so the chart only\n // carries the correlation color scale.\n return <svg className=\"sterling-chart\" viewBox=\"0 0 600 416\" role=\"img\" aria-label={ariaLabel}>\n {topMarks}\n {leftMarks}\n {topAnnotations}\n {leftAnnotations}\n {cells}\n {regionFrames}\n {rowLabels}\n {legendStops}\n <text x=\"126\" y=\"401\" textAnchor=\"end\" fill={muted} fontSize=\"6.4\" fontFamily=\"var(--font-mono)\">-1</text>\n <text x=\"242\" y=\"401\" fill={muted} fontSize=\"6.4\" fontFamily=\"var(--font-mono)\">+1 r</text>\n </svg>;\n}\n\nexport function SterlingGeoMapChart({ atlas, rows, ariaLabel }: { atlas:unknown; rows:Array<{state:string;id:number;engineers:number}>; ariaLabel:string }) {\n const topology=atlas as {objects:{states:never}};\n const collection=feature(atlas as never,topology.objects.states) as unknown as GeoJSON.FeatureCollection;\n const projection=geoAlbersUsa().fitSize([620,286],collection);\n const path=geoPath(projection); const valueById=new Map(rows.map(row=>[row.id,row])); const maximum=Math.max(...rows.map(row=>row.engineers));\n return <svg className=\"sterling-chart\" viewBox=\"0 0 720 390\" role=\"img\" aria-label={ariaLabel}>\n <g transform=\"translate(50 18)\">{collection.features.map((state,index)=>{const id=Number(state.id),row=valueById.get(id),value=row?.engineers??0,colorIndex=Math.min(9,Math.max(0,Math.round(value/maximum*9)));return <path key={id||index} d={path(state)??undefined} fill={sterlingSequentialColors[colorIndex]} stroke={surface} strokeWidth={sterlingVisualStyle.stroke.grid}><title>{`${row?.state??`State ${id}`}: ${(value*100).toFixed(2)}%`}</title></path>;})}</g>\n <text x=\"132\" y=\"342\" textAnchor=\"end\" fill={muted} fontSize=\"9\" fontFamily=\"var(--font-mono)\">0%</text>{sterlingSequentialColors.map((color,index)=><rect key={color} x={142+index*40} y=\"330\" width=\"40\" height=\"14\" fill={color}/>)}<text x=\"552\" y=\"342\" fill={muted} fontSize=\"9\" fontFamily=\"var(--font-mono)\">{(maximum*100).toFixed(2)}%</text>\n <text x=\"360\" y=\"370\" textAnchor=\"middle\" fill={muted} fontSize=\"10\" fontFamily=\"var(--font-mono)\">engineers as share of population / proporción de ingenieros</text>\n </svg>;\n}\n","import { defineSterlingPalette, type SterlingPalette, type SterlingSurfacePalette } from \"./palette\";\n\nexport type TailwindStep = 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | 950;\nexport type TailwindScale = Partial<Record<TailwindStep, string>>;\n\nexport interface TailwindSterlingPaletteOptions {\n /** Eight or fewer Tailwind color scales. Their 500 stops become categories. */\n categorical: readonly TailwindScale[];\n /** Use your own surfaces so text and grid contrast remain intentional. */\n surface: SterlingSurfacePalette;\n divergent?: TailwindScale;\n heat?: TailwindScale;\n}\n\nconst orderedStops: TailwindStep[] = [100, 200, 300, 400, 500, 600, 700, 800, 900, 950];\nconst rampStops: TailwindStep[] = [200, 300, 400, 500, 600, 700, 800];\n\nfunction at(scale: TailwindScale, stop: TailwindStep, fallback: string) {\n return scale[stop] ?? fallback;\n}\n\n/**\n * Convert Tailwind-like 100–950 scales into Sterling's palette contract\n * without making Tailwind a runtime dependency.\n */\nexport function createTailwindSterlingPalette({\n categorical,\n surface,\n divergent,\n heat,\n}: TailwindSterlingPaletteOptions): SterlingPalette {\n const first = categorical[0] ?? {};\n const categoricalValues = categorical.map((scale) => at(scale, 500, \"currentColor\"));\n\n return defineSterlingPalette({\n surface,\n categorical: categoricalValues,\n legend: categorical.map((scale) => at(scale, 700, at(scale, 500, \"currentColor\"))),\n sequential: orderedStops.map((stop) => at(first, stop, at(first, 500, \"currentColor\"))),\n divergent: orderedStops.map((stop) => at(divergent ?? first, stop, at(first, 500, \"currentColor\"))),\n heat: orderedStops.concat(950).map((stop) => at(heat ?? first, stop, at(first, 500, \"currentColor\"))).slice(0, 11),\n ramps: categorical.map((scale) => rampStops.map((stop) => at(scale, stop, at(scale, 500, \"currentColor\")))),\n });\n}\n","import type { ElementType } from \"react\";\nimport { SterlingFigure, type SterlingFigureProps } from \"./SterlingFigure\";\nimport { SterlingInlineLegend } from \"./SterlingLegend\";\nimport {\n SterlingBarChart,\n SterlingBoxPlot,\n SterlingChordChart,\n SterlingCorrelogram,\n SterlingDensityChart,\n SterlingDonutChart,\n SterlingDumbbellChart,\n SterlingHeatmap,\n SterlingHistogram,\n SterlingLineChart,\n SterlingLollipopChart,\n SterlingPieChart,\n SterlingSankeyChart,\n SterlingScatterPlot,\n SterlingSequentialSurface,\n SterlingViolinPlot,\n} from \"./charts\";\nimport {\n SterlingCandlestickChart,\n SterlingDensity2DChart,\n SterlingDendrogramChart,\n SterlingExpressionChart,\n SterlingGeoMapChart,\n SterlingManhattanChart,\n SterlingNetworkChart,\n SterlingRadarChart,\n SterlingRidgelineChart,\n SterlingTreemapChart,\n SterlingVerticalBarChart,\n SterlingVolcanoChart,\n} from \"./canonicalCharts\";\nimport type { SterlingLocale } from \"./types\";\n\ntype FigureDefaults = Partial<\n Pick<SterlingFigureProps, \"palette\" | \"signature\" | \"sourceLabel\" | \"titleMarkHref\" | \"editorial\">\n>;\n\nexport interface CreateSterlingMdxComponentsOptions {\n locale?: SterlingLocale;\n figureDefaults?: FigureDefaults;\n /** Register project-specific figures without modifying Sterling itself. */\n additionalComponents?: Record<string, ElementType>;\n}\n\n/**\n * Build a portable MDX component registry. A consuming site supplies locale,\n * optional figure defaults, and its own dataset-backed figure components once.\n */\nexport function createSterlingMdxComponents({\n locale = \"en\",\n figureDefaults,\n additionalComponents,\n}: CreateSterlingMdxComponentsOptions = {}) {\n return {\n SterlingFigure: (props: Omit<SterlingFigureProps, \"locale\">) => (\n <SterlingFigure {...figureDefaults} {...props} locale={locale} />\n ),\n SterlingInlineLegend,\n SterlingBarChart,\n SterlingVerticalBarChart,\n SterlingCandlestickChart,\n SterlingScatterPlot,\n SterlingLineChart,\n SterlingHeatmap,\n SterlingHistogram,\n SterlingBoxPlot,\n SterlingChordChart,\n SterlingDumbbellChart,\n SterlingDensityChart,\n SterlingDensity2DChart,\n SterlingDendrogramChart,\n SterlingViolinPlot,\n SterlingDonutChart,\n SterlingLollipopChart,\n SterlingPieChart,\n SterlingSankeyChart,\n SterlingRadarChart,\n SterlingRidgelineChart,\n SterlingTreemapChart,\n SterlingNetworkChart,\n SterlingVolcanoChart,\n SterlingManhattanChart,\n SterlingExpressionChart,\n SterlingGeoMapChart,\n SterlingSequentialSurface,\n SterlingCorrelogram,\n ...additionalComponents,\n };\n}\n"],"mappings":"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","names":["jsx","jsxs","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","_","jsx","jsxs","correlation","L","R","surface","jsx"]}