Skip to content

nteract/semiotic

v3.5.3 Feature

This release adds 3 notable features for engineering teams evaluating rollout.

Published 16d MCP Data & Storage
✓ No known CVEs patched
Read the diff → Tool health → What is this tool? →

✓ No known CVEs patched in this version

Topics

ai d3 data-visualization nteract react streaming
+1 more
visualization

Summary

AI summary

DifferenceChart adds A/B comparison with interpolated crossover fill; axisExtent exact pins ticks to data min/max.

Changes in this release

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 (seriesAColor where A > B, seriesBColor where 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 via showLines (default true). Renders through chartType: "mixed" with the segment groups in areaGroups — 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.
  • axisExtent prop 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 skips extentPadding so the domain reflects the literal data bounds, not a padded version — explicit tickValues, xExtent/yExtent/rExtent still win over both modes. Three demos at /features/axes#axis-extent (temporal LineChart, Scatterplot, SwarmPlot). Centralized equidistantTicks + ticksForMode helpers in src/components/charts/shared/axisExtent.ts.
  • roundedTop on 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 new cornerRadii?: { tl, tr, br, bl } field on RectSceneNode and shared shape utilities in src/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.
  • buildHistogramTooltip helper — histogram-specific default tooltip for RealtimeHistogram, sibling to buildWaterfallTooltip / buildHeatmapTooltip. Surfaces range: <binStart>–<binEnd>, count: <total>, and category: <category> instead of the canonical x:/y: shape, which produced empty strings on aggregated bin datums. Falls back to the canonical shape when a non-binned datum sneaks through.
  • tickValues on XY axes (frameProps.axes[i].tickValues) — explicit per-axis tick positions, mirroring the ordinal frame's rTickValues. Previously the field appeared in the docs and the docs LiveExample but was silently ignored by SVGOverlay's tick computation; now it bypasses both d3's "nice" generator and axisExtent: "exact" and wins over includeMax. Pixel-distance filtering still drops overlapping labels. Accepts Array<number | Date>. Pinning regression test in SVGOverlay.tickValues.test.tsx.
  • ProcessSankey systemInTimeAccessor / systemOutTimeAccessor and showLabels — 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/blog now 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 fillsareaCanvasRenderer.ts now resolves style.fill through the existing resolveCanvasFill helper (same primitive bars use), so var(--…) 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 with var(--…) fills.
  • DifferenceChart accessor coercionxAccessor / seriesAAccessor / seriesBAccessor outputs now flow through a toNumber coercer that handles Date (→ getTime() ms) and numeric strings ("5"5) before the Number.isFinite filter. Previously, time-series data (Date objects in xAccessor) 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 a useRef-backed live buffer and return them synchronously at call time. The earlier pattern built results inside the setState updater, which could return empty arrays under React 18+ concurrent batching if the updater was deferred or replayed.
  • DifferenceChart bounded push buffer — new top-level windowSize prop 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 previous frameProps.windowSize recommendation 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 stubsrenderChart("ProcessSankey", …) now threads systemInTimeAccessor and systemOutTimeAccessor into 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

  • extentPadding skipped in axisExtent="exact" mode — both PipelineStore and OrdinalPipelineStore now treat extentPadding as 0 when config.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 centralizedhasAnyCornerRadius and corner-clamping logic extracted from barCanvasRenderer.ts and SceneToSVG.tsx to a shared cornerRadii.ts module. Each renderer keeps its own path-tracing primitives (arcTo vs SVG A); the geometry agrees by construction.
  • Capability matrix regenerated and release-gatedai/capabilities.json and docs/capabilities.md now index all 45 chart schemas, including DifferenceChart; QuadrantChart is marked supportsSSR: true to match its renderChart registration; check:capabilities is wired into CI, release:check, and prepublishOnly.
  • Blog registry drift is release-gated — new check:blog-entries keeps docs/src/blog/entries.js and entries-meta.js in sync, and runs during website:build, CI, release:check, and prepublishOnly.
  • 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

Track nteract/semiotic

Get notified when new releases ship.

Sign up free

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.

All releases →

Related context

Earlier breaking changes

  • v3.6.0 Changes DifferenceChart to accept 2+ series via top‑2 subselection, adding caveats for extra series.
  • v3.6.0 Changes AreaChart to a single‑series chart; multi‑series inputs are subselected.

Beta — feedback welcome: [email protected]