/*! https://github.com/leeoniya/uPlot (v1.6.21) */
export declare class uPlot {
/**
* when passing a function for @targ, call init() after attaching self.root
* to the DOM
*/
constructor(
opts: uPlot.Options, data?: uPlot.AlignedData,
targ?: HTMLElement|((self: uPlot, init: Function) => void));
/** chart container */
readonly root: HTMLElement;
/** status */
readonly status: 0|1;
/** width of the plotting area + axes in CSS pixels */
readonly width: number;
/**
* height of the plotting area + axes in CSS pixels (excludes title & legend
* height)
*/
readonly height: number;
/** context of canvas used for plotting area + axes */
readonly ctx: CanvasRenderingContext2D;
/**
* coords of plotting area in canvas pixels (relative to full canvas w/axes)
*/
readonly bbox: uPlot.BBox;
/** coords of selected region in CSS pixels (relative to plotting area) */
readonly select: uPlot.BBox;
/** cursor state & opts*/
readonly cursor: uPlot.Cursor;
readonly legend: uPlot.Legend;
// /** focus opts */
// readonly focus: uPlot.Focus;
/** series state & opts */
readonly series: uPlot.Series[];
/** scales state & opts */
readonly scales: {[key: string]: uPlot.Scale;};
/** axes state & opts */
readonly axes: uPlot.Axis[];
/** hooks, including any added by plugins */
readonly hooks: uPlot.Hooks.Arrays;
/** current data */
readonly data: uPlot.AlignedData;
/** .u-over dom element */
readonly over: HTMLDivElement;
/** .u-under dom element */
readonly under: HTMLDivElement;
/**
* clears and redraws the canvas. if rebuildPaths = false, uses cached
* series' Path2D objects
*/
redraw(rebuildPaths?: boolean, recalcAxes?: boolean): void;
/**
* defers recalc & redraw for multiple ops, e.g. setScale('x', ...) &&
* setScale('y', ...)
*/
batch(txn: Function): void;
/** destroys DOM, removes resize & scroll listeners, etc. */
destroy(): void;
/** sets the chart data & redraws. (default resetScales = true) */
setData(data: uPlot.AlignedData, resetScales?: boolean): void;
/** sets the limits of a scale & redraws (used for zooming) */
setScale(scaleKey: string, limits: {min: number; max: number}): void;
/** sets the cursor position (relative to plotting area) */
setCursor(opts: {left: number, top: number}, fireHook?: boolean): void;
/** sets the legend to the values of the specified idx */
setLegend(opts: {idx: number}, fireHook?: boolean): void;
// TODO: include other series style opts which are dynamically pulled?
/** toggles series visibility or focus */
setSeries(
seriesIdx: number|null, opts: {show?: boolean, focus?: boolean},
fireHook?: boolean): void;
/** adds a series */
addSeries(opts: uPlot.Series, seriesIdx?: number): void;
/** deletes a series */
delSeries(seriesIdx: number): void;
/** adds a band */
addBand(opts: uPlot.Band, bandIdx?: number): void;
/** modifies an existing band */
setBand(bandIdx: number, opts: uPlot.Band): void;
/** deletes a band. if null bandIdx, clears all bands */
delBand(bandIdx?: number|null): void;
/**
* sets visually selected region without triggering setScale (zoom). (default
* fireHook = true)
*/
setSelect(
opts: {left: number, top: number, width: number, height: number},
fireHook?: boolean): void;
/**
* sets the width & height of the plotting area + axes (excludes title &
* legend height)
*/
setSize(opts: {width: number; height: number}): void;
/**
* converts a CSS pixel position (relative to plotting area) to the closest
* data index
*/
posToIdx(left: number, canvasPixels?: boolean): number;
/**
* converts a CSS pixel position (relative to plotting area) to a value along
* the given scale
*/
posToVal(leftTop: number, scaleKey: string, canvasPixels?: boolean): number;
/**
* converts a value along the given scale to a CSS (default) or canvas pixel
* position. (default canvasPixels = false)
*/
valToPos(val: number, scaleKey: string, canvasPixels?: boolean): number;
/** converts a value along x to the closest data index */
valToIdx(val: number): number;
/**
* updates getBoundingClientRect() cache for cursor positioning. use when
* plot's position changes (excluding window scroll & resize)
*/
syncRect(defer?: boolean): void;
/** uPlot's path-builder factories */
static paths: uPlot.Series.PathBuilderFactories;
/** a deep merge util fn */
static assign(targ: object, ...srcs: object[]): object;
/**
* re-ranges a given min/max by a multiple of the range's magnitude (used
* internally to expand/snap/pad numeric y scales)
*/
static rangeNum(min: number, max: number, mult: number, extra: boolean):
uPlot.Range.MinMax;
static rangeNum(min: number, max: number, cfg: uPlot.Range.Config):
uPlot.Range.MinMax;
/**
* re-ranges a given min/max outwards to nearest 10% of given min/max's
* magnitudes, unless fullMags = true
*/
static rangeLog(
min: number, max: number, base: uPlot.Scale.LogBase,
fullMags: boolean): uPlot.Range.MinMax;
/**
* re-ranges a given min/max outwards to nearest 10% of given min/max's
* magnitudes, unless fullMags = true
*/
static rangeAsinh(
min: number, max: number, base: uPlot.Scale.LogBase,
fullMags: boolean): uPlot.Range.MinMax;
/**
* default numeric formatter using browser's locale: new
* Intl.NumberFormat(navigator.language).format
*/
static fmtNum(val: number): string;
/**
* creates an efficient formatter for Date objects from a template string,
* e.g. {YYYY}-{MM}-{DD}
*/
static fmtDate(tpl: string, names?: uPlot.DateNames): (date: Date) => string;
/**
* converts a Date into new Date that's time-adjusted for the given IANA Time
* Zone Name
*/
static tzDate(date: Date, tzName: string): Date;
/** outerJoins multiple data tables on table[0] values */
static join(tables: uPlot.AlignedData[], nullModes?: uPlot.JoinNullMode[][]):
uPlot.AlignedData;
static addGap: uPlot.Series.AddGap;
static clipGaps: uPlot.Series.ClipPathBuilder;
/**
* helper function for grabbing proper drawing orientation vars and fns for a
* plot instance (all dims in canvas pixels)
*/
static orient(u: uPlot, seriesIdx: number, callback: uPlot.OrientCallback):
any;
/** returns a pub/sub instance shared by all plots usng the provided key */
static sync(key: string): uPlot.SyncPubSub;
/**
* cached devicePixelRatio (faster than reading it from
* window.devicePixelRatio)
*/
static pxRatio: number;
}
export declare namespace uPlot {
type OrientCallback = (
series: Series,
dataX: number[],
dataY: (number|null)[],
scaleX: Scale,
scaleY: Scale,
valToPosX: ValToPos,
valToPosY: ValToPos,
xOff: number,
yOff: number,
xDim: number,
yDim: number,
moveTo: MoveToH|MoveToV,
lineTo: LineToH|LineToV,
rect: RectH|RectV,
arc: ArcH|ArcV,
bezierCurveTo: BezierCurveToH|BezierCurveToV,
) => any;
type ValToPos =
(val: number, scale: Scale, fullDim: number, offset: number) => number;
type Drawable = Path2D|CanvasRenderingContext2D;
type MoveToH = (p: Drawable, x: number, y: number) => void;
type MoveToV = (p: Drawable, y: number, x: number) => void;
type LineToH = (p: Drawable, x: number, y: number) => void;
type LineToV = (p: Drawable, y: number, x: number) => void;
type RectH = (p: Drawable, x: number, y: number, w: number, h: number) =>
void;
type RectV = (p: Drawable, y: number, x: number, h: number, w: number) =>
void;
type ArcH =
(p: Drawable, x: number, y: number, r: number, startAngle: number,
endAngle: number) => void;
type ArcV =
(p: Drawable, y: number, x: number, r: number, startAngle: number,
endAngle: number) => void;
type BezierCurveToH =
(p: Drawable, bp1x: number, bp1y: number, bp2x: number, bp2y: number,
p2x: number, p2y: number) => void;
type BezierCurveToV =
(p: Drawable, bp1y: number, bp1x: number, bp2y: number, bp2x: number,
p2y: number, p2x: number) => void;
export const enum JoinNullMode {
/** use for series with spanGaps: true */
Remove = 0,
/** retain explicit nulls gaps (default) */
Retain = 1,
/**
expand explicit null gaps to include adjacent alignment artifacts
(undefined values)
*/
Expand = 2,
}
export const enum Orientation {
Horizontal = 0,
Vertical = 1,
}
export type TypedArray = Int8Array|Uint8Array|Int16Array|Uint16Array|
Int32Array|Uint32Array|Uint8ClampedArray|Float32Array|Float64Array;
export type AlignedData =
[
xValues: number[]|TypedArray,
...yValues: ((number|null|undefined)[]|TypedArray)[],
]
export interface DateNames {
/** long month names */
MMMM: string[];
/** short month names */
MMM: string[];
/** long weekday names (0: Sunday) */
WWWW: string[];
/** short weekday names (0: Sun) */
WWW: string[];
}
export namespace Range {
export type MinMax = [min: number|null, max: number|null];
export type Function =
(self: uPlot, initMin: number, initMax: number,
scaleKey: string) => MinMax;
export type SoftMode = 0|1|2|3;
export interface Limit {
/** initial multiplier for dataMax-dataMin delta */
pad?: number; // 0.1
/** soft limit */
soft?: number; // 0
/**
* soft limit active if... 0: never, 1: data <= limit, 2: data + padding
* <= limit, 3: data <= limit <= data + padding
*/
mode?: SoftMode; // 3
/** hard limit */
hard?: number;
}
export interface Config {
min: Range.Limit;
max: Range.Limit;
}
}
export interface Scales {
[key: string]: Scale;
}
type SidesWithAxes =
[top: boolean, right: boolean, bottom: boolean, left: boolean];
export type PaddingSide = number|null|
((self: uPlot, side: Axis.Side, sidesWithAxes: SidesWithAxes,
cycleNum: number) => number);
export type Padding = [
top: PaddingSide, right: PaddingSide, bottom: PaddingSide, left: PaddingSide
];
export interface Legend {
show?: boolean; // true
/** show series values at current cursor.idx */
live?: boolean; // true
/** swiches primary interaction mode to toggle-one/toggle-all */
isolate?: boolean; // false
/** series indicators */
markers?: Legend.Markers;
/** current index (readback-only, not for init) */
idx?: number|null;
/** current indices (readback-only, not for init) */
idxs?: (number|null)[];
/** current values (readback-only, not for init) */
values?: Legend.Values;
}
export namespace Legend {
export type Width = number|((self: uPlot, seriesIdx: number) => number);
export type Stroke = CSSStyleDeclaration['borderColor']|
((self: uPlot,
seriesIdx: number) => CSSStyleDeclaration['borderColor']);
export type Dash = CSSStyleDeclaration['borderStyle']|
((self: uPlot,
seriesIdx: number) => CSSStyleDeclaration['borderStyle']);
export type Fill = CSSStyleDeclaration['background']|
((self: uPlot, seriesIdx: number) => CSSStyleDeclaration['background']);
export type Value = {[key: string]: string|number;};
export type Values = Value[];
export interface Markers {
show?: boolean; // true
/** series indicator line width */
width?: Legend.Width;
/** series indicator stroke (CSS borderColor) */
stroke?: Legend.Stroke;
/** series indicator fill */
fill?: Legend.Fill;
/** series indicator stroke style (CSS borderStyle) */
dash?: Legend.Dash;
}
}
export type DateFormatterFactory = (tpl: string) => (date: Date) => string;
export type LocalDateFromUnix = (ts: number) => Date;
export const enum DrawOrderKey {
Axes = 'axes',
Series = 'series',
}
export const enum Mode {
Aligned = 1,
Faceted = 2,
}
export interface Options {
/**
* 1: aligned & ordered, single-x / y-per-series, 2: unordered & faceted,
* per-series/per-point x,y,size,label,color,shape,etc.
*/
mode?: Mode,
/** chart title */
title?: string;
/** id to set on chart div */
id?: string;
/** className to add to chart div */
class
?: string;
/** width of plotting area + axes in CSS pixels */
width: number;
/**
* height of plotting area + axes in CSS pixels (excludes title & legend
* height)
*/
height: number;
/** data for chart, if none is provided as argument to constructor */
data?: AlignedData;
/**
* converts a unix timestamp to Date that's time-adjusted for the desired
* timezone
*/
tzDate?: LocalDateFromUnix;
/**
* creates an efficient formatter for Date objects from a template string,
* e.g. {YYYY}-{MM}-{DD}
*/
fmtDate?: DateFormatterFactory;
/** timestamp multiplier that yields 1 millisecond */
ms?: 1e-3|1; // 1e-3
/** drawing order for axes/grid & series (default: ["axes", "series"]) */
drawOrder?: DrawOrderKey[];
/**
* whether vt & hz lines of series/grid/ticks should be crisp/sharp or
* sub-px antialiased
*/
pxAlign?: boolean|number; // true
series: Series[];
bands?: Band[];
scales?: Scales;
axes?: Axis[];
/**
* padding per side, in CSS pixels (can prevent cross-axis labels at the
* plotting area limits from being chopped off)
*/
padding?: Padding;
select?: Select;
legend?: Legend;
cursor?: Cursor;
focus?: Focus;
hooks?: Hooks.Arrays;
plugins?: Plugin[];
}
export interface Focus {
/** alpha-transparancy of de-focused series */
alpha: number;
}
export interface BBox {
show?: boolean;
left: number;
top: number;
width: number;
height: number;
}
export interface Select extends BBox {
/** div into which .u-select will be placed: .u-over or .u-under */
over?: boolean; // true
}
export interface SyncPubSub {
key: string;
sub: (client: uPlot) => void;
unsub: (client: uPlot) => void;
pub:
(type: string, client: uPlot, x: number, y: number, w: number,
h: number, i: number) => void;
plots: uPlot[];
}
export namespace Cursor {
export type LeftTop = [left: number, top: number];
export type MouseListener = (e: MouseEvent) => null;
export type MouseListenerFactory =
(self: uPlot, targ: HTMLElement,
handler: MouseListener) => MouseListener|null;
export type DataIdxRefiner =
(self: uPlot, seriesIdx: number, closestIdx: number,
xValue: number) => number;
export type MousePosRefiner =
(self: uPlot, mouseLeft: number, mouseTop: number) => LeftTop;
export interface Bind {
mousedown?: MouseListenerFactory;
mouseup?: MouseListenerFactory;
click?: MouseListenerFactory;
dblclick?: MouseListenerFactory;
mousemove?: MouseListenerFactory;
mouseleave?: MouseListenerFactory;
mouseenter?: MouseListenerFactory;
}
export namespace Points {
export type Show = boolean|
((self: uPlot, seriesIdx: number) => HTMLElement);
export type Size = number|((self: uPlot, seriesIdx: number) => number);
export type BBox = (self: uPlot, seriesIdx: number) => uPlot.BBox;
export type Width = number|
((self: uPlot, seriesIdx: number, size: number) => number);
export type Stroke = CanvasRenderingContext2D['strokeStyle']|
((self: uPlot,
seriesIdx: number) => CanvasRenderingContext2D['strokeStyle']);
export type Fill = CanvasRenderingContext2D['fillStyle']|
((self: uPlot,
seriesIdx: number) => CanvasRenderingContext2D['fillStyle']);
}
export interface Points {
show?: Points.Show;
/** hover point diameter in CSS pixels */
size?: Points.Size;
/** hover point bbox in CSS pixels (will be used instead of size) */
bbox?: Points.BBox;
/** hover point outline width in CSS pixels */
width?: Points.Width;
/** hover point outline color, pattern or gradient */
stroke?: Points.Stroke;
/** hover point fill color, pattern or gradient */
fill?: Points.Fill;
}
export interface Drag {
setScale?: boolean; // true
/** toggles dragging along x */
x?: boolean; // true
/** toggles dragging along y */
y?: boolean; // false
/** min drag distance threshold */
dist?: number; // 0
/**
* when x & y are true, sets an upper drag limit in CSS px for
* adaptive/unidirectional behavior
*/
uni?: number; // null
}
export namespace Sync {
export type Scales = [xScaleKey: string|null, yScaleKey: string|null];
export type Filter =
(type: string, client: uPlot, x: number, y: number, w: number,
h: number, i: number) => boolean;
export interface Filters {
/** filters emitted events */
pub?: Filter;
/** filters received events */
sub?: Filter;
}
export type ScaleKeyMatcher =
(subScaleKey: string|null, pubScaleKey: string|null) => boolean;
export type Match = [matchX: ScaleKeyMatcher, matchY: ScaleKeyMatcher];
export type Values = [xScaleValue: number, yScaleValue: number];
}
export interface Sync {
/** sync key must match between all charts in a synced group */
key: string;
/**
* determines if series toggling and focus via cursor is synced across
* charts
*/
setSeries?: boolean; // true
/**
* sets the x and y scales to sync by values. null will sync by relative
* (%) position
*/
scales?: Sync.Scales; // [xScaleKey, null]
/** fns that match x and y scale keys between publisher and subscriber */
match?: Sync.Match;
/** event filters */
filters?: Sync.Filters;
/**
* sync scales' values at the cursor position (exposed for read-back by
* subscribers)
*/
values?: Sync.Values,
}
export interface Focus {
/**
* minimum cursor proximity to datapoint in CSS pixels for focus
* activation
*/
prox: number;
}
}
export interface Cursor {
/** cursor on/off */
show?: boolean;
/** vertical crosshair on/off */
x?: boolean;
/** horizontal crosshair on/off */
y?: boolean;
/** cursor position left offset in CSS pixels (relative to plotting area) */
left?: number;
/** cursor position top offset in CSS pixels (relative to plotting area) */
top?: number;
/** closest data index to cursor (closestIdx) */
idx?: number|null;
/**
* returns data idx used for hover points & legend display (defaults to
* closestIdx)
*/
dataIdx?: Cursor.DataIdxRefiner;
/** a series-matched array of indices returned by dataIdx() */
idxs?: (number|null)[];
/**
* fires on debounced mousemove events; returns refined [left, top] tuple
* to snap cursor position
*/
move?: Cursor.MousePosRefiner;
/** series hover points */
points?: Cursor.Points;
/**
* event listener proxies (can be overridden to tweak interaction behavior)
*/
bind?: Cursor.Bind;
/** determines vt/hz cursor dragging to set selection & setScale (zoom) */
drag?: Cursor.Drag;
/** sync cursor between multiple charts */
sync?: Cursor.Sync;
/** focus series closest to cursor */
focus?: Cursor.Focus;
/** lock cursor on mouse click in plotting area */
lock?: boolean; // false
}
export namespace Scale {
export type Auto = boolean|((self: uPlot, resetScales: boolean) => boolean);
export type Range = Range.MinMax|Range.Function|Range.Config;
export const enum Distr {
Linear = 1,
Ordinal = 2,
Logarithmic = 3,
ArcSinh = 4,
}
export type LogBase = 10|2;
export type Clamp = number|
((self: uPlot, val: number, scaleMin: number, scaleMax: number,
scaleKey: string) => number);
}
export interface Scale {
/** is this scale temporal, with series' data in UNIX timestamps? */
time?: boolean;
/**
* determines whether all series' data on this scale will be scanned to
* find the full min/max range
*/
auto?: Scale.Auto;
/**
* can define a static scale range or re-range an initially-determined
* range from series data
*/
range?: Scale.Range;
/** scale key from which this scale is derived */
from?: string;
/** scale distribution. 1: linear, 2: ordinal, 3: logarithmic, 4: arcsinh */
distr?: Scale.Distr; // 1
/** logarithmic base */
log?: Scale.LogBase; // 10;
/** clamps log scale values <= 0 (default = scaleMin / 10) */
clamp?: Scale.Clamp;
/** arcsinh linear threshold */
asinh?: number; // 1
/** current min scale value */
min?: number;
/** current max scale value */
max?: number;
/** scale direction */
dir?: 1|- 1;
/** scale orientation - 0: hz, 1: vt */
ori?: 0|1;
/** own key (for read-back) */
key?: string;
}
export namespace Series {
export interface Paths {
/** path to stroke */
stroke?: Path2D|Map<CanvasRenderingContext2D['strokeStyle'], Path2D>|null;
/** path to fill */
fill?: Path2D|Map<CanvasRenderingContext2D['fillStyle'], Path2D>|null;
/** path for clipping fill & stroke (used for gaps) */
clip?: Path2D|null;
/**
* yMin-ward (dir: -1) and/or yMax-ward (dir: 1) clips built using the
* stroke path (inverted dirs from band.dir fills)
*/
band?: Path2D|null|[yMinClip: Path2D, yMaxClip: Path2D];
/**
* tuples of canvas pixel coordinates that were used to construct the
* gaps clip
*/
gaps?: [from: number, to: number][];
/**
* bitmap of whether the band clip should be applied to stroke, fill, or
* both
*/
flags?: number;
}
export interface SteppedPathBuilderOpts {
align?: -1|1; // 1
alignGaps?: -1|0|1; // 0
// whether to draw ascenders/descenders at null/gap boundaries
ascDesc?: boolean; // false
}
export const enum BarsPathBuilderFacetUnit {
ScaleValue = 1,
PixelPercent = 2,
Color = 3,
}
export const enum BarsPathBuilderFacetKind {
Unary = 1,
Discrete = 2,
Continuous = 3,
}
export type BarsPathBuilderFacetValue =
string|number|boolean|null|undefined;
export interface BarsPathBuilderFacet {
/** unit of measure for output of values() */
unit: BarsPathBuilderFacetUnit;
/** are the values unary, discrete, or continuous */
kind?: BarsPathBuilderFacetKind;
/** values to use for this facet */
values:
(self: uPlot, seriesIdx: number, idx0: number,
idx1: number) => BarsPathBuilderFacetValue[];
}
/** custom per-datapoint styling and positioning */
export interface BarsPathBuilderDisplay {
x0?: BarsPathBuilderFacet;
// x1?: BarsPathBuilderFacet;
y0?: BarsPathBuilderFacet;
y1?: BarsPathBuilderFacet;
size?: BarsPathBuilderFacet;
fill?: BarsPathBuilderFacet;
stroke?: BarsPathBuilderFacet;
}
export interface BarsPathBuilderOpts {
align?: -1|0|1; // 0
size?: [factor?: number, max?: number, min?: number];
// corner radius factor of bar size (0 - 0.5)
radius?: number; // 0
/** fixed-size gap between bars in CSS pixels (reduces bar width) */
gap?: number;
/**
* should return a custom [cached] layout for bars in % of plotting area
* (0..1)
*/
disp?: BarsPathBuilderDisplay;
/**
* called with bbox geometry of each drawn bar in canvas pixels. useful
* for spatial index, etc.
*/
each?:
(self: uPlot, seriesIdx: number, idx: number, left: number,
top: number, width: number, height: number) => void;
}
export interface LinearPathBuilderOpts {
alignGaps?: -1|0|1; // 0
}
export interface SplinePathBuilderOpts {
alignGaps?: -1|0|1; // 0
}
export type PointsPathBuilderFactory = () => Points.PathBuilder;
export type LinearPathBuilderFactory = (opts?: LinearPathBuilderOpts) =>
Series.PathBuilder;
export type SplinePathBuilderFactory = (opts?: SplinePathBuilderOpts) =>
Series.PathBuilder;
export type SteppedPathBuilderFactory = (opts?: SteppedPathBuilderOpts) =>
Series.PathBuilder;
export type BarsPathBuilderFactory = (opts?: BarsPathBuilderOpts) =>
Series.PathBuilder;
export interface PathBuilderFactories {
linear?: LinearPathBuilderFactory;
spline?: SplinePathBuilderFactory;
stepped?: SteppedPathBuilderFactory;
bars?: BarsPathBuilderFactory;
points?: PointsPathBuilderFactory;
}
export type Stroke = CanvasRenderingContext2D['strokeStyle']|
((self: uPlot,
seriesIdx: number) => CanvasRenderingContext2D['strokeStyle']);
export type Fill = CanvasRenderingContext2D['fillStyle']|
((self: uPlot,
seriesIdx: number) => CanvasRenderingContext2D['fillStyle']);
export type Cap = CanvasRenderingContext2D['lineCap'];
export namespace Points {
export interface Paths {
/** path to stroke */
stroke?: Path2D|null;
/** path to fill */
fill?: Path2D|null;
/** path for clipping fill & stroke */
clip?: Path2D|null;
/**
* bitmap of whether the clip should be applied to stroke, fill, or
* both
*/
flags?: number;
}
export type Show = boolean|
((self: uPlot, seriesIdx: number, idx0: number,
idx1: number) => boolean|undefined);
export type Filter = number[]|null|
((self: uPlot, seriesIdx: number, show: boolean,
gaps?: null|number[][]) => number[]|null);
export type PathBuilder =
(self: uPlot, seriesIdx: number, idx0: number, idx1: number,
filtIdxs?: number[]|null) => Paths|null;
}
export interface Points {
/**
* if boolean or returns boolean, round points are drawn with defined
* options, else fn should draw own custom points via self.ctx
*/
show?: Points.Show;
paths?: Points.PathBuilder;
/** may return an array of points indices to draw */
filter?: Points.Filter;
/** diameter of point in CSS pixels */
size?: number;
/**
* minimum avg space between point centers before they're shown (default:
* size * 2)
*/
space?: number;
/** line width of circle outline in CSS pixels */
width?: number;
/** line color of circle outline (defaults to series.stroke) */
stroke?: Stroke;
/** line dash segment array */
dash?: number[];
/** line cap */
cap?: Series.Cap;
/** fill color of circle (defaults to #fff) */
fill?: Fill;
}
export interface Facet {
scale: string;
auto?: boolean;
sorted?: Sorted;
}
export type Gap = [from: number, to: number];
export type Gaps = Gap[];
export type GapsRefiner = Gaps|
((self: uPlot, seriesIdx: number, idx0: number, idx1: number,
nullGaps: Gaps) => Gaps);
export type AddGap = (gaps: Gaps, from: number, to: number) => void;
export type ClipPathBuilder =
(gaps: Gaps, ori: Orientation, left: number, top: number, width: number,
height: number) => Path2D|null;
export type PathBuilder =
(self: uPlot, seriesIdx: number, idx0: number,
idx1: number) => Paths|null;
export type MinMaxIdxs = [minIdx: number, maxIdx: number];
export type Value = string|
((self: uPlot, rawValue: number, seriesIdx: number,
idx: number) => string|number);
export type Values = (self: uPlot, seriesIdx: number, idx: number) =>
object;
export type FillTo = number|
((self: uPlot, seriesIdx: number, dataMin: number,
dataMax: number) => number);
export const enum Sorted {
Unsorted = 0,
Ascending = 1,
Descending = -1,
}
}
export interface Series {
/** series on/off. when off, it will not affect its scale */
show?: boolean;
/** className to add to legend parts and cursor hover points */
class
?: string;
/** scale key */
scale?: string;
/** whether this series' data is scanned during auto-ranging of its scale */
auto?: boolean; // true
/** if & how the data is pre-sorted (scale.auto optimization) */
sorted?: Series.Sorted;
/** when true, null data values will not cause line breaks */
spanGaps?: boolean;
/** may mutate and/or augment gaps array found from null values */
gaps?: Series.GapsRefiner;
/**
* whether path and point drawing should offset canvas to try drawing crisp
* lines
*/
pxAlign?: number|boolean; // 1
/** legend label */
label?: string;
/**
* inline-legend value formatter. can be an fmtDate formatting string when
* scale.time: true
*/
value?: Series.Value;
/** table-legend multi-values formatter */
values?: Series.Values;
paths?: Series.PathBuilder;
/** rendered datapoints */
points?: Series.Points;
/** facets */
facets?: Series.Facet[];
/** line width in CSS pixels */
width?: number;
/** line & legend color */
stroke?: Series.Stroke;
/** area fill & legend color */
fill?: Series.Fill;
/** area fill baseline (default: 0) */
fillTo?: Series.FillTo;
/** line dash segment array */
dash?: number[];
/** line cap */
cap?: Series.Cap;
/** alpha-transparancy */
alpha?: number;
/** current min and max data indices rendered */
idxs?: Series.MinMaxIdxs;
/** current min rendered value */
min?: number;
/** current max rendered value */
max?: number;
}
export namespace Band {
export type Fill = CanvasRenderingContext2D['fillStyle']|
((self: uPlot, bandIdx: number,
highSeriesFill: CanvasRenderingContext2D['fillStyle']) =>
CanvasRenderingContext2D['fillStyle']);
export type Bounds = [fromSeriesIdx: number, toSeriesIdx: number];
}
export interface Band {
/** band on/off */
// show?: boolean;
/** series indices of upper and lower band edges */
series: Band.Bounds;
/** area fill style */
fill?: Band.Fill;
/**
* whether to fill towards yMin (-1) or yMax (+1) between "from" & "to"
* series
*/
dir?: 1|- 1; // -1
}
export namespace Axis {
/** must return an array of same length as splits, e.g. via splits.map() */
export type Filter =
(self: uPlot, splits: number[], axisIdx: number, foundSpace: number,
foundIncr: number) => (number|null)[];
export type Size = number|
((self: uPlot, values: string[], axisIdx: number,
cycleNum: number) => number);
export type Space = number|
((self: uPlot, axisIdx: number, scaleMin: number, scaleMax: number,
plotDim: number) => number);
export type Incrs = number[]|
((self: uPlot, axisIdx: number, scaleMin: number, scaleMax: number,
fullDim: number, minSpace: number) => number[]);
export type Splits = number[]|
((self: uPlot, axisIdx: number, scaleMin: number, scaleMax: number,
foundIncr: number, foundSpace: number) => number[]);
export type StaticValues = (string|number|null)[];
export type DynamicValues =
(self: uPlot, splits: number[], axisIdx: number, foundSpace: number,
foundIncr: number) => StaticValues;
export type TimeValuesConfig = (string|number|null)[][];
export type TimeValuesTpl = string;
export type Values =
StaticValues|DynamicValues|TimeValuesTpl|TimeValuesConfig;
export type Stroke = CanvasRenderingContext2D['strokeStyle']|
((self: uPlot,
axisIdx: number) => CanvasRenderingContext2D['strokeStyle']);
export const enum Side {
Top = 0,
Right = 1,
Bottom = 2,
Left = 3,
}
export const enum Align {
Left = 1,
Right = 2,
}
export type Rotate = number|
((self: uPlot, values: (string|number)[], axisIdx: number,
foundSpace: number) => number);
interface OrthoLines {
/** on/off */
show?: boolean; // true
/** line color */
stroke?: Stroke;
/** line width in CSS pixels */
width?: number;
/** line dash segment array */
dash?: number[];
/** line cap */
cap?: Series.Cap;
}
export interface Border extends OrthoLines {}
interface FilterableOrthoLines extends OrthoLines {
/**
* can filter which splits render lines. e.g splits.map(v => v % 2 === 0 ?
* v : null)
*/
filter?: Filter;
}
export interface Grid extends FilterableOrthoLines {}
export interface Ticks extends FilterableOrthoLines {
/** length of tick in CSS pixels */
size?: number;
}
}
export interface Axis {
/** axis on/off */
show?: boolean;
/** scale key */
scale?: string;
/** side of chart - 0: top, 1: rgt, 2: btm, 3: lft */
side?: Axis.Side;
/**
* height of x axis or width of y axis in CSS pixels alloted for values,
* gap & ticks, but excluding axis label
*/
size?: Axis.Size;
/**
* gap between axis values and axis baseline (or ticks, if enabled) in CSS
* pixels
*/
gap?: number;
/** font used for axis values */
font?: CanvasRenderingContext2D['font'];
/** color of axis label & values */
stroke?: Axis.Stroke;
/** axis label text */
label?: string;
/**
* height of x axis label or width of y axis label in CSS pixels alloted
* for label text + labelGap
*/
labelSize?: number;
/** gap between label baseline and tick values in CSS pixels */
labelGap?: number;
/** font used for axis label */
labelFont?: CanvasRenderingContext2D['font'];
/** minimum grid & tick spacing in CSS pixels */
space?: Axis.Space;
/** available divisors for axis ticks, values, grid */
incrs?: Axis.Incrs;
/**
* determines how and where the axis must be split for placing ticks,
* values, grid
*/
splits?: Axis.Splits;
/**
* can filter which splits are passed to axis.values() for rendering. e.g
* splits.map(v => v % 2 === 0 ? v : null)
*/
filter?: Axis.Filter;
/** formats values for rendering */
values?: Axis.Values;
/**
* values rotation in degrees off horizontal (only bottom axes w/ side: 2)
*/
rotate?: Axis.Rotate;
/** text alignment of axis values - 1: left, 2: right */
align?: Axis.Align;
/** gridlines to draw from this axis' splits */
grid?: Axis.Grid;
/** ticks to draw from this axis' splits */
ticks?: Axis.Ticks;
/** axis border/edge rendering */
border?: Axis.Border;
}
export namespace Hooks {
export interface Defs {
/**
* fires after opts are defaulted & merged but data has not been set and
* scales have not been ranged
*/
init?: (self: uPlot, opts: Options, data: AlignedData) => void;
/**
* fires after each initial and subsequent series addition (discern via
* self.status === 0 or 1)
*/
addSeries?: (self: uPlot, seriesIdx: number) => void;
/** fires after each series deletion */
delSeries?: (self: uPlot, seriesIdx: number) => void;
/** fires after any scale has changed */
setScale?: (self: uPlot, scaleKey: string) => void;
/** fires after the cursor is moved */
setCursor?: (self: uPlot) => void;
/** fires when cursor changes idx and legend updates (or should update) */
setLegend?: (self: uPlot) => void;
/** fires after a selection is completed */
setSelect?: (self: uPlot) => void;
/** fires after a series is toggled or focused */
setSeries?: (self: uPlot, seriesIdx: number|null, opts: Series) => void;
/** fires after data is updated updated */
setData?: (self: uPlot) => void;
/** fires after the chart is resized */
setSize?: (self: uPlot) => void;
/** fires at start of every redraw */
drawClear?: (self: uPlot) => void;
/** fires after all axes are drawn */
drawAxes?: (self: uPlot) => void;
/** fires after each series is drawn */
drawSeries?: (self: uPlot, seriesIdx: number) => void;
/** fires after everything is drawn */
draw?: (self: uPlot) => void;
/** fires after the chart is fully initialized and in the DOM */
ready?: (self: uPlot) => void;
/** fires after the chart is destroyed */
destroy?: (self: uPlot) => void;
/**
* fires after .u-over's getBoundingClientRect() is called (due to scroll
* or resize events)
*/
syncRect?: (self: uPlot, rect: DOMRect) => void;
}
export type Arrays =
{[P in keyof Defs]: Defs[P][]}
export type ArraysOrFuncs =
{[P in keyof Defs]: Defs[P][]|Defs[P]}
}
export interface Plugin {
/** can mutate provided opts as necessary */
opts?: (self: uPlot, opts: Options) => void | Options;
hooks: Hooks.ArraysOrFuncs;
}
}