From 3fbf014a8ac2c1847f250706026965e59dcc6334 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Thu, 25 Nov 2021 17:13:31 +0100 Subject: [PATCH 01/18] Add fit styles to the Theme --- packages/charts/api/charts.api.md | 29 +++++++++++++++++++ .../src/common/color_library_wrappers.ts | 7 +++-- packages/charts/src/index.ts | 1 + .../charts/src/utils/themes/dark_theme.ts | 22 ++++++++++++++ .../charts/src/utils/themes/light_theme.ts | 22 ++++++++++++++ packages/charts/src/utils/themes/theme.ts | 22 ++++++++++++++ 6 files changed, 101 insertions(+), 2 deletions(-) diff --git a/packages/charts/api/charts.api.md b/packages/charts/api/charts.api.md index d6ac5eeb84..b335274036 100644 --- a/packages/charts/api/charts.api.md +++ b/packages/charts/api/charts.api.md @@ -11,6 +11,9 @@ import { default as React_2 } from 'react'; import { ReactChild } from 'react'; import { ReactNode } from 'react'; +// @public (undocumented) +export type A = number; + // @public export type Accessor = AccessorObjectKey | AccessorArrayIndex; @@ -111,6 +114,12 @@ export interface ArcStyle { visible: boolean; } +// @public (undocumented) +export type AreaFitStyle = Visible & Opacity & { + color: RgbaTuple | typeof ColorVariant.Series; + texture?: TexturedStyles; +}; + // 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 // @@ -132,6 +141,11 @@ export interface AreaSeriesStyle { // (undocumented) area: AreaStyle; // (undocumented) + fit: { + line: LineFitStyle; + area: AreaFitStyle; + }; + // (undocumented) line: LineStyle; // (undocumented) point: PointStyle; @@ -1445,6 +1459,11 @@ export interface LinearScale { type: typeof ScaleType.Linear; } +// @public (undocumented) +export type LineFitStyle = Visible & Opacity & StrokeDashArray & { + color: RgbaTuple | typeof ColorVariant.Series; +}; + // 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 // @@ -1462,6 +1481,10 @@ export type LineSeriesSpec = BasicSeriesSpec & HistogramConfig & { // @public (undocumented) export interface LineSeriesStyle { + // (undocumented) + fit: { + line: LineFitStyle; + }; // (undocumented) line: LineStyle; // (undocumented) @@ -1853,6 +1876,12 @@ export type RenderChangeListener = (isRendered: boolean) => void; // @public (undocumented) export type Rendering = 'canvas' | 'svg'; +// @public (undocumented) +export type RGB = number; + +// @public (undocumented) +export type RgbaTuple = [r: RGB, g: RGB, b: RGB, alpha: A]; + // @public (undocumented) export type Rotation = 0 | 90 | -90 | 180; diff --git a/packages/charts/src/common/color_library_wrappers.ts b/packages/charts/src/common/color_library_wrappers.ts index a45d042c8f..cd15a1f268 100644 --- a/packages/charts/src/common/color_library_wrappers.ts +++ b/packages/charts/src/common/color_library_wrappers.ts @@ -13,8 +13,11 @@ import { Logger } from '../utils/logger'; import { Color, Colors } from './colors'; import { LRUCache } from './data_structures'; -type RGB = number; -type A = number; +/** @public */ +export type RGB = number; + +/** @public */ +export type A = number; /** @internal */ export type RgbTuple = [RGB, RGB, RGB, A?]; diff --git a/packages/charts/src/index.ts b/packages/charts/src/index.ts index 4c4c982910..439979ac41 100644 --- a/packages/charts/src/index.ts +++ b/packages/charts/src/index.ts @@ -112,6 +112,7 @@ export { Pixels, Ratio } from './common/geometry'; export { AdditiveNumber } from './utils/accessor'; export { FontStyle, FONT_STYLES } from './common/text_utils'; export { Color } from './common/colors'; +export { RGB, A, RgbaTuple } from './common/color_library_wrappers'; export { ESCalendarInterval, diff --git a/packages/charts/src/utils/themes/dark_theme.ts b/packages/charts/src/utils/themes/dark_theme.ts index 7debec741d..346ac44066 100644 --- a/packages/charts/src/utils/themes/dark_theme.ts +++ b/packages/charts/src/utils/themes/dark_theme.ts @@ -6,6 +6,7 @@ * Side Public License, v 1. */ +import { ColorVariant } from '../common'; import { palettes } from './colors'; import { Theme } from './theme'; import { @@ -32,6 +33,14 @@ export const DARK_THEME: Theme = { radius: 2, opacity: 1, }, + fit: { + line: { + visible: true, + dash: [5, 5], + color: ColorVariant.Series, + opacity: 1, + }, + }, }, bubbleSeriesStyle: { point: { @@ -59,6 +68,19 @@ export const DARK_THEME: Theme = { radius: 1, opacity: 1, }, + fit: { + line: { + visible: true, + dash: [5, 5], + color: ColorVariant.Series, + opacity: 1, + }, + area: { + visible: true, + opacity: 0.15, + color: ColorVariant.Series, + }, + }, }, barSeriesStyle: { rect: { diff --git a/packages/charts/src/utils/themes/light_theme.ts b/packages/charts/src/utils/themes/light_theme.ts index 2ca93e9b4a..e4a906c702 100644 --- a/packages/charts/src/utils/themes/light_theme.ts +++ b/packages/charts/src/utils/themes/light_theme.ts @@ -7,6 +7,7 @@ */ import { Colors } from '../../common/colors'; +import { ColorVariant } from '../common'; import { palettes } from './colors'; import { Theme } from './theme'; import { @@ -33,6 +34,14 @@ export const LIGHT_THEME: Theme = { radius: 2, opacity: 1, }, + fit: { + line: { + opacity: 1, + visible: true, + dash: [5, 5], + color: ColorVariant.Series, + }, + }, }, bubbleSeriesStyle: { point: { @@ -60,6 +69,19 @@ export const LIGHT_THEME: Theme = { radius: 2, opacity: 1, }, + fit: { + line: { + visible: true, + dash: [5, 5], + color: ColorVariant.Series, + opacity: 1, + }, + area: { + visible: true, + opacity: 0.15, + color: ColorVariant.Series, + }, + }, }, barSeriesStyle: { rect: { diff --git a/packages/charts/src/utils/themes/theme.ts b/packages/charts/src/utils/themes/theme.ts index 1ff002e732..fc2748743f 100644 --- a/packages/charts/src/utils/themes/theme.ts +++ b/packages/charts/src/utils/themes/theme.ts @@ -8,6 +8,7 @@ import { $Values } from 'utility-types'; +import { RgbaTuple } from '../../common/color_library_wrappers'; import { Color } from '../../common/colors'; import { Pixels, Ratio } from '../../common/geometry'; import { FontStyle } from '../../common/text_utils'; @@ -532,6 +533,9 @@ export interface BubbleSeriesStyle { export interface LineSeriesStyle { line: LineStyle; point: PointStyle; + fit: { + line: LineFitStyle; + }; } /** @public */ @@ -539,8 +543,26 @@ export interface AreaSeriesStyle { area: AreaStyle; line: LineStyle; point: PointStyle; + fit: { + line: LineFitStyle; + area: AreaFitStyle; + }; } +/** @public */ +export type AreaFitStyle = Visible & + Opacity & { + color: RgbaTuple | typeof ColorVariant.Series; + texture?: TexturedStyles; + }; + +/** @public */ +export type LineFitStyle = Visible & + Opacity & + StrokeDashArray & { + color: RgbaTuple | typeof ColorVariant.Series; + }; + /** @public */ export interface ArcSeriesStyle { arc: ArcStyle; From ce7ccc4b4f68457547867aa7ecf6971679901b35 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Thu, 25 Nov 2021 17:14:51 +0100 Subject: [PATCH 02/18] Pass the fit style with each geometry --- .../src/chart_types/xy_chart/rendering/area.ts | 1 + .../src/chart_types/xy_chart/rendering/line.ts | 1 + packages/charts/src/utils/geometry.ts | 12 +++++++++++- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/charts/src/chart_types/xy_chart/rendering/area.ts b/packages/charts/src/chart_types/xy_chart/rendering/area.ts index 969e6dfe18..113ae8b411 100644 --- a/packages/charts/src/chart_types/xy_chart/rendering/area.ts +++ b/packages/charts/src/chart_types/xy_chart/rendering/area.ts @@ -104,6 +104,7 @@ export function renderArea( seriesAreaStyle: seriesStyle.area, seriesAreaLineStyle: seriesStyle.line, seriesPointStyle: seriesStyle.point, + fitStyle: seriesStyle.fit, isStacked, clippedRanges, hideClippedRanges: !hasFit, diff --git a/packages/charts/src/chart_types/xy_chart/rendering/line.ts b/packages/charts/src/chart_types/xy_chart/rendering/line.ts index 27fa929779..bf507b1ec1 100644 --- a/packages/charts/src/chart_types/xy_chart/rendering/line.ts +++ b/packages/charts/src/chart_types/xy_chart/rendering/line.ts @@ -83,6 +83,7 @@ export function renderLine( }, seriesLineStyle: seriesStyle.line, seriesPointStyle: seriesStyle.point, + fitStyle: seriesStyle.fit, clippedRanges, hideClippedRanges: !hasFit, }; diff --git a/packages/charts/src/utils/geometry.ts b/packages/charts/src/utils/geometry.ts index 2b3fdd9e88..0f35bad9ff 100644 --- a/packages/charts/src/utils/geometry.ts +++ b/packages/charts/src/utils/geometry.ts @@ -13,7 +13,15 @@ import { LabelOverflowConstraint } from '../chart_types/xy_chart/utils/specs'; import { Color } from '../common/colors'; import { Fill, Stroke } from '../geoms/types'; import { Dimensions } from './dimensions'; -import { BarSeriesStyle, PointStyle, AreaStyle, LineStyle, PointShape } from './themes/theme'; +import { + BarSeriesStyle, + PointStyle, + AreaStyle, + LineStyle, + PointShape, + LineSeriesStyle, + AreaSeriesStyle, +} from './themes/theme'; /** * The accessor type @@ -118,6 +126,7 @@ export interface LineGeometry { seriesIdentifier: XYChartSeriesIdentifier; seriesLineStyle: LineStyle; seriesPointStyle: PointStyle; + fitStyle: LineSeriesStyle['fit']; /** * Ranges of `[x0, x1]` pairs to clip from series */ @@ -139,6 +148,7 @@ export interface AreaGeometry { seriesAreaStyle: AreaStyle; seriesAreaLineStyle: LineStyle; seriesPointStyle: PointStyle; + fitStyle: AreaSeriesStyle['fit']; isStacked: boolean; /** * Ranges of `[x0, x1]` pairs to clip from series From ad0b97afc8204a9aa279cb923c58586ffc3dfeee Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Thu, 25 Nov 2021 17:15:26 +0100 Subject: [PATCH 03/18] Use the geometry fit style when rendering --- .../xy_chart/renderer/canvas/areas.ts | 81 ++++++++++++++++--- .../xy_chart/renderer/canvas/lines.ts | 28 +++++-- .../renderer/canvas/primitives/path.ts | 10 +-- 3 files changed, 99 insertions(+), 20 deletions(-) diff --git a/packages/charts/src/chart_types/xy_chart/renderer/canvas/areas.ts b/packages/charts/src/chart_types/xy_chart/renderer/canvas/areas.ts index 389ccb731e..8696d93afc 100644 --- a/packages/charts/src/chart_types/xy_chart/renderer/canvas/areas.ts +++ b/packages/charts/src/chart_types/xy_chart/renderer/canvas/areas.ts @@ -6,14 +6,16 @@ * Side Public License, v 1. */ +import { colorToRgba, overrideOpacity, RGBATupleToString } from '../../../../common/color_library_wrappers'; import { LegendItem } from '../../../../common/legend'; -import { Rect } from '../../../../geoms/types'; +import { Fill, Rect, Stroke } from '../../../../geoms/types'; import { withContext } from '../../../../renderers/canvas'; -import { Rotation } from '../../../../utils/common'; +import { ColorVariant, Rotation } from '../../../../utils/common'; import { Dimensions } from '../../../../utils/dimensions'; import { AreaGeometry, PerPanel } from '../../../../utils/geometry'; import { SharedGeometryStateStyle } from '../../../../utils/themes/theme'; import { getGeometryStateStyle } from '../../rendering/utils'; +import { getTextureStyles } from '../../utils/texture'; import { renderPoints } from './points'; import { renderLinePaths, renderAreaPath } from './primitives/path'; import { buildAreaStyles } from './styles/area'; @@ -80,28 +82,87 @@ export function renderAreas(ctx: CanvasRenderingContext2D, imgCanvas: HTMLCanvas function renderArea( ctx: CanvasRenderingContext2D, imgCanvas: HTMLCanvasElement, - glyph: AreaGeometry, + geometry: AreaGeometry, sharedStyle: SharedGeometryStateStyle, clippings: Rect, highlightedLegendItem?: LegendItem, ) { - const { area, color, transform, seriesIdentifier, seriesAreaStyle, clippedRanges, hideClippedRanges } = glyph; + const { + area, + color, + transform, + seriesIdentifier, + seriesAreaStyle, + fitStyle, + clippedRanges, + hideClippedRanges, + } = geometry; const geometryStateStyle = getGeometryStateStyle(seriesIdentifier, sharedStyle, highlightedLegendItem); - const styles = buildAreaStyles(ctx, imgCanvas, color, seriesAreaStyle, geometryStateStyle); + const areaFill = buildAreaStyles(ctx, imgCanvas, color, seriesAreaStyle, geometryStateStyle); - renderAreaPath(ctx, transform, area, styles, clippedRanges, clippings, hideClippedRanges); + const fitAreaFillColor = fitStyle.area.color === ColorVariant.Series ? colorToRgba(color) : fitStyle.area.color; + const fitAreaFill: Fill = { + texture: getTextureStyles( + ctx, + imgCanvas, + RGBATupleToString(fitAreaFillColor), + geometryStateStyle.opacity, + fitStyle.area.texture, + ), + color: overrideOpacity(fitAreaFillColor, (opacity) => opacity * geometryStateStyle.opacity * fitStyle.area.opacity), + }; + + renderAreaPath( + ctx, + transform, + area, + areaFill, + fitAreaFill, + clippedRanges, + clippings, + hideClippedRanges || !fitStyle.area.visible, + ); } function renderAreaLines( ctx: CanvasRenderingContext2D, - glyph: AreaGeometry, + geometry: AreaGeometry, sharedStyle: SharedGeometryStateStyle, clippings: Rect, highlightedLegendItem?: LegendItem, ) { - const { lines, color, seriesIdentifier, transform, seriesAreaLineStyle, clippedRanges, hideClippedRanges } = glyph; + const { + lines, + color, + seriesIdentifier, + transform, + seriesAreaLineStyle, + clippedRanges, + hideClippedRanges, + fitStyle, + } = geometry; const geometryStateStyle = getGeometryStateStyle(seriesIdentifier, sharedStyle, highlightedLegendItem); - const styles = buildLineStyles(color, seriesAreaLineStyle, geometryStateStyle); + const lineStyle = buildLineStyles(color, seriesAreaLineStyle, geometryStateStyle); + + const fitLineStrokeColor = fitStyle.line.color === ColorVariant.Series ? colorToRgba(color) : fitStyle.line.color; + + const fitLineStroke: Stroke = { + dash: fitStyle.line.dash, + width: seriesAreaLineStyle.strokeWidth, + color: overrideOpacity( + fitLineStrokeColor, + (opacity) => opacity * geometryStateStyle.opacity * fitStyle.line.opacity, + ), + }; - renderLinePaths(ctx, transform, lines, styles, clippedRanges, clippings, hideClippedRanges); + renderLinePaths( + ctx, + transform, + lines, + lineStyle, + fitLineStroke, + clippedRanges, + clippings, + hideClippedRanges || !fitStyle.line.visible, + ); } diff --git a/packages/charts/src/chart_types/xy_chart/renderer/canvas/lines.ts b/packages/charts/src/chart_types/xy_chart/renderer/canvas/lines.ts index df2a0f1ec4..48201f882e 100644 --- a/packages/charts/src/chart_types/xy_chart/renderer/canvas/lines.ts +++ b/packages/charts/src/chart_types/xy_chart/renderer/canvas/lines.ts @@ -6,10 +6,11 @@ * Side Public License, v 1. */ +import { colorToRgba, overrideOpacity } from '../../../../common/color_library_wrappers'; import { LegendItem } from '../../../../common/legend'; -import { Rect } from '../../../../geoms/types'; +import { Rect, Stroke } from '../../../../geoms/types'; import { withContext } from '../../../../renderers/canvas'; -import { Rotation } from '../../../../utils/common'; +import { ColorVariant, Rotation } from '../../../../utils/common'; import { Dimensions } from '../../../../utils/dimensions'; import { LineGeometry, PerPanel } from '../../../../utils/geometry'; import { SharedGeometryStateStyle } from '../../../../utils/themes/theme'; @@ -73,8 +74,25 @@ function renderLine( clippings: Rect, highlightedLegendItem?: LegendItem, ) { - const { color, transform, seriesIdentifier, seriesLineStyle, clippedRanges, hideClippedRanges } = line; + const { color, transform, seriesIdentifier, seriesLineStyle, clippedRanges, hideClippedRanges, fitStyle } = line; const geometryStyle = getGeometryStateStyle(seriesIdentifier, sharedStyle, highlightedLegendItem); - const stroke = buildLineStyles(color, seriesLineStyle, geometryStyle); - renderLinePaths(ctx, transform, [line.line], stroke, clippedRanges, clippings, hideClippedRanges); + + const lineStroke = buildLineStyles(color, seriesLineStyle, geometryStyle); + const fitLineStrokeColor = fitStyle.line.color === ColorVariant.Series ? colorToRgba(color) : fitStyle.line.color; + const fitLineStroke: Stroke = { + dash: fitStyle.line.dash, + width: seriesLineStyle.strokeWidth, + color: overrideOpacity(fitLineStrokeColor, (opacity) => opacity * geometryStyle.opacity * fitStyle.line.opacity), + }; + + renderLinePaths( + ctx, + transform, + [line.line], + lineStroke, + fitLineStroke, + clippedRanges, + clippings, + hideClippedRanges || !fitStyle.line.visible, + ); } diff --git a/packages/charts/src/chart_types/xy_chart/renderer/canvas/primitives/path.ts b/packages/charts/src/chart_types/xy_chart/renderer/canvas/primitives/path.ts index 465c2e206b..b7ce1e0b82 100644 --- a/packages/charts/src/chart_types/xy_chart/renderer/canvas/primitives/path.ts +++ b/packages/charts/src/chart_types/xy_chart/renderer/canvas/primitives/path.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { overrideOpacity, RGBATupleToString } from '../../../../../common/color_library_wrappers'; +import { RGBATupleToString } from '../../../../../common/color_library_wrappers'; import { Fill, Rect, Stroke } from '../../../../../geoms/types'; import { withClipRanges } from '../../../../../renderers/canvas'; import { ClippedRanges } from '../../../../../utils/geometry'; @@ -19,6 +19,7 @@ export function renderLinePaths( transform: Point, linePaths: Array, stroke: Stroke, + fitStroke: Stroke, clippedRanges: ClippedRanges, clippings: Rect, hideClippedRanges = false, @@ -30,7 +31,7 @@ export function renderLinePaths( if (clippedRanges.length > 0 && !hideClippedRanges) { withClipRanges(ctx, clippedRanges, clippings, true, () => { ctx.translate(transform.x, transform.y); - renderMultiLine(ctx, linePaths, { ...stroke, dash: [5, 5] }); + renderMultiLine(ctx, linePaths, fitStroke); }); } } @@ -41,15 +42,14 @@ export function renderAreaPath( transform: Point, area: string, fill: Fill, + fitFill: Fill, clippedRanges: ClippedRanges, clippings: Rect, hideClippedRanges = false, ) { withClipRanges(ctx, clippedRanges, clippings, false, () => renderPathFill(ctx, area, fill, transform)); if (clippedRanges.length > 0 && !hideClippedRanges) { - withClipRanges(ctx, clippedRanges, clippings, true, () => - renderPathFill(ctx, area, { ...fill, color: overrideOpacity(fill.color, fill.color[3] / 2) }, transform), - ); + withClipRanges(ctx, clippedRanges, clippings, true, () => renderPathFill(ctx, area, fitFill, transform)); } } From be2607f1ba4657ce77f0537b391a92dfa7712e5b Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Thu, 25 Nov 2021 18:21:12 +0100 Subject: [PATCH 04/18] Fix type changes in unit test --- packages/charts/src/mocks/geometries.ts | 2 ++ .../charts/src/utils/themes/theme.test.ts | 21 +++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/packages/charts/src/mocks/geometries.ts b/packages/charts/src/mocks/geometries.ts index 811ee39df3..c3a6c6caa0 100644 --- a/packages/charts/src/mocks/geometries.ts +++ b/packages/charts/src/mocks/geometries.ts @@ -73,6 +73,7 @@ export class MockLineGeometry { seriesIdentifier: MockSeriesIdentifier.default(), seriesLineStyle: lineSeriesStyle.line, seriesPointStyle: lineSeriesStyle.point, + fitStyle: lineSeriesStyle.fit, clippedRanges: [], }; @@ -93,6 +94,7 @@ export class MockAreaGeometry { seriesAreaStyle: areaSeriesStyle.area, seriesAreaLineStyle: areaSeriesStyle.line, seriesPointStyle: areaSeriesStyle.point, + fitStyle: areaSeriesStyle.fit, isStacked: false, clippedRanges: [], }; diff --git a/packages/charts/src/utils/themes/theme.test.ts b/packages/charts/src/utils/themes/theme.test.ts index f2c3103dd6..284bf948c6 100644 --- a/packages/charts/src/utils/themes/theme.test.ts +++ b/packages/charts/src/utils/themes/theme.test.ts @@ -158,6 +158,14 @@ describe('Theme', () => { visible: true, opacity: 314571, }, + fit: { + line: { + opacity: 314571, + visible: false, + dash: [1, 2, 3, 4], + color: [1, 2, 3, 4], + }, + }, }; const customTheme = mergeWithDefaultTheme({ lineSeriesStyle, @@ -203,6 +211,19 @@ describe('Theme', () => { strokeWidth: 314571, opacity: 314571, }, + fit: { + area: { + opacity: 314571, + visible: false, + color: [1, 2, 3, 4], + }, + line: { + opacity: 314571, + visible: false, + dash: [1, 2, 3, 4], + color: [1, 2, 3, 4], + }, + }, }; const customTheme = mergeWithDefaultTheme({ areaSeriesStyle, From b98646d923476093dcf4415f27dd063a35482fc0 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Thu, 25 Nov 2021 18:43:51 +0100 Subject: [PATCH 05/18] Simplify AreaGeometry object structure --- .../xy_chart/renderer/canvas/areas.ts | 57 +++++++------------ .../chart_types/xy_chart/rendering/area.ts | 9 +-- .../xy_chart/state/utils/utils.test.ts | 6 +- packages/charts/src/mocks/geometries.ts | 5 +- packages/charts/src/utils/geometry.ts | 15 +---- 5 files changed, 30 insertions(+), 62 deletions(-) diff --git a/packages/charts/src/chart_types/xy_chart/renderer/canvas/areas.ts b/packages/charts/src/chart_types/xy_chart/renderer/canvas/areas.ts index 8696d93afc..aa40135f3c 100644 --- a/packages/charts/src/chart_types/xy_chart/renderer/canvas/areas.ts +++ b/packages/charts/src/chart_types/xy_chart/renderer/canvas/areas.ts @@ -37,8 +37,8 @@ export function renderAreas(ctx: CanvasRenderingContext2D, imgCanvas: HTMLCanvas withContext(ctx, () => { areas.forEach(({ panel, value: area }) => { - const { seriesAreaLineStyle, seriesAreaStyle } = area; - if (seriesAreaStyle.visible) { + const { style } = area; + if (style.area.visible) { withPanelTransform( ctx, panel, @@ -48,7 +48,7 @@ export function renderAreas(ctx: CanvasRenderingContext2D, imgCanvas: HTMLCanvas { area: clippings, shouldClip: true }, ); } - if (seriesAreaLineStyle.visible) { + if (style.line.visible) { withPanelTransform( ctx, panel, @@ -61,8 +61,8 @@ export function renderAreas(ctx: CanvasRenderingContext2D, imgCanvas: HTMLCanvas }); areas.forEach(({ panel, value: area }) => { - const { seriesPointStyle, seriesIdentifier, points } = area; - const visiblePoints = seriesPointStyle.visible ? points : points.filter(({ orphan }) => orphan); + const { style, seriesIdentifier, points } = area; + const visiblePoints = style.point.visible ? points : points.filter(({ orphan }) => orphan); if (visiblePoints.length === 0) { return; } @@ -87,29 +87,23 @@ function renderArea( clippings: Rect, highlightedLegendItem?: LegendItem, ) { - const { - area, - color, - transform, - seriesIdentifier, - seriesAreaStyle, - fitStyle, - clippedRanges, - hideClippedRanges, - } = geometry; + const { area, color, transform, seriesIdentifier, style, clippedRanges, hideClippedRanges } = geometry; const geometryStateStyle = getGeometryStateStyle(seriesIdentifier, sharedStyle, highlightedLegendItem); - const areaFill = buildAreaStyles(ctx, imgCanvas, color, seriesAreaStyle, geometryStateStyle); + const areaFill = buildAreaStyles(ctx, imgCanvas, color, style.area, geometryStateStyle); - const fitAreaFillColor = fitStyle.area.color === ColorVariant.Series ? colorToRgba(color) : fitStyle.area.color; + const fitAreaFillColor = style.fit.area.color === ColorVariant.Series ? colorToRgba(color) : style.fit.area.color; const fitAreaFill: Fill = { texture: getTextureStyles( ctx, imgCanvas, RGBATupleToString(fitAreaFillColor), geometryStateStyle.opacity, - fitStyle.area.texture, + style.fit.area.texture, + ), + color: overrideOpacity( + fitAreaFillColor, + (opacity) => opacity * geometryStateStyle.opacity * style.fit.area.opacity, ), - color: overrideOpacity(fitAreaFillColor, (opacity) => opacity * geometryStateStyle.opacity * fitStyle.area.opacity), }; renderAreaPath( @@ -120,7 +114,7 @@ function renderArea( fitAreaFill, clippedRanges, clippings, - hideClippedRanges || !fitStyle.area.visible, + hideClippedRanges || !style.fit.area.visible, ); } @@ -131,27 +125,18 @@ function renderAreaLines( clippings: Rect, highlightedLegendItem?: LegendItem, ) { - const { - lines, - color, - seriesIdentifier, - transform, - seriesAreaLineStyle, - clippedRanges, - hideClippedRanges, - fitStyle, - } = geometry; + const { lines, color, seriesIdentifier, transform, style, clippedRanges, hideClippedRanges } = geometry; const geometryStateStyle = getGeometryStateStyle(seriesIdentifier, sharedStyle, highlightedLegendItem); - const lineStyle = buildLineStyles(color, seriesAreaLineStyle, geometryStateStyle); + const lineStyle = buildLineStyles(color, style.line, geometryStateStyle); - const fitLineStrokeColor = fitStyle.line.color === ColorVariant.Series ? colorToRgba(color) : fitStyle.line.color; + const fitLineStrokeColor = style.fit.line.color === ColorVariant.Series ? colorToRgba(color) : style.fit.line.color; const fitLineStroke: Stroke = { - dash: fitStyle.line.dash, - width: seriesAreaLineStyle.strokeWidth, + dash: style.fit.line.dash, + width: style.line.strokeWidth, color: overrideOpacity( fitLineStrokeColor, - (opacity) => opacity * geometryStateStyle.opacity * fitStyle.line.opacity, + (opacity) => opacity * geometryStateStyle.opacity * style.fit.line.opacity, ), }; @@ -163,6 +148,6 @@ function renderAreaLines( fitLineStroke, clippedRanges, clippings, - hideClippedRanges || !fitStyle.line.visible, + hideClippedRanges || !style.fit.line.visible, ); } diff --git a/packages/charts/src/chart_types/xy_chart/rendering/area.ts b/packages/charts/src/chart_types/xy_chart/rendering/area.ts index 113ae8b411..815e332e9b 100644 --- a/packages/charts/src/chart_types/xy_chart/rendering/area.ts +++ b/packages/charts/src/chart_types/xy_chart/rendering/area.ts @@ -38,7 +38,7 @@ export function renderArea( curve: CurveType, hasY0Accessors: boolean, xScaleOffset: number, - seriesStyle: AreaSeriesStyle, + style: AreaSeriesStyle, markSizeOptions: MarkSizeOptions, isStacked = false, pointStyleAccessor?: PointStyleAccessor, @@ -76,7 +76,7 @@ export function renderArea( yScale, panel, color, - seriesStyle.point, + style.point, hasY0Accessors, markSizeOptions, pointStyleAccessor, @@ -101,10 +101,7 @@ export function renderArea( smHorizontalAccessorValue: dataSeries.smHorizontalAccessorValue, smVerticalAccessorValue: dataSeries.smVerticalAccessorValue, }, - seriesAreaStyle: seriesStyle.area, - seriesAreaLineStyle: seriesStyle.line, - seriesPointStyle: seriesStyle.point, - fitStyle: seriesStyle.fit, + style, isStacked, clippedRanges, hideClippedRanges: !hasFit, diff --git a/packages/charts/src/chart_types/xy_chart/state/utils/utils.test.ts b/packages/charts/src/chart_types/xy_chart/state/utils/utils.test.ts index 555998c70d..1a2c056ca6 100644 --- a/packages/charts/src/chart_types/xy_chart/state/utils/utils.test.ts +++ b/packages/charts/src/chart_types/xy_chart/state/utils/utils.test.ts @@ -609,17 +609,17 @@ describe('Chart State utils', () => { const geometries = getGeometriesFromSpecs([area1, area2, area3]); expect(geometries.geometries.areas[0].value.color).toBe('violet'); - expect(geometries.geometries.areas[0].value.seriesAreaStyle).toEqual({ + expect(geometries.geometries.areas[0].value.style.area).toEqual({ visible: true, fill: 'area-fill-custom-color', opacity: 0.2, }); - expect(geometries.geometries.areas[0].value.seriesAreaLineStyle).toEqual({ + expect(geometries.geometries.areas[0].value.style.line).toEqual({ visible: true, strokeWidth: 100, opacity: 1, }); - expect(geometries.geometries.areas[0].value.seriesPointStyle).toEqual({ + expect(geometries.geometries.areas[0].value.style.point).toEqual({ visible: false, fill: 'point-fill-custom-color', // the override strokeWidth opacity: 1, diff --git a/packages/charts/src/mocks/geometries.ts b/packages/charts/src/mocks/geometries.ts index c3a6c6caa0..946b996e09 100644 --- a/packages/charts/src/mocks/geometries.ts +++ b/packages/charts/src/mocks/geometries.ts @@ -91,10 +91,7 @@ export class MockAreaGeometry { color: Colors.Red.keyword, transform: { x: 0, y: 0 }, seriesIdentifier: MockSeriesIdentifier.default(), - seriesAreaStyle: areaSeriesStyle.area, - seriesAreaLineStyle: areaSeriesStyle.line, - seriesPointStyle: areaSeriesStyle.point, - fitStyle: areaSeriesStyle.fit, + style: areaSeriesStyle, isStacked: false, clippedRanges: [], }; diff --git a/packages/charts/src/utils/geometry.ts b/packages/charts/src/utils/geometry.ts index 0f35bad9ff..36ac2d7216 100644 --- a/packages/charts/src/utils/geometry.ts +++ b/packages/charts/src/utils/geometry.ts @@ -13,15 +13,7 @@ import { LabelOverflowConstraint } from '../chart_types/xy_chart/utils/specs'; import { Color } from '../common/colors'; import { Fill, Stroke } from '../geoms/types'; import { Dimensions } from './dimensions'; -import { - BarSeriesStyle, - PointStyle, - AreaStyle, - LineStyle, - PointShape, - LineSeriesStyle, - AreaSeriesStyle, -} from './themes/theme'; +import { BarSeriesStyle, PointStyle, LineStyle, PointShape, LineSeriesStyle, AreaSeriesStyle } from './themes/theme'; /** * The accessor type @@ -145,10 +137,7 @@ export interface AreaGeometry { y: number; }; seriesIdentifier: XYChartSeriesIdentifier; - seriesAreaStyle: AreaStyle; - seriesAreaLineStyle: LineStyle; - seriesPointStyle: PointStyle; - fitStyle: AreaSeriesStyle['fit']; + style: AreaSeriesStyle; isStacked: boolean; /** * Ranges of `[x0, x1]` pairs to clip from series From 30ec309f7cfe83d127178bcbf8e8cee718c92403 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Thu, 25 Nov 2021 19:19:07 +0100 Subject: [PATCH 06/18] Simplify LineGeometry object structure --- .../xy_chart/renderer/canvas/lines.ts | 20 +++++++++--------- .../chart_types/xy_chart/rendering/line.ts | 4 +--- .../state/selectors/get_debug_state.ts | 21 ++++++++----------- .../xy_chart/state/utils/utils.test.ts | 4 ++-- packages/charts/src/mocks/geometries.ts | 4 +--- packages/charts/src/utils/geometry.ts | 6 ++---- 6 files changed, 25 insertions(+), 34 deletions(-) diff --git a/packages/charts/src/chart_types/xy_chart/renderer/canvas/lines.ts b/packages/charts/src/chart_types/xy_chart/renderer/canvas/lines.ts index 48201f882e..085fe04acc 100644 --- a/packages/charts/src/chart_types/xy_chart/renderer/canvas/lines.ts +++ b/packages/charts/src/chart_types/xy_chart/renderer/canvas/lines.ts @@ -36,9 +36,9 @@ export function renderLines(ctx: CanvasRenderingContext2D, props: LineGeometries const { lines, sharedStyle, highlightedLegendItem, clippings, renderingArea, rotation } = props; lines.forEach(({ panel, value: line }) => { - const { seriesLineStyle, seriesPointStyle, points } = line; + const { style, points } = line; - if (seriesLineStyle.visible) { + if (style.line.visible) { withPanelTransform( ctx, panel, @@ -49,7 +49,7 @@ export function renderLines(ctx: CanvasRenderingContext2D, props: LineGeometries ); } - const visiblePoints = seriesPointStyle.visible ? points : points.filter(({ orphan }) => orphan); + const visiblePoints = style.point.visible ? points : points.filter(({ orphan }) => orphan); if (visiblePoints.length === 0) { return; } @@ -74,15 +74,15 @@ function renderLine( clippings: Rect, highlightedLegendItem?: LegendItem, ) { - const { color, transform, seriesIdentifier, seriesLineStyle, clippedRanges, hideClippedRanges, fitStyle } = line; + const { color, transform, seriesIdentifier, style, clippedRanges, hideClippedRanges } = line; const geometryStyle = getGeometryStateStyle(seriesIdentifier, sharedStyle, highlightedLegendItem); - const lineStroke = buildLineStyles(color, seriesLineStyle, geometryStyle); - const fitLineStrokeColor = fitStyle.line.color === ColorVariant.Series ? colorToRgba(color) : fitStyle.line.color; + const lineStroke = buildLineStyles(color, style.line, geometryStyle); + const fitLineStrokeColor = style.fit.line.color === ColorVariant.Series ? colorToRgba(color) : style.fit.line.color; const fitLineStroke: Stroke = { - dash: fitStyle.line.dash, - width: seriesLineStyle.strokeWidth, - color: overrideOpacity(fitLineStrokeColor, (opacity) => opacity * geometryStyle.opacity * fitStyle.line.opacity), + dash: style.fit.line.dash, + width: style.line.strokeWidth, + color: overrideOpacity(fitLineStrokeColor, (opacity) => opacity * geometryStyle.opacity * style.fit.line.opacity), }; renderLinePaths( @@ -93,6 +93,6 @@ function renderLine( fitLineStroke, clippedRanges, clippings, - hideClippedRanges || !fitStyle.line.visible, + hideClippedRanges || !style.fit.line.visible, ); } diff --git a/packages/charts/src/chart_types/xy_chart/rendering/line.ts b/packages/charts/src/chart_types/xy_chart/rendering/line.ts index bf507b1ec1..467e77e772 100644 --- a/packages/charts/src/chart_types/xy_chart/rendering/line.ts +++ b/packages/charts/src/chart_types/xy_chart/rendering/line.ts @@ -81,9 +81,7 @@ export function renderLine( smHorizontalAccessorValue: dataSeries.smHorizontalAccessorValue, smVerticalAccessorValue: dataSeries.smVerticalAccessorValue, }, - seriesLineStyle: seriesStyle.line, - seriesPointStyle: seriesStyle.point, - fitStyle: seriesStyle.fit, + style: seriesStyle, clippedRanges, hideClippedRanges: !hasFit, }; diff --git a/packages/charts/src/chart_types/xy_chart/state/selectors/get_debug_state.ts b/packages/charts/src/chart_types/xy_chart/state/selectors/get_debug_state.ts index a14ab16461..6cd2648de9 100644 --- a/packages/charts/src/chart_types/xy_chart/state/selectors/get_debug_state.ts +++ b/packages/charts/src/chart_types/xy_chart/state/selectors/get_debug_state.ts @@ -118,8 +118,8 @@ function getBarsState( barGeometries: Array>, ): DebugStateBar[] { const buckets = new Map(); - const bars = barGeometries.reduce((acc, bars) => { - return [...acc, ...bars.value]; + const bars = barGeometries.reduce((acc, { value }) => { + return [...acc, ...value]; }, []); bars.forEach( ({ @@ -162,8 +162,7 @@ function getLineState(seriesNameMap: Map) { points, color, seriesIdentifier: { key }, - seriesLineStyle, - seriesPointStyle, + style, }, }: PerPanel): DebugStateLine => { const name = seriesNameMap.get(key) ?? ''; @@ -173,8 +172,8 @@ function getLineState(seriesNameMap: Map) { color, key, name, - visible: hasVisibleStyle(seriesLineStyle), - visiblePoints: hasVisibleStyle(seriesPointStyle), + visible: hasVisibleStyle(style.line), + visiblePoints: hasVisibleStyle(style.point), points: points.map(({ value: { x, y, mark } }) => ({ x, y, mark })), }; }; @@ -188,9 +187,7 @@ function getAreaState(seriesNameMap: Map) { points, color, seriesIdentifier: { key }, - seriesAreaStyle, - seriesPointStyle, - seriesAreaLineStyle, + style, }, }: PerPanel): DebugStateArea => { const [y1Path, y0Path] = lines; @@ -212,8 +209,8 @@ function getAreaState(seriesNameMap: Map) { y1: [], }, ); - const lineVisible = hasVisibleStyle(seriesAreaLineStyle); - const visiblePoints = hasVisibleStyle(seriesPointStyle); + const lineVisible = hasVisibleStyle(style.line); + const visiblePoints = hasVisibleStyle(style.point); const name = seriesNameMap.get(key) ?? ''; return { @@ -221,7 +218,7 @@ function getAreaState(seriesNameMap: Map) { color, key, name, - visible: hasVisibleStyle(seriesAreaStyle), + visible: hasVisibleStyle(style.area), lines: { y0: y0Path ? { diff --git a/packages/charts/src/chart_types/xy_chart/state/utils/utils.test.ts b/packages/charts/src/chart_types/xy_chart/state/utils/utils.test.ts index 1a2c056ca6..fa052047bb 100644 --- a/packages/charts/src/chart_types/xy_chart/state/utils/utils.test.ts +++ b/packages/charts/src/chart_types/xy_chart/state/utils/utils.test.ts @@ -549,12 +549,12 @@ describe('Chart State utils', () => { const geometries = getGeometriesFromSpecs([line1, line2, line3]); expect(geometries.geometries.lines[0].value.color).toBe('violet'); - expect(geometries.geometries.lines[0].value.seriesLineStyle).toEqual({ + expect(geometries.geometries.lines[0].value.style.line).toEqual({ visible: true, strokeWidth: 100, // the override strokeWidth opacity: 1, }); - expect(geometries.geometries.lines[0].value.seriesPointStyle).toEqual({ + expect(geometries.geometries.lines[0].value.style.point).toEqual({ visible: true, fill: 'green', // the override strokeWidth opacity: 1, diff --git a/packages/charts/src/mocks/geometries.ts b/packages/charts/src/mocks/geometries.ts index 946b996e09..c70b95ddc9 100644 --- a/packages/charts/src/mocks/geometries.ts +++ b/packages/charts/src/mocks/geometries.ts @@ -71,9 +71,7 @@ export class MockLineGeometry { color: Colors.Red.keyword, transform: { x: 0, y: 0 }, seriesIdentifier: MockSeriesIdentifier.default(), - seriesLineStyle: lineSeriesStyle.line, - seriesPointStyle: lineSeriesStyle.point, - fitStyle: lineSeriesStyle.fit, + style: lineSeriesStyle, clippedRanges: [], }; diff --git a/packages/charts/src/utils/geometry.ts b/packages/charts/src/utils/geometry.ts index 36ac2d7216..c9af0f9a10 100644 --- a/packages/charts/src/utils/geometry.ts +++ b/packages/charts/src/utils/geometry.ts @@ -13,7 +13,7 @@ import { LabelOverflowConstraint } from '../chart_types/xy_chart/utils/specs'; import { Color } from '../common/colors'; import { Fill, Stroke } from '../geoms/types'; import { Dimensions } from './dimensions'; -import { BarSeriesStyle, PointStyle, LineStyle, PointShape, LineSeriesStyle, AreaSeriesStyle } from './themes/theme'; +import { BarSeriesStyle, PointStyle, PointShape, LineSeriesStyle, AreaSeriesStyle } from './themes/theme'; /** * The accessor type @@ -116,9 +116,7 @@ export interface LineGeometry { y: number; }; seriesIdentifier: XYChartSeriesIdentifier; - seriesLineStyle: LineStyle; - seriesPointStyle: PointStyle; - fitStyle: LineSeriesStyle['fit']; + style: LineSeriesStyle; /** * Ranges of `[x0, x1]` pairs to clip from series */ From 83e87b348296b850c1d5a4493f428e3e2813a2dd Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Thu, 25 Nov 2021 19:34:07 +0100 Subject: [PATCH 07/18] Reverse `hideClippedRanges` logic --- .../src/chart_types/xy_chart/renderer/canvas/areas.ts | 8 ++++---- .../src/chart_types/xy_chart/renderer/canvas/lines.ts | 4 ++-- .../xy_chart/renderer/canvas/primitives/path.ts | 8 ++++---- .../charts/src/chart_types/xy_chart/rendering/area.ts | 4 ++-- .../charts/src/chart_types/xy_chart/rendering/line.ts | 4 ++-- .../charts/src/chart_types/xy_chart/state/utils/utils.ts | 4 ++-- packages/charts/src/mocks/geometries.ts | 2 ++ packages/charts/src/utils/geometry.ts | 4 ++-- 8 files changed, 20 insertions(+), 18 deletions(-) diff --git a/packages/charts/src/chart_types/xy_chart/renderer/canvas/areas.ts b/packages/charts/src/chart_types/xy_chart/renderer/canvas/areas.ts index aa40135f3c..86963114a4 100644 --- a/packages/charts/src/chart_types/xy_chart/renderer/canvas/areas.ts +++ b/packages/charts/src/chart_types/xy_chart/renderer/canvas/areas.ts @@ -87,7 +87,7 @@ function renderArea( clippings: Rect, highlightedLegendItem?: LegendItem, ) { - const { area, color, transform, seriesIdentifier, style, clippedRanges, hideClippedRanges } = geometry; + const { area, color, transform, seriesIdentifier, style, clippedRanges, shouldClip } = geometry; const geometryStateStyle = getGeometryStateStyle(seriesIdentifier, sharedStyle, highlightedLegendItem); const areaFill = buildAreaStyles(ctx, imgCanvas, color, style.area, geometryStateStyle); @@ -114,7 +114,7 @@ function renderArea( fitAreaFill, clippedRanges, clippings, - hideClippedRanges || !style.fit.area.visible, + shouldClip && style.fit.area.visible, ); } @@ -125,7 +125,7 @@ function renderAreaLines( clippings: Rect, highlightedLegendItem?: LegendItem, ) { - const { lines, color, seriesIdentifier, transform, style, clippedRanges, hideClippedRanges } = geometry; + const { lines, color, seriesIdentifier, transform, style, clippedRanges, shouldClip } = geometry; const geometryStateStyle = getGeometryStateStyle(seriesIdentifier, sharedStyle, highlightedLegendItem); const lineStyle = buildLineStyles(color, style.line, geometryStateStyle); @@ -148,6 +148,6 @@ function renderAreaLines( fitLineStroke, clippedRanges, clippings, - hideClippedRanges || !style.fit.line.visible, + shouldClip && style.fit.line.visible, ); } diff --git a/packages/charts/src/chart_types/xy_chart/renderer/canvas/lines.ts b/packages/charts/src/chart_types/xy_chart/renderer/canvas/lines.ts index 085fe04acc..60eb37ac9e 100644 --- a/packages/charts/src/chart_types/xy_chart/renderer/canvas/lines.ts +++ b/packages/charts/src/chart_types/xy_chart/renderer/canvas/lines.ts @@ -74,7 +74,7 @@ function renderLine( clippings: Rect, highlightedLegendItem?: LegendItem, ) { - const { color, transform, seriesIdentifier, style, clippedRanges, hideClippedRanges } = line; + const { color, transform, seriesIdentifier, style, clippedRanges, shouldClip } = line; const geometryStyle = getGeometryStateStyle(seriesIdentifier, sharedStyle, highlightedLegendItem); const lineStroke = buildLineStyles(color, style.line, geometryStyle); @@ -93,6 +93,6 @@ function renderLine( fitLineStroke, clippedRanges, clippings, - hideClippedRanges || !style.fit.line.visible, + shouldClip && style.fit.line.visible, ); } diff --git a/packages/charts/src/chart_types/xy_chart/renderer/canvas/primitives/path.ts b/packages/charts/src/chart_types/xy_chart/renderer/canvas/primitives/path.ts index b7ce1e0b82..762a48fb82 100644 --- a/packages/charts/src/chart_types/xy_chart/renderer/canvas/primitives/path.ts +++ b/packages/charts/src/chart_types/xy_chart/renderer/canvas/primitives/path.ts @@ -22,13 +22,13 @@ export function renderLinePaths( fitStroke: Stroke, clippedRanges: ClippedRanges, clippings: Rect, - hideClippedRanges = false, + shouldClip: boolean, ) { withClipRanges(ctx, clippedRanges, clippings, false, () => { ctx.translate(transform.x, transform.y); renderMultiLine(ctx, linePaths, stroke); }); - if (clippedRanges.length > 0 && !hideClippedRanges) { + if (clippedRanges.length > 0 && shouldClip) { withClipRanges(ctx, clippedRanges, clippings, true, () => { ctx.translate(transform.x, transform.y); renderMultiLine(ctx, linePaths, fitStroke); @@ -45,10 +45,10 @@ export function renderAreaPath( fitFill: Fill, clippedRanges: ClippedRanges, clippings: Rect, - hideClippedRanges = false, + shouldClip: boolean, ) { withClipRanges(ctx, clippedRanges, clippings, false, () => renderPathFill(ctx, area, fill, transform)); - if (clippedRanges.length > 0 && !hideClippedRanges) { + if (clippedRanges.length > 0 && shouldClip) { withClipRanges(ctx, clippedRanges, clippings, true, () => renderPathFill(ctx, area, fitFill, transform)); } } diff --git a/packages/charts/src/chart_types/xy_chart/rendering/area.ts b/packages/charts/src/chart_types/xy_chart/rendering/area.ts index 815e332e9b..dfef90dae3 100644 --- a/packages/charts/src/chart_types/xy_chart/rendering/area.ts +++ b/packages/charts/src/chart_types/xy_chart/rendering/area.ts @@ -41,8 +41,8 @@ export function renderArea( style: AreaSeriesStyle, markSizeOptions: MarkSizeOptions, isStacked = false, + hasFit: boolean, pointStyleAccessor?: PointStyleAccessor, - hasFit?: boolean, ): { areaGeometry: AreaGeometry; indexedGeometryMap: IndexedGeometryMap; @@ -104,7 +104,7 @@ export function renderArea( style, isStacked, clippedRanges, - hideClippedRanges: !hasFit, + shouldClip: hasFit, }; return { areaGeometry, diff --git a/packages/charts/src/chart_types/xy_chart/rendering/line.ts b/packages/charts/src/chart_types/xy_chart/rendering/line.ts index 467e77e772..184cf7bee4 100644 --- a/packages/charts/src/chart_types/xy_chart/rendering/line.ts +++ b/packages/charts/src/chart_types/xy_chart/rendering/line.ts @@ -33,8 +33,8 @@ export function renderLine( xScaleOffset: number, seriesStyle: LineSeriesStyle, markSizeOptions: MarkSizeOptions, + hasFit: boolean, pointStyleAccessor?: PointStyleAccessor, - hasFit?: boolean, ): { lineGeometry: LineGeometry; indexedGeometryMap: IndexedGeometryMap; @@ -83,7 +83,7 @@ export function renderLine( }, style: seriesStyle, clippedRanges, - hideClippedRanges: !hasFit, + shouldClip: hasFit, }; return { lineGeometry, diff --git a/packages/charts/src/chart_types/xy_chart/state/utils/utils.ts b/packages/charts/src/chart_types/xy_chart/state/utils/utils.ts index 2d2fed96cd..e03c1e319a 100644 --- a/packages/charts/src/chart_types/xy_chart/state/utils/utils.ts +++ b/packages/charts/src/chart_types/xy_chart/state/utils/utils.ts @@ -425,8 +425,8 @@ function renderGeometries( enabled: spec.markSizeAccessor !== undefined && lineSeriesStyle.point.visible, ratio: chartTheme.markSizeRatio, }, - spec.pointStyleAccessor, hasFitFnConfigured(spec.fit), + spec.pointStyleAccessor, ); geometriesIndex.merge(renderedLines.indexedGeometryMap); @@ -459,8 +459,8 @@ function renderGeometries( ratio: chartTheme.markSizeRatio, }, spec.stackAccessors ? spec.stackAccessors.length > 0 : false, - spec.pointStyleAccessor, hasFitFnConfigured(spec.fit), + spec.pointStyleAccessor, ); geometriesIndex.merge(renderedAreas.indexedGeometryMap); areas.push({ diff --git a/packages/charts/src/mocks/geometries.ts b/packages/charts/src/mocks/geometries.ts index c70b95ddc9..ff0eea82df 100644 --- a/packages/charts/src/mocks/geometries.ts +++ b/packages/charts/src/mocks/geometries.ts @@ -73,6 +73,7 @@ export class MockLineGeometry { seriesIdentifier: MockSeriesIdentifier.default(), style: lineSeriesStyle, clippedRanges: [], + shouldClip: false, }; static default(partial?: RecursivePartial) { @@ -92,6 +93,7 @@ export class MockAreaGeometry { style: areaSeriesStyle, isStacked: false, clippedRanges: [], + shouldClip: false, }; static default(partial?: RecursivePartial) { diff --git a/packages/charts/src/utils/geometry.ts b/packages/charts/src/utils/geometry.ts index c9af0f9a10..0bed5f1eeb 100644 --- a/packages/charts/src/utils/geometry.ts +++ b/packages/charts/src/utils/geometry.ts @@ -121,7 +121,7 @@ export interface LineGeometry { * Ranges of `[x0, x1]` pairs to clip from series */ clippedRanges: ClippedRanges; - hideClippedRanges?: boolean; + shouldClip: boolean; } /** @internal */ @@ -141,7 +141,7 @@ export interface AreaGeometry { * Ranges of `[x0, x1]` pairs to clip from series */ clippedRanges: ClippedRanges; - hideClippedRanges?: boolean; + shouldClip: boolean; } /** @internal */ From 90c2aed3b327a726182074cd762a6fb84fc7993e Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Thu, 25 Nov 2021 19:35:48 +0100 Subject: [PATCH 08/18] Fix stories line styles --- .../stories/stylings/11_custom_lines.story.tsx | 13 +++++++++++-- .../stories/stylings/12_custom_area.story.tsx | 14 ++++++++++++-- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/storybook/stories/stylings/11_custom_lines.story.tsx b/storybook/stories/stylings/11_custom_lines.story.tsx index 2f8744f7c9..0f944b46aa 100644 --- a/storybook/stories/stylings/11_custom_lines.story.tsx +++ b/storybook/stories/stylings/11_custom_lines.story.tsx @@ -9,7 +9,16 @@ import { boolean, color, number } from '@storybook/addon-knobs'; import React from 'react'; -import { Axis, Chart, LineSeries, Position, ScaleType, Settings, LineSeriesStyle } from '@elastic/charts'; +import { + Axis, + Chart, + LineSeries, + Position, + ScaleType, + Settings, + LineSeriesStyle, + RecursivePartial, +} from '@elastic/charts'; import { useBaseTheme } from '../../use_base_theme'; @@ -36,7 +45,7 @@ function generateLineAndPointSeriesStyleKnobs( pointRadius?: number, lineStrokeWidth?: number, lineStroke?: string, -): LineSeriesStyle { +): RecursivePartial { return { line: { stroke: lineStroke ? color(`line.stroke (${tag})`, lineStroke, groupName) : undefined, diff --git a/storybook/stories/stylings/12_custom_area.story.tsx b/storybook/stories/stylings/12_custom_area.story.tsx index 37d60235b9..a22b65c2bd 100644 --- a/storybook/stories/stylings/12_custom_area.story.tsx +++ b/storybook/stories/stylings/12_custom_area.story.tsx @@ -9,7 +9,17 @@ import { boolean, color, number } from '@storybook/addon-knobs'; import React from 'react'; -import { AreaSeries, Axis, Chart, Position, ScaleType, Settings, LineSeriesStyle, PartialTheme } from '@elastic/charts'; +import { + AreaSeries, + Axis, + Chart, + Position, + ScaleType, + Settings, + LineSeriesStyle, + PartialTheme, + RecursivePartial, +} from '@elastic/charts'; import { useBaseTheme } from '../../use_base_theme'; @@ -36,7 +46,7 @@ function generateLineAndPointSeriesStyleKnobs( pointRadius?: number, lineStrokeWidth?: number, lineStroke?: string, -): LineSeriesStyle { +): RecursivePartial { return { line: { stroke: lineStroke ? color(`line.stroke (${tag})`, lineStroke, groupName) : undefined, From 18cf1384c0478ab07492c1ce0f2f32a2fc4fdee2 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Thu, 25 Nov 2021 19:38:11 +0100 Subject: [PATCH 09/18] Make isStacked argument required --- packages/charts/src/chart_types/xy_chart/rendering/area.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/charts/src/chart_types/xy_chart/rendering/area.ts b/packages/charts/src/chart_types/xy_chart/rendering/area.ts index dfef90dae3..792f577041 100644 --- a/packages/charts/src/chart_types/xy_chart/rendering/area.ts +++ b/packages/charts/src/chart_types/xy_chart/rendering/area.ts @@ -40,7 +40,7 @@ export function renderArea( xScaleOffset: number, style: AreaSeriesStyle, markSizeOptions: MarkSizeOptions, - isStacked = false, + isStacked: boolean, hasFit: boolean, pointStyleAccessor?: PointStyleAccessor, ): { From f484a8ae3d64afce0f64d343b9ba62cbcdecf754 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Thu, 25 Nov 2021 19:41:55 +0100 Subject: [PATCH 10/18] Replace optional `spatial` argument with required `useSpatialIndex` --- packages/charts/src/chart_types/xy_chart/rendering/area.ts | 2 +- packages/charts/src/chart_types/xy_chart/rendering/bubble.ts | 2 +- packages/charts/src/chart_types/xy_chart/rendering/line.ts | 1 + packages/charts/src/chart_types/xy_chart/rendering/points.ts | 4 ++-- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/charts/src/chart_types/xy_chart/rendering/area.ts b/packages/charts/src/chart_types/xy_chart/rendering/area.ts index 792f577041..053cedb439 100644 --- a/packages/charts/src/chart_types/xy_chart/rendering/area.ts +++ b/packages/charts/src/chart_types/xy_chart/rendering/area.ts @@ -79,8 +79,8 @@ export function renderArea( style.point, hasY0Accessors, markSizeOptions, - pointStyleAccessor, false, + pointStyleAccessor, ); const areaGeometry: AreaGeometry = { diff --git a/packages/charts/src/chart_types/xy_chart/rendering/bubble.ts b/packages/charts/src/chart_types/xy_chart/rendering/bubble.ts index 9a946f8911..3088daf10a 100644 --- a/packages/charts/src/chart_types/xy_chart/rendering/bubble.ts +++ b/packages/charts/src/chart_types/xy_chart/rendering/bubble.ts @@ -45,8 +45,8 @@ export function renderBubble( seriesStyle.point, hasY0Accessors, markSizeOptions, - pointStyleAccessor, !isMixedChart, + pointStyleAccessor, ); const bubbleGeometry = { diff --git a/packages/charts/src/chart_types/xy_chart/rendering/line.ts b/packages/charts/src/chart_types/xy_chart/rendering/line.ts index 184cf7bee4..8d47742238 100644 --- a/packages/charts/src/chart_types/xy_chart/rendering/line.ts +++ b/packages/charts/src/chart_types/xy_chart/rendering/line.ts @@ -59,6 +59,7 @@ export function renderLine( seriesStyle.point, hasY0Accessors, markSizeOptions, + false, pointStyleAccessor, ); diff --git a/packages/charts/src/chart_types/xy_chart/rendering/points.ts b/packages/charts/src/chart_types/xy_chart/rendering/points.ts index 9f1ab85fae..1c4f5facaa 100644 --- a/packages/charts/src/chart_types/xy_chart/rendering/points.ts +++ b/packages/charts/src/chart_types/xy_chart/rendering/points.ts @@ -37,8 +37,8 @@ export function renderPoints( pointStyle: PointStyle, hasY0Accessors: boolean, markSizeOptions: MarkSizeOptions, + useSpatialIndex: boolean, styleAccessor?: PointStyleAccessor, - spatial = false, ): { pointGeometries: PointGeometry[]; indexedGeometryMap: IndexedGeometryMap; @@ -47,7 +47,7 @@ export function renderPoints( const getRadius = markSizeOptions.enabled ? getRadiusFn(dataSeries.data, pointStyle.strokeWidth, markSizeOptions.ratio) : () => 0; - const geometryType = spatial ? GeometryType.spatial : GeometryType.linear; + const geometryType = useSpatialIndex ? GeometryType.spatial : GeometryType.linear; const y1Fn = getY1ScaledValueFn(yScale); const y0Fn = getY0ScaledValueFn(yScale); From a0940ceffa5bcee40a3d84e9fe468be1873ba6ca Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Thu, 25 Nov 2021 19:51:52 +0100 Subject: [PATCH 11/18] Add two commits on a possible code improvement --- packages/charts/src/chart_types/xy_chart/rendering/area.ts | 1 + packages/charts/src/chart_types/xy_chart/rendering/line.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/charts/src/chart_types/xy_chart/rendering/area.ts b/packages/charts/src/chart_types/xy_chart/rendering/area.ts index 053cedb439..9d430ff7b4 100644 --- a/packages/charts/src/chart_types/xy_chart/rendering/area.ts +++ b/packages/charts/src/chart_types/xy_chart/rendering/area.ts @@ -61,6 +61,7 @@ export function renderArea( }) .curve(getCurveFactory(curve)); + // TODO we can probably avoid this function call if no fit function is applied. const clippedRanges = getClippedRanges(dataSeries.data, xScale, xScaleOffset); const lines: string[] = []; diff --git a/packages/charts/src/chart_types/xy_chart/rendering/line.ts b/packages/charts/src/chart_types/xy_chart/rendering/line.ts index 8d47742238..c6d22f88e3 100644 --- a/packages/charts/src/chart_types/xy_chart/rendering/line.ts +++ b/packages/charts/src/chart_types/xy_chart/rendering/line.ts @@ -63,6 +63,7 @@ export function renderLine( pointStyleAccessor, ); + // TODO we can probably avoid computing the clipped ranges if no fit function is applied. const clippedRanges = getClippedRanges(dataSeries.data, xScale, xScaleOffset); const lineGeometry = { From a6e329943a40280e14d9dacf5c7fe7f9ae600f4b Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Fri, 26 Nov 2021 11:19:26 +0100 Subject: [PATCH 12/18] Align color to Color type instead of RGBATuple in theme --- .../xy_chart/renderer/canvas/areas.ts | 18 +++++------------- packages/charts/src/utils/themes/theme.ts | 5 ++--- 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/packages/charts/src/chart_types/xy_chart/renderer/canvas/areas.ts b/packages/charts/src/chart_types/xy_chart/renderer/canvas/areas.ts index 86963114a4..6e72ca2170 100644 --- a/packages/charts/src/chart_types/xy_chart/renderer/canvas/areas.ts +++ b/packages/charts/src/chart_types/xy_chart/renderer/canvas/areas.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { colorToRgba, overrideOpacity, RGBATupleToString } from '../../../../common/color_library_wrappers'; +import { colorToRgba, overrideOpacity } from '../../../../common/color_library_wrappers'; import { LegendItem } from '../../../../common/legend'; import { Fill, Rect, Stroke } from '../../../../geoms/types'; import { withContext } from '../../../../renderers/canvas'; @@ -91,17 +91,11 @@ function renderArea( const geometryStateStyle = getGeometryStateStyle(seriesIdentifier, sharedStyle, highlightedLegendItem); const areaFill = buildAreaStyles(ctx, imgCanvas, color, style.area, geometryStateStyle); - const fitAreaFillColor = style.fit.area.color === ColorVariant.Series ? colorToRgba(color) : style.fit.area.color; + const fitAreaFillColor = style.fit.area.color === ColorVariant.Series ? color : style.fit.area.color; const fitAreaFill: Fill = { - texture: getTextureStyles( - ctx, - imgCanvas, - RGBATupleToString(fitAreaFillColor), - geometryStateStyle.opacity, - style.fit.area.texture, - ), + texture: getTextureStyles(ctx, imgCanvas, fitAreaFillColor, geometryStateStyle.opacity, style.fit.area.texture), color: overrideOpacity( - fitAreaFillColor, + colorToRgba(fitAreaFillColor), (opacity) => opacity * geometryStateStyle.opacity * style.fit.area.opacity, ), }; @@ -129,13 +123,11 @@ function renderAreaLines( const geometryStateStyle = getGeometryStateStyle(seriesIdentifier, sharedStyle, highlightedLegendItem); const lineStyle = buildLineStyles(color, style.line, geometryStateStyle); - const fitLineStrokeColor = style.fit.line.color === ColorVariant.Series ? colorToRgba(color) : style.fit.line.color; - const fitLineStroke: Stroke = { dash: style.fit.line.dash, width: style.line.strokeWidth, color: overrideOpacity( - fitLineStrokeColor, + colorToRgba(style.fit.line.color === ColorVariant.Series ? color : style.fit.line.color), (opacity) => opacity * geometryStateStyle.opacity * style.fit.line.opacity, ), }; diff --git a/packages/charts/src/utils/themes/theme.ts b/packages/charts/src/utils/themes/theme.ts index fc2748743f..5ae81fdee9 100644 --- a/packages/charts/src/utils/themes/theme.ts +++ b/packages/charts/src/utils/themes/theme.ts @@ -8,7 +8,6 @@ import { $Values } from 'utility-types'; -import { RgbaTuple } from '../../common/color_library_wrappers'; import { Color } from '../../common/colors'; import { Pixels, Ratio } from '../../common/geometry'; import { FontStyle } from '../../common/text_utils'; @@ -552,7 +551,7 @@ export interface AreaSeriesStyle { /** @public */ export type AreaFitStyle = Visible & Opacity & { - color: RgbaTuple | typeof ColorVariant.Series; + color: Color | typeof ColorVariant.Series; texture?: TexturedStyles; }; @@ -560,7 +559,7 @@ export type AreaFitStyle = Visible & export type LineFitStyle = Visible & Opacity & StrokeDashArray & { - color: RgbaTuple | typeof ColorVariant.Series; + color: Color | typeof ColorVariant.Series; }; /** @public */ From 25ca6d3476350a57a4e62981b6fc553bbdb9205e Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Fri, 26 Nov 2021 11:22:07 +0100 Subject: [PATCH 13/18] Add fit style knobs to story --- .../xy_chart/renderer/canvas/lines.ts | 7 +- storybook/stories/mixed/6_fitting.story.tsx | 69 ++++++++++++++++++- 2 files changed, 72 insertions(+), 4 deletions(-) diff --git a/packages/charts/src/chart_types/xy_chart/renderer/canvas/lines.ts b/packages/charts/src/chart_types/xy_chart/renderer/canvas/lines.ts index 60eb37ac9e..1bb569491a 100644 --- a/packages/charts/src/chart_types/xy_chart/renderer/canvas/lines.ts +++ b/packages/charts/src/chart_types/xy_chart/renderer/canvas/lines.ts @@ -78,11 +78,14 @@ function renderLine( const geometryStyle = getGeometryStateStyle(seriesIdentifier, sharedStyle, highlightedLegendItem); const lineStroke = buildLineStyles(color, style.line, geometryStyle); - const fitLineStrokeColor = style.fit.line.color === ColorVariant.Series ? colorToRgba(color) : style.fit.line.color; + const fitLineStrokeColor = style.fit.line.color === ColorVariant.Series ? color : style.fit.line.color; const fitLineStroke: Stroke = { dash: style.fit.line.dash, width: style.line.strokeWidth, - color: overrideOpacity(fitLineStrokeColor, (opacity) => opacity * geometryStyle.opacity * style.fit.line.opacity), + color: overrideOpacity( + colorToRgba(fitLineStrokeColor), + (opacity) => opacity * geometryStyle.opacity * style.fit.line.opacity, + ), }; renderLinePaths( diff --git a/storybook/stories/mixed/6_fitting.story.tsx b/storybook/stories/mixed/6_fitting.story.tsx index 09c2321c9f..df5b090a02 100644 --- a/storybook/stories/mixed/6_fitting.story.tsx +++ b/storybook/stories/mixed/6_fitting.story.tsx @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { select, number } from '@storybook/addon-knobs'; +import { select, boolean, color, number, text } from '@storybook/addon-knobs'; import React from 'react'; import { @@ -20,8 +20,11 @@ import { Settings, Fit, SeriesType, + RecursivePartial, } from '@elastic/charts'; +import { ColorVariant } from '../../../packages/charts/src/utils/common'; +import { AreaFitStyle, LineFitStyle, TextureShape } from '../../../packages/charts/src/utils/themes/theme'; import { useBaseTheme } from '../../use_base_theme'; export const Example = () => { @@ -153,6 +156,57 @@ export const Example = () => { const parsedEndValue: number | 'nearest' = Number.isNaN(Number(endValue)) ? 'nearest' : Number(endValue); const value = number('Explicit value (using Fit.Explicit)', 5); const xScaleType = dataKey === 'ordinal' ? ScaleType.Ordinal : ScaleType.Linear; + const baseTheme = useBaseTheme(); + + const useSeriesColorLine = boolean('use series color for line', true, 'fit style'); + const customLineColor = color('fit line color', 'rgba(0,0,0,1)', 'fit style'); + + const fitLineStyle: RecursivePartial = { + opacity: number( + 'fit line opacity', + seriesType === SeriesType.Area + ? baseTheme.areaSeriesStyle.fit.line.opacity + : baseTheme.lineSeriesStyle.fit.line.opacity, + { + range: true, + min: 0, + max: 1, + step: 0.05, + }, + 'fit style', + ), + color: useSeriesColorLine ? ColorVariant.Series : customLineColor, + dash: text( + 'fit line dash array', + (seriesType === SeriesType.Area + ? baseTheme.areaSeriesStyle.fit.line.dash + : baseTheme.lineSeriesStyle.fit.line.dash + ).join(','), + 'fit style', + ) + .split(',') + .map(Number), + }; + const useSeriesColor = boolean('use series color for area', true, 'fit style'); + const fitAreaCustomColor = color('fit area color', 'rgba(0,0,0,1)', 'fit style'); + const fitAreaOpacity = number( + 'fit area opacity', + baseTheme.areaSeriesStyle.fit.area.opacity, + { + range: true, + min: 0, + max: baseTheme.areaSeriesStyle.area.opacity, + step: 0.01, + }, + 'fit style', + ); + const fitAreaStyle: RecursivePartial = { + opacity: fitAreaOpacity, + color: useSeriesColor ? ColorVariant.Series : fitAreaCustomColor, + texture: boolean('use texture on area', false, 'fit style') + ? { shape: TextureShape.Line, rotation: -45, opacity: fitAreaOpacity } + : undefined, + }; return ( @@ -166,7 +220,7 @@ export const Example = () => { }, }, }} - baseTheme={useBaseTheme()} + baseTheme={baseTheme} /> @@ -183,6 +237,12 @@ export const Example = () => { value: fit === Fit.Explicit ? value : undefined, endValue: endValue === 'none' ? undefined : parsedEndValue, }} + areaSeriesStyle={{ + fit: { + line: fitLineStyle, + area: fitAreaStyle, + }, + }} data={dataset} /> ) : ( @@ -198,6 +258,11 @@ export const Example = () => { value: fit === Fit.Explicit ? value : undefined, endValue: endValue === 'none' ? undefined : parsedEndValue, }} + lineSeriesStyle={{ + fit: { + line: fitLineStyle, + }, + }} data={dataset} /> )} From 7df37568419937d16f3b57f93c5c43be67c3349b Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Fri, 26 Nov 2021 12:06:45 +0100 Subject: [PATCH 14/18] Add screenshot testing for style --- ...tion-styling-can-style-the-area-1-snap.png | Bin 0 -> 20710 bytes ...tion-styling-can-style-the-line-1-snap.png | Bin 0 -> 13803 bytes ...-area-as-non-interpolated-areas-1-snap.png | Bin 0 -> 16974 bytes ...-line-as-non-interpolated-lines-1-snap.png | Bin 0 -> 15963 bytes integration/tests/stylings_stories.test.ts | 23 ++++++++++++++++++ 5 files changed, 23 insertions(+) create mode 100644 integration/tests/__image_snapshots__/stylings-stories-test-ts-stylings-stories-fit-function-styling-can-style-the-area-1-snap.png create mode 100644 integration/tests/__image_snapshots__/stylings-stories-test-ts-stylings-stories-fit-function-styling-can-style-the-line-1-snap.png create mode 100644 integration/tests/__image_snapshots__/stylings-stories-test-ts-stylings-stories-fit-function-styling-should-render-interpolated-area-as-non-interpolated-areas-1-snap.png create mode 100644 integration/tests/__image_snapshots__/stylings-stories-test-ts-stylings-stories-fit-function-styling-should-render-interpolated-line-as-non-interpolated-lines-1-snap.png diff --git a/integration/tests/__image_snapshots__/stylings-stories-test-ts-stylings-stories-fit-function-styling-can-style-the-area-1-snap.png b/integration/tests/__image_snapshots__/stylings-stories-test-ts-stylings-stories-fit-function-styling-can-style-the-area-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..19ecdaa25490a398ecaecae8d0e7ec5b4a9be0fa GIT binary patch literal 20710 zcmbrm1yqz@7d|?44JG2xEnv||NH-#-AR;iNAfj}4gCZp=jev+qNvOck4bqLIlyt|? z{Lc&ie&2W3{q9}suFKMe&b)EnbIyMDv-f`X`%*(qk(iK%5C(%0D=W#}hruuxVK9uR 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 literal 0 HcmV?d00001 diff --git a/integration/tests/__image_snapshots__/stylings-stories-test-ts-stylings-stories-fit-function-styling-can-style-the-line-1-snap.png b/integration/tests/__image_snapshots__/stylings-stories-test-ts-stylings-stories-fit-function-styling-can-style-the-line-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..6f7fc5a8ba67e9d9c18603520c908e6b802e0adf GIT binary patch literal 13803 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 literal 0 HcmV?d00001 diff --git a/integration/tests/__image_snapshots__/stylings-stories-test-ts-stylings-stories-fit-function-styling-should-render-interpolated-line-as-non-interpolated-lines-1-snap.png b/integration/tests/__image_snapshots__/stylings-stories-test-ts-stylings-stories-fit-function-styling-should-render-interpolated-line-as-non-interpolated-lines-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..6a12fa01ef9169a67656c35cdb06ed16b963cc05 GIT binary patch literal 15963 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 { }); }); }); + describe('Fit function styling', () => { + it('can style the line', async () => { + await common.expectChartAtUrlToMatchScreenshot( + 'http://localhost:9001/?path=/story/mixed-charts--fitting-functions-non-stacked-series&globals=theme:light&knob-Curve=0&knob-End value=none&knob-Explicit value (using Fit.Explicit)=5&knob-dataset=all&knob-fit area color_fit style=rgba(0,0,0,1)&knob-fit area opacity_fit style=0.15&knob-fit line color_fit style=rgba(5, 5, 5, 1)&knob-fit line dash array_fit style=5,10,1,10&knob-fit line opacity_fit style=0.4&knob-fitting function=average&knob-seriesType=line&knob-use series color for area_fit style=true&knob-use series color for line_fit style=&knob-use texture on area_fit style=', + ); + }); + it('can style the area', async () => { + await common.expectChartAtUrlToMatchScreenshot( + 'http://localhost:9001/?path=/story/mixed-charts--fitting-functions-non-stacked-series&globals=theme:light&knob-Curve=0&knob-End value=none&knob-Explicit value (using Fit.Explicit)=5&knob-dataset=all&knob-fit area color_fit style=rgba(0,0,0,1)&knob-fit area opacity_fit style=0.08&knob-fit line color_fit style=rgba(5, 5, 5, 1)&knob-fit line dash array_fit style=5,10,1,10&knob-fit line opacity_fit style=0&knob-fitting function=average&knob-seriesType=area&knob-use series color for area_fit style=&knob-use series color for line_fit style=&knob-use texture on area_fit style=true', + ); + }); + + it('should render interpolated line as non-interpolated lines', async () => { + await common.expectChartAtUrlToMatchScreenshot( + 'http://localhost:9001/?path=/story/mixed-charts--fitting-functions-non-stacked-series&globals=theme:light&knob-Curve=0&knob-End value=nearest&knob-Explicit value (using Fit.Explicit)=5&knob-dataset=all&knob-fit area color_fit style=rgba(0,0,0,1)&knob-fit area opacity_fit style=0.3&knob-fit line color_fit style=rgba(5, 5, 5, 1)&knob-fit line dash array_fit style=&knob-fit line opacity_fit style=1&knob-fitting function=linear&knob-seriesType=line&knob-use series color for area_fit style=true&knob-use series color for line_fit style=true&knob-use texture on area_fit style=', + ); + }); + it('should render interpolated area as non-interpolated areas', async () => { + await common.expectChartAtUrlToMatchScreenshot( + 'http://localhost:9001/?path=/story/mixed-charts--fitting-functions-non-stacked-series&globals=theme:light&knob-Curve=0&knob-End value=nearest&knob-Explicit value (using Fit.Explicit)=5&knob-dataset=all&knob-fit area color_fit style=rgba(0,0,0,1)&knob-fit area opacity_fit style=0.3&knob-fit line color_fit style=rgba(5, 5, 5, 1)&knob-fit line dash array_fit style=&knob-fit line opacity_fit style=1&knob-fitting function=linear&knob-seriesType=area&knob-use series color for area_fit style=true&knob-use series color for line_fit style=true&knob-use texture on area_fit style=', + ); + }); + }); }); From c8cf00963b386a9aa4b69726bbb8637b662dcc74 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Fri, 26 Nov 2021 12:17:54 +0100 Subject: [PATCH 15/18] Add vrts to check the opacity applied from legend hover actions --- ...ly-opacity-on-styled-fit-series-1-snap.png | Bin 0 -> 38686 bytes ...d-render-style-on-stacked-areas-1-snap.png | Bin 0 -> 40910 bytes integration/tests/stylings_stories.test.ts | 18 +++++++++++++++ .../stories/mixed/6_fitting_stacked.story.tsx | 21 ++++++++++++++++++ 4 files changed, 39 insertions(+) create mode 100644 integration/tests/__image_snapshots__/stylings-stories-test-ts-stylings-stories-fit-function-styling-should-apply-opacity-on-styled-fit-series-1-snap.png create mode 100644 integration/tests/__image_snapshots__/stylings-stories-test-ts-stylings-stories-fit-function-styling-should-render-style-on-stacked-areas-1-snap.png diff --git a/integration/tests/__image_snapshots__/stylings-stories-test-ts-stylings-stories-fit-function-styling-should-apply-opacity-on-styled-fit-series-1-snap.png b/integration/tests/__image_snapshots__/stylings-stories-test-ts-stylings-stories-fit-function-styling-should-apply-opacity-on-styled-fit-series-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..97def0099f2343b277baa811109eb454d691e63e GIT binary patch literal 38686 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 literal 0 HcmV?d00001 diff --git a/integration/tests/__image_snapshots__/stylings-stories-test-ts-stylings-stories-fit-function-styling-should-render-style-on-stacked-areas-1-snap.png b/integration/tests/__image_snapshots__/stylings-stories-test-ts-stylings-stories-fit-function-styling-should-render-style-on-stacked-areas-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..be85d35d1457e26b23eee0d3d65aa0386c401a6d GIT binary patch literal 40910 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 z zi0`X}98K8N{|E}o`Fmu}_;2d(r%o>;DXr}AT*4238C)`cRgV~#ekb&9UY~s8U)$cK$^x4fk)be?y&yR98HW_5v^-~_Ba)#Z{_}1hL&ad@J zX;H^GqSv2~yx4!*R}$RPcrC2+=1mIoYl-rNBIWbK)C0ptr73jYV;p`lbp&!0wQQrm z%pBZyW04(@(H+bd9Zpn?QVpBsw+o|0D6A@!bRa9%HCx;N%c;nTiSD;Y zjB-W%$W^n2Y1U6Kld<4GOxpu>HLcfm}pH(s#DS3Mr zJ&~tbrb3qpTmm?8=|bHZ5}vmB9UWfG@FBn&QdNmWk#HG>qKRHwh8*U`-<$pIo6(2?aJy+90!tcwdL1O(8iFig$c=-I>+n3V0cwed-?a0_yKFz@2u5VYn} zF&yN5ar-@_8J4CAj7+uH&EDi59^_3-NQoq5M!Hj`IwF4D5aKtJCY3=4sDW&$4oVy* zto&WG+zIP%C7@*+N+0_V$Q24!^ue7aHP7}TfG^Q<;JLt zd{9!qM|8^=n2wMCc3cJN(UX^>0uQ+_$FyqQ$0w;`Gw(1s)E$}lrBngha` z_gREdF94}}F_gXmoM0RTvRP~TBQ2kw5Cz}GC%-a(|1g4aQU(WyGgM!}0QxH|Nc=^^-l#gaC>}H`>KGG*(Ll_WE1ypw zZzi5P$b~EOF(S6UYKZjpTej1Q@49aUpe)dUh~|)zcfT057)!=~1#t@RMgGNNV+O^O zseW>v#u`=7>Oy~K{4-B)Q@pHqRg>F+6FluyoGhN0*j5@kf`e9&yniR*K3_hB)uD>MsD26l9g>+JW3uj8~a7w-e z^gW;>C#JSQ@-K}`Axzg!_7;KMRbA;3Kxae=3Jef*XD9edUDVRIeg?GA0CCz-95XjQ zX&)dg*cQ=*8;=T3T~^T^)LL5^EA7>TSxF@O4~YpkoUiSDlr{kD0Z>O-HZ=&fx8cXE z2&Zk9iM>AUwUcSQ)$y(i8O7GFqdW`vR}OBAy;y8mjV#z_GAoJ$;8wAorUE8jfbCizJShPL zCG{5#z?VpS{=gn+bH~iX6s|gn%+FIYRPR} zUzTcEm`5Fdu9POnLh)rOi({F+HD7-3fC;d_>)oLd+oK%nUlz&kk~m~#>0)var%}Xv z>TLj*87(a>MmX3VgY1>Iio{ZRaXB-b+4z!?j!ww=TP!H%NNH;M>-zO_kpJ;8Dlp<~ zYIh((P)V+*H*Ua<3k+<>3o#e+(4?` zWGNsY4*WmwHdiMO^9wpc8iEZGkzEmyxel>Z=4&B$lTrAF3()PS%yt3RGTfqRUecDP zP$dOXtV)8kZwJb<30hj;HG`Pw2o=O}@uPx&{P@AjT!@kRn?`)ancpb<{zUfLbh@;O z=4rG@BH-+9==j}ox+_^~T<|OAp!+=#z0DHVUJO6;5A zxxclZ^k~!88Rn;^_o%djHbDUre9TPzDO&KPmZ>O~pa$u-YxU1)1c#$uXxROl%`nfZ zCDFamQ)^+yMIHuiL!D!JSs;8xbOH^|rk#2=# zg=Tzarh<=8`&StUTU&s1C4KT?gK1q+lmcw;^)MdEE9(@Lk|MH^Fc!9N8Bza)aq%o1 z7H&7iuNmd^W9F={B5@M(yw5&N1P$0sh~on=p$P-s_!dqTG8mn8R8Kgp(8!ay5d&)X zNT3CXMQ2ap>?+10y^3u%z)r9m?a};ozB8GGkx-AkD8M2@+$J)hb&TY;!|%e0)6ZM) z9gnw@p}fYSoOyO434?)H9aCi0sKIbf1C`>n?hvkNpI+SkW@=br#|-diD2J2LhRK^} z+YLnfmwjOYH^Ag-_jU%IR7U!{UdiXd!cqMBZa84 zY%HDTWlU?3C{bG%mx%EziI6G}B#8e4#Crhi0=+SVPK~(h!~FcbVe2s^ETZjlqbL{V+)_RDD|_`;}gVQt@NI zl+zSyP&%6L&Tlc{rk6`o;Dtqf6?B0($FsvMCX2@hoWBqIgu>r!m6Nu|#V^Cw9K8Ao zOGODGV*Oz1>CvVysLdlcAQ1W|f80RGo*&ql0h6Pp6z=@r)lp!*G&4}dSdO67@Cc=j zusIC~8nT?t4Gp8M6%}?6cL+J?{A{I!HwoZc={o?|09%S;mH@(Uz%$zfh*v(Ik;aN{ zfRaThq|x`ttj}WKB2it`8X2^N{IYPAUm@4M;dGW)#xD~-39C^Mw-Gvn1Dp^Wa6)uD zDSw9Rn}cfZsd2NJI~oJ`lGbE@YH{uV3+nX!2NK<*VxH{dX0CC(*CL-+GkW&f~nie{?xeCITut>^~9EO8H@nR@Qs_ugT zvn~q2-8EiVFmTNhTV~fsrCY!agr`miL5mJcDn0>G#SyRl6C|%CEaIEHw=iHnnwjcX zk`>zVOUhE{Tnf_U{g&kbd`G5NR|56-KsC(XP*QoB8oNnJ&KTy+79_$K!p<26-+m+o z`Ov|y;vul7jCI&gG3#+{?y^31b3b+q8cf(=im~wkzY+I1c=qh5q5x%RgIk4H9?THD z_9J*re899x`Xf%-87|ZOtC5CPzxs(2yDGEXSjn;sFo;xB@kV*x$dpzj0ei?P&zcXs zQ3ejsWeIF&;Gi_7KU{kczAy+982?btOwZ_oy9?4kf9|w8h7#Yn7iHtD>e~h*T^rM- z5e6eQaQ`jd_}frI95G#Gr{J@aakDC?pP|J9+W%b_yL51h2dfqsdr2w=0g)%~<#J~< zkKTZBt~PMK0246@kIu-blRv4Rh z%9$?^_3A%O&lvqGhQQXNwjhfiDWE9p1`J{(4}VmLBjK6>Tq{jQr){S}#V@z(ikg-? z5PV;YpJqH8beu7j`Xfe)3FkM%n~pKm0PgM?Ffo-t7|&$bn@q&X#Xz&{`Us$E)D7A2 z-$cUCrKLq98{l+JQs9+242RhqvuC2FoJJWKgw0danR@3J9?g#2(QjU2-S~*qJPqX~ zXN-zz3XRIl3UJC+eC>SE5}(=yyuS@JEg=GEP_<;+lJcQg^YUW$&T`0x0#)AaNB#!{ z&RsQaj5-X6n2bfb@+(OwsxtGbf&1()hPk&!0ztZ}y-{peaH*L8aeqQK4#41 zNk%oHqSUJtlpx;T)*4@=m~aslL~lkUx6ZFgRXA1pb=|#)*Vsq7e| zTiJ*=a>O^~|3DbY5yjK3H)$7nJu#7)5k~0azxlTvH#&(QyJnmRmi4pB7BH%}%G65{ zhBnm0@1c5Y+y1%E=1@NdHge?0vw*VO<1VQ8GS9X58?wVw5i#U7{!;`cqiU!cboE-z)9AG5?Cks;0Le;JC-q`Uol> z_FabMUQR!B(Hs)cMWbWmbxk#abRI5)ng1Bb(%W}*Isk3pA90nJ=d2i3deAW=X8a&r zz%Nt?F)1jX*g)jG_ykb*h+fe(m5ReLba%u{cza`KZ)7pq*hX7eIB<`CAo|~ZI&d?r zFh>2WuKVUP_tiltKubT4HzHsgvvTQ?U7SsPQWbD0`Nqh2psU~#&gPx;y%Q%q%>@|+N?+JMg45ZE@2hPCm19Z47I zp@kR8Cz2IG%7SO?0jjed3Hqkf9)$#*MFD&66^ZuzyhJ%+-^7Qc%s;vF;s9#|Z^0)z zRfH>pFczS#9Q9I^Et4yBi?{Q7Px)hB9sBZgfAxqms_f9#)cbEmct7jb(od|wHx;jS zTq*b}*IB>_X5*fH*?4?j9`R^0W3I|Bzie6oWZ{>L;`PZIpU302k+A8Yp~X&sFm;lt zs;b%p)O(^B!E0P4fiv+z=Edo`Im!Bt53N&BH{OqepsHtKArc^Wy{wWzZmtYm~5J+k_fuC`q;^ov7K)$O2>F;kz`S|dI$T^Pu z`7;$uThj(xjZ?>WzUj%mWByB$KO}U$iI?*ocqZkK;%vq0i2Fk~qxG9T14XN>O!jzw z9JAUS6ThFWZ{;(K9jpbqHnO6Brc}F&$YRsio;O_vDuCzh^6W8&b5|ElcOaj*fAQI3 z#b?yz&ZP-yax{))gMS&*#e&gE0e(jF<6Qgi8j9Phl z17J4*0|3B)2?rR4S$18r^WLF1+5qfHz(Ylb?AKOS1doNA(RuJdi2-dcmU**&SuguY zy#Jhe-3vM($;>TTdX|5-{IHq#-d&LS`9#vb(i#B@Gt4iiSj4)HLTK5H4@~fk$0_OK z!Hb!`!qLkYL)p2$57&(z#tYk8m{*+dqmqEtowBAyys?vZuF{A=sp3~q2@&SjJgw!# z!6-oc3+HcK15h6XQIbGl3ox=FUiFvVc8&p`fWW*_t32(ZZ@!w%BSA$NZ~mY>akg%l#5^l2MNz?|MkRhTt8jlDE~Sk5M(3ba%yr zBGtLJ^R4`1v#eEUy+cA`zi8c4Sf!)h3hsj!gMh310u1b_djvFzdgr^j-+AnVB+Rf;bmy7a~`j} z(IHOmP5b*YX8OVHw2Y$lp!(+Q@74$JJ2aT!*ZoCz#$n-+&q!ArBwM2Ju5xtvi&)cel$I>%W6AIX%+A4$r$^pwXrj5(ro*FSybl% z3m*1dS@02%$3L`S(ki!JmJ< zj?}Gmn23N=&i>}Jj%4ykkZ#5G{P9_ymwQPEBz=!*yKRPHx372lOQW;xs{WXqQi0xV zSIiBR)X)w@F||KEzN6I5!SwMyZp8J|vmJo{|C{14kD4{+Paff%0YvXRK#W@ zt=Q``C6{l#72_W3a+NJWFK~KX88_Bw~=LD?c#xF|vbypW&26gZymQ(RTE% zGP^OQF0|Nj30^dCn}+d4$QPmkB$O?5syIkhd|Lc)2R&coeC&Ber^c7_tmlQuow%`Fkx zfl$)rR=q~ALE9Sz@f4-)>e;yw(-1eZgSv8N?eCIgFDCBGCKf$$beg!kP6nFaq~iM_ zVANb8Y&Eh&qlK%tduDrKHptTn#6^K0goJw4B)D(A*K{UV#19CC;>CFP`W75s;;F|w zVG?ovju>w%6+Gym;f<`^A&t2+$L2npDByY787z~C&pN@X#l(VNFc!6{N%L}Y{0DcM zaW_r8Avoa#>;o`i=^r=!?p5&X1!Tu&5-D3He znfDBBC#hwlmx90Npc1Xvs0q-1)-c#?G?kx)?e`M$2sz1gQ5;0#`<=YUu#>+uCic*n zd1m<2X~s{tCYdit55DCy3*3)q4F>6I-HPH}5G0oW)XIs?NqcU3D3gCRM}+chf5A4D zeQ5TKX?%FsZ=80$J$gmJ=bzd?CJ%I+udlRcr}$InjolX!8{N-ZR+#e0$>!VDRYe)Q zLgPwxR1uvLPsvi()jXVm|B5G4W7vtcEdNlkllkj4bVNVY9gVApx5z=7JdTdcs3@IX z#{Px*;QD`F#}b|L5!bdScXXB#xAgAu9Bxjh5W-fbbNR2>~}R@~Ep)^nbghUBD89Lpa|WdkO5$KZGc zw602wVm6pnUX-AYi{F0n-Hj3+EAN%xV%leSM%Jz^NSkX7gx(a2&d~GmYd;+$EerYK zjXbhAh>)U2M#q9l)<0^AtnQb*aoRbJ!obRSxJK$7=s&-LljuEoQd>O+)^Jvf8D$X% zmVo!Im?GHiZii=;yqU5}76uR@GlxR&=fCxl);2UZzA@PtJj(*=eDc3U~iXrsok@oOpPUB*I zGE>0iIWhl-)ctM`JS>b(Xjoo+2G8LfjU%%x%%A!AQ~?F!a_I5)WFUVSD{hnd^&`TK zDLEh=ne@cTB7&Qjle~6&^GkY*p%jV^Ne0%iy=GItQU=YYc1YU94{(m9%2dx}U3jbJ zh_@;i{GSZr3yDKU{xk|bCRiq~?Z-bMD-seR8_82?Sl8>{c6Hu9-D%zCcjo*Kt`QrZ zlRBU6rlc^uxiXs)P9oZF`ZH`06yg1h2b&X}Q|Z86k$9}pyN!(nPq z0w0~CH~+0ESZ*uH$;0zFfyk{|@m?Hz;Vs!=kM(}N)3Qn7{FLmkg3R+u6q6ou=?Jbk zyf5VR!_p01y;kjl6LaEXF^L6dL*y^uU^P4F_D-PP<4FJ#RXqtW1Z6eiUXIh8@Bq3Q zjH;_LLy`jJB3`Hs5@z7f_F&D{`jQq}Ov2fC9_5pMw{dz}7NqfLJha!(NDpGRiO}?t_q-}4#7e~=L7#+2D zj~a2yadTCj(-dIF)?_(n(n)-Di6s?OoEj{4P6cz&eo&!*TjS?D0nIXe&C2QaD9?*$!hCnGJ19T++u`r%!uMQ+d|mB2Wjcakp^MrXOb0Br5-Yn- zPNOD;ZMB(sM9>6q{nP;%VjWH;ILs4UgN_wt9lnPGZ$Yd_a9ARY)s^Xik^VUaeO0ol zaLsaL&gkXLcDd7x7eEvUSC%cc1!u533Q+>JhZhe!+PS_jV>dL?vKws)qn}-LP;=pB zZiGdc5189dVIUwh0s;bMnPd=xExES!wO@>puWi31Nd9jTBiP7P6&L>mo&cRU8Ma9&D&SWayb}ylIg+te`{W4$!xI7CG(I5pX&-BtRib@(QKY#~ zKCB?BMv>io4y7hHGC$R1Fq$LIjs-&4tz-y09fPrA@M!19E^OE|chrzdMX%dJZP5C# z(;}A8cpwOF>J*o{j9=CJKt|s}c_yOhjEG*Jw8v<*5b9 zus(Smw+~?(DnMtHFNOc%d{81)Oa%UP{M>131x|l`XS%C=-=4hwDPGsi(!rU+&!Kda z9x1%vffTokB>EqvZk}ahGs5@8Uot6nKHff)=WlN0Q4e1i%oej4E-CPA6M0~2>C2Zd z7&gq7ykOo4frJ@C>b?6}u?KzwluvcsXYoC)+DU0$d1Xu)%0^;wBWyJ~sb+h3n=4-( z6t}Y;3-%wiMa-0|p{}h1zi^|v;9|aVEyeDSpk0Zul3+%3x#or4cSUP9)N`x4Zauvz z_i?7+CpfbD_X{1ZlKKy-SWDNSga@4Wka1d)k~Zvg_7Wmu(@A?~MtX+-@W{#O&y;Lm zp&_&@;^oJ-%{MVwK9l0DLV3*~_80}uoou7*RZst;+KYF~^!}eoLx9%1rG@YMWNjQs z&EmmCn6;_T@O!?iS=6hTb8N&@nu^iVg1GEBfj7Qb4(6yqZV$RLXZSqt79kp99)9cy z@tOmTNesqDN3qg#W9&om5wU4fC#^^3`ol#B^sZMhICtTU|HzpnB#X$ql8`Y~Gu@SH4pj}|!t1ENDp>)!FV-rq`-j7a!LD=x5W$;tYP zd=SkId3-ZU)ew)z7|GeE);09vS0!6Yl;#@LGViCL`$cv2VZ&ptvK5(_ZhHHU{6j1$ z(%h2qnAlxX$o0!cJj#XV3+I8}&Z|1)f7MtR@A|TOmJ`~71;pygp-M)hgXxPaYfBHT zNKvWGTQq6wY=&HzfP!IJI4Q`3>B3($e1Ed6A&k?ZIZ) zENwD@ieKR)spBLS*?v4ozhWb60jcjwh7?{z6c`R*7Lb^NN+OpwQ^j|SXcqEkxo;37o?Ikk{yKTBu9Pb7;&i^~i82~-`itHy4v^UA7GE-l`Dh@SQ=R1NVr(22amgF6uQNv$vanY#|nHIH;{&pHX^OPj} zkU%LEp8$!sN0#H%suaw!^gQttyVzWWl{=gBLHenzo*Mr9)xHpNKEOoqfr|MM8F1j} zjRK@5%`uzW)PiD$PyjeDtd0g_LFHWpY#1MKL3-zxrUo}`IE`p|Y)7F$SIDC_Q?+={ zC#>TWmjY%)h2;h2X<}k8$3g8tG}!DE$EMSi`;Hmqi%< zJRahW@K*a5dh`A$AE523B-;PXNm+ZbV?pf_beCw44n!*^UzdtKp>_p3|8Qu33?(^S zK&yE*7iP5m8lmWqihAKlJs>l3Sz+V>m^BMuFYp*%EravcW1(TP>w z{FI_~GG4N%NFi(R3{B7P&Cma@wkr*%vTfI^GFFIJ$y|nJWXP0|WQcghi!x@WL|Udy z(Lk9hibe6(Dk_8|Q-(@r7Rr>l2pKY!neTkwZ|^_*IQEadkG-Ei%kg-odpfV{zVGWg zPllNI?V?+B*JZr1Olm(}FA?XHq$Q!*ye{cLN2pF(|1$aFH!dc%bvs8^9V<>OYDVTN zz4n&A+g*L6+~DEg-)`qd{<j(&Y`G~tGU{5sC;OF__5=lQqR{G`#I&hlI3 zoG+_6(y~q-iso;xznkwPU{!EGs4aG8=4z3A=XTBPr;!e35*-yzr&u(aS$4g8tXn?% zVMDilu&O&x@2Zc4N@5U;0ky7Mo7qiRZFDl<#tk7GKLzKnF@`r#ZoS+{w_cFQlC7%( zW91p1eA`z4Q^Jo)`ECt1FAD3{O|;aBC@4i_HgNCB@v`t*hyCB9Te&O7xofr9^=0Tn zZudpeb1PY0ypqZFQvTbK>!*AxZWVth2(qmufD;#$=M3%96z zE^b&bmF9&FE-^hQyhG%==5(5{-|$%8%+RZ=WW_P_g!}vHEOs#Myk9Qb&*U}~RxlVb z_t}MI<8>RY&!H-Bi~Tw~{pZpz{khj+AVX`%7N!b2jg%tNnA^Fp{rY*$qaM@OyVN># z%s2Vd4txG(z6-MS-leQJ*XLwQM@BgEmdw&!vEV#_iGV{4w3#H}| z42LCe`h<{n^X+Frji$9xJ**e1lLgCqHqwRs6HXN77_lA}aFW@?ap=|487BUfH_|8(qqq8lbm%{EWC;vr(fNT4U$YSFOF|Cxllw3g>R^v<9)RIswQsKfkrIG@Na zRV}p$W_GpR{aII@9c7{l^*e<}Rgw?XWjt}cA9o;i- zozch_qplvc<37*�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 { 'http://localhost:9001/?path=/story/mixed-charts--fitting-functions-non-stacked-series&globals=theme:light&knob-Curve=0&knob-End value=nearest&knob-Explicit value (using Fit.Explicit)=5&knob-dataset=all&knob-fit area color_fit style=rgba(0,0,0,1)&knob-fit area opacity_fit style=0.3&knob-fit line color_fit style=rgba(5, 5, 5, 1)&knob-fit line dash array_fit style=&knob-fit line opacity_fit style=1&knob-fitting function=linear&knob-seriesType=area&knob-use series color for area_fit style=true&knob-use series color for line_fit style=true&knob-use texture on area_fit style=', ); }); + it('should render style on stacked areas', async () => { + await common.expectChartAtUrlToMatchScreenshot( + 'http://localhost:9001/?path=/story/mixed-charts--fitting-functions-stacked-series&globals=theme:light&knob-stackMode=none&knob-dataset=all&knob-fitting function=linear&knob-Curve=0&knob-End value=none&knob-Explicit value (using Fit.Explicit)=5&knob-apply custom fit style=true', + ); + }); + + it('should apply opacity on styled fit series', async () => { + const action = async () => { + await common.moveMouseRelativeToDOMElement({ left: 0, top: 0 }, '.echLegendItem'); + }; + await common.expectChartAtUrlToMatchScreenshot( + 'http://localhost:9001/?path=/story/mixed-charts--fitting-functions-stacked-series&globals=theme:light&knob-stackMode=none&knob-dataset=all&knob-fitting function=linear&knob-Curve=0&knob-End value=none&knob-Explicit value (using Fit.Explicit)=5&knob-apply custom fit style=true', + { + action, + waitSelector: common.chartWaitSelector, + }, + ); + }); }); }); diff --git a/storybook/stories/mixed/6_fitting_stacked.story.tsx b/storybook/stories/mixed/6_fitting_stacked.story.tsx index 61c1476eec..d048021ed0 100644 --- a/storybook/stories/mixed/6_fitting_stacked.story.tsx +++ b/storybook/stories/mixed/6_fitting_stacked.story.tsx @@ -13,6 +13,7 @@ import React from 'react'; import { AreaSeries, Axis, Chart, CurveType, Position, ScaleType, Settings, Fit, StackMode } from '@elastic/charts'; import { getRandomNumberGenerator, getRNGSeed } from '@elastic/charts/src/mocks/utils'; +import { TextureShape } from '../../../packages/charts/src/utils/themes/theme'; import { useBaseTheme } from '../../use_base_theme'; export const Example = () => { @@ -201,6 +202,26 @@ export const Example = () => { endValue: endValue === 'none' ? undefined : parsedEndValue, }} data={dataset} + areaSeriesStyle={ + boolean('apply custom fit style', false) + ? { + fit: { + line: { + color: 'gray', + opacity: 0.5, + }, + area: { + color: 'gray', + texture: { + shape: TextureShape.Line, + rotation: -45, + opacity: 0.2, + }, + }, + }, + } + : undefined + } /> Date: Fri, 26 Nov 2021 12:31:16 +0100 Subject: [PATCH 16/18] Fix RGBATuple to Color changes --- packages/charts/api/charts.api.md | 4 ++-- packages/charts/src/utils/themes/theme.test.ts | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/charts/api/charts.api.md b/packages/charts/api/charts.api.md index b335274036..2d047bfb43 100644 --- a/packages/charts/api/charts.api.md +++ b/packages/charts/api/charts.api.md @@ -116,7 +116,7 @@ export interface ArcStyle { // @public (undocumented) export type AreaFitStyle = Visible & Opacity & { - color: RgbaTuple | typeof ColorVariant.Series; + color: Color | typeof ColorVariant.Series; texture?: TexturedStyles; }; @@ -1461,7 +1461,7 @@ export interface LinearScale { // @public (undocumented) export type LineFitStyle = Visible & Opacity & StrokeDashArray & { - color: RgbaTuple | typeof ColorVariant.Series; + color: Color | typeof ColorVariant.Series; }; // Warning: (ae-forgotten-export) The symbol "SpecRequiredProps" needs to be exported by the entry point index.d.ts diff --git a/packages/charts/src/utils/themes/theme.test.ts b/packages/charts/src/utils/themes/theme.test.ts index 284bf948c6..9140868997 100644 --- a/packages/charts/src/utils/themes/theme.test.ts +++ b/packages/charts/src/utils/themes/theme.test.ts @@ -163,7 +163,7 @@ describe('Theme', () => { opacity: 314571, visible: false, dash: [1, 2, 3, 4], - color: [1, 2, 3, 4], + color: 'rgba(1, 2, 3, 4)', }, }, }; @@ -215,13 +215,13 @@ describe('Theme', () => { area: { opacity: 314571, visible: false, - color: [1, 2, 3, 4], + color: 'rgba(1, 2, 3, 4)', }, line: { opacity: 314571, visible: false, dash: [1, 2, 3, 4], - color: [1, 2, 3, 4], + color: 'rgba(1, 2, 3, 4)', }, }, }; From 57cc053dc00ce82f7253e3e478842c26d27878d1 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Wed, 1 Dec 2021 15:42:28 +0100 Subject: [PATCH 17/18] Rename color to style specific fill or stroke --- packages/charts/api/charts.api.md | 4 ++-- .../src/chart_types/xy_chart/renderer/canvas/areas.ts | 4 ++-- .../src/chart_types/xy_chart/renderer/canvas/lines.ts | 2 +- packages/charts/src/utils/themes/dark_theme.ts | 6 +++--- packages/charts/src/utils/themes/light_theme.ts | 6 +++--- packages/charts/src/utils/themes/theme.test.ts | 6 +++--- packages/charts/src/utils/themes/theme.ts | 4 ++-- 7 files changed, 16 insertions(+), 16 deletions(-) diff --git a/packages/charts/api/charts.api.md b/packages/charts/api/charts.api.md index 2d047bfb43..faa5d42d3a 100644 --- a/packages/charts/api/charts.api.md +++ b/packages/charts/api/charts.api.md @@ -116,7 +116,7 @@ export interface ArcStyle { // @public (undocumented) export type AreaFitStyle = Visible & Opacity & { - color: Color | typeof ColorVariant.Series; + fill: Color | typeof ColorVariant.Series; texture?: TexturedStyles; }; @@ -1461,7 +1461,7 @@ export interface LinearScale { // @public (undocumented) export type LineFitStyle = Visible & Opacity & StrokeDashArray & { - color: Color | typeof ColorVariant.Series; + stroke: Color | typeof ColorVariant.Series; }; // Warning: (ae-forgotten-export) The symbol "SpecRequiredProps" needs to be exported by the entry point index.d.ts diff --git a/packages/charts/src/chart_types/xy_chart/renderer/canvas/areas.ts b/packages/charts/src/chart_types/xy_chart/renderer/canvas/areas.ts index 6e72ca2170..026c53fd5f 100644 --- a/packages/charts/src/chart_types/xy_chart/renderer/canvas/areas.ts +++ b/packages/charts/src/chart_types/xy_chart/renderer/canvas/areas.ts @@ -91,7 +91,7 @@ function renderArea( const geometryStateStyle = getGeometryStateStyle(seriesIdentifier, sharedStyle, highlightedLegendItem); const areaFill = buildAreaStyles(ctx, imgCanvas, color, style.area, geometryStateStyle); - const fitAreaFillColor = style.fit.area.color === ColorVariant.Series ? color : style.fit.area.color; + const fitAreaFillColor = style.fit.area.fill === ColorVariant.Series ? color : style.fit.area.fill; const fitAreaFill: Fill = { texture: getTextureStyles(ctx, imgCanvas, fitAreaFillColor, geometryStateStyle.opacity, style.fit.area.texture), color: overrideOpacity( @@ -127,7 +127,7 @@ function renderAreaLines( dash: style.fit.line.dash, width: style.line.strokeWidth, color: overrideOpacity( - colorToRgba(style.fit.line.color === ColorVariant.Series ? color : style.fit.line.color), + colorToRgba(style.fit.line.stroke === ColorVariant.Series ? color : style.fit.line.stroke), (opacity) => opacity * geometryStateStyle.opacity * style.fit.line.opacity, ), }; diff --git a/packages/charts/src/chart_types/xy_chart/renderer/canvas/lines.ts b/packages/charts/src/chart_types/xy_chart/renderer/canvas/lines.ts index 1bb569491a..1ef3af8734 100644 --- a/packages/charts/src/chart_types/xy_chart/renderer/canvas/lines.ts +++ b/packages/charts/src/chart_types/xy_chart/renderer/canvas/lines.ts @@ -78,7 +78,7 @@ function renderLine( const geometryStyle = getGeometryStateStyle(seriesIdentifier, sharedStyle, highlightedLegendItem); const lineStroke = buildLineStyles(color, style.line, geometryStyle); - const fitLineStrokeColor = style.fit.line.color === ColorVariant.Series ? color : style.fit.line.color; + const fitLineStrokeColor = style.fit.line.stroke === ColorVariant.Series ? color : style.fit.line.stroke; const fitLineStroke: Stroke = { dash: style.fit.line.dash, width: style.line.strokeWidth, diff --git a/packages/charts/src/utils/themes/dark_theme.ts b/packages/charts/src/utils/themes/dark_theme.ts index 346ac44066..fb4e257632 100644 --- a/packages/charts/src/utils/themes/dark_theme.ts +++ b/packages/charts/src/utils/themes/dark_theme.ts @@ -37,7 +37,7 @@ export const DARK_THEME: Theme = { line: { visible: true, dash: [5, 5], - color: ColorVariant.Series, + stroke: ColorVariant.Series, opacity: 1, }, }, @@ -72,13 +72,13 @@ export const DARK_THEME: Theme = { line: { visible: true, dash: [5, 5], - color: ColorVariant.Series, + stroke: ColorVariant.Series, opacity: 1, }, area: { visible: true, opacity: 0.15, - color: ColorVariant.Series, + fill: ColorVariant.Series, }, }, }, diff --git a/packages/charts/src/utils/themes/light_theme.ts b/packages/charts/src/utils/themes/light_theme.ts index e4a906c702..04d395fa39 100644 --- a/packages/charts/src/utils/themes/light_theme.ts +++ b/packages/charts/src/utils/themes/light_theme.ts @@ -39,7 +39,7 @@ export const LIGHT_THEME: Theme = { opacity: 1, visible: true, dash: [5, 5], - color: ColorVariant.Series, + stroke: ColorVariant.Series, }, }, }, @@ -73,13 +73,13 @@ export const LIGHT_THEME: Theme = { line: { visible: true, dash: [5, 5], - color: ColorVariant.Series, + stroke: ColorVariant.Series, opacity: 1, }, area: { visible: true, opacity: 0.15, - color: ColorVariant.Series, + fill: ColorVariant.Series, }, }, }, diff --git a/packages/charts/src/utils/themes/theme.test.ts b/packages/charts/src/utils/themes/theme.test.ts index 9140868997..cf2d08b925 100644 --- a/packages/charts/src/utils/themes/theme.test.ts +++ b/packages/charts/src/utils/themes/theme.test.ts @@ -163,7 +163,7 @@ describe('Theme', () => { opacity: 314571, visible: false, dash: [1, 2, 3, 4], - color: 'rgba(1, 2, 3, 4)', + stroke: 'rgba(1, 2, 3, 4)', }, }, }; @@ -215,13 +215,13 @@ describe('Theme', () => { area: { opacity: 314571, visible: false, - color: 'rgba(1, 2, 3, 4)', + fill: 'rgba(1, 2, 3, 4)', }, line: { opacity: 314571, visible: false, dash: [1, 2, 3, 4], - color: 'rgba(1, 2, 3, 4)', + stroke: 'rgba(1, 2, 3, 4)', }, }, }; diff --git a/packages/charts/src/utils/themes/theme.ts b/packages/charts/src/utils/themes/theme.ts index 5ae81fdee9..4f129c8b2a 100644 --- a/packages/charts/src/utils/themes/theme.ts +++ b/packages/charts/src/utils/themes/theme.ts @@ -551,7 +551,7 @@ export interface AreaSeriesStyle { /** @public */ export type AreaFitStyle = Visible & Opacity & { - color: Color | typeof ColorVariant.Series; + fill: Color | typeof ColorVariant.Series; texture?: TexturedStyles; }; @@ -559,7 +559,7 @@ export type AreaFitStyle = Visible & export type LineFitStyle = Visible & Opacity & StrokeDashArray & { - color: Color | typeof ColorVariant.Series; + stroke: Color | typeof ColorVariant.Series; }; /** @public */ From 835bb69e00a2e905d6b11d766207fb5a97d2ab62 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Wed, 1 Dec 2021 18:47:54 +0100 Subject: [PATCH 18/18] Fix type renaming on storybook --- storybook/stories/mixed/6_fitting.story.tsx | 4 ++-- storybook/stories/mixed/6_fitting_stacked.story.tsx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/storybook/stories/mixed/6_fitting.story.tsx b/storybook/stories/mixed/6_fitting.story.tsx index df5b090a02..234e10c99e 100644 --- a/storybook/stories/mixed/6_fitting.story.tsx +++ b/storybook/stories/mixed/6_fitting.story.tsx @@ -175,7 +175,7 @@ export const Example = () => { }, 'fit style', ), - color: useSeriesColorLine ? ColorVariant.Series : customLineColor, + stroke: useSeriesColorLine ? ColorVariant.Series : customLineColor, dash: text( 'fit line dash array', (seriesType === SeriesType.Area @@ -202,7 +202,7 @@ export const Example = () => { ); const fitAreaStyle: RecursivePartial = { opacity: fitAreaOpacity, - color: useSeriesColor ? ColorVariant.Series : fitAreaCustomColor, + fill: useSeriesColor ? ColorVariant.Series : fitAreaCustomColor, texture: boolean('use texture on area', false, 'fit style') ? { shape: TextureShape.Line, rotation: -45, opacity: fitAreaOpacity } : undefined, diff --git a/storybook/stories/mixed/6_fitting_stacked.story.tsx b/storybook/stories/mixed/6_fitting_stacked.story.tsx index d048021ed0..490b86fcd2 100644 --- a/storybook/stories/mixed/6_fitting_stacked.story.tsx +++ b/storybook/stories/mixed/6_fitting_stacked.story.tsx @@ -207,11 +207,11 @@ export const Example = () => { ? { fit: { line: { - color: 'gray', + stroke: 'gray', opacity: 0.5, }, area: { - color: 'gray', + fill: 'gray', texture: { shape: TextureShape.Line, rotation: -45,