Skip to content

nteract/semiotic

v3.5.2 Breaking

This release includes breaking changes for platform teams planning a safe upgrade.

Published 22d 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 13d

Version v3.5.2 introduces several new hooks (e.g., `useSeriesFeatures`, `useStreamStatus`) and fixes particle flow, encoding domain coercion, and non‑numeric domain issues.

Why it matters: Test the new charting hooks in a development environment; apply bugfixes to resolve particle display and data‑domain errors before production deployment.

Summary

AI summary

Added multiple new hooks, unified geometry and particle handling, migrated algorithm.js to TypeScript.

Changes in this release

Feature Medium

`useSeriesFeatures` hook provides forecast and anomaly props on AreaChart, Scatterplot, ConnectedScatterplot.

`useSeriesFeatures` hook provides forecast and anomaly props on AreaChart, Scatterplot, ConnectedScatterplot.

Source: llm_adapter@2026-05-21

Confidence: high

Feature Medium

`useEncodingDomain` hook tracks bounded data ranges with push-mode values for Scatterplot sizeBy scaling.

`useEncodingDomain` hook tracks bounded data ranges with push-mode values for Scatterplot sizeBy scaling.

Source: llm_adapter@2026-05-21

Confidence: high

Feature Medium

`useStreamStatus` hook observes push-API chart status, exposing reactive enum and lastPushTime.

`useStreamStatus` hook observes push-API chart status, exposing reactive enum and lastPushTime.

Source: llm_adapter@2026-05-21

Confidence: high

Feature Medium

`useXYLineStyle` hook standardizes line style configuration for LineChart, MultiAxisLineChart, MinimapChart.

`useXYLineStyle` hook standardizes line style configuration for LineChart, MultiAxisLineChart, MinimapChart.

Source: llm_adapter@2026-05-21

Confidence: high

Feature Medium

`radialGeometry` helpers expose sweepToAngles, valueToAngle, computeArcBoundingBox for radial charts.

`radialGeometry` helpers expose sweepToAngles, valueToAngle, computeArcBoundingBox for radial charts.

Source: llm_adapter@2026-05-21

Confidence: high

Feature Medium

`regression` prop adds trend line annotation options to multiple chart types (Scatterplot, BubbleChart, etc.).

`regression` prop adds trend line annotation options to multiple chart types (Scatterplot, BubbleChart, etc.).

Source: llm_adapter@2026-05-21

Confidence: high

Feature Medium

FlowMap push API introduces geo-lines variant and real-time line manipulation methods.

FlowMap push API introduces geo-lines variant and real-time line manipulation methods.

Source: llm_adapter@2026-05-21

Confidence: low

Feature Medium

Bundle-size truth source auto-updates README, CLAUDE.md, and ai/system-prompt.md with gzipped sizes.

Bundle-size truth source auto-updates README, CLAUDE.md, and ai/system-prompt.md with gzipped sizes.

Source: llm_adapter@2026-05-21

Confidence: low

Feature Medium

Capability matrix in ai/capabilities.json indexes 44 charts with renderModes, push support, and special features.

Capability matrix in ai/capabilities.json indexes 44 charts with renderModes, push support, and special features.

Source: llm_adapter@2026-05-21

Confidence: low

Feature Low

FlowMap push API introduces geo-lines variant with pushLine/pushManyLines/removeLine/getLines/lineIdAccessor; supportsPush flag added.

FlowMap push API introduces geo-lines variant with pushLine/pushManyLines/removeLine/getLines/lineIdAccessor; supportsPush flag added.

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

Confidence: low

Bugfix Medium

ProcessSankey particles now flow when showParticles toggled, fixing layout skip issue.

ProcessSankey particles now flow when showParticles toggled, fixing layout skip issue.

Source: llm_adapter@2026-05-21

Confidence: high

Bugfix Medium

ProcessSankey particles inherit source-node color correctly after style resolution fix.

ProcessSankey particles inherit source-node color correctly after style resolution fix.

Source: llm_adapter@2026-05-21

Confidence: high

Bugfix Medium

`Number.isFinite` used in useEncodingDomain prevents non-numeric domain issues.

`Number.isFinite` used in useEncodingDomain prevents non-numeric domain issues.

Source: llm_adapter@2026-05-21

Confidence: high

Bugfix Medium

`useEncodingDomain` now coerces string-field accessors to numeric values cleanly.

`useEncodingDomain` now coerces string-field accessors to numeric values cleanly.

Source: llm_adapter@2026-05-21

Confidence: low

