This release includes breaking changes for platform teams planning a safe upgrade.
✓ No known CVEs patched in this version
Topics
+1 more
ReleasePort's take
Light signalVersion 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 summaryAdded multiple new hooks, unified geometry and particle handling, migrated algorithm.js to TypeScript.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| 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
useSeriesFeatureshook —forecast+anomalyprops 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, andanomalycapability tags surface throughchartSpecs.ts/ai/capabilities.jsonfor agent discovery.useEncodingDomainhook — generic[min, max]tracker over bounded data + push-mode values, extracted from BubbleChart'ssizeBylogic. Scatterplot'ssizeBynow picks up correctly-scaled radii in push mode (previously a latent bug that returned the rawsizeByvalue as the pixel radius). String-field accessors hitting numeric-string values ("5","12") coerce cleanly instead of leaking strings into downstream math.useStreamStatushook — user-facing observer for push-API charts. Wraps a ref, interceptspush/pushMany, and exposes a reactivestatusenum ("idle"|"active"|"stale") pluslastPushTime. Surfaced viasemiotic/utilsandsemiotic/realtime. Wrap-once symbol guard prevents StrictMode double-wrap.useXYLineStylehook (Phase 2 step 5 of the HOC/Frame audit) — the line-side analogue ofuseXYPointStyle. 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 →mergeShapeStyleprimitives overlay →wrapStyleWithSelection. AresolveStroke(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 source —
scripts/sync-bundle-sizes.mjsreadspackage.json#exports, gzips each*.module.min.js, and upserts marker-block sections in README.md, CLAUDE.md, andai/system-prompt.md(the synced.cursorrules/.windsurfrules/.github/copilot-instructions.md/.clinerules/docs/public/llms-full.txtfollow from CLAUDE.md).check:bundle-sizesis wired intorelease: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 gziphero comment in the README — the autogenerated table is the only source of truth. radialGeometryhelpers —sweepToAngles,valueToAngle,computeArcBoundingBoxextracted from GaugeChart into a shared module, exposed viasemiotic/utils. Custom radial-chart authors (XYCustomChart, bespoke layouts) no longer have to re-derive the gauge sweep math.- ProcessSankey temporal validators —
validateProcessSankeyandformatProcessSankeyIssueexported fromsemioticandsemiotic/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. regressionprop on Scatterplot, BubbleChart, ConnectedScatterplot, BarChart, DotPlot — sugar over the trend annotation. Acceptstrue| method string ("linear"|"polynomial"|"loess") | fullRegressionConfig. 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-linesvariant onuseFrameImperativeHandlepluspushLine/pushManyLines/removeLine/getLines/lineIdAccessoronGeoPipelineStore.supportsPush: truein capabilities; docs streaming demo flipped fromsetState(flows)toref.current.push(flow). - Capability matrix at
ai/capabilities.json— 44 charts indexed across 5 categories withrenderModes/supportsPush/supportsSSR/supportsLegend/supportsSelection/supportsLinkedHover/colorModel/layoutMode/specialFeaturesfields. Generated alongsidedocs/capabilities.mdbynpm run docs:capabilities; locked againstchartSpecs.tsbycheck:capabilities.suggestCharts({ capabilities })accepts push/linkedHover/ssr/selection/legend constraints and surfaces afilteredOutlist with reasons. New/features/capabilitieswebsite page renders an interactive filterable matrix.
Changed
- ProcessSankey particles unified with SankeyDiagram — particles now ride the canvas +
ParticlePoolpath. The HOC writes pre-computed cubic bezier control points onto each ribbon spec;NetworkPipelineStore's particle-pool gate broadened fromchartType === "sankey"to also acceptcustomNetworkLayout. SVG particle overlay deleted (~80 LOC, including the<circle>-per-particle allocation per frame). Prop surface aligned:showParticles+particleStyle(sameParticleStyleshape as SankeyDiagram). IndividualparticleRadius/particleDuration/particleDensity/particleMaxPerEdgeprops removed. Particles inherit source-band colors vianodeColorMapbinding through invisible color-binding scene nodes. - Ribbon geometry unified — new
src/components/geometry/ribbonGeometry.tsis the single source of truth for the M-C-L-C-Z ribbon path emission. SankeyDiagram passescp1X = xi(curvature),cp2X = xi(1-curvature)(d3-sankey S-curve); ProcessSankey passescp1X = cp2X = cx(lane-aware single-point bend). Both buildScenes.ts (SSR) and the HOCs (CSR) call the same helper. algorithm.js→algorithm.ts— last JS file in the chart source tree migrated to TypeScript with all types inlined as the canonical source (algorithm.d.tsdeleted). 7 import sites updated to drop the.jsextension; test file converted with type-annotated fixtures.getSizeclamps tosizeRange— normalized position is now clamped to[0, 1]before mapping into the size range, so a pushed point whosesizeByvalue 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-through —
NetworkPipelineStore.ingestBoundednow copies pre-computedbezierfrom raw edges onto internalRealtimeEdgerecords, validated against theBezierCacheshape (object +circular: boolean+ 4-point or non-empty-segments + finitehalfWidth). Malformed shapes are silently dropped instead of crashing the particle pipeline. - Edge value preservation — bounded ingestion now uses
Number.isFinite(numValue) ? numValue : 1instead ofNumber(v) || 1, so a legitimatevalue: 0edge survives end-to-end (e.g. suppressed-flow markers in particle pipelines). - Particle CSS variable resolution —
networkParticleRendererruns all colors throughresolveCSSColorsoparticleStyle.color="var(--semiotic-primary)"and theme-token-returningedgeColorFnresults paint correctly (canvas'sfillStylesilently rejects CSS custom properties otherwise). - Particle color resolution moved out of the renderer — functional
particleStyle.coloris now invoked ingetParticleColorwith aresolveEdgeEndpoint-resolvedRealtimeNode. Custom-layout charts (ProcessSankey) whereedge.sourceis a string id now correctly invoke the user's color function instead of falling back to a hardcoded default. - Keyboard nav skips invisible scene nodes —
extractNetworkNavPointsskipsr <= 0circles andw <= 0 || h <= 0rects (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 counts —
semiotic/aicovers 40 HOCs (XY + ordinal + network + realtime);semiotic/recipesadded 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.txtall 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 todist/*.module.min.js. The published artifacts come fromnpm run dist:prod, which terser-minifies. Bothscripts/sync-bundle-sizes.mjsandsize-limitreaddist/*.module.min.jsdirectly, so a localdistbuild 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
showParticleswas toggled on (root cause:customNetworkLayoutcharts skippedfinalizeLayout, so pre-computed bezier never reachedstore.edges). - Fixed ProcessSankey particles rendering as light grey instead of inheriting source-node category color.
- Fixed
Number.isFinitecoercion inuseEncodingDomainso 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
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]