Skip to content

nteract/semiotic

v3.5.4 Feature

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

Published 12d 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

ReleasePort's take

Light signal
editorial:auto 12d

Semiotic v3.5.4 adds several UI enhancements and a critical website build fix.

Why it matters: Patch to v3.5.4 immediately to resolve the website build failure caused by an unresolved Atom feed link; test new chart banding, tooltip auto‑inclusion, axis tick alignment, themable CSS variables, and HOC loadingContent in dev environments.

Summary

AI summary

Added asymmetric envelope band prop and tooltip enhancements for LineChart/AreaChart plus axis tick styling improvements.

Changes in this release

Feature Medium

Band prop added to LineChart, AreaChart, and StreamXYFrame for asymmetric min/max envelope drawing.

Band prop added to LineChart, AreaChart, and StreamXYFrame for asymmetric min/max envelope drawing.

Source: llm_adapter@2026-05-22

Confidence: high

Feature Medium

`tickAnchor: "edges"` option added to frameProps.axes for edge-aligned tick labels.

`tickAnchor: "edges"` option added to frameProps.axes for edge-aligned tick labels.

Source: llm_adapter@2026-05-22

Confidence: high

Feature Medium

Tooltip now automatically includes band values for each series.

Tooltip now automatically includes band values for each series.

Source: llm_adapter@2026-05-22

Confidence: low

Feature Medium

CSS custom properties `--semiotic-tick-font-size` and `--semiotic-axis-label-font-size` introduced for themable font sizes.

CSS custom properties `--semiotic-tick-font-size` and `--semiotic-axis-label-font-size` introduced for themable font sizes.

Source: llm_adapter@2026-05-22

Confidence: low

Feature Medium

`data-orient` attributes and per-axis class names added for easier external CSS targeting.

`data-orient` attributes and per-axis class names added for easier external CSS targeting.

Source: llm_adapter@2026-05-22

Confidence: low

Feature Low

Default tooltip automatically shows low/high rows per band when `band` prop is used.

Default tooltip automatically shows low/high rows per band when `band` prop is used.

Source: granite4.1:30b@2026-05-22-audit

Confidence: low

Feature Low

Added `loadingContent` prop to all HOCs as sibling of `emptyContent`.

Added `loadingContent` prop to all HOCs as sibling of `emptyContent`.

Source: granite4.1:30b@2026-05-22-audit

Confidence: low

Bugfix Medium

Fixed website build failure caused by unresolved Atom feed link in HTML.

Fixed website build failure caused by unresolved Atom feed link in HTML.

Source: granite4.1:30b@2026-05-22-audit

Confidence: low

Full changelog

