Releases: nteract/semiotic
Semiotic v3.1.0
Semiotic v3.1.0
Geographic visualization, accessibility foundation, performance optimizations, and comprehensive bug fixes.
Added
Geographic Visualization (semiotic/geo)
- ChoroplethMap — sequential color encoding on GeoJSON features with
valueAccessor,colorScheme, and reference geography strings ("world-110m","world-50m") - ProportionalSymbolMap — sized/colored point symbols on a geographic basemap with
sizeBy,sizeRange, andcolorBy - FlowMap — origin-destination flow lines with width encoding, animated particles (
showParticles,particleStyle), andlineType("geo"|"line") - DistanceCartogram — ORBIS-style projection distortion based on travel cost with concentric ring overlay, north indicator, configurable strength and line mode
- StreamGeoFrame — low-level geo frame with full control over areas, points, lines, canvas rendering, and push API for streaming
- Zoom/Pan — all geo charts accept
zoomable,zoomExtent,onZoomwith imperativegetZoom()/resetZoom() - Drag Rotate — globe spinning for orthographic projections, latitude clamped to [-90, 90]
- Tile Maps —
tileURL,tileAttribution,tileCacheSizefor slippy-map basemaps (Mercator only) - Reference geography —
resolveReferenceGeography()returns Natural Earth GeoJSON features;mergeData()joins external data into features - GeoParticlePool — object-pool polyline particle system for animated flow particles
- GeoCanvasHitTester — spatial indexing for hover/click hit detection on canvas-rendered geo marks
- 6 documentation pages, 2 playground pages, 1 recipe page
- Comprehensive test suites: FlowMap (25), ChoroplethMap (16), DistanceCartogram (19), colorUtils (+6), hooks (+3)
Accessibility (WCAG 2.1 AA ~70%)
- Canvas
aria-labelon all Stream Frames describing chart type and data shape - Legend keyboard navigation — roving tabindex, Enter/Space activate, arrow keys navigate
aria-live="polite"region mirroring tooltip text for screen readers- SVG
<title>and<desc>on all overlay components aria-labelon ChartContainer toolbar buttons- 35 Playwright accessibility integration tests
Streaming
- Streaming legend support —
useStreamingLegendhook discovers categories from pushed data dynamically - 20+ Playwright streaming regression tests (canvas pixel sampling, legend appearance, tooltip content, stability)
Performance
- Color map cache — skips rebuild when categories unchanged
- Stacked area cache — skips cumulative sum when data unchanged
- Buffer array cache — dirty flag prevents re-materialization on hover/transition ticks
- Canvas buffer reuse — skips GPU reallocation when dimensions unchanged
- Path2D caching on geo nodes — eliminates per-hover allocations
- Streaming push backpressure — microtask batching in DataSourceAdapter
AI Tooling
- MCP server consolidated from 19 tools to 3 (
renderChart,diagnoseConfig,reportIssue) - Self-healing error boundaries —
SafeRenderrunsdiagnoseConfigon chart failures (dev mode) - 61 new unit tests for
withChartWrapper, network utilities, and ordinal push API
Fixed
- Grey fills on push API charts — end-to-end fix for color pipeline when colorScale is unavailable during streaming
- LineChart infinite re-render loop — circular dependency between statistical overlay effect and line style
tooltip={false}now correctly disables tooltips on all 22 remaining HOCs- Network HOC tooltip double-chrome wrapping (7 charts)
Math.min/max(...spread)stack overflow on >100K datasets- Unbounded memory growth in "growing" window mode (capped at 1M default)
- Geo hooks crash — "Rendered more hooks than during previous render" in FlowMap and ChoroplethMap
- ChoroplethMap colorScale crash with null areas during async loading
- Function
colorByproduced undefined colors —useColorScalederives categories from data whencolorByis a function - Area/StackedArea tooltips showing "-" instead of values
- Force graph centering and streaming refresh
- FIFO category ordering for streaming ordinal charts
- Edge hit areas expanded to 5px minimum tolerance
- Sankey crossing reduction via barycenter ordering
- Anti-meridian line handling for geo projections
- And 20+ more fixes — see CHANGELOG.md
Improved
@ts-nocheckremoved from Legend.tsx — full type safety restored- 38
as anycasts eliminated from PipelineStore useSyncExternalStorereplaces custom shim (concurrent mode safe)- Shared
useChartSetuphook — 10 HOCs refactored, ~170 lines removed
Tests
- 1944 total tests, 106 test files
- Direct tests for StreamXYFrame (39) and StreamOrdinalFrame (44)
- Legend tests (33), tooltipUtils tests (35), ordinal scene builder tests (67)
Semiotic v3.0.1
Semiotic v3.0.1
Bug fixes, emphasis prop, direct labels, gap strategy fixes, and export improvements.
Added
emphasisprop — all charts acceptemphasis="primary" | "secondary".ChartGridspans primary charts across two columnsdirectLabelrendering — labels now actually render via new"text"annotation typegapStrategyfixes —"break"correctly splits lines at null boundaries;"interpolate"no longer coerces null to 0
Fixed
- PNG export now composites canvas + SVG layers (previously captured only axes)
directLabelannotations no longer silently droppedgapStrategy="break"no longer draws lines through gapscolorBytype mismatch in network/hierarchy charts- Duplicate
amplitudeproperty inStreamOrdinalFrameProps
See CHANGELOG.md for details.
Semiotic v3.0.0
Semiotic v3.0.0
Complete rewrite of Semiotic. Stream-first canvas architecture, 37 HOC chart components, full TypeScript, AI tooling, coordinated views, realtime encoding, and native server-side rendering.
Highlights
- Stream-first rendering — all frames are canvas-first with SVG overlays for labels, axes, and annotations
- 37 HOC chart components — XY (LineChart, Scatterplot, Heatmap, ...), Ordinal (BarChart, BoxPlot, ...), Network (ForceDirectedGraph, SankeyDiagram, ...), Realtime (RealtimeLineChart, ...)
- Full TypeScript strict mode with generic type parameters on all components
- Server-side rendering — component-level SSR (automatic in Next.js/Remix/Astro) + standalone
semiotic/server - Realtime visual encoding — decay, pulse, transition, staleness effects
- Coordinated views — LinkedCharts, CategoryColorProvider, cross-filtering, linked hover/brush
- AI tooling —
semiotic/aischema, MCP server, CLI,validateProps,diagnoseConfig - 9 sub-package entry points —
semiotic,semiotic/xy,semiotic/ordinal,semiotic/network,semiotic/realtime,semiotic/geo,semiotic/ai,semiotic/data,semiotic/server
See CHANGELOG.md for the full list.
Annotation & Brush Bug-Squashing
FIXES
- Updating note props wouldn't cause the note to rerender (thanks @torioLuz!)
- Brushing could return null extent, failing the destructuring default (in the docs even!)
Smarter Tooltips, Clean Up Logging Issues
Minor release (the real work is going on in the semiotic-2 branch) that adds some functionality thanks to @torioLuz and otherwise just cleans up some minor logging bugs
FEATURES
- Outbound tick lines option (@torioLuz could you make a PR to document this on semiotic-docs and/or a codepen or other to show how to use it?)
- Add more tooltip attributes to improve tooltip behavior (@torioLuz could you make a PR to document this on semiotic-docs and/or a codepen or other to show how to use it?)
FIXES
- Remove console log from OrdinalFrame
React 16.8+ Compatibility
Semiotic 2.0 deprecates a lot of old compatibility props, removes the download button and gets rid of deprecated lifecycle events. It should also (hopefully) take advantage of some of the newer React features. Please take a look and file any issues you discover.
DownloadButtonis gone. It provided some convenience and much hassle and my philosophy on how to handle exporting data is that it should be a case-by-case feature handled outside of the dataviz framework.- Since everyone didn't always want to render with sketchy rendering it's optional now, so to enable sketchy rendering you will need to import Rough or a Rough-like library and pass it to your frame using the
sketchyRenderingEngineprop. So something like:
import roughjs from "roughjs/dist/rough.es5.umd.js"
<XYFrame
sketchyRenderingEngine={roughjs}
/>
- Old names for props (like
areasin XYFrame which was replaced bysummaries) are no longer honored. react15Wrapperis removed from FacetController since React 15 is no longer supportedwordcloudhas been removed fromNetworkFrameit was never a very good word cloud
Other changes should be coming. If you have any suggestions just let me know. Bugfixes to 1.X will, of course, continue.
Fix UMD, custom OrdinalFrame type
Calculate Extent with Annotations Included
FIXES
- Annotations in FacetController might not have been displayed prior to an interaction (thanks @susielu!)
- Invert extent wasn't being honored in FacetController (thanks @susielu!)
- Area annotation wasn't properly offset in XYFrame
FEATURES
- Honor
optimizeCustomTooltipPositionin OrdinalFrame (thanks @torioLuz!) this allows you to change the tooltip position based on positive and negative data and whether it gets close to the edges. - Extent objects now honor a
includeAnnotationsoption (which takestrueorfalse) which if set to true calculates the extent of the frame based not only on the data but also on simple annotations (any annotation types that use the data attributes likexy,x,y,react-annotation, notboundsorcoordinatesor anything like that).
Fix Download Button, Column Brushing, Add Orphan Points
FEATURES
- In
NetworkFrameinmotifsmode you can now set apaddingprop for yournetworkSettingsthat determines the number of pixels between each group. XYFramenow supportsfilterRenderedLinesandfilterRenderedSummarieswhich allows you to remove lines or summaries after they have been calculated so that the extent and other aspects of the chart are based on the complete datasetshowLinePointsnow honors an"orphan"setting that will only show line points if a point has an undefined point immediately before and after that point. This means it will only have any kind of effect if you havedefinedset but when you do, it lets you show a floating point as a point so that it's not lost in the way a line renders.

FIXES
- The download feature should be working again
- Column brushes in
verticalprojection would hang if there were no zero values among your columns (so for instance in a parallel coordinates setting)
Torn Baseline
FIXES
- As expected, the TypeScript migration introduces a few issues and these seem to all be ironed out now (hence the lack of release notes since
1.19.1as things get ironed out. FacetControllerhad issues when one of the child frames had no data.
FEATURES
- Full docs on how to better style your axes at https://semiotic.nteract.io/guides/axis
- Axes can now display a jagged base tick for you to use in non-zero baseline situations (this was historically a best practice half a century ago and seems useful to bring back) You can accomplish this by setting an axis prop:
jaggedBase: true
OTHER
- More tests! Please feel free to submit PRs for tests there are so many open issues related to this and I'm trying to handle them as they come up but if someone wants to start building a more robust set of tests then please let me know. We also need to expose the types in a sensible way and always need more docs.
