This release adds 3 notable features for engineering teams evaluating rollout.
✓ No known CVEs patched in this version
Topics
+1 more
ReleasePort's take
Light signalSemiotic 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 summaryAdded asymmetric envelope band prop and tooltip enhancements for LineChart/AreaChart plus axis tick styling improvements.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| 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
bandprop onLineChartandAreaChart(andStreamXYFrame) — asymmetric min/max envelope drawn under the lines/areas, driven by independenty0Accessor/y1Accessor. Distinct from the existingboundsAccessor(symmetric ±offset) and fromAreaChart.y0Accessor(which replaces the area baseline). Pass a singleBandConfigor an array of them for percentile fans (e.g. p25/p75 stacked on top of p10/p90). Per-series by default — one ribbon perlineBy/colorBygroup, colored from the parent line at 0.2 fillOpacity. PassperSeries: falsefor an aggregate min/max envelope across all series. Non-interactive by default (hovers pass through to the line on top); setinteractive: trueif the band should participate in hit testing. Band y0/y1 values feedyExtentauto-derivation so a tall envelope can never clip, with explicityExtentstill winning.- Tooltip enrichment now covers every interaction surface: the hovered datum carries
band: { y0, y1 }(first band) andbands: [...](all bands) on the pointer hover path, eachallSeries[i].datumin multi-mode, and the keyboard-navigation datum — one sharedenrichDatumWithBandhelper drives all three. Bounds-sourced ribbons stay decorative and are excluded from the contract. - Default tooltip surfaces band values automatically: configure
bandwithout supplying a customtooltipfunction and the default tooltip gains one row pair per band (low + high). String accessors become labels; function accessors fall back tolow/high. Custom tooltips still readdatum.band/datum.bandsdirectly. Live demo at/charts/line-chart#band.
- Tooltip enrichment now covers every interaction surface: the hovered datum carries
tickAnchor: "edges"onframeProps.axes[i]— flips the leftmost tick'stext-anchortostartand the rightmost toendon horizontal axes (anddominant-baselinetohanging/autoon vertical axes) so edge tick labels can't overflow the plot area. Default"middle"keeps existing behavior. Pairs naturally withaxisExtent: "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 (streamingarrowOfTime: "left") anchor the right edges. Closes a common wrapper-library workaround that previously routed throughxFormatreturning ReactNodes withtranslateXmath.--semiotic-tick-font-sizeand--semiotic-axis-label-font-sizeCSS variables — emitted from the canonical theme typography fields (tickSize,labelSize) alongside the existing--semiotic-tick-font-familyand--semiotic-title-font-size. BoththemeToCSS(raw string serialization) andThemeProvider(inline style) write them;themeToTokensexports them as DTCGdimensiontokens. SVG axes consume the variables viastyle={{ 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 bycalc(... + 1px)so the +1 size stays relative to the var.data-orientattributes 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-axeswrapper. 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 carriesclass="semiotic-axis-tick", axis labelsclass="semiotic-axis-label", and chart titlesclass="semiotic-chart-title"for class-based targeting too.loadingContentprop on all HOCs — sibling toemptyContent. Whenloadingis true andloadingContentis set, it renders in place of the default shimmer-bar skeleton (wrapped in the same sized container so the chart slot stays reserved). Passfalseto suppress the loading UI entirely (the early-return becomes null and a consumer's outer loading state takes over). Threaded throughuseChartSetup,useNetworkChartSetup, anduseCustomChartSetup; all 47 HOCs accept it viaBaseChartProps.
Fixed
website:buildparcel resolution for the Atom feed link —docs/public/index.htmlpreviously 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 intoscripts/prerender.mjsalongside the existing/llms.txtalternate injection — same strip-and-inject pattern, same absolute-URL semantics, and Parcel no longer sees the unresolvable reference in source HTML.
Changed
boundsAccessorandbandnow share one rendering primitive. Both public envelope APIs normalize to a singleresolvedRibbons: ResolvedRibbon[]array at the PipelineStore layer, then flow throughxySceneBuilders/ribbonScene.ts— one scene builder, one y-extent expansion pass, one style cascade.boundsScene.tsandbandScene.tsare deleted; the public prop surfaces stay distinct (asymmetric pairs read better asbandthan as aboundsAccessorunion return type) but the implementation is no longer duplicated. The bounds ribbon also now correctly skips datums with null/NaNy(previously the coerced+null === 0could silently render a ribbon around the implicit-zero "value" of a missing row). Thekind: "bounds" | "band"discriminator on each ribbon lets the hover handler restrictdatum.band/datum.bandsenrichment 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
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]