| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| semiotic-3.8.5.provenance.json | 2026-07-23 | 1.6 kB | |
| semiotic-3.8.5.sbom.cdx.json | 2026-07-23 | 90.8 kB | |
| semiotic-3.8.5.tgz.sha512 | 2026-07-23 | 149 Bytes | |
| semiotic-3.8.5.tgz | 2026-07-23 | 4.8 MB | |
| README.md | 2026-07-22 | 6.6 kB | |
| Semiotic v3.8.5 source code.tar.gz | 2026-07-22 | 54.5 MB | |
| Semiotic v3.8.5 source code.zip | 2026-07-22 | 56.3 MB | |
| Totals: 7 Items | 115.7 MB | 1 | |
Added
CrucibleChart. A new physics-backed HOC (semiotic/physics) where bounded peer components undergo authoredphasesandevents, form declaredproducts, and settle into reason-labelledoutletswith source lineage — the ledger/projection is authoritative, motion never infers classification, timing, membership, loss, or routing.buildCrucibleProductEvents(...)is pure authoring sugar forcombine → contribute* → complete-product. The ref handle'sreplay()atomically restarts the deterministic tape mid-run;reset()restores-and-pauses. Ships with SSR support, AI/schema registration (CrucibleChart.capability.ts), and full test coverage.- Word Trails recipe.
wordTrailsLayout(semiotic/recipes) is a quantitatively anchored word-cloud layout: column = category, segment = ordered vertical position, weight = font size, with overlap-free stable placement.wordTrailsProgressiveReveal(...)fades future/past segments without reflow for scrollytelling-style reveals. - Net Ensemble recipe.
netEnsembleLayout(semiotic/recipes) lays out ensembles of disconnected/trivially-connected DAGs as small multiples in motif bands — splitting into weakly-connected components, classifying each by directedness (single sink vs. branching), and grouping order-isomorphic motifs via Weisfeiler–Leman fingerprinting.analyzeNetEnsemble(nodes, edges)is the pure headless census with no rendering. Demo at/recipes/net-ensemble. - DistanceCartogram strip layout. A new
cartogramLayout: "radial" | "strip"prop adds a Langren-style 1D cost-axis layout (origin left, cost right), used automatically inmode="sparkline"and available in any mode. - ForceDirectedGraph node/edge stroke separation.
nodeStroke/nodeStrokeWidth(node-only outline) andedgeColor/edgeWidth/edgeOpacity(edge-only stroke) let a caller style nodes and edges independently; the genericstroke/strokeWidth/opacityprops continue to style all marks uniformly. Precedence per property: specific > generic > built-in default. RenderEvidenceexposes the resolved margin and plot rectangle.renderChartWithEvidencenow returnsmargin: {top,right,bottom,left}andplot: {x,y,width,height}— the actual geometry Semiotic used after auto-reservation (e.g. a legend), matching exactly where the SVG'sdata-areagroup is translated. A caller hand-drawing an SSR overlay no longer has to guess or conservatively bail when it can't reconstruct the plot rectangle from its input margin alone.- Chart-aware numeric data audit.
semiotic/ai,semiotic/ai/core,semiotic/utils, andsemiotic/utils/corenow exportauditData,formatDataAudit,profileNumericFields, andtoDataAuditNotifications. SerializablenumericContractson chart capabilities detect non-finite/non-numeric values, zero-span or single-row domains, invalid log inputs, negative size geometry, unsafe normalized or part-to-whole totals, and scale-dominating outliers with bounded row evidence.diagnoseConfiginherits the checks, schema-driven docs playgrounds show a live Data Truth Lens, andChartContainer dataAuditcan surface findings in its existing accessible notification bell. - Data Viz for Dummies example. A scrollytelling example organizes seven chart families by a two-way taxonomy (data structure vs. analytical task) through a fictional basketball season.
Changed
- Frame-batched network ingestion. Sequential
StreamNetworkFrame.push()calls now share one layout pass per animation frame instead of recomputing the whole layout for every edge.pushMany()absorbs pending single-push layout work into its synchronous batch; reads/mutations flush first, andclear()cancels uncommitted layout work so imperative semantics stay deterministic.
Fixed
renderCharthonors customsvgAnnotationRulesserver-side. A chart'ssvgAnnotationRules(top-level orframeProps) now runs during static/SSR rendering the same way it does on the client — custom annotation shapes (endpoint bulbs, hover guides, bespoke glyphs) no longer silently vanish fromrenderChart/renderChartWithEvidenceoutput. Passed through for XY, ordinal, network, and geo static render paths alike.- SSR annotation context now infers
frameTypefrom scales/projection, matching the client overlay. A non-ordinal static render (geo, bare network) no longer advertises a default vertical ordinalprojection, which could make a customsvgAnnotationRulesrule branching on frame type resolve incorrectly server-side. framePropsescape-hatch overrides forshowAxes/showLegend/showLabels/showGrid/xLabel/yLabel/categoryLabel/valueLabelno longer silently dropped inrenderChart. The static common-prop builder used to reassert each of these from the mode-resolved default after spreadingframeProps, clobbering an explicit override the live HOC otherwise honors (frameProps spreads last there). A chart passingframeProps={{ showAxes: false }}(or any of the above) server-side now renders identically to the live component instead of always showing the mode's default axis/label chrome.- Ordinal
x-thresholdannotation now renders in SSR. On a horizontal ordinal chart (bar, swimlane, etc.) the value axis IS the x axis, but the static renderer never populated an XY-stylescales.xfor ordinal frames, sox-thresholdalways silently dropped — while the client (OrdinalSVGOverlay) already resolved it correctly against the r-scale.x-thresholdnow mirrors the same orientation-aware resolutiony-thresholdalready had. profileNumericFieldsno longer misclassifies dirty-numeric strings. Whitespace-only strings (" ") now count as missing rather than non-numeric, and an explicit"NaN"/"Infinity"/"-Infinity"string now counts as a non-finite hazard rather than being lumped in with unparseable garbage — distinguished from garbage (which also parses toNaN) by the literal token, not the parsed value.PhysicsSettledSVG'srenderBodySVGnow receives the resolvedidPrefix. A custom body renderer emitting its own<defs>(a<filter>, a gradient) can namespace those ids — SVG ids are document-global, so without this, two settled-physics SVGs embedded in one document could collide and mis-apply each other's filter.CrucibleChart's settled-product glow filter now uses it.