@unovis/ts 1.6.2-pre.2 → 1.6.2-pre.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -21,11 +21,9 @@ export interface CrosshairConfigInterface<Datum> extends WithOptional<XYComponen
21
21
  baseline?: NumericAccessor<Datum>;
22
22
  /** An instance of the Tooltip component to be used with Crosshair. Default: `undefined` */
23
23
  tooltip?: Tooltip | undefined;
24
- /** Tooltip template accessor. The function is supposed to return either a valid HTML string or an HTMLElement.
25
- * When `snapToData` is `false`, `datum` will be `undefined` but `data` and `leftNearestDatumIndex` will be provided.
26
- * Default: `d => ''` */
27
- template?: (datum: Datum, x: number | Date, data?: Datum[], leftNearestDatumIndex?: number) => string | HTMLElement;
28
- /** Hide Crosshair when the corresponding datum element is far from mouse pointer. Default: `true` */
24
+ /** Tooltip template accessor. The function is supposed to return either a valid HTML string or an HTMLElement. Default: `d => ''` */
25
+ template?: (data: Datum, x: number | Date) => string | HTMLElement;
26
+ /** Hide Crosshair when the corresponding element is far from mouse pointer. Default: `true` */
29
27
  hideWhenFarFromPointer?: boolean;
30
28
  /** Distance in pixels to check in the hideWhenFarFromPointer condition. Default: `100` */
31
29
  hideWhenFarFromPointerDistance?: number;
@@ -36,22 +34,11 @@ export interface CrosshairConfigInterface<Datum> extends WithOptional<XYComponen
36
34
  */
37
35
  snapToData?: boolean;
38
36
  /** Custom function for setting up the crosshair circles, usually needed when `snapToData` is set to `false`.
39
- * The function receives the horizontal position of the crosshair (in the data space, not in pixels), the data array,
40
- * the `yScale` instance to help you calculate the correct vertical position of the circles, and the nearest datum index.
41
- * It has to return an array of the `CrosshairCircle` objects: `{ y: number; color: string; opacity?: number }[]`.
37
+ * The function receives the horizontal position of the crosshair (in the data space, not in pixels), the data array
38
+ * and the `yScale` instance to help you calculate the correct vertical position of the circles.
39
+ * It has to return an array of the CrosshairCircle objects: `{ y: number; color: string; opacity?: number }[]`.
42
40
  * Default: `undefined`
43
41
  */
44
- getCircles?: (x: number | Date, data: Datum[], yScale: ContinuousScale, leftNearestDatumIndex?: number) => CrosshairCircle[];
45
- /** Callback function that is called when the crosshair is moved:
46
- * - `x` is the horizontal position of the crosshair in the data space;
47
- * - `datum` is the nearest datum to the crosshair;
48
- * - `datumIndex` is the index of the nearest datum.
49
- * - `event` is the event that triggered the crosshair move (mouse or wheel).
50
- *
51
- * When the mouse goes out of the container and on wheel events, all the arguments are `undefined` except for `event`.
52
- * Default: `undefined` */
53
- onCrosshairMove?: (x?: number | Date, datum?: Datum, datumIndex?: number, event?: MouseEvent | WheelEvent) => void;
54
- /** Force the crosshair to show at a specific position. Default: `undefined` */
55
- forceShowAt?: number | Date;
42
+ getCircles?: (x: number | Date | Date, data: Datum[], yScale: ContinuousScale) => CrosshairCircle[];
56
43
  }
57
44
  export declare const CrosshairDefaultConfig: CrosshairConfigInterface<unknown>;
@@ -1,6 +1,6 @@
1
1
  import { XYComponentDefaultConfig } from '../../core/xy-component/config.js';
2
2
 
3
- const CrosshairDefaultConfig = Object.assign(Object.assign({}, XYComponentDefaultConfig), { yStacked: undefined, baseline: null, duration: 100, tooltip: undefined, template: (d, x, data, leftNearestDatumIndex) => '', hideWhenFarFromPointer: true, hideWhenFarFromPointerDistance: 100, snapToData: true, getCircles: undefined, color: undefined, strokeColor: undefined, strokeWidth: undefined, onCrosshairMove: undefined, forceShowAt: undefined });
3
+ const CrosshairDefaultConfig = Object.assign(Object.assign({}, XYComponentDefaultConfig), { yStacked: undefined, baseline: null, duration: 100, tooltip: undefined, template: (d, x) => '', hideWhenFarFromPointer: true, hideWhenFarFromPointerDistance: 100, snapToData: true, getCircles: undefined, color: undefined, strokeColor: undefined, strokeWidth: undefined });
4
4
 
5
5
  export { CrosshairDefaultConfig };
6
6
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sources":["../../../src/components/crosshair/config.ts"],"sourcesContent":["import { XYComponentConfigInterface, XYComponentDefaultConfig } from 'core/xy-component/config'\nimport { Tooltip } from 'components/tooltip'\n\n// Types\nimport { NumericAccessor, ColorAccessor } from 'types/accessor'\nimport { ContinuousScale } from 'types/scale'\nimport { WithOptional } from 'types/misc'\nimport { CrosshairCircle } from './types'\n\n// We extend partial XY config interface because x and y properties are optional for Crosshair\nexport interface CrosshairConfigInterface<Datum> extends WithOptional<XYComponentConfigInterface<Datum>, 'x' | 'y'> {\n /** Optional accessor function for getting the values along the X axis. Default: `undefined` */\n x?: NumericAccessor<Datum>;\n /** Optional single of multiple accessor functions for getting the values along the Y axis. Default: `undefined` */\n y?: NumericAccessor<Datum> | NumericAccessor<Datum>[];\n /** Optional color array or color accessor function for crosshair circles. Default: `d => d.color` */\n color?: ColorAccessor<Datum>;\n /** Optional stroke color accessor function for crosshair circles. Default: `undefined` */\n strokeColor?: ColorAccessor<Datum>;\n /** Optional stroke width for crosshair circles. Default: `undefined` */\n strokeWidth?: NumericAccessor<Datum>;\n /** Separate array of accessors for stacked components (eg StackedBar, Area). Default: `undefined` */\n yStacked?: NumericAccessor<Datum>[];\n /** Baseline accessor function for stacked values, useful with stacked areas. Default: `null` */\n baseline?: NumericAccessor<Datum>;\n /** An instance of the Tooltip component to be used with Crosshair. Default: `undefined` */\n tooltip?: Tooltip | undefined;\n // TODO: Change `datum` type to `Datum | undefined`. This may break the build for many people, so we might want to do it in version 2.0\n /** Tooltip template accessor. The function is supposed to return either a valid HTML string or an HTMLElement.\n * When `snapToData` is `false`, `datum` will be `undefined` but `data` and `leftNearestDatumIndex` will be provided.\n * Default: `d => ''` */\n template?: (datum: Datum, x: number | Date, data?: Datum[], leftNearestDatumIndex?: number) => string | HTMLElement;\n /** Hide Crosshair when the corresponding datum element is far from mouse pointer. Default: `true` */\n hideWhenFarFromPointer?: boolean;\n /** Distance in pixels to check in the hideWhenFarFromPointer condition. Default: `100` */\n hideWhenFarFromPointerDistance?: number;\n /** Snap to the nearest data point.\n * If disabled, the tooltip template will receive only the horizontal position of the crosshair and you'll be responsible\n * for getting the underlying data records and crosshair circles (see the `getCircles` configuration option).\n * Default: `true`\n */\n snapToData?: boolean;\n /** Custom function for setting up the crosshair circles, usually needed when `snapToData` is set to `false`.\n * The function receives the horizontal position of the crosshair (in the data space, not in pixels), the data array,\n * the `yScale` instance to help you calculate the correct vertical position of the circles, and the nearest datum index.\n * It has to return an array of the `CrosshairCircle` objects: `{ y: number; color: string; opacity?: number }[]`.\n * Default: `undefined`\n */\n getCircles?: (x: number | Date, data: Datum[], yScale: ContinuousScale, leftNearestDatumIndex?: number) => CrosshairCircle[];\n /** Callback function that is called when the crosshair is moved:\n * - `x` is the horizontal position of the crosshair in the data space;\n * - `datum` is the nearest datum to the crosshair;\n * - `datumIndex` is the index of the nearest datum.\n * - `event` is the event that triggered the crosshair move (mouse or wheel).\n *\n * When the mouse goes out of the container and on wheel events, all the arguments are `undefined` except for `event`.\n * Default: `undefined` */\n onCrosshairMove?: (x?: number | Date, datum?: Datum, datumIndex?: number, event?: MouseEvent | WheelEvent) => void;\n /** Force the crosshair to show at a specific position. Default: `undefined` */\n forceShowAt?: number | Date;\n}\n\nexport const CrosshairDefaultConfig: CrosshairConfigInterface<unknown> = {\n ...XYComponentDefaultConfig,\n yStacked: undefined,\n baseline: null,\n duration: 100,\n tooltip: undefined,\n template: <Datum>(d: Datum, x: number | Date, data?: Datum[], leftNearestDatumIndex?: number): string => '',\n hideWhenFarFromPointer: true,\n hideWhenFarFromPointerDistance: 100,\n snapToData: true,\n getCircles: undefined,\n color: undefined,\n strokeColor: undefined,\n strokeWidth: undefined,\n onCrosshairMove: undefined,\n forceShowAt: undefined,\n}\n\n"],"names":[],"mappings":";;AA8DO,MAAM,sBAAsB,GAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAC9B,wBAAwB,CAC3B,EAAA,EAAA,QAAQ,EAAE,SAAS,EACnB,QAAQ,EAAE,IAAI,EACd,QAAQ,EAAE,GAAG,EACb,OAAO,EAAE,SAAS,EAClB,QAAQ,EAAE,CAAQ,CAAQ,EAAE,CAAgB,EAAE,IAAc,EAAE,qBAA8B,KAAa,EAAE,EAC3G,sBAAsB,EAAE,IAAI,EAC5B,8BAA8B,EAAE,GAAG,EACnC,UAAU,EAAE,IAAI,EAChB,UAAU,EAAE,SAAS,EACrB,KAAK,EAAE,SAAS,EAChB,WAAW,EAAE,SAAS,EACtB,WAAW,EAAE,SAAS,EACtB,eAAe,EAAE,SAAS,EAC1B,WAAW,EAAE,SAAS;;;;"}
1
+ {"version":3,"file":"config.js","sources":["../../../src/components/crosshair/config.ts"],"sourcesContent":["import { XYComponentConfigInterface, XYComponentDefaultConfig } from 'core/xy-component/config'\nimport { Tooltip } from 'components/tooltip'\n\n// Types\nimport { NumericAccessor, ColorAccessor } from 'types/accessor'\nimport { ContinuousScale } from 'types/scale'\nimport { WithOptional } from 'types/misc'\nimport { CrosshairCircle } from './types'\n\n// We extend partial XY config interface because x and y properties are optional for Crosshair\nexport interface CrosshairConfigInterface<Datum> extends WithOptional<XYComponentConfigInterface<Datum>, 'x' | 'y'> {\n /** Optional accessor function for getting the values along the X axis. Default: `undefined` */\n x?: NumericAccessor<Datum>;\n /** Optional single of multiple accessor functions for getting the values along the Y axis. Default: `undefined` */\n y?: NumericAccessor<Datum> | NumericAccessor<Datum>[];\n /** Optional color array or color accessor function for crosshair circles. Default: `d => d.color` */\n color?: ColorAccessor<Datum>;\n /** Optional stroke color accessor function for crosshair circles. Default: `undefined` */\n strokeColor?: ColorAccessor<Datum>;\n /** Optional stroke width for crosshair circles. Default: `undefined` */\n strokeWidth?: NumericAccessor<Datum>;\n /** Separate array of accessors for stacked components (eg StackedBar, Area). Default: `undefined` */\n yStacked?: NumericAccessor<Datum>[];\n /** Baseline accessor function for stacked values, useful with stacked areas. Default: `null` */\n baseline?: NumericAccessor<Datum>;\n /** An instance of the Tooltip component to be used with Crosshair. Default: `undefined` */\n tooltip?: Tooltip | undefined;\n /** Tooltip template accessor. The function is supposed to return either a valid HTML string or an HTMLElement. Default: `d => ''` */\n template?: (data: Datum, x: number | Date) => string | HTMLElement;\n /** Hide Crosshair when the corresponding element is far from mouse pointer. Default: `true` */\n hideWhenFarFromPointer?: boolean;\n /** Distance in pixels to check in the hideWhenFarFromPointer condition. Default: `100` */\n hideWhenFarFromPointerDistance?: number;\n /** Snap to the nearest data point.\n * If disabled, the tooltip template will receive only the horizontal position of the crosshair and you'll be responsible\n * for getting the underlying data records and crosshair circles (see the `getCircles` configuration option).\n * Default: `true`\n */\n snapToData?: boolean;\n /** Custom function for setting up the crosshair circles, usually needed when `snapToData` is set to `false`.\n * The function receives the horizontal position of the crosshair (in the data space, not in pixels), the data array\n * and the `yScale` instance to help you calculate the correct vertical position of the circles.\n * It has to return an array of the CrosshairCircle objects: `{ y: number; color: string; opacity?: number }[]`.\n * Default: `undefined`\n */\n getCircles?: (x: number | Date | Date, data: Datum[], yScale: ContinuousScale) => CrosshairCircle[];\n}\n\nexport const CrosshairDefaultConfig: CrosshairConfigInterface<unknown> = {\n ...XYComponentDefaultConfig,\n yStacked: undefined,\n baseline: null,\n duration: 100,\n tooltip: undefined,\n template: <Datum>(d: Datum, x: number | Date): string => '',\n hideWhenFarFromPointer: true,\n hideWhenFarFromPointerDistance: 100,\n snapToData: true,\n getCircles: undefined,\n color: undefined,\n strokeColor: undefined,\n strokeWidth: undefined,\n}\n\n"],"names":[],"mappings":";;AAgDO,MAAM,sBAAsB,GAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAC9B,wBAAwB,CAAA,EAAA,EAC3B,QAAQ,EAAE,SAAS,EACnB,QAAQ,EAAE,IAAI,EACd,QAAQ,EAAE,GAAG,EACb,OAAO,EAAE,SAAS,EAClB,QAAQ,EAAE,CAAQ,CAAQ,EAAE,CAAgB,KAAa,EAAE,EAC3D,sBAAsB,EAAE,IAAI,EAC5B,8BAA8B,EAAE,GAAG,EACnC,UAAU,EAAE,IAAI,EAChB,UAAU,EAAE,SAAS,EACrB,KAAK,EAAE,SAAS,EAChB,WAAW,EAAE,SAAS,EACtB,WAAW,EAAE,SAAS;;;;"}
@@ -11,9 +11,10 @@ export declare class Crosshair<Datum> extends XYComponentCore<Datum, CrosshairCo
11
11
  config: CrosshairConfigInterface<Datum>;
12
12
  container: Selection<SVGSVGElement, any, SVGSVGElement, any>;
13
13
  line: Selection<SVGLineElement, any, SVGElement, any>;
14
- private _xPx;
15
- private _yPx;
16
- private _mouseEvent;
14
+ x: number;
15
+ datum: Datum;
16
+ datumIndex: number;
17
+ show: boolean;
17
18
  private _animFrameId;
18
19
  /** Tooltip component to be used by Crosshair if not provided by the config.
19
20
  * This property is supposed to be set externally by a container component like XYContainer. */
@@ -22,15 +23,13 @@ export declare class Crosshair<Datum> extends XYComponentCore<Datum, CrosshairCo
22
23
  private _accessors;
23
24
  set accessors(accessors: CrosshairAccessors<Datum>);
24
25
  get accessors(): CrosshairAccessors<Datum>;
25
- private _isContainerInViewport;
26
26
  constructor(config?: CrosshairConfigInterface<Datum>);
27
27
  setContainer(containerSvg: Selection<SVGSVGElement, unknown, SVGSVGElement, unknown>): void;
28
28
  _render(customDuration?: number): void;
29
- hide(sourceEvent?: MouseEvent | WheelEvent): void;
29
+ hide(): void;
30
30
  _onMouseMove(event: MouseEvent): void;
31
- _onMouseOut(event?: MouseEvent): void;
32
- _onWheel(event: WheelEvent): void;
33
- _showTooltip(datum: Datum, xValue: number, pos: [number, number], nearestDatumIndex: number | undefined): void;
31
+ _onMouseOut(): void;
32
+ _showTooltip(event: MouseEvent): void;
34
33
  _hideTooltip(): void;
35
34
  getYDataExtent(): number[];
36
35
  private getCircleData;
