@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.
- package/LICENSE +21 -0
- package/README.md +336 -0
- package/assets/fonts/Fraunces-SemiBold.ttf +0 -0
- package/assets/fonts/JetBrainsMono-Regular.ttf +0 -0
- package/assets/fonts/NOTICE.md +12 -0
- package/assets/fonts/OFL-1.1.txt +79 -0
- package/dist/editorial.css +27 -0
- package/dist/index.d.mts +582 -0
- package/dist/index.d.ts +582 -0
- package/dist/index.js +2005 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +1912 -0
- package/dist/index.mjs.map +1 -0
- package/dist/server.d.mts +505 -0
- package/dist/server.d.ts +505 -0
- package/dist/server.js +1666 -0
- package/dist/server.js.map +1 -0
- package/dist/server.mjs +1575 -0
- package/dist/server.mjs.map +1 -0
- package/dist/styles.css +101 -0
- package/package.json +79 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../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":["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":["jsx","jsxs","jsx","jsxs","_","jsx","jsxs","correlation","L","R","jsxs","surface"]}
|
package/dist/styles.css
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Sterling's self-contained figure surface.
|
|
3
|
+
* Override any --sterling-* variable on a figure, or pass `palette` to
|
|
4
|
+
* SterlingFigure. Consumers provide their own font files; these fallbacks
|
|
5
|
+
* make the package legible out of the box.
|
|
6
|
+
*/
|
|
7
|
+
.sterling-figure {
|
|
8
|
+
--font-display: var(--sterling-font-display, Georgia, serif);
|
|
9
|
+
--font-sans: var(--sterling-font-sans, Inter, ui-sans-serif, system-ui, sans-serif);
|
|
10
|
+
--font-mono: var(--sterling-font-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace);
|
|
11
|
+
--sterling-paper: #f6f3fb;
|
|
12
|
+
--sterling-surface: #fbf9fe;
|
|
13
|
+
--sterling-surface-2: #e2dbf0;
|
|
14
|
+
--sterling-text: #241a3d;
|
|
15
|
+
--sterling-muted: #5c5178;
|
|
16
|
+
--sterling-grid: #d9d1e6;
|
|
17
|
+
--sterling-edge: #cfc5de;
|
|
18
|
+
--sterling-period: #7c5ce0;
|
|
19
|
+
--sterling-cat-1: #9a79e7; --sterling-cat-2: #25a08d; --sterling-cat-3: #d45ac7; --sterling-cat-4: #e4a43a;
|
|
20
|
+
--sterling-cat-5: #5a83d7; --sterling-cat-6: #e87864; --sterling-cat-7: #96ab51; --sterling-cat-8: #536b78;
|
|
21
|
+
--sterling-legend-1: #6945b8; --sterling-legend-2: #147568; --sterling-legend-3: #a43a99; --sterling-legend-4: #855700;
|
|
22
|
+
--sterling-legend-5: #365da5; --sterling-legend-6: #a94230; --sterling-legend-7: #5d6f19; --sterling-legend-8: #445762;
|
|
23
|
+
--sterling-seq-1: #f1ecfa; --sterling-seq-2: #d5c3f6; --sterling-seq-3: #b69af2; --sterling-seq-4: #a889ed; --sterling-seq-5: #9a79e7;
|
|
24
|
+
--sterling-seq-6: #8e68d8; --sterling-seq-7: #7b59bc; --sterling-seq-8: #684aa1; --sterling-seq-9: #563c87; --sterling-seq-10: #4d357a;
|
|
25
|
+
--sterling-div-1: #4d357a; --sterling-div-2: #7b59bc; --sterling-div-3: #9a79e7; --sterling-div-4: #b69af2; --sterling-div-5: #f1ecfa;
|
|
26
|
+
--sterling-div-6: #f6f3fb; --sterling-div-7: #e4f4ef; --sterling-div-8: #5ec9ae; --sterling-div-9: #25a08d; --sterling-div-10: #1e796c; --sterling-div-11: #164d47;
|
|
27
|
+
--sterling-heat-1: #4d357a; --sterling-heat-2: #684aa1; --sterling-heat-3: #4666af; --sterling-heat-4: #4f73c6; --sterling-heat-5: #218c7c;
|
|
28
|
+
--sterling-heat-6: #4e9670; --sterling-heat-7: #879347; --sterling-heat-8: #b0953a; --sterling-heat-9: #d39a32; --sterling-heat-10: #e4b85c; --sterling-heat-11: #f5dea0;
|
|
29
|
+
--sterling-ramp-1-1: #d5c3f6; --sterling-ramp-1-2: #b69af2; --sterling-ramp-1-3: #a889ed; --sterling-ramp-1-4: #9a79e7; --sterling-ramp-1-5: #8e68d8; --sterling-ramp-1-6: #7b59bc; --sterling-ramp-1-7: #684aa1;
|
|
30
|
+
--sterling-ramp-2-1: #a6dfce; --sterling-ramp-2-2: #5ec9ae; --sterling-ramp-2-3: #44b49d; --sterling-ramp-2-4: #25a08d; --sterling-ramp-2-5: #218c7c; --sterling-ramp-2-6: #1e796c; --sterling-ramp-2-7: #1b675d;
|
|
31
|
+
--sterling-ramp-3-1: #f2bae9; --sterling-ramp-3-2: #e88bdd; --sterling-ramp-3-3: #de73d2; --sterling-ramp-3-4: #d45ac7; --sterling-ramp-3-5: #c653bc; --sterling-ramp-3-6: #ac4aa4; --sterling-ramp-3-7: #93428c;
|
|
32
|
+
--sterling-ramp-4-1: #f8daa3; --sterling-ramp-4-2: #f2c46d; --sterling-ramp-4-3: #ebb454; --sterling-ramp-4-4: #e4a43a; --sterling-ramp-4-5: #d39a32; --sterling-ramp-4-6: #b7822a; --sterling-ramp-4-7: #9b6b23;
|
|
33
|
+
--sterling-ramp-5-1: #bacbf1; --sterling-ramp-5-2: #86a8e8; --sterling-ramp-5-3: #7195e0; --sterling-ramp-5-4: #5a83d7; --sterling-ramp-5-5: #4f73c6; --sterling-ramp-5-6: #4666af; --sterling-ramp-5-7: #3d5a99;
|
|
34
|
+
--sterling-ramp-6-1: #f9c2b6; --sterling-ramp-6-2: #f29a88; --sterling-ramp-6-3: #ed8976; --sterling-ramp-6-4: #e87864; --sterling-ramp-6-5: #dc6a55; --sterling-ramp-6-6: #be5c4b; --sterling-ramp-6-7: #a14f42;
|
|
35
|
+
--sterling-ramp-7-1: #d4ddaa; --sterling-ramp-7-2: #b7c974; --sterling-ramp-7-3: #a6ba62; --sterling-ramp-7-4: #96ab51; --sterling-ramp-7-5: #879347; --sterling-ramp-7-6: #747f3e; --sterling-ramp-7-7: #616c35;
|
|
36
|
+
--sterling-ramp-8-1: #d0dce2; --sterling-ramp-8-2: #b7c8d1; --sterling-ramp-8-3: #8ba0ab; --sterling-ramp-8-4: #607986; --sterling-ramp-8-5: #536b78; --sterling-ramp-8-6: #475c68; --sterling-ramp-8-7: #3a4e59;
|
|
37
|
+
--sterling-pad: clamp(1.15rem, 3vw, 2rem);
|
|
38
|
+
width: 100%; max-width: none; margin-block: 2.5rem; color: var(--sterling-text);
|
|
39
|
+
font-family: var(--font-sans);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
[data-sterling-theme="dark"] .sterling-figure, .sterling-theme-dark .sterling-figure {
|
|
43
|
+
--sterling-paper: #120d1f; --sterling-surface: #1d1530; --sterling-surface-2: #271c40; --sterling-text: #ede9f5;
|
|
44
|
+
--sterling-muted: #a99fc4; --sterling-grid: #36284e; --sterling-edge: #3a2b55; --sterling-period: #c4b5fd;
|
|
45
|
+
--sterling-cat-1: #b69af2; --sterling-cat-2: #5ec9ae; --sterling-cat-3: #e88bdd; --sterling-cat-4: #f2c46d;
|
|
46
|
+
--sterling-cat-5: #86a8e8; --sterling-cat-6: #f29a88; --sterling-cat-7: #b7c974; --sterling-cat-8: #b7c8d1;
|
|
47
|
+
--sterling-legend-1: #c7b3f7; --sterling-legend-2: #78d8c1; --sterling-legend-3: #f0a0e7; --sterling-legend-4: #f5cb7c;
|
|
48
|
+
--sterling-legend-5: #9bb9ef; --sterling-legend-6: #f6aa9a; --sterling-legend-7: #c5d486; --sterling-legend-8: #c6d5dc;
|
|
49
|
+
--sterling-seq-1: #271c40; --sterling-seq-2: #4d357a; --sterling-seq-3: #563c87; --sterling-seq-4: #684aa1; --sterling-seq-5: #7b59bc;
|
|
50
|
+
--sterling-seq-6: #8e68d8; --sterling-seq-7: #9a79e7; --sterling-seq-8: #a889ed; --sterling-seq-9: #b69af2; --sterling-seq-10: #d5c3f6;
|
|
51
|
+
--sterling-div-1: #f1ecfa; --sterling-div-2: #b69af2; --sterling-div-3: #9a79e7; --sterling-div-4: #7b59bc; --sterling-div-5: #4d357a;
|
|
52
|
+
--sterling-div-6: #1d1530; --sterling-div-7: #164d47; --sterling-div-8: #1e796c; --sterling-div-9: #25a08d; --sterling-div-10: #5ec9ae; --sterling-div-11: #e4f4ef;
|
|
53
|
+
--sterling-heat-1: #271c40; --sterling-heat-2: #4d357a; --sterling-heat-3: #6a4eac; --sterling-heat-4: #5a83d7; --sterling-heat-5: #3b97b1;
|
|
54
|
+
--sterling-heat-6: #25a08d; --sterling-heat-7: #78ae65; --sterling-heat-8: #b7c974; --sterling-heat-9: #e6c45c; --sterling-heat-10: #f2c46d; --sterling-heat-11: #fae4ae;
|
|
55
|
+
--sterling-ramp-1-1: #684aa1; --sterling-ramp-1-2: #7b59bc; --sterling-ramp-1-3: #8e68d8; --sterling-ramp-1-4: #9a79e7; --sterling-ramp-1-5: #a889ed; --sterling-ramp-1-6: #b69af2; --sterling-ramp-1-7: #d5c3f6;
|
|
56
|
+
--sterling-ramp-2-1: #1b675d; --sterling-ramp-2-2: #1e796c; --sterling-ramp-2-3: #218c7c; --sterling-ramp-2-4: #25a08d; --sterling-ramp-2-5: #44b49d; --sterling-ramp-2-6: #5ec9ae; --sterling-ramp-2-7: #a6dfce;
|
|
57
|
+
--sterling-ramp-3-1: #93428c; --sterling-ramp-3-2: #ac4aa4; --sterling-ramp-3-3: #c653bc; --sterling-ramp-3-4: #d45ac7; --sterling-ramp-3-5: #de73d2; --sterling-ramp-3-6: #e88bdd; --sterling-ramp-3-7: #f2bae9;
|
|
58
|
+
--sterling-ramp-4-1: #9b6b23; --sterling-ramp-4-2: #b7822a; --sterling-ramp-4-3: #d39a32; --sterling-ramp-4-4: #e4a43a; --sterling-ramp-4-5: #ebb454; --sterling-ramp-4-6: #f2c46d; --sterling-ramp-4-7: #f8daa3;
|
|
59
|
+
--sterling-ramp-5-1: #3d5a99; --sterling-ramp-5-2: #4666af; --sterling-ramp-5-3: #4f73c6; --sterling-ramp-5-4: #5a83d7; --sterling-ramp-5-5: #7195e0; --sterling-ramp-5-6: #86a8e8; --sterling-ramp-5-7: #bacbf1;
|
|
60
|
+
--sterling-ramp-6-1: #a14f42; --sterling-ramp-6-2: #be5c4b; --sterling-ramp-6-3: #dc6a55; --sterling-ramp-6-4: #e87864; --sterling-ramp-6-5: #ed8976; --sterling-ramp-6-6: #f29a88; --sterling-ramp-6-7: #f9c2b6;
|
|
61
|
+
--sterling-ramp-7-1: #616c35; --sterling-ramp-7-2: #747f3e; --sterling-ramp-7-3: #879347; --sterling-ramp-7-4: #96ab51; --sterling-ramp-7-5: #a6ba62; --sterling-ramp-7-6: #b7c974; --sterling-ramp-7-7: #d4ddaa;
|
|
62
|
+
--sterling-ramp-8-1: #3a4e59; --sterling-ramp-8-2: #475c68; --sterling-ramp-8-3: #536b78; --sterling-ramp-8-4: #607986; --sterling-ramp-8-5: #8ba0ab; --sterling-ramp-8-6: #b7c8d1; --sterling-ramp-8-7: #d0dce2;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.sterling-figure[data-size="compact"] { max-width: 34rem; --sterling-pad: clamp(1rem, 2.5vw, 1.5rem); }
|
|
66
|
+
.sterling-figure[data-size="wide"] { max-width: 62rem; }
|
|
67
|
+
.sterling-figure[data-size="full"] { max-width: 72rem; }
|
|
68
|
+
.sterling-figure__inner { overflow: clip; border: 1px solid var(--sterling-edge); border-radius: .5rem; background: var(--sterling-paper); }
|
|
69
|
+
.sterling-figure__header { padding: var(--sterling-pad) var(--sterling-pad) 1rem; }
|
|
70
|
+
.sterling-figure__topline { display: flex; align-items: flex-start; justify-content: space-between; gap: .75rem; margin-bottom: 1.1rem; }
|
|
71
|
+
.sterling-figure__labels { display: flex; flex-wrap: wrap; gap: .45rem .8rem; align-items: center; font-family: var(--sterling-font-mono, ui-monospace, monospace); font-size: .68rem; line-height: 1.4; letter-spacing: .06em; text-transform: uppercase; }
|
|
72
|
+
.sterling-figure__labels span:first-child, .sterling-figure__period { color: var(--sterling-period); }
|
|
73
|
+
.sterling-figure__labels span:last-child { color: var(--sterling-muted); }
|
|
74
|
+
.sterling-figure__labels span + span::before { margin-right: .8rem; color: var(--sterling-edge); content: "/"; }
|
|
75
|
+
.sterling-figure__title { margin: 0; color: var(--sterling-text); font-family: var(--sterling-font-display, Georgia, serif); font-size: 1.5rem; font-weight: 500; line-height: 1.25; }
|
|
76
|
+
.sterling-figure__period { display: inline; text-decoration: none; }
|
|
77
|
+
.sterling-figure__subtitle { margin: .7rem 0 0; color: var(--sterling-muted); font-size: .875rem; line-height: 1.5rem; }
|
|
78
|
+
.sterling-inline-legend { margin-left: .34em; }
|
|
79
|
+
.sterling-inline-legend__item { display: inline-flex; gap: .3em; align-items: baseline; color: var(--sterling-legend-text); font-weight: 600; white-space: nowrap; }
|
|
80
|
+
.sterling-inline-legend__item svg { position: relative; top: .04em; width: .72em; height: .72em; overflow: visible; color: var(--sterling-legend-mark); fill: currentColor; }
|
|
81
|
+
.sterling-figure__chart { min-height: 12rem; border-block: 1px solid var(--sterling-edge); background: var(--sterling-surface); padding: clamp(.85rem, 2.6vw, 1.6rem) var(--sterling-pad); }
|
|
82
|
+
.sterling-chart { display: block; width: 100%; height: auto; overflow: visible; }
|
|
83
|
+
.sterling-figure__caption { display: flex; gap: .75rem 2rem; align-items: flex-start; justify-content: space-between; margin: 0; padding: .85rem var(--sterling-pad) 1rem; color: var(--sterling-muted); font-family: var(--sterling-font-mono, ui-monospace, monospace); font-size: .67rem; line-height: 1.5; }
|
|
84
|
+
.sterling-figure__caption-label, .sterling-figure__signature { color: var(--sterling-text); }
|
|
85
|
+
.sterling-figure__signature { flex: none; text-align: right; }
|
|
86
|
+
.sterling-figure__credit-link { color: inherit; text-decoration-color: color-mix(in srgb, currentColor 42%, transparent); text-underline-offset: .16em; }
|
|
87
|
+
.sterling-figure__credit-link:hover, .sterling-figure__credit-link:focus-visible { color: var(--sterling-period); text-decoration-color: currentColor; }
|
|
88
|
+
.sterling-figure__actions { display: flex; flex: none; gap: .3rem; }
|
|
89
|
+
.sterling-figure__actions :is(button, summary) { display: inline-flex; width: 2rem; height: 2rem; align-items: center; justify-content: center; border: 1px solid var(--sterling-edge); border-radius: .3rem; background: transparent; color: var(--sterling-muted); cursor: pointer; }
|
|
90
|
+
.sterling-figure__actions :is(button, summary):hover, .sterling-figure__actions :is(button, summary):focus-visible, .sterling-figure__action-menu[open] > summary { border-color: var(--sterling-period); background: color-mix(in srgb, var(--sterling-period) 8%, transparent); color: var(--sterling-period); }
|
|
91
|
+
.sterling-figure__actions :is(button, summary):focus-visible { outline: 2px solid var(--sterling-period); outline-offset: 2px; }
|
|
92
|
+
.sterling-figure__actions button:disabled { cursor: wait; opacity: .65; }
|
|
93
|
+
.sterling-figure__actions svg { width: .95rem; height: .95rem; stroke-width: 1.7; }
|
|
94
|
+
.sterling-figure__action-menu { position: relative; }
|
|
95
|
+
.sterling-figure__action-menu summary { list-style: none; }
|
|
96
|
+
.sterling-figure__action-menu summary::-webkit-details-marker { display: none; }
|
|
97
|
+
.sterling-figure__action-popover { position: absolute; z-index: 5; top: calc(100% + .35rem); right: 0; display: grid; min-width: 12.25rem; overflow: hidden; border: 1px solid var(--sterling-edge); border-radius: .35rem; background: var(--sterling-paper); box-shadow: 0 .6rem 1.5rem color-mix(in srgb, var(--sterling-text) 13%, transparent); padding: .25rem; }
|
|
98
|
+
.sterling-figure__actions .sterling-figure__action-popover button { display: flex; width: 100%; min-height: 2.2rem; height: auto; align-items: center; justify-content: flex-start; gap: .55rem; border-color: transparent; border-radius: .2rem; padding: .45rem .55rem; color: var(--sterling-text); font-family: var(--sterling-font-mono, ui-monospace, monospace); font-size: .64rem; line-height: 1.35; text-align: left; }
|
|
99
|
+
.sterling-figure__action-popover button svg { flex: none; color: var(--sterling-muted); }
|
|
100
|
+
@media (prefers-reduced-motion: no-preference) { .sterling-figure__actions :is(button, summary)[data-state="copying"] svg, .sterling-figure__actions :is(button, summary):disabled svg[data-lucide="loader-circle"], .sterling-figure__actions svg[data-lucide="loader-circle"] { animation: sterling-export-spin 800ms linear infinite; } @keyframes sterling-export-spin { to { transform: rotate(360deg); } } }
|
|
101
|
+
@media (max-width: 639px) { .sterling-figure__caption { flex-direction: column; } .sterling-figure__signature { text-align: left; } }
|
package/package.json
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@lamatemaga/sterling",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "A palette and React/MDX components for editorial data stories.",
|
|
5
|
+
"keywords": ["data-visualization", "react", "mdx", "d3", "charts", "editorial"],
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"homepage": "https://www.lamatemaga.com/sterling",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/LaMatemaga/sterling.git"
|
|
11
|
+
},
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/LaMatemaga/sterling/issues"
|
|
14
|
+
},
|
|
15
|
+
"engines": {
|
|
16
|
+
"node": ">=18.18"
|
|
17
|
+
},
|
|
18
|
+
"sideEffects": ["./dist/styles.css", "./dist/editorial.css"],
|
|
19
|
+
"files": ["dist", "assets/fonts"],
|
|
20
|
+
"main": "./dist/index.js",
|
|
21
|
+
"module": "./dist/index.mjs",
|
|
22
|
+
"types": "./dist/index.d.ts",
|
|
23
|
+
"exports": {
|
|
24
|
+
".": {
|
|
25
|
+
"types": "./dist/index.d.ts",
|
|
26
|
+
"import": "./dist/index.mjs",
|
|
27
|
+
"require": "./dist/index.js"
|
|
28
|
+
},
|
|
29
|
+
"./server": {
|
|
30
|
+
"types": "./dist/server.d.ts",
|
|
31
|
+
"import": "./dist/server.mjs",
|
|
32
|
+
"require": "./dist/server.js"
|
|
33
|
+
},
|
|
34
|
+
"./styles.css": "./dist/styles.css",
|
|
35
|
+
"./editorial.css": "./dist/editorial.css",
|
|
36
|
+
"./assets/fonts/*": "./assets/fonts/*"
|
|
37
|
+
},
|
|
38
|
+
"scripts": {
|
|
39
|
+
"build": "tsup --config tsup.config.ts && copyfiles -u 1 src/styles.css src/editorial.css dist",
|
|
40
|
+
"typecheck": "tsc --noEmit",
|
|
41
|
+
"lint": "tsc --noEmit",
|
|
42
|
+
"prepare": "npm run build",
|
|
43
|
+
"prepack": "npm run build",
|
|
44
|
+
"prepublishOnly": "npm run typecheck && npm run build",
|
|
45
|
+
"test:consumer": "node scripts/consumer-smoke.mjs"
|
|
46
|
+
},
|
|
47
|
+
"peerDependencies": {
|
|
48
|
+
"react": "^18.2.0 || ^19.0.0",
|
|
49
|
+
"react-dom": "^18.2.0 || ^19.0.0"
|
|
50
|
+
},
|
|
51
|
+
"dependencies": {
|
|
52
|
+
"d3-chord": "^3.0.1",
|
|
53
|
+
"d3-geo": "^3.1.1",
|
|
54
|
+
"d3-hierarchy": "^3.1.2",
|
|
55
|
+
"d3-sankey": "^0.12.3",
|
|
56
|
+
"d3-scale": "^4.0.2",
|
|
57
|
+
"d3-shape": "^3.2.0",
|
|
58
|
+
"html-to-image": "^1.11.13",
|
|
59
|
+
"lucide-react": "^0.468.0",
|
|
60
|
+
"topojson-client": "^3.1.0"
|
|
61
|
+
},
|
|
62
|
+
"devDependencies": {
|
|
63
|
+
"@types/d3-chord": "^3.0.6",
|
|
64
|
+
"@types/d3-geo": "^3.1.0",
|
|
65
|
+
"@types/d3-hierarchy": "^3.1.7",
|
|
66
|
+
"@types/d3-sankey": "^0.12.5",
|
|
67
|
+
"@types/d3-scale": "^4.0.9",
|
|
68
|
+
"@types/d3-shape": "^3.1.7",
|
|
69
|
+
"@types/react": "^19.0.0",
|
|
70
|
+
"@types/react-dom": "^19.0.0",
|
|
71
|
+
"@types/topojson-client": "^3.1.5",
|
|
72
|
+
"copyfiles": "^2.4.1",
|
|
73
|
+
"typescript": "^5.0.0",
|
|
74
|
+
"tsup": "^8.0.0"
|
|
75
|
+
},
|
|
76
|
+
"publishConfig": {
|
|
77
|
+
"access": "public"
|
|
78
|
+
}
|
|
79
|
+
}
|