| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| README.md | 2026-05-12 | 9.7 kB | |
| Semiotic v3.5.2 source code.tar.gz | 2026-05-12 | 15.7 MB | |
| Semiotic v3.5.2 source code.zip | 2026-05-12 | 16.7 MB | |
| Totals: 3 Items | 32.5 MB | 0 | |
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.