@@ -5,7 +5,6 @@ import { isArray, isNumber, getNearest, clamp, getNumber, isFunction, getStacked
5
5
  import { smartTransition } from '../../utils/d3.js';
6
6
  import { getColor } from '../../utils/color.js';
7
7
  import { Position } from '../../types/position.js';
8
- import { FindNearestDirection } from '../../types/data.js';
9
8
  import { CrosshairDefaultConfig } from './config.js';
10
9
  import * as style from './style.js';
11
10
  import { line, circle } from './style.js';
@@ -16,9 +15,8 @@ class Crosshair extends XYComponentCore {
16
15
  this.clippable = true; // Don't apply clipping path to this component. See XYContainer
17
16
  this._defaultConfig = CrosshairDefaultConfig;
18
17
  this.config = this._defaultConfig;
19
- this._xPx = undefined;
20
- this._yPx = undefined;
21
- this._mouseEvent = undefined;
18
+ this.x = 0;
19
+ this.show = false;
22
20
  this._animFrameId = null;
23
21
  /** Accessors passed externally (e.g. from XYContainer) */
24
22
  this._accessors = {
@@ -29,7 +27,7 @@ class Crosshair extends XYComponentCore {
29
27
  };
30
28
  if (config)
31
29
  this.setConfig(config);
32
- this.g.style('opacity', 0);
30
+ this.g.style('opacity', this.show ? 1 : 0);
33
31
  this.line = this.g.append('line')
34
32
  .attr('class', line);
35
33
  }
@@ -45,106 +43,26 @@ class Crosshair extends XYComponentCore {
45
43
  const baseline = (_a = config.baseline) !== null && _a !== void 0 ? _a : this._accessors.baseline;
46
44
  return { x, y, yStacked, baseline };
47
45
  }
48
- _isContainerInViewport() {
49
- var _a;
50
- if (!((_a = this.container) === null || _a === void 0 ? void 0 : _a.node()))
51
- return false;
52
- const containerRect = this.container.node().getBoundingClientRect();
53
- const viewportWidth = window.innerWidth || document.documentElement.clientWidth;
54
- const viewportHeight = window.innerHeight || document.documentElement.clientHeight;
55
- // Calculate the visible area of the container
56
- const visibleWidth = Math.max(0, Math.min(containerRect.right, viewportWidth) - Math.max(containerRect.left, 0));
57
- const visibleHeight = Math.max(0, Math.min(containerRect.bottom, viewportHeight) - Math.max(containerRect.top, 0));
58
- const containerArea = containerRect.width * containerRect.height;
59
- const visibleArea = visibleWidth * visibleHeight;
60
- // Container must be at least 35% visible
61
- return containerArea > 0 && (visibleArea / containerArea) >= 0.35;
62
- }
63
46
  setContainer(containerSvg) {
64
- if (this.container === containerSvg)
65
- return;
47
+ // Set up mousemove event for Crosshair
66
48
  this.container = containerSvg;
67
49
  this.container.on('mousemove.crosshair', this._onMouseMove.bind(this));
68
50
  this.container.on('mouseout.crosshair', this._onMouseOut.bind(this));
69
- this.container.on('wheel.crosshair', this._onWheel.bind(this));
70
51
  }
71
52
  _render(customDuration) {
72
- var _a, _b, _c, _d, _e;
73
- const { config, datamodel } = this;
53
+ const { config } = this;
54
+ if (config.snapToData && !this.datum)
55
+ return;
74
56
  const duration = isNumber(customDuration) ? customDuration : config.duration;
75
- const isForceShowAtDefined = config.forceShowAt !== undefined;
76
- const xPx = isForceShowAtDefined ? this.xScale(config.forceShowAt) : this._xPx;
77
- const xValue = this.xScale.invert(xPx);
78
- const leftNearestDatumIndex = (((_a = datamodel.data) === null || _a === void 0 ? void 0 : _a.length) && this.accessors.x)
79
- ? datamodel.data.indexOf(getNearest(datamodel.data, xValue, this.accessors.x, FindNearestDirection.Left)) : undefined;
80
- // If `snapToData` is `true`, we need to find the nearest datum to the crosshair
81
- // It can be from a mouse interaction or from a `forceShowAt` setting
82
- let nearestDatum;
83
- let nearestDatumIndex;
84
- if (config.snapToData) {
85
- if (!this.accessors.y && !this.accessors.yStacked && ((_b = datamodel.data) === null || _b === void 0 ? void 0 : _b.length)) {
86
- console.warn('Unovis | Crosshair: Y accessors have not been configured. Please check if they\'re present in the configuration object');
87
- }
88
- // Emit a warning if there's no data to snap to.
89
- // To keep the console clean, only emit the warning when there's mouse interaction.
90
- if (!((_c = datamodel.data) === null || _c === void 0 ? void 0 : _c.length) && this._mouseEvent) {
91
- console.warn('Unovis | Crosshair: No data to snap to. Make sure the data has been passed to the container or to the crosshair itself');
92
- }
93
- nearestDatum = getNearest(datamodel.data, xValue, this.accessors.x);
94
- nearestDatumIndex = datamodel.data.indexOf(nearestDatum);
95
- }
96
- const xRange = this.xScale.range();
97
- const yRange = this.yScale.range();
98
- const xClamped = config.snapToData && nearestDatum
99
- ? clamp(Math.round(this.xScale(getNumber(nearestDatum, this.accessors.x, nearestDatumIndex))), 0, this._width)
100
- : clamp(xPx, xRange[0], xRange[1]);
101
- const isCrosshairWithinXRange = (xPx >= xRange[0]) && (xPx <= xRange[1]);
102
- const isCrosshairWithinYRange = (this._yPx >= Math.min(yRange[0], yRange[1])) && (this._yPx <= Math.max(yRange[0], yRange[1]));
103
- let shouldShow = this._xPx ? isCrosshairWithinXRange && isCrosshairWithinYRange : isCrosshairWithinXRange;
104
- // If the crosshair is far from the mouse pointer (usually when `snapToData` is `true` and data resolution is low), hide it
105
- if (config.hideWhenFarFromPointer && ((Math.abs(xClamped - (+xPx)) >= config.hideWhenFarFromPointerDistance))) {
106
- shouldShow = false;
107
- }
108
- const tooltip = (_d = config.tooltip) !== null && _d !== void 0 ? _d : this.tooltip;
109
- if (shouldShow && tooltip && this._isContainerInViewport()) {
110
- const container = tooltip.getContainer() || this.container.node();
111
- const isContainerBody = tooltip.isContainerBody();
112
- if (isForceShowAtDefined) {
113
- // Convert SVG coordinates to screen coordinates
114
- const containerRect = this.container.node().getBoundingClientRect();
115
- // Use the actual left margin from the container
116
- const screenX = (isContainerBody ? xPx + containerRect.left : xPx) + this._containerMargin.left;
117
- const screenY = this._height / 2 + (isContainerBody ? containerRect.top : 0);
118
- const pos = [screenX, screenY];
119
- this._showTooltip(nearestDatum, xValue, pos, leftNearestDatumIndex);
120
- }
121
- else if (this._mouseEvent) {
122
- const pos = (isContainerBody ? [this._mouseEvent.clientX, this._mouseEvent.clientY] : pointer(this._mouseEvent, container));
123
- this._showTooltip(nearestDatum, xValue, pos, leftNearestDatumIndex);
124
- }
125
- }
126
- else
127
- this._hideTooltip();
128
- // Trigger `onCrosshairMove` if the render was triggered by a mouse move event
129
- if (this._mouseEvent) {
130
- (_e = config.onCrosshairMove) === null || _e === void 0 ? void 0 : _e.call(config, shouldShow ? this.xScale.invert(this._xPx) : undefined, nearestDatum, nearestDatumIndex, this._mouseEvent);
131
- this._mouseEvent = undefined;
132
- }
133
57
  smartTransition(this.g, duration)
134
- .style('opacity', shouldShow ? 1 : 0);
135
- // When `config.forceShowAt` becomes `undefined`, the crosshair "jumps" to the edge of the chart.
136
- // This looks off, so we stop further rendering when the `xPx` value is not finite.
137
- if (!isFinite(xPx))
138
- return;
58
+ .style('opacity', this.show ? 1 : 0);
139
59
  this.line
140
60
  .attr('y1', 0)
141
- .attr('y2', this._height);
61
+ .attr('y1', this._height);
142
62
  smartTransition(this.line, duration, easeLinear)
143
- .attr('x1', xClamped)
144
- .attr('x2', xClamped);
145
- const circleData = isFunction(config.getCircles)
146
- ? config.getCircles(xValue, datamodel.data, this.yScale, leftNearestDatumIndex)
147
- : this.getCircleData(nearestDatum, nearestDatumIndex);
63
+ .attr('x1', this.x)
64
+ .attr('x2', this.x);
65
+ const circleData = this.getCircleData();
148
66
  const circles = this.g
149
67
  .selectAll('circle')
150
68
  .data(circleData, (d, i) => { var _a; return (_a = d.id) !== null && _a !== void 0 ? _a : i; });
@@ -152,13 +70,13 @@ class Crosshair extends XYComponentCore {
152
70
  .append('circle')
153
71
  .attr('class', circle)
154
72
  .attr('r', 0)
155
- .attr('cx', xClamped)
73
+ .attr('cx', this.x)
156
74
  .attr('cy', d => d.y)
157
75
  .style('fill', d => d.color)
158
76
  .style('stroke', d => d.strokeColor)
159
77
  .style('stroke-width', d => d.strokeWidth);
160
78
  smartTransition(circlesEnter.merge(circles), duration, easeLinear)
161
- .attr('cx', xClamped)
79
+ .attr('cx', this.x)
162
80
  .attr('cy', d => d.y)
163
81
  .attr('r', 4)
164
82
  .style('opacity', d => d.opacity)
@@ -167,54 +85,62 @@ class Crosshair extends XYComponentCore {
167
85
  .style('stroke-width', d => d.strokeWidth);
168
86
  circles.exit().remove();
169
87
  }
170
- hide(sourceEvent) {
171
- window.cancelAnimationFrame(this._animFrameId);
172
- this._animFrameId = window.requestAnimationFrame(() => {
173
- var _a, _b;
174
- this._xPx = undefined;
175
- this._yPx = undefined;
176
- this._mouseEvent = undefined;
177
- // We call `onCrosshairMove` with all the arguments set to `undefined` because we want
178
- // the users to be able to hide the crosshair easily when using `forceShowAt`
179
- (_b = (_a = this.config).onCrosshairMove) === null || _b === void 0 ? void 0 : _b.call(_a, undefined, undefined, undefined, sourceEvent);
180
- this._render();
181
- });
88
+ hide() {
89
+ this._onMouseOut();
182
90
  }
183
91
  _onMouseMove(event) {
184
- var _a;
185
- const { datamodel, element } = this;
92
+ var _a, _b;
93
+ const { config, datamodel, element } = this;
186
94
  if (!this.accessors.x && ((_a = datamodel.data) === null || _a === void 0 ? void 0 : _a.length)) {
187
95
  console.warn('Unovis | Crosshair: X accessor function has not been configured. Please check if it\'s present in the configuration object');
188
96
  }
189
- const [x, y] = pointer(event, element);
190
- this._xPx = x;
191
- this._yPx = y;
192
- this._mouseEvent = event;
97
+ const [x] = pointer(event, element);
98
+ const xRange = this.xScale.range();
99
+ if (config.snapToData) {
100
+ if (!this.accessors.y && !this.accessors.yStacked && ((_b = datamodel.data) === null || _b === void 0 ? void 0 : _b.length)) {
101
+ console.warn('Unovis | Crosshair: Y accessors have not been configured. Please check if they\'re present in the configuration object');
102
+ }
103
+ const scaleX = this.xScale;
104
+ const valueX = scaleX.invert(x);
105
+ this.datum = getNearest(datamodel.data, valueX, this.accessors.x);
106
+ this.datumIndex = datamodel.data.indexOf(this.datum);
107
+ if (!this.datum)
108
+ return;
109
+ this.x = clamp(Math.round(scaleX(getNumber(this.datum, this.accessors.x, this.datumIndex))), 0, this._width);
110
+ // Show the crosshair only if it's in the chart range and not far from mouse pointer (if configured)
111
+ this.show = (this.x >= 0) && (this.x <= this._width) && (!config.hideWhenFarFromPointer || (Math.abs(this.x - x) < config.hideWhenFarFromPointerDistance));
112
+ }
113
+ else {
114
+ const tolerance = 2; // Show the crosshair when it is at least 2 pixels close to the chart area
115
+ this.x = clamp(x, xRange[0], xRange[1]);
116
+ this.show = (x >= (xRange[0] - tolerance)) && (x <= (xRange[1] + tolerance));
117
+ }
193
118
  window.cancelAnimationFrame(this._animFrameId);
194
119
  this._animFrameId = window.requestAnimationFrame(() => {
195
- // We'll call `config.onCrosshairMove` in `_render` with the found `nearestDatum` and `nearestDatumIndex`,
196
- // which can come from the mouse interaction or from the `forceShowAt` setting
197
120
  this._render();
198
121
  });
122
+ if (this.show)
123
+ this._showTooltip(event);
124
+ else
125
+ this._hideTooltip();
199
126
  }
200
- _onMouseOut(event) {
201
- var _a;
202
- // Only hide if the mouse actually left the SVG, not just moved to a child
203
- if (!event || !((_a = this.container) === null || _a === void 0 ? void 0 : _a.node().contains(event.relatedTarget))) {
204
- this.hide(event);
205
- }
206
- }
207
- _onWheel(event) {
208
- this.hide(event);
127
+ _onMouseOut() {
128
+ this.show = false;
129
+ window.cancelAnimationFrame(this._animFrameId);
130
+ this._animFrameId = window.requestAnimationFrame(() => {
131
+ this._render();
132
+ });
133
+ this._hideTooltip();
209
134
  }
210
- _showTooltip(datum, xValue, pos, nearestDatumIndex) {
135
+ _showTooltip(event) {
211
136
  var _a;
212
- const { config, datamodel } = this;
137
+ const { config } = this;
213
138
  const tooltip = (_a = config.tooltip) !== null && _a !== void 0 ? _a : this.tooltip;
214
- if (!tooltip || !pos)
139
+ if (!tooltip)
215
140
  return;
216
- const [x, y] = pos;
217
- const content = config.template(datum, xValue, datamodel.data, nearestDatumIndex);
141
+ const container = tooltip.getContainer() || this.container.node();
142
+ const [x, y] = tooltip.isContainerBody() ? [event.clientX, event.clientY] : pointer(event, container);
143
+ const content = config.template(this.datum, this.xScale.invert(this.x));
218
144
  // Force set `followCursor` to `true` because we don't want Crosshair's tooltip to be hoverable
219
145
  tooltip.config.followCursor = true;
220
146
  // Set tooltip placement based on Crosshair's position (left / right)
@@ -235,30 +161,32 @@ class Crosshair extends XYComponentCore {
235
161
  getYDataExtent() {
236
162
  return [undefined, undefined];
237
163
  }
238
- getCircleData(datum, datumIndex) {
164
+ getCircleData() {
239
165
  var _a, _b;
240
- const { config } = this;
241
- if (config.snapToData && datum) {
166
+ const { config, datamodel: { data } } = this;
167
+ if (isFunction(config.getCircles))
168
+ return config.getCircles(this.xScale.invert(this.x), data, this.yScale);
169
+ if (config.snapToData && this.datum) {
242
170
  const yAccessors = (_a = this.accessors.y) !== null && _a !== void 0 ? _a : [];
243
171
  const yStackedAccessors = (_b = this.accessors.yStacked) !== null && _b !== void 0 ? _b : [];
244
- const baselineValue = getNumber(datum, this.accessors.baseline, datumIndex) || 0;
245
- const stackedValues = getStackedValues(datum, datumIndex, ...yStackedAccessors)
246
- .map((value, index) => ({
172
+ const baselineValue = getNumber(this.datum, this.accessors.baseline, this.datumIndex) || 0;
173
+ const stackedValues = getStackedValues(this.datum, this.datumIndex, ...yStackedAccessors)
174
+ .map((value, index, arr) => ({
247
175
  y: this.yScale(value + baselineValue),
248
- opacity: isNumber(getNumber(datum, yStackedAccessors[index], index)) ? 1 : 0,
249
- color: getColor(datum, config.color, index),
250
- strokeColor: config.strokeColor ? getColor(datum, config.strokeColor, index) : undefined,
251
- strokeWidth: config.strokeWidth ? getNumber(datum, config.strokeWidth, index) : undefined,
176
+ opacity: isNumber(getNumber(this.datum, yStackedAccessors[index])) ? 1 : 0,
177
+ color: getColor(this.datum, config.color, index),
178
+ strokeColor: config.strokeColor ? getColor(this.datum, config.strokeColor, index) : undefined,
179
+ strokeWidth: config.strokeWidth ? getNumber(this.datum, config.strokeWidth, index) : undefined,
252
180
  }));
253
181
  const regularValues = yAccessors
254
182
  .map((a, index) => {
255
- const value = getNumber(datum, a, datumIndex);
183
+ const value = getNumber(this.datum, a);
256
184
  return {
257
185
  y: this.yScale(value),
258
186
  opacity: isNumber(value) ? 1 : 0,
259
- color: getColor(datum, config.color, stackedValues.length + index),
260
- strokeColor: config.strokeColor ? getColor(datum, config.strokeColor, index) : undefined,
261
- strokeWidth: config.strokeWidth ? getNumber(datum, config.strokeWidth, index) : undefined,
187
+ color: getColor(this.datum, config.color, stackedValues.length + index),
188
+ strokeColor: config.strokeColor ? getColor(this.datum, config.strokeColor, index) : undefined,
189
+ strokeWidth: config.strokeWidth ? getNumber(this.datum, config.strokeWidth, index) : undefined,
262
190
  };
263
191
  });
264
192
  return stackedValues.concat(regularValues);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/components/crosshair/index.ts"],"sourcesContent":["import { Selection, pointer } from 'd3-selection'\nimport { easeLinear } from 'd3-ease'\n\n// Core\nimport { XYComponentCore } from 'core/xy-component'\nimport { Tooltip } from 'components/tooltip'\n\n// Utils\nimport { isNumber, isArray, getNumber, clamp, getStackedValues, getNearest, isFunction } from 'utils/data'\nimport { smartTransition } from 'utils/d3'\nimport { getColor } from 'utils/color'\n\n// Types\nimport { Position } from 'types/position'\nimport { FindNearestDirection } from 'types/data'\n\n// Local Types\nimport { CrosshairAccessors, CrosshairCircle } from './types'\n\n// Config\nimport { CrosshairDefaultConfig, CrosshairConfigInterface } from './config'\n\n// Styles\nimport * as s from './style'\n\n\nexport class Crosshair<Datum> extends XYComponentCore<Datum, CrosshairConfigInterface<Datum>> {\n static selectors = s\n clippable = true // Don't apply clipping path to this component. See XYContainer\n protected _defaultConfig = CrosshairDefaultConfig as CrosshairConfigInterface<Datum>\n public config: CrosshairConfigInterface<Datum> = this._defaultConfig\n container: Selection<SVGSVGElement, any, SVGSVGElement, any>\n line: Selection<SVGLineElement, any, SVGElement, any>\n private _xPx: number | undefined = undefined\n private _yPx: number | undefined = undefined\n private _mouseEvent: MouseEvent | undefined = undefined\n private _animFrameId: number = null\n\n /** Tooltip component to be used by Crosshair if not provided by the config.\n * This property is supposed to be set externally by a container component like XYContainer. */\n public tooltip: Tooltip\n\n /** Accessors passed externally (e.g. from XYContainer) */\n private _accessors: CrosshairAccessors<Datum> = {\n x: undefined,\n y: undefined,\n yStacked: undefined,\n baseline: undefined,\n }\n\n public set accessors (accessors: CrosshairAccessors<Datum>) { this._accessors = accessors }\n public get accessors (): CrosshairAccessors<Datum> {\n const { config } = this\n\n const hasConfig = !!(config.x || config.y || config.yStacked)\n const x = hasConfig ? config.x : this._accessors.x\n const yAcc = hasConfig ? config.y : this._accessors.y\n const y = yAcc ? (isArray(yAcc) ? yAcc : [yAcc]) : undefined\n const yStacked = hasConfig ? config.yStacked : this._accessors.yStacked\n const baseline = config.baseline ?? this._accessors.baseline\n\n return { x, y, yStacked, baseline }\n }\n\n private _isContainerInViewport (): boolean {\n if (!this.container?.node()) return false\n\n const containerRect = this.container.node().getBoundingClientRect()\n const viewportWidth = window.innerWidth || document.documentElement.clientWidth\n const viewportHeight = window.innerHeight || document.documentElement.clientHeight\n\n // Calculate the visible area of the container\n const visibleWidth = Math.max(0, Math.min(containerRect.right, viewportWidth) - Math.max(containerRect.left, 0))\n const visibleHeight = Math.max(0, Math.min(containerRect.bottom, viewportHeight) - Math.max(containerRect.top, 0))\n const containerArea = containerRect.width * containerRect.height\n const visibleArea = visibleWidth * visibleHeight\n\n // Container must be at least 35% visible\n return containerArea > 0 && (visibleArea / containerArea) >= 0.35\n }\n\n constructor (config?: CrosshairConfigInterface<Datum>) {\n super()\n if (config) this.setConfig(config)\n\n this.g.style('opacity', 0)\n this.line = this.g.append('line')\n .attr('class', s.line)\n }\n\n setContainer (containerSvg: Selection<SVGSVGElement, unknown, SVGSVGElement, unknown>): void {\n if (this.container === containerSvg) return\n\n this.container = containerSvg\n this.container.on('mousemove.crosshair', this._onMouseMove.bind(this))\n this.container.on('mouseout.crosshair', this._onMouseOut.bind(this))\n this.container.on('wheel.crosshair', this._onWheel.bind(this))\n }\n\n _render (customDuration?: number): void {\n const { config, datamodel } = this\n const duration = isNumber(customDuration) ? customDuration : config.duration\n const isForceShowAtDefined = config.forceShowAt !== undefined\n const xPx = isForceShowAtDefined ? this.xScale(config.forceShowAt) : this._xPx\n\n const xValue = this.xScale.invert(xPx) as number\n\n const leftNearestDatumIndex = (datamodel.data?.length && this.accessors.x)\n ? datamodel.data.indexOf(\n getNearest(datamodel.data, xValue, this.accessors.x, FindNearestDirection.Left)\n ) : undefined\n\n // If `snapToData` is `true`, we need to find the nearest datum to the crosshair\n // It can be from a mouse interaction or from a `forceShowAt` setting\n let nearestDatum: Datum | undefined\n let nearestDatumIndex: number | undefined\n if (config.snapToData) {\n if (!this.accessors.y && !this.accessors.yStacked && datamodel.data?.length) {\n console.warn('Unovis | Crosshair: Y accessors have not been configured. Please check if they\\'re present in the configuration object')\n }\n\n // Emit a warning if there's no data to snap to.\n // To keep the console clean, only emit the warning when there's mouse interaction.\n if (!datamodel.data?.length && this._mouseEvent) {\n console.warn('Unovis | Crosshair: No data to snap to. Make sure the data has been passed to the container or to the crosshair itself')\n }\n\n nearestDatum = getNearest(datamodel.data, xValue, this.accessors.x)\n nearestDatumIndex = datamodel.data.indexOf(nearestDatum)\n }\n\n const xRange = this.xScale.range()\n const yRange = this.yScale.range()\n const xClamped = config.snapToData && nearestDatum\n ? clamp(Math.round(this.xScale(getNumber(nearestDatum, this.accessors.x, nearestDatumIndex))), 0, this._width)\n : clamp(xPx, xRange[0], xRange[1])\n\n const isCrosshairWithinXRange = (xPx >= xRange[0]) && (xPx <= xRange[1])\n const isCrosshairWithinYRange = (this._yPx >= Math.min(yRange[0], yRange[1])) && (this._yPx <= Math.max(yRange[0], yRange[1]))\n let shouldShow = this._xPx ? isCrosshairWithinXRange && isCrosshairWithinYRange : isCrosshairWithinXRange\n\n // If the crosshair is far from the mouse pointer (usually when `snapToData` is `true` and data resolution is low), hide it\n if (config.hideWhenFarFromPointer && ((Math.abs(xClamped - (+xPx)) >= config.hideWhenFarFromPointerDistance))) {\n shouldShow = false\n }\n\n const tooltip = config.tooltip ?? this.tooltip\n if (shouldShow && tooltip && this._isContainerInViewport()) {\n const container = tooltip.getContainer() || this.container.node()\n const isContainerBody = tooltip.isContainerBody()\n\n if (isForceShowAtDefined) {\n // Convert SVG coordinates to screen coordinates\n const containerRect = this.container.node().getBoundingClientRect()\n\n // Use the actual left margin from the container\n const screenX = (isContainerBody ? xPx + containerRect.left : xPx) + this._containerMargin.left\n const screenY = this._height / 2 + (isContainerBody ? containerRect.top : 0)\n const pos = [screenX, screenY] as [number, number]\n this._showTooltip(nearestDatum, xValue, pos, leftNearestDatumIndex)\n } else if (this._mouseEvent) {\n const pos = (isContainerBody ? [this._mouseEvent.clientX, this._mouseEvent.clientY] : pointer(this._mouseEvent, container)) as [number, number]\n this._showTooltip(nearestDatum, xValue, pos, leftNearestDatumIndex)\n }\n } else this._hideTooltip()\n\n // Trigger `onCrosshairMove` if the render was triggered by a mouse move event\n if (this._mouseEvent) {\n config.onCrosshairMove?.(shouldShow ? this.xScale.invert(this._xPx) as number : undefined, nearestDatum, nearestDatumIndex, this._mouseEvent)\n this._mouseEvent = undefined\n }\n\n smartTransition(this.g, duration)\n .style('opacity', shouldShow ? 1 : 0)\n\n // When `config.forceShowAt` becomes `undefined`, the crosshair \"jumps\" to the edge of the chart.\n // This looks off, so we stop further rendering when the `xPx` value is not finite.\n if (!isFinite(xPx)) return\n\n this.line\n .attr('y1', 0)\n .attr('y2', this._height)\n\n smartTransition(this.line, duration, easeLinear)\n .attr('x1', xClamped)\n .attr('x2', xClamped)\n\n const circleData = isFunction(config.getCircles)\n ? config.getCircles(xValue, datamodel.data, this.yScale, leftNearestDatumIndex)\n : this.getCircleData(nearestDatum, nearestDatumIndex)\n\n const circles = this.g\n .selectAll<SVGCircleElement, CrosshairCircle>('circle')\n .data(circleData, (d, i) => d.id ?? i)\n\n const circlesEnter = circles.enter()\n .append('circle')\n .attr('class', s.circle)\n .attr('r', 0)\n .attr('cx', xClamped)\n .attr('cy', d => d.y)\n .style('fill', d => d.color)\n .style('stroke', d => d.strokeColor)\n .style('stroke-width', d => d.strokeWidth)\n\n smartTransition(circlesEnter.merge(circles), duration, easeLinear)\n .attr('cx', xClamped)\n .attr('cy', d => d.y)\n .attr('r', 4)\n .style('opacity', d => d.opacity)\n .style('fill', d => d.color)\n .style('stroke', d => d.strokeColor)\n .style('stroke-width', d => d.strokeWidth)\n\n circles.exit().remove()\n }\n\n hide (sourceEvent?: MouseEvent | WheelEvent): void {\n window.cancelAnimationFrame(this._animFrameId)\n this._animFrameId = window.requestAnimationFrame(() => {\n this._xPx = undefined\n this._yPx = undefined\n this._mouseEvent = undefined\n // We call `onCrosshairMove` with all the arguments set to `undefined` because we want\n // the users to be able to hide the crosshair easily when using `forceShowAt`\n this.config.onCrosshairMove?.(undefined, undefined, undefined, sourceEvent)\n this._render()\n })\n }\n\n _onMouseMove (event: MouseEvent): void {\n const { datamodel, element } = this\n if (!this.accessors.x && datamodel.data?.length) {\n console.warn('Unovis | Crosshair: X accessor function has not been configured. Please check if it\\'s present in the configuration object')\n }\n const [x, y] = pointer(event, element)\n this._xPx = x\n this._yPx = y\n this._mouseEvent = event\n\n window.cancelAnimationFrame(this._animFrameId)\n this._animFrameId = window.requestAnimationFrame(() => {\n // We'll call `config.onCrosshairMove` in `_render` with the found `nearestDatum` and `nearestDatumIndex`,\n // which can come from the mouse interaction or from the `forceShowAt` setting\n this._render()\n })\n }\n\n _onMouseOut (event?: MouseEvent): void {\n // Only hide if the mouse actually left the SVG, not just moved to a child\n if (!event || !this.container?.node().contains((event as MouseEvent).relatedTarget as Node)) {\n this.hide(event)\n }\n }\n\n _onWheel (event: WheelEvent): void {\n this.hide(event)\n }\n\n _showTooltip (datum: Datum, xValue: number, pos: [number, number], nearestDatumIndex: number | undefined): void {\n const { config, datamodel } = this\n const tooltip = config.tooltip ?? this.tooltip\n if (!tooltip || !pos) return\n\n const [x, y] = pos\n const content = config.template(datum, xValue, datamodel.data, nearestDatumIndex)\n // Force set `followCursor` to `true` because we don't want Crosshair's tooltip to be hoverable\n tooltip.config.followCursor = true\n\n // Set tooltip placement based on Crosshair's position (left / right)\n if (!tooltip.config.horizontalPlacement || tooltip.config.horizontalPlacement === Position.Auto) {\n const xRelative = tooltip.isContainerBody() ? x - this.container.node().getBoundingClientRect().left : x\n tooltip.overrideHorizontalPlacement(xRelative > this._containerWidth / 2 ? Position.Left : Position.Right)\n }\n\n if (content) tooltip.show(content, { x, y })\n }\n\n _hideTooltip (): void {\n const { config } = this\n const tooltip = config.tooltip ?? this.tooltip\n tooltip?.hide()\n }\n\n // We don't want Crosshair to be be taken in to account in domain calculations\n getYDataExtent (): number[] {\n return [undefined, undefined]\n }\n\n private getCircleData (datum: Datum, datumIndex: number): CrosshairCircle[] {\n const { config } = this\n\n if (config.snapToData && datum) {\n const yAccessors = this.accessors.y ?? []\n const yStackedAccessors = this.accessors.yStacked ?? []\n const baselineValue = getNumber(datum, this.accessors.baseline, datumIndex) || 0\n const stackedValues: CrosshairCircle[] = getStackedValues(datum, datumIndex, ...yStackedAccessors)\n .map((value, index) => ({\n y: this.yScale(value + baselineValue),\n opacity: isNumber(getNumber(datum, yStackedAccessors[index], index)) ? 1 : 0,\n color: getColor(datum, config.color, index),\n strokeColor: config.strokeColor ? getColor(datum, config.strokeColor, index) : undefined,\n strokeWidth: config.strokeWidth ? getNumber(datum, config.strokeWidth, index) : undefined,\n }))\n\n const regularValues: CrosshairCircle[] = yAccessors\n .map((a, index) => {\n const value = getNumber(datum, a, datumIndex)\n return {\n y: this.yScale(value),\n opacity: isNumber(value) ? 1 : 0,\n color: getColor(datum, config.color, stackedValues.length + index),\n strokeColor: config.strokeColor ? getColor(datum, config.strokeColor, index) : undefined,\n strokeWidth: config.strokeWidth ? getNumber(datum, config.strokeWidth, index) : undefined,\n }\n })\n\n return stackedValues.concat(regularValues)\n }\n\n return []\n }\n}\n"],"names":["s.line","s.circle","s"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/crosshair/index.ts"],"sourcesContent":["import { Selection, pointer } from 'd3-selection'\nimport { easeLinear } from 'd3-ease'\n\n// Core\nimport { XYComponentCore } from 'core/xy-component'\nimport { Tooltip } from 'components/tooltip'\n\n// Utils\nimport { isNumber, isArray, getNumber, clamp, getStackedValues, getNearest, isFunction } from 'utils/data'\nimport { smartTransition } from 'utils/d3'\nimport { getColor } from 'utils/color'\n\n// Types\nimport { Position } from 'types/position'\n\n// Local Types\nimport { CrosshairAccessors, CrosshairCircle } from './types'\n\n// Config\nimport { CrosshairDefaultConfig, CrosshairConfigInterface } from './config'\n\n// Styles\nimport * as s from './style'\n\nexport class Crosshair<Datum> extends XYComponentCore<Datum, CrosshairConfigInterface<Datum>> {\n static selectors = s\n clippable = true // Don't apply clipping path to this component. See XYContainer\n protected _defaultConfig = CrosshairDefaultConfig as CrosshairConfigInterface<Datum>\n public config: CrosshairConfigInterface<Datum> = this._defaultConfig\n container: Selection<SVGSVGElement, any, SVGSVGElement, any>\n line: Selection<SVGLineElement, any, SVGElement, any>\n x = 0\n datum: Datum\n datumIndex: number\n show = false\n private _animFrameId: number = null\n\n /** Tooltip component to be used by Crosshair if not provided by the config.\n * This property is supposed to be set externally by a container component like XYContainer. */\n public tooltip: Tooltip\n\n /** Accessors passed externally (e.g. from XYContainer) */\n private _accessors: CrosshairAccessors<Datum> = {\n x: undefined,\n y: undefined,\n yStacked: undefined,\n baseline: undefined,\n }\n\n public set accessors (accessors: CrosshairAccessors<Datum>) { this._accessors = accessors }\n public get accessors (): CrosshairAccessors<Datum> {\n const { config } = this\n\n const hasConfig = !!(config.x || config.y || config.yStacked)\n const x = hasConfig ? config.x : this._accessors.x\n const yAcc = hasConfig ? config.y : this._accessors.y\n const y = yAcc ? (isArray(yAcc) ? yAcc : [yAcc]) : undefined\n const yStacked = hasConfig ? config.yStacked : this._accessors.yStacked\n const baseline = config.baseline ?? this._accessors.baseline\n\n return { x, y, yStacked, baseline }\n }\n\n constructor (config?: CrosshairConfigInterface<Datum>) {\n super()\n if (config) this.setConfig(config)\n\n this.g.style('opacity', this.show ? 1 : 0)\n this.line = this.g.append('line')\n .attr('class', s.line)\n }\n\n setContainer (containerSvg: Selection<SVGSVGElement, unknown, SVGSVGElement, unknown>): void {\n // Set up mousemove event for Crosshair\n this.container = containerSvg\n this.container.on('mousemove.crosshair', this._onMouseMove.bind(this))\n this.container.on('mouseout.crosshair', this._onMouseOut.bind(this))\n }\n\n _render (customDuration?: number): void {\n const { config } = this\n if (config.snapToData && !this.datum) return\n const duration = isNumber(customDuration) ? customDuration : config.duration\n\n smartTransition(this.g, duration)\n .style('opacity', this.show ? 1 : 0)\n\n this.line\n .attr('y1', 0)\n .attr('y1', this._height)\n\n smartTransition(this.line, duration, easeLinear)\n .attr('x1', this.x)\n .attr('x2', this.x)\n\n const circleData = this.getCircleData()\n const circles = this.g\n .selectAll<SVGCircleElement, CrosshairCircle>('circle')\n .data(circleData, (d, i) => d.id ?? i)\n\n const circlesEnter = circles.enter()\n .append('circle')\n .attr('class', s.circle)\n .attr('r', 0)\n .attr('cx', this.x)\n .attr('cy', d => d.y)\n .style('fill', d => d.color)\n .style('stroke', d => d.strokeColor)\n .style('stroke-width', d => d.strokeWidth)\n\n smartTransition(circlesEnter.merge(circles), duration, easeLinear)\n .attr('cx', this.x)\n .attr('cy', d => d.y)\n .attr('r', 4)\n .style('opacity', d => d.opacity)\n .style('fill', d => d.color)\n .style('stroke', d => d.strokeColor)\n .style('stroke-width', d => d.strokeWidth)\n\n circles.exit().remove()\n }\n\n hide (): void {\n this._onMouseOut()\n }\n\n _onMouseMove (event: MouseEvent): void {\n const { config, datamodel, element } = this\n if (!this.accessors.x && datamodel.data?.length) {\n console.warn('Unovis | Crosshair: X accessor function has not been configured. Please check if it\\'s present in the configuration object')\n }\n const [x] = pointer(event, element)\n const xRange = this.xScale.range()\n\n if (config.snapToData) {\n if (!this.accessors.y && !this.accessors.yStacked && datamodel.data?.length) {\n console.warn('Unovis | Crosshair: Y accessors have not been configured. Please check if they\\'re present in the configuration object')\n }\n const scaleX = this.xScale\n const valueX = scaleX.invert(x) as number\n\n this.datum = getNearest(datamodel.data, valueX, this.accessors.x)\n this.datumIndex = datamodel.data.indexOf(this.datum)\n if (!this.datum) return\n\n this.x = clamp(Math.round(scaleX(getNumber(this.datum, this.accessors.x, this.datumIndex))), 0, this._width)\n\n // Show the crosshair only if it's in the chart range and not far from mouse pointer (if configured)\n this.show = (this.x >= 0) && (this.x <= this._width) && (!config.hideWhenFarFromPointer || (Math.abs(this.x - x) < config.hideWhenFarFromPointerDistance))\n } else {\n const tolerance = 2 // Show the crosshair when it is at least 2 pixels close to the chart area\n this.x = clamp(x, xRange[0], xRange[1])\n this.show = (x >= (xRange[0] - tolerance)) && (x <= (xRange[1] + tolerance))\n }\n\n window.cancelAnimationFrame(this._animFrameId)\n this._animFrameId = window.requestAnimationFrame(() => {\n this._render()\n })\n\n if (this.show) this._showTooltip(event)\n else this._hideTooltip()\n }\n\n _onMouseOut (): void {\n this.show = false\n\n window.cancelAnimationFrame(this._animFrameId)\n this._animFrameId = window.requestAnimationFrame(() => {\n this._render()\n })\n this._hideTooltip()\n }\n\n _showTooltip (event: MouseEvent): void {\n const { config } = this\n const tooltip = config.tooltip ?? this.tooltip\n if (!tooltip) return\n\n const container = tooltip.getContainer() || this.container.node()\n const [x, y] = tooltip.isContainerBody() ? [event.clientX, event.clientY] : pointer(event, container)\n const content = config.template(this.datum, this.xScale.invert(this.x))\n // Force set `followCursor` to `true` because we don't want Crosshair's tooltip to be hoverable\n tooltip.config.followCursor = true\n\n // Set tooltip placement based on Crosshair's position (left / right)\n if (!tooltip.config.horizontalPlacement || tooltip.config.horizontalPlacement === Position.Auto) {\n const xRelative = tooltip.isContainerBody() ? x - this.container.node().getBoundingClientRect().left : x\n tooltip.overrideHorizontalPlacement(xRelative > this._containerWidth / 2 ? Position.Left : Position.Right)\n }\n\n if (content) tooltip.show(content, { x, y })\n }\n\n _hideTooltip (): void {\n const { config } = this\n const tooltip = config.tooltip ?? this.tooltip\n tooltip?.hide()\n }\n\n // We don't want Crosshair to be be taken in to account in domain calculations\n getYDataExtent (): number[] {\n return [undefined, undefined]\n }\n\n private getCircleData (): CrosshairCircle[] {\n const { config, datamodel: { data } } = this\n\n if (isFunction(config.getCircles)) return config.getCircles(this.xScale.invert(this.x), data, this.yScale)\n\n if (config.snapToData && this.datum) {\n const yAccessors = this.accessors.y ?? []\n const yStackedAccessors = this.accessors.yStacked ?? []\n const baselineValue = getNumber(this.datum, this.accessors.baseline, this.datumIndex) || 0\n const stackedValues: CrosshairCircle[] = getStackedValues(this.datum, this.datumIndex, ...yStackedAccessors)\n .map((value, index, arr) => ({\n y: this.yScale(value + baselineValue),\n opacity: isNumber(getNumber(this.datum, yStackedAccessors[index])) ? 1 : 0,\n color: getColor(this.datum, config.color, index),\n strokeColor: config.strokeColor ? getColor(this.datum, config.strokeColor, index) : undefined,\n strokeWidth: config.strokeWidth ? getNumber(this.datum, config.strokeWidth, index) : undefined,\n }))\n\n const regularValues: CrosshairCircle[] = yAccessors\n .map((a, index) => {\n const value = getNumber(this.datum, a)\n return {\n y: this.yScale(value),\n opacity: isNumber(value) ? 1 : 0,\n color: getColor(this.datum, config.color, stackedValues.length + index),\n strokeColor: config.strokeColor ? getColor(this.datum, config.strokeColor, index) : undefined,\n strokeWidth: config.strokeWidth ? getNumber(this.datum, config.strokeWidth, index) : undefined,\n }\n })\n\n return stackedValues.concat(regularValues)\n }\n\n return []\n }\n}\n"],"names":["s.line","s.circle","s"],"mappings":"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"}
@@ -6,7 +6,7 @@ import { CoreDataModel } from '../../data-models/core.js';
6
6
  import { AxisType } from '../../components/axis/types.js';
7
7
  import { ScaleDimension } from '../../types/scale.js';
8
8
  import { Direction } from '../../types/direction.js';
9
- import { clamp, isEqual, clean, flatten } from '../../utils/data.js';
9
+ import { clamp, clean, flatten } from '../../utils/data.js';
10
10
  import { guid } from '../../utils/misc.js';
11
11
  import { XYContainerDefaultConfig } from './config.js';
12
12
 
@@ -67,7 +67,7 @@ class XYContainer extends ContainerCore {
67
67
  return clamp(this.containerHeight - margin.top - margin.bottom, 0, Number.POSITIVE_INFINITY);
68
68
  }
69
69
  setData(data, preventRender) {
70
- var _a, _b, _c, _d, _e;
70
+ var _a, _b, _c, _d;
71
71
  const { components, config } = this;
72
72
  if (!data)
73
73
  return;
@@ -78,14 +78,7 @@ class XYContainer extends ContainerCore {
78
78
  (_a = config.crosshair) === null || _a === void 0 ? void 0 : _a.setData(data);
79
79
  (_b = config.xAxis) === null || _b === void 0 ? void 0 : _b.setData(data);
80
80
  (_c = config.yAxis) === null || _c === void 0 ? void 0 : _c.setData(data);
81
- // Hide tooltip and crosshair if the data has changed
82
- // Important: We still want to do `setData` for the components above even if the data hasn't changed
83
- // because calling `updateContainer` may add new components and we need to pass them the data
84
- const hasDataUpdated = !isEqual(this.datamodel.data, data);
85
- if (hasDataUpdated) {
86
- (_d = config.tooltip) === null || _d === void 0 ? void 0 : _d.hide();
87
- (_e = config.crosshair) === null || _e === void 0 ? void 0 : _e.hide();
88
- }
81
+ (_d = config.tooltip) === null || _d === void 0 ? void 0 : _d.hide();
89
82
  if (!preventRender)
90
83
  this.render();
91
84
  }
@@ -163,12 +156,10 @@ class XYContainer extends ContainerCore {
163
156
  if (config.autoMargin) {
164
157
  this._setAutoMargin();
165
158
  }
166
- // Pass size and margin to the components
159
+ // Pass size to the components
167
160
  const components = clean([...this.components, config.xAxis, config.yAxis, config.crosshair, config.annotations]);
168
- const margin = this._getMargin();
169
161
  for (const c of components) {
170
162
  c.setSize(this.width, this.height, this.containerWidth, this.containerHeight);
171
- c.setContainerMargin(margin);
172
163
  }
173
164
  // Update Scales of all the components at once to calculate required paddings and sync them
174
165
  this._updateScales(...this.components, config.xAxis, config.yAxis, config.crosshair);
@@ -205,7 +196,6 @@ class XYContainer extends ContainerCore {
205
196
  const yStackedAccessors = this.components.filter(c => c.stacked).map(c => c.config.y);
206
197
  const baselineComponentConfig = (_b = this.components.find(c => c.config.baseline)) === null || _b === void 0 ? void 0 : _b.config;
207
198
  const baselineAccessor = baselineComponentConfig === null || baselineComponentConfig === void 0 ? void 0 : baselineComponentConfig.baseline;
208
- // Setting up fallback accessors for the crosshair to be used if they are not configured explicitly
209
199
  crosshair.accessors = {
210
200
  x: (_c = this.components[0]) === null || _c === void 0 ? void 0 : _c.config.x,
211
201
  y: flatten(yAccessors),
@@ -215,7 +205,7 @@ class XYContainer extends ContainerCore {
215
205
  crosshair.g.attr('transform', `translate(${margin.left},${margin.top})`)
216
206
  .style('clip-path', `url(#${this._clipPathId})`)
217
207
  .style('-webkit-clip-path', `url(#${this._clipPathId})`);
218
- crosshair.render();
208
+ crosshair.hide();
219
209
  }
220
210
  (_d = config.annotations) === null || _d === void 0 ? void 0 : _d.g.attr('transform', `translate(${margin.left},${margin.top})`);
221
211
  (_e = config.annotations) === null || _e === void 0 ? void 0 : _e.render();
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/containers/xy-container/index.ts"],"sourcesContent":["import { css } from '@emotion/css'\nimport { extent, merge as mergeArrays } from 'd3-array'\nimport { Selection } from 'd3-selection'\n\n// Global CSS variables (side effects import)\nimport 'styles/index'\n\n// Core\nimport { ContainerCore } from 'core/container'\nimport { XYComponentCore } from 'core/xy-component'\nimport { XYComponentConfigInterface } from 'core/xy-component/config'\n\n// Data Model\nimport { CoreDataModel } from 'data-models/core'\n\n// Types\nimport { Spacing } from 'types/spacing'\nimport { AxisType } from 'components/axis/types'\nimport { ScaleDimension } from 'types/scale'\nimport { Direction } from 'types/direction'\n\n// Utils\nimport { clamp, clean, flatten, isEqual } from 'utils/data'\nimport { guid } from 'utils/misc'\n\n// Config\nimport { XYContainerDefaultConfig, XYContainerConfigInterface } from './config'\nimport {\n AreaConfigInterface,\n BrushConfigInterface,\n LineConfigInterface,\n ScatterConfigInterface,\n StackedBarConfigInterface,\n TimelineConfigInterface,\n} from '../../components'\n\nexport type XYConfigInterface<Datum> = XYComponentConfigInterface<Datum>\n| StackedBarConfigInterface<Datum>\n| LineConfigInterface<Datum>\n| ScatterConfigInterface<Datum>\n| BrushConfigInterface<Datum>\n| TimelineConfigInterface<Datum>\n| AreaConfigInterface<Datum>\n\nexport class XYContainer<Datum> extends ContainerCore {\n protected _defaultConfig = XYContainerDefaultConfig as XYContainerConfigInterface<Datum>\n protected _svgDefs: Selection<SVGDefsElement, unknown, null, undefined>\n public datamodel: CoreDataModel<Datum[]> = new CoreDataModel()\n public config: XYContainerConfigInterface<Datum> = this._defaultConfig\n private _clipPath: Selection<SVGClipPathElement, unknown, null, undefined>\n private _clipPathId = guid()\n private _axisMargin: Spacing = { top: 0, bottom: 0, left: 0, right: 0 }\n private _firstRender = true\n\n constructor (element: HTMLElement, config?: XYContainerConfigInterface<Datum>, data?: Datum[]) {\n super(element)\n\n this._clipPath = this.svg.append('clipPath')\n .attr('id', this._clipPathId)\n this._clipPath.append('rect')\n\n // When the base tag is specified on the HTML head,\n // Safari fails to find the corresponding filter URL.\n // We have to provide tull url in order to fix that\n const highlightFilterId = 'saturate'\n const baseUrl = window.location.href.replace(window.location.hash, '')\n this.svg.attr('class', css`\n --highlight-filter-id: url(${baseUrl}#${highlightFilterId}); // defining a css variable\n `)\n\n this._svgDefs.append('filter')\n .attr('id', highlightFilterId)\n .attr('filterUnits', 'objectBoundingBox')\n .html('<feColorMatrix type=\"saturate\" in=\"SourceGraphic\" values=\"1.35\"/>')\n\n if (config) {\n this.updateContainer(config, true)\n }\n\n if (data) {\n this.setData(data, true)\n }\n\n // Render if there are axes or components with data\n if (\n this.config.xAxis ||\n this.config.yAxis ||\n this.components?.some(c => c.datamodel.data)\n ) {\n this.render()\n }\n\n // Force re-render axes when fonts are loaded\n (document as any).fonts?.ready.then(() => {\n if (!this._firstRender) this._renderAxes(0)\n })\n }\n\n get components (): XYComponentCore<Datum>[] {\n return this.config.components\n }\n\n // Overriding ContainerCore default get width method to work with axis auto margin\n get width (): number {\n const margin = this._getMargin()\n return clamp(this.containerWidth - margin.left - margin.right, 0, Number.POSITIVE_INFINITY)\n }\n\n // Overriding ContainerCore default get height method to work with axis auto margin\n get height (): number {\n const margin = this._getMargin()\n\n return clamp(this.containerHeight - margin.top - margin.bottom, 0, Number.POSITIVE_INFINITY)\n }\n\n public setData (data: Datum[], preventRender?: boolean): void {\n const { components, config } = this\n if (!data) return\n\n this.datamodel.data = data\n\n components.forEach((c) => {\n c.setData(data)\n })\n\n config.crosshair?.setData(data)\n config.xAxis?.setData(data)\n config.yAxis?.setData(data)\n\n // Hide tooltip and crosshair if the data has changed\n // Important: We still want to do `setData` for the components above even if the data hasn't changed\n // because calling `updateContainer` may add new components and we need to pass them the data\n const hasDataUpdated = !isEqual(this.datamodel.data, data)\n if (hasDataUpdated) {\n config.tooltip?.hide()\n config.crosshair?.hide()\n }\n\n if (!preventRender) this.render()\n }\n\n public updateContainer (containerConfig: XYContainerConfigInterface<Datum>, preventRender?: boolean): void {\n super.updateContainer(containerConfig)\n this._removeAllChildren()\n\n // If there were any new components added we need to pass them data\n this.setData(this.datamodel.data, true)\n\n // Set up the axes\n if (containerConfig.xAxis) {\n this.config.xAxis.config.type = AxisType.X\n this.element.appendChild(containerConfig.xAxis.element)\n }\n if (containerConfig.yAxis) {\n this.config.yAxis.config.type = AxisType.Y\n this.element.appendChild(containerConfig.yAxis.element)\n }\n\n // Re-insert elements to the DOM\n for (const c of this.components) {\n this.element.appendChild(c.element)\n }\n\n // Set up the tooltip\n const tooltip = containerConfig.tooltip\n if (tooltip) {\n if (!tooltip.hasContainer()) tooltip.setContainer(this._container)\n tooltip.setComponents(this.components)\n }\n\n // Set up the crosshair\n const crosshair = containerConfig.crosshair\n if (crosshair) {\n crosshair.setContainer(this.svg)\n crosshair.tooltip = tooltip\n\n this.element.appendChild(crosshair.element)\n }\n\n // Set up annotations\n const annotations = containerConfig.annotations\n if (annotations) {\n this.element.appendChild(annotations.element)\n }\n\n // Clipping path\n this.element.appendChild(this._clipPath.node())\n\n // Defs\n this.element.appendChild(this._svgDefs.node())\n this.element.appendChild(this._svgDefsExternal.node())\n\n // Rendering\n if (!preventRender) this.render()\n }\n\n public updateComponents (componentConfigs: XYConfigInterface<Datum>[], preventRender?: boolean): void {\n const { config } = this\n\n this.components.forEach((c, i) => {\n const componentConfig = componentConfigs[i]\n if (componentConfig) {\n c.setConfig(componentConfigs[i])\n }\n })\n\n this._updateScales(...this.components, config.xAxis, config.yAxis, config.crosshair)\n if (!preventRender) this.render()\n }\n\n public update (containerConfig: XYContainerConfigInterface<Datum>, componentConfigs?: XYComponentConfigInterface<Datum>[], data?: Datum[]): void {\n if (data) this.datamodel.data = data // Just updating the data model because the `updateContainer` method has the `setData` step inside\n if (containerConfig) this.updateContainer(containerConfig, true)\n if (componentConfigs) this.updateComponents(componentConfigs, true)\n this.render()\n }\n\n protected _preRender (): void {\n const { config } = this\n super._preRender()\n\n // Calculate extra margin required to fit the axes\n if (config.autoMargin) {\n this._setAutoMargin()\n }\n\n // Pass size and margin to the components\n const components = clean([...this.components, config.xAxis, config.yAxis, config.crosshair, config.annotations])\n const margin = this._getMargin()\n for (const c of components) {\n c.setSize(this.width, this.height, this.containerWidth, this.containerHeight)\n c.setContainerMargin(margin)\n }\n\n // Update Scales of all the components at once to calculate required paddings and sync them\n this._updateScales(...this.components, config.xAxis, config.yAxis, config.crosshair)\n }\n\n protected _render (customDuration?: number): void {\n const { config } = this\n super._render()\n\n // Get chart total margin after auto margin calculations\n const margin = this._getMargin()\n\n // Render components\n for (const c of this.components) {\n c.g.attr('transform', `translate(${margin.left},${margin.top})`)\n .style('clip-path', c.clippable ? `url(#${this._clipPathId})` : null)\n .style('-webkit-clip-path', c.clippable ? `url(#${this._clipPathId})` : null)\n\n c.render(customDuration)\n }\n\n this._renderAxes(this._firstRender ? 0 : customDuration)\n\n // Clip Rect\n // Extending the clipping path to allow small overflow (e.g. Line will looks better that way when it touches the edges)\n const clipPathExtension = config.clipPathExtend\n this._clipPath.select('rect')\n .attr('x', -clipPathExtension)\n .attr('y', -clipPathExtension)\n .attr('width', this.width + 2 * clipPathExtension)\n .attr('height', this.height + 2 * clipPathExtension)\n\n // Tooltip\n config.tooltip?.update() // Re-bind events\n\n // Crosshair\n const crosshair = config.crosshair\n if (crosshair) {\n // Pass accessors\n const yAccessors = this.components.filter(c => !c.stacked).map(c => c.config.y)\n const yStackedAccessors = this.components.filter(c => c.stacked).map(c => c.config.y)\n const baselineComponentConfig = this.components.find(c => (c.config as AreaConfigInterface<Datum>).baseline)?.config as AreaConfigInterface<Datum>\n const baselineAccessor = baselineComponentConfig?.baseline\n\n // Setting up fallback accessors for the crosshair to be used if they are not configured explicitly\n crosshair.accessors = {\n x: this.components[0]?.config.x,\n y: flatten(yAccessors),\n yStacked: flatten(yStackedAccessors),\n baseline: baselineAccessor,\n }\n\n crosshair.g.attr('transform', `translate(${margin.left},${margin.top})`)\n .style('clip-path', `url(#${this._clipPathId})`)\n .style('-webkit-clip-path', `url(#${this._clipPathId})`)\n crosshair.render()\n }\n\n config.annotations?.g.attr('transform', `translate(${margin.left},${margin.top})`)\n config.annotations?.render()\n\n this._firstRender = false\n }\n\n private _updateScales<T extends XYComponentCore<Datum>> (...components: T[]): void {\n const c = clean(components || this.components)\n this._setScales(...c)\n this._updateScalesDomain(...c)\n this._updateScalesRange(...c)\n }\n\n private _setScales<T extends XYComponentCore<Datum>> (...components: T[]): void {\n const { config } = this\n if (!components) return\n\n // Set the X and Y scales\n if (config.xScale) components.forEach(c => c.setScale(ScaleDimension.X, config.xScale))\n if (config.yScale) components.forEach(c => c.setScale(ScaleDimension.Y, config.yScale))\n }\n\n private _updateScalesDomain<T extends XYComponentCore<Datum>> (...components: T[]): void {\n const { config } = this\n if (!components) return\n\n const componentsWithDomain = components.filter(c => !c.config.excludeFromDomainCalculation)\n\n // Loop over all the dimensions\n Object.values(ScaleDimension).forEach((dimension: ScaleDimension) => {\n const [min, max] = extent(\n mergeArrays(\n componentsWithDomain.map(c => c.getDataExtent(dimension, config.scaleByDomain))\n ) as number[]\n ) // Components with undefined dimension accessors will return [undefined, undefined] but d3.extent will take care of that\n\n const configuredDomain = dimension === ScaleDimension.Y ? config.yDomain : config.xDomain\n const configuredDomainMinConstraint = dimension === ScaleDimension.Y ? config.yDomainMinConstraint : config.xDomainMinConstraint\n const configuredDomainMaxConstraint = dimension === ScaleDimension.Y ? config.yDomainMaxConstraint : config.xDomainMaxConstraint\n const domainMin = configuredDomain?.[0] ?? min ?? 0\n const domainMax = configuredDomain?.[1] ?? max ?? 1\n const domain = [\n clamp(domainMin, configuredDomainMinConstraint?.[0] ?? Number.NEGATIVE_INFINITY, configuredDomainMinConstraint?.[1] ?? Number.POSITIVE_INFINITY),\n clamp(domainMax, configuredDomainMaxConstraint?.[0] ?? Number.NEGATIVE_INFINITY, configuredDomainMaxConstraint?.[1] ?? Number.POSITIVE_INFINITY),\n ]\n\n // Extend the X and Y domains if they're empty and `preventEmptyDomain` was explicitly set to `true`\n // or just the X domain if there is no data provided and `preventEmptyDomain` set to `null`\n if (domain[0] === domain[1]) {\n const hasDataProvided = componentsWithDomain.some(c => c.datamodel.data?.length > 0)\n if (config.preventEmptyDomain || (config.preventEmptyDomain === null && (!hasDataProvided || dimension === ScaleDimension.Y))) {\n domain[1] = domain[0] + 1\n }\n }\n\n components.forEach(c => c.setScaleDomain(dimension, domain))\n })\n }\n\n private _updateScalesRange<T extends XYComponentCore<Datum>> (...components: T[]): void {\n const { config } = this\n if (!components) return\n\n // Set initial scale range\n const isYDirectionSouth = config.yDirection === Direction.South\n const xRange: [number, number] = [config.padding.left ?? 0, this.width - (config.padding.right ?? 0)]\n const yRange: [number, number] = [this.height - (config.padding.bottom ?? 0), config.padding.top ?? 0]\n if (isYDirectionSouth) yRange.reverse()\n\n for (const c of components) {\n c.setSize(this.width, this.height, this.containerWidth, this.containerHeight)\n c.setScaleRange(ScaleDimension.X, config.xRange ?? xRange)\n c.setScaleRange(ScaleDimension.Y, config.yRange ?? yRange)\n }\n\n // Get and combine bleed\n const bleed = components.map(c => c.bleed).reduce((bleed, b) => {\n for (const key of Object.keys(bleed)) {\n const k = key as keyof Spacing\n if (bleed[k] < b[k]) bleed[k] = b[k]\n }\n return bleed\n }, { top: 0, bottom: 0, left: 0, right: 0 })\n\n // Update scale range\n for (const c of components) {\n c.setScaleRange(ScaleDimension.X, [xRange[0] + bleed.left, xRange[1] - bleed.right])\n c.setScaleRange(\n ScaleDimension.Y,\n isYDirectionSouth\n ? [yRange[0] + bleed.top, yRange[1] - bleed.bottom] // if Y axis is directed downwards\n : [yRange[0] - bleed.bottom, yRange[1] + bleed.top] // if Y axis is directed upwards\n )\n }\n }\n\n private _renderAxes (duration: number): void {\n const { config: { xAxis, yAxis } } = this\n const margin = this._getMargin()\n\n const axes = clean([xAxis, yAxis])\n axes.forEach(axis => {\n const offset = axis.getOffset(margin)\n axis.g.attr('transform', `translate(${offset.left},${offset.top})`)\n axis.render(duration)\n })\n }\n\n private _setAutoMargin (): void {\n const { config: { xAxis, yAxis } } = this\n\n // At first we need to set the domain to the scales\n const components = clean([...this.components, xAxis, yAxis])\n this._setScales(...components)\n this._updateScalesDomain(...components)\n\n // Calculate margin required by the axes\n // We do two iterations on the first render, because the amount and size of ticks can change\n // after new margin are calculated and applied (axes dimensions will change).\n // That's needed for correct label placement.\n const numIterations = this._firstRender ? 2 : 1\n for (let i = 0; i < numIterations; i += 1) {\n const axisMargin: Spacing = { top: 0, bottom: 0, left: 0, right: 0 }\n this._updateScalesRange(...components)\n const axes = clean([xAxis, yAxis])\n axes.forEach(axis => {\n axis.preRender()\n\n const m = axis.getRequiredMargin()\n if (axisMargin.top < m.top) axisMargin.top = m.top\n if (axisMargin.bottom < m.bottom) axisMargin.bottom = m.bottom\n if (axisMargin.left < m.left) axisMargin.left = m.left\n if (axisMargin.right < m.right) axisMargin.right = m.right\n })\n this._axisMargin = axisMargin\n }\n }\n\n private _getMargin (): Spacing {\n const { config: { margin } } = this\n\n return {\n top: margin.top + this._axisMargin.top,\n bottom: margin.bottom + this._axisMargin.bottom,\n left: margin.left + this._axisMargin.left,\n right: margin.right + this._axisMargin.right,\n }\n }\n\n public destroy (): void {\n const { components, config: { tooltip, crosshair, annotations, xAxis, yAxis } } = this\n super.destroy()\n\n for (const c of components) c?.destroy()\n tooltip?.destroy()\n crosshair?.destroy()\n annotations?.destroy()\n xAxis?.destroy()\n yAxis?.destroy()\n }\n}\n"],"names":["mergeArrays"],"mappings":";;;;;;;;;;;;AA4CM,MAAO,WAAmB,SAAQ,aAAa,CAAA;AAUnD,IAAA,WAAA,CAAa,OAAoB,EAAE,MAA0C,EAAE,IAAc,EAAA;;QAC3F,KAAK,CAAC,OAAO,CAAC,CAAA;QAVN,IAAc,CAAA,cAAA,GAAG,wBAA6D,CAAA;AAEjF,QAAA,IAAA,CAAA,SAAS,GAA2B,IAAI,aAAa,EAAE,CAAA;AACvD,QAAA,IAAA,CAAA,MAAM,GAAsC,IAAI,CAAC,cAAc,CAAA;QAE9D,IAAW,CAAA,WAAA,GAAG,IAAI,EAAE,CAAA;AACpB,QAAA,IAAA,CAAA,WAAW,GAAY,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAA;QAC/D,IAAY,CAAA,YAAA,GAAG,IAAI,CAAA;QAKzB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC;AACzC,aAAA,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAA;AAC/B,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;;;;QAK7B,MAAM,iBAAiB,GAAG,UAAU,CAAA;AACpC,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;QACtE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAA,CAAA;AACK,iCAAA,EAAA,OAAO,IAAI,iBAAiB,CAAA;AAC1D,IAAA,CAAA,CAAC,CAAA;AAEF,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC;AAC3B,aAAA,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC;AAC7B,aAAA,IAAI,CAAC,aAAa,EAAE,mBAAmB,CAAC;aACxC,IAAI,CAAC,mEAAmE,CAAC,CAAA;AAE5E,QAAA,IAAI,MAAM,EAAE;AACV,YAAA,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;AACnC,SAAA;AAED,QAAA,IAAI,IAAI,EAAE;AACR,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;AACzB,SAAA;;AAGD,QAAA,IACE,IAAI,CAAC,MAAM,CAAC,KAAK;YACjB,IAAI,CAAC,MAAM,CAAC,KAAK;AACjB,aAAA,CAAA,EAAA,GAAA,IAAI,CAAC,UAAU,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA,EAC5C;YACA,IAAI,CAAC,MAAM,EAAE,CAAA;AACd,SAAA;;QAGD,CAAC,EAAA,GAAA,QAAgB,CAAC,KAAK,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,KAAK,CAAC,IAAI,CAAC,MAAK;YACvC,IAAI,CAAC,IAAI,CAAC,YAAY;AAAE,gBAAA,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA;AAC7C,SAAC,CAAC,CAAA;KACH;AAED,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAA;KAC9B;;AAGD,IAAA,IAAI,KAAK,GAAA;AACP,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAA;QAChC,OAAO,KAAK,CAAC,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAA;KAC5F;;AAGD,IAAA,IAAI,MAAM,GAAA;AACR,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAA;QAEhC,OAAO,KAAK,CAAC,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAA;KAC7F;IAEM,OAAO,CAAE,IAAa,EAAE,aAAuB,EAAA;;AACpD,QAAA,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;AACnC,QAAA,IAAI,CAAC,IAAI;YAAE,OAAM;AAEjB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,GAAG,IAAI,CAAA;AAE1B,QAAA,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,KAAI;AACvB,YAAA,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;AACjB,SAAC,CAAC,CAAA;QAEF,CAAA,EAAA,GAAA,MAAM,CAAC,SAAS,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,OAAO,CAAC,IAAI,CAAC,CAAA;QAC/B,CAAA,EAAA,GAAA,MAAM,CAAC,KAAK,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,OAAO,CAAC,IAAI,CAAC,CAAA;QAC3B,CAAA,EAAA,GAAA,MAAM,CAAC,KAAK,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,OAAO,CAAC,IAAI,CAAC,CAAA;;;;AAK3B,QAAA,MAAM,cAAc,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;AAC1D,QAAA,IAAI,cAAc,EAAE;AAClB,YAAA,CAAA,EAAA,GAAA,MAAM,CAAC,OAAO,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAI,EAAE,CAAA;AACtB,YAAA,CAAA,EAAA,GAAA,MAAM,CAAC,SAAS,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAI,EAAE,CAAA;AACzB,SAAA;AAED,QAAA,IAAI,CAAC,aAAa;YAAE,IAAI,CAAC,MAAM,EAAE,CAAA;KAClC;IAEM,eAAe,CAAE,eAAkD,EAAE,aAAuB,EAAA;AACjG,QAAA,KAAK,CAAC,eAAe,CAAC,eAAe,CAAC,CAAA;QACtC,IAAI,CAAC,kBAAkB,EAAE,CAAA;;QAGzB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;;QAGvC,IAAI,eAAe,CAAC,KAAK,EAAE;AACzB,YAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAA;YAC1C,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;AACxD,SAAA;QACD,IAAI,eAAe,CAAC,KAAK,EAAE;AACzB,YAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAA;YAC1C,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;AACxD,SAAA;;AAGD,QAAA,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE;YAC/B,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;AACpC,SAAA;;AAGD,QAAA,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,CAAA;AACvC,QAAA,IAAI,OAAO,EAAE;AACX,YAAA,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;AAAE,gBAAA,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;AAClE,YAAA,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;AACvC,SAAA;;AAGD,QAAA,MAAM,SAAS,GAAG,eAAe,CAAC,SAAS,CAAA;AAC3C,QAAA,IAAI,SAAS,EAAE;AACb,YAAA,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAChC,YAAA,SAAS,CAAC,OAAO,GAAG,OAAO,CAAA;YAE3B,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;AAC5C,SAAA;;AAGD,QAAA,MAAM,WAAW,GAAG,eAAe,CAAC,WAAW,CAAA;AAC/C,QAAA,IAAI,WAAW,EAAE;YACf,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;AAC9C,SAAA;;AAGD,QAAA,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAA;;AAG/C,QAAA,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;AAC9C,QAAA,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAA;;AAGtD,QAAA,IAAI,CAAC,aAAa;YAAE,IAAI,CAAC,MAAM,EAAE,CAAA;KAClC;IAEM,gBAAgB,CAAE,gBAA4C,EAAE,aAAuB,EAAA;AAC5F,QAAA,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;QAEvB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;AAC/B,YAAA,MAAM,eAAe,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAA;AAC3C,YAAA,IAAI,eAAe,EAAE;gBACnB,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAA;AACjC,aAAA;AACH,SAAC,CAAC,CAAA;QAEF,IAAI,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,CAAA;AACpF,QAAA,IAAI,CAAC,aAAa;YAAE,IAAI,CAAC,MAAM,EAAE,CAAA;KAClC;AAEM,IAAA,MAAM,CAAE,eAAkD,EAAE,gBAAsD,EAAE,IAAc,EAAA;AACvI,QAAA,IAAI,IAAI;YAAE,IAAI,CAAC,SAAS,CAAC,IAAI,GAAG,IAAI,CAAA;AACpC,QAAA,IAAI,eAAe;AAAE,YAAA,IAAI,CAAC,eAAe,CAAC,eAAe,EAAE,IAAI,CAAC,CAAA;AAChE,QAAA,IAAI,gBAAgB;AAAE,YAAA,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAA;QACnE,IAAI,CAAC,MAAM,EAAE,CAAA;KACd;IAES,UAAU,GAAA;AAClB,QAAA,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;QACvB,KAAK,CAAC,UAAU,EAAE,CAAA;;QAGlB,IAAI,MAAM,CAAC,UAAU,EAAE;YACrB,IAAI,CAAC,cAAc,EAAE,CAAA;AACtB,SAAA;;QAGD,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAA;AAChH,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAA;AAChC,QAAA,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE;AAC1B,YAAA,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,eAAe,CAAC,CAAA;AAC7E,YAAA,CAAC,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAA;AAC7B,SAAA;;QAGD,IAAI,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,CAAA;KACrF;AAES,IAAA,OAAO,CAAE,cAAuB,EAAA;;AACxC,QAAA,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;QACvB,KAAK,CAAC,OAAO,EAAE,CAAA;;AAGf,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAA;;AAGhC,QAAA,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE;AAC/B,YAAA,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAA,UAAA,EAAa,MAAM,CAAC,IAAI,CAAI,CAAA,EAAA,MAAM,CAAC,GAAG,GAAG,CAAC;AAC7D,iBAAA,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,GAAG,CAAQ,KAAA,EAAA,IAAI,CAAC,WAAW,CAAA,CAAA,CAAG,GAAG,IAAI,CAAC;AACpE,iBAAA,KAAK,CAAC,mBAAmB,EAAE,CAAC,CAAC,SAAS,GAAG,QAAQ,IAAI,CAAC,WAAW,CAAG,CAAA,CAAA,GAAG,IAAI,CAAC,CAAA;AAE/E,YAAA,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAA;AACzB,SAAA;AAED,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,GAAG,cAAc,CAAC,CAAA;;;AAIxD,QAAA,MAAM,iBAAiB,GAAG,MAAM,CAAC,cAAc,CAAA;AAC/C,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC;AAC1B,aAAA,IAAI,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC;AAC7B,aAAA,IAAI,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC;aAC7B,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,iBAAiB,CAAC;aACjD,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,iBAAiB,CAAC,CAAA;;QAGtD,CAAA,EAAA,GAAA,MAAM,CAAC,OAAO,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,MAAM,EAAE,CAAA;;AAGxB,QAAA,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAA;AAClC,QAAA,IAAI,SAAS,EAAE;;AAEb,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;AAC/E,YAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;YACrF,MAAM,uBAAuB,GAAG,CAAA,EAAA,GAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAK,CAAC,CAAC,MAAqC,CAAC,QAAQ,CAAC,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,MAAoC,CAAA;YAClJ,MAAM,gBAAgB,GAAG,uBAAuB,KAAA,IAAA,IAAvB,uBAAuB,KAAvB,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,uBAAuB,CAAE,QAAQ,CAAA;;YAG1D,SAAS,CAAC,SAAS,GAAG;gBACpB,CAAC,EAAE,CAAA,EAAA,GAAA,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,MAAM,CAAC,CAAC;AAC/B,gBAAA,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC;AACtB,gBAAA,QAAQ,EAAE,OAAO,CAAC,iBAAiB,CAAC;AACpC,gBAAA,QAAQ,EAAE,gBAAgB;aAC3B,CAAA;AAED,YAAA,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAA,UAAA,EAAa,MAAM,CAAC,IAAI,CAAI,CAAA,EAAA,MAAM,CAAC,GAAG,GAAG,CAAC;iBACrE,KAAK,CAAC,WAAW,EAAE,CAAA,KAAA,EAAQ,IAAI,CAAC,WAAW,GAAG,CAAC;iBAC/C,KAAK,CAAC,mBAAmB,EAAE,CAAA,KAAA,EAAQ,IAAI,CAAC,WAAW,CAAG,CAAA,CAAA,CAAC,CAAA;YAC1D,SAAS,CAAC,MAAM,EAAE,CAAA;AACnB,SAAA;QAED,CAAA,EAAA,GAAA,MAAM,CAAC,WAAW,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,MAAM,CAAC,IAAI,CAAI,CAAA,EAAA,MAAM,CAAC,GAAG,CAAA,CAAA,CAAG,CAAC,CAAA;AAClF,QAAA,CAAA,EAAA,GAAA,MAAM,CAAC,WAAW,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,MAAM,EAAE,CAAA;AAE5B,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK,CAAA;KAC1B;IAEO,aAAa,CAAoC,GAAG,UAAe,EAAA;QACzE,MAAM,CAAC,GAAG,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,CAAA;AAC9C,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAA;AACrB,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAA;AAC9B,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAA;KAC9B;IAEO,UAAU,CAAoC,GAAG,UAAe,EAAA;AACtE,QAAA,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;AACvB,QAAA,IAAI,CAAC,UAAU;YAAE,OAAM;;QAGvB,IAAI,MAAM,CAAC,MAAM;YAAE,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;QACvF,IAAI,MAAM,CAAC,MAAM;YAAE,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;KACxF;IAEO,mBAAmB,CAAoC,GAAG,UAAe,EAAA;AAC/E,QAAA,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;AACvB,QAAA,IAAI,CAAC,UAAU;YAAE,OAAM;AAEvB,QAAA,MAAM,oBAAoB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAA;;QAG3F,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,SAAyB,KAAI;;AAClE,YAAA,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,MAAM,CACvBA,KAAW,CACT,oBAAoB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC,CACpE,CACd,CAAA;AAED,YAAA,MAAM,gBAAgB,GAAG,SAAS,KAAK,cAAc,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAA;AACzF,YAAA,MAAM,6BAA6B,GAAG,SAAS,KAAK,cAAc,CAAC,CAAC,GAAG,MAAM,CAAC,oBAAoB,GAAG,MAAM,CAAC,oBAAoB,CAAA;AAChI,YAAA,MAAM,6BAA6B,GAAG,SAAS,KAAK,cAAc,CAAC,CAAC,GAAG,MAAM,CAAC,oBAAoB,GAAG,MAAM,CAAC,oBAAoB,CAAA;AAChI,YAAA,MAAM,SAAS,GAAG,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,gBAAgB,aAAhB,gBAAgB,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAhB,gBAAgB,CAAG,CAAC,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,GAAG,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,CAAC,CAAA;AACnD,YAAA,MAAM,SAAS,GAAG,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,gBAAgB,aAAhB,gBAAgB,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAhB,gBAAgB,CAAG,CAAC,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,GAAG,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,CAAC,CAAA;AACnD,YAAA,MAAM,MAAM,GAAG;AACb,gBAAA,KAAK,CAAC,SAAS,EAAE,CAAA,EAAA,GAAA,6BAA6B,KAAA,IAAA,IAA7B,6BAA6B,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAA7B,6BAA6B,CAAG,CAAC,CAAC,mCAAI,MAAM,CAAC,iBAAiB,EAAE,CAAA,EAAA,GAAA,6BAA6B,KAA7B,IAAA,IAAA,6BAA6B,KAA7B,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,6BAA6B,CAAG,CAAC,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,MAAM,CAAC,iBAAiB,CAAC;AAChJ,gBAAA,KAAK,CAAC,SAAS,EAAE,CAAA,EAAA,GAAA,6BAA6B,KAAA,IAAA,IAA7B,6BAA6B,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAA7B,6BAA6B,CAAG,CAAC,CAAC,mCAAI,MAAM,CAAC,iBAAiB,EAAE,CAAA,EAAA,GAAA,6BAA6B,KAA7B,IAAA,IAAA,6BAA6B,KAA7B,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,6BAA6B,CAAG,CAAC,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,MAAM,CAAC,iBAAiB,CAAC;aACjJ,CAAA;;;YAID,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE;gBAC3B,MAAM,eAAe,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC,IAAG,EAAA,IAAA,EAAA,CAAA,CAAC,OAAA,CAAA,MAAA,CAAC,CAAC,SAAS,CAAC,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,MAAM,IAAG,CAAC,CAAA,EAAA,CAAC,CAAA;gBACpF,IAAI,MAAM,CAAC,kBAAkB,KAAK,MAAM,CAAC,kBAAkB,KAAK,IAAI,KAAK,CAAC,eAAe,IAAI,SAAS,KAAK,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE;oBAC7H,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;AAC1B,iBAAA;AACF,aAAA;AAED,YAAA,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAA;AAC9D,SAAC,CAAC,CAAA;KACH;IAEO,kBAAkB,CAAoC,GAAG,UAAe,EAAA;;AAC9E,QAAA,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;AACvB,QAAA,IAAI,CAAC,UAAU;YAAE,OAAM;;QAGvB,MAAM,iBAAiB,GAAG,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,KAAK,CAAA;QAC/D,MAAM,MAAM,GAAqB,CAAC,CAAA,EAAA,GAAA,MAAM,CAAC,OAAO,CAAC,IAAI,MAAI,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAA,CAAC,EAAE,IAAI,CAAC,KAAK,IAAI,CAAA,EAAA,GAAA,MAAM,CAAC,OAAO,CAAC,KAAK,MAAI,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAA,CAAC,CAAC,CAAC,CAAA;QACrG,MAAM,MAAM,GAAqB,CAAC,IAAI,CAAC,MAAM,IAAI,CAAA,EAAA,GAAA,MAAM,CAAC,OAAO,CAAC,MAAM,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,CAAC,CAAC,EAAE,CAAA,EAAA,GAAA,MAAM,CAAC,OAAO,CAAC,GAAG,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,CAAC,CAAC,CAAA;AACtG,QAAA,IAAI,iBAAiB;YAAE,MAAM,CAAC,OAAO,EAAE,CAAA;AAEvC,QAAA,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE;AAC1B,YAAA,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,eAAe,CAAC,CAAA;AAC7E,YAAA,CAAC,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,EAAE,CAAA,EAAA,GAAA,MAAM,CAAC,MAAM,MAAI,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAA,MAAM,CAAC,CAAA;AAC1D,YAAA,CAAC,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,EAAE,CAAA,EAAA,GAAA,MAAM,CAAC,MAAM,MAAI,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAA,MAAM,CAAC,CAAA;AAC3D,SAAA;;QAGD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC,KAAI;YAC7D,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;gBACpC,MAAM,CAAC,GAAG,GAAoB,CAAA;gBAC9B,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;AACrC,aAAA;AACD,YAAA,OAAO,KAAK,CAAA;AACd,SAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;;AAG5C,QAAA,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE;YAC1B,CAAC,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAA;AACpF,YAAA,CAAC,CAAC,aAAa,CACb,cAAc,CAAC,CAAC,EAChB,iBAAiB;kBACb,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;kBACjD,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC;aACtD,CAAA;AACF,SAAA;KACF;AAEO,IAAA,WAAW,CAAE,QAAgB,EAAA;QACnC,MAAM,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,GAAG,IAAI,CAAA;AACzC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAA;QAEhC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAA;AAClC,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,IAAG;YAClB,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;AACrC,YAAA,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAA,UAAA,EAAa,MAAM,CAAC,IAAI,CAAI,CAAA,EAAA,MAAM,CAAC,GAAG,CAAA,CAAA,CAAG,CAAC,CAAA;AACnE,YAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;AACvB,SAAC,CAAC,CAAA;KACH;IAEO,cAAc,GAAA;QACpB,MAAM,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,GAAG,IAAI,CAAA;;AAGzC,QAAA,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAA;AAC5D,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC,CAAA;AAC9B,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,UAAU,CAAC,CAAA;;;;;AAMvC,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,GAAG,CAAC,GAAG,CAAC,CAAA;AAC/C,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,IAAI,CAAC,EAAE;AACzC,YAAA,MAAM,UAAU,GAAY,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAA;AACpE,YAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,UAAU,CAAC,CAAA;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAA;AAClC,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,IAAG;gBAClB,IAAI,CAAC,SAAS,EAAE,CAAA;AAEhB,gBAAA,MAAM,CAAC,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAA;AAClC,gBAAA,IAAI,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG;AAAE,oBAAA,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAA;AAClD,gBAAA,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM;AAAE,oBAAA,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAA;AAC9D,gBAAA,IAAI,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI;AAAE,oBAAA,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAA;AACtD,gBAAA,IAAI,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK;AAAE,oBAAA,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAA;AAC5D,aAAC,CAAC,CAAA;AACF,YAAA,IAAI,CAAC,WAAW,GAAG,UAAU,CAAA;AAC9B,SAAA;KACF;IAEO,UAAU,GAAA;QAChB,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,IAAI,CAAA;QAEnC,OAAO;YACL,GAAG,EAAE,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG;YACtC,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM;YAC/C,IAAI,EAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI;YACzC,KAAK,EAAE,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK;SAC7C,CAAA;KACF;IAEM,OAAO,GAAA;AACZ,QAAA,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,GAAG,IAAI,CAAA;QACtF,KAAK,CAAC,OAAO,EAAE,CAAA;QAEf,KAAK,MAAM,CAAC,IAAI,UAAU;AAAE,YAAA,CAAC,aAAD,CAAC,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAD,CAAC,CAAE,OAAO,EAAE,CAAA;AACxC,QAAA,OAAO,aAAP,OAAO,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAP,OAAO,CAAE,OAAO,EAAE,CAAA;AAClB,QAAA,SAAS,aAAT,SAAS,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAT,SAAS,CAAE,OAAO,EAAE,CAAA;AACpB,QAAA,WAAW,aAAX,WAAW,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAX,WAAW,CAAE,OAAO,EAAE,CAAA;AACtB,QAAA,KAAK,aAAL,KAAK,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAL,KAAK,CAAE,OAAO,EAAE,CAAA;AAChB,QAAA,KAAK,aAAL,KAAK,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAL,KAAK,CAAE,OAAO,EAAE,CAAA;KACjB;AACF;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/containers/xy-container/index.ts"],"sourcesContent":["import { css } from '@emotion/css'\nimport { extent, merge as mergeArrays } from 'd3-array'\nimport { Selection } from 'd3-selection'\n\n// Global CSS variables (side effects import)\nimport 'styles/index'\n\n// Core\nimport { ContainerCore } from 'core/container'\nimport { XYComponentCore } from 'core/xy-component'\nimport { XYComponentConfigInterface } from 'core/xy-component/config'\n\n// Data Model\nimport { CoreDataModel } from 'data-models/core'\n\n// Types\nimport { Spacing } from 'types/spacing'\nimport { AxisType } from 'components/axis/types'\nimport { ScaleDimension } from 'types/scale'\nimport { Direction } from 'types/direction'\n\n// Utils\nimport { clamp, clean, flatten } from 'utils/data'\nimport { guid } from 'utils/misc'\n\n// Config\nimport { XYContainerDefaultConfig, XYContainerConfigInterface } from './config'\nimport {\n AreaConfigInterface,\n BrushConfigInterface,\n LineConfigInterface,\n ScatterConfigInterface,\n StackedBarConfigInterface,\n TimelineConfigInterface,\n} from '../../components'\n\nexport type XYConfigInterface<Datum> = XYComponentConfigInterface<Datum>\n| StackedBarConfigInterface<Datum>\n| LineConfigInterface<Datum>\n| ScatterConfigInterface<Datum>\n| BrushConfigInterface<Datum>\n| TimelineConfigInterface<Datum>\n| AreaConfigInterface<Datum>\n\nexport class XYContainer<Datum> extends ContainerCore {\n protected _defaultConfig = XYContainerDefaultConfig as XYContainerConfigInterface<Datum>\n protected _svgDefs: Selection<SVGDefsElement, unknown, null, undefined>\n public datamodel: CoreDataModel<Datum[]> = new CoreDataModel()\n public config: XYContainerConfigInterface<Datum> = this._defaultConfig\n private _clipPath: Selection<SVGClipPathElement, unknown, null, undefined>\n private _clipPathId = guid()\n private _axisMargin: Spacing = { top: 0, bottom: 0, left: 0, right: 0 }\n private _firstRender = true\n\n constructor (element: HTMLElement, config?: XYContainerConfigInterface<Datum>, data?: Datum[]) {\n super(element)\n\n this._clipPath = this.svg.append('clipPath')\n .attr('id', this._clipPathId)\n this._clipPath.append('rect')\n\n // When the base tag is specified on the HTML head,\n // Safari fails to find the corresponding filter URL.\n // We have to provide tull url in order to fix that\n const highlightFilterId = 'saturate'\n const baseUrl = window.location.href.replace(window.location.hash, '')\n this.svg.attr('class', css`\n --highlight-filter-id: url(${baseUrl}#${highlightFilterId}); // defining a css variable\n `)\n\n this._svgDefs.append('filter')\n .attr('id', highlightFilterId)\n .attr('filterUnits', 'objectBoundingBox')\n .html('<feColorMatrix type=\"saturate\" in=\"SourceGraphic\" values=\"1.35\"/>')\n\n if (config) {\n this.updateContainer(config, true)\n }\n\n if (data) {\n this.setData(data, true)\n }\n\n // Render if there are axes or components with data\n if (\n this.config.xAxis ||\n this.config.yAxis ||\n this.components?.some(c => c.datamodel.data)\n ) {\n this.render()\n }\n\n // Force re-render axes when fonts are loaded\n (document as any).fonts?.ready.then(() => {\n if (!this._firstRender) this._renderAxes(0)\n })\n }\n\n get components (): XYComponentCore<Datum>[] {\n return this.config.components\n }\n\n // Overriding ContainerCore default get width method to work with axis auto margin\n get width (): number {\n const margin = this._getMargin()\n return clamp(this.containerWidth - margin.left - margin.right, 0, Number.POSITIVE_INFINITY)\n }\n\n // Overriding ContainerCore default get height method to work with axis auto margin\n get height (): number {\n const margin = this._getMargin()\n\n return clamp(this.containerHeight - margin.top - margin.bottom, 0, Number.POSITIVE_INFINITY)\n }\n\n public setData (data: Datum[], preventRender?: boolean): void {\n const { components, config } = this\n if (!data) return\n this.datamodel.data = data\n\n components.forEach((c) => {\n c.setData(data)\n })\n\n config.crosshair?.setData(data)\n config.xAxis?.setData(data)\n config.yAxis?.setData(data)\n config.tooltip?.hide()\n if (!preventRender) this.render()\n }\n\n public updateContainer (containerConfig: XYContainerConfigInterface<Datum>, preventRender?: boolean): void {\n super.updateContainer(containerConfig)\n this._removeAllChildren()\n\n // If there were any new components added we need to pass them data\n this.setData(this.datamodel.data, true)\n\n // Set up the axes\n if (containerConfig.xAxis) {\n this.config.xAxis.config.type = AxisType.X\n this.element.appendChild(containerConfig.xAxis.element)\n }\n if (containerConfig.yAxis) {\n this.config.yAxis.config.type = AxisType.Y\n this.element.appendChild(containerConfig.yAxis.element)\n }\n\n // Re-insert elements to the DOM\n for (const c of this.components) {\n this.element.appendChild(c.element)\n }\n\n // Set up the tooltip\n const tooltip = containerConfig.tooltip\n if (tooltip) {\n if (!tooltip.hasContainer()) tooltip.setContainer(this._container)\n tooltip.setComponents(this.components)\n }\n\n // Set up the crosshair\n const crosshair = containerConfig.crosshair\n if (crosshair) {\n crosshair.setContainer(this.svg)\n crosshair.tooltip = tooltip\n\n this.element.appendChild(crosshair.element)\n }\n\n // Set up annotations\n const annotations = containerConfig.annotations\n if (annotations) {\n this.element.appendChild(annotations.element)\n }\n\n // Clipping path\n this.element.appendChild(this._clipPath.node())\n\n // Defs\n this.element.appendChild(this._svgDefs.node())\n this.element.appendChild(this._svgDefsExternal.node())\n\n // Rendering\n if (!preventRender) this.render()\n }\n\n public updateComponents (componentConfigs: XYConfigInterface<Datum>[], preventRender?: boolean): void {\n const { config } = this\n\n this.components.forEach((c, i) => {\n const componentConfig = componentConfigs[i]\n if (componentConfig) {\n c.setConfig(componentConfigs[i])\n }\n })\n\n this._updateScales(...this.components, config.xAxis, config.yAxis, config.crosshair)\n if (!preventRender) this.render()\n }\n\n public update (containerConfig: XYContainerConfigInterface<Datum>, componentConfigs?: XYComponentConfigInterface<Datum>[], data?: Datum[]): void {\n if (data) this.datamodel.data = data // Just updating the data model because the `updateContainer` method has the `setData` step inside\n if (containerConfig) this.updateContainer(containerConfig, true)\n if (componentConfigs) this.updateComponents(componentConfigs, true)\n this.render()\n }\n\n protected _preRender (): void {\n const { config } = this\n super._preRender()\n\n // Calculate extra margin required to fit the axes\n if (config.autoMargin) {\n this._setAutoMargin()\n }\n\n // Pass size to the components\n const components = clean([...this.components, config.xAxis, config.yAxis, config.crosshair, config.annotations])\n for (const c of components) {\n c.setSize(this.width, this.height, this.containerWidth, this.containerHeight)\n }\n\n // Update Scales of all the components at once to calculate required paddings and sync them\n this._updateScales(...this.components, config.xAxis, config.yAxis, config.crosshair)\n }\n\n protected _render (customDuration?: number): void {\n const { config } = this\n super._render()\n\n // Get chart total margin after auto margin calculations\n const margin = this._getMargin()\n\n // Render components\n for (const c of this.components) {\n c.g.attr('transform', `translate(${margin.left},${margin.top})`)\n .style('clip-path', c.clippable ? `url(#${this._clipPathId})` : null)\n .style('-webkit-clip-path', c.clippable ? `url(#${this._clipPathId})` : null)\n\n c.render(customDuration)\n }\n\n this._renderAxes(this._firstRender ? 0 : customDuration)\n\n // Clip Rect\n // Extending the clipping path to allow small overflow (e.g. Line will looks better that way when it touches the edges)\n const clipPathExtension = config.clipPathExtend\n this._clipPath.select('rect')\n .attr('x', -clipPathExtension)\n .attr('y', -clipPathExtension)\n .attr('width', this.width + 2 * clipPathExtension)\n .attr('height', this.height + 2 * clipPathExtension)\n\n // Tooltip\n config.tooltip?.update() // Re-bind events\n\n // Crosshair\n const crosshair = config.crosshair\n if (crosshair) {\n // Pass accessors\n const yAccessors = this.components.filter(c => !c.stacked).map(c => c.config.y)\n const yStackedAccessors = this.components.filter(c => c.stacked).map(c => c.config.y)\n const baselineComponentConfig = this.components.find(c => (c.config as AreaConfigInterface<Datum>).baseline)?.config as AreaConfigInterface<Datum>\n const baselineAccessor = baselineComponentConfig?.baseline\n\n crosshair.accessors = {\n x: this.components[0]?.config.x,\n y: flatten(yAccessors),\n yStacked: flatten(yStackedAccessors),\n baseline: baselineAccessor,\n }\n\n crosshair.g.attr('transform', `translate(${margin.left},${margin.top})`)\n .style('clip-path', `url(#${this._clipPathId})`)\n .style('-webkit-clip-path', `url(#${this._clipPathId})`)\n crosshair.hide()\n }\n\n config.annotations?.g.attr('transform', `translate(${margin.left},${margin.top})`)\n config.annotations?.render()\n\n this._firstRender = false\n }\n\n private _updateScales<T extends XYComponentCore<Datum>> (...components: T[]): void {\n const c = clean(components || this.components)\n this._setScales(...c)\n this._updateScalesDomain(...c)\n this._updateScalesRange(...c)\n }\n\n private _setScales<T extends XYComponentCore<Datum>> (...components: T[]): void {\n const { config } = this\n if (!components) return\n\n // Set the X and Y scales\n if (config.xScale) components.forEach(c => c.setScale(ScaleDimension.X, config.xScale))\n if (config.yScale) components.forEach(c => c.setScale(ScaleDimension.Y, config.yScale))\n }\n\n private _updateScalesDomain<T extends XYComponentCore<Datum>> (...components: T[]): void {\n const { config } = this\n if (!components) return\n\n const componentsWithDomain = components.filter(c => !c.config.excludeFromDomainCalculation)\n\n // Loop over all the dimensions\n Object.values(ScaleDimension).forEach((dimension: ScaleDimension) => {\n const [min, max] = extent(\n mergeArrays(\n componentsWithDomain.map(c => c.getDataExtent(dimension, config.scaleByDomain))\n ) as number[]\n ) // Components with undefined dimension accessors will return [undefined, undefined] but d3.extent will take care of that\n\n const configuredDomain = dimension === ScaleDimension.Y ? config.yDomain : config.xDomain\n const configuredDomainMinConstraint = dimension === ScaleDimension.Y ? config.yDomainMinConstraint : config.xDomainMinConstraint\n const configuredDomainMaxConstraint = dimension === ScaleDimension.Y ? config.yDomainMaxConstraint : config.xDomainMaxConstraint\n const domainMin = configuredDomain?.[0] ?? min ?? 0\n const domainMax = configuredDomain?.[1] ?? max ?? 1\n const domain = [\n clamp(domainMin, configuredDomainMinConstraint?.[0] ?? Number.NEGATIVE_INFINITY, configuredDomainMinConstraint?.[1] ?? Number.POSITIVE_INFINITY),\n clamp(domainMax, configuredDomainMaxConstraint?.[0] ?? Number.NEGATIVE_INFINITY, configuredDomainMaxConstraint?.[1] ?? Number.POSITIVE_INFINITY),\n ]\n\n // Extend the X and Y domains if they're empty and `preventEmptyDomain` was explicitly set to `true`\n // or just the X domain if there is no data provided and `preventEmptyDomain` set to `null`\n if (domain[0] === domain[1]) {\n const hasDataProvided = componentsWithDomain.some(c => c.datamodel.data?.length > 0)\n if (config.preventEmptyDomain || (config.preventEmptyDomain === null && (!hasDataProvided || dimension === ScaleDimension.Y))) {\n domain[1] = domain[0] + 1\n }\n }\n\n components.forEach(c => c.setScaleDomain(dimension, domain))\n })\n }\n\n private _updateScalesRange<T extends XYComponentCore<Datum>> (...components: T[]): void {\n const { config } = this\n if (!components) return\n\n // Set initial scale range\n const isYDirectionSouth = config.yDirection === Direction.South\n const xRange: [number, number] = [config.padding.left ?? 0, this.width - (config.padding.right ?? 0)]\n const yRange: [number, number] = [this.height - (config.padding.bottom ?? 0), config.padding.top ?? 0]\n if (isYDirectionSouth) yRange.reverse()\n\n for (const c of components) {\n c.setSize(this.width, this.height, this.containerWidth, this.containerHeight)\n c.setScaleRange(ScaleDimension.X, config.xRange ?? xRange)\n c.setScaleRange(ScaleDimension.Y, config.yRange ?? yRange)\n }\n\n // Get and combine bleed\n const bleed = components.map(c => c.bleed).reduce((bleed, b) => {\n for (const key of Object.keys(bleed)) {\n const k = key as keyof Spacing\n if (bleed[k] < b[k]) bleed[k] = b[k]\n }\n return bleed\n }, { top: 0, bottom: 0, left: 0, right: 0 })\n\n // Update scale range\n for (const c of components) {\n c.setScaleRange(ScaleDimension.X, [xRange[0] + bleed.left, xRange[1] - bleed.right])\n c.setScaleRange(\n ScaleDimension.Y,\n isYDirectionSouth\n ? [yRange[0] + bleed.top, yRange[1] - bleed.bottom] // if Y axis is directed downwards\n : [yRange[0] - bleed.bottom, yRange[1] + bleed.top] // if Y axis is directed upwards\n )\n }\n }\n\n private _renderAxes (duration: number): void {\n const { config: { xAxis, yAxis } } = this\n const margin = this._getMargin()\n\n const axes = clean([xAxis, yAxis])\n axes.forEach(axis => {\n const offset = axis.getOffset(margin)\n axis.g.attr('transform', `translate(${offset.left},${offset.top})`)\n axis.render(duration)\n })\n }\n\n private _setAutoMargin (): void {\n const { config: { xAxis, yAxis } } = this\n\n // At first we need to set the domain to the scales\n const components = clean([...this.components, xAxis, yAxis])\n this._setScales(...components)\n this._updateScalesDomain(...components)\n\n // Calculate margin required by the axes\n // We do two iterations on the first render, because the amount and size of ticks can change\n // after new margin are calculated and applied (axes dimensions will change).\n // That's needed for correct label placement.\n const numIterations = this._firstRender ? 2 : 1\n for (let i = 0; i < numIterations; i += 1) {\n const axisMargin: Spacing = { top: 0, bottom: 0, left: 0, right: 0 }\n this._updateScalesRange(...components)\n const axes = clean([xAxis, yAxis])\n axes.forEach(axis => {\n axis.preRender()\n\n const m = axis.getRequiredMargin()\n if (axisMargin.top < m.top) axisMargin.top = m.top\n if (axisMargin.bottom < m.bottom) axisMargin.bottom = m.bottom\n if (axisMargin.left < m.left) axisMargin.left = m.left\n if (axisMargin.right < m.right) axisMargin.right = m.right\n })\n this._axisMargin = axisMargin\n }\n }\n\n private _getMargin (): Spacing {\n const { config: { margin } } = this\n\n return {\n top: margin.top + this._axisMargin.top,\n bottom: margin.bottom + this._axisMargin.bottom,\n left: margin.left + this._axisMargin.left,\n right: margin.right + this._axisMargin.right,\n }\n }\n\n public destroy (): void {\n const { components, config: { tooltip, crosshair, annotations, xAxis, yAxis } } = this\n super.destroy()\n\n for (const c of components) c?.destroy()\n tooltip?.destroy()\n crosshair?.destroy()\n annotations?.destroy()\n xAxis?.destroy()\n yAxis?.destroy()\n }\n}\n"],"names":["mergeArrays"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@unovis/ts",
3
3
  "description": "Modular data visualization framework for React, Angular, Svelte, Vue, Solid, and vanilla TypeScript or JavaScript",
4
- "version": "1.6.2-pre.2",
4
+ "version": "1.6.2-pre.3",
5
5
  "packageManager": "npm@10.9.1",
6
6
  "repository": {
7
7
  "type": "git",
package/utils/data.js CHANGED
@@ -1,4 +1,4 @@
1
- import { mean, min, max, bisectLeft, bisectRight } from 'd3-array';
1
+ import { mean, min, max, bisectRight, bisectLeft } from 'd3-array';
2
2
  import { throttle as throttle$1 } from 'throttle-debounce';
3
3
  import { FindNearestDirection } from '../types/data.js';
4
4
 
@@ -258,13 +258,13 @@ function getNearest(data, value, accessor, direction = FindNearestDirection.Auto
258
258
  const dataWithIndexSorted = dataWithIndex
259
259
  .sort(([a, i], [b, j]) => getNumber(a, accessor, i) - getNumber(b, accessor, j));
260
260
  const values = dataWithIndexSorted.map(([d, i]) => getNumber(d, accessor, i));
261
- const index = direction === FindNearestDirection.Right
262
- ? bisectLeft(values, value, 0, data.length - 1)
263
- : bisectRight(values, value, 1, data.length);
264
- if (direction === FindNearestDirection.Right) {
265
- return dataWithIndexSorted[index][0];
261
+ const index = direction === FindNearestDirection.Left
262
+ ? bisectRight(values, value, 1, data.length - 1)
263
+ : bisectLeft(values, value, 1, data.length - 1);
264
+ if (direction === FindNearestDirection.Left) {
265
+ return dataWithIndexSorted[index - 1][0];
266
266
  }
267
- else if (direction === FindNearestDirection.Left) {
267
+ else if (direction === FindNearestDirection.Right) {
268
268
  return dataWithIndexSorted[index - 1][0];
269
269
  }
270
270
  // By default (`FindNearestDirection.Auto`) return the nearest value
package/utils/data.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"data.js","sources":["../../src/utils/data.ts"],"sourcesContent":["import { max, min, mean, bisectLeft, bisectRight } from 'd3-array'\nimport { throttle as _throttle } from 'throttle-debounce'\n\n// Types\nimport { NumericAccessor, StringAccessor, BooleanAccessor, ColorAccessor, GenericAccessor } from 'types/accessor'\nimport { FindNearestDirection, StackValuesRecord } from 'types/data'\n\nexport const isNumber = <T>(a: T): a is T extends number ? T : never => typeof a === 'number'\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport const isFunction = <T>(a: T): a is T extends Function ? T : never => typeof a === 'function'\nexport const isUndefined = <T>(a: T): a is T extends undefined ? T : never => a === undefined\nexport const isNil = <T>(a: T): a is null | undefined => a == null\nexport const isString = <T>(a: T): a is T extends string ? T : never => typeof a === 'string'\nexport const isArray = <T>(a: T): a is T extends any[] ? T : never => Array.isArray(a)\nexport const isObject = <T>(a: T): boolean => (a instanceof Object)\nexport const isAClassInstance = <T>(a: T): boolean => a.constructor.name !== 'Function' && a.constructor.name !== 'Object'\nexport const isPlainObject = <T>(a: T): boolean => isObject(a) && !isArray(a) && !isFunction(a) && !isAClassInstance(a)\n\nexport const isEmpty = <T>(obj: T): boolean => {\n return [Object, Array].includes((obj || {}).constructor as ArrayConstructor | ObjectConstructor) &&\n !Object.entries((obj || {})).length\n}\n\n// Based on https://github.com/maplibre/maplibre-gl-js/blob/e78ad7944ef768e67416daa4af86b0464bd0f617/src/style-spec/util/deep_equal.ts, 3-Clause BSD license\nexport const isEqual = (\n a: unknown | null | undefined,\n b: unknown | null | undefined,\n skipKeys: string[] = [],\n visited: Set<any> = new Set()\n): boolean => {\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== b.length) return false\n\n if (visited.has(a)) return true\n else visited.add(a)\n\n for (let i = 0; i < a.length; i++) {\n if (!isEqual(a[i], b[i], skipKeys, visited)) return false\n }\n\n return true\n }\n\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime()\n }\n\n if (typeof a === 'object' && a !== null && b !== null) {\n if (!(typeof b === 'object')) return false\n if (a === b) return true\n\n const keysA = Object.keys(a).filter(key => !skipKeys.includes(key))\n const keysB = Object.keys(b).filter(key => !skipKeys.includes(key))\n\n if (keysA.length !== keysB.length) return false\n\n if (visited.has(a)) return true\n else visited.add(a)\n\n for (const key of keysA) {\n if (!isEqual((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key], skipKeys, visited)) return false\n }\n\n return true\n }\n\n return a === b\n}\n\nexport const without = <T>(arr: Array<T>, ...args: T[]): Array<T> => arr.filter(item => !args.includes(item))\nexport const flatten = <T>(arr: Array<T | T[]>): Array<T> => arr.flat() as T[]\nexport const cloneDeep = <T>(obj: T, stack: Map<any, any> = new Map()): T => {\n if (typeof obj !== 'object' || obj === null) {\n return obj\n }\n\n if (obj instanceof Date) {\n return new Date(obj.getTime()) as unknown as T\n }\n\n if (obj instanceof Array) {\n const clone: unknown[] = []\n stack.set(obj, clone)\n for (const item of obj) {\n clone.push(stack.has(item) ? stack.get(item) : cloneDeep(item, stack))\n }\n return clone as unknown as T\n }\n\n // Class instances will be copied without cloning\n if (isAClassInstance(obj)) {\n const clone = obj\n return clone\n }\n\n if (obj instanceof Object) {\n const clone = {} as T\n stack.set(obj, clone)\n const objAsRecord = obj as Record<string | number, unknown>\n Object.keys(obj)\n .reduce((newObj: typeof objAsRecord, key: string | number): typeof objAsRecord => {\n newObj[key] = stack.has(objAsRecord[key]) ? stack.get(objAsRecord[key]) : cloneDeep(objAsRecord[key], stack)\n return newObj\n }, clone as typeof objAsRecord)\n\n return clone\n }\n\n return obj\n}\n\n\nexport const merge = <T, K>(obj1: T, obj2: K, visited: Map<any, any> = new Map()): T & K => {\n type Rec = Record<string | number, unknown>\n\n if (!obj1 || !obj2) return obj1 as T & K\n if ((obj1 as unknown) === (obj2 as unknown)) return obj1 as T & K\n\n const newObj = (isAClassInstance(obj1 as Rec) ? obj1 : cloneDeep(obj1)) as T & K\n\n // Taking care of recursive structures\n if (visited.has(obj2)) return visited.get(obj2)\n else visited.set(obj2, newObj)\n\n Object.keys(obj2 as Rec).forEach(key => {\n // Preventing prototype pollution\n if (key === '__proto__' || key === 'constructor') return\n\n if (isPlainObject((obj1 as Rec)[key]) && isPlainObject((obj2 as Rec)[key])) {\n (newObj as Rec)[key] = merge((obj1 as Rec)[key], (obj2 as Rec)[key], visited)\n } else if (isAClassInstance(obj2 as Rec)) {\n (newObj as Rec)[key] = obj2\n } else {\n (newObj as Rec)[key] = cloneDeep((obj2 as Rec)[key])\n }\n })\n\n return newObj\n}\n\nexport const omit = <T extends Record<string | number | symbol, unknown>>(obj: T, props: Array<keyof T>): Partial<T> => {\n obj = { ...obj }\n props.forEach(prop => delete obj[prop])\n return obj\n}\n\nexport const groupBy = <T extends Record<string | number, any>> (arr: T[], accessor: (a: T, index: number) => string | number): Record<string | number, T[]> => {\n return arr.reduce(\n (grouped, v, i, a, k = accessor(v, i)) => (((grouped[k] || (grouped[k] = [])).push(v), grouped)),\n {} as Record<string | number, T[]>\n )\n}\n\nexport const sortBy = <T>(arr: Array<T>, accessor: (a: T) => string | number): Array<T> => {\n return arr.concat() // The native sort method modifies the array in place. We use `.concat()` to copy the array first\n .sort((a, b): number => {\n return (accessor(a) > accessor(b)) ? 1 : ((accessor(b) > accessor(a)) ? -1 : 0)\n })\n}\n\nexport const throttle = <T extends (...args: any[]) => any>(\n f: T,\n delay: number,\n options?: {\n noTrailing?: boolean;\n noLeading?: boolean;\n debounceMode?: boolean;\n }\n): _throttle<T> => _throttle(delay, f, options)\n\nexport function getValue<T, ReturnType> (\n d: T,\n accessor: NumericAccessor<T> | StringAccessor<T> | BooleanAccessor<T> | ColorAccessor<T> | GenericAccessor<ReturnType, T>,\n index?: number\n): ReturnType {\n // eslint-disable-next-line @typescript-eslint/ban-types\n if (isFunction(accessor)) return (accessor as Function)(d, index) as (ReturnType | null | undefined)\n else return accessor as unknown as (ReturnType | null | undefined)\n}\n\nexport function getString<T> (d: T, accessor: StringAccessor<T>, i?: number): string | null | undefined {\n return getValue<T, string>(d, accessor, i)\n}\n\nexport function getNumber<T> (d: T, accessor: NumericAccessor<T>, i?: number): number | null | undefined {\n return getValue<T, number>(d, accessor, i)\n}\n\nexport function getBoolean<T> (d: T, accessor: BooleanAccessor<T>, i?: number): boolean | null | undefined {\n return getValue<T, boolean>(d, accessor, i)\n}\n\nexport function clean<T> (data: T[]): T[] {\n return data.filter(d => d && !isNumber(d))\n}\n\nexport function clamp (d: number, min: number, max: number): number {\n return Math.min(Math.max(d, min), max)\n}\n\nexport function unique<T> (array: T[]): T[] {\n return Array.from(new Set(array))\n}\n\nexport function countUnique<T> (array: T[], accessor = (d: unknown) => d): number {\n return new Set(array.map(d => accessor(d))).size\n}\n\nexport function arrayOfIndices (n: number): number[] {\n return [...Array(n).keys()]\n}\n\nexport function shallowDiff (o1: Record<string, unknown> = {}, o2: Record<string, unknown> = {}): Record<string, unknown> {\n return Object.keys(o2).reduce((diff, key) => {\n if (o1[key] === o2[key]) return diff\n return {\n ...diff,\n [key]: o2[key],\n }\n }, {})\n}\n\nexport function getStackedExtent<Datum> (data: Datum[], ...acs: NumericAccessor<Datum>[]): (number | undefined)[] {\n if (!data) return [undefined, undefined]\n if (isArray(acs)) {\n let minValue = 0\n let maxValue = 0\n data.forEach((d, i) => {\n let positiveStack = 0\n let negativeStack = 0\n for (const a of acs as NumericAccessor<Datum>[]) {\n const value = getNumber(d, a, i) || 0\n if (value >= 0) positiveStack += value\n else negativeStack += value\n }\n\n if (positiveStack > maxValue) maxValue = positiveStack\n if (negativeStack < minValue) minValue = negativeStack\n })\n return [minValue, maxValue]\n }\n}\n\nexport function getStackedValues<Datum> (d: Datum, index: number, ...acs: NumericAccessor<Datum>[]): (number | undefined)[] {\n const values = []\n\n let positiveStack = 0\n let negativeStack = 0\n for (const a of acs as NumericAccessor<Datum>[]) {\n const value = getNumber(d, a, index) || 0\n if (value >= 0) {\n values.push(positiveStack += value)\n } else {\n values.push(negativeStack += value)\n }\n }\n\n return values\n}\n\nexport function getStackedData<Datum> (\n data: Datum[],\n baseline: NumericAccessor<Datum>,\n acs: NumericAccessor<Datum>[],\n prevNegative?: boolean[] // to help guessing the stack direction (positive/negative) when the values are 0 or null\n): StackValuesRecord[] {\n const baselineValues = data.map((d, i) => getNumber(d, baseline, i) || 0)\n const isNegativeStack = acs.map((a, j) => {\n const average = mean(data, (d, i) => getNumber(d, a, i) || 0)\n return (average === 0 && Array.isArray(prevNegative)) ? prevNegative[j] : average < 0\n })\n\n const stackedData = acs.map(() => [] as StackValuesRecord)\n data.forEach((d, i) => {\n let positiveStack = baselineValues[i]\n let negativeStack = baselineValues[i]\n acs.forEach((a, j) => {\n const value = getNumber(d, a, i) || 0\n if (value >= 0) {\n stackedData[j].push([positiveStack, positiveStack += value])\n } else {\n stackedData[j].push([negativeStack, negativeStack += value])\n }\n })\n })\n\n // Fill in additional stack information\n stackedData.forEach((stack, i) => {\n stack.isMostlyNegative = isNegativeStack[i]\n })\n\n return stackedData\n}\n\nexport function getMin<Datum> (data: Datum[], ...acs: NumericAccessor<Datum>[]): number | undefined {\n if (!data) return undefined\n const minValue = min(data, (d, i) => min(acs as NumericAccessor<Datum>[], a => getNumber(d, a, i)))\n return minValue\n}\n\nexport function getMax<Datum> (data: Datum[], ...acs: NumericAccessor<Datum>[]): number | undefined {\n if (!data) return undefined\n const maxValue = max(data, (d, i) => max(acs as NumericAccessor<Datum>[], a => getNumber(d, a, i)))\n return maxValue\n}\n\nexport function getExtent<Datum> (data: Datum[], ...acs: NumericAccessor<Datum>[]): (number | undefined)[] {\n return [getMin(data, ...acs), getMax(data, ...acs)]\n}\n\nexport function getNearest<Datum> (\n data: Datum[],\n value: number,\n accessor: NumericAccessor<Datum>,\n direction: FindNearestDirection = FindNearestDirection.Auto\n): Datum {\n if (data.length <= 1) return data[0]\n\n const dataWithIndex = data.map((d, i) => ([d, i])) as [Datum, number][]\n const dataWithIndexSorted = dataWithIndex\n .sort(([a, i], [b, j]) => getNumber(a, accessor, i) - getNumber(b, accessor, j))\n const values = dataWithIndexSorted.map(([d, i]) => getNumber(d, accessor, i))\n\n const index = direction === FindNearestDirection.Right\n ? bisectLeft(values, value, 0, data.length - 1)\n : bisectRight(values, value, 1, data.length)\n\n if (direction === FindNearestDirection.Right) {\n return dataWithIndexSorted[index][0]\n } else if (direction === FindNearestDirection.Left) {\n return dataWithIndexSorted[index - 1][0]\n }\n\n // By default (`FindNearestDirection.Auto`) return the nearest value\n return value - values[index - 1] > values[index] - value ? dataWithIndexSorted[index][0] : dataWithIndexSorted[index - 1][0]\n}\n\nexport function filterDataByRange<Datum> (\n data: Datum[],\n range: [number, number],\n accessor: NumericAccessor<Datum>,\n includeNeighbors = false\n): Datum[] {\n if (!accessor) return []\n\n const filteredData = data.filter((d, i) => {\n const value = getNumber(d, accessor, i)\n return (value >= range[0]) && (value <= range[1])\n })\n\n if (includeNeighbors) {\n // If `filteredData` is empty and `includeNeighbors` is true, try to find nearest points\n if (filteredData.length === 0) {\n const nearestLeft = getNearest(data, range[0], accessor, FindNearestDirection.Left)\n const nearestRight = getNearest(data, range[1], accessor, FindNearestDirection.Right)\n return [nearestLeft, nearestRight].filter(Boolean)\n }\n\n // Find indices of first and last filtered points in original data\n const firstFilteredItem = filteredData[0]\n const lastFilteredItem = filteredData[filteredData.length - 1]\n\n const firstFilteredIndex = data.findIndex((d: Datum) => d === firstFilteredItem)\n const lastFilteredIndex = data.findIndex((d: Datum) => d === lastFilteredItem)\n\n // Include neighbors (if they exist)\n const startIndex = Math.max(0, firstFilteredIndex - 1)\n const endIndex = Math.min(data.length - 1, lastFilteredIndex + 1)\n\n // Return data from startIndex to endIndex (inclusive)\n return data.slice(startIndex, endIndex + 1)\n }\n return filteredData\n}\n\nexport function isNumberWithinRange (value: number, range: [number, number]): boolean {\n return (value >= range[0] && value <= range[1]) || (value >= range[1] && value <= range[0])\n}\n\nexport const ensureArray = <T>(value: T | T[] | null): T[] => {\n if (value === null || value === undefined) {\n return []\n }\n\n if (Array.isArray(value)) {\n return value\n }\n\n return [value]\n}\n"],"names":["_throttle"],"mappings":"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"}
1
+ {"version":3,"file":"data.js","sources":["../../src/utils/data.ts"],"sourcesContent":["import { max, min, mean, bisectLeft, bisectRight } from 'd3-array'\nimport { throttle as _throttle } from 'throttle-debounce'\n\n// Types\nimport { NumericAccessor, StringAccessor, BooleanAccessor, ColorAccessor, GenericAccessor } from 'types/accessor'\nimport { FindNearestDirection, StackValuesRecord } from 'types/data'\n\nexport const isNumber = <T>(a: T): a is T extends number ? T : never => typeof a === 'number'\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport const isFunction = <T>(a: T): a is T extends Function ? T : never => typeof a === 'function'\nexport const isUndefined = <T>(a: T): a is T extends undefined ? T : never => a === undefined\nexport const isNil = <T>(a: T): a is null | undefined => a == null\nexport const isString = <T>(a: T): a is T extends string ? T : never => typeof a === 'string'\nexport const isArray = <T>(a: T): a is T extends any[] ? T : never => Array.isArray(a)\nexport const isObject = <T>(a: T): boolean => (a instanceof Object)\nexport const isAClassInstance = <T>(a: T): boolean => a.constructor.name !== 'Function' && a.constructor.name !== 'Object'\nexport const isPlainObject = <T>(a: T): boolean => isObject(a) && !isArray(a) && !isFunction(a) && !isAClassInstance(a)\n\nexport const isEmpty = <T>(obj: T): boolean => {\n return [Object, Array].includes((obj || {}).constructor as ArrayConstructor | ObjectConstructor) &&\n !Object.entries((obj || {})).length\n}\n\n// Based on https://github.com/maplibre/maplibre-gl-js/blob/e78ad7944ef768e67416daa4af86b0464bd0f617/src/style-spec/util/deep_equal.ts, 3-Clause BSD license\nexport const isEqual = (\n a: unknown | null | undefined,\n b: unknown | null | undefined,\n skipKeys: string[] = [],\n visited: Set<any> = new Set()\n): boolean => {\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== b.length) return false\n\n if (visited.has(a)) return true\n else visited.add(a)\n\n for (let i = 0; i < a.length; i++) {\n if (!isEqual(a[i], b[i], skipKeys, visited)) return false\n }\n\n return true\n }\n\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime()\n }\n\n if (typeof a === 'object' && a !== null && b !== null) {\n if (!(typeof b === 'object')) return false\n if (a === b) return true\n\n const keysA = Object.keys(a).filter(key => !skipKeys.includes(key))\n const keysB = Object.keys(b).filter(key => !skipKeys.includes(key))\n\n if (keysA.length !== keysB.length) return false\n\n if (visited.has(a)) return true\n else visited.add(a)\n\n for (const key of keysA) {\n if (!isEqual((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key], skipKeys, visited)) return false\n }\n\n return true\n }\n\n return a === b\n}\n\nexport const without = <T>(arr: Array<T>, ...args: T[]): Array<T> => arr.filter(item => !args.includes(item))\nexport const flatten = <T>(arr: Array<T | T[]>): Array<T> => arr.flat() as T[]\nexport const cloneDeep = <T>(obj: T, stack: Map<any, any> = new Map()): T => {\n if (typeof obj !== 'object' || obj === null) {\n return obj\n }\n\n if (obj instanceof Date) {\n return new Date(obj.getTime()) as unknown as T\n }\n\n if (obj instanceof Array) {\n const clone: unknown[] = []\n stack.set(obj, clone)\n for (const item of obj) {\n clone.push(stack.has(item) ? stack.get(item) : cloneDeep(item, stack))\n }\n return clone as unknown as T\n }\n\n // Class instances will be copied without cloning\n if (isAClassInstance(obj)) {\n const clone = obj\n return clone\n }\n\n if (obj instanceof Object) {\n const clone = {} as T\n stack.set(obj, clone)\n const objAsRecord = obj as Record<string | number, unknown>\n Object.keys(obj)\n .reduce((newObj: typeof objAsRecord, key: string | number): typeof objAsRecord => {\n newObj[key] = stack.has(objAsRecord[key]) ? stack.get(objAsRecord[key]) : cloneDeep(objAsRecord[key], stack)\n return newObj\n }, clone as typeof objAsRecord)\n\n return clone\n }\n\n return obj\n}\n\n\nexport const merge = <T, K>(obj1: T, obj2: K, visited: Map<any, any> = new Map()): T & K => {\n type Rec = Record<string | number, unknown>\n\n if (!obj1 || !obj2) return obj1 as T & K\n if ((obj1 as unknown) === (obj2 as unknown)) return obj1 as T & K\n\n const newObj = (isAClassInstance(obj1 as Rec) ? obj1 : cloneDeep(obj1)) as T & K\n\n // Taking care of recursive structures\n if (visited.has(obj2)) return visited.get(obj2)\n else visited.set(obj2, newObj)\n\n Object.keys(obj2 as Rec).forEach(key => {\n // Preventing prototype pollution\n if (key === '__proto__' || key === 'constructor') return\n\n if (isPlainObject((obj1 as Rec)[key]) && isPlainObject((obj2 as Rec)[key])) {\n (newObj as Rec)[key] = merge((obj1 as Rec)[key], (obj2 as Rec)[key], visited)\n } else if (isAClassInstance(obj2 as Rec)) {\n (newObj as Rec)[key] = obj2\n } else {\n (newObj as Rec)[key] = cloneDeep((obj2 as Rec)[key])\n }\n })\n\n return newObj\n}\n\nexport const omit = <T extends Record<string | number | symbol, unknown>>(obj: T, props: Array<keyof T>): Partial<T> => {\n obj = { ...obj }\n props.forEach(prop => delete obj[prop])\n return obj\n}\n\nexport const groupBy = <T extends Record<string | number, any>> (arr: T[], accessor: (a: T, index: number) => string | number): Record<string | number, T[]> => {\n return arr.reduce(\n (grouped, v, i, a, k = accessor(v, i)) => (((grouped[k] || (grouped[k] = [])).push(v), grouped)),\n {} as Record<string | number, T[]>\n )\n}\n\nexport const sortBy = <T>(arr: Array<T>, accessor: (a: T) => string | number): Array<T> => {\n return arr.concat() // The native sort method modifies the array in place. We use `.concat()` to copy the array first\n .sort((a, b): number => {\n return (accessor(a) > accessor(b)) ? 1 : ((accessor(b) > accessor(a)) ? -1 : 0)\n })\n}\n\nexport const throttle = <T extends (...args: any[]) => any>(\n f: T,\n delay: number,\n options?: {\n noTrailing?: boolean;\n noLeading?: boolean;\n debounceMode?: boolean;\n }\n): _throttle<T> => _throttle(delay, f, options)\n\nexport function getValue<T, ReturnType> (\n d: T,\n accessor: NumericAccessor<T> | StringAccessor<T> | BooleanAccessor<T> | ColorAccessor<T> | GenericAccessor<ReturnType, T>,\n index?: number\n): ReturnType {\n // eslint-disable-next-line @typescript-eslint/ban-types\n if (isFunction(accessor)) return (accessor as Function)(d, index) as (ReturnType | null | undefined)\n else return accessor as unknown as (ReturnType | null | undefined)\n}\n\nexport function getString<T> (d: T, accessor: StringAccessor<T>, i?: number): string | null | undefined {\n return getValue<T, string>(d, accessor, i)\n}\n\nexport function getNumber<T> (d: T, accessor: NumericAccessor<T>, i?: number): number | null | undefined {\n return getValue<T, number>(d, accessor, i)\n}\n\nexport function getBoolean<T> (d: T, accessor: BooleanAccessor<T>, i?: number): boolean | null | undefined {\n return getValue<T, boolean>(d, accessor, i)\n}\n\nexport function clean<T> (data: T[]): T[] {\n return data.filter(d => d && !isNumber(d))\n}\n\nexport function clamp (d: number, min: number, max: number): number {\n return Math.min(Math.max(d, min), max)\n}\n\nexport function unique<T> (array: T[]): T[] {\n return Array.from(new Set(array))\n}\n\nexport function countUnique<T> (array: T[], accessor = (d: unknown) => d): number {\n return new Set(array.map(d => accessor(d))).size\n}\n\nexport function arrayOfIndices (n: number): number[] {\n return [...Array(n).keys()]\n}\n\nexport function shallowDiff (o1: Record<string, unknown> = {}, o2: Record<string, unknown> = {}): Record<string, unknown> {\n return Object.keys(o2).reduce((diff, key) => {\n if (o1[key] === o2[key]) return diff\n return {\n ...diff,\n [key]: o2[key],\n }\n }, {})\n}\n\nexport function getStackedExtent<Datum> (data: Datum[], ...acs: NumericAccessor<Datum>[]): (number | undefined)[] {\n if (!data) return [undefined, undefined]\n if (isArray(acs)) {\n let minValue = 0\n let maxValue = 0\n data.forEach((d, i) => {\n let positiveStack = 0\n let negativeStack = 0\n for (const a of acs as NumericAccessor<Datum>[]) {\n const value = getNumber(d, a, i) || 0\n if (value >= 0) positiveStack += value\n else negativeStack += value\n }\n\n if (positiveStack > maxValue) maxValue = positiveStack\n if (negativeStack < minValue) minValue = negativeStack\n })\n return [minValue, maxValue]\n }\n}\n\nexport function getStackedValues<Datum> (d: Datum, index: number, ...acs: NumericAccessor<Datum>[]): (number | undefined)[] {\n const values = []\n\n let positiveStack = 0\n let negativeStack = 0\n for (const a of acs as NumericAccessor<Datum>[]) {\n const value = getNumber(d, a, index) || 0\n if (value >= 0) {\n values.push(positiveStack += value)\n } else {\n values.push(negativeStack += value)\n }\n }\n\n return values\n}\n\nexport function getStackedData<Datum> (\n data: Datum[],\n baseline: NumericAccessor<Datum>,\n acs: NumericAccessor<Datum>[],\n prevNegative?: boolean[] // to help guessing the stack direction (positive/negative) when the values are 0 or null\n): StackValuesRecord[] {\n const baselineValues = data.map((d, i) => getNumber(d, baseline, i) || 0)\n const isNegativeStack = acs.map((a, j) => {\n const average = mean(data, (d, i) => getNumber(d, a, i) || 0)\n return (average === 0 && Array.isArray(prevNegative)) ? prevNegative[j] : average < 0\n })\n\n const stackedData = acs.map(() => [] as StackValuesRecord)\n data.forEach((d, i) => {\n let positiveStack = baselineValues[i]\n let negativeStack = baselineValues[i]\n acs.forEach((a, j) => {\n const value = getNumber(d, a, i) || 0\n if (value >= 0) {\n stackedData[j].push([positiveStack, positiveStack += value])\n } else {\n stackedData[j].push([negativeStack, negativeStack += value])\n }\n })\n })\n\n // Fill in additional stack information\n stackedData.forEach((stack, i) => {\n stack.isMostlyNegative = isNegativeStack[i]\n })\n\n return stackedData\n}\n\nexport function getMin<Datum> (data: Datum[], ...acs: NumericAccessor<Datum>[]): number | undefined {\n if (!data) return undefined\n const minValue = min(data, (d, i) => min(acs as NumericAccessor<Datum>[], a => getNumber(d, a, i)))\n return minValue\n}\n\nexport function getMax<Datum> (data: Datum[], ...acs: NumericAccessor<Datum>[]): number | undefined {\n if (!data) return undefined\n const maxValue = max(data, (d, i) => max(acs as NumericAccessor<Datum>[], a => getNumber(d, a, i)))\n return maxValue\n}\n\nexport function getExtent<Datum> (data: Datum[], ...acs: NumericAccessor<Datum>[]): (number | undefined)[] {\n return [getMin(data, ...acs), getMax(data, ...acs)]\n}\n\nexport function getNearest<Datum> (\n data: Datum[],\n value: number,\n accessor: NumericAccessor<Datum>,\n direction: FindNearestDirection = FindNearestDirection.Auto\n): Datum {\n if (data.length <= 1) return data[0]\n\n const dataWithIndex = data.map((d, i) => ([d, i])) as [Datum, number][]\n const dataWithIndexSorted = dataWithIndex\n .sort(([a, i], [b, j]) => getNumber(a, accessor, i) - getNumber(b, accessor, j))\n const values = dataWithIndexSorted.map(([d, i]) => getNumber(d, accessor, i))\n\n const index = direction === FindNearestDirection.Left\n ? bisectRight(values, value, 1, data.length - 1)\n : bisectLeft(values, value, 1, data.length - 1)\n\n if (direction === FindNearestDirection.Left) {\n return dataWithIndexSorted[index - 1][0]\n } else if (direction === FindNearestDirection.Right) {\n return dataWithIndexSorted[index - 1][0]\n }\n\n // By default (`FindNearestDirection.Auto`) return the nearest value\n return value - values[index - 1] > values[index] - value ? dataWithIndexSorted[index][0] : dataWithIndexSorted[index - 1][0]\n}\n\nexport function filterDataByRange<Datum> (\n data: Datum[],\n range: [number, number],\n accessor: NumericAccessor<Datum>,\n includeNeighbors = false\n): Datum[] {\n if (!accessor) return []\n\n const filteredData = data.filter((d, i) => {\n const value = getNumber(d, accessor, i)\n return (value >= range[0]) && (value <= range[1])\n })\n\n if (includeNeighbors) {\n // If `filteredData` is empty and `includeNeighbors` is true, try to find nearest points\n if (filteredData.length === 0) {\n const nearestLeft = getNearest(data, range[0], accessor, FindNearestDirection.Left)\n const nearestRight = getNearest(data, range[1], accessor, FindNearestDirection.Right)\n return [nearestLeft, nearestRight].filter(Boolean)\n }\n\n // Find indices of first and last filtered points in original data\n const firstFilteredItem = filteredData[0]\n const lastFilteredItem = filteredData[filteredData.length - 1]\n\n const firstFilteredIndex = data.findIndex((d: Datum) => d === firstFilteredItem)\n const lastFilteredIndex = data.findIndex((d: Datum) => d === lastFilteredItem)\n\n // Include neighbors (if they exist)\n const startIndex = Math.max(0, firstFilteredIndex - 1)\n const endIndex = Math.min(data.length - 1, lastFilteredIndex + 1)\n\n // Return data from startIndex to endIndex (inclusive)\n return data.slice(startIndex, endIndex + 1)\n }\n return filteredData\n}\n\nexport function isNumberWithinRange (value: number, range: [number, number]): boolean {\n return (value >= range[0] && value <= range[1]) || (value >= range[1] && value <= range[0])\n}\n\nexport const ensureArray = <T>(value: T | T[] | null): T[] => {\n if (value === null || value === undefined) {\n return []\n }\n\n if (Array.isArray(value)) {\n return value\n }\n\n return [value]\n}\n"],"names":["_throttle"],"mappings":"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"}