Added

  • band prop on LineChart and AreaChart (and StreamXYFrame) — asymmetric min/max envelope drawn under the lines/areas, driven by independent y0Accessor / y1Accessor. Distinct from the existing boundsAccessor (symmetric ±offset) and from AreaChart.y0Accessor (which replaces the area baseline). Pass a single BandConfig or an array of them for percentile fans (e.g. p25/p75 stacked on top of p10/p90). Per-series by default — one ribbon per lineBy / colorBy group, colored from the parent line at 0.2 fillOpacity. Pass perSeries: false for an aggregate min/max envelope across all series. Non-interactive by default (hovers pass through to the line on top); set interactive: true if the band should participate in hit testing. Band y0/y1 values feed yExtent auto-derivation so a tall envelope can never clip, with explicit yExtent still winning.
    • Tooltip enrichment now covers every interaction surface: the hovered datum carries band: { y0, y1 } (first band) and bands: [...] (all bands) on the pointer hover path, each allSeries[i].datum in multi-mode, and the keyboard-navigation datum — one shared enrichDatumWithBand helper drives all three. Bounds-sourced ribbons stay decorative and are excluded from the contract.
    • Default tooltip surfaces band values automatically: configure band without supplying a custom tooltip function and the default tooltip gains one row pair per band (low + high). String accessors become labels; function accessors fall back to low / high. Custom tooltips still read datum.band / datum.bands directly. Live demo at /charts/line-chart#band.
  • tickAnchor: "edges" on frameProps.axes[i] — flips the leftmost tick's text-anchor to start and the rightmost to end on horizontal axes (and dominant-baseline to hanging / auto on vertical axes) so edge tick labels can't overflow the plot area. Default "middle" keeps existing behavior. Pairs naturally with axisExtent: "exact": exact pins the domain to the literal data min/max, edges keeps the labels readable at those bounds. Edge detection is pixel-based, not array-index-based, so inverted y scales (the default [height, 0]) and reversed x scales (streaming arrowOfTime: "left") anchor the right edges. Closes a common wrapper-library workaround that previously routed through xFormat returning ReactNodes with translateX math.
  • --semiotic-tick-font-size and --semiotic-axis-label-font-size CSS variables — emitted from the canonical theme typography fields (tickSize, labelSize) alongside the existing --semiotic-tick-font-family and --semiotic-title-font-size. Both themeToCSS (raw string serialization) and ThemeProvider (inline style) write them; themeToTokens exports them as DTCG dimension tokens. SVG axes consume the variables via style={{ fontSize: "var(--semiotic-tick-font-size, 10px)" }} so a CSS-var override on any ancestor (<div style={{ "--semiotic-tick-font-size": "14px" }}>) flows down without consumers needing !important. Landmark ticks bump by calc(... + 1px) so the +1 size stays relative to the var.
  • data-orient attributes and per-axis class names on axis groups — each axis now renders as its own <g class="semiotic-axis semiotic-axis-{bottom|left|right|top}" data-orient="…"> inside the .stream-axes wrapper. Consumers can target one axis at a time from external CSS without affecting the others: [data-orient='left'] text { font-size: 14px } works. Tick text carries class="semiotic-axis-tick", axis labels class="semiotic-axis-label", and chart titles class="semiotic-chart-title" for class-based targeting too.
  • loadingContent prop on all HOCs — sibling to emptyContent. When loading is true and loadingContent is set, it renders in place of the default shimmer-bar skeleton (wrapped in the same sized container so the chart slot stays reserved). Pass false to suppress the loading UI entirely (the early-return becomes null and a consumer's outer loading state takes over). Threaded through useChartSetup, useNetworkChartSetup, and useCustomChartSetup; all 47 HOCs accept it via BaseChartProps.

Fixed

  • website:build parcel resolution for the Atom feed linkdocs/public/index.html previously declared <link rel="alternate" href="/blog/feed.xml"> with an absolute path so prerendered nested routes (e.g. /charts/line-chart/) wouldn't resolve it as /charts/line-chart/blog/feed.xml. Parcel's HTML packager couldn't resolve the absolute path during build, so the website build failed. Moved the link injection into scripts/prerender.mjs alongside the existing /llms.txt alternate injection — same strip-and-inject pattern, same absolute-URL semantics, and Parcel no longer sees the unresolvable reference in source HTML.

Changed

  • boundsAccessor and band now share one rendering primitive. Both public envelope APIs normalize to a single resolvedRibbons: ResolvedRibbon[] array at the PipelineStore layer, then flow through xySceneBuilders/ribbonScene.ts — one scene builder, one y-extent expansion pass, one style cascade. boundsScene.ts and bandScene.ts are deleted; the public prop surfaces stay distinct (asymmetric pairs read better as band than as a boundsAccessor union return type) but the implementation is no longer duplicated. The bounds ribbon also now correctly skips datums with null/NaN y (previously the coerced +null === 0 could silently render a ribbon around the implicit-zero "value" of a missing row). The kind: "bounds" | "band" discriminator on each ribbon lets the hover handler restrict datum.band / datum.bands enrichment to band-sourced envelopes — bounds stays decorative-only, matching its prior contract.

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]