chartjs-plugin-datalabels
Version:
Chart.js plugin to display labels on data elements
242 lines (212 loc) • 6.76 kB
TypeScript
import {ChartEvent} from 'chart.js';
import {Context} from './context';
type Align = 'bottom' | 'center' | 'end' | 'left' | 'right' | 'start' | 'top' | number;
type Anchor = 'center' | 'end' | 'start';
type Color = string | CanvasGradient | CanvasPattern;
type Listener = (context: Context, event: ChartEvent) => boolean | void;
type TextAlign = 'left' | 'right' | 'start' | 'center' | 'end';
type Font = {
family?: string;
lineHeight?: string | number;
size?: number;
style?: 'normal' | 'italic' | 'oblique';
weight?: 'normal' | 'bold' | 'bolder' | 'lighter' | number;
};
type Padding = number | {
top?: number;
right?: number;
bottom?: number;
left?: number;
};
// Generic types
type Indexable<T> = T | T[];
type Scriptable<T> = T | ((context: Context) => T);
interface LabelOptions {
/**
* The label box alignment relative to `anchor` that can be expressed either
* by a number representing the clockwise angle (in degree) or a by one of
* the following string presets:
*
* - `'start'`: before the anchor point, following the same direction
* - `'end'`: after the anchor point, following the same direction
* - `'center'`: centered on the anchor point
* - `'right'`: 0°
* - `'bottom'`: 90°
* - `'left'`: 180°
* - `'top'`: 270°
*
* @default 'center'
* @since 0.1.0
*/
align?: Indexable<Align> | Scriptable<Align>;
/**
* The label box alignment relative to the element:
*
* - `'center'`
* - `'end'`
* - `'start'`
*
* @default 'center'
* @since 0.1.0
*/
anchor?: Indexable<Anchor> | Scriptable<Anchor>;
/**
* The color used to draw the background of the surrounding frame.
* @default null (no background)
* @since 0.1.0
*/
backgroundColor?: Indexable<Color | null> | Scriptable<Color | null>;
/**
* The color used to draw the border of the surrounding frame.
* @default null (no border)
* @since 0.1.0
*/
borderColor?: Indexable<Color | null> | Scriptable<Color | null>;
/**
* The border radius used to add rounded corners to the surrounding frame.
* @default 0 (not rounded)
* @since 0.1.0
*/
borderRadius?: Indexable<number> | Scriptable<number>;
/**
* The border width of the surrounding frame.
* @default 0 (no border)
* @since 0.1.0
*/
borderWidth?: Indexable<number> | Scriptable<number>;
/**
* When `true`, the anchor position is calculated based on the visible
* geometry of the associated element (i.e. part inside the chart area).
* @default false (no clamping)
* @since 0.5.0
*/
clamp?: Indexable<boolean> | Scriptable<boolean>;
/**
* Clip the label drawing to the chart area.
* @default false (no clipping)
* @since 0.4.0
*/
clip?: Indexable<boolean> | Scriptable<boolean>;
/**
* The color used to draw the label text.
* @default undefined (Chart.defaults.color)
* @since 0.1.0
*/
color?: Indexable<Color> | Scriptable<Color>;
/**
* When `false`, the label is hidden and associated options are not
* calculated, else if `true`, the label is drawn. If `auto`, the
* label is automatically hidden if it appears under another label.
* @default true
* @since 0.1.0 (boolean), 0.5.0 ('auto')
*/
display?: Indexable<boolean | string> | Scriptable<boolean | string>;
/**
* The font options used to draw the label text.
* @default Chart.defaults.font.*
* @since 0.1.0
*/
font?: Indexable<Font> | Scriptable<Font>;
/**
* Allows to customize the label text by transforming input data.
* @default data[index] // parsed as string
* @since 0.1.0
*/
// eslint-disable-next-line @typescript-eslint/no-explicit-any
formatter?: (value: any, context: Context) => any | null;
/**
* Event listeners, where the property is the type of the event to listen
* and the value a callback with a unique `context` argument containing
* the same information as for scriptable options. If a callback explicitly
* returns `true`, the label is updated with the current context and the
* chart re-rendered. This allows to implement visual interactions with
* labels such as highlight, selection, etc.
* @default {}
* @since 0.3.0
*/
listeners?: {
/**
* Called when a mouse click is detected within a label.
* @since 0.3.0
*/
click?: Listener;
/**
* Called when the mouse enters a label.
* @since 0.3.0
*/
enter?: Listener;
/**
* Called when the mouse leaves a label.
* @since 0.3.0
*/
leave?: Listener;
};
/**
* The distance (in pixels) to pull the label away from the anchor point,
* the direction being determined by the `align` value (only applicable
* if `align` is `start` or `end`).
* @default 4
* @since 0.1.0
*/
offset?: Indexable<number> | Scriptable<number>;
/**
* The label global opacity, including text, background, borders, etc.,
* specified as a number between 0.0 (fully transparent) and 1.0 (fully opaque).
* @default 1
* @since 0.1.0
*/
opacity?: Indexable<number> | Scriptable<number>;
/**
* The padding (in pixels) to apply between the text and the surrounding frame.
* @default 4 (all values)
* @since 0.1.0
*/
padding?: Indexable<Padding> | Scriptable<Padding>;
/**
* Clockwise rotation of the label relative to its center.
* @default 0
* @since 0.1.0
*/
rotation?: Indexable<number> | Scriptable<number>;
/**
* Text alignment for multi-lines labels.
* @default 'start'
* @since 0.1.0
*/
textAlign?: Indexable<TextAlign> | Scriptable<TextAlign>;
/**
* The stroke color used to draw the label text. If this options is
* not set (default), the value of the `color` option will be used.
* @default color
* @since 0.5.0
*/
textStrokeColor?: Indexable<Color> | Scriptable<Color>;
/**
* The width of the stroke for the label text.
* @default 0 (no stroke)
* @since 0.5.0
*/
textStrokeWidth?: Indexable<number> | Scriptable<number>;
/**
* The amount of blur applied to shadow under the label text.
* @default 0 (no shadow)
* @since 0.5.0
*/
textShadowBlur?: Indexable<number> | Scriptable<number>;
/**
* The color of the shadow under the label text.
* @default color
* @since 0.5.0
*/
textShadowColor?: Indexable<Color> | Scriptable<Color>;
}
export interface Options extends LabelOptions {
/**
* Multi-labels definition object where each property represents a new
* label, the key being the label key and the value being the options
* specific to each label and merged on top of the root options.
* @default undefined
* @since 0.7.0
*/
labels?: Record<string, LabelOptions | null>;
}