A variance-band draw layer: fills the envelope between the lower and upper
columns of series (typically rollingByColumn percentiles), gap-aware, and
registers itself into the enclosing Layers. Renders nothing to the
DOM — the row draws it.
Compose two for a two-tone spread — author the wider band first so it sits behind (declaration order = z-order, back-to-front), then the line on top:
<Layers>
<BandChart series={s} lower="p5" upper="p95" as="outer" />
<BandChart series={s} lower="p25" upper="p75" as="inner" />
<LineChart series={s} column="p50" />
</Layers>
Props
Name of the numeric column for the band's lower edge (e.g. p25).
seriesTimeSeriesTimeSeriesclasspond-tsAn immutable, schema-typed, ordered collection of events — the batch
layer's core primitive. A series is constructed whole from complete data
and never mutated: every transform (filter, align, rollup, …)
returns a new TimeSeries, so the full analytical surface can sort,
scan, or index freely. Example:
new TimeSeries({ name, schema, rows }).
<S> | ValueSeriesValueSeriesclasspond-tsA value-keyed series — the closed value-axis counterpart of
TimeSeries. Its key is a monotonic non-time axis (distance, cumulative
work, …). Two doors in: project a TimeSeries onto one of its monotonic
columns (TimeSeries.byValue(axis) — a track re-keyed by cumulative
distance), or construct directly from columnar arrays
(`ValueSeries.fromC…
<VS>requiredThe source series. A TimeSeries fills the envelope against the time axis;
a ValueSeries (series.byValue('dist')) against its value axis — the
container infers which from the data, no axis-type prop (mirrors
<LineChart> / <AreaChart>). Either way lower/upper name the numeric
edge columns.
Live charts: series.byValue(…) mints a fresh projection each call, so
an inline series={s.byValue('dist')} re-registers this layer every render —
on a frequently re-rendering chart, memoize the projection (useMemo).
Name of the numeric column for the band's upper edge (e.g. p75).
asstringThe band's semantic identifier — what the spread is (e.g. outer for a
p5/p95 envelope, inner for p25/p75). The theme maps it to a
BandStyle (theme.band[as] ?? theme.band.default). Omitted ⇒ the
default band style — no per-component fill/opacity override (restyle via
the theme, the single styling channel).
axisstringWhich <YAxis> (by its id) this band scales against — the scale, where
as picks the style. Omitted ⇒ the row's default axis.
curveCurveCurvetype@pond-ts/charts'linear' | 'monotone' | 'natural' | 'basis' | 'step'Render-time path interpolation for a line / band — how the path is drawn
between points, a pure view concern (it does not change the data; denoising
is pond's smooth(), upstream). Sparse aggregated bands look angular as a
polyline; a curve smooths the path (RTC's interpolation).
Render-time edge interpolation — both edges drawn with this curve. Omitted
⇒ 'linear'. Prefer a symmetric curve ('natural'/'basis') to
smooth a sparse aggregated envelope (RTC's interpolation) — 'monotone'
assumes increasing x and smooths the right→left lower edge asymmetrically.
Denoise the underlying values with smooth(), not this.