Full changelog

Added

  • useSeriesFeatures hookforecast + anomaly props are now first-class on AreaChart, Scatterplot, and ConnectedScatterplot (previously LineChart-only). Each consumer collapses from ~85 LOC of synthetic-key + lazy-load + state-management boilerplate to ~10 lines via the shared hook. series-features, forecast, and anomaly capability tags surface through chartSpecs.ts / ai/capabilities.json for agent discovery.
  • useEncodingDomain hook — generic [min, max] tracker over bounded data + push-mode values, extracted from BubbleChart's sizeBy logic. Scatterplot's sizeBy now picks up correctly-scaled radii in push mode (previously a latent bug that returned the raw sizeBy value as the pixel radius). String-field accessors hitting numeric-string values ("5", "12") coerce cleanly instead of leaking strings into downstream math.
  • useStreamStatus hook — user-facing observer for push-API charts. Wraps a ref, intercepts push/pushMany, and exposes a reactive status enum ("idle" | "active" | "stale") plus lastPushTime. Surfaced via semiotic/utils and semiotic/realtime. Wrap-once symbol guard prevents StrictMode double-wrap.
  • useXYLineStyle hook (Phase 2 step 5 of the HOC/Frame audit) — the line-side analogue of useXYPointStyle. LineChart, MultiAxisLineChart, and MinimapChart (both main + overview lines) all collapse to a single hook call covering the five-step recipe: base stroke width → color resolution → optional group-aware fill → mergeShapeStyle primitives overlay → wrapStyleWithSelection. A resolveStroke(d, group?) override absorbs MultiAxisLineChart's per-series colorMap; unset selection-hook / primitives args keep MinimapChart's main + overview paths intact (no-ops on the wraps preserve referential identity). LineChart's forecast/anomaly segment-aware wrap stays HOC-side as a post-pass over the hook's output — the lazy-load + state-management contract has no counterpart in the other two consumers. Net ~65 LOC removed across the three HOCs. 15 unit tests pin the recipe.
  • Bundle-size truth sourcescripts/sync-bundle-sizes.mjs reads package.json#exports, gzips each *.module.min.js, and upserts marker-block sections in README.md, CLAUDE.md, and ai/system-prompt.md (the synced .cursorrules / .windsurfrules / .github/copilot-instructions.md / .clinerules / docs/public/llms-full.txt follow from CLAUDE.md). check:bundle-sizes is wired into release:check, prepublishOnly, and the CI workflow alongside the other doc-correctness gates, so dependency bumps that nudge a bundle past its rounded KB boundary now fail CI when the docs haven't been regenerated. Drops the stale // 200 KB gzip hero comment in the README — the autogenerated table is the only source of truth.
  • radialGeometry helperssweepToAngles, valueToAngle, computeArcBoundingBox extracted from GaugeChart into a shared module, exposed via semiotic/utils. Custom radial-chart authors (XYCustomChart, bespoke layouts) no longer have to re-derive the gauge sweep math.
  • ProcessSankey temporal validatorsvalidateProcessSankey and formatProcessSankeyIssue exported from semiotic and semiotic/network. External code (data pipelines, AI agents, server-side validators) can pre-check graphs against the same value-conservation + endpoint-resolution rules the chart enforces.
  • regression prop on Scatterplot, BubbleChart, ConnectedScatterplot, BarChart, DotPlot — sugar over the trend annotation. Accepts true | method string ("linear" | "polynomial" | "loess") | full RegressionConfig. Ordinal charts treat categories as integer indices and project the regression line through the band scale (with linear interpolation between band centers for LOESS fractional indices).
  • FlowMap push API — joined the realtime-capable HOC family. The frame gained a geo-lines variant on useFrameImperativeHandle plus pushLine / pushManyLines / removeLine / getLines / lineIdAccessor on GeoPipelineStore. supportsPush: true in capabilities; docs streaming demo flipped from setState(flows) to ref.current.push(flow).
  • Capability matrix at ai/capabilities.json — 44 charts indexed across 5 categories with renderModes / supportsPush / supportsSSR / supportsLegend / supportsSelection / supportsLinkedHover / colorModel / layoutMode / specialFeatures fields. Generated alongside docs/capabilities.md by npm run docs:capabilities; locked against chartSpecs.ts by check:capabilities. suggestCharts({ capabilities }) accepts push/linkedHover/ssr/selection/legend constraints and surfaces a filteredOut list with reasons. New /features/capabilities website page renders an interactive filterable matrix.

