From d36701672dd3709de43eeb078ed5f89e1fb26cdc Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Mon, 4 Jan 2021 19:48:56 +0100 Subject: [PATCH 1/9] refactor: annotation marker size calculation --- package.json | 1 - scripts/setup_enzyme.ts | 5 + .../line/dimensions.integration.test.ts | 8 +- .../annotations/line/dimensions.test.ts | 45 ++- .../xy_chart/annotations/line/dimensions.ts | 74 ++-- .../xy_chart/annotations/line/line.test.tsx | 16 +- .../xy_chart/annotations/line/tooltip.test.ts | 364 ------------------ .../annotations/line/tooltip.test.tsx | 190 +++++++++ .../xy_chart/annotations/line/tooltip.ts | 104 ----- .../xy_chart/annotations/line/types.ts | 7 +- .../xy_chart/annotations/rect/dimensions.ts | 13 +- .../xy_chart/annotations/rect/tooltip.test.ts | 15 +- .../xy_chart/annotations/rect/tooltip.ts | 6 +- .../xy_chart/annotations/rect/types.ts | 7 +- .../xy_chart/annotations/tooltip.ts | 61 +-- src/chart_types/xy_chart/annotations/types.ts | 9 +- .../dom/annotations/_annotations.scss | 1 - .../renderer/dom/annotations/annotations.tsx | 69 +++- .../dom/annotations/tooltip_content.tsx | 24 +- .../xy_chart/specs/line_annotation.tsx | 122 +----- .../selectors/get_annotation_tooltip_state.ts | 72 +++- src/index.ts | 2 - src/mocks/annotations/annotations.ts | 6 +- src/state/actions/dom_element.ts | 55 +++ src/state/chart_state.ts | 6 +- src/state/reducers/interactions.ts | 22 +- yarn.lock | 5 - 27 files changed, 575 insertions(+), 734 deletions(-) delete mode 100644 src/chart_types/xy_chart/annotations/line/tooltip.test.ts create mode 100644 src/chart_types/xy_chart/annotations/line/tooltip.test.tsx delete mode 100644 src/chart_types/xy_chart/annotations/line/tooltip.ts create mode 100644 src/state/actions/dom_element.ts diff --git a/package.json b/package.json index 16a161ba00..a85074ef2e 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,6 @@ "d3-scale": "^1.0.7", "d3-shape": "^1.3.4", "newtype-ts": "^0.2.4", - "path2d-polyfill": "^0.4.2", "prop-types": "^15.7.2", "re-reselect": "^3.4.0", "react-redux": "^7.1.0", diff --git a/scripts/setup_enzyme.ts b/scripts/setup_enzyme.ts index 01a49f41db..33b0e30e51 100644 --- a/scripts/setup_enzyme.ts +++ b/scripts/setup_enzyme.ts @@ -51,3 +51,8 @@ class ResizeObserverMock { // @ts-ignore window.ResizeObserver = ResizeObserverMock; + +// Some tests will fail due to undefined Path2D, this mock doesn't create issues on test env +class Path2D {} +// @ts-ignore +window.Path2D = Path2D; diff --git a/src/chart_types/xy_chart/annotations/line/dimensions.integration.test.ts b/src/chart_types/xy_chart/annotations/line/dimensions.integration.test.ts index b4c0f97d67..a5888c27be 100644 --- a/src/chart_types/xy_chart/annotations/line/dimensions.integration.test.ts +++ b/src/chart_types/xy_chart/annotations/line/dimensions.integration.test.ts @@ -53,7 +53,10 @@ function expectAnnotationAtPosition( const annotations = computeAnnotationDimensionsSelector(store.getState()); expect(annotations.get(annotation.id)).toEqual([ MockAnnotationLineProps.default({ - details: { detailsText: undefined, headerText: `${indexPosition}` }, + specId: 'line_annotation_1', + datum: { + dataValue: indexPosition, + }, linePathPoints: { x1: expectedLinePosition, y1: 0, @@ -147,13 +150,14 @@ describe('Render vertical line annotation within', () => { const annotations = computeAnnotationDimensionsSelector(store.getState()); expect(annotations.get(annotation.id)).toEqual([ MockAnnotationLineProps.default({ + specId: 'line_annotation_1', linePathPoints: { x1: 95, y1: 0, x2: 95, y2: 100, }, - details: { detailsText: 'foo', headerText: '9.5' }, + datum: { dataValue: 9.5, details: 'foo' }, }), ]); }); diff --git a/src/chart_types/xy_chart/annotations/line/dimensions.test.ts b/src/chart_types/xy_chart/annotations/line/dimensions.test.ts index 0a873331c4..ce7d46652e 100644 --- a/src/chart_types/xy_chart/annotations/line/dimensions.test.ts +++ b/src/chart_types/xy_chart/annotations/line/dimensions.test.ts @@ -17,7 +17,7 @@ * under the License. */ -import { MockAnnotationLineProps } from '../../../../mocks/annotations/annotations'; +import { MockAnnotationLineProps, MockAnnotationRectProps } from '../../../../mocks/annotations/annotations'; import { MockAnnotationSpec, MockGlobalSpec, MockSeriesSpec } from '../../../../mocks/specs'; import { MockStore } from '../../../../mocks/store'; import { ScaleType } from '../../../../scales/constants'; @@ -88,21 +88,23 @@ describe('Annotation utils', () => { const expectedDimensions = new Map(); expectedDimensions.set('foo', [ MockAnnotationLineProps.default({ + specId: 'foo', linePathPoints: { x1: 0, y1: 80, x2: 100, y2: 80, }, - details: { detailsText: 'foo', headerText: '2' }, + datum: { dataValue: 2, details: 'foo' }, }), ]); expectedDimensions.set('rect', [ - { - details: undefined, + MockAnnotationRectProps.default({ + specId: 'rect', rect: { x: 0, y: 50, width: 50, height: 20 }, panel: { top: 0, left: 0, width: 100, height: 100 }, - }, + datum: { coordinates: { x0: 'a', x1: 'b', y0: 3, y1: 5 } }, + }), ]); expect(dimensions).toEqual(expectedDimensions); @@ -156,6 +158,7 @@ describe('Annotation utils', () => { const expectedDimensions: AnnotationLineProps[] = [ MockAnnotationLineProps.default({ + specId: 'foo-line', linePathPoints: { x1: 0, y1: 80, @@ -163,7 +166,7 @@ describe('Annotation utils', () => { y2: 80, }, panel, - details: { detailsText: 'foo', headerText: '2' }, + datum: { dataValue: 2, details: 'foo' }, }), ]; expect(dimensions.get('foo-line')).toEqual(expectedDimensions); @@ -199,6 +202,7 @@ describe('Annotation utils', () => { const expectedDimensions: AnnotationLineProps[] = [ MockAnnotationLineProps.default({ + specId: 'foo-line', linePathPoints: { x1: 0, y1: 80, @@ -206,7 +210,7 @@ describe('Annotation utils', () => { y2: 80, }, panel: { width: 10, height: 100, top: 0, left: 0 }, - details: { detailsText: 'foo', headerText: '2' }, + datum: { dataValue: 2, details: 'foo' }, }), ]; expect(dimensions.get('foo-line')).toEqual(expectedDimensions); @@ -241,13 +245,14 @@ describe('Annotation utils', () => { const expectedDimensions: AnnotationLineProps[] = [ MockAnnotationLineProps.default({ + specId: 'foo-line', linePathPoints: { x1: 0, y1: 80, x2: 100, y2: 80, }, - details: { detailsText: 'foo', headerText: '2' }, + datum: { dataValue: 2, details: 'foo' }, }), ]; expect(dimensions.get('foo-line')).toEqual(expectedDimensions); @@ -313,13 +318,14 @@ describe('Annotation utils', () => { const expectedDimensions: AnnotationLineProps[] = [ MockAnnotationLineProps.default({ + specId: 'foo-line', linePathPoints: { x1: 12.5, y1: 0, x2: 12.5, y2: 100, }, - details: { detailsText: 'foo', headerText: 'a' }, + datum: { dataValue: 'a', details: 'foo' }, }), ]; expect(dimensions.get('foo-line')).toEqual(expectedDimensions); @@ -354,13 +360,14 @@ describe('Annotation utils', () => { const dimensions = computeAnnotationDimensionsSelector(store.getState()); const expectedDimensions: AnnotationLineProps[] = [ MockAnnotationLineProps.default({ + specId: 'foo-line', linePathPoints: { x1: 25, y1: 0, x2: 25, y2: 100, }, - details: { detailsText: 'foo', headerText: '2' }, + datum: { dataValue: 2, details: 'foo' }, }), ]; expect(dimensions.get('foo-line')).toEqual(expectedDimensions); @@ -395,13 +402,14 @@ describe('Annotation utils', () => { const dimensions = computeAnnotationDimensionsSelector(store.getState()); const expectedDimensions: AnnotationLineProps[] = [ MockAnnotationLineProps.default({ + specId: 'foo-line', linePathPoints: { x1: 25, y1: 0, x2: 25, y2: 100, }, - details: { detailsText: 'foo', headerText: '2' }, + datum: { dataValue: 2, details: 'foo' }, }), ]; expect(dimensions.get('foo-line')).toEqual(expectedDimensions); @@ -436,13 +444,14 @@ describe('Annotation utils', () => { const dimensions = computeAnnotationDimensionsSelector(store.getState()); const expectedDimensions: AnnotationLineProps[] = [ MockAnnotationLineProps.default({ + specId: 'foo-line', linePathPoints: { x1: 12.5, y1: 0, x2: 12.5, y2: 100, }, - details: { detailsText: 'foo', headerText: 'a' }, + datum: { dataValue: 'a', details: 'foo' }, }), ]; expect(dimensions.get('foo-line')).toEqual(expectedDimensions); @@ -478,6 +487,7 @@ describe('Annotation utils', () => { const dimensions = computeAnnotationDimensionsSelector(store.getState()); const expectedDimensions: AnnotationLineProps[] = [ MockAnnotationLineProps.default({ + specId: 'foo-line', linePathPoints: { x1: 12.5, y1: 0, @@ -485,7 +495,7 @@ describe('Annotation utils', () => { y2: 100, }, panel, - details: { detailsText: 'foo', headerText: '2' }, + datum: { dataValue: 2, details: 'foo' }, }), ]; expect(dimensions.get('foo-line')).toEqual(expectedDimensions); @@ -521,6 +531,7 @@ describe('Annotation utils', () => { const dimensions = computeAnnotationDimensionsSelector(store.getState()); const expectedDimensions: AnnotationLineProps[] = [ MockAnnotationLineProps.default({ + specId: 'foo-line', linePathPoints: { x1: 12.5, y1: 0, @@ -528,7 +539,7 @@ describe('Annotation utils', () => { y2: 100, }, panel, - details: { detailsText: 'foo', headerText: '2' }, + datum: { dataValue: 2, details: 'foo' }, }), ]; expect(dimensions.get('foo-line')).toEqual(expectedDimensions); @@ -563,13 +574,14 @@ describe('Annotation utils', () => { const dimensions = computeAnnotationDimensionsSelector(store.getState()); const expectedDimensions: AnnotationLineProps[] = [ MockAnnotationLineProps.default({ + specId: 'foo-line', linePathPoints: { x1: 25, y1: 0, x2: 25, y2: 100, }, - details: { detailsText: 'foo', headerText: '2' }, + datum: { dataValue: 2, details: 'foo' }, }), ]; expect(dimensions.get('foo-line')).toEqual(expectedDimensions); @@ -605,6 +617,7 @@ describe('Annotation utils', () => { const dimensions = computeAnnotationDimensionsSelector(store.getState()); const expectedDimensions: AnnotationLineProps[] = [ MockAnnotationLineProps.default({ + specId: 'foo-line', linePathPoints: { x1: 25, y1: 0, @@ -612,7 +625,7 @@ describe('Annotation utils', () => { y2: 50, }, panel, - details: { detailsText: 'foo', headerText: '2' }, + datum: { dataValue: 2, details: 'foo' }, }), ]; expect(dimensions.get('foo-line')).toEqual(expectedDimensions); diff --git a/src/chart_types/xy_chart/annotations/line/dimensions.ts b/src/chart_types/xy_chart/annotations/line/dimensions.ts index 3a17155010..6165b3d568 100644 --- a/src/chart_types/xy_chart/annotations/line/dimensions.ts +++ b/src/chart_types/xy_chart/annotations/line/dimensions.ts @@ -23,6 +23,7 @@ import { isContinuousScale, isBandScale } from '../../../../scales/types'; import { isNil, Position, Rotation } from '../../../../utils/commons'; import { Dimensions, Size } from '../../../../utils/dimensions'; import { GroupId } from '../../../../utils/ids'; +import { mergeWithDefaultAnnotationLine } from '../../../../utils/themes/theme'; import { SmallMultipleScales } from '../../state/selectors/compute_small_multiple_scales'; import { isHorizontalRotation } from '../../state/utils/common'; import { computeXScaleOffset } from '../../state/utils/utils'; @@ -31,23 +32,23 @@ import { AnnotationDomainTypes, LineAnnotationSpec, LineAnnotationDatum } from ' import { AnnotationMarker } from '../types'; import { AnnotationLineProps } from './types'; -/** @internal */ -export const DEFAULT_LINE_OVERFLOW = 0; - function computeYDomainLineAnnotationDimensions( annotationSpec: LineAnnotationSpec, yScale: Scale, { vertical, horizontal }: SmallMultipleScales, chartRotation: Rotation, - lineColor: string, axisPosition?: Position, ): AnnotationLineProps[] { const { + id: specId, dataValues, marker, - markerDimensions = { width: 0, height: 0 }, + markerDimensions, markerPosition: specMarkerPosition, + style, } = annotationSpec; + const lineStyle = mergeWithDefaultAnnotationLine(style); + const lineColor = lineStyle?.line?.stroke ?? 'red'; const isHorizontalChartRotation = isHorizontalRotation(chartRotation); // let's use a default Bottom-X/Left-Y axis orientation if we are not showing an axis // but we are displaying a line annotation @@ -88,24 +89,28 @@ function computeYDomainLineAnnotationDimensions( const markerPosition = getMarkerPositionForYAnnotation( panelSize, chartRotation, - markerDimensions, anchorPosition, annotationValueYPosition, + markerDimensions, ); + const linePathPoints = getYLinePath({ width, height }, annotationValueYPosition); const annotationMarker: AnnotationMarker | undefined = marker ? { icon: marker, color: lineColor, - dimension: { ...markerDimensions }, + dimension: markerDimensions, position: { - top: markerPosition.top, - left: markerPosition.left, + ...markerPosition, }, + alignment: anchorPosition, } : undefined; const lineProp: AnnotationLineProps = { + specId, + id: `${lineProps.length}`, + datum, linePathPoints, marker: annotationMarker, panel: { @@ -113,10 +118,11 @@ function computeYDomainLineAnnotationDimensions( top: topPos, left: leftPos, }, - details: { - detailsText: datum.details, - headerText: datum.header || dataValue.toString(), - }, + // details: { + // detailsText: datum.details, + // // we should allow showing empty string as header + // headerText: datum.header ?? dataValue.toString(), + // }, }; lineProps.push(lineProp); @@ -132,16 +138,19 @@ function computeXDomainLineAnnotationDimensions( xScale: Scale, { vertical, horizontal }: SmallMultipleScales, chartRotation: Rotation, - lineColor: string, isHistogramMode: boolean, axisPosition?: Position, ): AnnotationLineProps[] { const { + id: specId, dataValues, marker, - markerDimensions = { width: 0, height: 0 }, + markerDimensions, markerPosition: specMarkerPosition, + style, } = annotationSpec; + const lineStyle = mergeWithDefaultAnnotationLine(style); + const lineColor = lineStyle?.line?.stroke ?? 'red'; const lineProps: AnnotationLineProps[] = []; const isHorizontalChartRotation = isHorizontalRotation(chartRotation); @@ -198,9 +207,9 @@ function computeXDomainLineAnnotationDimensions( const markerPosition = getMarkerPositionForXAnnotation( panelSize, chartRotation, - markerDimensions, anchorPosition, annotationValueXPosition, + markerDimensions, ); const linePathPoints = getXLinePath({ width, height }, annotationValueXPosition); @@ -209,19 +218,23 @@ function computeXDomainLineAnnotationDimensions( ? { icon: marker, color: lineColor, - dimension: { ...markerDimensions }, + dimension: markerDimensions, position: { - top: markerPosition.top, - left: markerPosition.left, + ...markerPosition, }, + alignment: anchorPosition, } : undefined; const lineProp: AnnotationLineProps = { + specId, + id: `${lineProps.length}`, + datum, linePathPoints, - details: { - detailsText: datum.details, - headerText: datum.header || dataValue.toString(), - }, + // details: { + // detailsText: datum.details, + // // we should allow showing empty string as header + // headerText: datum.header ?? dataValue.toString(), + // }, marker: annotationMarker, panel: { ...panelSize, @@ -253,17 +266,12 @@ export function computeLineAnnotationDimensions( return null; } - // this type is guaranteed as this has been merged with default - const lineStyle = annotationSpec.style; - const lineColor = lineStyle?.line?.stroke ?? 'red'; - if (domainType === AnnotationDomainTypes.XDomain) { return computeXDomainLineAnnotationDimensions( annotationSpec, xScale, smallMultipleScales, chartRotation, - lineColor, isHistogramMode, axisPosition, ); @@ -280,7 +288,6 @@ export function computeLineAnnotationDimensions( yScale, smallMultipleScales, chartRotation, - lineColor, axisPosition, ); } @@ -343,9 +350,9 @@ function getYLinePath({ width }: Size, value: number): Line { export function getMarkerPositionForXAnnotation( { width, height }: Size, rotation: Rotation, - { width: mWidth, height: mHeight }: Size, position: Position, value: number, + { width: mWidth, height: mHeight }: Size = { width: 0, height: 0 }, ): Pick { switch (position) { case Position.Right: @@ -375,13 +382,10 @@ export function getMarkerPositionForXAnnotation( function getMarkerPositionForYAnnotation( { width, height }: Size, rotation: Rotation, - { width: mWidth, height: mHeight }: Size, position: Position, value: number, -): { - top: number; - left: number; -} { + { width: mWidth, height: mHeight }: Size = { width: 0, height: 0 }, +): Pick { switch (position) { case Position.Right: return { diff --git a/src/chart_types/xy_chart/annotations/line/line.test.tsx b/src/chart_types/xy_chart/annotations/line/line.test.tsx index f06fa1e3ec..30301dd959 100644 --- a/src/chart_types/xy_chart/annotations/line/line.test.tsx +++ b/src/chart_types/xy_chart/annotations/line/line.test.tsx @@ -83,13 +83,13 @@ describe('annotation marker', () => { x2: 100, y2: 80, }, - details: { detailsText: 'foo', headerText: '2' }, - + specId: 'foo-line', + datum: { dataValue: 2, details: 'foo' }, marker: { icon:
, color: '#777', - dimension: { width: 0, height: 0 }, position: { left: -0, top: 80 }, + alignment: 'left', }, }), ]; @@ -121,12 +121,13 @@ describe('annotation marker', () => { x2: 100, y2: 80, }, - details: { detailsText: 'foo', headerText: '2' }, + specId: 'foo-line', + datum: { dataValue: 2, details: 'foo' }, marker: { icon:
, color: '#777', - dimension: { width: 0, height: 0 }, position: { left: -0, top: 20 }, + alignment: 'left', }, }), ]; @@ -148,7 +149,8 @@ describe('annotation marker', () => { const expectedDimensions: AnnotationLineProps[] = [ MockAnnotationLineProps.default({ - details: { detailsText: 'foo', headerText: '2' }, + specId: 'foo-line', + datum: { dataValue: 2, details: 'foo' }, linePathPoints: { x1: 20, y1: 0, @@ -158,8 +160,8 @@ describe('annotation marker', () => { marker: { icon:
, color: '#777', - dimension: { width: 0, height: 0 }, position: { top: 100, left: 20 }, + alignment: 'bottom', }, }), ]; diff --git a/src/chart_types/xy_chart/annotations/line/tooltip.test.ts b/src/chart_types/xy_chart/annotations/line/tooltip.test.ts deleted file mode 100644 index 6a959e510b..0000000000 --- a/src/chart_types/xy_chart/annotations/line/tooltip.test.ts +++ /dev/null @@ -1,364 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import React from 'react'; - -import { ChartTypes } from '../../..'; -import { MockAnnotationLineProps, MockAnnotationRectProps } from '../../../../mocks/annotations/annotations'; -import { MockGlobalSpec } from '../../../../mocks/specs/specs'; -import { SpecTypes } from '../../../../specs/constants'; -import { Position, Rotation } from '../../../../utils/commons'; -import { Dimensions } from '../../../../utils/dimensions'; -import { AnnotationId } from '../../../../utils/ids'; -import { Point } from '../../../../utils/point'; -import { DEFAULT_ANNOTATION_LINE_STYLE } from '../../../../utils/themes/theme'; -import { - AnnotationDomainTypes, - AnnotationSpec, - AnnotationTypes, - AxisSpec, - LineAnnotationSpec, - RectAnnotationSpec, -} from '../../utils/specs'; -import { computeAnnotationTooltipState } from '../tooltip'; -import { AnnotationDimensions, AnnotationTooltipState } from '../types'; -import { computeLineAnnotationTooltipState } from './tooltip'; -import { AnnotationLineProps } from './types'; - -describe('Annotation tooltips', () => { - const groupId = 'foo-group'; - const chartDimensions: Dimensions = { - width: 10, - height: 20, - top: 5, - left: 15, - }; - const horizontalAxisSpec = MockGlobalSpec.axis({ - groupId, - position: Position.Bottom, - }); - const verticalAxisSpec = MockGlobalSpec.axis({ - groupId, - position: Position.Left, - }); - test('should compute the tooltip state for an annotation line', () => { - const cursorPosition: Point = { x: 16, y: 7 }; - const annotationLines: AnnotationLineProps[] = [ - MockAnnotationLineProps.default({ - linePathPoints: { - x1: 1, - y1: 2, - x2: 3, - y2: 4, - }, - marker: { - icon: React.createElement('div'), - color: 'red', - dimension: { width: 10, height: 10 }, - position: { top: 0, left: 0 }, - }, - }), - MockAnnotationLineProps.default({ - linePathPoints: { - x1: 0, - y1: 10, - x2: 20, - y2: 10, - }, - marker: { - icon: React.createElement('div'), - color: 'red', - dimension: { width: 20, height: 20 }, - position: { top: 0, left: 0 }, - }, - }), - ]; - const localAxesSpecs: AxisSpec[] = []; - // missing annotation axis (xDomain) - const missingTooltipState = computeLineAnnotationTooltipState( - cursorPosition, - annotationLines, - groupId, - AnnotationDomainTypes.XDomain, - localAxesSpecs, - chartDimensions, - ); - - expect(missingTooltipState).toBeNull(); - - // add axis for xDomain annotation - localAxesSpecs.push(horizontalAxisSpec); - - const xDomainTooltipState = computeLineAnnotationTooltipState( - cursorPosition, - annotationLines, - groupId, - AnnotationDomainTypes.XDomain, - localAxesSpecs, - chartDimensions, - ); - const expectedXDomainTooltipState = { - isVisible: true, - annotationType: AnnotationTypes.Line, - anchor: { - height: 10, - left: 15, - top: 5, - width: 10, - }, - }; - expect(xDomainTooltipState).toMatchObject(expectedXDomainTooltipState); - - // rotated xDomain - const xDomainRotatedTooltipState = computeLineAnnotationTooltipState( - { x: 24, y: 23 }, - annotationLines, - groupId, - AnnotationDomainTypes.XDomain, - localAxesSpecs, - chartDimensions, - ); - const expectedXDomainRotatedTooltipState: AnnotationTooltipState = { - isVisible: true, - anchor: { - left: 15, - top: 5, - }, - annotationType: AnnotationTypes.Line, - }; - - expect(xDomainRotatedTooltipState).toMatchObject(expectedXDomainRotatedTooltipState); - - // add axis for yDomain annotation - localAxesSpecs.push(verticalAxisSpec); - - const yDomainTooltipState = computeLineAnnotationTooltipState( - cursorPosition, - annotationLines, - groupId, - AnnotationDomainTypes.YDomain, - localAxesSpecs, - chartDimensions, - ); - const expectedYDomainTooltipState: AnnotationTooltipState = { - isVisible: true, - anchor: { - left: 15, - top: 5, - }, - annotationType: AnnotationTypes.Line, - }; - - expect(yDomainTooltipState).toMatchObject(expectedYDomainTooltipState); - - const flippedYDomainTooltipState = computeLineAnnotationTooltipState( - { x: 24, y: 23 }, - annotationLines, - groupId, - AnnotationDomainTypes.YDomain, - localAxesSpecs, - chartDimensions, - ); - const expectedFlippedYDomainTooltipState: AnnotationTooltipState = { - isVisible: true, - anchor: { - left: 15, - top: 5, - }, - annotationType: AnnotationTypes.Line, - }; - - expect(flippedYDomainTooltipState).toMatchObject(expectedFlippedYDomainTooltipState); - - const rotatedYDomainTooltipState = computeLineAnnotationTooltipState( - { x: 25, y: 15 }, - annotationLines, - groupId, - AnnotationDomainTypes.YDomain, - localAxesSpecs, - chartDimensions, - ); - const expectedRotatedYDomainTooltipState: AnnotationTooltipState = { - isVisible: true, - anchor: { - left: 15, - top: 5, - }, - annotationType: AnnotationTypes.Line, - }; - - expect(rotatedYDomainTooltipState).toMatchObject(expectedRotatedYDomainTooltipState); - }); - - test('should compute the tooltip state for an annotation', () => { - const annotations: AnnotationSpec[] = []; - const annotationId = 'foo'; - const lineAnnotation: LineAnnotationSpec = { - chartType: ChartTypes.XYAxis, - specType: SpecTypes.Annotation, - annotationType: AnnotationTypes.Line, - id: annotationId, - domainType: AnnotationDomainTypes.YDomain, - dataValues: [{ dataValue: 2, details: 'foo' }], - groupId, - style: DEFAULT_ANNOTATION_LINE_STYLE, - }; - - const cursorPosition: Point = { x: 16, y: 7 }; - - const annotationLines: AnnotationLineProps[] = [ - MockAnnotationLineProps.default({ - linePathPoints: { - x1: 1, - y1: 2, - x2: 3, - y2: 4, - }, - marker: { - icon: React.createElement('div'), - color: 'red', - dimension: { width: 10, height: 10 }, - position: { top: 0, left: 0 }, - }, - }), - ]; - const chartRotation: Rotation = 0; - const localAxesSpecs: AxisSpec[] = []; - - const annotationDimensions = new Map(); - annotationDimensions.set(annotationId, annotationLines); - - // missing annotations - const missingSpecTooltipState = computeAnnotationTooltipState( - cursorPosition, - annotationDimensions, - annotations, - chartRotation, - localAxesSpecs, - chartDimensions, - ); - - expect(missingSpecTooltipState).toBe(null); - - // add valid annotation axis - annotations.push(lineAnnotation); - localAxesSpecs.push(verticalAxisSpec); - - // hide tooltipState - lineAnnotation.hideTooltips = true; - - const hideTooltipState = computeAnnotationTooltipState( - cursorPosition, - annotationDimensions, - annotations, - chartRotation, - localAxesSpecs, - chartDimensions, - ); - - expect(hideTooltipState).toBe(null); - - // show tooltipState, hide lines - lineAnnotation.hideTooltips = false; - lineAnnotation.hideLines = true; - - const hideLinesTooltipState = computeAnnotationTooltipState( - cursorPosition, - annotationDimensions, - annotations, - chartRotation, - localAxesSpecs, - chartDimensions, - ); - - expect(hideLinesTooltipState).toBe(null); - - // show tooltipState & lines - lineAnnotation.hideTooltips = false; - lineAnnotation.hideLines = false; - - const tooltipState = computeAnnotationTooltipState( - cursorPosition, - annotationDimensions, - annotations, - chartRotation, - localAxesSpecs, - chartDimensions, - ); - - const expectedTooltipState = { - isVisible: true, - annotationType: AnnotationTypes.Line, - anchor: { - height: 10, - left: 15, - top: 5, - width: 10, - }, - }; - - expect(tooltipState).toMatchObject(expectedTooltipState); - - // rect annotation tooltip - const annotationRectangle: RectAnnotationSpec = { - chartType: ChartTypes.XYAxis, - specType: SpecTypes.Annotation, - id: 'rect', - groupId, - annotationType: AnnotationTypes.Rectangle, - dataValues: [{ coordinates: { x0: 1, x1: 2, y0: 3, y1: 5 } }], - }; - - const rectAnnotations: RectAnnotationSpec[] = []; - rectAnnotations.push(annotationRectangle); - - annotationDimensions.set(annotationRectangle.id, [ - MockAnnotationRectProps.default({ rect: { x: 2, y: 3, width: 3, height: 5 } }), - ]); - - const rectTooltipState = computeAnnotationTooltipState( - { x: 18, y: 9 }, - annotationDimensions, - rectAnnotations, - chartRotation, - localAxesSpecs, - chartDimensions, - ); - - expect(rectTooltipState).toMatchObject({ - isVisible: true, - annotationType: AnnotationTypes.Rectangle, - anchor: { - left: 18, - top: 9, - }, - }); - annotationRectangle.hideTooltips = true; - - const rectHideTooltipState = computeAnnotationTooltipState( - { x: 3, y: 4 }, - annotationDimensions, - rectAnnotations, - chartRotation, - localAxesSpecs, - chartDimensions, - ); - - expect(rectHideTooltipState).toBe(null); - }); -}); diff --git a/src/chart_types/xy_chart/annotations/line/tooltip.test.tsx b/src/chart_types/xy_chart/annotations/line/tooltip.test.tsx new file mode 100644 index 0000000000..4820720f0b --- /dev/null +++ b/src/chart_types/xy_chart/annotations/line/tooltip.test.tsx @@ -0,0 +1,190 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { mount } from 'enzyme'; +import React from 'react'; + +import { ChartTypes } from '../../..'; +import { Chart } from '../../../../components/chart'; +import { MockAnnotationLineProps, MockAnnotationRectProps } from '../../../../mocks/annotations/annotations'; +import { ScaleType } from '../../../../scales/constants'; +import { SpecTypes } from '../../../../specs/constants'; +import { Settings } from '../../../../specs/settings'; +import { Rotation } from '../../../../utils/commons'; +import { Dimensions } from '../../../../utils/dimensions'; +import { AnnotationId } from '../../../../utils/ids'; +import { LineAnnotation } from '../../specs/line_annotation'; +import { LineSeries } from '../../specs/line_series'; +import { AnnotationDomainTypes, AnnotationTypes, AxisSpec, RectAnnotationSpec } from '../../utils/specs'; +import { computeRectAnnotationTooltipState } from '../tooltip'; +import { AnnotationDimensions } from '../types'; +import { AnnotationLineProps } from './types'; + +describe('Annotation tooltips', () => { + describe('Line annotation tooltips', () => { + test('should show tooltip on mouseenter', () => { + const wrapper = mount( + + + + } + /> + , + ); + const annotation = wrapper.find('.echAnnotation'); + expect(annotation).toHaveLength(1); + expect(wrapper.find('.echAnnotation__tooltip')).toHaveLength(0); + annotation.simulate('mouseenter'); + const header = wrapper.find('.echAnnotation__header'); + expect(header).toHaveLength(1); + expect(header.text()).toEqual('2'); + expect(wrapper.find('.echAnnotation__details').text()).toEqual('foo'); + annotation.simulate('mouseleave'); + expect(wrapper.find('.echAnnotation__header')).toHaveLength(0); + }); + + test('should now show tooltip if hidden', () => { + const wrapper = mount( + + + + } + hideTooltips + /> + , + ); + const annotation = wrapper.find('.echAnnotation'); + expect(wrapper.find('.echAnnotation__tooltip')).toHaveLength(0); + annotation.simulate('mouseenter'); + expect(wrapper.find('.echAnnotation__header')).toHaveLength(0); + }); + }); + + test('should compute the tooltip state for rect annotation', () => { + const groupId = 'foo-group'; + const chartDimensions: Dimensions = { + width: 10, + height: 20, + top: 5, + left: 15, + }; + const annotationLines: AnnotationLineProps[] = [ + MockAnnotationLineProps.default({ + specId: 'foo', + linePathPoints: { + x1: 1, + y1: 2, + x2: 3, + y2: 4, + }, + marker: { + icon: React.createElement('div'), + color: 'red', + dimension: { width: 10, height: 10 }, + position: { top: 0, left: 0 }, + }, + }), + ]; + const chartRotation: Rotation = 0; + const localAxesSpecs: AxisSpec[] = []; + + const annotationDimensions = new Map(); + annotationDimensions.set('foo', annotationLines); + + // rect annotation tooltip + const annotationRectangle: RectAnnotationSpec = { + chartType: ChartTypes.XYAxis, + specType: SpecTypes.Annotation, + id: 'rect', + groupId, + annotationType: AnnotationTypes.Rectangle, + dataValues: [{ coordinates: { x0: 1, x1: 2, y0: 3, y1: 5 } }], + }; + + const rectAnnotations: RectAnnotationSpec[] = []; + rectAnnotations.push(annotationRectangle); + + annotationDimensions.set(annotationRectangle.id, [ + MockAnnotationRectProps.default({ rect: { x: 2, y: 3, width: 3, height: 5 } }), + ]); + + const rectTooltipState = computeRectAnnotationTooltipState( + { x: 18, y: 9 }, + annotationDimensions, + rectAnnotations, + chartRotation, + localAxesSpecs, + chartDimensions, + ); + + expect(rectTooltipState).toMatchObject({ + isVisible: true, + annotationType: AnnotationTypes.Rectangle, + anchor: { + left: 18, + top: 9, + }, + }); + annotationRectangle.hideTooltips = true; + + const rectHideTooltipState = computeRectAnnotationTooltipState( + { x: 3, y: 4 }, + annotationDimensions, + rectAnnotations, + chartRotation, + localAxesSpecs, + chartDimensions, + ); + + expect(rectHideTooltipState).toBe(null); + }); +}); diff --git a/src/chart_types/xy_chart/annotations/line/tooltip.ts b/src/chart_types/xy_chart/annotations/line/tooltip.ts deleted file mode 100644 index d4112a8119..0000000000 --- a/src/chart_types/xy_chart/annotations/line/tooltip.ts +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { Dimensions } from '../../../../utils/dimensions'; -import { GroupId } from '../../../../utils/ids'; -import { Point } from '../../../../utils/point'; -import { getAxesSpecForSpecId } from '../../state/utils/spec'; -import { AnnotationDomainType, AnnotationTypes, AxisSpec } from '../../utils/specs'; -import { isWithinRectBounds } from '../rect/dimensions'; -import { AnnotationTooltipState, AnnotationMarker, Bounds } from '../types'; -import { isXDomain, getTransformedCursor, invertTranformedCursor } from '../utils'; -import { AnnotationLineProps } from './types'; - -/** @internal */ -export function computeLineAnnotationTooltipState( - cursorPosition: Point, - annotationLines: AnnotationLineProps[], - groupId: GroupId, - domainType: AnnotationDomainType, - axesSpecs: AxisSpec[], - chartDimensions: Dimensions, -): AnnotationTooltipState | null { - const { xAxis, yAxis } = getAxesSpecForSpecId(axesSpecs, groupId); - const isXDomainAnnotation = isXDomain(domainType); - const annotationAxis = isXDomainAnnotation ? xAxis : yAxis; - - if (!annotationAxis) { - return null; - } - // get cursor point relative to the rendering area (within the chartDimension margins) - const projectedPointer = getTransformedCursor(cursorPosition, chartDimensions, null, true); - const totalAnnotationLines = annotationLines.length; - for (let i = 0; i < totalAnnotationLines; i++) { - const line = annotationLines[i]; - - if (isWithinLineMarkerBounds(projectedPointer, line.panel, line.marker)) { - const position = invertTranformedCursor( - { - x: line.marker.position.left, - y: line.marker.position.top, - }, - chartDimensions, - null, - true, - ); - return { - annotationType: AnnotationTypes.Line, - isVisible: true, - anchor: { - top: position.y + line.panel.top, - left: position.x + line.panel.left, - ...line.marker.dimension, - }, - ...(line.details && { header: line.details.headerText }), - ...(line.details && { details: line.details.detailsText }), - }; - } - } - - return null; -} - -/** - * Checks if the cursorPosition is within the line annotation marker - * @param cursorPosition the cursor position relative to the projected area - * @param panel - * @param marker the line annotation marker - */ -function isWithinLineMarkerBounds( - cursorPosition: Point, - panel: Dimensions, - marker?: AnnotationMarker, -): marker is AnnotationMarker { - if (!marker) { - return false; - } - const { - position: { top, left }, - dimension: { width, height }, - } = marker; - const markerRect: Bounds = { - startX: left + panel.left, - startY: top + panel.top, - endX: left + panel.left + width, - endY: top + panel.top + height, - }; - return isWithinRectBounds(cursorPosition, markerRect); -} diff --git a/src/chart_types/xy_chart/annotations/line/types.ts b/src/chart_types/xy_chart/annotations/line/types.ts index 5ad78b9cfb..08d74e16ee 100644 --- a/src/chart_types/xy_chart/annotations/line/types.ts +++ b/src/chart_types/xy_chart/annotations/line/types.ts @@ -19,15 +19,18 @@ import { Line } from '../../../../geoms/types'; import { Dimensions } from '../../../../utils/dimensions'; -import { AnnotationDetails, AnnotationMarker } from '../types'; +import { LineAnnotationDatum } from '../../utils/specs'; +import { AnnotationMarker } from '../types'; /** @internal */ export interface AnnotationLineProps { + specId: string; + id: string; + datum: LineAnnotationDatum; /** * The path points of a line annotation */ linePathPoints: Line; - details: AnnotationDetails; marker?: AnnotationMarker; panel: Dimensions; } diff --git a/src/chart_types/xy_chart/annotations/rect/dimensions.ts b/src/chart_types/xy_chart/annotations/rect/dimensions.ts index f5ff20195e..13c8ffd321 100644 --- a/src/chart_types/xy_chart/annotations/rect/dimensions.ts +++ b/src/chart_types/xy_chart/annotations/rect/dimensions.ts @@ -45,14 +45,13 @@ export function computeRectAnnotationDimensions( smallMultiplesScales: SmallMultipleScales, isHistogram: boolean = false, ): AnnotationRectProps[] | null { - const { dataValues } = annotationSpec; - const { groupId } = annotationSpec; + const { id, dataValues, groupId } = annotationSpec; const yScale = yScales.get(groupId); const rectsProps: Omit[] = []; const panelSize = getPanelSize(smallMultiplesScales); - dataValues.forEach((dataValue: RectAnnotationDatum) => { - const { x0: initialX0, x1: initialX1, y0: initialY0, y1: initialY1 } = dataValue.coordinates; + dataValues.forEach((datum: RectAnnotationDatum) => { + const { x0: initialX0, x1: initialX1, y0: initialY0, y1: initialY1 } = datum.coordinates; // if everything is null, return; otherwise we coerce the other coordinates if (initialX0 == null && initialX1 == null && initialY0 == null && initialY1 == null) { @@ -86,8 +85,9 @@ export function computeRectAnnotationDimensions( }; rectsProps.push({ + specId: id, rect: rectDimensions, - details: dataValue.details, + datum, }); } return; @@ -119,8 +119,9 @@ export function computeRectAnnotationDimensions( }; rectsProps.push({ + specId: id, rect: rectDimensions, - details: dataValue.details, + datum, }); }); diff --git a/src/chart_types/xy_chart/annotations/rect/tooltip.test.ts b/src/chart_types/xy_chart/annotations/rect/tooltip.test.ts index f4012ea97b..38b805e3b4 100644 --- a/src/chart_types/xy_chart/annotations/rect/tooltip.test.ts +++ b/src/chart_types/xy_chart/annotations/rect/tooltip.test.ts @@ -16,10 +16,12 @@ * specific language governing permissions and limitations * under the License. */ +import { MockAnnotationRectProps } from '../../../../mocks/annotations/annotations'; import { Dimensions } from '../../../../utils/dimensions'; import { AnnotationTypes } from '../../utils/specs'; import { AnnotationTooltipState } from '../types'; -import { computeRectAnnotationTooltipState } from './tooltip'; +import { getRectAnnotationTooltipState } from './tooltip'; +import { AnnotationRectProps } from './types'; describe('Rect annotation tooltip', () => { test('should compute tooltip state for rect annotation', () => { @@ -30,11 +32,15 @@ describe('Rect annotation tooltip', () => { left: 15, }; const cursorPosition = { x: 18, y: 9 }; - const annotationRects = [ - { rect: { x: 2, y: 3, width: 3, height: 5 }, panel: { top: 0, left: 0, width: 10, height: 20 } }, + const annotationRects: AnnotationRectProps[] = [ + MockAnnotationRectProps.default({ + rect: { x: 2, y: 3, width: 3, height: 5 }, + panel: { top: 0, left: 0, width: 10, height: 20 }, + datum: { coordinates: { x0: 0, x1: 10, y0: 0, y1: 10 } }, + }), ]; - const visibleTooltip = computeRectAnnotationTooltipState(cursorPosition, annotationRects, 0, chartDimensions); + const visibleTooltip = getRectAnnotationTooltipState(cursorPosition, annotationRects, 0, chartDimensions); const expectedVisibleTooltipState: AnnotationTooltipState = { isVisible: true, annotationType: AnnotationTypes.Rectangle, @@ -42,6 +48,7 @@ describe('Rect annotation tooltip', () => { top: cursorPosition.y, left: cursorPosition.x, }, + datum: { coordinates: { x0: 0, x1: 10, y0: 0, y1: 10 } }, }; expect(visibleTooltip).toEqual(expectedVisibleTooltipState); diff --git a/src/chart_types/xy_chart/annotations/rect/tooltip.ts b/src/chart_types/xy_chart/annotations/rect/tooltip.ts index cb8d3defbe..071ee181ad 100644 --- a/src/chart_types/xy_chart/annotations/rect/tooltip.ts +++ b/src/chart_types/xy_chart/annotations/rect/tooltip.ts @@ -28,7 +28,7 @@ import { isWithinRectBounds } from './dimensions'; import { AnnotationRectProps } from './types'; /** @internal */ -export function computeRectAnnotationTooltipState( +export function getRectAnnotationTooltipState( cursorPosition: Point, annotationRects: AnnotationRectProps[], rotation: Rotation, @@ -38,7 +38,7 @@ export function computeRectAnnotationTooltipState( for (let i = 0; i < totalAnnotationRect; i++) { const rectProps = annotationRects[i]; - const { details, panel } = rectProps; + const { panel, datum } = rectProps; const rect = transformRotateRect(rectProps.rect, rotation, panel); @@ -56,7 +56,7 @@ export function computeRectAnnotationTooltipState( left: cursorPosition.x, top: cursorPosition.y, }, - ...(details && { details }), + datum, }; } } diff --git a/src/chart_types/xy_chart/annotations/rect/types.ts b/src/chart_types/xy_chart/annotations/rect/types.ts index 0102654f6a..d8780d1868 100644 --- a/src/chart_types/xy_chart/annotations/rect/types.ts +++ b/src/chart_types/xy_chart/annotations/rect/types.ts @@ -17,8 +17,14 @@ * under the License. */ import { Dimensions } from '../../../../utils/dimensions'; +import { RectAnnotationDatum } from '../../utils/specs'; +/** + * @internal + */ export interface AnnotationRectProps { + specId: string; + datum: RectAnnotationDatum; rect: { x: number; y: number; @@ -26,5 +32,4 @@ export interface AnnotationRectProps { height: number; }; panel: Dimensions; - details?: string; } diff --git a/src/chart_types/xy_chart/annotations/tooltip.ts b/src/chart_types/xy_chart/annotations/tooltip.ts index c5e9c32edb..7a9b0f9bfc 100644 --- a/src/chart_types/xy_chart/annotations/tooltip.ts +++ b/src/chart_types/xy_chart/annotations/tooltip.ts @@ -22,15 +22,13 @@ import { Rotation } from '../../../utils/commons'; import { Dimensions } from '../../../utils/dimensions'; import { AnnotationId } from '../../../utils/ids'; import { Point } from '../../../utils/point'; -import { AnnotationSpec, AxisSpec, isLineAnnotation, isRectAnnotation } from '../utils/specs'; -import { computeLineAnnotationTooltipState } from './line/tooltip'; -import { AnnotationLineProps } from './line/types'; -import { computeRectAnnotationTooltipState } from './rect/tooltip'; +import { AnnotationSpec, AxisSpec, isRectAnnotation } from '../utils/specs'; +import { getRectAnnotationTooltipState } from './rect/tooltip'; import { AnnotationRectProps } from './rect/types'; import { AnnotationDimensions, AnnotationTooltipState } from './types'; /** @internal */ -export function computeAnnotationTooltipState( +export function computeRectAnnotationTooltipState( cursorPosition: Point, annotationDimensions: Map, annotationSpecs: AnnotationSpec[], @@ -40,7 +38,7 @@ export function computeAnnotationTooltipState( ): AnnotationTooltipState | null { // allow picking up the last spec added as the top most or use it's zIndex value const sortedAnnotationSpecs = annotationSpecs - .slice() + .filter(isRectAnnotation) .reverse() .sort(({ zIndex: a = Number.MIN_SAFE_INTEGER }, { zIndex: b = Number.MIN_SAFE_INTEGER }) => b - a); @@ -50,47 +48,24 @@ export function computeAnnotationTooltipState( if (spec.hideTooltips || !annotationDimension) { continue; } - const { groupId, customTooltip, customTooltipDetails } = spec; + const { customTooltip, customTooltipDetails } = spec; const tooltipSettings = getTooltipSettings(spec); - if (isLineAnnotation(spec)) { - if (spec.hideLines) { - continue; - } - const lineAnnotationTooltipState = computeLineAnnotationTooltipState( - cursorPosition, - annotationDimension as AnnotationLineProps[], - groupId, - spec.domainType, - axesSpecs, - chartDimensions, - ); + const rectAnnotationTooltipState = getRectAnnotationTooltipState( + cursorPosition, + annotationDimension as AnnotationRectProps[], + chartRotation, + chartDimensions, + ); - if (lineAnnotationTooltipState) { - return { - ...lineAnnotationTooltipState, - tooltipSettings, - customTooltip, - customTooltipDetails, - }; - } - } else if (isRectAnnotation(spec)) { - const rectAnnotationTooltipState = computeRectAnnotationTooltipState( - cursorPosition, - annotationDimension as AnnotationRectProps[], - chartRotation, - chartDimensions, - ); - - if (rectAnnotationTooltipState) { - return { - ...rectAnnotationTooltipState, - tooltipSettings, - customTooltip, - customTooltipDetails: customTooltipDetails ?? spec.renderTooltip, - }; - } + if (rectAnnotationTooltipState) { + return { + ...rectAnnotationTooltipState, + tooltipSettings, + customTooltip, + customTooltipDetails: customTooltipDetails ?? spec.renderTooltip, + }; } } diff --git a/src/chart_types/xy_chart/annotations/types.ts b/src/chart_types/xy_chart/annotations/types.ts index af5467bca8..419e80b9a5 100644 --- a/src/chart_types/xy_chart/annotations/types.ts +++ b/src/chart_types/xy_chart/annotations/types.ts @@ -21,7 +21,7 @@ import { ComponentType } from 'react'; import { TooltipPortalSettings } from '../../../components/portal'; import { Position, Color } from '../../../utils/commons'; -import { AnnotationType } from '../utils/specs'; +import { AnnotationType, LineAnnotationDatum, RectAnnotationDatum } from '../utils/specs'; import { AnnotationLineProps } from './line/types'; import { AnnotationRectProps } from './rect/types'; @@ -32,6 +32,7 @@ export type AnnotationTooltipFormatter = (details?: string) => JSX.Element | nul export type CustomAnnotationTooltip = ComponentType<{ header?: string; details?: string; + datum: LineAnnotationDatum | RectAnnotationDatum; }> | null; /** @@ -53,10 +54,11 @@ export interface AnnotationMarker { top: number; left: number; }; - dimension: { + dimension?: { width: number; height: number; }; + alignment: Position; color: Color; } @@ -64,8 +66,7 @@ export interface AnnotationMarker { export interface AnnotationTooltipState { isVisible: true; annotationType: AnnotationType; - header?: string; - details?: string; + datum: LineAnnotationDatum | RectAnnotationDatum; anchor: { position?: Position; top: number; diff --git a/src/chart_types/xy_chart/renderer/dom/annotations/_annotations.scss b/src/chart_types/xy_chart/renderer/dom/annotations/_annotations.scss index 227e50981d..dfd7f6cba1 100644 --- a/src/chart_types/xy_chart/renderer/dom/annotations/_annotations.scss +++ b/src/chart_types/xy_chart/renderer/dom/annotations/_annotations.scss @@ -1,5 +1,4 @@ .echAnnotation { - pointer-events: none; position: absolute; user-select: none; font-size: $euiFontSizeXS; diff --git a/src/chart_types/xy_chart/renderer/dom/annotations/annotations.tsx b/src/chart_types/xy_chart/renderer/dom/annotations/annotations.tsx index 135780d5f0..79e6a98e4d 100644 --- a/src/chart_types/xy_chart/renderer/dom/annotations/annotations.tsx +++ b/src/chart_types/xy_chart/renderer/dom/annotations/annotations.tsx @@ -21,12 +21,18 @@ import React, { useCallback } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators, Dispatch } from 'redux'; +import { + DOMElementType, + onDOMElementEnter as onDOMElementEnterAction, + onDOMElementLeave as onDOMElementLeaveAction, +} from '../../../../../state/actions/dom_element'; import { onPointerMove as onPointerMoveAction } from '../../../../../state/actions/mouse'; import { GlobalChartState, BackwardRef } from '../../../../../state/chart_state'; import { getInternalIsInitializedSelector, InitStatus, } from '../../../../../state/selectors/get_internal_is_intialized'; +import { Position } from '../../../../../utils/commons'; import { Dimensions } from '../../../../../utils/dimensions'; import { AnnotationId } from '../../../../../utils/ids'; import { AnnotationLineProps } from '../../../annotations/line/types'; @@ -42,6 +48,8 @@ import { AnnotationTooltip } from './annotation_tooltip'; interface AnnotationsDispatchProps { onPointerMove: typeof onPointerMoveAction; + onDOMElementEnter: typeof onDOMElementEnterAction; + onDOMElementLeave: typeof onDOMElementLeaveAction; } interface AnnotationsStateProps { @@ -59,25 +67,56 @@ interface AnnotationsOwnProps { type AnnotationsProps = AnnotationsDispatchProps & AnnotationsStateProps & AnnotationsOwnProps; +function getMarkerCentredTransform(alignment: Position, hasMarkerDimensions: boolean): string | undefined { + if (hasMarkerDimensions) { + return undefined; + } + switch (alignment) { + case Position.Right: + return `translate(-50%, 0%)`; + case Position.Left: + return `translate(-100%, -50%)`; + case Position.Top: + return `translate(-50%, -100%)`; + case Position.Bottom: + default: + return `translate(-50%, 0%)`; + } +} + function renderAnnotationLineMarkers( chartDimensions: Dimensions, annotationLines: AnnotationLineProps[], - id: AnnotationId, + onDOMElementEnter: typeof onDOMElementEnterAction, + onDOMElementLeave: typeof onDOMElementLeaveAction, ) { - return annotationLines.reduce((markers, { marker, panel }: AnnotationLineProps, index: number) => { + return annotationLines.reduce((markers, { id, specId, datum, marker, panel }: AnnotationLineProps) => { if (!marker) { return markers; } - const { icon, color, position } = marker; + const { icon, color, position, alignment, dimension } = marker; const style = { color, top: chartDimensions.top + position.top + panel.top, left: chartDimensions.left + position.left + panel.left, }; + const transform = { transform: getMarkerCentredTransform(alignment, Boolean(dimension)) }; markers.push( - // eslint-disable-next-line react/no-array-index-key -
+
{ + onDOMElementEnter({ + createdBySpecId: specId, + id, + type: DOMElementType.LineAnnotationMarker, + datum, + }); + }} + onMouseLeave={onDOMElementLeave} + style={{ ...style, ...transform }} + > {icon}
, ); @@ -94,6 +133,8 @@ const AnnotationsComponent = ({ getChartContainerRef, chartId, onPointerMove, + onDOMElementEnter, + onDOMElementLeave, }: AnnotationsProps) => { const renderAnnotationMarkers = useCallback((): JSX.Element[] => { const markers: JSX.Element[] = []; @@ -106,13 +147,18 @@ const AnnotationsComponent = ({ if (isLineAnnotation(annotationSpec)) { const annotationLines = dimensions as AnnotationLineProps[]; - const lineMarkers = renderAnnotationLineMarkers(chartDimensions, annotationLines, id); + const lineMarkers = renderAnnotationLineMarkers( + chartDimensions, + annotationLines, + onDOMElementEnter, + onDOMElementLeave, + ); markers.push(...lineMarkers); } }); return markers; - }, [chartDimensions, annotationDimensions, annotationSpecs]); + }, [onDOMElementEnter, onDOMElementLeave, chartDimensions, annotationDimensions, annotationSpecs]); const onScroll = useCallback(() => { onPointerMove({ x: -1, y: -1 }, new Date().getTime()); @@ -133,7 +179,14 @@ const AnnotationsComponent = ({ AnnotationsComponent.displayName = 'Annotations'; const mapDispatchToProps = (dispatch: Dispatch): AnnotationsDispatchProps => - bindActionCreators({ onPointerMove: onPointerMoveAction }, dispatch); + bindActionCreators( + { + onPointerMove: onPointerMoveAction, + onDOMElementLeave: onDOMElementLeaveAction, + onDOMElementEnter: onDOMElementEnterAction, + }, + dispatch, + ); const mapStateToProps = (state: GlobalChartState): AnnotationsStateProps => { if (getInternalIsInitializedSelector(state) !== InitStatus.Initialized) { diff --git a/src/chart_types/xy_chart/renderer/dom/annotations/tooltip_content.tsx b/src/chart_types/xy_chart/renderer/dom/annotations/tooltip_content.tsx index 023fd1d7fe..23139c7668 100644 --- a/src/chart_types/xy_chart/renderer/dom/annotations/tooltip_content.tsx +++ b/src/chart_types/xy_chart/renderer/dom/annotations/tooltip_content.tsx @@ -19,28 +19,28 @@ import React, { useCallback } from 'react'; -import { AnnotationTypes } from '../../../../specs'; +import { AnnotationTypes, LineAnnotationDatum, RectAnnotationDatum } from '../../../../specs'; import { AnnotationTooltipState } from '../../../annotations/types'; /** @internal */ export const TooltipContent = ({ annotationType, - header, - details, + datum, customTooltip: CustomTooltip, customTooltipDetails, }: AnnotationTooltipState) => { - const renderLine = useCallback( - () => ( + const renderLine = useCallback(() => { + const { details, dataValue, header = dataValue.toString() } = datum as LineAnnotationDatum; + return (

{header}

{customTooltipDetails ? customTooltipDetails(details) : details}
- ), - [header, details, customTooltipDetails], - ); + ); + }, [datum, customTooltipDetails]); const renderRect = useCallback(() => { + const { details } = datum as RectAnnotationDatum; const tooltipContent = customTooltipDetails ? customTooltipDetails(details) : details; if (!tooltipContent) { return null; @@ -53,10 +53,14 @@ export const TooltipContent = ({
); - }, [details, customTooltipDetails]); + }, [datum, customTooltipDetails]); if (CustomTooltip) { - return ; + const { details } = datum; + if ('header' in datum) { + return ; + } + return ; } switch (annotationType) { diff --git a/src/chart_types/xy_chart/specs/line_annotation.tsx b/src/chart_types/xy_chart/specs/line_annotation.tsx index 6d71d3169d..940b3d98d6 100644 --- a/src/chart_types/xy_chart/specs/line_annotation.tsx +++ b/src/chart_types/xy_chart/specs/line_annotation.tsx @@ -17,108 +17,25 @@ * under the License. */ -import React, { createRef, CSSProperties, Component } from 'react'; -import { connect } from 'react-redux'; -import { bindActionCreators, Dispatch } from 'redux'; +import React from 'react'; import { ChartTypes } from '../..'; -import { Spec } from '../../../specs'; import { SpecTypes } from '../../../specs/constants'; -import { upsertSpec as upsertSpecAction, removeSpec as removeSpecAction } from '../../../state/actions/specs'; -import { DEFAULT_ANNOTATION_LINE_STYLE, mergeWithDefaultAnnotationLine } from '../../../utils/themes/theme'; +import { getConnect, specComponentFactory } from '../../../state/spec_factory'; +import { DEFAULT_ANNOTATION_LINE_STYLE } from '../../../utils/themes/theme'; import { LineAnnotationSpec, DEFAULT_GLOBAL_ID, AnnotationTypes } from '../utils/specs'; -type InjectedProps = LineAnnotationSpec & - DispatchProps & - Readonly<{ - children?: React.ReactNode; - }>; - -/** @internal */ -export class LineAnnotationSpecComponent extends Component { - static defaultProps: Partial = { - chartType: ChartTypes.XYAxis, - specType: SpecTypes.Annotation, - groupId: DEFAULT_GLOBAL_ID, - annotationType: AnnotationTypes.Line, - style: DEFAULT_ANNOTATION_LINE_STYLE, - hideLines: false, - hideTooltips: false, - hideLinesTooltips: true, - zIndex: 1, - }; - - private markerRef = createRef(); - - componentDidMount() { - const { children, upsertSpec, removeSpec, ...config } = this.props as InjectedProps; - if (this.markerRef.current) { - const { offsetWidth, offsetHeight } = this.markerRef.current; - config.markerDimensions = { - width: offsetWidth, - height: offsetHeight, - }; - } - const style = mergeWithDefaultAnnotationLine(config.style); - const spec = { ...config, style }; - upsertSpec(spec); - } - - componentDidUpdate() { - const { upsertSpec, removeSpec, children, ...config } = this.props as InjectedProps; - if (this.markerRef.current) { - const { offsetWidth, offsetHeight } = this.markerRef.current; - config.markerDimensions = { - width: offsetWidth, - height: offsetHeight, - }; - } - const style = mergeWithDefaultAnnotationLine(config.style); - const spec = { ...config, style }; - upsertSpec(spec); - } - - componentWillUnmount() { - const { removeSpec, id } = this.props as InjectedProps; - removeSpec(id); - } - - render() { - if (!this.props.marker) { - return null; - } - - /* - * We need to get the width & height of the marker passed into the spec - * so we render the marker offscreen if one has been defined & update the config - * with the width & height. - */ - const offscreenStyle: CSSProperties = { - position: 'absolute', - left: -9999, - opacity: 0, - }; - - return ( -
- {this.props.marker} -
- ); - } -} - -interface DispatchProps { - upsertSpec: (spec: Spec) => void; - removeSpec: (id: string) => void; -} -const mapDispatchToProps = (dispatch: Dispatch): DispatchProps => - bindActionCreators( - { - upsertSpec: upsertSpecAction, - removeSpec: removeSpecAction, - }, - dispatch, - ); +const defaultProps = { + chartType: ChartTypes.XYAxis, + specType: SpecTypes.Annotation, + groupId: DEFAULT_GLOBAL_ID, + annotationType: AnnotationTypes.Line, + style: DEFAULT_ANNOTATION_LINE_STYLE, + hideLines: false, + hideTooltips: false, + hideLinesTooltips: true, + zIndex: 1, +}; type SpecRequiredProps = Pick; type SpecOptionalProps = Partial< @@ -128,11 +45,6 @@ type SpecOptionalProps = Partial< > >; -export const LineAnnotation: React.FunctionComponent = connect< - null, - DispatchProps, - LineAnnotationSpec ->( - null, - mapDispatchToProps, -)(LineAnnotationSpecComponent); +export const LineAnnotation: React.FunctionComponent = getConnect()( + specComponentFactory(defaultProps), +); diff --git a/src/chart_types/xy_chart/state/selectors/get_annotation_tooltip_state.ts b/src/chart_types/xy_chart/state/selectors/get_annotation_tooltip_state.ts index 76c405ef6d..9cb8ba85da 100644 --- a/src/chart_types/xy_chart/state/selectors/get_annotation_tooltip_state.ts +++ b/src/chart_types/xy_chart/state/selectors/get_annotation_tooltip_state.ts @@ -19,7 +19,9 @@ import createCachedSelector from 're-reselect'; +import { TooltipPortalSettings } from '../../../../components/portal/types'; import { TooltipInfo } from '../../../../components/tooltip/types'; +import { DOMElement } from '../../../../state/actions/dom_element'; import { GlobalChartState } from '../../../../state/chart_state'; import { getChartIdSelector } from '../../../../state/selectors/get_chart_id'; import { getChartRotationSelector } from '../../../../state/selectors/get_chart_rotation'; @@ -27,9 +29,10 @@ import { Rotation } from '../../../../utils/commons'; import { Dimensions } from '../../../../utils/dimensions'; import { AnnotationId } from '../../../../utils/ids'; import { Point } from '../../../../utils/point'; -import { computeAnnotationTooltipState } from '../../annotations/tooltip'; +import { AnnotationLineProps } from '../../annotations/line/types'; +import { computeRectAnnotationTooltipState } from '../../annotations/tooltip'; import { AnnotationTooltipState, AnnotationDimensions } from '../../annotations/types'; -import { AxisSpec, AnnotationSpec, AnnotationTypes } from '../../utils/specs'; +import { AxisSpec, AnnotationSpec, AnnotationTypes, LineAnnotationDatum } from '../../utils/specs'; import { ComputedGeometries } from '../utils/types'; import { computeAnnotationDimensionsSelector } from './compute_annotations'; import { computeChartDimensionsSelector } from './compute_chart_dimensions'; @@ -38,6 +41,7 @@ import { getAxisSpecsSelector, getAnnotationSpecsSelector } from './get_specs'; import { getTooltipInfoSelector } from './get_tooltip_values_highlighted_geoms'; const getCurrentPointerPosition = (state: GlobalChartState) => state.interactions.pointer.current.position; +const getHoveredDOMElement = (state: GlobalChartState) => state.interactions.hoveredDOMElement; /** @internal */ export const getAnnotationTooltipStateSelector = createCachedSelector( @@ -50,6 +54,7 @@ export const getAnnotationTooltipStateSelector = createCachedSelector( getAxisSpecsSelector, computeAnnotationDimensionsSelector, getTooltipInfoSelector, + getHoveredDOMElement, ], getAnnotationTooltipState, )(getChartIdSelector); @@ -67,7 +72,17 @@ function getAnnotationTooltipState( axesSpecs: AxisSpec[], annotationDimensions: Map, tooltip: TooltipInfo, + hoveredDOMElement: DOMElement | null, ): AnnotationTooltipState | null { + const hoveredTooltip = getTooltipStateForDOMElements( + chartDimensions, + annotationSpecs, + annotationDimensions, + hoveredDOMElement, + ); + if (hoveredTooltip) { + return hoveredTooltip; + } // get positions relative to chart if (cursorPosition.x < 0 || cursorPosition.y < 0) { return null; @@ -77,7 +92,7 @@ function getAnnotationTooltipState( if (!xScale || !yScales) { return null; } - const tooltipState = computeAnnotationTooltipState( + const tooltipState = computeRectAnnotationTooltipState( cursorPosition, annotationDimensions, annotationSpecs, @@ -99,3 +114,54 @@ function getAnnotationTooltipState( return tooltipState; } + +function getTooltipSettings({ + placement, + fallbackPlacements, + boundary, + offset, +}: AnnotationSpec): TooltipPortalSettings<'chart'> { + return { + placement, + fallbackPlacements, + boundary, + offset, + }; +} + +function getTooltipStateForDOMElements( + chartDimensions: Dimensions, + annotationSpecs: AnnotationSpec[], + annotationDimensions: Map, + hoveredDOMElement: DOMElement | null, +): AnnotationTooltipState | null { + if (!hoveredDOMElement) { + return null; + } + const spec = annotationSpecs.find(({ id }) => id === hoveredDOMElement.createdBySpecId); + if (!spec || spec.hideTooltips) { + return null; + } + const annotations = annotationDimensions.get(hoveredDOMElement.createdBySpecId); + const annDims = (annotations as AnnotationLineProps[]).find((d) => { + return d.id === hoveredDOMElement.id && d.datum === hoveredDOMElement.datum; + }); + + if (!annDims) { + return null; + } + // current type for hoveredDOMElement is only used for line annotation markers + return { + isVisible: true, + annotationType: AnnotationTypes.Line, + datum: hoveredDOMElement.datum as LineAnnotationDatum, + anchor: { + position: undefined, + top: (annDims.marker?.position.top ?? 0) + annDims.panel.top + chartDimensions.top, + left: (annDims.marker?.position.left ?? 0) + annDims.panel.left + chartDimensions.left, + }, + customTooltipDetails: spec.customTooltipDetails, + customTooltip: spec.customTooltip, + tooltipSettings: getTooltipSettings(spec), + }; +} diff --git a/src/index.ts b/src/index.ts index 9833a871a9..03b987b5d8 100644 --- a/src/index.ts +++ b/src/index.ts @@ -16,8 +16,6 @@ * specific language governing permissions and limitations * under the License. */ -import 'path2d-polyfill'; - export * from './components'; export { ChartTypes } from './chart_types'; export { ChartSize, ChartSizeArray, ChartSizeObject } from './utils/chart_size'; diff --git a/src/mocks/annotations/annotations.ts b/src/mocks/annotations/annotations.ts index e0ae6596b9..14afb7ac58 100644 --- a/src/mocks/annotations/annotations.ts +++ b/src/mocks/annotations/annotations.ts @@ -24,6 +24,8 @@ import { mergePartial, RecursivePartial } from '../../utils/commons'; /** @internal */ export class MockAnnotationLineProps { private static readonly base: AnnotationLineProps = { + id: '0', + specId: 'spec1', linePathPoints: { x1: 0, y1: 0, @@ -31,7 +33,7 @@ export class MockAnnotationLineProps { y2: 0, }, panel: { top: 0, left: 0, width: 100, height: 100 }, - details: {}, + datum: { dataValue: 0 }, }; static default(partial?: RecursivePartial) { @@ -55,6 +57,8 @@ export class MockAnnotationLineProps { /** @internal */ export class MockAnnotationRectProps { private static readonly base: AnnotationRectProps = { + specId: 'spec1', + datum: { coordinates: { x0: 0, x1: 1, y0: 0, y1: 1 } }, rect: { x: 0, y: 0, diff --git a/src/state/actions/dom_element.ts b/src/state/actions/dom_element.ts new file mode 100644 index 0000000000..f4dcbdb600 --- /dev/null +++ b/src/state/actions/dom_element.ts @@ -0,0 +1,55 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { $Values } from 'utility-types'; + +export const ON_DOM_ELEMENT_ENTER = 'ON_DOM_ELEMENT_ENTER'; +export const ON_DOM_ELEMENT_LEAVE = 'ON_DOM_ELEMENT_LEAVE'; + +export const DOMElementType = Object.freeze({ + LineAnnotationMarker: 'LineAnnotationMarker' as const, +}); +export type DOMElementType = $Values; + +export interface DOMElement { + type: DOMElementType; + id: string; + createdBySpecId: string; // TODO is that + datum enough to identify the elements? + datum: unknown; +} +interface DOMElementEnterAction { + type: typeof ON_DOM_ELEMENT_ENTER; + element: DOMElement; +} + +interface DOMElementLeaveAction { + type: typeof ON_DOM_ELEMENT_LEAVE; +} + +/** @internal */ +export function onDOMElementLeave(): DOMElementLeaveAction { + return { type: ON_DOM_ELEMENT_LEAVE }; +} + +/** @internal */ +export function onDOMElementEnter(element: DOMElement): DOMElementEnterAction { + return { type: ON_DOM_ELEMENT_ENTER, element }; +} + +/** @internal */ +export type DOMElementActions = DOMElementEnterAction | DOMElementLeaveAction; diff --git a/src/state/chart_state.ts b/src/state/chart_state.ts index 67869ca6db..e7f7e3e461 100644 --- a/src/state/chart_state.ts +++ b/src/state/chart_state.ts @@ -27,8 +27,7 @@ import { XYAxisChartState } from '../chart_types/xy_chart/state/chart_state'; import { LegendItem, LegendItemExtraValues } from '../commons/legend'; import { SeriesKey, SeriesIdentifier } from '../commons/series_id'; import { TooltipInfo, TooltipAnchorPosition } from '../components/tooltip/types'; -import { Spec, PointerEvent } from '../specs'; -import { DEFAULT_SETTINGS_SPEC } from '../specs'; +import { Spec, PointerEvent, DEFAULT_SETTINGS_SPEC } from '../specs'; import { Color } from '../utils/commons'; import { Dimensions } from '../utils/dimensions'; import { Logger } from '../utils/logger'; @@ -37,6 +36,7 @@ import { StateActions } from './actions'; import { CHART_RENDERED } from './actions/chart'; import { UPDATE_PARENT_DIMENSION } from './actions/chart_settings'; import { SET_PERSISTED_COLOR, SET_TEMPORARY_COLOR, CLEAR_TEMPORARY_COLORS } from './actions/colors'; +import { DOMElement } from './actions/dom_element'; import { EXTERNAL_POINTER_EVENT } from './actions/events'; import { SPEC_PARSED, SPEC_UNMOUNTED, UPSERT_SPEC, REMOVE_SPEC } from './actions/specs'; import { interactionsReducer } from './reducers/interactions'; @@ -182,6 +182,7 @@ export interface InteractionsState { highlightedLegendItemKey: string | null; legendCollapsed: boolean; deselectedDataSeries: SeriesIdentifier[]; + hoveredDOMElement: DOMElement | null; } /** @internal */ @@ -265,6 +266,7 @@ export const getInitialState = (chartId: string): GlobalChartState => ({ legendCollapsed: false, highlightedLegendItemKey: null, deselectedDataSeries: [], + hoveredDOMElement: null, }, externalEvents: { pointer: null, diff --git a/src/state/reducers/interactions.ts b/src/state/reducers/interactions.ts index 1006a112fd..8c6a272f1a 100644 --- a/src/state/reducers/interactions.ts +++ b/src/state/reducers/interactions.ts @@ -21,16 +21,17 @@ import { getSeriesIndex } from '../../chart_types/xy_chart/utils/series'; import { LegendItem } from '../../commons/legend'; import { SeriesIdentifier } from '../../commons/series_id'; import { getDelta } from '../../utils/point'; -import { ON_KEY_UP, KeyActions } from '../actions/key'; +import { DOMElementActions, ON_DOM_ELEMENT_ENTER, ON_DOM_ELEMENT_LEAVE } from '../actions/dom_element'; +import { KeyActions, ON_KEY_UP } from '../actions/key'; import { - ON_TOGGLE_LEGEND, + LegendActions, ON_LEGEND_ITEM_OUT, ON_LEGEND_ITEM_OVER, ON_TOGGLE_DESELECT_SERIES, - LegendActions, + ON_TOGGLE_LEGEND, ToggleDeselectSeriesAction, } from '../actions/legend'; -import { ON_MOUSE_DOWN, ON_MOUSE_UP, ON_POINTER_MOVE, MouseActions } from '../actions/mouse'; +import { MouseActions, ON_MOUSE_DOWN, ON_MOUSE_UP, ON_POINTER_MOVE } from '../actions/mouse'; import { InteractionsState } from '../chart_state'; import { getInitialPointerState } from '../utils'; @@ -47,7 +48,7 @@ const DRAG_DETECTION_PIXEL_DELTA = 4; /** @internal */ export function interactionsReducer( state: InteractionsState, - action: LegendActions | MouseActions | KeyActions, + action: LegendActions | MouseActions | KeyActions | DOMElementActions, legendItems: LegendItem[], ): InteractionsState { switch (action.type) { @@ -155,6 +156,17 @@ export function interactionsReducer( ...state, deselectedDataSeries: toggleDeselectedDataSeries(action, state.deselectedDataSeries, legendItems), }; + + case ON_DOM_ELEMENT_ENTER: + return { + ...state, + hoveredDOMElement: action.element, + }; + case ON_DOM_ELEMENT_LEAVE: + return { + ...state, + hoveredDOMElement: null, + }; default: return state; } diff --git a/yarn.lock b/yarn.lock index 8bbe0b2d4a..ccdc76ebc4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17584,11 +17584,6 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -path2d-polyfill@^0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/path2d-polyfill/-/path2d-polyfill-0.4.2.tgz#594d3103838ef6b9dd4a7fd498fe9a88f1f28531" - integrity sha512-JSeAnUfkFjl+Ml/EZL898ivMSbGHrOH63Mirx5EQ1ycJiryHDmj1Q7Are+uEPvenVGCUN9YbolfGfyUewJfJEg== - pbkdf2@^3.0.3: version "3.0.17" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" From efa6ad960f0604084edfb0ddf508ded966e82db3 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Mon, 4 Jan 2021 21:20:10 +0100 Subject: [PATCH 2/9] refactor: cleanup code --- .../annotations/line/dimensions.test.ts | 1 - .../xy_chart/annotations/line/dimensions.ts | 10 ----- .../xy_chart/annotations/rect/dimensions.ts | 4 +- .../xy_chart/annotations/rect/types.ts | 1 - src/chart_types/xy_chart/annotations/types.ts | 1 + .../selectors/get_annotation_tooltip_state.ts | 43 +++++++++++-------- src/mocks/annotations/annotations.ts | 1 - 7 files changed, 26 insertions(+), 35 deletions(-) diff --git a/src/chart_types/xy_chart/annotations/line/dimensions.test.ts b/src/chart_types/xy_chart/annotations/line/dimensions.test.ts index ce7d46652e..a47ba7435b 100644 --- a/src/chart_types/xy_chart/annotations/line/dimensions.test.ts +++ b/src/chart_types/xy_chart/annotations/line/dimensions.test.ts @@ -100,7 +100,6 @@ describe('Annotation utils', () => { ]); expectedDimensions.set('rect', [ MockAnnotationRectProps.default({ - specId: 'rect', rect: { x: 0, y: 50, width: 50, height: 20 }, panel: { top: 0, left: 0, width: 100, height: 100 }, datum: { coordinates: { x0: 'a', x1: 'b', y0: 3, y1: 5 } }, diff --git a/src/chart_types/xy_chart/annotations/line/dimensions.ts b/src/chart_types/xy_chart/annotations/line/dimensions.ts index 6165b3d568..3ee06f33a6 100644 --- a/src/chart_types/xy_chart/annotations/line/dimensions.ts +++ b/src/chart_types/xy_chart/annotations/line/dimensions.ts @@ -118,11 +118,6 @@ function computeYDomainLineAnnotationDimensions( top: topPos, left: leftPos, }, - // details: { - // detailsText: datum.details, - // // we should allow showing empty string as header - // headerText: datum.header ?? dataValue.toString(), - // }, }; lineProps.push(lineProp); @@ -230,11 +225,6 @@ function computeXDomainLineAnnotationDimensions( id: `${lineProps.length}`, datum, linePathPoints, - // details: { - // detailsText: datum.details, - // // we should allow showing empty string as header - // headerText: datum.header ?? dataValue.toString(), - // }, marker: annotationMarker, panel: { ...panelSize, diff --git a/src/chart_types/xy_chart/annotations/rect/dimensions.ts b/src/chart_types/xy_chart/annotations/rect/dimensions.ts index 13c8ffd321..c0716d1002 100644 --- a/src/chart_types/xy_chart/annotations/rect/dimensions.ts +++ b/src/chart_types/xy_chart/annotations/rect/dimensions.ts @@ -45,7 +45,7 @@ export function computeRectAnnotationDimensions( smallMultiplesScales: SmallMultipleScales, isHistogram: boolean = false, ): AnnotationRectProps[] | null { - const { id, dataValues, groupId } = annotationSpec; + const { dataValues, groupId } = annotationSpec; const yScale = yScales.get(groupId); const rectsProps: Omit[] = []; @@ -85,7 +85,6 @@ export function computeRectAnnotationDimensions( }; rectsProps.push({ - specId: id, rect: rectDimensions, datum, }); @@ -119,7 +118,6 @@ export function computeRectAnnotationDimensions( }; rectsProps.push({ - specId: id, rect: rectDimensions, datum, }); diff --git a/src/chart_types/xy_chart/annotations/rect/types.ts b/src/chart_types/xy_chart/annotations/rect/types.ts index d8780d1868..3a4f5729ed 100644 --- a/src/chart_types/xy_chart/annotations/rect/types.ts +++ b/src/chart_types/xy_chart/annotations/rect/types.ts @@ -23,7 +23,6 @@ import { RectAnnotationDatum } from '../../utils/specs'; * @internal */ export interface AnnotationRectProps { - specId: string; datum: RectAnnotationDatum; rect: { x: number; diff --git a/src/chart_types/xy_chart/annotations/types.ts b/src/chart_types/xy_chart/annotations/types.ts index 419e80b9a5..4bb62e54d7 100644 --- a/src/chart_types/xy_chart/annotations/types.ts +++ b/src/chart_types/xy_chart/annotations/types.ts @@ -68,6 +68,7 @@ export interface AnnotationTooltipState { annotationType: AnnotationType; datum: LineAnnotationDatum | RectAnnotationDatum; anchor: { + // TODO this seems to be unused as it is never set internally position?: Position; top: number; left: number; diff --git a/src/chart_types/xy_chart/state/selectors/get_annotation_tooltip_state.ts b/src/chart_types/xy_chart/state/selectors/get_annotation_tooltip_state.ts index 9cb8ba85da..7fb4758cd1 100644 --- a/src/chart_types/xy_chart/state/selectors/get_annotation_tooltip_state.ts +++ b/src/chart_types/xy_chart/state/selectors/get_annotation_tooltip_state.ts @@ -115,20 +115,6 @@ function getAnnotationTooltipState( return tooltipState; } -function getTooltipSettings({ - placement, - fallbackPlacements, - boundary, - offset, -}: AnnotationSpec): TooltipPortalSettings<'chart'> { - return { - placement, - fallbackPlacements, - boundary, - offset, - }; -} - function getTooltipStateForDOMElements( chartDimensions: Dimensions, annotationSpecs: AnnotationSpec[], @@ -138,30 +124,49 @@ function getTooltipStateForDOMElements( if (!hoveredDOMElement) { return null; } + // current type for hoveredDOMElement is only used for line annotation markers + // and we can safety cast the union types to the respective Line types const spec = annotationSpecs.find(({ id }) => id === hoveredDOMElement.createdBySpecId); if (!spec || spec.hideTooltips) { return null; } const annotations = annotationDimensions.get(hoveredDOMElement.createdBySpecId); - const annDims = (annotations as AnnotationLineProps[]).find((d) => { + if (!annotations) { + return null; + } + const dimension = (annotations as AnnotationLineProps[]).find((d) => { return d.id === hoveredDOMElement.id && d.datum === hoveredDOMElement.datum; }); - if (!annDims) { + if (!dimension) { return null; } - // current type for hoveredDOMElement is only used for line annotation markers + return { isVisible: true, annotationType: AnnotationTypes.Line, datum: hoveredDOMElement.datum as LineAnnotationDatum, anchor: { position: undefined, - top: (annDims.marker?.position.top ?? 0) + annDims.panel.top + chartDimensions.top, - left: (annDims.marker?.position.left ?? 0) + annDims.panel.left + chartDimensions.left, + top: (dimension.marker?.position.top ?? 0) + dimension.panel.top + chartDimensions.top, + left: (dimension.marker?.position.left ?? 0) + dimension.panel.left + chartDimensions.left, }, customTooltipDetails: spec.customTooltipDetails, customTooltip: spec.customTooltip, tooltipSettings: getTooltipSettings(spec), }; } + +function getTooltipSettings({ + placement, + fallbackPlacements, + boundary, + offset, +}: AnnotationSpec): TooltipPortalSettings<'chart'> { + return { + placement, + fallbackPlacements, + boundary, + offset, + }; +} diff --git a/src/mocks/annotations/annotations.ts b/src/mocks/annotations/annotations.ts index 14afb7ac58..e62ce7b8cc 100644 --- a/src/mocks/annotations/annotations.ts +++ b/src/mocks/annotations/annotations.ts @@ -57,7 +57,6 @@ export class MockAnnotationLineProps { /** @internal */ export class MockAnnotationRectProps { private static readonly base: AnnotationRectProps = { - specId: 'spec1', datum: { coordinates: { x0: 0, x1: 1, y0: 0, y1: 1 } }, rect: { x: 0, From befc76208541332645830c58fe3934de9bf69d02 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Mon, 4 Jan 2021 22:11:20 +0100 Subject: [PATCH 3/9] test: update screenshots and api report --- api/charts.api.md | 3934 +++++++++-------- ...y-domain-visually-looks-correct-1-snap.png | Bin 12561 -> 12576 bytes ...tal-bars-visually-looks-correct-1-snap.png | Bin 20427 -> 20430 bytes 3 files changed, 1968 insertions(+), 1966 deletions(-) diff --git a/api/charts.api.md b/api/charts.api.md index e1d5681d0f..0d0119128d 100644 --- a/api/charts.api.md +++ b/api/charts.api.md @@ -1,1966 +1,1968 @@ -## API Report File for "@elastic/charts" - -> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). - -```ts - -import { $Values } from 'utility-types'; -import { ComponentType } from 'react'; -import React from 'react'; -import { ReactChild } from 'react'; - -// @public -export type Accessor = AccessorObjectKey | AccessorArrayIndex; - -// @public -export type AccessorArrayIndex = number; - -// @public -export type AccessorFn = UnaryAccessorFn; - -// @public -export type AccessorObjectKey = string; - -// @public -export type AnnotationDomainType = $Values; - -// @public -export const AnnotationDomainTypes: Readonly<{ - XDomain: "xDomain"; - YDomain: "yDomain"; -}>; - -// @public (undocumented) -export type AnnotationId = string; - -// @public -export type AnnotationPortalSettings = TooltipPortalSettings<'chart'> & { - customTooltip?: CustomAnnotationTooltip; - customTooltipDetails?: AnnotationTooltipFormatter; -}; - -// @public (undocumented) -export type AnnotationSpec = LineAnnotationSpec | RectAnnotationSpec; - -// @public (undocumented) -export type AnnotationTooltipFormatter = (details?: string) => JSX.Element | null; - -// @public (undocumented) -export type AnnotationType = $Values; - -// Warning: (ae-missing-release-tag) "AnnotationTypes" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const AnnotationTypes: Readonly<{ - Line: "line"; - Rectangle: "rectangle"; - Text: "text"; -}>; - -// Warning: (ae-missing-release-tag) "ArcSeriesStyle" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface ArcSeriesStyle { - // (undocumented) - arc: ArcStyle; -} - -// Warning: (ae-missing-release-tag) "ArcStyle" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface ArcStyle { - // Warning: (ae-forgotten-export) The symbol "Color" needs to be exported by the entry point index.d.ts - // Warning: (ae-forgotten-export) The symbol "ColorVariant" needs to be exported by the entry point index.d.ts - fill?: Color | ColorVariant; - opacity: number; - stroke?: Color | ColorVariant; - strokeWidth: number; - visible: boolean; -} - -// Warning: (ae-forgotten-export) The symbol "SpecRequiredProps" needs to be exported by the entry point index.d.ts -// Warning: (ae-forgotten-export) The symbol "SpecOptionalProps" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "AreaSeries" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const AreaSeries: React.FunctionComponent; - -// @public -export type AreaSeriesSpec = BasicSeriesSpec & HistogramConfig & Postfixes & { - seriesType: typeof SeriesTypes.Area; - curve?: CurveType; - areaSeriesStyle?: RecursivePartial; - stackMode?: StackMode; - pointStyleAccessor?: PointStyleAccessor; - fit?: Exclude | FitConfig; -}; - -// Warning: (ae-missing-release-tag) "AreaSeriesStyle" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface AreaSeriesStyle { - // (undocumented) - area: AreaStyle; - // (undocumented) - line: LineStyle; - // (undocumented) - point: PointStyle; -} - -// Warning: (ae-missing-release-tag) "AreaStyle" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface AreaStyle { - fill?: Color | ColorVariant; - opacity: number; - visible: boolean; -} - -// Warning: (ae-forgotten-export) The symbol "SpecRequired" needs to be exported by the entry point index.d.ts -// Warning: (ae-forgotten-export) The symbol "SpecOptionals" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "Axis" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const Axis: React.FunctionComponent; - -// @public (undocumented) -export type AxisId = string; - -// Warning: (ae-missing-release-tag) "AxisSpec" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public -export interface AxisSpec extends Spec { - // (undocumented) - chartType: typeof ChartTypes.XYAxis; - domain?: YDomainRange; - gridLine?: Partial; - groupId: GroupId; - hide: boolean; - id: AxisId; - integersOnly?: boolean; - labelFormat?: TickFormatter; - position: Position; - showDuplicatedTicks?: boolean; - // @deprecated - showGridLines?: boolean; - showOverlappingLabels: boolean; - showOverlappingTicks: boolean; - // (undocumented) - specType: typeof SpecTypes.Axis; - style?: RecursivePartial>; - tickFormat?: TickFormatter; - ticks?: number; - title?: string; -} - -// Warning: (ae-missing-release-tag) "AxisStyle" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface AxisStyle { - // (undocumented) - axisLine: StrokeStyle & Visible; - // (undocumented) - axisTitle: TextStyle & Visible; - // (undocumented) - gridLine: { - horizontal: GridLineStyle; - vertical: GridLineStyle; - }; - // (undocumented) - tickLabel: TextStyle & Visible & { - rotation: number; - offset: TextOffset; - alignment: TextAlignment; - }; - // (undocumented) - tickLine: TickStyle; -} - -// @public -export interface BackgroundStyle { - color: string; -} - -// @alpha (undocumented) -export type BandFillColorAccessor = (input: BandFillColorAccessorInput) => Color; - -// @alpha (undocumented) -export interface BandFillColorAccessorInput { - // (undocumented) - aboveBaseCount: number; - // (undocumented) - base: number; - // (undocumented) - belowBaseCount: number; - // (undocumented) - highestValue: number; - // (undocumented) - index: number; - // (undocumented) - lowestValue: number; - // (undocumented) - target: number; - // (undocumented) - value: number; -} - -// Warning: (ae-forgotten-export) The symbol "SpecRequiredProps" needs to be exported by the entry point index.d.ts -// Warning: (ae-forgotten-export) The symbol "SpecOptionalProps" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "BarSeries" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const BarSeries: React.FunctionComponent; - -// @public -export type BarSeriesSpec = BasicSeriesSpec & Postfixes & { - seriesType: typeof SeriesTypes.Bar; - enableHistogramMode?: boolean; - barSeriesStyle?: RecursivePartial; - stackMode?: StackMode; - styleAccessor?: BarStyleAccessor; - minBarHeight?: number; -}; - -// Warning: (ae-missing-release-tag) "BarSeriesStyle" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface BarSeriesStyle { - // (undocumented) - displayValue: DisplayValueStyle; - // (undocumented) - rect: RectStyle; - // (undocumented) - rectBorder: RectBorderStyle; -} - -// @public -export type BarStyleAccessor = (datum: DataSeriesDatum, seriesIdentifier: XYChartSeriesIdentifier) => BarStyleOverride; - -// @public (undocumented) -export type BarStyleOverride = RecursivePartial | Color | null; - -// Warning: (ae-missing-release-tag) "BaseAnnotationSpec" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface BaseAnnotationSpec extends Spec, AnnotationPortalSettings { - annotationType: T; - // (undocumented) - chartType: typeof ChartTypes.XYAxis; - dataValues: D[]; - groupId: GroupId; - hideTooltips?: boolean; - // (undocumented) - specType: typeof SpecTypes.Annotation; - style?: Partial; - zIndex?: number; -} - -// Warning: (ae-missing-release-tag) "BasePointerEvent" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface BasePointerEvent { - // (undocumented) - chartId: string; - // (undocumented) - type: PointerEventType; -} - -// Warning: (ae-missing-release-tag) "BasicListener" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export type BasicListener = () => undefined | void; - -// @public (undocumented) -export type BasicSeriesSpec = SeriesSpec & SeriesAccessors & SeriesScales & { - markFormat?: TickFormatter; -}; - -// Warning: (ae-missing-release-tag) "BinAgg" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public -export const BinAgg: Readonly<{ - Sum: "sum"; - None: "none"; -}>; - -// @public (undocumented) -export type BinAgg = $Values; - -// Warning: (ae-missing-release-tag) "BrushAxis" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const BrushAxis: Readonly<{ - X: "x"; - Y: "y"; - Both: "both"; -}>; - -// @public (undocumented) -export type BrushAxis = $Values; - -// Warning: (ae-missing-release-tag) "BrushEndListener" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export type BrushEndListener = (brushArea: XYBrushArea) => void; - -// Warning: (ae-forgotten-export) The symbol "SpecRequiredProps" needs to be exported by the entry point index.d.ts -// Warning: (ae-forgotten-export) The symbol "SpecOptionalProps" needs to be exported by the entry point index.d.ts -// -// @alpha -export const BubbleSeries: React.FunctionComponent; - -// @alpha -export type BubbleSeriesSpec = BasicSeriesSpec & { - seriesType: typeof SeriesTypes.Bubble; - bubbleSeriesStyle?: RecursivePartial; - pointStyleAccessor?: PointStyleAccessor; -}; - -// Warning: (ae-missing-release-tag) "BubbleSeriesStyle" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface BubbleSeriesStyle { - // (undocumented) - point: PointStyle; -} - -// Warning: (ae-forgotten-export) The symbol "ChartProps" needs to be exported by the entry point index.d.ts -// Warning: (ae-forgotten-export) The symbol "ChartState" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "Chart" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export class Chart extends React.Component { - constructor(props: ChartProps); - // (undocumented) - componentWillUnmount(): void; - // (undocumented) - static defaultProps: ChartProps; - // (undocumented) - dispatchExternalPointerEvent(event: PointerEvent): void; - // (undocumented) - getChartContainerRef: () => React.RefObject; - // (undocumented) - getPNGSnapshot(options?: { - backgroundColor: string; - pixelRatio: number; - }): { - blobOrDataUrl: any; - browser: 'IE11' | 'other'; - } | null; - // (undocumented) - render(): JSX.Element; - } - -// @public (undocumented) -export type ChartSize = number | string | ChartSizeArray | ChartSizeObject; - -// @public (undocumented) -export type ChartSizeArray = [number | string | undefined, number | string | undefined]; - -// Warning: (ae-missing-release-tag) "ChartSizeObject" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface ChartSizeObject { - // (undocumented) - height?: number | string; - // (undocumented) - width?: number | string; -} - -// Warning: (ae-missing-release-tag) "ChartTypes" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const ChartTypes: Readonly<{ - Global: "global"; - Goal: "goal"; - Partition: "partition"; - XYAxis: "xy_axis"; - Heatmap: "heatmap"; -}>; - -// @public (undocumented) -export type ChartTypes = $Values; - -// Warning: (ae-missing-release-tag) "ColorConfig" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface ColorConfig { - // (undocumented) - defaultVizColor: Color; - // (undocumented) - vizColors: Color[]; -} - -// Warning: (ae-forgotten-export) The symbol "DomainBase" needs to be exported by the entry point index.d.ts -// Warning: (ae-forgotten-export) The symbol "LowerBound" needs to be exported by the entry point index.d.ts -// Warning: (ae-forgotten-export) The symbol "UpperBound" needs to be exported by the entry point index.d.ts -// -// @public (undocumented) -export type CompleteBoundedDomain = DomainBase & LowerBound & UpperBound; - -// Warning: (ae-missing-release-tag) "CrosshairStyle" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface CrosshairStyle { - // (undocumented) - band: FillStyle & Visible; - // (undocumented) - line: StrokeStyle & Visible & Partial; -} - -// Warning: (ae-missing-release-tag) "CurveType" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const CurveType: Readonly<{ - CURVE_CARDINAL: 0; - CURVE_NATURAL: 1; - CURVE_MONOTONE_X: 2; - CURVE_MONOTONE_Y: 3; - CURVE_BASIS: 4; - CURVE_CATMULL_ROM: 5; - CURVE_STEP: 6; - CURVE_STEP_AFTER: 7; - CURVE_STEP_BEFORE: 8; - LINEAR: 9; -}>; - -// @public (undocumented) -export type CurveType = $Values; - -// @public (undocumented) -export type CustomAnnotationTooltip = ComponentType<{ - header?: string; - details?: string; -}> | null; - -// @public -export type CustomTooltip = ComponentType; - -// Warning: (ae-missing-release-tag) "DARK_THEME" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const DARK_THEME: Theme; - -// Warning: (ae-missing-release-tag) "DataGenerator" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export class DataGenerator { - // Warning: (ae-forgotten-export) The symbol "RandomNumberGenerator" needs to be exported by the entry point index.d.ts - constructor(frequency?: number, randomNumberGenerator?: RandomNumberGenerator); - // (undocumented) - generateBasicSeries(totalPoints?: number, offset?: number, amplitude?: number): { - x: number; - y: number; - }[]; - // (undocumented) - generateGroupedSeries(totalPoints?: number, totalGroups?: number, groupPrefix?: string): { - x: number; - y: number; - g: string; - }[]; - // (undocumented) - generateRandomGroupedSeries(totalPoints?: number, totalGroups?: number, groupPrefix?: string): { - x: number; - y: number; - z: number; - g: string; - }[]; - // (undocumented) - generateRandomSeries(totalPoints?: number, groupIndex?: number, groupPrefix?: string): { - x: number; - y: number; - z: number; - g: string; - }[]; - // (undocumented) - generateSimpleSeries(totalPoints?: number, groupIndex?: number, groupPrefix?: string): { - x: number; - y: number; - g: string; - }[]; - } - -// @public (undocumented) -export interface DataSeriesDatum { - datum: T; - filled?: FilledValues; - initialY0: number | null; - initialY1: number | null; - mark: number | null; - x: number | string; - y0: number | null; - y1: number | null; -} - -// @public (undocumented) -export type Datum = any; - -// Warning: (ae-missing-release-tag) "DebugState" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public -export interface DebugState { - // Warning: (ae-forgotten-export) The symbol "DebugStateArea" needs to be exported by the entry point index.d.ts - // - // (undocumented) - areas?: DebugStateArea[]; - // Warning: (ae-forgotten-export) The symbol "DebugStateAxes" needs to be exported by the entry point index.d.ts - // - // (undocumented) - axes?: DebugStateAxes; - // Warning: (ae-forgotten-export) The symbol "DebugStateBar" needs to be exported by the entry point index.d.ts - // - // (undocumented) - bars?: DebugStateBar[]; - // Warning: (ae-forgotten-export) The symbol "DebugStateLegend" needs to be exported by the entry point index.d.ts - // - // (undocumented) - legend?: DebugStateLegend; - // Warning: (ae-forgotten-export) The symbol "DebugStateLine" needs to be exported by the entry point index.d.ts - // - // (undocumented) - lines?: DebugStateLine[]; -} - -// Warning: (ae-missing-release-tag) "DEFAULT_ANNOTATION_LINE_STYLE" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const DEFAULT_ANNOTATION_LINE_STYLE: LineAnnotationStyle; - -// Warning: (ae-missing-release-tag) "DEFAULT_ANNOTATION_RECT_STYLE" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const DEFAULT_ANNOTATION_RECT_STYLE: RectAnnotationStyle; - -// Warning: (ae-forgotten-export) The symbol "Margins" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "DEFAULT_CHART_MARGINS" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const DEFAULT_CHART_MARGINS: Margins; - -// Warning: (ae-missing-release-tag) "DEFAULT_CHART_PADDING" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const DEFAULT_CHART_PADDING: Margins; - -// Warning: (ae-missing-release-tag) "DEFAULT_GEOMETRY_STYLES" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const DEFAULT_GEOMETRY_STYLES: SharedGeometryStateStyle; - -// @public -export const DEFAULT_GLOBAL_ID = "__global__"; - -// Warning: (ae-missing-release-tag) "DEFAULT_MISSING_COLOR" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const DEFAULT_MISSING_COLOR = "red"; - -// Warning: (ae-missing-release-tag) "DEFAULT_SETTINGS_SPEC" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const DEFAULT_SETTINGS_SPEC: SettingsSpec; - -// @public -export const DEFAULT_TOOLTIP_SNAP = true; - -// @public -export const DEFAULT_TOOLTIP_TYPE: "vertical"; - -// Warning: (ae-missing-release-tag) "DefaultSettingsProps" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export type DefaultSettingsProps = 'id' | 'chartType' | 'specType' | 'rendering' | 'rotation' | 'resizeDebounce' | 'animateData' | 'showLegend' | 'debug' | 'tooltip' | 'showLegendExtra' | 'theme' | 'legendPosition' | 'legendMaxDepth' | 'hideDuplicateAxes' | 'brushAxis' | 'minBrushDelta' | 'externalPointerEvents'; - -// Warning: (ae-missing-release-tag) "Direction" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public -export const Direction: Readonly<{ - Ascending: "ascending"; - Descending: "descending"; -}>; - -// @public (undocumented) -export type Direction = $Values; - -// Warning: (ae-missing-release-tag) "DisplayValueSpec" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface DisplayValueSpec { - hideClippedValue?: boolean; - isAlternatingValueLabel?: boolean; - isValueContainedInElement?: boolean; - showValueLabel?: boolean; - valueFormatter?: TickFormatter; -} - -// @public (undocumented) -export type DisplayValueStyle = Omit & { - offsetX: number; - offsetY: number; - fontSize: number | { - min: number; - max: number; - }; - fill: Color | { - color: Color; - borderColor?: Color; - borderWidth?: number; - } | { - textInvertible: boolean; - textContrast?: number | boolean; - textBorder?: number | boolean; - }; - alignment?: { - horizontal: Exclude; - vertical: Exclude; - }; -}; - -// @public (undocumented) -export type DomainRange = LowerBoundedDomain | UpperBoundedDomain | CompleteBoundedDomain | UnboundedDomainWithInterval; - -// Warning: (ae-missing-release-tag) "ElementClickListener" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export type ElementClickListener = (elements: Array) => void; - -// Warning: (ae-missing-release-tag) "ElementOverListener" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export type ElementOverListener = (elements: Array) => void; - -// @alpha -export interface ExternalPointerEventsSettings { - tooltip: TooltipPortalSettings<'chart'> & { - visible?: boolean; - }; -} - -// @public (undocumented) -export interface FilledValues { - x?: number | string; - y0?: number; - y1?: number; -} - -// Warning: (ae-missing-release-tag) "FillStyle" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface FillStyle { - fill: Color; -} - -// @public (undocumented) -export type FilterPredicate = (series: XYChartSeriesIdentifier) => boolean; - -// @public -export const Fit: Readonly<{ - None: "none"; - Carry: "carry"; - Lookahead: "lookahead"; - Nearest: "nearest"; - Average: "average"; - Linear: "linear"; - Zero: "zero"; - Explicit: "explicit"; -}>; - -// @public (undocumented) -export type Fit = $Values; - -// @public (undocumented) -export type FitConfig = { - type: Fit; - value?: number; - endValue?: number | 'nearest'; -}; - -// Warning: (ae-missing-release-tag) "GeometryStateStyle" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public -export interface GeometryStateStyle { - opacity: number; -} - -// Warning: (ae-missing-release-tag) "GeometryStyle" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public -export interface GeometryStyle { - opacity: number; -} - -// Warning: (ae-missing-release-tag) "GeometryValue" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface GeometryValue { - // Warning: (ae-forgotten-export) The symbol "BandedAccessorType" needs to be exported by the entry point index.d.ts - // - // (undocumented) - accessor: BandedAccessorType; - datum: any; - // (undocumented) - mark: number | null; - // (undocumented) - x: any; - // (undocumented) - y: any; -} - -// Warning: (ae-forgotten-export) The symbol "SpecRequiredProps" needs to be exported by the entry point index.d.ts -// Warning: (ae-forgotten-export) The symbol "SpecOptionalProps" needs to be exported by the entry point index.d.ts -// -// @alpha (undocumented) -export const Goal: React.FunctionComponent; - -// @alpha (undocumented) -export interface GoalSpec extends Spec { - // (undocumented) - actual: number; - // (undocumented) - bandFillColor: BandFillColorAccessor; - // (undocumented) - bands: number[]; - // (undocumented) - base: number; - // (undocumented) - centralMajor: string | BandFillColorAccessor; - // (undocumented) - centralMinor: string | BandFillColorAccessor; - // (undocumented) - chartType: typeof ChartTypes.Goal; - // Warning: (ae-forgotten-export) The symbol "Config" needs to be exported by the entry point index.d.ts - // - // (undocumented) - config: RecursivePartial; - // (undocumented) - labelMajor: string | BandFillColorAccessor; - // (undocumented) - labelMinor: string | BandFillColorAccessor; - // (undocumented) - specType: typeof SpecTypes.Series; - // Warning: (ae-forgotten-export) The symbol "GoalSubtype" needs to be exported by the entry point index.d.ts - // - // (undocumented) - subtype: GoalSubtype; - // (undocumented) - target: number; - // (undocumented) - ticks: number[]; - // (undocumented) - tickValueFormatter: BandFillColorAccessor; -} - -// @public (undocumented) -export interface GridLineStyle { - // (undocumented) - dash: number[]; - // (undocumented) - opacity: number; - // (undocumented) - stroke: Color; - // (undocumented) - strokeWidth: number; - // (undocumented) - visible: boolean; -} - -// Warning: (ae-missing-release-tag) "GroupBrushExtent" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface GroupBrushExtent { - // (undocumented) - extent: [number, number]; - // (undocumented) - groupId: GroupId; -} - -// @alpha (undocumented) -export const GroupBy: React.FunctionComponent; - -// @alpha (undocumented) -export type GroupByAccessor = (spec: Spec, datum: any) => string | number; - -// @alpha (undocumented) -export type GroupByProps = Pick; - -// Warning: (ae-forgotten-export) The symbol "Predicate" needs to be exported by the entry point index.d.ts -// -// @alpha (undocumented) -export type GroupBySort = Predicate; - -// @alpha (undocumented) -export interface GroupBySpec extends Spec { - // (undocumented) - by: GroupByAccessor; - // (undocumented) - sort: GroupBySort; -} - -// @public (undocumented) -export type GroupId = string; - -// Warning: (ae-forgotten-export) The symbol "SpecRequiredProps" needs to be exported by the entry point index.d.ts -// Warning: (ae-forgotten-export) The symbol "SpecOptionalProps" needs to be exported by the entry point index.d.ts -// -// @alpha (undocumented) -export const Heatmap: React.FunctionComponent; - -// Warning: (ae-missing-release-tag) "Config" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface HeatmapConfig { - brushArea: { - visible: boolean; - fill: Color; - stroke: Color; - strokeWidth: number; - }; - brushMask: { - visible: boolean; - fill: Color; - }; - brushTool: { - visible: boolean; - fill: Color; - }; - // (undocumented) - cell: { - maxWidth: Pixels | 'fill'; - maxHeight: Pixels | 'fill'; - align: 'center'; - label: Font & { - fontSize: Pixels; - maxWidth: Pixels | 'fill'; - fill: string; - align: TextAlign; - baseline: TextBaseline; - visible: boolean; - }; - border: { - strokeWidth: Pixels; - stroke: Color; - }; - }; - // Warning: (ae-forgotten-export) The symbol "FontFamily" needs to be exported by the entry point index.d.ts - // - // (undocumented) - fontFamily: FontFamily; - // (undocumented) - grid: { - cellWidth: { - min: Pixels; - max: Pixels | 'fill'; - }; - cellHeight: { - min: Pixels; - max: Pixels | 'fill'; - }; - stroke: { - color: string; - width: number; - }; - }; - // (undocumented) - height: Pixels; - // (undocumented) - margin: { - left: SizeRatio; - right: SizeRatio; - top: SizeRatio; - bottom: SizeRatio; - }; - // (undocumented) - maxColumnWidth: Pixels; - // (undocumented) - maxLegendHeight?: number; - // (undocumented) - maxRowHeight: Pixels; - // Warning: (ae-forgotten-export) The symbol "HeatmapBrushEvent" needs to be exported by the entry point index.d.ts - // - // (undocumented) - onBrushEnd?: (brushArea: HeatmapBrushEvent) => void; - // (undocumented) - timeZone: string; - // Warning: (ae-forgotten-export) The symbol "Pixels" needs to be exported by the entry point index.d.ts - // - // (undocumented) - width: Pixels; - // Warning: (ae-forgotten-export) The symbol "Font" needs to be exported by the entry point index.d.ts - // - // (undocumented) - xAxisLabel: Font & { - name: string; - fontSize: Pixels; - width: Pixels | 'auto'; - fill: string; - align: TextAlign; - baseline: TextBaseline; - visible: boolean; - padding: number; - formatter: (value: string | number) => string; - }; - // (undocumented) - yAxisLabel: Font & { - name: string; - fontSize: Pixels; - width: Pixels | 'auto' | { - max: Pixels; - }; - fill: string; - baseline: TextBaseline; - visible: boolean; - padding: number | { - left?: number; - right?: number; - top?: number; - bottom?: number; - }; - formatter: (value: string | number) => string; - }; -} - -// Warning: (ae-forgotten-export) The symbol "Cell" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "HeatmapElementEvent" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export type HeatmapElementEvent = [Cell, SeriesIdentifier]; - -// @alpha (undocumented) -export interface HeatmapSpec extends Spec { - // (undocumented) - chartType: typeof ChartTypes.Heatmap; - // (undocumented) - colors: Color[]; - // Warning: (ae-forgotten-export) The symbol "HeatmapScaleType" needs to be exported by the entry point index.d.ts - // - // (undocumented) - colorScale?: HeatmapScaleType; - // (undocumented) - config: RecursivePartial; - // (undocumented) - data: Datum[]; - // (undocumented) - highlightedData?: { - x: any[]; - y: any[]; - }; - // (undocumented) - name?: string; - // (undocumented) - ranges?: number[] | [number, number]; - // (undocumented) - specType: typeof SpecTypes.Series; - // (undocumented) - valueAccessor: Accessor | AccessorFn; - // (undocumented) - valueFormatter: (value: number) => string; - // (undocumented) - xAccessor: Accessor | AccessorFn; - // (undocumented) - xScaleType: SeriesScales['xScaleType']; - // (undocumented) - xSortPredicate: Predicate; - // (undocumented) - yAccessor: Accessor | AccessorFn; - // (undocumented) - ySortPredicate: Predicate; -} - -// Warning: (ae-forgotten-export) The symbol "SpecRequiredProps" needs to be exported by the entry point index.d.ts -// Warning: (ae-forgotten-export) The symbol "SpecOptionalProps" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "HistogramBarSeries" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const HistogramBarSeries: React.FunctionComponent; - -// @public -export type HistogramBarSeriesSpec = Omit & { - enableHistogramMode: true; -}; - -// Warning: (ae-missing-release-tag) "HistogramConfig" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface HistogramConfig { - histogramModeAlignment?: HistogramModeAlignment; -} - -// @public (undocumented) -export type HistogramModeAlignment = 'start' | 'center' | 'end'; - -// Warning: (ae-missing-release-tag) "HistogramModeAlignments" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const HistogramModeAlignments: Readonly<{ - Start: LineAlignSetting; - Center: LineAlignSetting; - End: LineAlignSetting; -}>; - -// Warning: (ae-missing-release-tag) "HorizontalAlignment" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const HorizontalAlignment: Readonly<{ - Center: "center"; - Right: "right"; - Left: "left"; - Near: "near"; - Far: "far"; -}>; - -// @public -export type HorizontalAlignment = $Values; - -// Warning: (ae-forgotten-export) The symbol "BinaryAccessorFn" needs to be exported by the entry point index.d.ts -// -// @public -export type IndexedAccessorFn = UnaryAccessorFn | BinaryAccessorFn; - -// Warning: (ae-missing-release-tag) "LayerValue" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface LayerValue { - // Warning: (ae-forgotten-export) The symbol "PrimitiveValue" needs to be exported by the entry point index.d.ts - // - // (undocumented) - groupByRollup: PrimitiveValue; - // (undocumented) - value: number; -} - -// @public -export type LegendAction = ComponentType; - -// @public -export interface LegendActionProps { - color: string; - label: string; - series: SeriesIdentifier; -} - -// Warning: (ae-missing-release-tag) "LegendColorPicker" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export type LegendColorPicker = ComponentType; - -// Warning: (ae-missing-release-tag) "LegendColorPickerProps" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface LegendColorPickerProps { - anchor: HTMLElement; - color: Color; - onChange: (color: Color | null) => void; - onClose: () => void; - seriesIdentifier: SeriesIdentifier; -} - -// Warning: (ae-missing-release-tag) "LegendItemListener" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export type LegendItemListener = (series: SeriesIdentifier | null) => void; - -// Warning: (ae-missing-release-tag) "LegendStyle" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface LegendStyle { - horizontalHeight: number; - margin: number; - spacingBuffer: number; - verticalWidth: number; -} - -// Warning: (ae-missing-release-tag) "LIGHT_THEME" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const LIGHT_THEME: Theme; - -// Warning: (ae-forgotten-export) The symbol "SpecRequiredProps" needs to be exported by the entry point index.d.ts -// Warning: (ae-forgotten-export) The symbol "SpecOptionalProps" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "LineAnnotation" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const LineAnnotation: React.FunctionComponent; - -// @public -export interface LineAnnotationDatum { - dataValue: any; - details?: string; - header?: string; -} - -// @public (undocumented) -export type LineAnnotationSpec = BaseAnnotationSpec & { - domainType: AnnotationDomainType; - marker?: JSX.Element; - markerDimensions?: { - width: number; - height: number; - }; - markerPosition?: Position; - hideLines?: boolean; - hideLinesTooltips?: boolean; - zIndex?: number; -}; - -// @public -export interface LineAnnotationStyle { - // @deprecated - details: TextStyle; - line: StrokeStyle & Opacity & Partial; -} - -// Warning: (ae-forgotten-export) The symbol "SpecRequiredProps" needs to be exported by the entry point index.d.ts -// Warning: (ae-forgotten-export) The symbol "SpecOptionalProps" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "LineSeries" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const LineSeries: React.FunctionComponent; - -// @public -export type LineSeriesSpec = BasicSeriesSpec & HistogramConfig & { - seriesType: typeof SeriesTypes.Line; - curve?: CurveType; - lineSeriesStyle?: RecursivePartial; - pointStyleAccessor?: PointStyleAccessor; - fit?: Exclude | FitConfig; -}; - -// Warning: (ae-missing-release-tag) "LineSeriesStyle" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface LineSeriesStyle { - // (undocumented) - line: LineStyle; - // (undocumented) - point: PointStyle; -} - -// Warning: (ae-missing-release-tag) "LineStyle" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface LineStyle { - dash?: number[]; - opacity: number; - stroke?: Color | ColorVariant; - strokeWidth: number; - visible: boolean; -} - -// @public (undocumented) -export type LowerBoundedDomain = DomainBase & LowerBound; - -// Warning: (ae-missing-release-tag) "MarkBuffer" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public -export type MarkBuffer = number | ((radius: number) => number); - -// Warning: (ae-missing-release-tag) "mergeWithDefaultAnnotationLine" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export function mergeWithDefaultAnnotationLine(config?: Partial): LineAnnotationStyle; - -// Warning: (ae-missing-release-tag) "mergeWithDefaultAnnotationRect" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export function mergeWithDefaultAnnotationRect(config?: Partial): RectAnnotationStyle; - -// Warning: (ae-missing-release-tag) "mergeWithDefaultTheme" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public -export function mergeWithDefaultTheme(theme: PartialTheme, defaultTheme?: Theme, axillaryThemes?: PartialTheme[]): Theme; - -// Warning: (ae-missing-release-tag) "niceTimeFormatByDay" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export function niceTimeFormatByDay(days: number): "YYYY-MM-DD" | "MMMM DD" | "MM-DD HH:mm" | "HH:mm:ss"; - -// Warning: (ae-missing-release-tag) "niceTimeFormatter" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export function niceTimeFormatter(domain: [number, number]): TickFormatter; - -// Warning: (ae-missing-release-tag) "Opacity" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface Opacity { - opacity: number; -} - -// @public -export interface OrderBy { - // (undocumented) - binAgg?: BinAgg; - // (undocumented) - direction?: Direction; -} - -// @public (undocumented) -export type PartialTheme = RecursivePartial; - -// Warning: (ae-forgotten-export) The symbol "SpecRequiredProps" needs to be exported by the entry point index.d.ts -// Warning: (ae-forgotten-export) The symbol "SpecOptionalProps" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "Partition" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const Partition: React.FunctionComponent; - -// Warning: (ae-forgotten-export) The symbol "StaticConfig" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "Config" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface PartitionConfig extends StaticConfig { - // (undocumented) - animation: { - duration: TimeMs; - keyframes: Array; - }; -} - -// Warning: (ae-missing-release-tag) "PartitionElementEvent" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export type PartitionElementEvent = [Array, SeriesIdentifier]; - -// Warning: (ae-forgotten-export) The symbol "LabelConfig" needs to be exported by the entry point index.d.ts -// -// @public (undocumented) -export type PartitionFillLabel = LabelConfig; - -// Warning: (ae-missing-release-tag) "Layer" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface PartitionLayer { - // Warning: (ae-forgotten-export) The symbol "ExtendedFillLabelConfig" needs to be exported by the entry point index.d.ts - // - // (undocumented) - fillLabel?: Partial; - // (undocumented) - groupByRollup: IndexedAccessorFn; - // Warning: (ae-forgotten-export) The symbol "LabelAccessor" needs to be exported by the entry point index.d.ts - // - // (undocumented) - nodeLabel?: LabelAccessor; - // (undocumented) - shape?: { - fillColor: string | NodeColorAccessor; - }; - // Warning: (ae-forgotten-export) The symbol "ShowAccessor" needs to be exported by the entry point index.d.ts - // - // (undocumented) - showAccessor?: ShowAccessor; -} - -// Warning: (ae-missing-release-tag) "PartitionLayout" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const PartitionLayout: Readonly<{ - sunburst: "sunburst"; - treemap: "treemap"; -}>; - -// @public (undocumented) -export type PartitionLayout = $Values; - -// @public -export const Placement: Readonly<{ - Top: "top"; - Bottom: "bottom"; - Left: "left"; - Right: "right"; - TopStart: "top-start"; - TopEnd: "top-end"; - BottomStart: "bottom-start"; - BottomEnd: "bottom-end"; - RightStart: "right-start"; - RightEnd: "right-end"; - LeftStart: "left-start"; - LeftEnd: "left-end"; - Auto: "auto"; - AutoStart: "auto-start"; - AutoEnd: "auto-end"; -}>; - -// @public -export type Placement = $Values; - -// Warning: (ae-missing-release-tag) "PointerEvent" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export type PointerEvent = PointerOverEvent | PointerOutEvent; - -// Warning: (ae-missing-release-tag) "PointerEventType" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const PointerEventType: Readonly<{ - Over: "Over"; - Out: "Out"; -}>; - -// @public (undocumented) -export type PointerEventType = $Values; - -// Warning: (ae-missing-release-tag) "PointerOutEvent" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface PointerOutEvent extends BasePointerEvent { - // (undocumented) - type: typeof PointerEventType.Out; -} - -// Warning: (ae-missing-release-tag) "PointerOverEvent" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public -export interface PointerOverEvent extends BasePointerEvent { - // Warning: (ae-forgotten-export) The symbol "ScaleContinuousType" needs to be exported by the entry point index.d.ts - // Warning: (ae-forgotten-export) The symbol "ScaleOrdinalType" needs to be exported by the entry point index.d.ts - // - // (undocumented) - scale: ScaleContinuousType | ScaleOrdinalType; - // (undocumented) - type: typeof PointerEventType.Over; - // @alpha - unit?: string; - // (undocumented) - value: number | string | null; -} - -// Warning: (ae-missing-release-tag) "PointerUpdateListener" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export type PointerUpdateListener = (event: PointerEvent) => void; - -// Warning: (ae-missing-release-tag) "PointStyle" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface PointStyle { - fill?: Color | ColorVariant; - opacity: number; - radius: number; - stroke?: Color | ColorVariant; - strokeWidth: number; - visible: boolean; -} - -// @public -export type PointStyleAccessor = (datum: DataSeriesDatum, seriesIdentifier: XYChartSeriesIdentifier) => PointStyleOverride; - -// @public (undocumented) -export type PointStyleOverride = RecursivePartial | Color | null; - -// Warning: (ae-missing-release-tag) "Position" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const Position: Readonly<{ - Top: "top"; - Bottom: "bottom"; - Left: "left"; - Right: "right"; -}>; - -// @public (undocumented) -export type Position = $Values; - -// Warning: (ae-missing-release-tag) "Postfixes" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface Postfixes { - y0AccessorFormat?: string; - y1AccessorFormat?: string; -} - -// @public -export type ProjectedValues = { - x: PrimitiveValue; - y: Array<{ - value: PrimitiveValue; - groupId: string; - }>; - smVerticalValue: PrimitiveValue; - smHorizontalValue: PrimitiveValue; -}; - -// @public -export type ProjectionClickListener = (values: ProjectedValues) => void; - -// Warning: (ae-missing-release-tag) "RectAnnotation" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const RectAnnotation: React.FunctionComponent & Partial>>; - -// Warning: (ae-missing-release-tag) "RectAnnotationDatum" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public -export interface RectAnnotationDatum { - coordinates: { - x0?: PrimitiveValue; - x1?: PrimitiveValue; - y0?: PrimitiveValue; - y1?: PrimitiveValue; - }; - details?: string; -} - -// @public (undocumented) -export type RectAnnotationSpec = BaseAnnotationSpec & { - renderTooltip?: AnnotationTooltipFormatter; - zIndex?: number; -}; - -// @public (undocumented) -export type RectAnnotationStyle = StrokeStyle & FillStyle & Opacity & Partial; - -// Warning: (ae-missing-release-tag) "RectBorderStyle" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface RectBorderStyle { - stroke?: Color | ColorVariant; - strokeOpacity?: number; - strokeWidth: number; - visible: boolean; -} - -// Warning: (ae-missing-release-tag) "RectStyle" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface RectStyle { - fill?: Color | ColorVariant; - opacity: number; -} - -// Warning: (ae-forgotten-export) The symbol "NonAny" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "RecursivePartial" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public -export type RecursivePartial = { - [P in keyof T]?: T[P] extends NonAny[] ? T[P] : T[P] extends ReadonlyArray ? T[P] : T[P] extends (infer U)[] ? RecursivePartial[] : T[P] extends ReadonlyArray ? ReadonlyArray> : T[P] extends Set ? Set> : T[P] extends Map ? Map> : T[P] extends NonAny ? T[P] : RecursivePartial; -}; - -// Warning: (ae-missing-release-tag) "RenderChangeListener" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public -export type RenderChangeListener = (isRendered: boolean) => void; - -// @public (undocumented) -export type Rendering = 'canvas' | 'svg'; - -// @public (undocumented) -export type Rotation = 0 | 90 | -90 | 180; - -// Warning: (ae-missing-release-tag) "ScalesConfig" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface ScalesConfig { - barsPadding: number; - histogramPadding: number; -} - -// @public -export const ScaleType: Readonly<{ - Linear: "linear"; - Ordinal: "ordinal"; - Log: "log"; - Sqrt: "sqrt"; - Time: "time"; - Quantize: "quantize"; - Quantile: "quantile"; - Threshold: "threshold"; -}>; - -// @public (undocumented) -export type ScaleType = $Values; - -// Warning: (ae-missing-release-tag) "SeriesAccessors" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface SeriesAccessors { - markSizeAccessor?: Accessor | AccessorFn; - splitSeriesAccessors?: (Accessor | AccessorFn)[]; - stackAccessors?: (Accessor | AccessorFn)[]; - xAccessor: Accessor | AccessorFn; - y0Accessors?: (Accessor | AccessorFn)[]; - yAccessors: (Accessor | AccessorFn)[]; -} - -// @public (undocumented) -export type SeriesColorAccessor = string | SeriesColorsArray | SeriesColorAccessorFn; - -// @public (undocumented) -export type SeriesColorAccessorFn = (seriesIdentifier: XYChartSeriesIdentifier) => string | null; - -// @public (undocumented) -export type SeriesColorsArray = string[]; - -// @public -export type SeriesIdentifier = { - specId: SpecId; - key: SeriesKey; -}; - -// @public (undocumented) -export type SeriesName = string | number | null; - -// @public (undocumented) -export type SeriesNameAccessor = string | SeriesNameFn | SeriesNameConfigOptions; - -// Warning: (ae-missing-release-tag) "SeriesNameConfig" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public -export interface SeriesNameConfig { - accessor: string | number; - name?: string | number; - sortIndex?: number; - value?: string | number; -} - -// Warning: (ae-missing-release-tag) "SeriesNameConfigOptions" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface SeriesNameConfigOptions { - delimiter?: string; - names?: SeriesNameConfig[]; -} - -// @public -export type SeriesNameFn = (series: XYChartSeriesIdentifier, isTooltip: boolean) => SeriesName; - -// Warning: (ae-missing-release-tag) "SeriesScales" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface SeriesScales { - timeZone?: string; - xScaleType: XScaleType; - // @deprecated - yScaleToDataExtent?: boolean; - yScaleType: ScaleContinuousType; -} - -// Warning: (ae-missing-release-tag) "SeriesSpec" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface SeriesSpec extends Spec { - // (undocumented) - chartType: typeof ChartTypes.XYAxis; - color?: SeriesColorAccessor; - data: Datum[]; - // (undocumented) - displayValueSettings?: DisplayValueSpec; - filterSeriesInTooltip?: FilterPredicate; - groupId: string; - hideInLegend?: boolean; - name?: SeriesNameAccessor; - seriesType: SeriesTypes; - sortIndex?: number; - // (undocumented) - specType: typeof SpecTypes.Series; - tickFormat?: TickFormatter; - useDefaultGroupDomain?: boolean | string; - // Warning: (ae-forgotten-export) The symbol "AccessorFormat" needs to be exported by the entry point index.d.ts - y0AccessorFormat?: AccessorFormat; - y1AccessorFormat?: AccessorFormat; -} - -// Warning: (ae-missing-release-tag) "SeriesSpecs" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export type SeriesSpecs = Array; - -// @public (undocumented) -export const SeriesTypes: Readonly<{ - Area: "area"; - Bar: "bar"; - Line: "line"; - Bubble: "bubble"; -}>; - -// @public (undocumented) -export type SeriesTypes = $Values; - -// Warning: (ae-missing-release-tag) "Settings" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const Settings: React.FunctionComponent; - -// @public -export interface SettingsSpec extends Spec { - allowBrushingLastHistogramBucket?: boolean; - // (undocumented) - animateData: boolean; - baseTheme?: Theme; - brushAxis?: BrushAxis; - debug: boolean; - // @alpha - debugState?: boolean; - // @alpha - externalPointerEvents: ExternalPointerEventsSettings; - flatLegend?: boolean; - hideDuplicateAxes: boolean; - legendAction?: LegendAction; - // (undocumented) - legendColorPicker?: LegendColorPicker; - legendMaxDepth: number; - legendPosition: Position; - minBrushDelta?: number; - noResults?: ComponentType | ReactChild; - // (undocumented) - onBrushEnd?: BrushEndListener; - // (undocumented) - onElementClick?: ElementClickListener; - // (undocumented) - onElementOut?: BasicListener; - // (undocumented) - onElementOver?: ElementOverListener; - // (undocumented) - onLegendItemClick?: LegendItemListener; - // (undocumented) - onLegendItemMinusClick?: LegendItemListener; - // (undocumented) - onLegendItemOut?: BasicListener; - // (undocumented) - onLegendItemOver?: LegendItemListener; - // (undocumented) - onLegendItemPlusClick?: LegendItemListener; - // (undocumented) - onPointerUpdate?: PointerUpdateListener; - onProjectionClick?: ProjectionClickListener; - // (undocumented) - onRenderChange?: RenderChangeListener; - orderOrdinalBinsBy?: OrderBy; - // (undocumented) - pointBuffer?: MarkBuffer; - // (undocumented) - rendering: Rendering; - // (undocumented) - resizeDebounce?: number; - // (undocumented) - rotation: Rotation; - roundHistogramBrushValues?: boolean; - // (undocumented) - showLegend: boolean; - showLegendExtra: boolean; - theme?: PartialTheme | PartialTheme[]; - tooltip: TooltipSettings; - // Warning: (ae-forgotten-export) The symbol "Domain" needs to be exported by the entry point index.d.ts - // - // (undocumented) - xDomain?: Domain | DomainRange; -} - -// Warning: (ae-missing-release-tag) "SettingsSpecProps" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export type SettingsSpecProps = Partial>; - -// Warning: (ae-missing-release-tag) "SharedGeometryStateStyle" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface SharedGeometryStateStyle { - // (undocumented) - default: GeometryStateStyle; - // (undocumented) - highlighted: GeometryStateStyle; - // (undocumented) - unhighlighted: GeometryStateStyle; -} - -// @public -export interface SimplePadding { - // (undocumented) - inner: number; - // (undocumented) - outer: number; -} - -// @alpha (undocumented) -export const SmallMultiples: React.FunctionComponent; - -// @alpha (undocumented) -export type SmallMultiplesProps = Partial>; - -// @alpha (undocumented) -export interface SmallMultiplesSpec extends Spec { - // (undocumented) - splitHorizontally?: string; - // (undocumented) - splitVertically?: string; - // (undocumented) - style?: { - verticalPanelPadding?: [number, number]; - horizontalPanelPadding?: [number, number]; - }; -} - -// Warning: (ae-missing-release-tag) "Spec" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface Spec { - chartType: ChartTypes; - id: string; - specType: string; -} - -// @public (undocumented) -export type SpecId = string; - -// Warning: (ae-missing-release-tag) "SpecTypes" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const SpecTypes: Readonly<{ - Series: "series"; - Axis: "axis"; - Annotation: "annotation"; - Settings: "settings"; - IndexOrder: "index_order"; - SmallMultiples: "small_multiples"; -}>; - -// @public (undocumented) -export type SpecTypes = $Values; - -// @public -export const StackMode: Readonly<{ - Percentage: "percentage"; - Wiggle: "wiggle"; - Silhouette: "silhouette"; -}>; - -// @public -export type StackMode = $Values; - -// @public -export interface StrokeDashArray { - dash: number[]; -} - -// @public -export interface StrokeStyle { - stroke: C; - strokeWidth: number; -} - -// @public -export interface TextAlignment { - // (undocumented) - horizontal: HorizontalAlignment; - // (undocumented) - vertical: VerticalAlignment; -} - -// @public -export interface TextOffset { - reference: 'global' | 'local'; - x: number | string; - y: number | string; -} - -// Warning: (ae-missing-release-tag) "TextStyle" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface TextStyle { - // (undocumented) - fill: Color; - // (undocumented) - fontFamily: string; - // (undocumented) - fontSize: number; - // (undocumented) - fontStyle?: string; - // (undocumented) - padding: number | SimplePadding; -} - -// Warning: (ae-missing-release-tag) "Theme" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface Theme { - // (undocumented) - arcSeriesStyle: ArcSeriesStyle; - areaSeriesStyle: AreaSeriesStyle; - // (undocumented) - axes: AxisStyle; - background: BackgroundStyle; - barSeriesStyle: BarSeriesStyle; - bubbleSeriesStyle: BubbleSeriesStyle; - chartMargins: Margins; - chartPaddings: Margins; - // (undocumented) - colors: ColorConfig; - // (undocumented) - crosshair: CrosshairStyle; - // (undocumented) - legend: LegendStyle; - lineSeriesStyle: LineSeriesStyle; - markSizeRatio?: number; - // (undocumented) - scales: ScalesConfig; - // (undocumented) - sharedStyle: SharedGeometryStateStyle; -} - -// @public (undocumented) -export type TickFormatter = (value: V, options?: TickFormatterOptions) => string; - -// @public (undocumented) -export type TickFormatterOptions = { - timeZone?: string; -}; - -// @public (undocumented) -export type TickStyle = StrokeStyle & Visible & { - padding: number; - size: number; -}; - -// Warning: (ae-missing-release-tag) "timeFormatter" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export function timeFormatter(format: string): TickFormatter; - -// @public -export interface TooltipInfo { - header: TooltipValue | null; - values: TooltipValue[]; -} - -// @public -export interface TooltipPortalSettings { - boundary?: HTMLElement | B; - fallbackPlacements?: Placement[]; - offset?: number; - placement?: Placement; -} - -// @public -export type TooltipProps = TooltipPortalSettings<'chart'> & { - type?: TooltipType; - snap?: boolean; - headerFormatter?: TooltipValueFormatter; - unit?: string; - customTooltip?: CustomTooltip; -}; - -// @public -export type TooltipSettings = TooltipType | TooltipProps; - -// @public -export const TooltipType: Readonly<{ - VerticalCursor: "vertical"; - Crosshairs: "cross"; - Follow: "follow"; - None: "none"; -}>; - -// @public -export type TooltipType = $Values; - -// @public -export interface TooltipValue { - color: Color; - formattedMarkValue?: string | null; - formattedValue: string; - isHighlighted: boolean; - isVisible: boolean; - label: string; - markValue?: number | null; - seriesIdentifier: SeriesIdentifier; - value: any; - valueAccessor?: Accessor; -} - -// @public -export type TooltipValueFormatter = (data: TooltipValue) => JSX.Element | string; - -// @public -export interface UnaryAccessorFn { - // (undocumented) - (datum: Datum): Return; - fieldName?: string; -} - -// @public (undocumented) -export type UnboundedDomainWithInterval = DomainBase; - -// @public (undocumented) -export type UpperBoundedDomain = DomainBase & UpperBound; - -// Warning: (ae-missing-release-tag) "VerticalAlignment" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const VerticalAlignment: Readonly<{ - Middle: "middle"; - Top: "top"; - Bottom: "bottom"; - Near: "near"; - Far: "far"; -}>; - -// @public -export type VerticalAlignment = $Values; - -// Warning: (ae-missing-release-tag) "Visible" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface Visible { - // (undocumented) - visible: boolean; -} - -// Warning: (ae-missing-release-tag) "XScaleType" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export type XScaleType = typeof ScaleType.Ordinal | ScaleContinuousType; - -// Warning: (ae-missing-release-tag) "XYBrushArea" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface XYBrushArea { - // (undocumented) - x?: [number, number]; - // (undocumented) - y?: Array; -} - -// Warning: (ae-missing-release-tag) "XYChartElementEvent" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export type XYChartElementEvent = [GeometryValue, XYChartSeriesIdentifier]; - -// Warning: (ae-missing-release-tag) "XYChartSeriesIdentifier" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface XYChartSeriesIdentifier extends SeriesIdentifier { - // (undocumented) - seriesKeys: (string | number)[]; - // (undocumented) - smHorizontalAccessorValue?: string | number; - // (undocumented) - smVerticalAccessorValue?: string | number; - // (undocumented) - splitAccessors: Map; - // (undocumented) - yAccessor: Accessor; -} - -// @public -export interface YDomainBase { - constrainPadding?: boolean; - fit?: boolean; - padding?: number | string; -} - -// @public (undocumented) -export type YDomainRange = YDomainBase & DomainRange; - - -// Warnings were encountered during analysis: -// -// src/chart_types/heatmap/layout/types/config_types.ts:28:13 - (ae-forgotten-export) The symbol "SizeRatio" needs to be exported by the entry point index.d.ts -// src/chart_types/heatmap/layout/types/config_types.ts:60:5 - (ae-forgotten-export) The symbol "TextAlign" needs to be exported by the entry point index.d.ts -// src/chart_types/heatmap/layout/types/config_types.ts:61:5 - (ae-forgotten-export) The symbol "TextBaseline" needs to be exported by the entry point index.d.ts -// src/chart_types/partition_chart/layout/types/config_types.ts:126:5 - (ae-forgotten-export) The symbol "TimeMs" needs to be exported by the entry point index.d.ts -// src/chart_types/partition_chart/layout/types/config_types.ts:127:5 - (ae-forgotten-export) The symbol "AnimKeyframe" needs to be exported by the entry point index.d.ts -// src/chart_types/partition_chart/specs/index.ts:48:13 - (ae-forgotten-export) The symbol "NodeColorAccessor" needs to be exported by the entry point index.d.ts -// src/commons/series_id.ts:39:3 - (ae-forgotten-export) The symbol "SeriesKey" needs to be exported by the entry point index.d.ts - -// (No @packageDocumentation comment for this package) - -``` +## API Report File for "@elastic/charts" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts + +import { $Values } from 'utility-types'; +import { ComponentType } from 'react'; +import React from 'react'; +import { ReactChild } from 'react'; + +// @public +export type Accessor = AccessorObjectKey | AccessorArrayIndex; + +// @public +export type AccessorArrayIndex = number; + +// @public +export type AccessorFn = UnaryAccessorFn; + +// @public +export type AccessorObjectKey = string; + +// @public +export type AnnotationDomainType = $Values; + +// @public +export const AnnotationDomainTypes: Readonly<{ + XDomain: "xDomain"; + YDomain: "yDomain"; +}>; + +// @public (undocumented) +export type AnnotationId = string; + +// @public +export type AnnotationPortalSettings = TooltipPortalSettings<'chart'> & { + customTooltip?: CustomAnnotationTooltip; + customTooltipDetails?: AnnotationTooltipFormatter; +}; + +// @public (undocumented) +export type AnnotationSpec = LineAnnotationSpec | RectAnnotationSpec; + +// @public (undocumented) +export type AnnotationTooltipFormatter = (details?: string) => JSX.Element | null; + +// @public (undocumented) +export type AnnotationType = $Values; + +// Warning: (ae-missing-release-tag) "AnnotationTypes" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const AnnotationTypes: Readonly<{ + Line: "line"; + Rectangle: "rectangle"; + Text: "text"; +}>; + +// Warning: (ae-missing-release-tag) "ArcSeriesStyle" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface ArcSeriesStyle { + // (undocumented) + arc: ArcStyle; +} + +// Warning: (ae-missing-release-tag) "ArcStyle" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface ArcStyle { + // Warning: (ae-forgotten-export) The symbol "Color" needs to be exported by the entry point index.d.ts + // Warning: (ae-forgotten-export) The symbol "ColorVariant" needs to be exported by the entry point index.d.ts + fill?: Color | ColorVariant; + opacity: number; + stroke?: Color | ColorVariant; + strokeWidth: number; + visible: boolean; +} + +// Warning: (ae-forgotten-export) The symbol "SpecRequiredProps" needs to be exported by the entry point index.d.ts +// Warning: (ae-forgotten-export) The symbol "SpecOptionalProps" needs to be exported by the entry point index.d.ts +// Warning: (ae-missing-release-tag) "AreaSeries" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const AreaSeries: React.FunctionComponent; + +// @public +export type AreaSeriesSpec = BasicSeriesSpec & HistogramConfig & Postfixes & { + seriesType: typeof SeriesTypes.Area; + curve?: CurveType; + areaSeriesStyle?: RecursivePartial; + stackMode?: StackMode; + pointStyleAccessor?: PointStyleAccessor; + fit?: Exclude | FitConfig; +}; + +// Warning: (ae-missing-release-tag) "AreaSeriesStyle" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface AreaSeriesStyle { + // (undocumented) + area: AreaStyle; + // (undocumented) + line: LineStyle; + // (undocumented) + point: PointStyle; +} + +// Warning: (ae-missing-release-tag) "AreaStyle" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface AreaStyle { + fill?: Color | ColorVariant; + opacity: number; + visible: boolean; +} + +// Warning: (ae-forgotten-export) The symbol "SpecRequired" needs to be exported by the entry point index.d.ts +// Warning: (ae-forgotten-export) The symbol "SpecOptionals" needs to be exported by the entry point index.d.ts +// Warning: (ae-missing-release-tag) "Axis" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const Axis: React.FunctionComponent; + +// @public (undocumented) +export type AxisId = string; + +// Warning: (ae-missing-release-tag) "AxisSpec" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public +export interface AxisSpec extends Spec { + // (undocumented) + chartType: typeof ChartTypes.XYAxis; + domain?: YDomainRange; + gridLine?: Partial; + groupId: GroupId; + hide: boolean; + id: AxisId; + integersOnly?: boolean; + labelFormat?: TickFormatter; + position: Position; + showDuplicatedTicks?: boolean; + // @deprecated + showGridLines?: boolean; + showOverlappingLabels: boolean; + showOverlappingTicks: boolean; + // (undocumented) + specType: typeof SpecTypes.Axis; + style?: RecursivePartial>; + tickFormat?: TickFormatter; + ticks?: number; + title?: string; +} + +// Warning: (ae-missing-release-tag) "AxisStyle" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface AxisStyle { + // (undocumented) + axisLine: StrokeStyle & Visible; + // (undocumented) + axisTitle: TextStyle & Visible; + // (undocumented) + gridLine: { + horizontal: GridLineStyle; + vertical: GridLineStyle; + }; + // (undocumented) + tickLabel: TextStyle & Visible & { + rotation: number; + offset: TextOffset; + alignment: TextAlignment; + }; + // (undocumented) + tickLine: TickStyle; +} + +// @public +export interface BackgroundStyle { + color: string; +} + +// @alpha (undocumented) +export type BandFillColorAccessor = (input: BandFillColorAccessorInput) => Color; + +// @alpha (undocumented) +export interface BandFillColorAccessorInput { + // (undocumented) + aboveBaseCount: number; + // (undocumented) + base: number; + // (undocumented) + belowBaseCount: number; + // (undocumented) + highestValue: number; + // (undocumented) + index: number; + // (undocumented) + lowestValue: number; + // (undocumented) + target: number; + // (undocumented) + value: number; +} + +// Warning: (ae-forgotten-export) The symbol "SpecRequiredProps" needs to be exported by the entry point index.d.ts +// Warning: (ae-forgotten-export) The symbol "SpecOptionalProps" needs to be exported by the entry point index.d.ts +// Warning: (ae-missing-release-tag) "BarSeries" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const BarSeries: React.FunctionComponent; + +// @public +export type BarSeriesSpec = BasicSeriesSpec & Postfixes & { + seriesType: typeof SeriesTypes.Bar; + enableHistogramMode?: boolean; + barSeriesStyle?: RecursivePartial; + stackMode?: StackMode; + styleAccessor?: BarStyleAccessor; + minBarHeight?: number; +}; + +// Warning: (ae-missing-release-tag) "BarSeriesStyle" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface BarSeriesStyle { + // (undocumented) + displayValue: DisplayValueStyle; + // (undocumented) + rect: RectStyle; + // (undocumented) + rectBorder: RectBorderStyle; +} + +// @public +export type BarStyleAccessor = (datum: DataSeriesDatum, seriesIdentifier: XYChartSeriesIdentifier) => BarStyleOverride; + +// @public (undocumented) +export type BarStyleOverride = RecursivePartial | Color | null; + +// Warning: (ae-missing-release-tag) "BaseAnnotationSpec" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface BaseAnnotationSpec extends Spec, AnnotationPortalSettings { + annotationType: T; + // (undocumented) + chartType: typeof ChartTypes.XYAxis; + dataValues: D[]; + groupId: GroupId; + hideTooltips?: boolean; + // (undocumented) + specType: typeof SpecTypes.Annotation; + style?: Partial; + zIndex?: number; +} + +// Warning: (ae-missing-release-tag) "BasePointerEvent" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface BasePointerEvent { + // (undocumented) + chartId: string; + // (undocumented) + type: PointerEventType; +} + +// Warning: (ae-missing-release-tag) "BasicListener" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type BasicListener = () => undefined | void; + +// @public (undocumented) +export type BasicSeriesSpec = SeriesSpec & SeriesAccessors & SeriesScales & { + markFormat?: TickFormatter; +}; + +// Warning: (ae-missing-release-tag) "BinAgg" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public +export const BinAgg: Readonly<{ + Sum: "sum"; + None: "none"; +}>; + +// @public (undocumented) +export type BinAgg = $Values; + +// Warning: (ae-missing-release-tag) "BrushAxis" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const BrushAxis: Readonly<{ + X: "x"; + Y: "y"; + Both: "both"; +}>; + +// @public (undocumented) +export type BrushAxis = $Values; + +// Warning: (ae-missing-release-tag) "BrushEndListener" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type BrushEndListener = (brushArea: XYBrushArea) => void; + +// Warning: (ae-forgotten-export) The symbol "SpecRequiredProps" needs to be exported by the entry point index.d.ts +// Warning: (ae-forgotten-export) The symbol "SpecOptionalProps" needs to be exported by the entry point index.d.ts +// +// @alpha +export const BubbleSeries: React.FunctionComponent; + +// @alpha +export type BubbleSeriesSpec = BasicSeriesSpec & { + seriesType: typeof SeriesTypes.Bubble; + bubbleSeriesStyle?: RecursivePartial; + pointStyleAccessor?: PointStyleAccessor; +}; + +// Warning: (ae-missing-release-tag) "BubbleSeriesStyle" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface BubbleSeriesStyle { + // (undocumented) + point: PointStyle; +} + +// Warning: (ae-forgotten-export) The symbol "ChartProps" needs to be exported by the entry point index.d.ts +// Warning: (ae-forgotten-export) The symbol "ChartState" needs to be exported by the entry point index.d.ts +// Warning: (ae-missing-release-tag) "Chart" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export class Chart extends React.Component { + constructor(props: ChartProps); + // (undocumented) + componentWillUnmount(): void; + // (undocumented) + static defaultProps: ChartProps; + // (undocumented) + dispatchExternalPointerEvent(event: PointerEvent): void; + // (undocumented) + getChartContainerRef: () => React.RefObject; + // (undocumented) + getPNGSnapshot(options?: { + backgroundColor: string; + pixelRatio: number; + }): { + blobOrDataUrl: any; + browser: 'IE11' | 'other'; + } | null; + // (undocumented) + render(): JSX.Element; + } + +// @public (undocumented) +export type ChartSize = number | string | ChartSizeArray | ChartSizeObject; + +// @public (undocumented) +export type ChartSizeArray = [number | string | undefined, number | string | undefined]; + +// Warning: (ae-missing-release-tag) "ChartSizeObject" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface ChartSizeObject { + // (undocumented) + height?: number | string; + // (undocumented) + width?: number | string; +} + +// Warning: (ae-missing-release-tag) "ChartTypes" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const ChartTypes: Readonly<{ + Global: "global"; + Goal: "goal"; + Partition: "partition"; + XYAxis: "xy_axis"; + Heatmap: "heatmap"; +}>; + +// @public (undocumented) +export type ChartTypes = $Values; + +// Warning: (ae-missing-release-tag) "ColorConfig" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface ColorConfig { + // (undocumented) + defaultVizColor: Color; + // (undocumented) + vizColors: Color[]; +} + +// Warning: (ae-forgotten-export) The symbol "DomainBase" needs to be exported by the entry point index.d.ts +// Warning: (ae-forgotten-export) The symbol "LowerBound" needs to be exported by the entry point index.d.ts +// Warning: (ae-forgotten-export) The symbol "UpperBound" needs to be exported by the entry point index.d.ts +// +// @public (undocumented) +export type CompleteBoundedDomain = DomainBase & LowerBound & UpperBound; + +// Warning: (ae-missing-release-tag) "CrosshairStyle" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface CrosshairStyle { + // (undocumented) + band: FillStyle & Visible; + // (undocumented) + line: StrokeStyle & Visible & Partial; +} + +// Warning: (ae-missing-release-tag) "CurveType" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const CurveType: Readonly<{ + CURVE_CARDINAL: 0; + CURVE_NATURAL: 1; + CURVE_MONOTONE_X: 2; + CURVE_MONOTONE_Y: 3; + CURVE_BASIS: 4; + CURVE_CATMULL_ROM: 5; + CURVE_STEP: 6; + CURVE_STEP_AFTER: 7; + CURVE_STEP_BEFORE: 8; + LINEAR: 9; +}>; + +// @public (undocumented) +export type CurveType = $Values; + +// @public (undocumented) +export type += ComponentType<{ + header?: string; + details?: string; + datum: LineAnnotationDatum | RectAnnotationDatum; +}> | null; + +// @public +export type CustomTooltip = ComponentType; + +// Warning: (ae-missing-release-tag) "DARK_THEME" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const DARK_THEME: Theme; + +// Warning: (ae-missing-release-tag) "DataGenerator" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export class DataGenerator { + // Warning: (ae-forgotten-export) The symbol "RandomNumberGenerator" needs to be exported by the entry point index.d.ts + constructor(frequency?: number, randomNumberGenerator?: RandomNumberGenerator); + // (undocumented) + generateBasicSeries(totalPoints?: number, offset?: number, amplitude?: number): { + x: number; + y: number; + }[]; + // (undocumented) + generateGroupedSeries(totalPoints?: number, totalGroups?: number, groupPrefix?: string): { + x: number; + y: number; + g: string; + }[]; + // (undocumented) + generateRandomGroupedSeries(totalPoints?: number, totalGroups?: number, groupPrefix?: string): { + x: number; + y: number; + z: number; + g: string; + }[]; + // (undocumented) + generateRandomSeries(totalPoints?: number, groupIndex?: number, groupPrefix?: string): { + x: number; + y: number; + z: number; + g: string; + }[]; + // (undocumented) + generateSimpleSeries(totalPoints?: number, groupIndex?: number, groupPrefix?: string): { + x: number; + y: number; + g: string; + }[]; + } + +// @public (undocumented) +export interface DataSeriesDatum { + datum: T; + filled?: FilledValues; + initialY0: number | null; + initialY1: number | null; + mark: number | null; + x: number | string; + y0: number | null; + y1: number | null; +} + +// @public (undocumented) +export type Datum = any; + +// Warning: (ae-missing-release-tag) "DebugState" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public +export interface DebugState { + // Warning: (ae-forgotten-export) The symbol "DebugStateArea" needs to be exported by the entry point index.d.ts + // + // (undocumented) + areas?: DebugStateArea[]; + // Warning: (ae-forgotten-export) The symbol "DebugStateAxes" needs to be exported by the entry point index.d.ts + // + // (undocumented) + axes?: DebugStateAxes; + // Warning: (ae-forgotten-export) The symbol "DebugStateBar" needs to be exported by the entry point index.d.ts + // + // (undocumented) + bars?: DebugStateBar[]; + // Warning: (ae-forgotten-export) The symbol "DebugStateLegend" needs to be exported by the entry point index.d.ts + // + // (undocumented) + legend?: DebugStateLegend; + // Warning: (ae-forgotten-export) The symbol "DebugStateLine" needs to be exported by the entry point index.d.ts + // + // (undocumented) + lines?: DebugStateLine[]; +} + +// Warning: (ae-missing-release-tag) "DEFAULT_ANNOTATION_LINE_STYLE" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const DEFAULT_ANNOTATION_LINE_STYLE: LineAnnotationStyle; + +// Warning: (ae-missing-release-tag) "DEFAULT_ANNOTATION_RECT_STYLE" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const DEFAULT_ANNOTATION_RECT_STYLE: RectAnnotationStyle; + +// Warning: (ae-forgotten-export) The symbol "Margins" needs to be exported by the entry point index.d.ts +// Warning: (ae-missing-release-tag) "DEFAULT_CHART_MARGINS" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const DEFAULT_CHART_MARGINS: Margins; + +// Warning: (ae-missing-release-tag) "DEFAULT_CHART_PADDING" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const DEFAULT_CHART_PADDING: Margins; + +// Warning: (ae-missing-release-tag) "DEFAULT_GEOMETRY_STYLES" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const DEFAULT_GEOMETRY_STYLES: SharedGeometryStateStyle; + +// @public +export const DEFAULT_GLOBAL_ID = "__global__"; + +// Warning: (ae-missing-release-tag) "DEFAULT_MISSING_COLOR" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const DEFAULT_MISSING_COLOR = "red"; + +// Warning: (ae-missing-release-tag) "DEFAULT_SETTINGS_SPEC" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const DEFAULT_SETTINGS_SPEC: SettingsSpec; + +// @public +export const DEFAULT_TOOLTIP_SNAP = true; + +// @public +export const DEFAULT_TOOLTIP_TYPE: "vertical"; + +// Warning: (ae-missing-release-tag) "DefaultSettingsProps" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type DefaultSettingsProps = 'id' | 'chartType' | 'specType' | 'rendering' | 'rotation' | 'resizeDebounce' | 'animateData' | 'showLegend' | 'debug' | 'tooltip' | 'showLegendExtra' | 'theme' | 'legendPosition' | 'legendMaxDepth' | 'hideDuplicateAxes' | 'brushAxis' | 'minBrushDelta' | 'externalPointerEvents'; + +// Warning: (ae-missing-release-tag) "Direction" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public +export const Direction: Readonly<{ + Ascending: "ascending"; + Descending: "descending"; +}>; + +// @public (undocumented) +export type Direction = $Values; + +// Warning: (ae-missing-release-tag) "DisplayValueSpec" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface DisplayValueSpec { + hideClippedValue?: boolean; + isAlternatingValueLabel?: boolean; + isValueContainedInElement?: boolean; + showValueLabel?: boolean; + valueFormatter?: TickFormatter; +} + +// @public (undocumented) +export type DisplayValueStyle = Omit & { + offsetX: number; + offsetY: number; + fontSize: number | { + min: number; + max: number; + }; + fill: Color | { + color: Color; + borderColor?: Color; + borderWidth?: number; + } | { + textInvertible: boolean; + textContrast?: number | boolean; + textBorder?: number | boolean; + }; + alignment?: { + horizontal: Exclude; + vertical: Exclude; + }; +}; + +// @public (undocumented) +export type DomainRange = LowerBoundedDomain | UpperBoundedDomain | CompleteBoundedDomain | UnboundedDomainWithInterval; + +// Warning: (ae-missing-release-tag) "ElementClickListener" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type ElementClickListener = (elements: Array) => void; + +// Warning: (ae-missing-release-tag) "ElementOverListener" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type ElementOverListener = (elements: Array) => void; + +// @alpha +export interface ExternalPointerEventsSettings { + tooltip: TooltipPortalSettings<'chart'> & { + visible?: boolean; + }; +} + +// @public (undocumented) +export interface FilledValues { + x?: number | string; + y0?: number; + y1?: number; +} + +// Warning: (ae-missing-release-tag) "FillStyle" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface FillStyle { + fill: Color; +} + +// @public (undocumented) +export type FilterPredicate = (series: XYChartSeriesIdentifier) => boolean; + +// @public +export const Fit: Readonly<{ + None: "none"; + Carry: "carry"; + Lookahead: "lookahead"; + Nearest: "nearest"; + Average: "average"; + Linear: "linear"; + Zero: "zero"; + Explicit: "explicit"; +}>; + +// @public (undocumented) +export type Fit = $Values; + +// @public (undocumented) +export type FitConfig = { + type: Fit; + value?: number; + endValue?: number | 'nearest'; +}; + +// Warning: (ae-missing-release-tag) "GeometryStateStyle" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public +export interface GeometryStateStyle { + opacity: number; +} + +// Warning: (ae-missing-release-tag) "GeometryStyle" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public +export interface GeometryStyle { + opacity: number; +} + +// Warning: (ae-missing-release-tag) "GeometryValue" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface GeometryValue { + // Warning: (ae-forgotten-export) The symbol "BandedAccessorType" needs to be exported by the entry point index.d.ts + // + // (undocumented) + accessor: BandedAccessorType; + datum: any; + // (undocumented) + mark: number | null; + // (undocumented) + x: any; + // (undocumented) + y: any; +} + +// Warning: (ae-forgotten-export) The symbol "SpecRequiredProps" needs to be exported by the entry point index.d.ts +// Warning: (ae-forgotten-export) The symbol "SpecOptionalProps" needs to be exported by the entry point index.d.ts +// +// @alpha (undocumented) +export const Goal: React.FunctionComponent; + +// @alpha (undocumented) +export interface GoalSpec extends Spec { + // (undocumented) + actual: number; + // (undocumented) + bandFillColor: BandFillColorAccessor; + // (undocumented) + bands: number[]; + // (undocumented) + base: number; + // (undocumented) + centralMajor: string | BandFillColorAccessor; + // (undocumented) + centralMinor: string | BandFillColorAccessor; + // (undocumented) + chartType: typeof ChartTypes.Goal; + // Warning: (ae-forgotten-export) The symbol "Config" needs to be exported by the entry point index.d.ts + // + // (undocumented) + config: RecursivePartial; + // (undocumented) + labelMajor: string | BandFillColorAccessor; + // (undocumented) + labelMinor: string | BandFillColorAccessor; + // (undocumented) + specType: typeof SpecTypes.Series; + // Warning: (ae-forgotten-export) The symbol "GoalSubtype" needs to be exported by the entry point index.d.ts + // + // (undocumented) + subtype: GoalSubtype; + // (undocumented) + target: number; + // (undocumented) + ticks: number[]; + // (undocumented) + tickValueFormatter: BandFillColorAccessor; +} + +// @public (undocumented) +export interface GridLineStyle { + // (undocumented) + dash: number[]; + // (undocumented) + opacity: number; + // (undocumented) + stroke: Color; + // (undocumented) + strokeWidth: number; + // (undocumented) + visible: boolean; +} + +// Warning: (ae-missing-release-tag) "GroupBrushExtent" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface GroupBrushExtent { + // (undocumented) + extent: [number, number]; + // (undocumented) + groupId: GroupId; +} + +// @alpha (undocumented) +export const GroupBy: React.FunctionComponent; + +// @alpha (undocumented) +export type GroupByAccessor = (spec: Spec, datum: any) => string | number; + +// @alpha (undocumented) +export type GroupByProps = Pick; + +// Warning: (ae-forgotten-export) The symbol "Predicate" needs to be exported by the entry point index.d.ts +// +// @alpha (undocumented) +export type GroupBySort = Predicate; + +// @alpha (undocumented) +export interface GroupBySpec extends Spec { + // (undocumented) + by: GroupByAccessor; + // (undocumented) + sort: GroupBySort; +} + +// @public (undocumented) +export type GroupId = string; + +// Warning: (ae-forgotten-export) The symbol "SpecRequiredProps" needs to be exported by the entry point index.d.ts +// Warning: (ae-forgotten-export) The symbol "SpecOptionalProps" needs to be exported by the entry point index.d.ts +// +// @alpha (undocumented) +export const Heatmap: React.FunctionComponent; + +// Warning: (ae-missing-release-tag) "Config" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface HeatmapConfig { + brushArea: { + visible: boolean; + fill: Color; + stroke: Color; + strokeWidth: number; + }; + brushMask: { + visible: boolean; + fill: Color; + }; + brushTool: { + visible: boolean; + fill: Color; + }; + // (undocumented) + cell: { + maxWidth: Pixels | 'fill'; + maxHeight: Pixels | 'fill'; + align: 'center'; + label: Font & { + fontSize: Pixels; + maxWidth: Pixels | 'fill'; + fill: string; + align: TextAlign; + baseline: TextBaseline; + visible: boolean; + }; + border: { + strokeWidth: Pixels; + stroke: Color; + }; + }; + // Warning: (ae-forgotten-export) The symbol "FontFamily" needs to be exported by the entry point index.d.ts + // + // (undocumented) + fontFamily: FontFamily; + // (undocumented) + grid: { + cellWidth: { + min: Pixels; + max: Pixels | 'fill'; + }; + cellHeight: { + min: Pixels; + max: Pixels | 'fill'; + }; + stroke: { + color: string; + width: number; + }; + }; + // (undocumented) + height: Pixels; + // (undocumented) + margin: { + left: SizeRatio; + right: SizeRatio; + top: SizeRatio; + bottom: SizeRatio; + }; + // (undocumented) + maxColumnWidth: Pixels; + // (undocumented) + maxLegendHeight?: number; + // (undocumented) + maxRowHeight: Pixels; + // Warning: (ae-forgotten-export) The symbol "HeatmapBrushEvent" needs to be exported by the entry point index.d.ts + // + // (undocumented) + onBrushEnd?: (brushArea: HeatmapBrushEvent) => void; + // (undocumented) + timeZone: string; + // Warning: (ae-forgotten-export) The symbol "Pixels" needs to be exported by the entry point index.d.ts + // + // (undocumented) + width: Pixels; + // Warning: (ae-forgotten-export) The symbol "Font" needs to be exported by the entry point index.d.ts + // + // (undocumented) + xAxisLabel: Font & { + name: string; + fontSize: Pixels; + width: Pixels | 'auto'; + fill: string; + align: TextAlign; + baseline: TextBaseline; + visible: boolean; + padding: number; + formatter: (value: string | number) => string; + }; + // (undocumented) + yAxisLabel: Font & { + name: string; + fontSize: Pixels; + width: Pixels | 'auto' | { + max: Pixels; + }; + fill: string; + baseline: TextBaseline; + visible: boolean; + padding: number | { + left?: number; + right?: number; + top?: number; + bottom?: number; + }; + formatter: (value: string | number) => string; + }; +} + +// Warning: (ae-forgotten-export) The symbol "Cell" needs to be exported by the entry point index.d.ts +// Warning: (ae-missing-release-tag) "HeatmapElementEvent" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type HeatmapElementEvent = [Cell, SeriesIdentifier]; + +// @alpha (undocumented) +export interface HeatmapSpec extends Spec { + // (undocumented) + chartType: typeof ChartTypes.Heatmap; + // (undocumented) + colors: Color[]; + // Warning: (ae-forgotten-export) The symbol "HeatmapScaleType" needs to be exported by the entry point index.d.ts + // + // (undocumented) + colorScale?: HeatmapScaleType; + // (undocumented) + config: RecursivePartial; + // (undocumented) + data: Datum[]; + // (undocumented) + highlightedData?: { + x: any[]; + y: any[]; + }; + // (undocumented) + name?: string; + // (undocumented) + ranges?: number[] | [number, number]; + // (undocumented) + specType: typeof SpecTypes.Series; + // (undocumented) + valueAccessor: Accessor | AccessorFn; + // (undocumented) + valueFormatter: (value: number) => string; + // (undocumented) + xAccessor: Accessor | AccessorFn; + // (undocumented) + xScaleType: SeriesScales['xScaleType']; + // (undocumented) + xSortPredicate: Predicate; + // (undocumented) + yAccessor: Accessor | AccessorFn; + // (undocumented) + ySortPredicate: Predicate; +} + +// Warning: (ae-forgotten-export) The symbol "SpecRequiredProps" needs to be exported by the entry point index.d.ts +// Warning: (ae-forgotten-export) The symbol "SpecOptionalProps" needs to be exported by the entry point index.d.ts +// Warning: (ae-missing-release-tag) "HistogramBarSeries" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const HistogramBarSeries: React.FunctionComponent; + +// @public +export type HistogramBarSeriesSpec = Omit & { + enableHistogramMode: true; +}; + +// Warning: (ae-missing-release-tag) "HistogramConfig" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface HistogramConfig { + histogramModeAlignment?: HistogramModeAlignment; +} + +// @public (undocumented) +export type HistogramModeAlignment = 'start' | 'center' | 'end'; + +// Warning: (ae-missing-release-tag) "HistogramModeAlignments" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const HistogramModeAlignments: Readonly<{ + Start: LineAlignSetting; + Center: LineAlignSetting; + End: LineAlignSetting; +}>; + +// Warning: (ae-missing-release-tag) "HorizontalAlignment" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const HorizontalAlignment: Readonly<{ + Center: "center"; + Right: "right"; + Left: "left"; + Near: "near"; + Far: "far"; +}>; + +// @public +export type HorizontalAlignment = $Values; + +// Warning: (ae-forgotten-export) The symbol "BinaryAccessorFn" needs to be exported by the entry point index.d.ts +// +// @public +export type IndexedAccessorFn = UnaryAccessorFn | BinaryAccessorFn; + +// Warning: (ae-missing-release-tag) "LayerValue" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface LayerValue { + // Warning: (ae-forgotten-export) The symbol "PrimitiveValue" needs to be exported by the entry point index.d.ts + // + // (undocumented) + groupByRollup: PrimitiveValue; + // (undocumented) + value: number; +} + +// @public +export type LegendAction = ComponentType; + +// @public +export interface LegendActionProps { + color: string; + label: string; + series: SeriesIdentifier; +} + +// Warning: (ae-missing-release-tag) "LegendColorPicker" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type LegendColorPicker = ComponentType; + +// Warning: (ae-missing-release-tag) "LegendColorPickerProps" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface LegendColorPickerProps { + anchor: HTMLElement; + color: Color; + onChange: (color: Color | null) => void; + onClose: () => void; + seriesIdentifier: SeriesIdentifier; +} + +// Warning: (ae-missing-release-tag) "LegendItemListener" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type LegendItemListener = (series: SeriesIdentifier | null) => void; + +// Warning: (ae-missing-release-tag) "LegendStyle" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface LegendStyle { + horizontalHeight: number; + margin: number; + spacingBuffer: number; + verticalWidth: number; +} + +// Warning: (ae-missing-release-tag) "LIGHT_THEME" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const LIGHT_THEME: Theme; + +// Warning: (ae-forgotten-export) The symbol "SpecRequiredProps" needs to be exported by the entry point index.d.ts +// Warning: (ae-forgotten-export) The symbol "SpecOptionalProps" needs to be exported by the entry point index.d.ts +// Warning: (ae-missing-release-tag) "LineAnnotation" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const LineAnnotation: React.FunctionComponent; + +// @public +export interface LineAnnotationDatum { + dataValue: any; + details?: string; + header?: string; +} + +// @public (undocumented) +export type LineAnnotationSpec = BaseAnnotationSpec & { + domainType: AnnotationDomainType; + marker?: JSX.Element; + markerDimensions?: { + width: number; + height: number; + }; + markerPosition?: Position; + hideLines?: boolean; + hideLinesTooltips?: boolean; + zIndex?: number; +}; + +// @public +export interface LineAnnotationStyle { + // @deprecated + details: TextStyle; + line: StrokeStyle & Opacity & Partial; +} + +// Warning: (ae-forgotten-export) The symbol "SpecRequiredProps" needs to be exported by the entry point index.d.ts +// Warning: (ae-forgotten-export) The symbol "SpecOptionalProps" needs to be exported by the entry point index.d.ts +// Warning: (ae-missing-release-tag) "LineSeries" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const LineSeries: React.FunctionComponent; + +// @public +export type LineSeriesSpec = BasicSeriesSpec & HistogramConfig & { + seriesType: typeof SeriesTypes.Line; + curve?: CurveType; + lineSeriesStyle?: RecursivePartial; + pointStyleAccessor?: PointStyleAccessor; + fit?: Exclude | FitConfig; +}; + +// Warning: (ae-missing-release-tag) "LineSeriesStyle" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface LineSeriesStyle { + // (undocumented) + line: LineStyle; + // (undocumented) + point: PointStyle; +} + +// Warning: (ae-missing-release-tag) "LineStyle" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface LineStyle { + dash?: number[]; + opacity: number; + stroke?: Color | ColorVariant; + strokeWidth: number; + visible: boolean; +} + +// @public (undocumented) +export type LowerBoundedDomain = DomainBase & LowerBound; + +// Warning: (ae-missing-release-tag) "MarkBuffer" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public +export type MarkBuffer = number | ((radius: number) => number); + +// Warning: (ae-missing-release-tag) "mergeWithDefaultAnnotationLine" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export function mergeWithDefaultAnnotationLine(config?: Partial): LineAnnotationStyle; + +// Warning: (ae-missing-release-tag) "mergeWithDefaultAnnotationRect" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export function mergeWithDefaultAnnotationRect(config?: Partial): RectAnnotationStyle; + +// Warning: (ae-missing-release-tag) "mergeWithDefaultTheme" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public +export function mergeWithDefaultTheme(theme: PartialTheme, defaultTheme?: Theme, axillaryThemes?: PartialTheme[]): Theme; + +// Warning: (ae-missing-release-tag) "niceTimeFormatByDay" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export function niceTimeFormatByDay(days: number): "YYYY-MM-DD" | "MMMM DD" | "MM-DD HH:mm" | "HH:mm:ss"; + +// Warning: (ae-missing-release-tag) "niceTimeFormatter" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export function niceTimeFormatter(domain: [number, number]): TickFormatter; + +// Warning: (ae-missing-release-tag) "Opacity" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface Opacity { + opacity: number; +} + +// @public +export interface OrderBy { + // (undocumented) + binAgg?: BinAgg; + // (undocumented) + direction?: Direction; +} + +// @public (undocumented) +export type PartialTheme = RecursivePartial; + +// Warning: (ae-forgotten-export) The symbol "SpecRequiredProps" needs to be exported by the entry point index.d.ts +// Warning: (ae-forgotten-export) The symbol "SpecOptionalProps" needs to be exported by the entry point index.d.ts +// Warning: (ae-missing-release-tag) "Partition" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const Partition: React.FunctionComponent; + +// Warning: (ae-forgotten-export) The symbol "StaticConfig" needs to be exported by the entry point index.d.ts +// Warning: (ae-missing-release-tag) "Config" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface PartitionConfig extends StaticConfig { + // (undocumented) + animation: { + duration: TimeMs; + keyframes: Array; + }; +} + +// Warning: (ae-missing-release-tag) "PartitionElementEvent" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type PartitionElementEvent = [Array, SeriesIdentifier]; + +// Warning: (ae-forgotten-export) The symbol "LabelConfig" needs to be exported by the entry point index.d.ts +// +// @public (undocumented) +export type PartitionFillLabel = LabelConfig; + +// Warning: (ae-missing-release-tag) "Layer" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface PartitionLayer { + // Warning: (ae-forgotten-export) The symbol "ExtendedFillLabelConfig" needs to be exported by the entry point index.d.ts + // + // (undocumented) + fillLabel?: Partial; + // (undocumented) + groupByRollup: IndexedAccessorFn; + // Warning: (ae-forgotten-export) The symbol "LabelAccessor" needs to be exported by the entry point index.d.ts + // + // (undocumented) + nodeLabel?: LabelAccessor; + // (undocumented) + shape?: { + fillColor: string | NodeColorAccessor; + }; + // Warning: (ae-forgotten-export) The symbol "ShowAccessor" needs to be exported by the entry point index.d.ts + // + // (undocumented) + showAccessor?: ShowAccessor; +} + +// Warning: (ae-missing-release-tag) "PartitionLayout" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const PartitionLayout: Readonly<{ + sunburst: "sunburst"; + treemap: "treemap"; +}>; + +// @public (undocumented) +export type PartitionLayout = $Values; + +// @public +export const Placement: Readonly<{ + Top: "top"; + Bottom: "bottom"; + Left: "left"; + Right: "right"; + TopStart: "top-start"; + TopEnd: "top-end"; + BottomStart: "bottom-start"; + BottomEnd: "bottom-end"; + RightStart: "right-start"; + RightEnd: "right-end"; + LeftStart: "left-start"; + LeftEnd: "left-end"; + Auto: "auto"; + AutoStart: "auto-start"; + AutoEnd: "auto-end"; +}>; + +// @public +export type Placement = $Values; + +// Warning: (ae-missing-release-tag) "PointerEvent" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type PointerEvent = PointerOverEvent | PointerOutEvent; + +// Warning: (ae-missing-release-tag) "PointerEventType" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const PointerEventType: Readonly<{ + Over: "Over"; + Out: "Out"; +}>; + +// @public (undocumented) +export type PointerEventType = $Values; + +// Warning: (ae-missing-release-tag) "PointerOutEvent" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface PointerOutEvent extends BasePointerEvent { + // (undocumented) + type: typeof PointerEventType.Out; +} + +// Warning: (ae-missing-release-tag) "PointerOverEvent" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public +export interface PointerOverEvent extends BasePointerEvent { + // Warning: (ae-forgotten-export) The symbol "ScaleContinuousType" needs to be exported by the entry point index.d.ts + // Warning: (ae-forgotten-export) The symbol "ScaleOrdinalType" needs to be exported by the entry point index.d.ts + // + // (undocumented) + scale: ScaleContinuousType | ScaleOrdinalType; + // (undocumented) + type: typeof PointerEventType.Over; + // @alpha + unit?: string; + // (undocumented) + value: number | string | null; +} + +// Warning: (ae-missing-release-tag) "PointerUpdateListener" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type PointerUpdateListener = (event: PointerEvent) => void; + +// Warning: (ae-missing-release-tag) "PointStyle" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface PointStyle { + fill?: Color | ColorVariant; + opacity: number; + radius: number; + stroke?: Color | ColorVariant; + strokeWidth: number; + visible: boolean; +} + +// @public +export type PointStyleAccessor = (datum: DataSeriesDatum, seriesIdentifier: XYChartSeriesIdentifier) => PointStyleOverride; + +// @public (undocumented) +export type PointStyleOverride = RecursivePartial | Color | null; + +// Warning: (ae-missing-release-tag) "Position" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const Position: Readonly<{ + Top: "top"; + Bottom: "bottom"; + Left: "left"; + Right: "right"; +}>; + +// @public (undocumented) +export type Position = $Values; + +// Warning: (ae-missing-release-tag) "Postfixes" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface Postfixes { + y0AccessorFormat?: string; + y1AccessorFormat?: string; +} + +// @public +export type ProjectedValues = { + x: PrimitiveValue; + y: Array<{ + value: PrimitiveValue; + groupId: string; + }>; + smVerticalValue: PrimitiveValue; + smHorizontalValue: PrimitiveValue; +}; + +// @public +export type ProjectionClickListener = (values: ProjectedValues) => void; + +// Warning: (ae-missing-release-tag) "RectAnnotation" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const RectAnnotation: React.FunctionComponent & Partial>>; + +// Warning: (ae-missing-release-tag) "RectAnnotationDatum" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public +export interface RectAnnotationDatum { + coordinates: { + x0?: PrimitiveValue; + x1?: PrimitiveValue; + y0?: PrimitiveValue; + y1?: PrimitiveValue; + }; + details?: string; +} + +// @public (undocumented) +export type RectAnnotationSpec = BaseAnnotationSpec & { + renderTooltip?: AnnotationTooltipFormatter; + zIndex?: number; +}; + +// @public (undocumented) +export type RectAnnotationStyle = StrokeStyle & FillStyle & Opacity & Partial; + +// Warning: (ae-missing-release-tag) "RectBorderStyle" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface RectBorderStyle { + stroke?: Color | ColorVariant; + strokeOpacity?: number; + strokeWidth: number; + visible: boolean; +} + +// Warning: (ae-missing-release-tag) "RectStyle" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface RectStyle { + fill?: Color | ColorVariant; + opacity: number; +} + +// Warning: (ae-forgotten-export) The symbol "NonAny" needs to be exported by the entry point index.d.ts +// Warning: (ae-missing-release-tag) "RecursivePartial" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public +export type RecursivePartial = { + [P in keyof T]?: T[P] extends NonAny[] ? T[P] : T[P] extends ReadonlyArray ? T[P] : T[P] extends (infer U)[] ? RecursivePartial[] : T[P] extends ReadonlyArray ? ReadonlyArray> : T[P] extends Set ? Set> : T[P] extends Map ? Map> : T[P] extends NonAny ? T[P] : RecursivePartial; +}; + +// Warning: (ae-missing-release-tag) "RenderChangeListener" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public +export type RenderChangeListener = (isRendered: boolean) => void; + +// @public (undocumented) +export type Rendering = 'canvas' | 'svg'; + +// @public (undocumented) +export type Rotation = 0 | 90 | -90 | 180; + +// Warning: (ae-missing-release-tag) "ScalesConfig" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface ScalesConfig { + barsPadding: number; + histogramPadding: number; +} + +// @public +export const ScaleType: Readonly<{ + Linear: "linear"; + Ordinal: "ordinal"; + Log: "log"; + Sqrt: "sqrt"; + Time: "time"; + Quantize: "quantize"; + Quantile: "quantile"; + Threshold: "threshold"; +}>; + +// @public (undocumented) +export type ScaleType = $Values; + +// Warning: (ae-missing-release-tag) "SeriesAccessors" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface SeriesAccessors { + markSizeAccessor?: Accessor | AccessorFn; + splitSeriesAccessors?: (Accessor | AccessorFn)[]; + stackAccessors?: (Accessor | AccessorFn)[]; + xAccessor: Accessor | AccessorFn; + y0Accessors?: (Accessor | AccessorFn)[]; + yAccessors: (Accessor | AccessorFn)[]; +} + +// @public (undocumented) +export type SeriesColorAccessor = string | SeriesColorsArray | SeriesColorAccessorFn; + +// @public (undocumented) +export type SeriesColorAccessorFn = (seriesIdentifier: XYChartSeriesIdentifier) => string | null; + +// @public (undocumented) +export type SeriesColorsArray = string[]; + +// @public +export type SeriesIdentifier = { + specId: SpecId; + key: SeriesKey; +}; + +// @public (undocumented) +export type SeriesName = string | number | null; + +// @public (undocumented) +export type SeriesNameAccessor = string | SeriesNameFn | SeriesNameConfigOptions; + +// Warning: (ae-missing-release-tag) "SeriesNameConfig" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public +export interface SeriesNameConfig { + accessor: string | number; + name?: string | number; + sortIndex?: number; + value?: string | number; +} + +// Warning: (ae-missing-release-tag) "SeriesNameConfigOptions" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface SeriesNameConfigOptions { + delimiter?: string; + names?: SeriesNameConfig[]; +} + +// @public +export type SeriesNameFn = (series: XYChartSeriesIdentifier, isTooltip: boolean) => SeriesName; + +// Warning: (ae-missing-release-tag) "SeriesScales" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface SeriesScales { + timeZone?: string; + xScaleType: XScaleType; + // @deprecated + yScaleToDataExtent?: boolean; + yScaleType: ScaleContinuousType; +} + +// Warning: (ae-missing-release-tag) "SeriesSpec" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface SeriesSpec extends Spec { + // (undocumented) + chartType: typeof ChartTypes.XYAxis; + color?: SeriesColorAccessor; + data: Datum[]; + // (undocumented) + displayValueSettings?: DisplayValueSpec; + filterSeriesInTooltip?: FilterPredicate; + groupId: string; + hideInLegend?: boolean; + name?: SeriesNameAccessor; + seriesType: SeriesTypes; + sortIndex?: number; + // (undocumented) + specType: typeof SpecTypes.Series; + tickFormat?: TickFormatter; + useDefaultGroupDomain?: boolean | string; + // Warning: (ae-forgotten-export) The symbol "AccessorFormat" needs to be exported by the entry point index.d.ts + y0AccessorFormat?: AccessorFormat; + y1AccessorFormat?: AccessorFormat; +} + +// Warning: (ae-missing-release-tag) "SeriesSpecs" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type SeriesSpecs = Array; + +// @public (undocumented) +export const SeriesTypes: Readonly<{ + Area: "area"; + Bar: "bar"; + Line: "line"; + Bubble: "bubble"; +}>; + +// @public (undocumented) +export type SeriesTypes = $Values; + +// Warning: (ae-missing-release-tag) "Settings" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const Settings: React.FunctionComponent; + +// @public +export interface SettingsSpec extends Spec { + allowBrushingLastHistogramBucket?: boolean; + // (undocumented) + animateData: boolean; + baseTheme?: Theme; + brushAxis?: BrushAxis; + debug: boolean; + // @alpha + debugState?: boolean; + // @alpha + externalPointerEvents: ExternalPointerEventsSettings; + flatLegend?: boolean; + hideDuplicateAxes: boolean; + legendAction?: LegendAction; + // (undocumented) + legendColorPicker?: LegendColorPicker; + legendMaxDepth: number; + legendPosition: Position; + minBrushDelta?: number; + noResults?: ComponentType | ReactChild; + // (undocumented) + onBrushEnd?: BrushEndListener; + // (undocumented) + onElementClick?: ElementClickListener; + // (undocumented) + onElementOut?: BasicListener; + // (undocumented) + onElementOver?: ElementOverListener; + // (undocumented) + onLegendItemClick?: LegendItemListener; + // (undocumented) + onLegendItemMinusClick?: LegendItemListener; + // (undocumented) + onLegendItemOut?: BasicListener; + // (undocumented) + onLegendItemOver?: LegendItemListener; + // (undocumented) + onLegendItemPlusClick?: LegendItemListener; + // (undocumented) + onPointerUpdate?: PointerUpdateListener; + onProjectionClick?: ProjectionClickListener; + // (undocumented) + onRenderChange?: RenderChangeListener; + orderOrdinalBinsBy?: OrderBy; + // (undocumented) + pointBuffer?: MarkBuffer; + // (undocumented) + rendering: Rendering; + // (undocumented) + resizeDebounce?: number; + // (undocumented) + rotation: Rotation; + roundHistogramBrushValues?: boolean; + // (undocumented) + showLegend: boolean; + showLegendExtra: boolean; + theme?: PartialTheme | PartialTheme[]; + tooltip: TooltipSettings; + // Warning: (ae-forgotten-export) The symbol "Domain" needs to be exported by the entry point index.d.ts + // + // (undocumented) + xDomain?: Domain | DomainRange; +} + +// Warning: (ae-missing-release-tag) "SettingsSpecProps" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type SettingsSpecProps = Partial>; + +// Warning: (ae-missing-release-tag) "SharedGeometryStateStyle" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface SharedGeometryStateStyle { + // (undocumented) + default: GeometryStateStyle; + // (undocumented) + highlighted: GeometryStateStyle; + // (undocumented) + unhighlighted: GeometryStateStyle; +} + +// @public +export interface SimplePadding { + // (undocumented) + inner: number; + // (undocumented) + outer: number; +} + +// @alpha (undocumented) +export const SmallMultiples: React.FunctionComponent; + +// @alpha (undocumented) +export type SmallMultiplesProps = Partial>; + +// @alpha (undocumented) +export interface SmallMultiplesSpec extends Spec { + // (undocumented) + splitHorizontally?: string; + // (undocumented) + splitVertically?: string; + // (undocumented) + style?: { + verticalPanelPadding?: [number, number]; + horizontalPanelPadding?: [number, number]; + }; +} + +// Warning: (ae-missing-release-tag) "Spec" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface Spec { + chartType: ChartTypes; + id: string; + specType: string; +} + +// @public (undocumented) +export type SpecId = string; + +// Warning: (ae-missing-release-tag) "SpecTypes" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const SpecTypes: Readonly<{ + Series: "series"; + Axis: "axis"; + Annotation: "annotation"; + Settings: "settings"; + IndexOrder: "index_order"; + SmallMultiples: "small_multiples"; +}>; + +// @public (undocumented) +export type SpecTypes = $Values; + +// @public +export const StackMode: Readonly<{ + Percentage: "percentage"; + Wiggle: "wiggle"; + Silhouette: "silhouette"; +}>; + +// @public +export type StackMode = $Values; + +// @public +export interface StrokeDashArray { + dash: number[]; +} + +// @public +export interface StrokeStyle { + stroke: C; + strokeWidth: number; +} + +// @public +export interface TextAlignment { + // (undocumented) + horizontal: HorizontalAlignment; + // (undocumented) + vertical: VerticalAlignment; +} + +// @public +export interface TextOffset { + reference: 'global' | 'local'; + x: number | string; + y: number | string; +} + +// Warning: (ae-missing-release-tag) "TextStyle" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface TextStyle { + // (undocumented) + fill: Color; + // (undocumented) + fontFamily: string; + // (undocumented) + fontSize: number; + // (undocumented) + fontStyle?: string; + // (undocumented) + padding: number | SimplePadding; +} + +// Warning: (ae-missing-release-tag) "Theme" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface Theme { + // (undocumented) + arcSeriesStyle: ArcSeriesStyle; + areaSeriesStyle: AreaSeriesStyle; + // (undocumented) + axes: AxisStyle; + background: BackgroundStyle; + barSeriesStyle: BarSeriesStyle; + bubbleSeriesStyle: BubbleSeriesStyle; + chartMargins: Margins; + chartPaddings: Margins; + // (undocumented) + colors: ColorConfig; + // (undocumented) + crosshair: CrosshairStyle; + // (undocumented) + legend: LegendStyle; + lineSeriesStyle: LineSeriesStyle; + markSizeRatio?: number; + // (undocumented) + scales: ScalesConfig; + // (undocumented) + sharedStyle: SharedGeometryStateStyle; +} + +// @public (undocumented) +export type TickFormatter = (value: V, options?: TickFormatterOptions) => string; + +// @public (undocumented) +export type TickFormatterOptions = { + timeZone?: string; +}; + +// @public (undocumented) +export type TickStyle = StrokeStyle & Visible & { + padding: number; + size: number; +}; + +// Warning: (ae-missing-release-tag) "timeFormatter" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export function timeFormatter(format: string): TickFormatter; + +// @public +export interface TooltipInfo { + header: TooltipValue | null; + values: TooltipValue[]; +} + +// @public +export interface TooltipPortalSettings { + boundary?: HTMLElement | B; + fallbackPlacements?: Placement[]; + offset?: number; + placement?: Placement; +} + +// @public +export type TooltipProps = TooltipPortalSettings<'chart'> & { + type?: TooltipType; + snap?: boolean; + headerFormatter?: TooltipValueFormatter; + unit?: string; + customTooltip?: CustomTooltip; +}; + +// @public +export type TooltipSettings = TooltipType | TooltipProps; + +// @public +export const TooltipType: Readonly<{ + VerticalCursor: "vertical"; + Crosshairs: "cross"; + Follow: "follow"; + None: "none"; +}>; + +// @public +export type TooltipType = $Values; + +// @public +export interface TooltipValue { + color: Color; + formattedMarkValue?: string | null; + formattedValue: string; + isHighlighted: boolean; + isVisible: boolean; + label: string; + markValue?: number | null; + seriesIdentifier: SeriesIdentifier; + value: any; + valueAccessor?: Accessor; +} + +// @public +export type TooltipValueFormatter = (data: TooltipValue) => JSX.Element | string; + +// @public +export interface UnaryAccessorFn { + // (undocumented) + (datum: Datum): Return; + fieldName?: string; +} + +// @public (undocumented) +export type UnboundedDomainWithInterval = DomainBase; + +// @public (undocumented) +export type UpperBoundedDomain = DomainBase & UpperBound; + +// Warning: (ae-missing-release-tag) "VerticalAlignment" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const VerticalAlignment: Readonly<{ + Middle: "middle"; + Top: "top"; + Bottom: "bottom"; + Near: "near"; + Far: "far"; +}>; + +// @public +export type VerticalAlignment = $Values; + +// Warning: (ae-missing-release-tag) "Visible" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface Visible { + // (undocumented) + visible: boolean; +} + +// Warning: (ae-missing-release-tag) "XScaleType" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type XScaleType = typeof ScaleType.Ordinal | ScaleContinuousType; + +// Warning: (ae-missing-release-tag) "XYBrushArea" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface XYBrushArea { + // (undocumented) + x?: [number, number]; + // (undocumented) + y?: Array; +} + +// Warning: (ae-missing-release-tag) "XYChartElementEvent" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type XYChartElementEvent = [GeometryValue, XYChartSeriesIdentifier]; + +// Warning: (ae-missing-release-tag) "XYChartSeriesIdentifier" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface XYChartSeriesIdentifier extends SeriesIdentifier { + // (undocumented) + seriesKeys: (string | number)[]; + // (undocumented) + smHorizontalAccessorValue?: string | number; + // (undocumented) + smVerticalAccessorValue?: string | number; + // (undocumented) + splitAccessors: Map; + // (undocumented) + yAccessor: Accessor; +} + +// @public +export interface YDomainBase { + constrainPadding?: boolean; + fit?: boolean; + padding?: number | string; +} + +// @public (undocumented) +export type YDomainRange = YDomainBase & DomainRange; + + +// Warnings were encountered during analysis: +// +// src/chart_types/heatmap/layout/types/config_types.ts:28:13 - (ae-forgotten-export) The symbol "SizeRatio" needs to be exported by the entry point index.d.ts +// src/chart_types/heatmap/layout/types/config_types.ts:60:5 - (ae-forgotten-export) The symbol "TextAlign" needs to be exported by the entry point index.d.ts +// src/chart_types/heatmap/layout/types/config_types.ts:61:5 - (ae-forgotten-export) The symbol "TextBaseline" needs to be exported by the entry point index.d.ts +// src/chart_types/partition_chart/layout/types/config_types.ts:126:5 - (ae-forgotten-export) The symbol "TimeMs" needs to be exported by the entry point index.d.ts +// src/chart_types/partition_chart/layout/types/config_types.ts:127:5 - (ae-forgotten-export) The symbol "AnimKeyframe" needs to be exported by the entry point index.d.ts +// src/chart_types/partition_chart/specs/index.ts:48:13 - (ae-forgotten-export) The symbol "NodeColorAccessor" needs to be exported by the entry point index.d.ts +// src/commons/series_id.ts:39:3 - (ae-forgotten-export) The symbol "SeriesKey" needs to be exported by the entry point index.d.ts + +// (No @packageDocumentation comment for this package) + +``` diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-annotations-lines-y-domain-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-annotations-lines-y-domain-visually-looks-correct-1-snap.png index 5a7bbd9ce173c436bf1096bb8adf2c991fc21ae9..efa443c72b37b92b5f042fea5792ac36381cb9cc 100644 GIT binary patch literal 12576 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 literal 12561 zcmbVy2UJwawsxB%GA5D&27-uWP(cZjq(M+}rcop#2s9uWF`z_kKr$#aIrNYugNlNn zq=p6+2};g6r?-o7{(JAcv*y3=uH{-s`kXpdr)r1q`}Tf%L+L8jUWUCG42B9TC#{0P zY#qX2wwUeS3BL@#F&=@-7JHSel9;Ue<8bE$1}l9Ys?h^;YUgyb31l=%8-{ZS{ICU>mkk3~ABbu`>4;?t=O(R_? z(-*Hr#eSryMJnX@VM*RSQcrp%2@ze)t>&k93*2OL^;z<0y;USIGrlJFK-bx1ratz! zg7z^QSP!Q8cREINl`smy!{yEGGq5s@SIrIb7Ptn#B5s2Vn-q2zT&_JP9DqysepWPu zmtI~3E{6OX3ES=&O>~yk*3?X`x-HL|i_SJm4S&l|zn=>Cz25A$E$OgMkXno{E!E@H z$Y@Lm5=(pb?6-s-xQp><`}v||w7uZ^ww?Q5zJ$rTb11hI(2MUDSsb(^d*0B~JBO8* zlbbZJNJ~3Qs*;hFU5?%Z_a_Tz)X7mUM?0d77aSZM>`FRv+Q$^1?#!ceRXX0>J9f-J z@V-f2f9q87D=E_iBMio^@s@mX`&et&`uqjOII)fa_cD%7b#--vP-l4EiAJ5zk+TU` zgU+5kD?c?gC3_WZz}B=6A+tmxOI@^Z^B^7kAn_(Yd~+AJ@B8)n|MkB88kixw>uyQM zw^HZa>FMd)*;;~bi+8CQ1XG&A34}vj`o(IFCHjQkyB9-ZW38q2&`P`a^9;Gpk1Cs+ zr}o#!aQc0SudS_}2~@atttHRAIZ_y%PUGr++<1;@15?0pVHJ&Zbs9ezK0ZF#t6SmT ze&fMVd_g-`a&zjoT?fqSB87Yd12uGXB7gSuG|=m6X{E^c(Qt@}=p@Jns4R?kP|59w zQQKo*X_7mv3m6y}Zs+UFwRf#+tgS4x6+4X7)6>$@CV&2X&Dg|b_;tIrs-xrU`dHDC zxyw{kRJ3b-c15d8WO#!Yo4~Am@rPT=YHA_Nb0h57;Wkp-dF$`@>MussvBAHg73zSh z_wQ3OGOq2}v&W!LRax1#iO;$~_s5SPVnk$uTPr820}UJ~>LPZ%PrkjrlYaVYV2V+7 zAb~hNZAWQsJ$v%x6{Tbtr<|jc2`5Qt9#YfOi*B>OC-6EgP2Reoq=tkndXlzMVR`aL zWxmUt#aL&V?(^r*i$}6bSg=0S%o?z-RYA-oZ||*ry}cj%>^M%Hk{lWu(whTEeq+q} zzOK&*yHQG5uPpm={}UzlaJ8WG%FYC%m-LxM4yD$EjbD+aFw=SLlZBZu0m}cmEB&1< z83~Da75Mu4=6S5SsB37P<>yzi@BgeUC-jRFRbQhTmDR+1c4U*^w!1O_m9n&B@{aYIQzSD_au0K^}{3`u%35 zf8Y)@P}*;?+e}L8K_HW8n(IWFCbih&%lWbPWK#KZ?VuJsAt90XgmVZ?Yq+zlM5n-- z3tK#0%c-uXm%$|JaxcH)g5?)|?yz^2l{_5m7)+s?T68Amq-jJGU!(tW)oXQsuFr#X z1RXi-M00YG6j#48VW(la7+*j-37^;Q}Fb0Ylz5cvM?w0=d*Dhs@qdb-BYU{k_g zDymSHwPDQ)m1LzDh5!x@jwW)Vf^k7REB1ho6xdf?>`_>O*@4GlcF~PTrg}#zMMmrtr^e3nIQ5Cxy+hrXAV@IJ$J4pUdHbTBV(p=f^4em z!uU=Wbc|aYCJ7$Zj813R*knx`VkzJ9E%WUMlsfD_ae=>m_`o3`pbAlDX=$mpzFtFC z_OaFZC{24cO-&sBn!bLAbJuY+XPTxQk4RElnr}QxI;y;-#EPk^V`(WVH(>tb z2Yen=9b?0axGnxJub?30v3l?5kt1i=*{^bkDI7d_Q2zRL&3pF>-`2o^d%c0N4bj3g zr9sq;A}zTw1VVgBNJzggat*rLNgvH=W<;~ga{?r1CD>@Ph#^yvkcDoiJ2PG-@!uM?7&msf!e z2meppSgF`(E_YwayVHKYYmzms8edP7Em7@#{!yEXGXMdQF7b7z~$a|Qi zunZ=x+b~}ra|xWPUbbOju&L5>6Z)Kh*GzPj6tE0Ucy5&3GBTpPlG=q;F*8dM!4JN~ zZ7jFl$L@x=Y^Nv5FQ=*|&%)tzo;!E#FuPI(SnBXZ5@A;4w9GRzatW z0(k*vsHUrXtnmiik>H&fMoG2l`RS|p(Jy>4mz`DEm7;Ih+D-}gtgf-593;UzoknyT zX;nOS!Mdd?;23La(|pC=7A`vE9fm(Cc40;K18G--m@Fu16mh3Kt@X= zLh3f9Q;$tur+aH$7Jv9`V?bzNw}zN!&tP(#$60_MkbsAxY|2q6I(qEbu_sn&&KuLt z0rKGBOwPRr1CCu#$~CDYgFOpbec|OYD82aG5*8~+7vYf;bW5e*jjID08O~dUGr7+yBS1r5aPs_`ZB)&=<164Mls8P{+~=dI zU%mL>jyJ0iNeyq|<&0BsQB({l#t+3eHr{A3f*5RpAE3pBhJ*~Zq^br4E*U+2`ZV(V z9i89-cpjs(7X~!Misn0x>3~;Y37yUZjALK2rNHwXg0~iSSVJVlqJx5Oio&BU>9+eh z6FKX{+$aS`SWK;LO`$y=8*-9gmDgn&m20M1_01EN^Q=f{o^h0uU^HClGkL1TwD% z9#@u;c?2ja6DS20(`79fasdBFU|*aymIVuxzjkfE+9orbo_>&kz9y3TU+LDb9OSm# zox&0t7M5OItfOCy2gLgvpmfTYFItMx7nL)0^7l$3*FTZ6s7DqM5I~WAbks_8vHO9D z$7&(VroTd_@7jjq-P@{xK5j5YbqkBM^7Um)MsW{46vZLUiopnpUQ1$5j>>h>xez-$ zyRBlhFvRdkoWgR1fa#HA$I^i{$rF;UMZ_OGEsMO#gL=Uz>iiuQ@SkmB$o&ji;=)Sa zS5=*b1Pxdo0NV4)AB{fD9x1Jvy1P!rRYUMP0?8sgoDM+zPCPe^c_Sx=!!iq)_)pKw zICQ_+(%~|aY0*)f4=kw#CY0z6W&u2530aGQ@0RqNei(xJ{BD4ANWiqd#i30^qqM}9$3^#_`D%SH&SAYbofIqbD&?m$vBy0j5#7?j% zDq=h#TymByPBBcbqkMgReKjVzLy2JqDqsmG zrjbWpsRrZGEwH9k0CZ3w0M>VyAJrC}dVd&RH}hu@*CR7S@CM>y(f>K(TaK|Gn_?vK z-8)IesPkO^$ORKk2|fm{V?t}wVHIk(Zxi_i1oExE^5+8<`ST%&v28d{{qs?oO-Asa zvd()wR27eq6?;cCuy(-eDyhZQtgW-6m6E?(7Yq~)#Jbj#e!zV%!(Mx==U9GQ-t8K~ zjM&vpQG+|C!IFHz>dOg;r5vhBa)hct#&iT)-aXvoLA?uxZ9g4HB8EYph;Ji}NVM!zTnmiP7dzie8cs1R0bU7$b!H-dN; zC5RA%p(AW5q#$5iGSbo?E%JwR8^ly0H61v9v5|;@{GLuGlUcA6G zWcc2X7{Hac1BA|OqpM?G6*vOEFI4j^1T#WQrfvb-jwimp1eT%>Yav0wkGH0rcOU?C zS9_|6xH0Zj(LB{tjn1VmLg4DmK!YZbI>2v{$A8vc=xTW-<#Plm{K`bdMyb)S>?Cvb zD#D(?>s*5e5J~#{d4M2xZ_=<~{>}Yub72*$eFUj%k%CyraLCzV$E{1Js$?6g|D8}& z2`^Zpt>oSXA1{%ubq=x2B*mzDjv>fesvj8-_}sd6OHD%~>EXleq(FTgoncBLv!@{< zM7-WVSjzy)>X$f%LT)fHhy_>X`Tx>~62~!aL?6~LASTgoJg?9l!+tPHX2k z19>4H_8^o~vv$mJq?VJU1_A6Sq~0f+AfR!&h^U*X(E;%*@{*JFiD`HZ=1RlQkpoVh z&dDfQf&w7Xi$2IZwn39@Z)XSkMh1k>G>Aw!IvdVU3c5Vn|6%St+}tlvoJ=PY-%s4% zT-1O)wxPCmuQW0b%tp68mYLU3;)EUgYjGDz-UWmpm$~6Yqycepjj>l}vmrsL5D(}c z_*uSrb5$-C{BYtf#7b>#ZQuj3WBrb+i?*2tWjdh50nw#^v=T}nkVl2#L9hO9b?io) z!=P*iHYg~lEkipO_=%db@~aPiwCOfoOZ=1mKl|0vH;zFaMIFp+> zK&f=L1_v_f(K)3$Veh&-=Us880P4np0O(GXwwK zOHFMvkD!@^{qKv#mB4@~`Ief1KD7w5A5RCRK*V$DzQ1dgX&mP;{#~1%o<35*G!SvA z$jC^qdStP5A0VRu(*W2&$!{~@#12D*8ZR1PDg&9Lcw>EKjcKwP_;fO$S0J%9KknYk zZy0J$hKOEX9xF7CF?{Bmn=jIPPC#U5q;l7n*S^_P1Kg9UZrnqV2u1As{eem!VPeV> zvTRMs%2Mibn^8P5jU@o7Jqk4b_uqL#U%VLpl5ON06tv*tX;bSYC-*T?dOJqXTdJO4 zv9ohkf#YVhP(ffD6{E;8#%;V@kd}{X>b<%ywj^D#RA(c2w_Cz}w&^Nit7}^rD2iy^ zfCF!6X@#Rm2Y7+Bu#iN&ASgI_Qw=^i+`EBw?Gdd(Bjk4Q1VNk5%Lu1JYK!DEl0{1c z=`Pu0ZF$G&B0TOD0r;XFzTa`|8O*G7T`3!y|*E> znavJ1-T#OJ(sof89(-La6)98V8%qt85+@t&%#F*^CMHR^%FPvg93Yh6`moo1p~DGj z1>iy72ZcA4+q*+>2JHnlNGCx2cyQ3HJoPZVc2WSKKggbx*LQS9*B5*KX)`rf!1L4_pZ{Zf;Hv3l?M<;emgeqD{|U@lWr9^(yd`^|oOUqbgq> z=F~n%BYgY-px^SQLkw6zsQ*h7@~A^!5&j4g+nA#zWPY6z$IL)x@hqhnks(C(7pHon zj=Y5Z`$N7YmCZ*YmZ0ysHaFn^ry?wfEV+>YC)Gy6kx)LIvG?#Ok9F>+fAsL-8Nl`f z7|?PTtPn>8D;8r$+gli|<<@a?>{~u0vlayPLqijtXZkt#`KL>nS>|K_IL%LVksv?B zEi6GM=hDfO`xM60)|7CS$9xmPeReA+cmO92pyPX&TWb8qYsv{58l|=V;=(a$#W@4+vpF zetyjxs|`pXl>3E$0T~`)X71|!ZK7-;_8g6$tUsM?=fIuwQOVCP9Y65lAHp(YMRD=+ zpDd@}-3(rNLISLz;JcllMy5_;UY;O`kPtN$2p&^@I6;m#5LfU&-|tb3;Fmdh@?>oF zr%#{Mb#>DrTY+9BBO_B|kq^q090UqmTU&#MgNF~>H}L`HhN^_33yPLr;$R=i*W|FkZ)O*6_9 zgb)sCVy)L6mK-|Dk}9`x8i|aY^(4=*5>`Z!O6)S@V(gTq*PtZB~4M6*~X`b z+4I2U6qfl2Vrk#E35yD+DqOKav$=4VD1e$J$tSW+}3Sg!j!YC3R z1DHg0Af!-9i@{q?41yyhPE5=b!oyRRmtDkoQORyGqT!Ri2d{nqwenJ=$?W!G3qut# z(CmnP+;v>y;y47!>Z64dK7N!7V7#P(#bRZv(Wh;VuVGySqNo9UXDy`YR!kG@ZjSf=v z!=jGR7G3?ZrcHH|OE0+9|Ka1uX#n0JiiChFeAz%>KNCsfBczH}0;|F*O%6~?PR*>A zhkFi(JbTtXvkuiaT1Hh6o(J<6rJ9^Vbyh!^dWf=p9$TJ|;Q+C=n;_pn0fk~}TzKRL2lI>-fhM$Igy zXKrp@JYGCf@A}9EZLp9<2<{y^w6`eT-2L%Rq8DxMB(+!uhGkEsMy1Yn5GL~Jk%77%e8 zlo9Y0bxi=eH5EKa%$Ph}so(;d5+OJ^-)(7n-=F11HxZC^ODJWoPViFm557l>XX-B@ zS^3WQLS+cuoP%}KJT(^veFU4A#k-SA34~4L;1%%PE)df zokwDvN}GpTV55YLs`g{a;GS)RaiEfr0o0{a9XoF}`X!q{EG`ytpM1M3M`vw8S4Cwm zW+#*V^4L8t^(ReRBAeE!9S5bQiA{XmgVJ;Ki8QtbJA*6kY}{ZyIN;G)eeEL8gNAi# zG4h_~xG;73zJ@9L!hi$6Nvw!3%5}-Uo*&_>4mj3ET+@-p7W}jP{f<-)od359)C-Wq z&&t9Q?X(J_h!DWGhR_)xias3J@G9Dov1 z^NbbIpXRSW;;eaVoXziHyRwaZ#MT#$ zkfs3g9s*?GliZAAZd!?ni45W%rF-}84G9iD9rh{l$&=lQ$;q6TFRzwXw?lMzyq}(& z@=SpY$Xy6Z>9RpMs3{{U&lGX=H~YczE_C37t&4|}?3tKF@F}L3SXpJj8)!u}K$r!M zY-Fa>z;^t5(Ll#Q{iTT(I2fcHuHK$PSSvF42Wv;1g@uJ0RCbnT23GQz`w)*bvC|Gk z?F6E8Evky&3Q$GbiP!x-BK9VfTjRlqlKuCM1ran;0SQnQ(kXMv2bzcqbhbTJ^o*MT zI-EwCtebCnkIA3X%98ECS+rjd}2{XD`eq{C!(zUmgNk$Vq04q z4(|`#TTV_+fQSZhpF1P(Vr<+eQ(dUX4F-BaiUEG@e&-!etgfm8v<71JcWb9#4`;}P z;Nc7&?W0WthBG%eCvtD{Ws*`%+5tupI!1(!CQD#-Tr_@2VoETAA24;^C4W>p|F-qy zKd8t3>RIup3}OJ;qODPi6UziVHw<#l^Ewkt!6cB#6~eefJFLT40E~m396N{<&fOP* z^aI);ZP~VS5IG+R7PBa7L8=!s)r0+lA50`9;nA1Q^yT0Cfbs3XXhddOUuw_&rX0_1EmERj9Bdu{wz0l{fKbA=Bj5#Qc_Y430c7; zJ8aO$=chwsVlsoomgS&lgF)DiNSqMAq4O`;H8#BiG%;Y~3oe0;jg5YR@Z?fW-+6e4 zggt*LvB11pmKwT-g#Wcb>yMOAx~fTCUSyMI{(sqh^q-r+U$iY*qKa#8@bx2y4#fj) z;S?7BI*2qK)YU*RFfhmxb)7c@$d{Iy+7!1w%MQ3#0g?v4$fmhFaosBV1W7j}IywUm z0TB#%Arwb1h#&?3x8J~t;>6r_nwpwoFvuUGGUxO9P<_ z9K*VxJw3YmNA_1MfDo52^4ye-4&yytudo3~Uhx}A zMh`pDUO+PNSTd#pKm(-?lxU$!TGm;SS|Mx}3C&g@C3IT(jsv2nnA7IcGW@5ZID{jH8qnV8Kb>|EFfFGS0@C&s0i)? zf_j3meSb<)lC0-)b6iWhCQrTvrFPJ4_bmi3z&%hi43xMMdN7;Sf|c=->ws|2o;lN) zrk*|vp#2!*zAM~fVg?}J6QJ+_B_bLggABkpa3r4x&8|G{Vw z-5=s~CZoW1IN8{$X6!+|#Y5ZPw!>SzmH__-T_ErVK=S5*LL@kUB=1dcpqv4LNAd~@ zfnGm4E@1SuAP2s->B<6r#=yAa8Oy(^XAB9acW}vztg=BD8N4Glj`QqUXiK?ccnZTy zf?^?(3PFq|K^ue-{`kx1a8w-7cL%go_UfL^twqAXWcL*)2Mt3-33ei+@&_;YRk)I| zaiRvaKCw}ThGSW-d1&Ckz|9fMUni(R_kPy5qEaqFrXP+CNakled6RxmQ0 zPC74g$U7R!`R^X>LnjLC4}zi@%rM;e>OoV}Z|`4QeT`?lk4${r2~!BMKb^rVljW~y+dA6kpf%dX;%Se zHq_}lL3wskYId@cIz1<6I+|~ybS9APdTa(F7~czRb)aAmle1!rii%()=oFE_;RK@3zoefpX*e3lnvZN{I1ZpM-Yfr2fkS`lHb@@Y^nEf!;HAW_;h81 zA1zNSv@Xu(#;sjj=<=+9I(hv{B#`&HPq=jzR1?XnSa%7a7m(dY%iRJ_TEDWA<2+-M zn3ROlxH51>;ZOSO3!WQo0u!)wR5gdHxa-=)PK>`S1d|6}tj>$B%{D_)9;SocnM_#Oa)R_;rEVVezXI2;LBfgnRJblY(OL57|rMA=!eNMQrvEJC&i zY0bbRG&_nNK=sLH@>slydg!30s{wH#)^pt%uo#wr>Zx->&DE+zMC<(h_q&5F(z*qJ zPN)om0V)@R(_Kf3cf+Oe&k+L4pz8^me5O+bNDiJ0B)oaL?-MJwVq5>-=tbUnk$fp?(U@2^BhX;4)~3UFJtqL0#TwvI8T4?2|4s1} zi7pQ&f1kNG3t*TuZ=(&J>W-AO;Mjlgd?K z-E-iPpGlwzG%Q(jrGd-vPR@V(evY zNW-10oLexeFNxc{-a$hM=?+YwNx|3&=1SHEPvbtgUbFq>c9H)FaZFqRNw00Xt7JBWx?u)I>s+KMF zM*}mY?O@g2-$RGf^0+#H@Q=S5yM>;59 zvY>V#Xg?J*%^;B$tl~fn#JNp9f}R0)vHC}=lWgz6&f?=GL2@;pb%O>)wCP~gWwT_3 z*g4cjEj%&hF%#7_Si>II0u$jO=>WIRx9(UjwUNZU@dun?_zZI8NNRE{fkkwwHyE`o zBl_a&yBEcjfevPiS>JV}Lby01^ zXb`QNfEIw@jVj!X!gkUCEEGjruSf71J>I#W?&bIIdT;_m%OfP4*;VL=%7pnqxl^pE zsd1UEVQ0lc8Mh6zxdveaXuQgYE|s-5&$Te5iL$b@k1P$u*~}K~#2A{K9QRw(XGI{) kV0IxtkkpKVy diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-small-multiples-alpha-horizontal-bars-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-small-multiples-alpha-horizontal-bars-visually-looks-correct-1-snap.png index b24d2d81abd36829222c7851353ee54967e20c23..1f20f901a60e929750d81f16863855d0c4396465 100644 GIT binary patch literal 20430 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

L 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 From 5919ef26493b6f9697e4f5554bc7ae0545aa0e08 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Mon, 25 Jan 2021 11:04:58 +0100 Subject: [PATCH 4/9] refactor: remove unnecessary anchor position field --- src/chart_types/xy_chart/annotations/types.ts | 2 -- .../xy_chart/renderer/dom/annotations/annotation_tooltip.tsx | 4 ++-- .../xy_chart/state/selectors/get_annotation_tooltip_state.ts | 1 - 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/chart_types/xy_chart/annotations/types.ts b/src/chart_types/xy_chart/annotations/types.ts index 4bb62e54d7..8fdfd243b8 100644 --- a/src/chart_types/xy_chart/annotations/types.ts +++ b/src/chart_types/xy_chart/annotations/types.ts @@ -68,8 +68,6 @@ export interface AnnotationTooltipState { annotationType: AnnotationType; datum: LineAnnotationDatum | RectAnnotationDatum; anchor: { - // TODO this seems to be unused as it is never set internally - position?: Position; top: number; left: number; }; diff --git a/src/chart_types/xy_chart/renderer/dom/annotations/annotation_tooltip.tsx b/src/chart_types/xy_chart/renderer/dom/annotations/annotation_tooltip.tsx index 7ea0173af3..cceb482e43 100644 --- a/src/chart_types/xy_chart/renderer/dom/annotations/annotation_tooltip.tsx +++ b/src/chart_types/xy_chart/renderer/dom/annotations/annotation_tooltip.tsx @@ -65,10 +65,10 @@ export const AnnotationTooltip = ({ state, chartRef, chartId, onScroll, zIndex } return { ...rest, - placement: placement ?? state?.anchor?.position ?? Placement.Right, + placement: placement ?? Placement.Right, boundary: boundary === 'chart' && chartRef.current ? chartRef.current : undefined, }; - }, [state?.tooltipSettings, state?.anchor?.position, chartRef]); + }, [state?.tooltipSettings, chartRef]); const position = useMemo(() => state?.anchor ?? null, [state?.anchor]); if (!state?.isVisible) { diff --git a/src/chart_types/xy_chart/state/selectors/get_annotation_tooltip_state.ts b/src/chart_types/xy_chart/state/selectors/get_annotation_tooltip_state.ts index 7fb4758cd1..21c6abdd46 100644 --- a/src/chart_types/xy_chart/state/selectors/get_annotation_tooltip_state.ts +++ b/src/chart_types/xy_chart/state/selectors/get_annotation_tooltip_state.ts @@ -147,7 +147,6 @@ function getTooltipStateForDOMElements( annotationType: AnnotationTypes.Line, datum: hoveredDOMElement.datum as LineAnnotationDatum, anchor: { - position: undefined, top: (dimension.marker?.position.top ?? 0) + dimension.panel.top + chartDimensions.top, left: (dimension.marker?.position.left ?? 0) + dimension.panel.left + chartDimensions.left, }, From 77518370eedf37a2d5e4eacdfb197d34146260d0 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Mon, 25 Jan 2021 11:32:45 +0100 Subject: [PATCH 5/9] refactor: improve annotation props id generation --- src/chart_types/xy_chart/annotations/line/dimensions.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/chart_types/xy_chart/annotations/line/dimensions.ts b/src/chart_types/xy_chart/annotations/line/dimensions.ts index 3ee06f33a6..51c2fb0e5c 100644 --- a/src/chart_types/xy_chart/annotations/line/dimensions.ts +++ b/src/chart_types/xy_chart/annotations/line/dimensions.ts @@ -109,7 +109,7 @@ function computeYDomainLineAnnotationDimensions( : undefined; const lineProp: AnnotationLineProps = { specId, - id: `${lineProps.length}`, + id: [specId, verticalValue, horizontalValue, datum.header, datum.details].join('__'), datum, linePathPoints, marker: annotationMarker, @@ -222,7 +222,7 @@ function computeXDomainLineAnnotationDimensions( : undefined; const lineProp: AnnotationLineProps = { specId, - id: `${lineProps.length}`, + id: [specId, verticalValue, horizontalValue, datum.header, datum.details].join('__'), datum, linePathPoints, marker: annotationMarker, From 7465bb3cb37efe1bcbe5ff26d1ea9cef897a29e0 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Mon, 25 Jan 2021 12:18:29 +0100 Subject: [PATCH 6/9] refactor: code changes from reviews --- .../xy_chart/annotations/line/dimensions.ts | 8 ++------ src/chart_types/xy_chart/annotations/types.ts | 2 +- .../renderer/dom/annotations/annotations.tsx | 19 ++++++++---------- .../selectors/get_annotation_tooltip_state.ts | 20 ++++++++++--------- 4 files changed, 22 insertions(+), 27 deletions(-) diff --git a/src/chart_types/xy_chart/annotations/line/dimensions.ts b/src/chart_types/xy_chart/annotations/line/dimensions.ts index 51c2fb0e5c..9cff1f7df8 100644 --- a/src/chart_types/xy_chart/annotations/line/dimensions.ts +++ b/src/chart_types/xy_chart/annotations/line/dimensions.ts @@ -101,9 +101,7 @@ function computeYDomainLineAnnotationDimensions( icon: marker, color: lineColor, dimension: markerDimensions, - position: { - ...markerPosition, - }, + position: markerPosition, alignment: anchorPosition, } : undefined; @@ -214,9 +212,7 @@ function computeXDomainLineAnnotationDimensions( icon: marker, color: lineColor, dimension: markerDimensions, - position: { - ...markerPosition, - }, + position: markerPosition, alignment: anchorPosition, } : undefined; diff --git a/src/chart_types/xy_chart/annotations/types.ts b/src/chart_types/xy_chart/annotations/types.ts index 8fdfd243b8..ea7760a8e1 100644 --- a/src/chart_types/xy_chart/annotations/types.ts +++ b/src/chart_types/xy_chart/annotations/types.ts @@ -77,7 +77,7 @@ export interface AnnotationTooltipState { } /** @internal */ -export type AnnotationDimensions = AnnotationLineProps[] | AnnotationRectProps[]; +export type AnnotationDimensions = Array; /** @internal */ export type Bounds = { diff --git a/src/chart_types/xy_chart/renderer/dom/annotations/annotations.tsx b/src/chart_types/xy_chart/renderer/dom/annotations/annotations.tsx index c8ec3b1e5b..e5bc52291b 100644 --- a/src/chart_types/xy_chart/renderer/dom/annotations/annotations.tsx +++ b/src/chart_types/xy_chart/renderer/dom/annotations/annotations.tsx @@ -68,21 +68,18 @@ interface AnnotationsOwnProps { type AnnotationsProps = AnnotationsDispatchProps & AnnotationsStateProps & AnnotationsOwnProps; +const MARKER_TRANSFORMS = { + [Position.Right]: 'translate(-50%, 0%)', + [Position.Left]: 'translate(-100%, -50%)', + [Position.Top]: 'translate(-50%, -100%)', + [Position.Bottom]: 'translate(-50%, 0%)', +}; + function getMarkerCentredTransform(alignment: Position, hasMarkerDimensions: boolean): string | undefined { if (hasMarkerDimensions) { return undefined; } - switch (alignment) { - case Position.Right: - return `translate(-50%, 0%)`; - case Position.Left: - return `translate(-100%, -50%)`; - case Position.Top: - return `translate(-50%, -100%)`; - case Position.Bottom: - default: - return `translate(-50%, 0%)`; - } + return MARKER_TRANSFORMS[alignment]; } function renderAnnotationLineMarkers( diff --git a/src/chart_types/xy_chart/state/selectors/get_annotation_tooltip_state.ts b/src/chart_types/xy_chart/state/selectors/get_annotation_tooltip_state.ts index 21c6abdd46..74932199c0 100644 --- a/src/chart_types/xy_chart/state/selectors/get_annotation_tooltip_state.ts +++ b/src/chart_types/xy_chart/state/selectors/get_annotation_tooltip_state.ts @@ -30,9 +30,10 @@ import { Dimensions } from '../../../../utils/dimensions'; import { AnnotationId } from '../../../../utils/ids'; import { Point } from '../../../../utils/point'; import { AnnotationLineProps } from '../../annotations/line/types'; +import { AnnotationRectProps } from '../../annotations/rect/types'; import { computeRectAnnotationTooltipState } from '../../annotations/tooltip'; import { AnnotationTooltipState, AnnotationDimensions } from '../../annotations/types'; -import { AxisSpec, AnnotationSpec, AnnotationTypes, LineAnnotationDatum } from '../../utils/specs'; +import { AxisSpec, AnnotationSpec, AnnotationTypes } from '../../utils/specs'; import { ComputedGeometries } from '../utils/types'; import { computeAnnotationDimensionsSelector } from './compute_annotations'; import { computeChartDimensionsSelector } from './compute_chart_dimensions'; @@ -130,13 +131,11 @@ function getTooltipStateForDOMElements( if (!spec || spec.hideTooltips) { return null; } - const annotations = annotationDimensions.get(hoveredDOMElement.createdBySpecId); - if (!annotations) { - return null; - } - const dimension = (annotations as AnnotationLineProps[]).find((d) => { - return d.id === hoveredDOMElement.id && d.datum === hoveredDOMElement.datum; - }); + const dimension = (annotationDimensions.get(hoveredDOMElement.createdBySpecId) ?? []) + .filter(isAnnotationLineProps) + .find((d) => { + return d.id === hoveredDOMElement.id && d.datum === hoveredDOMElement.datum; + }); if (!dimension) { return null; @@ -145,7 +144,7 @@ function getTooltipStateForDOMElements( return { isVisible: true, annotationType: AnnotationTypes.Line, - datum: hoveredDOMElement.datum as LineAnnotationDatum, + datum: dimension.datum, anchor: { top: (dimension.marker?.position.top ?? 0) + dimension.panel.top + chartDimensions.top, left: (dimension.marker?.position.left ?? 0) + dimension.panel.left + chartDimensions.left, @@ -155,6 +154,9 @@ function getTooltipStateForDOMElements( tooltipSettings: getTooltipSettings(spec), }; } +function isAnnotationLineProps(prop: AnnotationLineProps | AnnotationRectProps): prop is AnnotationLineProps { + return 'linePathPoints' in prop; +} function getTooltipSettings({ placement, From a6ff0b802028e6e30e1dea24c9d3ea5d6b465013 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Mon, 25 Jan 2021 15:32:57 +0100 Subject: [PATCH 7/9] refactor: export annotation line props id fn --- .../xy_chart/annotations/line/dimensions.ts | 16 ++++++++-- src/mocks/annotations/annotations.ts | 30 +++++++++++++++---- 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/src/chart_types/xy_chart/annotations/line/dimensions.ts b/src/chart_types/xy_chart/annotations/line/dimensions.ts index a413eb6682..7812628b04 100644 --- a/src/chart_types/xy_chart/annotations/line/dimensions.ts +++ b/src/chart_types/xy_chart/annotations/line/dimensions.ts @@ -107,7 +107,7 @@ function computeYDomainLineAnnotationDimensions( : undefined; const lineProp: AnnotationLineProps = { specId, - id: [specId, verticalValue, horizontalValue, datum.header, datum.details].join('__'), + id: getAnnotationLinePropsId(specId, datum, verticalValue, horizontalValue), datum, linePathPoints, marker: annotationMarker, @@ -218,7 +218,7 @@ function computeXDomainLineAnnotationDimensions( : undefined; const lineProp: AnnotationLineProps = { specId, - id: [specId, verticalValue, horizontalValue, datum.header, datum.details].join('__'), + id: getAnnotationLinePropsId(specId, datum, verticalValue, horizontalValue), datum, linePathPoints, marker: annotationMarker, @@ -396,3 +396,15 @@ function getMarkerPositionForYAnnotation( }; } } + +/** + * @internal + */ +export function getAnnotationLinePropsId( + specId: string, + datum: LineAnnotationDatum, + verticalValue?: any, + horizontalValue?: any, +) { + return [specId, verticalValue, horizontalValue, datum.header, datum.details].join('__'); +} diff --git a/src/mocks/annotations/annotations.ts b/src/mocks/annotations/annotations.ts index 2fb918193e..b702b10fde 100644 --- a/src/mocks/annotations/annotations.ts +++ b/src/mocks/annotations/annotations.ts @@ -17,6 +17,7 @@ * under the License. */ +import { getAnnotationLinePropsId } from '../../chart_types/xy_chart/annotations/line/dimensions'; import { AnnotationLineProps } from '../../chart_types/xy_chart/annotations/line/types'; import { AnnotationRectProps } from '../../chart_types/xy_chart/annotations/rect/types'; import { mergePartial, RecursivePartial } from '../../utils/common'; @@ -24,7 +25,7 @@ import { mergePartial, RecursivePartial } from '../../utils/common'; /** @internal */ export class MockAnnotationLineProps { private static readonly base: AnnotationLineProps = { - id: '0', + id: getAnnotationLinePropsId('spec1', { dataValue: 0 }), specId: 'spec1', linePathPoints: { x1: 0, @@ -36,10 +37,23 @@ export class MockAnnotationLineProps { datum: { dataValue: 0 }, }; - static default(partial?: RecursivePartial) { - return mergePartial(MockAnnotationLineProps.base, partial, { - mergeOptionalPartialValues: true, - }); + static default(partial?: RecursivePartial, smVerticalValue?: any, smHorizontalValue?: any) { + const id = getAnnotationLinePropsId( + partial?.specId ?? MockAnnotationLineProps.base.specId, + { + ...MockAnnotationLineProps.base.datum, + ...partial?.datum, + }, + smVerticalValue, + smHorizontalValue, + ); + return mergePartial( + MockAnnotationLineProps.base, + { id, ...partial }, + { + mergeOptionalPartialValues: true, + }, + ); } static fromPoints(x1 = 0, y1 = 0, x2 = 0, y2 = 0): AnnotationLineProps { @@ -52,6 +66,12 @@ export class MockAnnotationLineProps { }, }); } + + static fromPartialAndId(partial?: RecursivePartial) { + return mergePartial(MockAnnotationLineProps.base, partial, { + mergeOptionalPartialValues: true, + }); + } } /** @internal */ From 10e6ca588ae792537342ea557c2af3ce0b3dd038 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Mon, 25 Jan 2021 16:40:52 +0100 Subject: [PATCH 8/9] refactor: cleanup types --- .../xy_chart/annotations/line/dimensions.ts | 87 ++++++++++--------- .../xy_chart/annotations/line/line.test.tsx | 42 +++++---- .../annotations/line/tooltip.test.tsx | 14 +-- .../xy_chart/annotations/line/types.ts | 2 +- .../renderer/dom/annotations/annotations.tsx | 12 +-- .../selectors/get_annotation_tooltip_state.ts | 4 +- src/mocks/annotations/annotations.ts | 1 + 7 files changed, 86 insertions(+), 76 deletions(-) diff --git a/src/chart_types/xy_chart/annotations/line/dimensions.ts b/src/chart_types/xy_chart/annotations/line/dimensions.ts index 7812628b04..f5b6db6dbc 100644 --- a/src/chart_types/xy_chart/annotations/line/dimensions.ts +++ b/src/chart_types/xy_chart/annotations/line/dimensions.ts @@ -29,7 +29,6 @@ import { isHorizontalRotation } from '../../state/utils/common'; import { computeXScaleOffset } from '../../state/utils/utils'; import { getPanelSize } from '../../utils/panel'; import { AnnotationDomainTypes, LineAnnotationSpec, LineAnnotationDatum } from '../../utils/specs'; -import { AnnotationMarker } from '../types'; import { AnnotationLineProps } from './types'; function computeYDomainLineAnnotationDimensions( @@ -42,18 +41,18 @@ function computeYDomainLineAnnotationDimensions( const { id: specId, dataValues, - marker, - markerDimensions, + marker: icon, + markerDimensions: dimension, markerPosition: specMarkerPosition, style, } = annotationSpec; const lineStyle = mergeWithDefaultAnnotationLine(style); - const lineColor = lineStyle?.line?.stroke ?? 'red'; + const color = lineStyle?.line?.stroke ?? 'red'; const isHorizontalChartRotation = isHorizontalRotation(chartRotation); // let's use a default Bottom-X/Left-Y axis orientation if we are not showing an axis // but we are displaying a line annotation - const anchorPosition = getAnchorPosition(false, isHorizontalChartRotation, specMarkerPosition, axisPosition); + const alignment = getAnchorPosition(false, isHorizontalChartRotation, specMarkerPosition, axisPosition); const lineProps: AnnotationLineProps[] = []; const [domainStart, domainEnd] = yScale.domain; @@ -80,41 +79,42 @@ function computeYDomainLineAnnotationDimensions( vertical.domain.forEach((verticalValue) => { horizontal.domain.forEach((horizontalValue) => { - const topPos = vertical.scaleOrThrow(verticalValue); - const leftPos = horizontal.scaleOrThrow(horizontalValue); + const top = vertical.scaleOrThrow(verticalValue); + const left = horizontal.scaleOrThrow(horizontalValue); const width = isHorizontalChartRotation ? horizontal.bandwidth : vertical.bandwidth; const height = isHorizontalChartRotation ? vertical.bandwidth : horizontal.bandwidth; - const markerPosition = getMarkerPositionForYAnnotation( + const position = getMarkerPositionForYAnnotation( panelSize, chartRotation, - anchorPosition, + alignment, annotationValueYPosition, - markerDimensions, + dimension, ); const linePathPoints = getYLinePath({ width, height }, annotationValueYPosition); - const annotationMarker: AnnotationMarker | undefined = marker - ? { - icon: marker, - color: lineColor, - dimension: markerDimensions, - position: markerPosition, - alignment: anchorPosition, - } - : undefined; const lineProp: AnnotationLineProps = { specId, id: getAnnotationLinePropsId(specId, datum, verticalValue, horizontalValue), datum, linePathPoints, - marker: annotationMarker, + markers: icon + ? [ + { + icon, + color, + dimension, + position, + alignment, + }, + ] + : [], panel: { ...panelSize, - top: topPos, - left: leftPos, + top, + left, }, }; @@ -137,17 +137,17 @@ function computeXDomainLineAnnotationDimensions( const { id: specId, dataValues, - marker, - markerDimensions, + marker: icon, + markerDimensions: dimension, markerPosition: specMarkerPosition, style, } = annotationSpec; const lineStyle = mergeWithDefaultAnnotationLine(style); - const lineColor = lineStyle?.line?.stroke ?? 'red'; + const color = lineStyle?.line?.stroke ?? 'red'; const lineProps: AnnotationLineProps[] = []; const isHorizontalChartRotation = isHorizontalRotation(chartRotation); - const anchorPosition = getAnchorPosition(true, isHorizontalChartRotation, specMarkerPosition, axisPosition); + const alignment = getAnchorPosition(true, isHorizontalChartRotation, specMarkerPosition, axisPosition); const panelSize = getPanelSize({ vertical, horizontal }); dataValues.forEach((datum: LineAnnotationDatum) => { @@ -192,40 +192,41 @@ function computeXDomainLineAnnotationDimensions( return; } - const topPos = vertical.scaleOrThrow(verticalValue); - const leftPos = horizontal.scaleOrThrow(horizontalValue); + const top = vertical.scaleOrThrow(verticalValue); + const left = horizontal.scaleOrThrow(horizontalValue); const width = isHorizontalChartRotation ? horizontal.bandwidth : vertical.bandwidth; const height = isHorizontalChartRotation ? vertical.bandwidth : horizontal.bandwidth; - const markerPosition = getMarkerPositionForXAnnotation( + const position = getMarkerPositionForXAnnotation( panelSize, chartRotation, - anchorPosition, + alignment, annotationValueXPosition, - markerDimensions, + dimension, ); const linePathPoints = getXLinePath({ width, height }, annotationValueXPosition); - const annotationMarker: AnnotationMarker | undefined = marker - ? { - icon: marker, - color: lineColor, - dimension: markerDimensions, - position: markerPosition, - alignment: anchorPosition, - } - : undefined; const lineProp: AnnotationLineProps = { specId, id: getAnnotationLinePropsId(specId, datum, verticalValue, horizontalValue), datum, linePathPoints, - marker: annotationMarker, + markers: icon + ? [ + { + icon, + color, + dimension, + position, + alignment, + }, + ] + : [], panel: { ...panelSize, - top: topPos, - left: leftPos, + top, + left, }, }; lineProps.push(lineProp); diff --git a/src/chart_types/xy_chart/annotations/line/line.test.tsx b/src/chart_types/xy_chart/annotations/line/line.test.tsx index 228bd47bc7..996d289ac7 100644 --- a/src/chart_types/xy_chart/annotations/line/line.test.tsx +++ b/src/chart_types/xy_chart/annotations/line/line.test.tsx @@ -85,12 +85,14 @@ describe('annotation marker', () => { }, specId: 'foo-line', datum: { dataValue: 2, details: 'foo' }, - marker: { - icon:

, - color: '#777', - position: { left: -0, top: 80 }, - alignment: 'left', - }, + markers: [ + { + icon:
, + color: '#777', + position: { left: -0, top: 80 }, + alignment: 'left', + }, + ], }), ]; expect(dimensions.get(id)).toEqual(expectedDimensions); @@ -123,12 +125,14 @@ describe('annotation marker', () => { }, specId: 'foo-line', datum: { dataValue: 2, details: 'foo' }, - marker: { - icon:
, - color: '#777', - position: { left: -0, top: 20 }, - alignment: 'left', - }, + markers: [ + { + icon:
, + color: '#777', + position: { left: -0, top: 20 }, + alignment: 'left', + }, + ], }), ]; expect(dimensions.get(id)).toEqual(expectedDimensions); @@ -157,12 +161,14 @@ describe('annotation marker', () => { x2: 20, y2: 100, }, - marker: { - icon:
, - color: '#777', - position: { top: 100, left: 20 }, - alignment: 'bottom', - }, + markers: [ + { + icon:
, + color: '#777', + position: { top: 100, left: 20 }, + alignment: 'bottom', + }, + ], }), ]; expect(dimensions.get(id)).toEqual(expectedDimensions); diff --git a/src/chart_types/xy_chart/annotations/line/tooltip.test.tsx b/src/chart_types/xy_chart/annotations/line/tooltip.test.tsx index f66626585d..e40f550b30 100644 --- a/src/chart_types/xy_chart/annotations/line/tooltip.test.tsx +++ b/src/chart_types/xy_chart/annotations/line/tooltip.test.tsx @@ -126,12 +126,14 @@ describe('Annotation tooltips', () => { x2: 3, y2: 4, }, - marker: { - icon: React.createElement('div'), - color: 'red', - dimension: { width: 10, height: 10 }, - position: { top: 0, left: 0 }, - }, + markers: [ + { + icon: React.createElement('div'), + color: 'red', + dimension: { width: 10, height: 10 }, + position: { top: 0, left: 0 }, + }, + ], }), ]; const chartRotation: Rotation = 0; diff --git a/src/chart_types/xy_chart/annotations/line/types.ts b/src/chart_types/xy_chart/annotations/line/types.ts index 08d74e16ee..f736198cd8 100644 --- a/src/chart_types/xy_chart/annotations/line/types.ts +++ b/src/chart_types/xy_chart/annotations/line/types.ts @@ -31,6 +31,6 @@ export interface AnnotationLineProps { * The path points of a line annotation */ linePathPoints: Line; - marker?: AnnotationMarker; + markers: Array; panel: Dimensions; } diff --git a/src/chart_types/xy_chart/renderer/dom/annotations/annotations.tsx b/src/chart_types/xy_chart/renderer/dom/annotations/annotations.tsx index c65c027adc..d0482e40c9 100644 --- a/src/chart_types/xy_chart/renderer/dom/annotations/annotations.tsx +++ b/src/chart_types/xy_chart/renderer/dom/annotations/annotations.tsx @@ -88,11 +88,11 @@ function renderAnnotationLineMarkers( onDOMElementEnter: typeof onDOMElementEnterAction, onDOMElementLeave: typeof onDOMElementLeaveAction, ) { - return annotationLines.reduce((markers, { id, specId, datum, marker, panel }: AnnotationLineProps) => { - if (!marker) { - return markers; + return annotationLines.reduce((acc, { id, specId, datum, markers, panel }: AnnotationLineProps) => { + if (markers.length === 0) { + return acc; } - const { icon, color, position, alignment, dimension } = marker; + const { icon, color, position, alignment, dimension } = markers[0]; const style = { color, top: chartDimensions.top + position.top + panel.top, @@ -100,7 +100,7 @@ function renderAnnotationLineMarkers( }; const transform = { transform: getMarkerCentredTransform(alignment, Boolean(dimension)) }; - markers.push( + acc.push(
, ); - return markers; + return acc; }, []); } const AnnotationsComponent = ({ diff --git a/src/chart_types/xy_chart/state/selectors/get_annotation_tooltip_state.ts b/src/chart_types/xy_chart/state/selectors/get_annotation_tooltip_state.ts index 9f9210c93b..7d3d48491e 100644 --- a/src/chart_types/xy_chart/state/selectors/get_annotation_tooltip_state.ts +++ b/src/chart_types/xy_chart/state/selectors/get_annotation_tooltip_state.ts @@ -146,8 +146,8 @@ function getTooltipStateForDOMElements( annotationType: AnnotationTypes.Line, datum: dimension.datum, anchor: { - top: (dimension.marker?.position.top ?? 0) + dimension.panel.top + chartDimensions.top, - left: (dimension.marker?.position.left ?? 0) + dimension.panel.left + chartDimensions.left, + top: (dimension.markers[0]?.position.top ?? 0) + dimension.panel.top + chartDimensions.top, + left: (dimension.markers[0]?.position.left ?? 0) + dimension.panel.left + chartDimensions.left, }, customTooltipDetails: spec.customTooltipDetails, customTooltip: spec.customTooltip, diff --git a/src/mocks/annotations/annotations.ts b/src/mocks/annotations/annotations.ts index b702b10fde..4730bcec22 100644 --- a/src/mocks/annotations/annotations.ts +++ b/src/mocks/annotations/annotations.ts @@ -35,6 +35,7 @@ export class MockAnnotationLineProps { }, panel: { top: 0, left: 0, width: 100, height: 100 }, datum: { dataValue: 0 }, + markers: [], }; static default(partial?: RecursivePartial, smVerticalValue?: any, smHorizontalValue?: any) { From 4ca414706a1862b69930798eafdea4b03775dd79 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Tue, 26 Jan 2021 09:59:00 +0100 Subject: [PATCH 9/9] test: fix screenshot test on small multiple --- ...ogeneous-visually-looks-correct-1-snap.png | Bin 24651 -> 24821 bytes .../6_heterogeneous_cartesians.tsx | 1 + 2 files changed, 1 insertion(+) diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-small-multiples-alpha-heterogeneous-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-small-multiples-alpha-heterogeneous-visually-looks-correct-1-snap.png index c4a9efdc8a2f22b5261cb2463509812e22dfa21d..3b4504d2f0f6aa5292219227872cabf77199ed92 100644 GIT binary patch literal 24821 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 LtE0Jxoqzrh49}TZ diff --git a/stories/small_multiples/6_heterogeneous_cartesians.tsx b/stories/small_multiples/6_heterogeneous_cartesians.tsx index bc70c85827..e78facbd01 100644 --- a/stories/small_multiples/6_heterogeneous_cartesians.tsx +++ b/stories/small_multiples/6_heterogeneous_cartesians.tsx @@ -66,6 +66,7 @@ export const Example = () => { margin: 'auto', fontSize: 8, borderRadius: 2, + lineHeight: 8, }} > MIN