blazeplot
v0.3.5
Published
Real-time LOD time series rendering engine for the browser.
Downloads
2,728
Readme
Fast WebGL2 plotting engine for the browser.
Built for people who have hit the performance ceiling of Chart.js, Plotly, and similar browser charting libraries. BlazePlot keeps the hot path GPU-native and the DOM minimal, so large streaming datasets stay interactive instead of turning into a slideshow.
Built on native WebGL2 with no rendering runtime dependency.
Performance
The core chart runtime is intentionally compact: the production build for blazeplot (without optional plugins) is about 139 KiB raw / 34 KiB gzip. Optional plugins and helpers ship as separate subpath entries.
A minimal 1,000-point line chart renders its first frame in about 0.3 ms median / 0.5 ms p95 of render work (640×360 canvas, HeadlessChrome 148, SwiftShader). Chart construction and WebGL setup takes about 19 ms median.
Size and first-draw comparison (vendor-published figures, best value bolded):
| Library | Version | Size | First draw | |---|---:|---:|---:| | BlazePlot | 0.3.4 | 139 KiB raw / 34 KiB gzip | 0.3 ms render (19 ms setup) | | Chart.js | 4.5.1 | 1,562 KB tarball (5.9 MB unpacked) | — | | Plotly.js | 3.5.0 | 4.6 MB min (1.4 MB gzip) | — | | LightningChart JS | 5.2.1 | 1.2–1.5 MB JS (25.5 MB unpacked) | — | | SciChart.js | 5.x | 1.9 MB JS + ~1 MB WASM | ~250 ms init |
References: BlazePlot — this release build and local benchmark. Chart.js — v4.5.1. Plotly.js — v3.5.0. LightningChart JS — v5.2.1. SciChart.js — v5.
Installation
bun install blazeplotQuick start
A chart only needs a host element. For regular arrays, wrap your data in a StaticDataset; capacity is only needed when you want a streaming ring buffer.
<div id="chart" style="width:100%;height:400px"></div>
<script type="module">
import { Chart, StaticDataset } from "blazeplot";
const el = document.getElementById("chart");
if (!el) throw new Error("Missing #chart element");
const x = Array.from({ length: 1000 }, (_, i) => i);
const y = x.map((value) => Math.sin(value * 0.02));
const chart = new Chart(el);
chart.addLine({ dataset: new StaticDataset(x, y), name: "sine" });
chart.setViewport({ xMin: x[0], xMax: x[x.length - 1], yMin: -1.5, yMax: 1.5 });
chart.start();
</script>Features
| | |
|---|---|
| WebGL2 rendering | GPU-accelerated plot rendering from the ground up. No Canvas2D fallback. Axis labels use lightweight DOM layers. |
| Flexible data model | Streaming ring buffer or static arrays. Bring your own data shape. |
| LOD downsampling | Min/max pyramid for efficient line rendering at any zoom level — sparse views show raw points, dense views show vertical segments. Server-pre-sampled min/max buckets can also be rendered directly with ServerSampledDataset. |
| Pan & zoom | Pointer/touch pan and wheel zoom via Camera2D. Customizable viewport policies. |
| Grid lines | Data-anchored grid rendered as WebGL line lists. |
| Axis labels | Smart tick generation with DOM labels. Per-axis inside/outside positioning; outside axes reserve real layout gutters. |
| Multi-series | Independent buffers, styles, and visibility per series. Line, area, scatter, bar, OHLC, and candlestick modes are supported. |
| Plugin-ready UI | Optional built-in legend, tooltip, interactions, annotations, selection, crosshair, and navigator plugins use the same public APIs available to custom plugins. |
| React and linked charts | First-party blazeplot/react and blazeplot/linked subpaths support React usage and synchronized multi-panel layouts. |
| Export helpers | chart.screenshot() composites WebGL output with built-in DOM/SVG overlays. blazeplot/data provides lightweight CSV/JSON data export and pure transform helpers; blazeplot/export provides download/clipboard helpers. |
| Benchmark overlay | Built-in fps, frame time, vertex count, draw calls. |
| ResizeObserver | Automatic DPR-aware canvas sizing. |
Data export and transforms
Use the tree-shakable blazeplot/data subpath when you only need data helpers. It collects raw rows from the current visible x range, a committed selection plugin state, or the full chart, then serializes them as CSV or JSON.
import { chartDataToCSV, chartDataToJSON, exportSelectedChartData, exportVisibleChartData, rollingMean } from "blazeplot/data";
import { downloadBlob } from "blazeplot/export";
const visible = exportVisibleChartData(chart);
const csv = chartDataToCSV(visible);
const selection = selectionPluginHandle.getSelection();
const selectedJson = chartDataToJSON(exportSelectedChartData(chart, selection));
const smoothed = rollingMean(visible.series[0]?.samples ?? [], 5);
downloadBlob(new Blob([csv], { type: "text/csv" }), "visible-data.csv");exportVisibleChartData exports samples in each series' current x viewport by default; pass { includeYRange: true } to require y-viewport overlap. Selection exports follow the selection plugin mode (x-range, y-range, or xy) and include OHLC/candlestick open, high, low, and close columns when available.
API reference
This section is generated by bun run docs:readme from TypeScript declaration files, JSDoc comments, and built dist/ bundle sizes. Do not edit it by hand.
- Quick start
- Features
- Architecture
- Development
- Overview
- Examples
- Data semantics
- Performance recipes
- Built-in plugins
- Plugin authoring
- Theming and responsive layout
- Versioning and migration
- Browser and dependency support
- Roadmap
- Bundle size summary
- Changelog for v0.3.5
Package entry points
| Import | Contents |
|---|---|
| blazeplot | Core chart, data, interaction, rendering types, and low-level primitives. |
| blazeplot/core | Data structures, datasets, LOD helpers, and series storage without chart UI. |
| blazeplot/interaction | Camera, axis, pan/zoom intent, and viewport policy helpers without chart UI. |
| blazeplot/render | Renderer and WebGL backend primitives without chart UI. |
| blazeplot/react | React wrapper component and hooks. |
| blazeplot/linked | Linked chart layout helpers with tooltip/crosshair sync factories. |
| blazeplot/linked-core | Lean linked chart layout helpers without tooltip/crosshair sync imports. |
| blazeplot/data | Pure chart data export and transform helpers. |
| blazeplot/export | Screenshot download and clipboard helpers. |
| blazeplot/plugins/legend | Built-in legend plugin. |
| blazeplot/plugins/tooltip | Built-in tooltip plugin. |
| blazeplot/plugins/interactions | Built-in pan, zoom, axis interaction, and reset plugin. |
| blazeplot/plugins/annotations | Built-in annotation overlay plugin. |
| blazeplot/plugins/selection | Built-in brush/range selection plugin. |
| blazeplot/plugins/crosshair | Built-in crosshair and ruler plugin. |
| blazeplot/plugins/navigator | Built-in overview/navigator plugin. |
Bundle size summary
Generated from dist/ after the package build. Budgets are enforced by bun run test:bundle-size.
| Chunk | File | Size | Budget | Headroom |
|---|---|---:|---:|---:|
| root entry | dist/index.js | 0.7 KiB | 31.3 KiB | 30.6 KiB free |
| core subpath entry | dist/core.js | 0.7 KiB | 3.9 KiB | 3.2 KiB free |
| interaction subpath entry | dist/interaction.js | 0.1 KiB | 2.0 KiB | 1.9 KiB free |
| render subpath entry | dist/render.js | 0.3 KiB | 2.0 KiB | 1.7 KiB free |
| react entry | dist/react.js | 0.7 KiB | 7.8 KiB | 7.1 KiB free |
| linked entry | dist/linked.js | 0.4 KiB | 15.6 KiB | 15.3 KiB free |
| linked core entry | dist/linked-core.js | 0.1 KiB | 7.8 KiB | 7.7 KiB free |
| data entry | dist/data.js | 4.9 KiB | 11.7 KiB | 6.8 KiB free |
| export entry | dist/export.js | 1.3 KiB | 7.8 KiB | 6.5 KiB free |
| interactions plugin | dist/plugins/interactions.js | 15.3 KiB | 23.4 KiB | 8.1 KiB free |
| annotations plugin | dist/plugins/annotations.js | 9.3 KiB | 15.6 KiB | 6.3 KiB free |
| navigator plugin | dist/plugins/navigator.js | 8.6 KiB | 15.6 KiB | 7.0 KiB free |
| selection plugin | dist/plugins/selection.js | 5.3 KiB | 11.7 KiB | 6.4 KiB free |
| legend plugin | dist/plugins/legend.js | 2.8 KiB | 7.8 KiB | 5.0 KiB free |
| tooltip plugin entry | dist/plugins/tooltip.js | 0.1 KiB | 3.9 KiB | 3.8 KiB free |
| crosshair plugin entry | dist/plugins/crosshair.js | 0.1 KiB | 3.9 KiB | 3.8 KiB free |
| shared Chart chunk | dist/Chart-D1ISQl_J.js | 57.0 KiB | 136.7 KiB | 79.7 KiB free |
| shared RingBuffer chunk | dist/RingBuffer-Bd5JaRf4.js | 29.6 KiB | 39.1 KiB | 9.4 KiB free |
| shared OhlcDataset chunk | dist/OhlcDataset-1cMrc6BC.js | 17.3 KiB | 23.4 KiB | 6.1 KiB free |
| shared AxisController chunk | dist/AxisController-CUL9i0MS.js | 13.6 KiB | 19.5 KiB | 6.0 KiB free |
| shared WebGL2Backend chunk | dist/WebGL2Backend-wxbXnm0h.js | 20.9 KiB | 23.4 KiB | 2.5 KiB free |
| shared LinkedChartsCore chunk | dist/LinkedChartsCore-DDrAyfEg.js | 2.1 KiB | 7.8 KiB | 5.7 KiB free |
| lazy screenshot chunk | dist/screenshot-BVw2v67J.js | 3.0 KiB | 7.8 KiB | 4.8 KiB free |
| shared OverlayUtils chunk | dist/OverlayUtils-Gk-tb2Ak.js | 3.1 KiB | 7.8 KiB | 4.7 KiB free |
| shared Tooltip chunk | dist/Tooltip-DDEQ32oy.js | 4.8 KiB | 11.7 KiB | 6.9 KiB free |
| shared Crosshair chunk | dist/Crosshair-DyBHoqIB.js | 8.6 KiB | 15.6 KiB | 7.0 KiB free |
Selected generated declarations
These member tables are generated from TypeScript declarations.
| Member |
|---|
| isWebGL2Available(): boolean |
| constructor(target: HTMLElement, options?: ChartOptions) |
| get canvas(): HTMLCanvasElement |
| get rootElement(): HTMLElement |
| get plotElement(): HTMLElement |
| get xAxisElement(): HTMLElement |
| get yAxisElement(): HTMLElement |
| get y2AxisElement(): HTMLElement |
| get theme(): ResolvedChartTheme |
| getWebGLContext(): WebGL2RenderingContext \\| null |
| getCamera(yAxis?: SeriesYAxis): Camera2D |
| dataToPlot(x: number, y: number, yAxis?: SeriesYAxis): [ number, number ] |
| clientToData(clientX: number, clientY: number, yAxis?: SeriesYAxis): [ number, number ] \\| null |
| getViewport(yAxis?: SeriesYAxis): Viewport |
| pan(intent: PanIntent): void |
| zoom(intent: ZoomIntent): void |
| addSeries(config: SeriesConfig, style?: Partial<SeriesStyle>): SeriesStore |
| addLine(config: TypedSeriesConfig, style?: Partial<SeriesStyle>): SeriesStore |
| addArea(config: TypedSeriesConfig, style?: Partial<SeriesStyle>): SeriesStore |
| addScatter(config: TypedSeriesConfig, style?: Partial<SeriesStyle>): SeriesStore |
| addBar(config: TypedSeriesConfig, style?: Partial<SeriesStyle>): SeriesStore |
| addOhlc(config: TypedSeriesConfig, style?: Partial<SeriesStyle>): SeriesStore |
| addCandlestick(config: TypedSeriesConfig, style?: Partial<SeriesStyle>): SeriesStore |
| removeSeries(series: SeriesStore): boolean |
| setSeriesVisible(series: SeriesStore, visible: boolean): boolean |
| getSeriesState(): ChartSeriesState[] |
| setViewport(v: { xMin?: number; xMax?: number; yMin?: number; yMax?: number; }): void |
| setYViewport(yAxis: SeriesYAxis, v: { yMin?: number; yMax?: number; }): void |
| setXFollowPaused(paused: boolean): void |
| resumeXFollow(): void |
| fitToData(options?: ChartFitToDataOptions): boolean |
| resize(dpr?: number): boolean |
| getFrameStats(target?: ChartFrameStats): ChartFrameStats |
| getHoverState(): ChartHoverState \\| null |
| setLayoutReservation(id: string, reservation: ChartLayoutReservation \\| null): void |
| subscribe(event: "hover", callback: (state: ChartHoverState \\| null) => void): () => void |
| subscribe(event: "serieschange", callback: () => void): () => void |
| subscribe(event: "themechange", callback: () => void): () => void |
| subscribe(event: "render", callback: (chart: Chart) => void): () => void |
| subscribe(event: "viewportchange", callback: (event: ChartViewportChangeEvent) => void): () => void |
| subscribe(event: "select", callback: (event: ChartSelectEvent) => void): () => void |
| subscribe(event: "seriesclick", callback: (event: ChartSeriesClickEvent) => void): () => void |
| subscribe(event: ChartPointerEventType, callback: (event: ChartPointerEventState) => void): () => void |
| emitSelect(selection: unknown): void |
| setTheme(theme?: ChartTheme): void |
| setGridVisible(visible: boolean): void |
| getGridVisible(): boolean |
| setAxes(axes: ChartOptions["axes"]): void |
| pick(clientX: number, clientY: number, options?: ChartPickOptions): ChartHoverState \\| null |
| screenshot(options?: ChartScreenshotOptions): Promise<Blob> |
| start(): void |
| stop(): void |
| dispose(): void |
| Member |
|---|
| viewportPolicy?: ViewportPolicy |
| grid?: boolean |
| gridStyle?: Partial<SeriesStyle> |
| axes?: boolean \\| { x?: boolean \\| AxisConfig; y?: boolean \\| AxisConfig; y2?: boolean \\| AxisConfig; } |
| title?: string \\| ChartTitleConfig |
| subtitle?: string \\| ChartTitleConfig |
| hover?: ChartPickOptions |
| accessibility?: boolean \\| ChartAccessibilityOptions |
| autoFitY?: boolean \\| ChartAutoFitYOptions |
| followX?: boolean \\| ChartFollowXOptions |
| plugins?: readonly ChartPlugin[] |
| theme?: ChartTheme |
| backendFactory?: ChartBackendFactory | Advanced hook for supplying a custom GPU backend. Defaults to WebGL2Backend. |
| Member |
|---|
| backgroundColor?: ThemeColor |
| gridColor?: ThemeColor |
| axisColor?: string |
| axisFont?: string |
| seriesColors?: readonly ThemeColor[] |
| tooltipBackgroundColor?: string |
| tooltipTextColor?: string |
| tooltipFont?: string |
| legendBackgroundColor?: string |
| legendBorderColor?: string |
| legendTextColor?: string |
| legendMutedTextColor?: string |
| legendFont?: string |
| titleColor?: string |
| titleFont?: string |
| subtitleColor?: string |
| subtitleFont?: string |
| axisTitleColor?: string |
| axisTitleFont?: string |
| Member |
|---|
| visible?: boolean |
| position?: AxisPosition |
| scale?: AxisScale |
| tickFormat?: AxisTickFormat |
| timezone?: AxisTimeZone |
| title?: string \\| AxisTitleConfig |
| Member |
|---|
| config: SeriesConfig |
| style: SeriesStyle |
| constructor(dataset: Dataset, config: SeriesConfig, style: SeriesStyle) |
| get hasLOD(): boolean |
| get hasServerMinMax(): boolean |
| get dirty(): boolean |
| get length(): number |
| get visible(): boolean |
| setVisible(visible: boolean): void |
| append(x: ArrayLike<number>, y: ArrayLike<number>): void |
| appendY(y: ArrayLike<number>): void |
| markDirty(): void |
| clear(): void |
| rebuildPyramid(): void |
| query(viewport: Viewport, pixelWidth: number): LODView |
| visibleSampleCount(viewport: Viewport): number |
| sampleAt(index: number): SeriesSample \\| null |
| ohlcAt(index: number): SeriesOhlcSample \\| null |
| dataBounds(options?: SeriesDataBoundsOptions): SeriesDataBounds \\| null |
| nearestSampleByX(x: number, viewport?: Viewport): SeriesSample \\| null |
| nearestSampleByPoint(x: number, y: number, viewport: Viewport, plotWidth: number, plotHeight: number, maxDistancePx?: number): SeriesSample \\| null |
| copyRawVisible(viewport: Viewport, target: Float32Array, maxPoints: number, xOrigin?: number): number |
| copyScatterVisible(viewport: Viewport, target: Float32Array, maxPoints: number, pixelWidth: number, pixelHeight: number, pointSize: number, xOrigin?: number): number |
| copyScatterRange(start: number, end: number, viewport: Viewport, target: Float32Array, maxPoints: number, xOrigin?: number, pixelHeight?: number, pointSize?: number): number |
| copyRawVisibleClipped(viewport: Viewport, target: Float32Array, maxPoints: number, xOrigin?: number): number |
| copyRawVisibleClipSpace(viewport: Viewport, target: Float32Array, maxPoints: number): number |
| copyRawRange(start: number, end: number, target: Float32Array, maxPoints: number, xOrigin?: number): number |
| copyAreaVisible(viewport: Viewport, target: Float32Array, maxPoints: number, baseline?: number, xOrigin?: number): number |
| copyAreaRange(start: number, end: number, target: Float32Array, maxPoints: number, baseline?: number, xOrigin?: number): number |
| copyMinMaxVisible(viewport: Viewport, target: Float32Array, maxSegments: number, xOrigin?: number): number |
| copyMinMaxInstanced(viewport: Viewport, target: Float32Array, maxSegments: number, xOrigin?: number): number |
| copyOhlcRange(start: number, end: number, target: Float32Array, maxCandles: number, tickWidth: number, xOrigin?: number): number |
| copyOhlcTuplesRange(start: number, end: number, target: Float32Array, maxCandles: number, xOrigin?: number): number |
| visibleIndexRange(viewport: Viewport \\| undefined, outerPadding?: number): { start: number; end: number; } |
| Member |
|---|
| mode: SeriesMode |
| capacity?: number |
| downsample?: LODStrategy |
| overflow?: BufferOverflowStrategy |
| dataset?: Dataset |
| yAxis?: SeriesYAxis |
| id?: string |
| name?: string |
| Member |
|---|
| color: readonly [ number, number, number, number ] |
| lineWidth: number |
| pointSize?: number |
| barWidth?: number |
| baseline?: number |
| fillColor?: readonly [ number, number, number, number ] |
| tickWidth?: number |
| upColor?: readonly [ number, number, number, number ] |
| downColor?: readonly [ number, number, number, number ] |
| wickColor?: readonly [ number, number, number, number ] |
| Member |
|---|
| capacity: number |
| xStep: number |
| constructor(capacity: number, options?: UniformRingBufferOptions) |
| get length(): number |
| get range(): TimeRange \\| null |
| push(x: number, y: number): void |
| append(x: ArrayLike<number>, y: ArrayLike<number>): void |
| appendY(y: ArrayLike<number>): void |
| clear(): void |
| getX(index: number): number |
| getY(index: number): number |
| isGap(index: number): boolean |
| lowerBoundX(x: number): number |
| upperBoundX(x: number): number |
| rangeMinMaxY(start: number, end: number): { minY: number; maxY: number; } \\| null |
| copyVisibleSamples(viewport: Viewport, target: Float32Array, maxPoints: number, layout: SampleLayout, baseline: number, xOrigin: number): number |
| copySamplesRange(start: number, end: number, target: Float32Array, maxPoints: number, layout: SampleLayout, baseline: number, xOrigin: number): number |
| copyMinMaxSegments(viewport: Viewport, target: Float32Array, maxSegments: number, layout: MinMaxLayout, xOrigin: number): number |
| Member |
|---|
| capacity: number |
| constructor(capacity: number, options?: RingBufferOptions) |
| get length(): number |
| get range(): TimeRange \\| null |
| push(x: number, y: number): void |
| append(x: ArrayLike<number>, y: ArrayLike<number>): void |
| get(index: number): { x: number; y: number; } \\| null |
| getX(index: number): number |
| getY(index: number): number |
| isGap(index: number): boolean |
| lowerBoundX(x: number): number |
| upperBoundX(x: number): number |
| rangeMinMaxY(start: number, end: number): { minY: number; maxY: number; } \\| null |
| clear(): void |
| Member |
|---|
| constructor(xData: ArrayLike<number>, yData: ArrayLike<number>) |
| get length(): number |
| get range(): TimeRange \\| null |
| getX(index: number): number |
| getY(index: number): number |
| isGap(index: number): boolean |
| lowerBoundX(x: number): number |
| upperBoundX(x: number): number |
| Member |
|---|
| capacity: number |
| constructor(capacity: number, options?: OhlcRingBufferOptions) |
| get length(): number |
| get range(): TimeRange \\| null |
| push(x: number, open: number, high: number, low: number, close: number): void |
| updateLast(open: number, high: number, low: number, close: number): boolean |
| append(x: ArrayLike<number>, open: ArrayLike<number>, high: ArrayLike<number>, low: ArrayLike<number>, close: ArrayLike<number>): void |
| clear(): void |
| getX(index: number): number |
| getY(index: number): number |
| getOpen(index: number): number |
| getHigh(index: number): number |
| getLow(index: number): number |
| getClose(index: number): number |
| lowerBoundX(x: number): number |
| upperBoundX(x: number): number |
| Member |
|---|
| length: number |
| range: TimeRange \\| null |
| getX(index: number): number |
| getY(index: number): number |
| isGap(index: number): boolean | Optional explicit missing-data marker. Gap samples are skipped by picks and break line/area strips on both sides. X values must remain sorted even when a sample is marked as a gap. |
| lowerBoundX(x: number): number |
| upperBoundX(x: number): number |
| Member |
|---|
| beforePan(camera: Camera2D, intent: PanIntent): PanIntent \\| null |
| beforeZoom(camera: Camera2D, intent: ZoomIntent): ZoomIntent \\| null |
| beforeRender(camera: Camera2D): void |
All public exports
| Export | Kind | Source | JSDoc summary |
|---|---|---|---|
| AcceleratedDataset | interface | ./core/types | Convenience contract for maximum-performance custom datasets. Implement this when a dataset can provide fast exact sample copies, stable viewport sampling, range min/max queries, and renderer-ready min/max buckets. |
| AppendableDataset | interface | ./core/types | — |
| AttributeSpec | interface | ./render/types | — |
| AxisConfig | interface | ./ui/Chart | — |
| AxisController | class | ./interaction/AxisController | — |
| AxisControllerAxisOptions | interface | ./interaction/AxisController | — |
| AxisControllerOptions | interface | ./interaction/AxisController | — |
| AxisPosition | type | ./ui/ChartLayout | — |
| AxisRenderTarget | type | ./interaction/AxisController | — |
| AxisScale | type | ./interaction/AxisController | — |
| AxisTickFormat | type | ./interaction/AxisController | — |
| AxisTickFormatter | type | ./interaction/AxisController | — |
| AxisTimeZone | type | ./interaction/AxisController | — |
| AxisTitleConfig | interface | ./ui/Chart | — |
| BufferOverflowStrategy | type | ./core/types | — |
| BufferSpec | interface | ./render/types | — |
| BuiltInAxisScale | type | ./interaction/AxisController | — |
| Camera2D | class | ./interaction/Camera2D | — |
| Chart | class | ./ui/Chart | — |
| ChartAccessibilityOptions | interface | ./ui/Chart | — |
| ChartAutoFitYOptions | interface | ./ui/Chart | — |
| ChartBackendFactory | type | ./ui/Chart | — |
| ChartBackendFactoryContext | interface | ./ui/Chart | — |
| ChartFitToDataOptions | interface | ./ui/Chart | — |
| ChartFitToDataPadding | interface | ./ui/Chart | — |
| ChartFollowXOptions | interface | ./ui/Chart | — |
| ChartFrameStats | interface | ./ui/Chart | — |
| ChartHoverState | interface | ./ui/Chart | — |
| ChartKeyboardOptions | interface | ./ui/Chart | — |
| ChartLayoutReservation | interface | ./ui/Chart | — |
| ChartOptions | interface | ./ui/Chart | — |
| ChartPickGroup | type | ./ui/Chart | — |
| ChartPickItem | interface | ./ui/Chart | — |
| ChartPickMode | type | ./ui/Chart | — |
| ChartPickOptions | interface | ./ui/Chart | — |
| ChartPlugin | interface | ./ui/Chart | — |
| ChartPluginContext | interface | ./ui/Chart | — |
| ChartPluginHandle | interface | ./ui/Chart | — |
| ChartPointerEventState | interface | ./ui/Chart | — |
| ChartPointerEventType | type | ./ui/Chart | — |
| ChartScreenshotOptions | interface | ./ui/Chart | — |
| ChartScreenshotPreset | type | ./ui/Chart | — |
| ChartSelectEvent | interface | ./ui/Chart | — |
| ChartSeriesClickEvent | interface | ./ui/Chart | — |
| ChartSeriesState | interface | ./ui/Chart | — |
| ChartTheme | interface | ./ui/theme | — |
| ChartTitleConfig | interface | ./ui/Chart | — |
| ChartViewportChangeEvent | interface | ./ui/Chart | — |
| CssColor | type | ./ui/theme | — |
| CustomAxisScale | interface | ./interaction/AxisController | — |
| Dataset | interface | ./core/types | — |
| DEFAULT_CHART_THEME | const | ./ui/theme | — |
| DrawSpec | interface | ./render/types | — |
| GpuBackend | interface | ./render/types | — |
| GpuBuffer | interface | ./render/types | — |
| GpuCapabilities | interface | ./render/types | — |
| GpuProgram | interface | ./render/types | — |
| GpuResource | type | ./render/types | — |
| isWebGL2Available | function | ./render/WebGL2Backend | — |
| LODBucket | interface | ./core/types | — |
| LODStrategy | type | ./core/types | — |
| LODView | interface | ./core/types | — |
| MinMaxPyramid | class | ./core/MinMaxPyramid | — |
| MinMaxSegmentCopyDataset | interface | ./core/types | Optional high-performance min/max extraction capability for dense rendering. Implementations can use pyramids, segment trees, database aggregates, or analytic/procedural envelopes to emit renderer-ready min/max buckets. |
| MinMaxSegmentLayout | type | ./core/types | — |
| OhlcDataset | interface | ./core/types | — |
| OhlcRingBuffer | class | ./core/OhlcDataset | — |
| OhlcRingBufferOptions | interface | ./core/OhlcDataset | — |
| PanIntent | interface | ./interaction/types | — |
| RangeMinMaxDataset | interface | ./core/types | — |
| RangeSampleCopyDataset | interface | ./core/types | Optional high-performance extraction capability for datasets that can copy raw samples without going through repeated getX/getY calls. Implement this for very large datasets, implicit-X datasets, or remote/memory-mapped sources. |
| ReglBackend | const | ./render/WebGL2Backend | Deprecated alias for WebGL2Backend. This preserves the pre-native-backend public API. |
| ResolvedChartTheme | interface | ./ui/theme | — |
| RgbaColor | type | ./ui/theme | — |
| RingBuffer | class | ./core/RingBuffer | — |
| RingBufferOptions | interface | ./core/RingBuffer | — |
| RingBufferOverflow | type | ./core/RingBuffer | — |
| SampleCopyLayout | type | ./core/types | — |
| SeriesConfig | interface | ./core/types | — |
| SeriesDataBounds | interface | ./core/SeriesStore | — |
| SeriesDataBoundsOptions | interface | ./core/SeriesStore | — |
| SeriesMode | type | ./core/types | — |
| SeriesOhlcSample | interface | ./core/SeriesStore | — |
| SeriesSample | interface | ./core/types | — |
| SeriesStore | class | ./core/SeriesStore | — |
| SeriesStyle | interface | ./core/types | — |
| SeriesYAxis | type | ./core/types | — |
| ServerSampledBuckets | interface | ./core/ServerSampledDataset | — |
| ServerSampledData | type | ./core/ServerSampledDataset | — |
| ServerSampledDataset | class | ./core/ServerSampledDataset | Mutable dataset for viewport samples that were already reduced by a server. Use point data with downsample: "none", or min/max buckets with downsample: "server" so BlazePlot renders the supplied buckets directly instead of applying another client-side sampler. |
| ServerSampledDatasetKind | type | ./core/ServerSampledDataset | — |
| ServerSampledPoints | interface | ./core/ServerSampledDataset | — |
| StaticDataset | class | ./core/StaticDataset | — |
| StaticOhlcDataset | class | ./core/OhlcDataset | — |
| TextOverlayConfig | interface | ./ui/Chart | — |
| ThemeColor | type | ./ui/theme | — |
| TimeRange | interface | ./core/types | — |
| TypedSeriesConfig | type | ./ui/Chart | — |
| UniformRingBuffer | class | ./core/UniformRingBuffer | High-throughput ring buffer for uniformly spaced X values. Store only Y samples and derive X as xStart + index * xStep. This is the fastest built-in dataset for live telemetry, signals, and other fixed-rate streams because appends copy a single typed array and min/max extraction uses a block segment tree over the physical ring. |
| UniformRingBufferOptions | interface | ./core/UniformRingBuffer | — |
| Viewport | interface | ./core/types | — |
| ViewportPolicy | interface | ./interaction/types | — |
| VisiblePointCopyDataset | interface | ./core/types | Optional high-performance extraction capability for point/scatter datasets. Implementations should cull against the full 2D viewport and may sample in screen space so dense point clouds respond to both X and Y zoom. |
| VisibleSampleCopyDataset | interface | ./core/types | Optional high-performance stable visible sampling capability. Unlike copySamplesRange, this method may stride/downsample, but should choose samples anchored to data coordinates so streamed appends do not make existing sampled points jitter. |
| WebGL2Backend | class | ./render/WebGL2Backend | — |
| WebGL2UnavailableError | class | ./render/WebGL2Backend | — |
| YAppendableDataset | interface | ./core/types | — |
| ZoomAxis | type | ./interaction/types | — |
| ZoomIntent | interface | ./interaction/types | — |
Development
bun install
bun run dev # Vite dev server → preview/
bun run ci # Typecheck + tests + package build + benchmark smoke test
bun run build # Package build (JS + declarations)
bun test # Tests
bun run typecheck # TypeScript strict check
bun run bench:ci # Headless browser benchmark smoke test
bun run version:patch # Prepare package.json + changelog for a patch release PR
bun run release:benchmarks # Append benchmark results to the current release changelogBranch flow: development is the integration branch for regular work; open feature/fix PRs into development. Open release PRs from development into main with version and changelog already updated. Release PRs publish npm and create the GitHub Release on merge.
See docs/release-and-benchmarks.md for full workflow details.
