Skip to content

@mk7s/holochart-core ​

Classes ​

ClassDescription
HolochartErrorBase class of the errors holochart throws or rejects with on purpose (S1.8, S2.4): error instanceof HolochartError.
ValidationErrorThrown by supply-defaults in config.strict mode, carrying the first issue.

Interfaces ​

InterfaceDescription
AnyFigureA figure of any shape, as the pipeline takes it (supplyDefaults, diffFigures, encodeFigure, …): every part is validated, so nothing is assumed. Every FigureInput is one.
AnyOptionsOptions for any.
AttrBuildersThe builders of the schema DSL (attr), one per attribute type and container.
AttrConstraintsConstraint fields for leaf attributes. Which fields apply depends on valType; builders in attr.ts only expose the relevant ones.
AttrSpecA leaf attribute.
AxisExtremesWhat one trace contributes to one axis' autorange.
BaseLayoutTitleFigure title.
BooleanOptionsOptions for boolean.
BreakMapThe compressed linear space of an axis with range breaks (see the module docs). Raw values are ms since the epoch (UTC) on date axes and plain numbers on linear axes.
CalendarSystemA non-Gregorian calendar used to interpret the date part of date strings (the xcalendar, ycalendar, … attributes; world calendars are plan E3).
ChildrenChild map of a container node.
ColorlistOptionsOptions for colorlist.
ColorOptionsOptions for color.
ColorscaleGroupOne named group of built-in colorscales (for docs and pickers).
ColorscaleOptionsOptions for colorscale.
ConfigA11yAccessibility options (plan E17). Holochart only.
ConfigEditsFine-grained editability, overriding editable per element.
ConfigToImageButtonOptionsOptions for the modebar "download image" button.
CoreComponentModuleA layout component (legend, annotations, shapes, …) contributing layout attributes. Components are always active, unlike trace-module layout attributes.
CoreTraceModuleA trace type (plan §4.4). schema is the single source of truth for the trace's own attributes; common attributes (visible, name, opacity, …, and xaxis/yaxis for cartesian traces) are added by the registry.
EncodedFigureA figure encoded by encodeFigure. Keys the input figure did not set are absent.
EncodedTypedArrayWhat encodeTypedArray produces: a TypedArraySpec with a base64 string.
EncodeFigureOptionsOptions for encodeFigure.
EnumeratedOptionsOptions for enumerated.
ExtremePointA data extreme a trace contributes to autorange, with the pixel padding it needs (marker size).
ExtrusionBevelRounded edges of extruded shapes (with depth).
ExtrusionMaterialThe material of extruded shapes (with depth): Plotly figures keep the default, plotly.
FigureDiffResult of diffFigures.
FigureInputA figure as passed by the user (plan ADR-001).
FlaglistOptionsOptions for flaglist.
FrameInputAn animation frame (figure.frames[i], addFrames): trace and layout changes applied as one step, like Plotly's frames.
FullItemExtrasFields added to every item of an ItemsNode in the full output.
FullTraceA trace after defaults. Module-specific attributes are reached through the index signature.
InfoArrayOptionsOptions for infoArray.
IssueOne problem found in a figure.
ItemsNodeAn array of objects (annotations, shapes, …) that supports templateitemname.
ItemsOptionsOptions for items.
LayoutDefaultsContextHelpers passed to layout-level supplyLayoutDefaults hooks.
LayoutFontGlobal font. Every text element inherits unset font fields from here.
LayoutGridA grid of subplots (Plotly layout.grid). Cartesian axes placed in the grid get their domain, anchor, side and position defaults from their cell; domain traces (pie, …) are placed with domain.row / domain.column. Values given on an axis or a trace always win.
LayoutGridDomainThe part of the plot area the grid fills.
LayoutMarginSpace around the plot area.
LayoutSelectionOne item of selections.
LayoutSelectionLineOutline style.
LayoutTitleFontTitle font. Defaults to layout.font with 1.4× size.
LayoutTransitionDefault transition for animated updates (E7.3).
LayoutUniformtextUniform text sizing for bar and pie labels (E4.6).
LayoutXaxisA x axis. xaxis2, xaxis3, … declare further x axes, referenced from traces as 'x2', 'x3', ….
LayoutXaxisAutorangeoptionsConstraints applied to the computed autorange.
LayoutXaxisMinorMinor ticks and grid lines between the major ticks.
LayoutXaxisRangebreakOne item of rangebreaks.
LayoutXaxisRangeselectorRange selector (plan E5.9): buttons over the chart that set the x range to a preset span ending at the current range end (last 6 months, year to date, all). Date axes only. The button whose range is in view shows as active.
LayoutXaxisRangeselectorButtonOne item of buttons.
LayoutXaxisRangeselectorFontButton font. Defaults to layout.font.
LayoutXaxisRangesliderRange slider (plan E5.9): an overview of all the data under the x axis, with a window over the range in view. Drag the window to pan, its ends to zoom, or click elsewhere to center the window there; the axis range changes with one relayout at the end of the drag. Y axes anchored to an axis with a range slider default to fixedrange: true, as in Plotly.
LayoutXaxisRangesliderYaxisThumbnail y range per y axis: yaxis for the subplot on y, yaxis2 for y2, … (one thumbnail per subplot on this x axis, drawn over each other).
LayoutXaxisTickfontTick-label font. Defaults to layout.font.
LayoutXaxisTickformatstopOne item of tickformatstops.
LayoutXaxisTitleAxis title.
LayoutXaxisTitleFontAxis title font. Defaults to layout.font with 1.2× size.
LayoutYaxisA y axis. yaxis2, yaxis3, … declare further y axes, referenced from traces as 'y2', 'y3', ….
LayoutYaxisAutorangeoptionsConstraints applied to the computed autorange.
LayoutYaxisMinorMinor ticks and grid lines between the major ticks.
LayoutYaxisRangebreakOne item of rangebreaks.
LayoutYaxisTickfontTick-label font. Defaults to layout.font.
LayoutYaxisTickformatstopOne item of tickformatstops.
LayoutYaxisTitleAxis title.
LayoutYaxisTitleFontAxis title font. Defaults to layout.font with 1.2× size.
LocaleA chart's resolved locale (fullLayout._locale): the translation function and the formatters every label, tick and hover text goes through.
LocaleDefinitionThe translatable content of a locale: UI strings and (partial) formats.
LocaleFormatNumber and date formats of a locale (plotly.js's format object, all keys resolved).
LocaleModuleA locale module, as register() takes it — the shape of plotly.js's lib/locales/*.js, so a Plotly locale registers unchanged.
LocaleStoreWhere registered locales live: the core registry keeps one of these per chart registry.
MakeSubplotsOptionsOptions for makeSubplots. Names follow Python's make_subplots in camelCase.
MakeSubplotsResultResult of makeSubplots.
NodeMetaMetadata shared by every schema node (leaves and containers).
NumberOptionsOptions for number, integer and angle.
ObjectNodeA nested container (e.g. marker, layout.margin).
PlacedTraceWhat MakeSubplotsResult.place sets on a trace.
PlaceOptionsOptions for MakeSubplotsResult.place.
PlanOptionsOptions for planUpdate.
PlotSchemaThe whole-library schema document.
RegistryHolds trace modules, components and named templates for a set of charts. Keeping this an explicit object (rather than module-level state) keeps core pure and lets tests and apps run isolated registries side by side.
ResolvedTemplateResult of resolving layout.template.
Scale-
SerializeWarningA warning reported through EncodeFigureOptions.onWarning.
StringOptionsOptions for string.
StyleConditionA condition on a point. Keys are fields of the trace ('y', 'text', 'marker.size', 'customdata[1]', or 'pointNumber', the point's index) holding StyleOperators or a value (shorthand for eq). Several fields must all hold; and, or and not combine conditions.
StyleOperatorsOperators on one field. Several operators on one field must all hold.
StylePointWhat a style function gets for each point (plan E8.6): the point's value in each of the trace's data arrays (x, y, z, customdata, ids, …) and in its top-level per-point arrays such as text (dataset '@column' references resolved), and its index.
StyleRuleA serializable style rule (plan E8.5): per-point attributes ('marker.color', 'marker.size', 'text', … — any arrayOk attribute of the trace) set on the points matching when. Later rules win over earlier ones; points no rule matches keep the trace's own value.
SubplotCellA subplot of the grid, as built by makeSubplots.
SubplotIdOptionsOptions for subplotId.
SubplotsSubplots discovered during supply-defaults (plan E1.4).
SubplotSpecOne cell of specs: the subplot in that cell (null for an empty cell).
SupplyDefaultsOptionsOptions for supplyDefaults.
SupplyDefaultsResultOutput of supplyDefaults.
TemplateA figure template.
TemplatedItemChildrenChildren added to every item of an items node so templates can target them.
TemplateSourceWhere named templates are looked up (implemented by the registry).
TickOne tick mark (plan E3.3).
TraceAxisHintsWhat a cartesian trace asks of its axes, beyond holding its data (see CoreTraceModule.axisHints). Every field is a default: what the figure sets on an axis wins, and so does another trace that shows the axis. A trace in a 3D scene asks the same of its scene's three axes (hide: true, and x / y / z; a scene has its own aspectmode).
TraceDefaultsContextHelpers passed to a trace module's supplyDefaults.
TraceDomainWhere this trace is drawn, as a part of the plot area.
TraceHoverlabelHover label style for this trace. Unset fields fall back to layout.hoverlabel (so there are no trace-level defaults).
TraceHoverlabelFontLabel font.
TraceLegendgrouptitleTitle of the legend group this trace belongs to.
TraceLegendgrouptitleFontGroup title font. Unset fields come from legend.grouptitlefont.
TraceMatchA trace present in both figures: index from in the previous data, to in the next.
TraceMatchingHow the traces of two figures correspond (see matchTraces).
TraceModuleMetaDocs metadata for a trace module.
TypedArraySpecA typed array encoded for JSON.
ValidateOptionsOptions for validate.

Type Aliases ​

Type AliasDescription
AnyFunctionA function-valued attribute (non-serializable, ADR-012).
AttrRoleDocs grouping tag for an attribute.
AxisType-
BaseLayoutFigure layout.
CartesianTraceAttributesAttributes of traces drawn on cartesian axes: the axes they use.
ChangeA changed attribute: a trace attribute (of a given type) or a layout attribute.
ColorScaleA colorscale: a named scale ('Viridis') or [position, color] stops from 0 to 1.
ColorscaleInputA colorscale to register: [position, color] stops from 0 to 1, or evenly spaced colors.
ColorscaleKindHow a built-in colorscale is meant to be used.
ColorscaleStopsA colorscale as [position, CSS color] stops, positions from 0 to 1 in order.
CommonTraceAttributesAttributes every trace type has (name, visible, hovertemplate, …).
ConfigChart configuration (non-visual behavior).
DataArrayA column of data: a plain array (numbers, strings, Dates, …) or a typed array.
DataArrayOptionsOptions for dataArray.
DataColumnA trace's data attribute (x, y, z, customdata, …): a column of values or a dataset column.
DatasetRefA reference to a column of the figure's datasets (plan E1.6), e.g. '@revenue' with dataset: 'sales' on the trace.
DecodedArrayA decoded 2D or 3D spec: rows of typed arrays (views of one buffer), as plotly.js returns.
DomainTraceAttributesAttributes of traces placed by a fraction of the plot area (pie, treemap, …).
DtypeThe dtypes encodeTypedArray writes; the same set plotly.js reads.
EditFlagOne edit-type flag. See EDIT_FLAGS.
EditTypeAn attribute's edit type: a single flag or a combination of flags.
ExtentAn extent [start, end] in plot-area fractions.
ExtrusionAttributes2.5D attributes (Holochart extension) of the traces the full bundle extrudes (bar, pie, …). Partial bundles add them with core's withExtrusion.
FullAxisA defaulted (minimal, M0) cartesian axis.
FullConfigThe config after defaults.
FullGridlayout.grid after defaults (plan E4.4, defaults/grid.ts). Present only for a grid of more than one cell; subplots (grid of independent subplots) or xaxes/yaxes hold the cell contents that were found.
FullLayoutThe layout after defaults. Axes exist only for discovered subplots; module and component layout attributes are reached through the index signature.
FunctionOptionsOptions for fn.
InferFullThe type of a schema node after defaults. Attributes with a dflt are always present; attributes without one may be undefined. Containers are always present. Trace modules with conditional defaults (e.g. marker only when mode includes markers) document where that guarantee is weaker.
InferInputThe input type accepted by a schema node.
IssueCodeWhat kind of problem an issue describes.
JSONSchemaNodeJSON form of any schema node.
JSONValueAny value JSON.parse can return.
LayoutInputA layout as FigureInput takes it by default: the base layout attributes (axes, margins, …) typed, and any other attribute (those of registered components and traces, such as legend or barmode) accepted as it is. The full bundle's Layout types those too. title takes the attributes the title component adds (subtitle, pad, …).
LocaleDefinitionsPer-chart locales (config.locales), keyed by name as the user wrote them.
PerPointA per-point (arrayOk) trace attribute: one value for every point, one value per point (null for a point without one; rows of values for the cells of a grid, such as a heatmap's text or a table's columns), a style function (plan E8.6) or a dataset column ('@column').
PerPointColorA per-point (arrayOk) color, such as marker.color: a CSS color, or per point a color or a number (mapped through the trace's colorscale), a typed array of numbers, or a style function. A dataset column is a '@column' string.
PerPointNumberA per-point (arrayOk) number, such as marker.size: PerPoint, or a typed array.
PointStyleFunctionA style function (plan E8.6) as a per-point attribute takes it: called with a StylePoint (the point's value in each data array, and pointNumber), its index and the input trace. Declare the fields it reads: (p: { y: number }) => (p.y > 10 ? 'gold' : 'gray').
PrimitiveValueValues allowed in enumerated.values and flaglist.extras.
ReducedMotionconfig.a11y.reducedMotion: 'auto' follows the user's prefers-reduced-motion.
RGBAColorsRGB 0–1 RGBA, alpha not premultiplied — the render layer's color format.
SchemaNodeAny schema node.
SerializeWarningCodeWhy encodeFigure changed or dropped a value.
SharedAxesAxis sharing: true shares along the natural direction (x per column, y per row); 'columns', 'rows' and 'all' name the group explicitly. See makeSubplots for the limits.
StageA pipeline stage an update can trigger.
StyleFunctionA style function (plan E8.6, ADR-012) on a per-point (arrayOk) attribute, e.g. marker: { color: (p) => (p.y > 10 ? 'gold' : 'gray') }. It is called once per point with the point, its index and the input trace, and behaves exactly like the array of its results. Not serializable: chartToJSON() stores the evaluated array (with a warning).
StyleValueA value a condition compares against: numbers, strings (ISO dates compare as dates), booleans.
SubplotTypeSubplot types a SubplotSpec can name.
SupportedSubplotTypeThe subplot types makeSubplots can build today.
TraceCategoryTrace categories drive shared behavior: cartesian traces get xaxis/yaxis attributes and take part in axis discovery; domain traces get domain.{x, y, row, column} and are placed by a fraction of the plot area or a layout.grid cell (E4.5); showLegend traces count towards the legend default.
TraceInputA trace of any type, as a registry that does not know it accepts it: the loose default of FigureInput. Any object fits, so partial bundles, plugins and data from untyped sources (JSON, Express) work; the full bundle's Figure (@mk7s/holochart) types every built-in trace instead, and each trace package exports its own trace types (ScatterTrace, TracesBasic, …).
TypedArrayAny JS typed array except BigInt64Array/BigUint64Array (charts deal in doubles).
TypedArrayConstructorA typed array constructor (TypedArray).
ValTypeA value type understood by coercion and validation.

Variables ​

VariableDescription
attrThe schema DSL. Each builder returns a plain, JSON-like object, so schemas can be inspected, merged and serialized to plot-schema.json.
BUILTIN_COLORSCALE_GROUPSEvery built-in colorscale group, in registration (priority) order. plotly.js's names come first, so a later group with the same name (plotly.py's ColorBrewer Blues) never changes what the string means; those lists stay available as values (e.g. COLORBREWER_SEQUENTIAL.Blues).
BUILTIN_PALETTESThe built-in qualitative palettes (plotly.py plotly.colors.qualitative), by name.
cartesianTraceAttributesAttributes added to traces in the cartesian category.
CARTO_DIVERGINGCARTOColors diverging scales by name.
CARTO_SEQUENTIALCARTOColors sequential scales by name.
CMOCEAN_CYCLICALcmocean cyclical scales by name.
CMOCEAN_DIVERGINGcmocean diverging scales by name.
CMOCEAN_SEQUENTIALcmocean sequential scales by name.
COLORBREWER_DIVERGINGColorBrewer diverging scales by name.
COLORBREWER_SEQUENTIALColorBrewer sequential scales by name.
colorsThe colorscale registry as one object (Holochart.colors.register('Brand', stops), plan E8.2).
colorwaysThe colorway (qualitative palette) registry as one object: colorways.get('Dark24').
commonTraceAttributesAttributes every trace has.
configSchemaThe config schema.
CYCLICALplotly.py cyclical scales by name.
DIVERGING_PLOTLYplotly.js-derived diverging scales (plotly.colors.diverging).
domainTraceAttributesAttributes added to traces in the domain category (plan E4.5; Plotly's plots/domain.js): pie, and later sunburst, treemap, funnelarea, indicator, … are placed by a fraction of the plot area instead of axes. row / column pick a layout.grid cell, which then gives the default x / y; without a grid they are dropped.
EDIT_FLAGSEdit-type flags (plan E1.7). Each attribute declares which pipeline stages a change to it invalidates, so updates re-run only what is needed.
extrusionAttributesdepth, bevel and material of extrudable 2D traces (plan E8.9; see the module comment). Spread into a trace schema; call supplyExtrusionDefaults from its supplyDefaults.
FACET_LABEL_NAMEname of the facet labels Express adds (day=Sat above a facet column, time=Dinner at the right of a facet row): like SUBPLOT_TITLE_NAME, those above the top row push the top margin (a top legend sits above them), but they keep layout.font's size, as px's facet labels.
HOLOCHART_COLORWAYColorway of the default look: saturated mid-luminance hues, ordered so neighbours differ in hue (red, blue, indigo, emerald, orange, teal, gold, magenta), each legible as a 1.25 px line on the #0a0a0f background.
HOLOCHART_FONT_FAMILYFont family of the default look. Charts draw it with the first family that is registered (fonts.register) and otherwise with the renderer's bundled default font.
holochartTemplateHolochart's default look (ADR-021): a dark, dense chart. #0a0a0f paper and plot area, a faint #1a1a22 grid, #2c2c38 axis lines with short outside ticks, 9 px text (8 px tick labels, an 11 px left-aligned title) in Helvetica Neue, tight margins that axes, the title and the legend grow as needed (automargin; the title and a top legend stack, and a 4 px gutter keeps grown margins' content off the edge), a transparent horizontal legend above the plot area, dark hover labels, thin lines and small markers, borderless bars, slim colorbars, tables with a raised header and faint rules.
layoutSchemaThe base layout schema. Registry-merged with trace-module and component layout attributes.
noneTemplateThe empty template (plotly.py's none): schema defaults only, i.e. Plotly's look.
plotlyClassicTemplatePlotly's look, spelled out: the library's schema defaults (white paper and plot area, #444 text in Open Sans 12 px, the D3 category10 colorway, a light #eee grid, Plotly's automatic colorscales Reds / Blues / RdBu). layout.template: 'plotly-classic' renders exactly what layout.template: 'none' (or null) renders; unlike none it can be the base of a composition (composeTemplates(plotlyClassicTemplate, …)).
PLOTLYJS_COLORSCALESPlotly.js's named colorscales, by their canonical names.
QUALITATIVEAll qualitative sequences by plotly.py name.
SEQUENTIALplotly.py's own sequential scales by name.
VAL_TYPESEvery value type understood by coercion and validation.
xaxisSchemaCartesian x-axis schema (plan E3): the axis attributes plus the range slider and selector.
yaxisSchemaCartesian y-axis schema (plan E3).

Functions ​

FunctionDescription
canonicalColorParse any CSS color and return its canonical rgb()/rgba() string, or null if value is not a valid color. 'transparent' becomes rgba(0, 0, 0, 0).
colorscaleNamesNames of every resolvable colorscale (registered and plotly.js built-ins), without _r.
colorwayNamesNames of every registered colorway, and Safe.
composeTemplatesCompose templates left to right; later templates win. Layout is deep-merged (arrays replaced); per-type trace lists are merged element-wise so both templates' cycles survive.
createRegistryCreate an empty registry. Trace packages register their modules into it; the full bundle creates one shared registry.
decodeFigureDecode a figure encoded by encodeFigure (or by Plotly): every { dtype, bdata, shape? } spec, anywhere in the figure, becomes a typed array again (a 2D shape gives an array of row typed arrays, as plotly.js does). ISO date strings stay strings, which Holochart accepts wherever it accepts dates. Accepts the JSON text or the parsed value; the input is never mutated.
decodeTypedArrayDecode a TypedArraySpec. 1D specs give one typed array; shape: 'rows,cols' gives an array of rows typed arrays (row-major views of one buffer, as plotly.js returns), and a 3D shape an array of such arrays. Throws on an unknown dtype, invalid base64, a byte length that is not a whole number of elements, or a shape that does not match the data.
diffFiguresDiff two figure inputs (plan E1.8). Never mutates its arguments and never reads the contents of data arrays, so its cost is proportional to the size of the spec, not of the data.
encodeFigureEncode an input figure as JSON-safe data: JSON.parse(JSON.stringify(out)) deep-equals out. The input is never mutated.
encodeTypedArrayEncode a typed array (only the view's own elements, whatever its byteOffset) as { dtype, bdata }. Bits are preserved exactly, so NaN, -0 and ±Infinity survive.
evenStopsEvenly spaced stops from a list of colors.
fontSchemaFont attributes without defaults. Containers like title.font inherit unset fields from layout.font during supply-defaults.
formatDateFormat milliseconds since the epoch as the shortest ISO-style UTC string that parseDate reads back to the same value, Plotly-style: 2024-03-01, 2024-03-01 12:30, 2024-03-01 12:30:05, 2024-03-01 12:30:05.25.
formatIssueFormat an issue for console output.
getColorscaleThe stops of a named colorscale ('Viridis', 'viridis_r'), or undefined for unknown names. The result is shared: do not mutate it.
getColorwayA named colorway's colors (case-insensitive), or undefined. Safe (CARTO's colorblind-safe palette, plan E17.5) is always available, like plotly.js's colorscale names; registering a colorway of that name replaces it. Shared: do not mutate.
isColorscaleNameWhether name resolves to a colorscale (including _r variants).
isDateStringTrue if v is an ISO-8601-style date string.
isValidColorTrue if value is a string d3-color can parse.
isValidDateTrue for valid Date instances.
litMaterialAttributesThe material attribute (Holochart extension, E8.7): shared by the 3D traces (sceneMaterialAttributes) and extruded 2D traces (extrusionAttributes). description describes the container. Unset parameters keep the three.js material's defaults.
makeSubplotsBuild a subplot grid like Python's make_subplots: axis domains, anchors and title annotations for rows × cols cells, and a place helper for traces.
parseDateConvert a date value to milliseconds since the Unix epoch (UTC).
planRelayoutPlan a relayout: every attribute path in update.
planRestylePlan a restyle: every attribute path in update applied to the given traces.
planUpdateMerge the edit flags of every changed path into the set of stages to run.
plotSchemaBuild the whole-library schema document from a registry (plan E1.1 plot-schema.json).
registerBuiltinColorsRegister every built-in colorscale name (plan E8.2: plotly.py's sequential, diverging and cyclical scales, cmocean, CARTO and ColorBrewer; about 100 names plus their _r variants) and every qualitative palette as a colorway. Names already registered keep their meaning. Idempotent.
registerColorscaleRegister a named colorscale (replacing any scale of the same name, case-insensitively). Returns a function that unregisters it.
registerColorscalesRegister many colorscales at once. With overwrite: false, names that already resolve (a registered scale or a plotly.js built-in) are skipped — how the built-in sets are added without changing what existing names mean.
registerColorwayRegister a named colorway (qualitative palette). Returns a function that unregisters it.
resolveTemplateResolve a layout.template value: a template object, a registered name, a +-composition of names, null/false for no template, or undefined for the registry's default template.
reverseColorscaleA scale with its stops mirrored: position p → 1 - p, order reversed.
schemaToJSONConvert a schema node to JSON. Leaves keep their valType and constraints; containers become { role: 'object', ...meta, <children> } and item arrays { role: 'items', itemName, items }, mirroring Plotly's plot-schema layout so existing tooling can read it.
supplyDefaultsCompute fullData, fullLayout and fullConfig for a figure.
toRGBAConvert a CSS color to sRGB 0–1 RGBA floats for the renderer, or null if invalid. Results are cached and frozen, so callers must not mutate them.
toRGBAArrayPack a list of CSS colors into a Float32Array of 4 * n sRGB 0–1 floats (the render layer's per-item color format). Invalid entries use fallback.
validateValidate a figure and return every issue found (empty when valid).
withExtrusionmodule with extrusionAttributes added to its schema and coerced after its own defaults: the full bundle registers withExtrusion(bar) (plan E9.10); the trace's view draws depth (bar: setBarExtruder).

Released under the MIT License.