This release adds 3 notable features for engineering teams evaluating rollout.
✓ No known CVEs patched in this version
Topics
+1 more
Summary
AI summaryDifferenceChart adds A/B comparison with interpolated crossover fill; axisExtent exact pins ticks to data min/max.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| Feature | Medium |
`DifferenceChart` (XY) provides two-series A/B comparison chart with color-switching fill between series. `DifferenceChart` (XY) provides two-series A/B comparison chart with color-switching fill between series. Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Feature | Medium |
`axisExtent` prop on XY and ordinal HOCs toggles between "nice" and "exact" tick modes. `axisExtent` prop on XY and ordinal HOCs toggles between "nice" and "exact" tick modes. Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Feature | Medium |
SwimlaneChart now supports `roundedTop` for pixel‑radius rounding of outer lane corners. SwimlaneChart now supports `roundedTop` for pixel‑radius rounding of outer lane corners. Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Feature | Medium |
`buildHistogramTooltip` helper adds histogram‑specific tooltip with range, count, and category info. `buildHistogramTooltip` helper adds histogram‑specific tooltip with range, count, and category info. Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Feature | Medium |
XY axes accept explicit `tickValues` prop to set per‑axis tick positions. XY axes accept explicit `tickValues` prop to set per‑axis tick positions. Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Feature | Medium |
ProcessSankey gains `systemInTimeAccessor`, `systemOutTimeAccessor`, and `showLabels` for edge lifecycle timestamps and label control. ProcessSankey gains `systemInTimeAccessor`, `systemOutTimeAccessor`, and `showLabels` for edge lifecycle timestamps and label control. Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Feature | Medium |
Docs blog now includes article, index routes, Atom feed, social cards, prerender metadata, and seven launch entries. Docs blog now includes article, index routes, Atom feed, social cards, prerender metadata, and seven launch entries. Source: granite4.1:8b-q6_K@2026-05-19 Confidence: low |
— |
| Performance | Medium |
`extentPadding` ignored in `axisExtent= `extentPadding` ignored in `axisExtent= Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Bugfix | Medium |
Area canvas renderer now resolves CSS‑variable fills (`var(--…)`) correctly. Area canvas renderer now resolves CSS‑variable fills (`var(--…)`) correctly. Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Bugfix | Medium |
DifferenceChart accessor coercion handles Date and numeric string inputs before filtering. DifferenceChart accessor coercion handles Date and numeric string inputs before filtering. Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Bugfix | Medium |
DifferenceChart crossover detection now tracks last valid point across non‑finite rows. DifferenceChart crossover detection now tracks last valid point across non‑finite rows. Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Bugfix | Medium |
DifferenceChart `remove()` and `update()` methods return results synchronously at call time. DifferenceChart `remove()` and `update()` methods return results synchronously at call time. Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Bugfix | Medium |
DifferenceChart push buffer now capped with `windowSize` prop to prevent unbounded row accumulation. DifferenceChart push buffer now capped with `windowSize` prop to prevent unbounded row accumulation. Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Bugfix | Medium |
ProcessSankey hover, tooltip, and SSR parity fixed for lifecycle stubs and date handling. ProcessSankey hover, tooltip, and SSR parity fixed for lifecycle stubs and date handling. Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Bugfix | Medium |
Blog metadata corrected for UTC midnight formatting and absolute Atom feed link. Blog metadata corrected for UTC midnight formatting and absolute Atom feed link. Source: granite4.1:8b-q6_K@2026-05-19 Confidence: low |
— |
Full changelog
Added
DifferenceChart(XY) — two-series A/B comparison chart that fills the area between two series with a color that switches at each crossover (seriesAColorwhere A > B,seriesBColorwhere B > A). Crossover x-values are linearly interpolated so adjacent segments meet at zero-width vertices (no jagged seams). Both series can be drawn as overlay lines on top of the fill viashowLines(defaulttrue). Renders throughchartType: "mixed"with the segment groups inareaGroups— single frame, single set of scales, perfect geometric alignment between fill and overlay. Push API supported (HOC owns internal raw-data state; push triggers segment recomputation). Classic uses: temperature anomaly, forecast vs. actual, budget variance, any A/B comparison where the direction of the difference is the message. Live demos + Quick Start streaming toggle at/charts/difference-chart. New SSR config + validation map entry + chartSpecs entry → schema regenerated.axisExtentprop on all XY and ordinal HOCs —"nice"(default, current behavior) uses d3-scale's rounded tick generator;"exact"pins the first and last tick to the literal data min/max with equidistant intermediate ticks. Applies to XY x/y axes and the ordinal value (r) axis only; no-op on network/geo/hierarchy. In exact mode the pipeline ALSO skipsextentPaddingso the domain reflects the literal data bounds, not a padded version — explicittickValues,xExtent/yExtent/rExtentstill win over both modes. Three demos at/features/axes#axis-extent(temporal LineChart, Scatterplot, SwarmPlot). CentralizedequidistantTicks+ticksForModehelpers insrc/components/charts/shared/axisExtent.ts.roundedTopon SwimlaneChart — pixel radius rounds the outermost ends of each lane (left+right for horizontal, top+bottom for vertical). Middle segments stay square so adjacent pieces butt against each other; single-segment lanes round all four corners. Implemented via a newcornerRadii?: { tl, tr, br, bl }field onRectSceneNodeand shared shape utilities insrc/components/stream/renderers/cornerRadii.ts(canvas and SVG renderers share the geometry; each owns its drawing language). Live demo at/charts/swimlane-chart#rounded-corners.buildHistogramTooltiphelper — histogram-specific default tooltip forRealtimeHistogram, sibling tobuildWaterfallTooltip/buildHeatmapTooltip. Surfacesrange: <binStart>–<binEnd>,count: <total>, andcategory: <category>instead of the canonicalx:/y:shape, which produced empty strings on aggregated bin datums. Falls back to the canonical shape when a non-binned datum sneaks through.tickValueson XY axes (frameProps.axes[i].tickValues) — explicit per-axis tick positions, mirroring the ordinal frame'srTickValues. Previously the field appeared in the docs and the docs LiveExample but was silently ignored bySVGOverlay's tick computation; now it bypasses both d3's "nice" generator andaxisExtent: "exact"and wins overincludeMax. Pixel-distance filtering still drops overlapping labels. AcceptsArray<number | Date>. Pinning regression test inSVGOverlay.tickValues.test.tsx.- ProcessSankey
systemInTimeAccessor/systemOutTimeAccessorandshowLabels— optional per-edge lifecycle timestamps let a source band show mass waiting before the edge departs and a target band show mass retained after the edge arrives. The band outline now extends to those lifecycle bounds and paints per-edge gradient stubs;showLabels={false}suppresses dense band labels without dropping the legend. The docs page adds a helpdesk-ticket example plus the Process Sankey vs. classic Sankey recipe. - Docs blog —
/blognow has article and index routes, a distinct no-sidebar shell, Atom feed generation, social-card generation, route prerender metadata, and seven launch entries covering release notes, chart explainers, and case studies.
Fixed
- Area canvas renderer respects CSS-variable fills —
areaCanvasRenderer.tsnow resolvesstyle.fillthrough the existingresolveCanvasFillhelper (same primitive bars use), sovar(--…)references resolve from the canvas DOM ancestor. Previously the fill path skipped this resolution while the stroke path included it — passing a CSS variable as the area fill produced no visible color (canvas silently rejects unresolved CSS vars) and the gradient path fell back to the sentinel blue regardless of the requested color. Affects any chart that emits area-type scene nodes withvar(--…)fills. - DifferenceChart accessor coercion —
xAccessor/seriesAAccessor/seriesBAccessoroutputs now flow through atoNumbercoercer that handlesDate(→getTime()ms) and numeric strings ("5"→5) before theNumber.isFinitefilter. Previously, time-series data (Date objects inxAccessor) and CSV-style numeric strings were silently dropped at the segment-algorithm guard, producing an empty chart. - DifferenceChart crossover detection across non-finite rows — the segment algorithm now tracks the last VALID point (not
sorted[i - 1]) for crossover comparison, so a NaN gap between two valid rows no longer suppresses the segment break that should sit between them. - DifferenceChart
remove()/update()synchronous return values — both methods compute results from auseRef-backed live buffer and return them synchronously at call time. The earlier pattern built results inside thesetStateupdater, which could return empty arrays under React 18+ concurrent batching if the updater was deferred or replayed. - DifferenceChart bounded push buffer — new top-level
windowSizeprop caps the raw-row buffer with FIFO eviction. Long-running streams no longer accumulate unbounded rows that the segment algorithm has to re-sort and re-segment on every render. The previousframeProps.windowSizerecommendation in the docs had no effect (the underlying frame receives static data from this chart, not streaming inputs), so the docs streaming example and Quick Start were updated to use the new prop. - ProcessSankey hover and tooltip regressions — decorative gradient stubs opt out of hit testing, filled bezier-body hits now return finite pointer coordinates for ProcessSankey's custom datum shape, and the default tooltip no longer turns short numeric domains (day/month indices) into 1970 dates.
- ProcessSankey SSR parity for lifecycle stubs —
renderChart("ProcessSankey", …)now threadssystemInTimeAccessorandsystemOutTimeAccessorinto the shared scene builder, so static SVG output uses the same lifecycle band bounds as the client HOC. - Blog metadata correctness — blog entry dates are formatted at UTC midnight so US timezones do not display the previous day, and the Atom feed link is absolute so prerendered nested routes do not point at
/charts/blog/feed.xml.
Changed
extentPaddingskipped inaxisExtent="exact"mode — bothPipelineStoreandOrdinalPipelineStorenow treatextentPaddingas 0 whenconfig.axisExtent === "exact", so the scale domain pins to the literal data min/max and the first/last ticks read as the actual bounds. Trade-off documented: glyphs at the extremes can sit at the plot edge in exact mode. Default"nice"keeps the existing padded domain.- Per-corner radius geometry centralized —
hasAnyCornerRadiusand corner-clamping logic extracted frombarCanvasRenderer.tsandSceneToSVG.tsxto a sharedcornerRadii.tsmodule. Each renderer keeps its own path-tracing primitives (arcTovs SVGA); the geometry agrees by construction. - Capability matrix regenerated and release-gated —
ai/capabilities.jsonanddocs/capabilities.mdnow index all 45 chart schemas, includingDifferenceChart;QuadrantChartis markedsupportsSSR: trueto match itsrenderChartregistration;check:capabilitiesis wired into CI,release:check, andprepublishOnly. - Blog registry drift is release-gated — new
check:blog-entrieskeepsdocs/src/blog/entries.jsandentries-meta.jsin sync, and runs duringwebsite:build, CI,release:check, andprepublishOnly. - Server-rendered QuadrantChart officially supported — the SSR config emits quadrant fills, centerlines, and labels via
svgPreRenderers, which also powers the QuadrantChart blog OG card.
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About nteract/semiotic
React data visualization MCP server with 30+ chart types. 5 tools: suggest charts for a dataset, render validated React configs to SVG, diagnose configuration anti-patterns, get component schemas, and report issues.
Related context
Related tools
Beta — feedback welcome: [email protected]