UNPKG

d2b

Version:

A d3-based reusable chart library.

413 lines (350 loc) 10.3 kB
import { ChartAxisGeneralSetConfig, ChartAxisBoxPlotSetConfig, ChartAxisBubblePackSetConfig, ChartAxisGeneralSetData, ChartAxisBoxPlotSetData, ChartAxisBubblePackSetData } from "./ChartAxisSets" import { Padding, Orient } from "./General" import { ChartAxisGraphData } from "./ChartAxisGraphs" import { SymbolType, Axis, AxisScale, AxisTimeInterval } from "d3" import { ChartAxisValueData } from "./ChartAxisValues" /** * Axis chart graph annotation interface. */ interface Annotation { /** * Annotation x position. */ x: number | string /** * Annotation y position. */ y: number | string /** * Annotation x2 position. */ x2?: number | string /** * Annotation y2 position. */ y2?: number | string /** * Annotation z position. * @default 'front' */ z?: 'front' | 'back' /** * Annotation x type. * @default 'x' */ xType?: 'x' | 'x2' /** * Annotation y type. * @default 'y' */ yType?: 'y' | 'y2' /** * Additional attributes can be added to the annotation for reference. */ [key: string]: any } /** * Possible domain values type. */ type DomainValues = Array<string | number | Date> /** * Axis chart, axis config interface. */ interface AxisConfig { /** * Specify a configured [d3-axis](https://github.com/d3/d3-axis). It's usually better to use the * following axis configuration properties instead of setting your own. */ axis?: Axis<any> /** * Axis orientation inside or outside the plane. * @default 'outer' */ orient?: 'inner' | 'outer' /** * Axis tick wrap length. * @default Infinity */ wrapLength?: number /** * See d3-axis [tickSize](https://github.com/d3/d3-axis#axis_tickSize) * @default 6 */ tickSize?: number /** * Enable or disable the grid for this axis. * @default true */ showGrid?: boolean /** * Sets a label for this axis. */ label?: string /** * Axis label orientation. */ labelOrient?: 'outer start' | 'outer middle' | 'outer end' | 'inner start' | 'inner middle' | 'inner end' /** * Pad both sides of the continuous scale by a percent of the domain range. For example [-0.1, 0.2] will * pad the minimum scale domain by 10% and the upper end by 20%. */ linearPadding?: [number, number] /** * Pad tick labels from the plan for this axis. See d3-axis [tickPadding](https://github.com/d3/d3-axis#axis_tickPadding) * @default 3 */ tickPadding?: number /** * Specify the tick count or axis time interval for the axis. See d3-axis [ticks](https://github.com/d3/d3-axis#axis_ticks) */ ticks?: AxisTimeInterval | number /** * Specify the tick format. See d3-axis [tickFormat](https://github.com/d3/d3-axis#axis_tickFormat) */ tickFormat?: (n: number | { valueOf(): number }) => string /** * Specify the tick values instead of automatically generating them. See d3-axis [tickValues](https://github.com/d3/d3-axis#axis_tickValues) */ tickValues?: Array<any> /** * Axis' scale config interface. */ scale?: { /** * D3 scale instance or descriptor string. */ type?: 'band' | 'point' | 'linear' | 'time' | 'pow' | 'log' | AxisScale<any> /** * See [d3-scale](https://github.com/d3/d3-scale) for different scale type domains. */ domain?: DomainValues | ((values: DomainValues) => DomainValues) /** * See d3-scale [continuous clamp](https://github.com/d3/d3-scale#continuous_clamp) * @default false */ clamp?: boolean /** * See d3-scale [continuous nice](https://github.com/d3/d3-scale#continuous_nice) * @default false */ nice?: boolean /** * See d3-scale [power exponent](https://github.com/d3/d3-scale#pow_exponent) * @default 1 */ exponent?: number /** * See d3-scale [log base](https://github.com/d3/d3-scale#log_base) * @default 10 */ base?: number /** * See d3-scale [symlog constant](https://github.com/d3/d3-scale#symlog_constant) * @default 1 */ constant?: number /** * Force domain bounds for [continuous scales](https://github.com/d3/d3-scale#_continuous). * This is useful if you want the domain min OR max to be automatic but the other to be fixed. */ forceBounds?: { /** * Force minimum domain bound for [continuous scales](https://github.com/d3/d3-scale#_continuous) */ min?: number /** * Force maximum domain bound for [continuous scales](https://github.com/d3/d3-scale#_continuous) */ max?: number } } } /** * Axis chart group config interface. */ export interface ChartAxisGroupConfig { /** * The group label, should match the corresponding graph's group property. */ label: string /** * The group color property. By default this will defer to the graph color. */ color?: string /** * Legend icon symbol type. This can either be a font awesome character code * (e.g. '\uf111' for a circle), [d3 symbol](https://github.com/d3/d3-shape#symbols) * or [d2b symbol](https://docs.d2bjs.org/shape/symbols.html). If set, this will * override the legend's icon property. */ legendIcon?: string | SymbolType /** * Initially hides this group. This value will be modified internally when interacting with the chart legend. */ hidden?: boolean } /** * Chart axis config interface. */ export interface ChartAxisConfig { /** * Chart annotations. Refer to the d3-annotation [docs](https://d3-annotation.susielu.com) for * additional annotation configuration. */ annotations?: Array<Annotation> /** * Axis chart groups. Groups are used to group multiple graph's together on the legend. */ groups?: Array<ChartAxisGroupConfig> /** * Event hook for d2b charts. Will be after the chart is rendered. * Note: Transitions may still occur after this lifecycle hook fires. */ updated?: (this: HTMLElement, data: ChartAxisData) => void /** * The pixel size of the chart. */ size?: { /** * The pixel width of the chart. If not given, the container width will be used. */ width?: number, /** * The pixel height of the chart. If not given, the container height will be used. */ height?: number } /** * The internal chart duration in miliseconds. * @default 250 */ duration?: number /** * Chart axis group color or accessor function. * @default d => colorGenerator(d.label) */ groupColor?: string | ((data: ChartAxisGraphData) => string) /** * Chart axis graph color or accessor function. * @default d => colorGenerator(d.label) */ graphColor?: string | ((data: ChartAxisGroupConfig) => string) /** * The chart's inner padding (excluding the legend) in pixels. * @default 10 */ chartPadding?: number | Padding /** * The chart's outer padding (including the legend) in pixels. * @default 10 */ padding?: number | Padding /** * The chart's plane padding. If set to null the padding will be computed automatically based on the axis label and tick sizes. * @default null */ planePadding?: null | number | Padding /** * The chart's plane margin. This is useful if additional space is required for axis labels or ticks. * @default 10 */ planeMargin?: number | Padding /** * Chart legend configuration options. */ legend?: { /** * Enable or disable the legend. * @default true */ enabled?: boolean /** * Legend orientation, relative to the chart. * @default 'bottom' */ orient?: Orient /** * Whether the legend will hide / show arcs on click. * @default true */ clickable?: boolean /** * Whether the legend will hide / show arcs on dblclick. * @default true */ dblclickable?: boolean /** * Legend icon symbol type. This can either be a font awesome character code * (e.g. '\uf111' for a circle), [d3 symbol](https://github.com/d3/d3-shape#symbols) * or [d2b symbol](https://docs.d2bjs.org/shape/symbols.html). This can also be provided * as an accessor function to the graph / group data. * @default d3.symbolCircle */ icon?: string | SymbolType | ((data: ChartAxisGraphData | ChartAxisGroupConfig) => string | SymbolType) } /** * Chart tooltip configuration options. */ tooltip?: { /** * Tooltip will show values near the horizontal position of the cursor. * @default true */ trackX?: boolean /** * Tooltip will show values near the vertical position of the cursor. (useful for horizontally oriented graphs or * charts that have a lot of y values stacked on the same discrete x values) * @default false */ trackY?: boolean /** * The tooltip threshold for the cursor distant to the nearest axis chart value. * @default 50 */ threshold?: number /** * Html content to be displayed in the tooltip's title. * @default (values) => { * const first = values[0].value * return `${first.x, first.x1, first.median}` * } */ title?: null | string | ((values: Array<{value: ChartAxisValueData, graph: ChartAxisGraphData}>) => string | null) /** * Html content to be displayed in each of the tooltip's rows. * @default (value, graph) => { * return `${graph.label}: ${orEquals(value.y, value.y1, value.median)}` * } */ row?: null | string | ((value: ChartAxisValueData, graph: ChartAxisGraphData) => string | null) } /** * X-axis (bottom) config */ x?: AxisConfig /** * Y-axis (left) config */ y?: AxisConfig /** * X2-axis (top) config */ x2?: AxisConfig /** * Y2-axis (right) config */ y2?: AxisConfig /** * Axis chart graph set configuration. */ sets?: Array<ChartAxisGeneralSetConfig | ChartAxisBoxPlotSetConfig | ChartAxisBubblePackSetConfig> } /** * Chart axis data interface. */ export interface ChartAxisData extends ChartAxisConfig { /** * Axis chart graph set data. */ sets: Array<ChartAxisGeneralSetData | ChartAxisBoxPlotSetData | ChartAxisBubblePackSetData> }