@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/server.ts","../src/palette.ts","../src/SterlingLegend.tsx","../src/charts.tsx","../src/plot.tsx","../src/visualStyle.ts","../src/canonicalCharts.tsx","../src/dataExport.ts","../src/editorial.tsx","../src/tailwind.ts"],"sourcesContent":["/**\n * Server-safe Sterling exports.\n *\n * Use this entry in React Server Components when you only need palette helpers,\n * data utilities, static SVG primitives, or types. Interactive figure chrome\n * (copy, export, and share) intentionally lives in the package root, which is\n * a React client boundary.\n */\nexport * from \"./SterlingLegend\";\nexport * from \"./charts\";\nexport * from \"./canonicalCharts\";\nexport * from \"./palette\";\nexport * from \"./plot\";\nexport * from \"./types\";\nexport * from \"./dataExport\";\nexport * from \"./editorial\";\nexport * from \"./tailwind\";\nexport * from \"./visualStyle\";\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","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","/**\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 { 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"],"mappings":"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","names":["import_jsx_runtime","import_jsx_runtime","_","d3Chord","d3Arc","d3Ribbon","d3Sankey","import_jsx_runtime","correlation","L","R","import_jsx_runtime","surface"]}