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)