Changed

  • ProcessSankey particles unified with SankeyDiagram — particles now ride the canvas + ParticlePool path. The HOC writes pre-computed cubic bezier control points onto each ribbon spec; NetworkPipelineStore's particle-pool gate broadened from chartType === "sankey" to also accept customNetworkLayout. SVG particle overlay deleted (~80 LOC, including the <circle>-per-particle allocation per frame). Prop surface aligned: showParticles + particleStyle (same ParticleStyle shape as SankeyDiagram). Individual particleRadius / particleDuration / particleDensity / particleMaxPerEdge props removed. Particles inherit source-band colors via nodeColorMap binding through invisible color-binding scene nodes.
  • Ribbon geometry unified — new src/components/geometry/ribbonGeometry.ts is the single source of truth for the M-C-L-C-Z ribbon path emission. SankeyDiagram passes cp1X = xi(curvature), cp2X = xi(1-curvature) (d3-sankey S-curve); ProcessSankey passes cp1X = cp2X = cx (lane-aware single-point bend). Both buildScenes.ts (SSR) and the HOCs (CSR) call the same helper.
  • algorithm.jsalgorithm.ts — last JS file in the chart source tree migrated to TypeScript with all types inlined as the canonical source (algorithm.d.ts deleted). 7 import sites updated to drop the .js extension; test file converted with type-annotated fixtures.
  • getSize clamps to sizeRange — normalized position is now clamped to [0, 1] before mapping into the size range, so a pushed point whose sizeBy value falls outside the running domain (most common in push-mode initial state) renders at the boundary radius instead of producing an arbitrarily large pixel value.
  • Push-mode bezier carry-throughNetworkPipelineStore.ingestBounded now copies pre-computed bezier from raw edges onto internal RealtimeEdge records, validated against the BezierCache shape (object + circular: boolean + 4-point or non-empty-segments + finite halfWidth). Malformed shapes are silently dropped instead of crashing the particle pipeline.
  • Edge value preservation — bounded ingestion now uses Number.isFinite(numValue) ? numValue : 1 instead of Number(v) || 1, so a legitimate value: 0 edge survives end-to-end (e.g. suppressed-flow markers in particle pipelines).
  • Particle CSS variable resolutionnetworkParticleRenderer runs all colors through resolveCSSColor so particleStyle.color="var(--semiotic-primary)" and theme-token-returning edgeColorFn results paint correctly (canvas's fillStyle silently rejects CSS custom properties otherwise).
  • Particle color resolution moved out of the renderer — functional particleStyle.color is now invoked in getParticleColor with a resolveEdgeEndpoint-resolved RealtimeNode. Custom-layout charts (ProcessSankey) where edge.source is a string id now correctly invoke the user's color function instead of falling back to a hardcoded default.
  • Keyboard nav skips invisible scene nodesextractNetworkNavPoints skips r <= 0 circles and w <= 0 || h <= 0 rects (matching the canvas renderer's own skip gates). Keyboard focus on ProcessSankey now lands on a real band/ribbon instead of an off-canvas color-binding placeholder.
  • Bundle countssemiotic/ai covers 40 HOCs (XY + ordinal + network + realtime); semiotic/recipes added to the table; full schema covers 44 charts.
  • Documentation refreshed — README, CLAUDE.md, ai/system-prompt.md, and the synced .cursorrules / .windsurfrules / .github/copilot-instructions.md / .clinerules / docs/public/llms-full.txt all carry current bundle sizes, chart counts, and entry-point inventory.
  • Bundle-size docs corrected — earlier in this release cycle the README/CLAUDE.md/ai/system-prompt.md bundle table briefly carried inflated numbers because npm run dist (no --production) writes non-minified output to dist/*.module.min.js. The published artifacts come from npm run dist:prod, which terser-minifies. Both scripts/sync-bundle-sizes.mjs and size-limit read dist/*.module.min.js directly, so a local dist build silently substituted unminified bytes into the docs. The corrected numbers (xy 81 KB gz, ordinal 66 KB, network 62 KB, etc.) now reflect actual published artifacts. The bundle-size check tolerates ±3 KB build-machine variance so local↔CI minor differences don't fail without real growth.

Fixed

  • Fixed ProcessSankey particles not flowing when showParticles was toggled on (root cause: customNetworkLayout charts skipped finalizeLayout, so pre-computed bezier never reached store.edges).
  • Fixed ProcessSankey particles rendering as light grey instead of inheriting source-node category color.
  • Fixed Number.isFinite coercion in useEncodingDomain so the running domain is always numeric.

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]