From 58f3a7363e28f2748f92c6ff74e3761f9ae0592b Mon Sep 17 00:00:00 2001 From: Debajyoti Halder Date: Sun, 18 Apr 2021 19:03:42 +0530 Subject: [PATCH 01/16] feat: texture: Add svg image to chart_types --- .../renderer/canvas/images/pattern.svg | 12 +++ .../renderer/canvas/primitives/path.ts | 87 ++++++++++++++----- 2 files changed, 77 insertions(+), 22 deletions(-) create mode 100644 src/chart_types/xy_chart/renderer/canvas/images/pattern.svg diff --git a/src/chart_types/xy_chart/renderer/canvas/images/pattern.svg b/src/chart_types/xy_chart/renderer/canvas/images/pattern.svg new file mode 100644 index 0000000000..45fd830472 --- /dev/null +++ b/src/chart_types/xy_chart/renderer/canvas/images/pattern.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/chart_types/xy_chart/renderer/canvas/primitives/path.ts b/src/chart_types/xy_chart/renderer/canvas/primitives/path.ts index 92287e70cb..355f3ff339 100644 --- a/src/chart_types/xy_chart/renderer/canvas/primitives/path.ts +++ b/src/chart_types/xy_chart/renderer/canvas/primitives/path.ts @@ -24,6 +24,29 @@ import { ClippedRanges } from '../../../../../utils/geometry'; import { Point } from '../../../../../utils/point'; import { renderMultiLine } from './line'; +// function drawCheckeredBackground(can: HTMLCanvasElement, nRow: number, nCol: number, fill: Fill) { +// const ctx = can.getContext('2d'); +// if (ctx != null) { +// let w = can.width; +// let h = can.height; + +// nRow = nRow || 8; // default number of rows +// nCol = nCol || 8; // default number of columns + +// w /= nCol; // width of a block +// h /= nRow; // height of a block + +// for (let i = 0; i < nRow; ++i) { +// for (let j = 0, col = nCol / 2; j < col; ++j) { +// ctx.rect(2 * j * w + (i % 2 ? 0 : w), i * h, w, h); +// } +// } + +// ctx.fillStyle = RGBtoString(fill.color); +// ctx.fill(); +// } +// } + /** @internal */ export function renderLinePaths( context: CanvasRenderingContext2D, @@ -65,33 +88,53 @@ export function renderAreaPath( clippings: Rect, hideClippedRanges = false, ) { - if (clippedRanges.length > 0) { - withClipRanges(ctx, clippedRanges, clippings, false, (ctx) => { - ctx.translate(transform.x, transform.y); - renderPathFill(ctx, area, fill); - }); - if (hideClippedRanges) { - return; + const imgCanvas = document.createElement('canvas'); + imgCanvas.width = 100; + imgCanvas.height = 100; + const imgCtx = imgCanvas.getContext('2d'); + const img = new Image(); + img.src = require('../images/pattern.svg'); + + img.addEventListener('load', function () { + if (imgCtx != null) { + imgCtx.drawImage(img, 0, 0, 200, 200); + if (clippedRanges.length > 0) { + withClipRanges(ctx, clippedRanges, clippings, false, (ctx) => { + ctx.translate(transform.x, transform.y); + renderPathFill(ctx, imgCanvas, area, fill); + }); + if (hideClippedRanges) { + return; + } + withClipRanges(ctx, clippedRanges, clippings, true, (ctx) => { + ctx.translate(transform.x, transform.y); + const { opacity } = fill.color; + const color = { + ...fill.color, + opacity: opacity / 2, + }; + renderPathFill(ctx, imgCanvas, area, { ...fill, color }); + }); + return; + } + withContext(ctx, (ctx) => { + ctx.translate(transform.x, transform.y); + renderPathFill(ctx, imgCanvas, area, fill); + }); } - withClipRanges(ctx, clippedRanges, clippings, true, (ctx) => { - ctx.translate(transform.x, transform.y); - const { opacity } = fill.color; - const color = { - ...fill.color, - opacity: opacity / 2, - }; - renderPathFill(ctx, area, { ...fill, color }); - }); - return; - } - withContext(ctx, (ctx) => { - ctx.translate(transform.x, transform.y); - renderPathFill(ctx, area, fill); }); + // drawCheckeredBackground(imgCanvas, 10, 10, fill); } -function renderPathFill(ctx: CanvasRenderingContext2D, path: string, fill: Fill) { +function renderPathFill(ctx: CanvasRenderingContext2D, imgCanvas: HTMLCanvasElement, path: string, fill: Fill) { const path2d = new Path2D(path); + const pattern = ctx.createPattern(imgCanvas, 'repeat'); + if (pattern) { + ctx.fillStyle = pattern; + ctx.beginPath(); + ctx.fill(path2d); + return; + } ctx.fillStyle = RGBtoString(fill.color); ctx.beginPath(); ctx.fill(path2d); From 9b95ddd7ce619bcfe786aba8fbd000fa07f17651 Mon Sep 17 00:00:00 2001 From: Debajyoti Halder Date: Sat, 24 Apr 2021 18:54:21 +0530 Subject: [PATCH 02/16] feat(textures): an example of allowing textures with colors, implemented in xy_chart --- package.json | 1 + .../xy_chart/renderer/canvas/areas.ts | 7 +- .../renderer/canvas/images/pattern.svg | 12 -- .../renderer/canvas/primitives/path.ts | 144 +++++++++++------- .../xy_chart/renderer/canvas/renderers.ts | 6 +- yarn.lock | 5 + 6 files changed, 103 insertions(+), 72 deletions(-) delete mode 100644 src/chart_types/xy_chart/renderer/canvas/images/pattern.svg diff --git a/package.json b/package.json index edf24a8521..0f4e7923d8 100644 --- a/package.json +++ b/package.json @@ -74,6 +74,7 @@ "redux": "^4.0.4", "reselect": "^4.0.0", "resize-observer-polyfill": "^1.5.1", + "textures": "^1.2.3", "ts-debounce": "^1.0.0", "utility-types": "^3.10.0", "uuid": "^3.3.2" diff --git a/src/chart_types/xy_chart/renderer/canvas/areas.ts b/src/chart_types/xy_chart/renderer/canvas/areas.ts index 591e89f71c..be3f2327ef 100644 --- a/src/chart_types/xy_chart/renderer/canvas/areas.ts +++ b/src/chart_types/xy_chart/renderer/canvas/areas.ts @@ -41,7 +41,7 @@ interface AreaGeometriesProps { } /** @internal */ -export function renderAreas(ctx: CanvasRenderingContext2D, props: AreaGeometriesProps) { +export function renderAreas(imgCanvas: HTMLCanvasElement, ctx: CanvasRenderingContext2D, props: AreaGeometriesProps) { const { sharedStyle, highlightedLegendItem, areas, rotation, clippings, renderingArea } = props; withContext(ctx, (ctx) => { @@ -54,7 +54,7 @@ export function renderAreas(ctx: CanvasRenderingContext2D, props: AreaGeometries rotation, renderingArea, (ctx) => { - renderArea(ctx, area, sharedStyle, clippings, highlightedLegendItem); + renderArea(imgCanvas, ctx, area, sharedStyle, clippings, highlightedLegendItem); }, { area: clippings, shouldClip: true }, ); @@ -95,6 +95,7 @@ export function renderAreas(ctx: CanvasRenderingContext2D, props: AreaGeometries } function renderArea( + imgCanvas: HTMLCanvasElement, ctx: CanvasRenderingContext2D, glyph: AreaGeometry, sharedStyle: SharedGeometryStateStyle, @@ -104,7 +105,7 @@ function renderArea( const { area, color, transform, seriesIdentifier, seriesAreaStyle, clippedRanges, hideClippedRanges } = glyph; const geometryStateStyle = getGeometryStateStyle(seriesIdentifier, sharedStyle, highlightedLegendItem); const fill = buildAreaStyles(color, seriesAreaStyle, geometryStateStyle); - renderAreaPath(ctx, transform, area, fill, clippedRanges, clippings, hideClippedRanges); + renderAreaPath(imgCanvas, ctx, transform, area, fill, clippedRanges, clippings, hideClippedRanges); } function renderAreaLines( diff --git a/src/chart_types/xy_chart/renderer/canvas/images/pattern.svg b/src/chart_types/xy_chart/renderer/canvas/images/pattern.svg deleted file mode 100644 index 45fd830472..0000000000 --- a/src/chart_types/xy_chart/renderer/canvas/images/pattern.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/src/chart_types/xy_chart/renderer/canvas/primitives/path.ts b/src/chart_types/xy_chart/renderer/canvas/primitives/path.ts index 355f3ff339..4de1de6681 100644 --- a/src/chart_types/xy_chart/renderer/canvas/primitives/path.ts +++ b/src/chart_types/xy_chart/renderer/canvas/primitives/path.ts @@ -24,28 +24,72 @@ import { ClippedRanges } from '../../../../../utils/geometry'; import { Point } from '../../../../../utils/point'; import { renderMultiLine } from './line'; -// function drawCheckeredBackground(can: HTMLCanvasElement, nRow: number, nCol: number, fill: Fill) { -// const ctx = can.getContext('2d'); -// if (ctx != null) { -// let w = can.width; -// let h = can.height; +function linePaths(orientation: string, s: number) { + switch (orientation) { + case '0/8': + case 'vertical': + return `M ${s / 2}, 0 l 0, ${s}`; + case '1/8': + return `M ${-s / 4},${s} l ${s / 2},${-s} M ${s / 4},${s} l ${s / 2},${-s} M ${(s * 3) / 4},${s} l ${ + s / 2 + },${-s}`; + case '2/8': + case 'diagonal': + return `M 0,${s} l ${s},${-s} M ${-s / 4},${s / 4} l ${s / 2},${-s / 2} M ${(3 / 4) * s},${(5 / 4) * s} l ${ + s / 2 + },${-s / 2}`; + case '3/8': + return `M 0,${(3 / 4) * s} l ${s},${-s / 2} M 0,${s / 4} l ${s},${-s / 2} M 0,${(s * 5) / 4} l ${s},${-s / 2}`; + case '4/8': + case 'horizontal': + return `M 0,${s / 2} l ${s},0`; + case '5/8': + return `M 0,${-s / 4} l ${s},${s / 2}M 0,${s / 4} l ${s},${s / 2} M 0,${(s * 3) / 4} l ${s},${s / 2}`; + case '6/8': + return `M 0,0 l ${s},${s} M ${-s / 4},${(3 / 4) * s} l ${s / 2},${s / 2} M ${(s * 3) / 4},${-s / 4} l ${s / 2},${ + s / 2 + }`; + case '7/8': + return `M ${-s / 4},0 l ${s / 2},${s} M ${s / 4},0 l ${s / 2},${s} M ${(s * 3) / 4},0 l ${s / 2},${s}`; + default: + return `M ${s / 2}, 0 l 0, ${s}`; + } +} -// nRow = nRow || 8; // default number of rows -// nCol = nCol || 8; // default number of columns +function drawPattern(type: string, can: HTMLCanvasElement, fill: Fill, size: number) { + const ctx = can.getContext('2d'); -// w /= nCol; // width of a block -// h /= nRow; // height of a block + if (ctx !== null) { + if (type.indexOf('line') === 0) { + ctx.strokeStyle = 'black'; + ctx.beginPath(); + ctx.stroke(new Path2D(linePaths(type.slice(4), size))); + return; + } -// for (let i = 0; i < nRow; ++i) { -// for (let j = 0, col = nCol / 2; j < col; ++j) { -// ctx.rect(2 * j * w + (i % 2 ? 0 : w), i * h, w, h); -// } -// } + switch (type) { + case 'circle': + ctx.strokeStyle = 'black'; + ctx.beginPath(); + ctx.arc(size / 2, size / 2, 5, 0, 2 * Math.PI); + ctx.stroke(); + break; + case 'circleFill': + ctx.strokeStyle = 'black'; + ctx.beginPath(); + ctx.arc(size / 2, size / 2, 2, 0, 2 * Math.PI); + ctx.fill(); + break; + default: + break; + } + } -// ctx.fillStyle = RGBtoString(fill.color); -// ctx.fill(); -// } -// } + // if (ctx != null) { + // ctx.fillStyle = RGBtoString(fill.color); + // ctx.fill(); + // } +} /** @internal */ export function renderLinePaths( @@ -80,6 +124,7 @@ export function renderLinePaths( /** @internal */ export function renderAreaPath( + imgCanvas: HTMLCanvasElement, ctx: CanvasRenderingContext2D, transform: Point, area: string, @@ -88,54 +133,41 @@ export function renderAreaPath( clippings: Rect, hideClippedRanges = false, ) { - const imgCanvas = document.createElement('canvas'); - imgCanvas.width = 100; - imgCanvas.height = 100; - const imgCtx = imgCanvas.getContext('2d'); - const img = new Image(); - img.src = require('../images/pattern.svg'); - - img.addEventListener('load', function () { - if (imgCtx != null) { - imgCtx.drawImage(img, 0, 0, 200, 200); - if (clippedRanges.length > 0) { - withClipRanges(ctx, clippedRanges, clippings, false, (ctx) => { - ctx.translate(transform.x, transform.y); - renderPathFill(ctx, imgCanvas, area, fill); - }); - if (hideClippedRanges) { - return; - } - withClipRanges(ctx, clippedRanges, clippings, true, (ctx) => { - ctx.translate(transform.x, transform.y); - const { opacity } = fill.color; - const color = { - ...fill.color, - opacity: opacity / 2, - }; - renderPathFill(ctx, imgCanvas, area, { ...fill, color }); - }); - return; - } - withContext(ctx, (ctx) => { - ctx.translate(transform.x, transform.y); - renderPathFill(ctx, imgCanvas, area, fill); - }); + drawPattern('line3/8', imgCanvas, fill, 30); + if (clippedRanges.length > 0) { + withClipRanges(ctx, clippedRanges, clippings, false, (ctx) => { + ctx.translate(transform.x, transform.y); + renderPathFill(ctx, imgCanvas, area, fill); + }); + if (hideClippedRanges) { + return; } + withClipRanges(ctx, clippedRanges, clippings, true, (ctx) => { + ctx.translate(transform.x, transform.y); + const { opacity } = fill.color; + const color = { + ...fill.color, + opacity: opacity / 2, + }; + renderPathFill(ctx, imgCanvas, area, { ...fill, color }); + }); + return; + } + withContext(ctx, (ctx) => { + ctx.translate(transform.x, transform.y); + renderPathFill(ctx, imgCanvas, area, fill); }); - // drawCheckeredBackground(imgCanvas, 10, 10, fill); + // drawPattern(imgCanvas, fill); } function renderPathFill(ctx: CanvasRenderingContext2D, imgCanvas: HTMLCanvasElement, path: string, fill: Fill) { const path2d = new Path2D(path); const pattern = ctx.createPattern(imgCanvas, 'repeat'); + ctx.fillStyle = RGBtoString(fill.color); + ctx.fill(path2d); if (pattern) { ctx.fillStyle = pattern; - ctx.beginPath(); - ctx.fill(path2d); - return; } - ctx.fillStyle = RGBtoString(fill.color); ctx.beginPath(); ctx.fill(path2d); } diff --git a/src/chart_types/xy_chart/renderer/canvas/renderers.ts b/src/chart_types/xy_chart/renderer/canvas/renderers.ts index 16bd5cb86c..ccb833e2a7 100644 --- a/src/chart_types/xy_chart/renderer/canvas/renderers.ts +++ b/src/chart_types/xy_chart/renderer/canvas/renderers.ts @@ -39,6 +39,10 @@ export function renderXYChartCanvas2d( clippings: Rect, props: ReactiveChartStateProps, ) { + const imgCanvas = document.createElement('canvas'); + imgCanvas.width = 30; + imgCanvas.height = 30; + withContext(ctx, (ctx) => { // let's set the devicePixelRatio once and for all; then we'll never worry about it again ctx.scale(dpr, dpr); @@ -120,7 +124,7 @@ export function renderXYChartCanvas2d( // rendering areas (ctx: CanvasRenderingContext2D) => { withContext(ctx, (ctx) => { - renderAreas(ctx, { + renderAreas(imgCanvas, ctx, { areas: geometries.areas, clippings, renderingArea, diff --git a/yarn.lock b/yarn.lock index 235649a94e..6e2c03c8e3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -21958,6 +21958,11 @@ text-table@0.2.0, text-table@^0.2.0, text-table@~0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= +textures@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/textures/-/textures-1.2.3.tgz#2e2615ab4e8f9a73008a7507dd9e5f84e9ffc48b" + integrity sha512-Ehg2adOcyfCR5DPOzBauXERJN4cXF1Bh4dITY2pPQ3+CvBBU0SZAep6pq5cCWp8K+k3OlXYh5dc2stgEQlqAWg== + throat@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" From 4bfdb136c6d42fec92948c7da76437b3a757504a Mon Sep 17 00:00:00 2001 From: Debajyoti Halder Date: Sat, 24 Apr 2021 19:41:13 +0530 Subject: [PATCH 03/16] feat(textures): update package.json --- package.json | 1 - yarn.lock | 5 ----- 2 files changed, 6 deletions(-) diff --git a/package.json b/package.json index 0f4e7923d8..edf24a8521 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,6 @@ "redux": "^4.0.4", "reselect": "^4.0.0", "resize-observer-polyfill": "^1.5.1", - "textures": "^1.2.3", "ts-debounce": "^1.0.0", "utility-types": "^3.10.0", "uuid": "^3.3.2" diff --git a/yarn.lock b/yarn.lock index 6e2c03c8e3..235649a94e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -21958,11 +21958,6 @@ text-table@0.2.0, text-table@^0.2.0, text-table@~0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= -textures@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/textures/-/textures-1.2.3.tgz#2e2615ab4e8f9a73008a7507dd9e5f84e9ffc48b" - integrity sha512-Ehg2adOcyfCR5DPOzBauXERJN4cXF1Bh4dITY2pPQ3+CvBBU0SZAep6pq5cCWp8K+k3OlXYh5dc2stgEQlqAWg== - throat@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" From 9e79aff39411da31d57628902abb06d3074ed0cd Mon Sep 17 00:00:00 2001 From: Debajyoti Halder Date: Sun, 9 May 2021 22:55:00 +0530 Subject: [PATCH 04/16] feat(a11y): add partial refactor of textures implementation --- .../renderer/canvas/primitives/path.ts | 113 +++++++----------- .../xy_chart/renderer/canvas/renderers.ts | 2 - src/utils/themes/textures.ts | 82 +++++++++++++ src/utils/themes/theme.ts | 19 +++ 4 files changed, 145 insertions(+), 71 deletions(-) create mode 100644 src/utils/themes/textures.ts diff --git a/src/chart_types/xy_chart/renderer/canvas/primitives/path.ts b/src/chart_types/xy_chart/renderer/canvas/primitives/path.ts index 4de1de6681..eeefa02e53 100644 --- a/src/chart_types/xy_chart/renderer/canvas/primitives/path.ts +++ b/src/chart_types/xy_chart/renderer/canvas/primitives/path.ts @@ -22,74 +22,44 @@ import { Rect, Stroke, Fill } from '../../../../../geoms/types'; import { withContext, withClipRanges } from '../../../../../renderers/canvas'; import { ClippedRanges } from '../../../../../utils/geometry'; import { Point } from '../../../../../utils/point'; +import { drawPattern } from '../../../../../utils/themes/textures'; +import { TexturedStyles } from '../../../../../utils/themes/theme'; import { renderMultiLine } from './line'; -function linePaths(orientation: string, s: number) { - switch (orientation) { - case '0/8': - case 'vertical': - return `M ${s / 2}, 0 l 0, ${s}`; - case '1/8': - return `M ${-s / 4},${s} l ${s / 2},${-s} M ${s / 4},${s} l ${s / 2},${-s} M ${(s * 3) / 4},${s} l ${ - s / 2 - },${-s}`; - case '2/8': - case 'diagonal': - return `M 0,${s} l ${s},${-s} M ${-s / 4},${s / 4} l ${s / 2},${-s / 2} M ${(3 / 4) * s},${(5 / 4) * s} l ${ - s / 2 - },${-s / 2}`; - case '3/8': - return `M 0,${(3 / 4) * s} l ${s},${-s / 2} M 0,${s / 4} l ${s},${-s / 2} M 0,${(s * 5) / 4} l ${s},${-s / 2}`; - case '4/8': - case 'horizontal': - return `M 0,${s / 2} l ${s},0`; - case '5/8': - return `M 0,${-s / 4} l ${s},${s / 2}M 0,${s / 4} l ${s},${s / 2} M 0,${(s * 3) / 4} l ${s},${s / 2}`; - case '6/8': - return `M 0,0 l ${s},${s} M ${-s / 4},${(3 / 4) * s} l ${s / 2},${s / 2} M ${(s * 3) / 4},${-s / 4} l ${s / 2},${ - s / 2 - }`; - case '7/8': - return `M ${-s / 4},0 l ${s / 2},${s} M ${s / 4},0 l ${s / 2},${s} M ${(s * 3) / 4},0 l ${s / 2},${s}`; - default: - return `M ${s / 2}, 0 l 0, ${s}`; - } -} +// function drawPattern(type: string, can: HTMLCanvasElement, fill: Fill, size: number) { +// const ctx = can.getContext('2d'); -function drawPattern(type: string, can: HTMLCanvasElement, fill: Fill, size: number) { - const ctx = can.getContext('2d'); - - if (ctx !== null) { - if (type.indexOf('line') === 0) { - ctx.strokeStyle = 'black'; - ctx.beginPath(); - ctx.stroke(new Path2D(linePaths(type.slice(4), size))); - return; - } +// if (ctx !== null) { +// if (type.indexOf('line') === 0) { +// ctx.strokeStyle = 'black'; +// ctx.beginPath(); +// ctx.stroke(new Path2D(linePaths(type.slice(4), size))); +// return; +// } - switch (type) { - case 'circle': - ctx.strokeStyle = 'black'; - ctx.beginPath(); - ctx.arc(size / 2, size / 2, 5, 0, 2 * Math.PI); - ctx.stroke(); - break; - case 'circleFill': - ctx.strokeStyle = 'black'; - ctx.beginPath(); - ctx.arc(size / 2, size / 2, 2, 0, 2 * Math.PI); - ctx.fill(); - break; - default: - break; - } - } +// switch (type) { +// case 'circle': +// ctx.strokeStyle = 'black'; +// ctx.beginPath(); +// ctx.arc(size / 2, size / 2, 5, 0, 2 * Math.PI); +// ctx.stroke(); +// break; +// case 'circleFill': +// ctx.strokeStyle = 'black'; +// ctx.beginPath(); +// ctx.arc(size / 2, size / 2, 2, 0, 2 * Math.PI); +// ctx.fill(); +// break; +// default: +// break; +// } +// } - // if (ctx != null) { - // ctx.fillStyle = RGBtoString(fill.color); - // ctx.fill(); - // } -} +// // if (ctx != null) { +// // ctx.fillStyle = RGBtoString(fill.color); +// // ctx.fill(); +// // } +// } /** @internal */ export function renderLinePaths( @@ -133,11 +103,17 @@ export function renderAreaPath( clippings: Rect, hideClippedRanges = false, ) { - drawPattern('line3/8', imgCanvas, fill, 30); + const textures: TexturedStyles = { + type: 'square', + stroke: 'black', + rotation: 1.5, + scale: 20, + }; + const pattern = drawPattern(ctx, textures, imgCanvas); if (clippedRanges.length > 0) { withClipRanges(ctx, clippedRanges, clippings, false, (ctx) => { ctx.translate(transform.x, transform.y); - renderPathFill(ctx, imgCanvas, area, fill); + renderPathFill(ctx, area, fill, pattern); }); if (hideClippedRanges) { return; @@ -149,20 +125,19 @@ export function renderAreaPath( ...fill.color, opacity: opacity / 2, }; - renderPathFill(ctx, imgCanvas, area, { ...fill, color }); + renderPathFill(ctx, area, { ...fill, color }, pattern); }); return; } withContext(ctx, (ctx) => { ctx.translate(transform.x, transform.y); - renderPathFill(ctx, imgCanvas, area, fill); + renderPathFill(ctx, area, fill, pattern); }); // drawPattern(imgCanvas, fill); } -function renderPathFill(ctx: CanvasRenderingContext2D, imgCanvas: HTMLCanvasElement, path: string, fill: Fill) { +function renderPathFill(ctx: CanvasRenderingContext2D, path: string, fill: Fill, pattern: CanvasPattern | null) { const path2d = new Path2D(path); - const pattern = ctx.createPattern(imgCanvas, 'repeat'); ctx.fillStyle = RGBtoString(fill.color); ctx.fill(path2d); if (pattern) { diff --git a/src/chart_types/xy_chart/renderer/canvas/renderers.ts b/src/chart_types/xy_chart/renderer/canvas/renderers.ts index ccb833e2a7..3f19d53cdc 100644 --- a/src/chart_types/xy_chart/renderer/canvas/renderers.ts +++ b/src/chart_types/xy_chart/renderer/canvas/renderers.ts @@ -40,8 +40,6 @@ export function renderXYChartCanvas2d( props: ReactiveChartStateProps, ) { const imgCanvas = document.createElement('canvas'); - imgCanvas.width = 30; - imgCanvas.height = 30; withContext(ctx, (ctx) => { // let's set the devicePixelRatio once and for all; then we'll never worry about it again diff --git a/src/utils/themes/textures.ts b/src/utils/themes/textures.ts new file mode 100644 index 0000000000..2fa9db5c10 --- /dev/null +++ b/src/utils/themes/textures.ts @@ -0,0 +1,82 @@ +/* + * 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 { TexturedStyles } from './theme'; + +function linePaths(type: string, s: number): string { + switch (type) { + case 'line': + return `M ${s / 2}, 0 l 0, ${s}`; + case 'square': + return `M ${s / 4} ${s / 4} l ${s / 2} 0 l 0 ${s / 2} l ${-s / 2} 0 Z`; + case 'triangle': + return `M ${s / 2} 0 L ${s} ${s} L ${s} ${s / 2} Z`; + case 'cross': + return `M ${s / 4},${s / 4}l${s / 2},${s / 2}M${s / 4},${(s * 3) / 4}l${s / 2},${-s / 2}`; + default: + return `M ${s / 2}, 0 l 0, ${s}`; + } +} + +/** @public */ +export function drawPattern( + mainCtx: CanvasRenderingContext2D, + textureStyle: TexturedStyles, + canvas: HTMLCanvasElement, +) { + const { type, stroke, opacity, scale, fill } = textureStyle; + const size = scale || 10; + canvas.width = size; + canvas.height = size; + const ctx = canvas.getContext('2d'); + + if (ctx !== null) { + ctx.globalAlpha = opacity || 1; + ctx.strokeStyle = stroke; + switch (type) { + case 'circle': + ctx.beginPath(); + ctx.arc(size / 2, size / 2, 5, 0, 2 * Math.PI); + if (fill === 0) { + ctx.stroke(); + } else { + ctx.fill(); + } + break; + case 'triangle': + case 'square': + ctx.beginPath(); + if (fill === 0) { + ctx.stroke(new Path2D(linePaths(type, size))); + } else { + ctx.fill(new Path2D(linePaths(type, size))); + } + break; + case 'line': + case 'cross': + ctx.beginPath(); + ctx.stroke(new Path2D(linePaths(type, size))); + break; + default: + break; + } + return mainCtx.createPattern(canvas, 'repeat'); + } + return null; +} diff --git a/src/utils/themes/theme.ts b/src/utils/themes/theme.ts index 6ddbb10b2e..2c0db59815 100644 --- a/src/utils/themes/theme.ts +++ b/src/utils/themes/theme.ts @@ -369,8 +369,27 @@ export interface LineStyle { dash?: number[]; } +/** @public */ +export interface TexturedStyles { + type: 'line' | 'circle' | 'square' | 'triangle' | 'cross'; + /* To fill the stoke with Color or ColorVariant */ + stroke: Color | ColorVariant; + /* The angle of rotation required in radians */ + rotation: number; + /* The opacity of each texture on the theme/series */ + opacity?: number; + /* If the polygon textures should be filled or empty */ + fill?: 0 | 1; + path?: string; + /* The size of the textures,defaulted as 10 */ + scale?: number; + spacing?: number; +} + /** @public */ export interface AreaStyle { + /* applying textures to the area on the theme/series */ + texture?: TexturedStyles; /** is the area is visible or hidden ? */ visible: boolean; /** a static fill color if defined, if not it will use the color of the series */ From 66b05700fff568c5c230b0214ebe9ccefb1e06bc Mon Sep 17 00:00:00 2001 From: Debajyoti Halder Date: Tue, 11 May 2021 21:33:20 +0530 Subject: [PATCH 05/16] feat(a11y): add rotation attribute for textures --- .../xy_chart/renderer/canvas/primitives/path.ts | 2 +- src/utils/themes/textures.ts | 7 ++++++- src/utils/themes/theme.ts | 3 ++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/chart_types/xy_chart/renderer/canvas/primitives/path.ts b/src/chart_types/xy_chart/renderer/canvas/primitives/path.ts index eeefa02e53..7f7db3246b 100644 --- a/src/chart_types/xy_chart/renderer/canvas/primitives/path.ts +++ b/src/chart_types/xy_chart/renderer/canvas/primitives/path.ts @@ -106,7 +106,7 @@ export function renderAreaPath( const textures: TexturedStyles = { type: 'square', stroke: 'black', - rotation: 1.5, + rotation: 0.7, scale: 20, }; const pattern = drawPattern(ctx, textures, imgCanvas); diff --git a/src/utils/themes/textures.ts b/src/utils/themes/textures.ts index 2fa9db5c10..aa10c89b9f 100644 --- a/src/utils/themes/textures.ts +++ b/src/utils/themes/textures.ts @@ -40,7 +40,7 @@ export function drawPattern( textureStyle: TexturedStyles, canvas: HTMLCanvasElement, ) { - const { type, stroke, opacity, scale, fill } = textureStyle; + const { type, stroke, opacity, scale, rotation, fill } = textureStyle; const size = scale || 10; canvas.width = size; canvas.height = size; @@ -49,6 +49,11 @@ export function drawPattern( if (ctx !== null) { ctx.globalAlpha = opacity || 1; ctx.strokeStyle = stroke; + + ctx.translate(canvas.width / 2, canvas.height / 2); + ctx.rotate(rotation); + ctx.translate(-canvas.width / 2, -canvas.height / 2); + switch (type) { case 'circle': ctx.beginPath(); diff --git a/src/utils/themes/theme.ts b/src/utils/themes/theme.ts index 2c0db59815..90e67760ce 100644 --- a/src/utils/themes/theme.ts +++ b/src/utils/themes/theme.ts @@ -371,6 +371,7 @@ export interface LineStyle { /** @public */ export interface TexturedStyles { + /* typed of texture designs currently supported */ type: 'line' | 'circle' | 'square' | 'triangle' | 'cross'; /* To fill the stoke with Color or ColorVariant */ stroke: Color | ColorVariant; @@ -380,9 +381,9 @@ export interface TexturedStyles { opacity?: number; /* If the polygon textures should be filled or empty */ fill?: 0 | 1; - path?: string; /* The size of the textures,defaulted as 10 */ scale?: number; + path?: string; spacing?: number; } From 8eb2b44dcb354e90fff7f6eaf6a3efe444516a33 Mon Sep 17 00:00:00 2001 From: Debajyoti Halder Date: Wed, 12 May 2021 23:51:27 +0530 Subject: [PATCH 06/16] fix(a11y): refactor functions in xy_chart --- .../xy_chart/renderer/canvas/areas.ts | 8 ++-- .../renderer/canvas/primitives/path.ts | 37 +------------------ .../xy_chart/renderer/canvas/renderers.ts | 2 +- 3 files changed, 6 insertions(+), 41 deletions(-) diff --git a/src/chart_types/xy_chart/renderer/canvas/areas.ts b/src/chart_types/xy_chart/renderer/canvas/areas.ts index be3f2327ef..3724b92904 100644 --- a/src/chart_types/xy_chart/renderer/canvas/areas.ts +++ b/src/chart_types/xy_chart/renderer/canvas/areas.ts @@ -41,7 +41,7 @@ interface AreaGeometriesProps { } /** @internal */ -export function renderAreas(imgCanvas: HTMLCanvasElement, ctx: CanvasRenderingContext2D, props: AreaGeometriesProps) { +export function renderAreas(ctx: CanvasRenderingContext2D, imgCanvas: HTMLCanvasElement, props: AreaGeometriesProps) { const { sharedStyle, highlightedLegendItem, areas, rotation, clippings, renderingArea } = props; withContext(ctx, (ctx) => { @@ -54,7 +54,7 @@ export function renderAreas(imgCanvas: HTMLCanvasElement, ctx: CanvasRenderingCo rotation, renderingArea, (ctx) => { - renderArea(imgCanvas, ctx, area, sharedStyle, clippings, highlightedLegendItem); + renderArea(ctx, imgCanvas, area, sharedStyle, clippings, highlightedLegendItem); }, { area: clippings, shouldClip: true }, ); @@ -95,8 +95,8 @@ export function renderAreas(imgCanvas: HTMLCanvasElement, ctx: CanvasRenderingCo } function renderArea( - imgCanvas: HTMLCanvasElement, ctx: CanvasRenderingContext2D, + imgCanvas: HTMLCanvasElement, glyph: AreaGeometry, sharedStyle: SharedGeometryStateStyle, clippings: Rect, @@ -105,7 +105,7 @@ function renderArea( const { area, color, transform, seriesIdentifier, seriesAreaStyle, clippedRanges, hideClippedRanges } = glyph; const geometryStateStyle = getGeometryStateStyle(seriesIdentifier, sharedStyle, highlightedLegendItem); const fill = buildAreaStyles(color, seriesAreaStyle, geometryStateStyle); - renderAreaPath(imgCanvas, ctx, transform, area, fill, clippedRanges, clippings, hideClippedRanges); + renderAreaPath(ctx, imgCanvas, transform, area, fill, clippedRanges, clippings, hideClippedRanges); } function renderAreaLines( diff --git a/src/chart_types/xy_chart/renderer/canvas/primitives/path.ts b/src/chart_types/xy_chart/renderer/canvas/primitives/path.ts index 7f7db3246b..6c7a3a51a4 100644 --- a/src/chart_types/xy_chart/renderer/canvas/primitives/path.ts +++ b/src/chart_types/xy_chart/renderer/canvas/primitives/path.ts @@ -26,41 +26,6 @@ import { drawPattern } from '../../../../../utils/themes/textures'; import { TexturedStyles } from '../../../../../utils/themes/theme'; import { renderMultiLine } from './line'; -// function drawPattern(type: string, can: HTMLCanvasElement, fill: Fill, size: number) { -// const ctx = can.getContext('2d'); - -// if (ctx !== null) { -// if (type.indexOf('line') === 0) { -// ctx.strokeStyle = 'black'; -// ctx.beginPath(); -// ctx.stroke(new Path2D(linePaths(type.slice(4), size))); -// return; -// } - -// switch (type) { -// case 'circle': -// ctx.strokeStyle = 'black'; -// ctx.beginPath(); -// ctx.arc(size / 2, size / 2, 5, 0, 2 * Math.PI); -// ctx.stroke(); -// break; -// case 'circleFill': -// ctx.strokeStyle = 'black'; -// ctx.beginPath(); -// ctx.arc(size / 2, size / 2, 2, 0, 2 * Math.PI); -// ctx.fill(); -// break; -// default: -// break; -// } -// } - -// // if (ctx != null) { -// // ctx.fillStyle = RGBtoString(fill.color); -// // ctx.fill(); -// // } -// } - /** @internal */ export function renderLinePaths( context: CanvasRenderingContext2D, @@ -94,8 +59,8 @@ export function renderLinePaths( /** @internal */ export function renderAreaPath( - imgCanvas: HTMLCanvasElement, ctx: CanvasRenderingContext2D, + imgCanvas: HTMLCanvasElement, transform: Point, area: string, fill: Fill, diff --git a/src/chart_types/xy_chart/renderer/canvas/renderers.ts b/src/chart_types/xy_chart/renderer/canvas/renderers.ts index 3f19d53cdc..23a2b953fd 100644 --- a/src/chart_types/xy_chart/renderer/canvas/renderers.ts +++ b/src/chart_types/xy_chart/renderer/canvas/renderers.ts @@ -122,7 +122,7 @@ export function renderXYChartCanvas2d( // rendering areas (ctx: CanvasRenderingContext2D) => { withContext(ctx, (ctx) => { - renderAreas(imgCanvas, ctx, { + renderAreas(ctx, imgCanvas, { areas: geometries.areas, clippings, renderingArea, From df766a82ed59baf8a0958d2bfdfbd8f3aa94fe52 Mon Sep 17 00:00:00 2001 From: nickofthyme Date: Thu, 27 May 2021 14:05:41 -0500 Subject: [PATCH 07/16] chore: cleanup area texture logic - use shared svg shape paths - pull texture styles from theme - add more options to texture theme styles - add global pattern rotation and offset - add stories to showcase changes - dry up degree to radian conversions --- .../xy_chart/renderer/canvas/areas.ts | 9 +- .../renderer/canvas/primitives/path.ts | 45 +++-- .../renderer/canvas/primitives/shapes.ts | 3 +- .../xy_chart/renderer/canvas/styles/area.ts | 13 +- .../xy_chart/renderer/canvas/utils/debug.ts | 5 +- .../renderer/canvas/utils/panel_transform.ts | 4 +- .../xy_chart/renderer/shapes_paths.ts | 15 +- src/chart_types/xy_chart/utils/axis_utils.ts | 5 +- src/chart_types/xy_chart/utils/texture.ts | 108 +++++++++++ src/geoms/types.ts | 17 +- src/mocks/utils.ts | 22 +++ src/renderers/canvas/index.ts | 3 +- src/utils/common.tsx | 7 + src/utils/themes/textures.ts | 87 --------- src/utils/themes/theme.ts | 70 ++++++-- stories/area/20_with_texture.tsx | 134 ++++++++++++++ stories/area/21_texture_multiple_series.tsx | 168 ++++++++++++++++++ stories/area/area.stories.tsx | 2 + 18 files changed, 575 insertions(+), 142 deletions(-) create mode 100644 src/chart_types/xy_chart/utils/texture.ts delete mode 100644 src/utils/themes/textures.ts create mode 100644 stories/area/20_with_texture.tsx create mode 100644 stories/area/21_texture_multiple_series.tsx diff --git a/src/chart_types/xy_chart/renderer/canvas/areas.ts b/src/chart_types/xy_chart/renderer/canvas/areas.ts index 3724b92904..ede7395189 100644 --- a/src/chart_types/xy_chart/renderer/canvas/areas.ts +++ b/src/chart_types/xy_chart/renderer/canvas/areas.ts @@ -104,8 +104,9 @@ function renderArea( ) { const { area, color, transform, seriesIdentifier, seriesAreaStyle, clippedRanges, hideClippedRanges } = glyph; const geometryStateStyle = getGeometryStateStyle(seriesIdentifier, sharedStyle, highlightedLegendItem); - const fill = buildAreaStyles(color, seriesAreaStyle, geometryStateStyle); - renderAreaPath(ctx, imgCanvas, transform, area, fill, clippedRanges, clippings, hideClippedRanges); + const styles = buildAreaStyles(ctx, imgCanvas, color, seriesAreaStyle, geometryStateStyle); + + renderAreaPath(ctx, transform, area, styles, clippedRanges, clippings, hideClippedRanges); } function renderAreaLines( @@ -117,7 +118,7 @@ function renderAreaLines( ) { const { lines, color, seriesIdentifier, transform, seriesAreaLineStyle, clippedRanges, hideClippedRanges } = glyph; const geometryStateStyle = getGeometryStateStyle(seriesIdentifier, sharedStyle, highlightedLegendItem); - const stroke = buildLineStyles(color, seriesAreaLineStyle, geometryStateStyle); + const styles = buildLineStyles(color, seriesAreaLineStyle, geometryStateStyle); - renderLinePaths(ctx, transform, lines, stroke, clippedRanges, clippings, hideClippedRanges); + renderLinePaths(ctx, transform, lines, styles, clippedRanges, clippings, hideClippedRanges); } diff --git a/src/chart_types/xy_chart/renderer/canvas/primitives/path.ts b/src/chart_types/xy_chart/renderer/canvas/primitives/path.ts index 6c7a3a51a4..2a648b3e0e 100644 --- a/src/chart_types/xy_chart/renderer/canvas/primitives/path.ts +++ b/src/chart_types/xy_chart/renderer/canvas/primitives/path.ts @@ -20,10 +20,9 @@ import { RGBtoString } from '../../../../../common/color_library_wrappers'; import { Rect, Stroke, Fill } from '../../../../../geoms/types'; import { withContext, withClipRanges } from '../../../../../renderers/canvas'; +import { getRadians } from '../../../../../utils/common'; import { ClippedRanges } from '../../../../../utils/geometry'; import { Point } from '../../../../../utils/point'; -import { drawPattern } from '../../../../../utils/themes/textures'; -import { TexturedStyles } from '../../../../../utils/themes/theme'; import { renderMultiLine } from './line'; /** @internal */ @@ -60,7 +59,6 @@ export function renderLinePaths( /** @internal */ export function renderAreaPath( ctx: CanvasRenderingContext2D, - imgCanvas: HTMLCanvasElement, transform: Point, area: string, fill: Fill, @@ -68,17 +66,10 @@ export function renderAreaPath( clippings: Rect, hideClippedRanges = false, ) { - const textures: TexturedStyles = { - type: 'square', - stroke: 'black', - rotation: 0.7, - scale: 20, - }; - const pattern = drawPattern(ctx, textures, imgCanvas); if (clippedRanges.length > 0) { withClipRanges(ctx, clippedRanges, clippings, false, (ctx) => { ctx.translate(transform.x, transform.y); - renderPathFill(ctx, area, fill, pattern); + renderPathFill(ctx, area, fill); }); if (hideClippedRanges) { return; @@ -90,24 +81,40 @@ export function renderAreaPath( ...fill.color, opacity: opacity / 2, }; - renderPathFill(ctx, area, { ...fill, color }, pattern); + renderPathFill(ctx, area, { ...fill, color }); }); return; } withContext(ctx, (ctx) => { ctx.translate(transform.x, transform.y); - renderPathFill(ctx, area, fill, pattern); + renderPathFill(ctx, area, fill); }); - // drawPattern(imgCanvas, fill); } -function renderPathFill(ctx: CanvasRenderingContext2D, path: string, fill: Fill, pattern: CanvasPattern | null) { +function renderPathFill(ctx: CanvasRenderingContext2D, path: string, fill: Fill) { const path2d = new Path2D(path); ctx.fillStyle = RGBtoString(fill.color); ctx.fill(path2d); - if (pattern) { - ctx.fillStyle = pattern; + + if (fill.texture) { + ctx.clip(path2d); + + const rotation = getRadians(fill.texture.rotation ?? 0); + const { offset } = fill.texture; + + if (offset && offset.global) ctx.translate(offset?.x ?? 0, offset?.y ?? 0); + if (rotation) ctx.rotate(rotation); + if (offset && !offset.global) ctx.translate(offset?.x ?? 0, offset?.y ?? 0); + + ctx.fillStyle = fill.texture.pattern; + + if (rotation || fill.texture.offset) { + const fullSize = ctx.canvas.clientWidth * ctx.canvas.clientHeight; + ctx.translate(-fullSize / 2, -fullSize / 2); + ctx.fillRect(0, 0, fullSize, fullSize); + } else { + ctx.beginPath(); + ctx.fill(path2d); + } } - ctx.beginPath(); - ctx.fill(path2d); } diff --git a/src/chart_types/xy_chart/renderer/canvas/primitives/shapes.ts b/src/chart_types/xy_chart/renderer/canvas/primitives/shapes.ts index 7a0ef6a967..88cc2e1305 100644 --- a/src/chart_types/xy_chart/renderer/canvas/primitives/shapes.ts +++ b/src/chart_types/xy_chart/renderer/canvas/primitives/shapes.ts @@ -19,6 +19,7 @@ import { Circle, Fill, Stroke } from '../../../../../geoms/types'; import { withContext } from '../../../../../renderers/canvas'; +import { getRadians } from '../../../../../utils/common'; import { PointShape } from '../../../../../utils/themes/theme'; import { ShapeRendererFn } from '../../shapes_paths'; import { fillAndStroke } from './utils'; @@ -38,7 +39,7 @@ export function renderShape( const [pathFn, rotation] = ShapeRendererFn[shape]; const { x, y, radius } = coordinates; ctx.translate(x, y); - ctx.rotate((rotation * Math.PI) / 180); + ctx.rotate(getRadians(rotation)); ctx.beginPath(); const path = new Path2D(pathFn(radius)); diff --git a/src/chart_types/xy_chart/renderer/canvas/styles/area.ts b/src/chart_types/xy_chart/renderer/canvas/styles/area.ts index edc296b4e3..021671b26a 100644 --- a/src/chart_types/xy_chart/renderer/canvas/styles/area.ts +++ b/src/chart_types/xy_chart/renderer/canvas/styles/area.ts @@ -17,10 +17,12 @@ * under the License. */ +import { Color, ColorVariant } from '../../../../../../dist'; import { OpacityFn, stringToRGB } from '../../../../../common/color_library_wrappers'; import { Fill } from '../../../../../geoms/types'; import { getColorFromVariant } from '../../../../../utils/common'; import { GeometryStateStyle, AreaStyle } from '../../../../../utils/themes/theme'; +import { getTextureStyles } from '../../../utils/texture'; /** * Return the rendering props for an area. The color of the area will be overwritten @@ -31,13 +33,18 @@ import { GeometryStateStyle, AreaStyle } from '../../../../../utils/themes/theme * @internal */ export function buildAreaStyles( - baseColor: string, + ctx: CanvasRenderingContext2D, + imgCanvas: HTMLCanvasElement, + baseColor: Color | ColorVariant, themeAreaStyle: AreaStyle, geometryStateStyle: GeometryStateStyle, ): Fill { const fillOpacity: OpacityFn = (opacity) => opacity * themeAreaStyle.opacity * geometryStateStyle.opacity; - const fillColor = stringToRGB(getColorFromVariant(baseColor, themeAreaStyle.fill), fillOpacity); + const texture = getTextureStyles(ctx, imgCanvas, baseColor, fillOpacity, themeAreaStyle.texture); + const color = stringToRGB(getColorFromVariant(baseColor, themeAreaStyle.fill), fillOpacity); + return { - color: fillColor, + color, + texture, }; } diff --git a/src/chart_types/xy_chart/renderer/canvas/utils/debug.ts b/src/chart_types/xy_chart/renderer/canvas/utils/debug.ts index d7706a0d08..6e2224b959 100644 --- a/src/chart_types/xy_chart/renderer/canvas/utils/debug.ts +++ b/src/chart_types/xy_chart/renderer/canvas/utils/debug.ts @@ -19,6 +19,7 @@ import { Fill, Stroke, Rect } from '../../../../../geoms/types'; import { withContext } from '../../../../../renderers/canvas'; +import { getRadians } from '../../../../../utils/common'; import { Point } from '../../../../../utils/point'; import { renderRect } from '../primitives/rect'; @@ -50,7 +51,7 @@ export function renderDebugRect( ) { withContext(ctx, (ctx) => { ctx.translate(rect.x, rect.y); - ctx.rotate((rotation * Math.PI) / 180); + ctx.rotate(getRadians(rotation)); renderRect( ctx, { @@ -78,7 +79,7 @@ export function renderDebugRectCenterRotated( withContext(ctx, (ctx) => { ctx.translate(x, y); - ctx.rotate((rotation * Math.PI) / 180); + ctx.rotate(getRadians(rotation)); ctx.translate(-x, -y); renderRect( ctx, diff --git a/src/chart_types/xy_chart/renderer/canvas/utils/panel_transform.ts b/src/chart_types/xy_chart/renderer/canvas/utils/panel_transform.ts index e41d6bbdbd..71f594f146 100644 --- a/src/chart_types/xy_chart/renderer/canvas/utils/panel_transform.ts +++ b/src/chart_types/xy_chart/renderer/canvas/utils/panel_transform.ts @@ -19,7 +19,7 @@ import { Rect } from '../../../../../geoms/types'; import { withContext } from '../../../../../renderers/canvas'; -import { Rotation } from '../../../../../utils/common'; +import { getRadians, Rotation } from '../../../../../utils/common'; import { Dimensions } from '../../../../../utils/dimensions'; import { computeChartTransform } from '../../../state/utils/utils'; @@ -40,7 +40,7 @@ export function withPanelTransform( const top = renderingArea.top + panel.top + transform.y; withContext(context, (ctx) => { ctx.translate(left, top); - ctx.rotate((rotation * Math.PI) / 180); + ctx.rotate(getRadians(rotation)); if (clippings?.shouldClip) { const { x, y, width, height } = clippings.area; diff --git a/src/chart_types/xy_chart/renderer/shapes_paths.ts b/src/chart_types/xy_chart/renderer/shapes_paths.ts index a3a8648c29..fbd58036fb 100644 --- a/src/chart_types/xy_chart/renderer/shapes_paths.ts +++ b/src/chart_types/xy_chart/renderer/shapes_paths.ts @@ -17,7 +17,7 @@ * under the License. */ -import { PointShape } from '../../../utils/themes/theme'; +import { PointShape, TextureShape } from '../../../utils/themes/theme'; /** @internal */ export type SVGPath = string; @@ -44,7 +44,12 @@ export const square: SVGPathFn = (r: number) => { /** @internal */ export const circle: SVGPathFn = (r: number) => { - return `M ${-r} ${0} a ${r},${r} 0 1,0 ${r * 2},0 a ${r},${r} 0 1,0 ${-r * 2},0`; + return `M ${-r} 0 a ${r},${r} 0 1,0 ${r * 2},0 a ${r},${r} 0 1,0 ${-r * 2},0`; +}; + +/** @internal */ +export const line: SVGPathFn = (r: number) => { + return `M 0 ${-r} l 0 ${r * 2}`; }; /** @internal */ @@ -56,3 +61,9 @@ export const ShapeRendererFn: Record = { [PointShape.Square]: [square, 0], [PointShape.Triangle]: [triangle, 0], }; + +/** @internal */ +export const TextureRendererFn: Record = { + ...ShapeRendererFn, + [TextureShape.Line]: [line, 0], +}; diff --git a/src/chart_types/xy_chart/utils/axis_utils.ts b/src/chart_types/xy_chart/utils/axis_utils.ts index 19c86316cd..8f83de2223 100644 --- a/src/chart_types/xy_chart/utils/axis_utils.ts +++ b/src/chart_types/xy_chart/utils/axis_utils.ts @@ -27,6 +27,7 @@ import { VerticalAlignment, HorizontalAlignment, getPercentageValue, + getRadians, } from '../../../utils/common'; import { Dimensions, Margins, getSimplePadding, Size } from '../../../utils/dimensions'; import { Range } from '../../../utils/domain'; @@ -197,9 +198,7 @@ export function getScaleForAxisSpec( /** @internal */ export function computeRotatedLabelDimensions(unrotatedDims: BBox, degreesRotation: number): BBox { const { width, height } = unrotatedDims; - - const radians = (degreesRotation * Math.PI) / 180; - + const radians = getRadians(degreesRotation); const rotatedHeight = Math.abs(width * Math.sin(radians)) + Math.abs(height * Math.cos(radians)); const rotatedWidth = Math.abs(width * Math.cos(radians)) + Math.abs(height * Math.sin(radians)); diff --git a/src/chart_types/xy_chart/utils/texture.ts b/src/chart_types/xy_chart/utils/texture.ts new file mode 100644 index 0000000000..194da95329 --- /dev/null +++ b/src/chart_types/xy_chart/utils/texture.ts @@ -0,0 +1,108 @@ +/* + * 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 { OpacityFn } from '../../../common/color_library_wrappers'; +import { Texture } from '../../../geoms/types'; +import { Color, ColorVariant, getColorFromVariant, getRadians } from '../../../utils/common'; +import { Point } from '../../../utils/point'; +import { TexturedStyles, TextureShape } from '../../../utils/themes/theme'; +import { TextureRendererFn } from '../renderer/shapes_paths'; + +const getSpacing = ({ spacing }: TexturedStyles): Point => ({ + x: typeof spacing === 'number' ? spacing : spacing?.x ?? 0, + y: typeof spacing === 'number' ? spacing : spacing?.y ?? 0, +}); + +const getPath = (textureStyle: TexturedStyles, size: number, stokeWith: number): [path: Path2D, rotation: number] => { + if ('path' in textureStyle) { + const path = typeof textureStyle.path === 'string' ? new Path2D(textureStyle.path) : textureStyle.path; + + return [path, 0]; + } + const [pathFn, rotation] = TextureRendererFn[textureStyle.shape]; + // Prevents clipping shapes near edge + const stokeWidthPadding = [TextureShape.Circle, TextureShape.Square].includes(textureStyle.shape as any) + ? stokeWith + : 0; + + return [new Path2D(pathFn((size - stokeWidthPadding) / 2)), rotation]; +}; + +/** @internal */ +function createPattern( + ctx: CanvasRenderingContext2D, + patternCanvas: HTMLCanvasElement, + baseColor: Color | ColorVariant, + getOpacity: OpacityFn, + textureStyle?: TexturedStyles, +): CanvasPattern | undefined { + const pCtx = patternCanvas.getContext('2d'); + if (!textureStyle || !pCtx) return; + + const { size = 10, stroke, strokeWidth = 1, opacity, shapeRotation, fill, dash } = textureStyle; + + const spacing = getSpacing(textureStyle); + patternCanvas.width = size + spacing.x; + patternCanvas.height = size + spacing.y; + + pCtx.globalAlpha = opacity ?? getOpacity(1); + pCtx.lineWidth = strokeWidth; + + pCtx.strokeStyle = getColorFromVariant(baseColor, stroke ?? ColorVariant.Series); + if (dash) pCtx.setLineDash(dash); + + if (fill) pCtx.fillStyle = getColorFromVariant(baseColor, fill); + + const [path, pathRotation] = getPath(textureStyle, size, strokeWidth); + const rotation = (shapeRotation ?? 0) + pathRotation; + + pCtx.translate(patternCanvas.width / 2, patternCanvas.height / 2); + + if (rotation) pCtx.rotate(getRadians(rotation)); + + pCtx.beginPath(); + + if (path) { + pCtx.stroke(path); + if (fill) pCtx.fill(path); + } + + return ctx.createPattern(patternCanvas, 'repeat') ?? undefined; +} + +/** @internal */ +export const getTextureStyles = ( + ctx: CanvasRenderingContext2D, + patternCanvas: HTMLCanvasElement, + baseColor: Color | ColorVariant, + getOpacity: OpacityFn, + texture?: TexturedStyles, +): Texture | undefined => { + const pattern = createPattern(ctx, patternCanvas, baseColor, getOpacity, texture); + + if (!pattern || !texture) return; + + const { rotation, offset } = texture; + + return { + pattern, + rotation, + offset, + }; +}; diff --git a/src/geoms/types.ts b/src/geoms/types.ts index 1536d938c3..fd4d7a8f0b 100644 --- a/src/geoms/types.ts +++ b/src/geoms/types.ts @@ -19,10 +19,9 @@ import { RgbObject } from '../common/color_library_wrappers'; import { Radian } from '../common/geometry'; +import { TexturedStyles } from '../utils/themes/theme'; -/** - * @internal - */ +/** @internal */ export interface Text { text: string; x: number; @@ -60,6 +59,17 @@ export interface Circle { radius: number; } +/** + * render options for texture + * @public + */ +export interface Texture extends Pick { + /** + * patern to apply to canvas fill + */ + pattern: CanvasPattern; +} + /** * Fill style for every geometry * @public @@ -69,6 +79,7 @@ export interface Fill { * fill color in rgba */ color: RgbObject; + texture?: Texture; } /** diff --git a/src/mocks/utils.ts b/src/mocks/utils.ts index 2d9701eb12..e1e36cae22 100644 --- a/src/mocks/utils.ts +++ b/src/mocks/utils.ts @@ -71,3 +71,25 @@ export class SeededDataGenerator extends DataGenerator { super(frequency, getRandomNumberGenerator()); } } + +/** + * Returns random array or object value + * @internal + */ +export const getRandomEntryFn = (seed = getRNGSeed()) => { + const rng = seedrandom(seed); + + return function getRandomEntryClosure(entries: T[] | Record) { + if (Array.isArray(entries)) { + const index = Math.floor(rng() * entries.length); + + return entries[index]; + } + + const keys = Object.keys(entries); + const index = Math.floor(rng() * keys.length); + const key = keys[index]; + + return entries[key]; + }; +}; diff --git a/src/renderers/canvas/index.ts b/src/renderers/canvas/index.ts index f3866e7efe..25e56cb1b5 100644 --- a/src/renderers/canvas/index.ts +++ b/src/renderers/canvas/index.ts @@ -19,6 +19,7 @@ import { Coordinate } from '../../common/geometry'; import { Rect } from '../../geoms/types'; +import { getRadians } from '../../utils/common'; import { ClippedRanges } from '../../utils/geometry'; import { Point } from '../../utils/point'; @@ -119,7 +120,7 @@ export function withRotatedOrigin( withContext(ctx, (ctx) => { const { x, y } = origin; ctx.translate(x, y); - ctx.rotate((rotation * Math.PI) / 180); + ctx.rotate(getRadians(rotation)); ctx.translate(-x, -y); fn(ctx); }); diff --git a/src/utils/common.tsx b/src/utils/common.tsx index 88f50fa23d..b67573dc14 100644 --- a/src/utils/common.tsx +++ b/src/utils/common.tsx @@ -189,6 +189,13 @@ export function getColorFromVariant(seriesColor: Color, color?: Color | ColorVar return color || seriesColor; } +/** + * Converts degree to radians + * @param angle - in degrees + * @public + */ +export const getRadians = (angle: number) => (angle * Math.PI) / 180; + /** * This function returns a function to generate ids. * This can be used to generate unique, but predictable ids to pair labels diff --git a/src/utils/themes/textures.ts b/src/utils/themes/textures.ts deleted file mode 100644 index aa10c89b9f..0000000000 --- a/src/utils/themes/textures.ts +++ /dev/null @@ -1,87 +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 { TexturedStyles } from './theme'; - -function linePaths(type: string, s: number): string { - switch (type) { - case 'line': - return `M ${s / 2}, 0 l 0, ${s}`; - case 'square': - return `M ${s / 4} ${s / 4} l ${s / 2} 0 l 0 ${s / 2} l ${-s / 2} 0 Z`; - case 'triangle': - return `M ${s / 2} 0 L ${s} ${s} L ${s} ${s / 2} Z`; - case 'cross': - return `M ${s / 4},${s / 4}l${s / 2},${s / 2}M${s / 4},${(s * 3) / 4}l${s / 2},${-s / 2}`; - default: - return `M ${s / 2}, 0 l 0, ${s}`; - } -} - -/** @public */ -export function drawPattern( - mainCtx: CanvasRenderingContext2D, - textureStyle: TexturedStyles, - canvas: HTMLCanvasElement, -) { - const { type, stroke, opacity, scale, rotation, fill } = textureStyle; - const size = scale || 10; - canvas.width = size; - canvas.height = size; - const ctx = canvas.getContext('2d'); - - if (ctx !== null) { - ctx.globalAlpha = opacity || 1; - ctx.strokeStyle = stroke; - - ctx.translate(canvas.width / 2, canvas.height / 2); - ctx.rotate(rotation); - ctx.translate(-canvas.width / 2, -canvas.height / 2); - - switch (type) { - case 'circle': - ctx.beginPath(); - ctx.arc(size / 2, size / 2, 5, 0, 2 * Math.PI); - if (fill === 0) { - ctx.stroke(); - } else { - ctx.fill(); - } - break; - case 'triangle': - case 'square': - ctx.beginPath(); - if (fill === 0) { - ctx.stroke(new Path2D(linePaths(type, size))); - } else { - ctx.fill(new Path2D(linePaths(type, size))); - } - break; - case 'line': - case 'cross': - ctx.beginPath(); - ctx.stroke(new Path2D(linePaths(type, size))); - break; - default: - break; - } - return mainCtx.createPattern(canvas, 'repeat'); - } - return null; -} diff --git a/src/utils/themes/theme.ts b/src/utils/themes/theme.ts index 90e67760ce..c694911091 100644 --- a/src/utils/themes/theme.ts +++ b/src/utils/themes/theme.ts @@ -22,6 +22,7 @@ import { $Values } from 'utility-types'; import { Pixels, Ratio } from '../../common/geometry'; import { Color, ColorVariant, HorizontalAlignment, RecursivePartial, VerticalAlignment } from '../common'; import { Margins, SimplePadding } from '../dimensions'; +import { Point } from '../point'; /** @public */ export interface Visible { @@ -370,26 +371,65 @@ export interface LineStyle { } /** @public */ -export interface TexturedStyles { - /* typed of texture designs currently supported */ - type: 'line' | 'circle' | 'square' | 'triangle' | 'cross'; - /* To fill the stoke with Color or ColorVariant */ - stroke: Color | ColorVariant; - /* The angle of rotation required in radians */ - rotation: number; - /* The opacity of each texture on the theme/series */ +export const TextureShape = Object.freeze({ + ...PointShape, + Line: 'line' as const, +}); +/** @public */ +export type TextureShape = $Values; + +interface TexturedStylesBase { + /** polygon fill color for texture */ + fill?: Color | ColorVariant; + /** polygon stroke color for texture */ + stroke?: Color | ColorVariant; + /** polygon stroke width for texture */ + strokeWidth?: number; + /** polygon opacity for texture */ opacity?: number; - /* If the polygon textures should be filled or empty */ - fill?: 0 | 1; - /* The size of the textures,defaulted as 10 */ - scale?: number; - path?: string; - spacing?: number; + /** polygon opacity for texture */ + dash?: number[]; + /** polygon opacity for texture */ + size?: number; + /** + * The angle of rotation for entire texture + * in degrees + */ + rotation?: number; + /** + * The angle of rotation for polygons + * in degrees + */ + shapeRotation?: number; + /** texture spacing between polygons */ + spacing?: Partial | number; + /** overall origin offset of pattern */ + offset?: Partial & { + /** apply offset along global coordinate axes */ + global?: boolean; + }; +} + +interface TexturedShapeStyles extends TexturedStylesBase { + /** typed of texture designs currently supported */ + shape: TextureShape; +} + +interface TexturedPathStyles extends TexturedStylesBase { + /** path for polygon texture */ + path: string | Path2D; } +/** + * @public + * + * Texture style config for area spec + */ +export type TexturedStyles = TexturedPathStyles | TexturedShapeStyles; + /** @public */ export interface AreaStyle { - /* applying textures to the area on the theme/series */ + /** applying textures to the area on the theme/series */ texture?: TexturedStyles; /** is the area is visible or hidden ? */ visible: boolean; diff --git a/stories/area/20_with_texture.tsx b/stories/area/20_with_texture.tsx new file mode 100644 index 0000000000..d79002ba49 --- /dev/null +++ b/stories/area/20_with_texture.tsx @@ -0,0 +1,134 @@ +/* + * 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 { array, boolean, color, number, text } from '@storybook/addon-knobs'; +import React from 'react'; + +import { + AreaSeries, + Axis, + Chart, + CurveType, + Position, + ScaleType, + TexturedStyles, + Settings, + TextureShape, + LIGHT_THEME, +} from '../../src'; +import { KIBANA_METRICS } from '../../src/utils/data_samples/test_dataset_kibana'; +import { getKnobsFromEnum } from '../utils/knobs'; +import { SB_KNOBS_PANEL } from '../utils/storybook'; + +const group = { + texture: 'Texture', + pattern: 'Pattern', + series: 'Series', +}; +const STAR = + 'M -7.75 -2.5 l 5.9 0 l 1.85 -6.1 l 1.85 6.1 l 5.9 0 l -4.8 3.8 l 1.85 6.1 l -4.8 -3.8 l -4.8 3.8 l 1.85 -6.1 l -4.8 -3.8 z'; +const DEFAULT_COLOR = LIGHT_THEME.colors.vizColors[0]; + +const getTextureKnobs = (useCustomPath: boolean): TexturedStyles => ({ + ...(useCustomPath + ? { path: text('Custom path', STAR, group.texture) } + : { + shape: + getKnobsFromEnum('Shape', TextureShape, TextureShape.Line as TextureShape, { + group: group.texture, + }) ?? TextureShape.Line, + }), + stroke: boolean('Use stroke color', true, group.texture) + ? color('Stoke color', DEFAULT_COLOR, group.texture) + : undefined, + strokeWidth: number('Stroke width', 1, { min: 0, max: 10, step: 0.5 }, group.texture), + dash: array('Stroke dash', [], ',', group.texture).map((n) => parseInt(n, 10)), + fill: boolean('Use fill color', true, group.texture) ? color('Fill color', DEFAULT_COLOR, group.texture) : undefined, + rotation: number('Rotation (degrees)', 45, { min: -365, max: 365 }, group.pattern), + opacity: number('Opacity', 0.7, { min: 0, max: 1, step: 0.1 }, group.texture), + shapeRotation: number('Shape rotation (degrees)', 0, { min: -365, max: 365 }, group.texture), + size: useCustomPath + ? number('Shape size - custom path', 20, { min: 0 }, group.texture) + : number('Shape size', 20, { min: 0 }, group.texture), + spacing: { + x: number('Shape spacing - x', 10, { min: 0 }, group.pattern), + y: number('Shape spacing - y', 0, { min: 0 }, group.pattern), + }, + offset: { + x: number('Pattern offset - x', 0, {}, group.pattern), + y: number('Pattern offset - y', 0, {}, group.pattern), + global: boolean('Apply offset along global coordinate axes', true, group.pattern), + }, +}); + +export const Example = () => { + const start = KIBANA_METRICS.metrics.kibana_os_load[0].data[0][0]; + const data = KIBANA_METRICS.metrics.kibana_os_load[0].data.slice(0, 20).map((d) => [(d[0] - start) / 30000, d[1]]); + const useCustomPath = boolean('Use custom path', false, group.texture); + const texture: TexturedStyles = getTextureKnobs(useCustomPath); + const opacity = number('Series opacity', 1, { min: 0, max: 1, step: 0.1 }, group.series); + const showFill = boolean('Show series fill', false, group.series); + const seriesColor = color('Series color', DEFAULT_COLOR, group.series); + + return ( + + + + Number(d).toFixed(2)} + /> + + + + ); +}; + +// storybook configuration +Example.story = { + parameters: { + options: { selectedPanel: SB_KNOBS_PANEL }, + }, +}; diff --git a/stories/area/21_texture_multiple_series.tsx b/stories/area/21_texture_multiple_series.tsx new file mode 100644 index 0000000000..e5ac18b819 --- /dev/null +++ b/stories/area/21_texture_multiple_series.tsx @@ -0,0 +1,168 @@ +/* + * 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 { array, boolean, color, number, button } from '@storybook/addon-knobs'; +import React, { useState } from 'react'; + +import { + AreaSeries, + Axis, + Chart, + CurveType, + Position, + ScaleType, + TexturedStyles, + Settings, + TextureShape, +} from '../../src'; +import { getRandomNumberGenerator, SeededDataGenerator, getRandomEntryFn } from '../../src/mocks/utils'; +import { KIBANA_METRICS } from '../../src/utils/data_samples/test_dataset_kibana'; +import { getKnobsFromEnum } from '../utils/knobs'; +import { SB_KNOBS_PANEL } from '../utils/storybook'; + +const DEFAULT_COLOR = 'black'; +const group = { + random: 'Randomized parameters', + default: 'Default parameters', +}; +const dg = new SeededDataGenerator(); +const rng = getRandomNumberGenerator(); +const getRandomEntry = getRandomEntryFn(); + +interface Random { + shape: boolean; + rotation: boolean; + shapeRotation: boolean; + size: boolean; + spacing: { + x: boolean; + y: boolean; + }; + offset: { + x: boolean; + y: boolean; + }; +} + +const getDefaultTextureKnobs = (): TexturedStyles => ({ + shape: + getKnobsFromEnum('Shape', TextureShape, TextureShape.Circle as TextureShape, { + group: group.default, + }) ?? TextureShape.Circle, + strokeWidth: number('Stroke width', 1, { min: 0, max: 10, step: 0.5 }, group.default), + rotation: number('Rotation (degrees)', 45, { min: -365, max: 365 }, group.default), + shapeRotation: number('Shape rotation (degrees)', 0, { min: -365, max: 365 }, group.default), + size: number('Shape size', 20, { min: 0 }, group.default), + opacity: number('Opacity', 1, { min: 0, max: 1, step: 0.1 }, group.default), + spacing: { + x: number('Shape spacing - x', 10, { min: 0 }, group.default), + y: number('Shape spacing - y', 10, { min: 0 }, group.default), + }, + offset: { + x: number('Pattern offset - x', 0, {}, group.default), + y: number('Pattern offset - y', 0, {}, group.default), + global: true, + }, +}); + +const getRandomKnobs = (): Random => ({ + shape: boolean('Shape', true, group.random), + rotation: boolean('Rotation', false, group.random), + shapeRotation: boolean('Shape rotation', false, group.random), + size: boolean('Size', true, group.random), + spacing: { + x: boolean('X spacing', false, group.random), + y: boolean('Y spacing', false, group.random), + }, + offset: { + x: boolean('X offset', false, group.random), + y: boolean('Y offset', false, group.random), + }, +}); + +const getTexture = (randomize: Random): Partial => ({ + shape: randomize.shape ? getRandomEntry(TextureShape) : undefined, + rotation: randomize.rotation ? rng(0, 365) : undefined, + shapeRotation: randomize.shapeRotation ? rng(0, 365) : undefined, + size: randomize.size ? rng(5, 30) : undefined, + spacing: { + x: randomize.spacing.x ? rng(0, 30) : undefined, + y: randomize.spacing.y ? rng(0, 30) : undefined, + }, + offset: { + x: randomize.offset.x ? rng(0, 30) : undefined, + y: randomize.offset.y ? rng(0, 30) : undefined, + }, +}); + +const data = new Array(10).fill(0).map(() => dg.generateBasicSeries(10, 10)); + +export const Example = () => { + const [count, setCount] = useState(0); + button('Randomize', () => setCount((i) => i + 1), group.random); + const n = number('Total series', 4, { min: 0, max: 10, step: 1 }) ?? 2; + const chartColor = color('Chart color', DEFAULT_COLOR); + const random = getRandomKnobs(); + + return ( + + + + Number(d).toFixed(2)} + /> + + {new Array(n).fill(0).map((v, i) => ( + + ))} + + ); +}; + +// storybook configuration +Example.story = { + parameters: { + options: { selectedPanel: SB_KNOBS_PANEL }, + }, +}; diff --git a/stories/area/area.stories.tsx b/stories/area/area.stories.tsx index 7b16c2dbdc..f2781da40a 100644 --- a/stories/area/area.stories.tsx +++ b/stories/area/area.stories.tsx @@ -43,6 +43,8 @@ export { Example as stackedGrouped } from './15_stacked_grouped'; export { Example as withNegativeValues } from './17_negative'; export { Example as withNegativeAndPositive } from './18_negative_positive'; export { Example as withNegativeBand } from './19_negative_band'; +export { Example as withTexture } from './20_with_texture'; +export { Example as textureMultipleSeries } from './21_texture_multiple_series'; export { Example as testLinear } from './11_test_linear'; export { Example as testTime } from './12_test_time'; From 10518c5d79a18d728eddad8b23b9cbd48066ce90 Mon Sep 17 00:00:00 2001 From: nickofthyme Date: Thu, 27 May 2021 16:08:56 -0500 Subject: [PATCH 08/16] feat: add textures to rect fill styles - Add texture option to rect styles - improves shared geom highlight opacity usage - set default rectBorder.strokeWidth to 1, visible will hide - improve stories with bar series option --- .../xy_chart/renderer/canvas/bars.ts | 21 ++++++- .../renderer/canvas/primitives/path.ts | 12 ++-- .../renderer/canvas/primitives/rect.ts | 61 ++++++++----------- .../xy_chart/renderer/canvas/renderers.ts | 11 +++- .../xy_chart/renderer/canvas/styles/area.ts | 3 +- .../xy_chart/renderer/canvas/styles/bar.ts | 8 ++- src/chart_types/xy_chart/utils/texture.ts | 8 +-- src/common/color_library_wrappers.ts | 2 +- src/utils/themes/dark_theme.ts | 2 +- src/utils/themes/light_theme.ts | 2 +- src/utils/themes/theme.ts | 2 + stories/area/area.stories.tsx | 2 - .../23_with_texture.tsx} | 50 ++++++++------- .../24_texture_multiple_series.tsx} | 44 +++++++------ stories/stylings/stylings.stories.tsx | 2 + stories/utils/knobs.ts | 44 ++++++++++++- 16 files changed, 173 insertions(+), 101 deletions(-) rename stories/{area/20_with_texture.tsx => stylings/23_with_texture.tsx} (80%) rename stories/{area/21_texture_multiple_series.tsx => stylings/24_texture_multiple_series.tsx} (83%) diff --git a/src/chart_types/xy_chart/renderer/canvas/bars.ts b/src/chart_types/xy_chart/renderer/canvas/bars.ts index e1f4e114e1..1d32fe7488 100644 --- a/src/chart_types/xy_chart/renderer/canvas/bars.ts +++ b/src/chart_types/xy_chart/renderer/canvas/bars.ts @@ -32,6 +32,7 @@ import { withPanelTransform } from './utils/panel_transform'; /** @internal */ export function renderBars( ctx: CanvasRenderingContext2D, + imgCanvas: HTMLCanvasElement, barGeometries: Array>, sharedStyle: SharedGeometryStateStyle, clippings: Rect, @@ -40,13 +41,22 @@ export function renderBars( rotation?: Rotation, ) { withContext(ctx, (ctx) => { - const barRenderer = renderPerPanelBars(ctx, clippings, sharedStyle, renderingArea, highlightedLegendItem, rotation); + const barRenderer = renderPerPanelBars( + ctx, + imgCanvas, + clippings, + sharedStyle, + renderingArea, + highlightedLegendItem, + rotation, + ); barGeometries.forEach(barRenderer); }); } function renderPerPanelBars( ctx: CanvasRenderingContext2D, + imgCanvas: HTMLCanvasElement, clippings: Rect, sharedStyle: SharedGeometryStateStyle, renderingArea: Dimensions, @@ -66,7 +76,14 @@ function renderPerPanelBars( bars.forEach((barGeometry) => { const { x, y, width, height, color, seriesStyle, seriesIdentifier } = barGeometry; const geometryStateStyle = getGeometryStateStyle(seriesIdentifier, sharedStyle, highlightedLegendItem); - const { fill, stroke } = buildBarStyles(color, seriesStyle.rect, seriesStyle.rectBorder, geometryStateStyle); + const { fill, stroke } = buildBarStyles( + ctx, + imgCanvas, + color, + seriesStyle.rect, + seriesStyle.rectBorder, + geometryStateStyle, + ); const rect = { x, y, width, height }; withContext(ctx, (ctx) => { renderRect(ctx, rect, fill, stroke); diff --git a/src/chart_types/xy_chart/renderer/canvas/primitives/path.ts b/src/chart_types/xy_chart/renderer/canvas/primitives/path.ts index 2a648b3e0e..0e82caad7c 100644 --- a/src/chart_types/xy_chart/renderer/canvas/primitives/path.ts +++ b/src/chart_types/xy_chart/renderer/canvas/primitives/path.ts @@ -108,13 +108,9 @@ function renderPathFill(ctx: CanvasRenderingContext2D, path: string, fill: Fill) ctx.fillStyle = fill.texture.pattern; - if (rotation || fill.texture.offset) { - const fullSize = ctx.canvas.clientWidth * ctx.canvas.clientHeight; - ctx.translate(-fullSize / 2, -fullSize / 2); - ctx.fillRect(0, 0, fullSize, fullSize); - } else { - ctx.beginPath(); - ctx.fill(path2d); - } + // Use oversized rect to fill rotation/offset beyond path + const rotationRectFillSize = ctx.canvas.clientWidth * ctx.canvas.clientHeight; + ctx.translate(-rotationRectFillSize / 2, -rotationRectFillSize / 2); + ctx.fillRect(0, 0, rotationRectFillSize, rotationRectFillSize); } } diff --git a/src/chart_types/xy_chart/renderer/canvas/primitives/rect.ts b/src/chart_types/xy_chart/renderer/canvas/primitives/rect.ts index 08576e4c5a..0f9caf757a 100644 --- a/src/chart_types/xy_chart/renderer/canvas/primitives/rect.ts +++ b/src/chart_types/xy_chart/renderer/canvas/primitives/rect.ts @@ -19,6 +19,8 @@ import { RGBtoString } from '../../../../../common/color_library_wrappers'; import { Rect, Fill, Stroke } from '../../../../../geoms/types'; +import { withContext } from '../../../../../renderers/canvas'; +import { getRadians } from '../../../../../utils/common'; /** @internal */ export function renderRect( @@ -38,9 +40,32 @@ export function renderRect( const y = rect.y + borderOffset; const width = rect.width - borderOffset * 2; const height = rect.height - borderOffset * 2; + drawRect(ctx, { x, y, width, height }); ctx.fillStyle = RGBtoString(fill.color); ctx.fill(); + + if (fill.texture) { + const { texture } = fill; + withContext(ctx, (ctx) => { + drawRect(ctx, { x, y, width, height }); + ctx.clip(); + + const rotation = getRadians(texture.rotation ?? 0); + const { offset } = texture; + + if (offset && offset.global) ctx.translate(offset?.x ?? 0, offset?.y ?? 0); + if (rotation) ctx.rotate(rotation); + if (offset && !offset.global) ctx.translate(offset?.x ?? 0, offset?.y ?? 0); + + ctx.fillStyle = texture.pattern; + + // Use oversized rect to fill rotation/offset beyond path + const rotationRectFillSize = ctx.canvas.clientWidth * ctx.canvas.clientHeight; + ctx.translate(-rotationRectFillSize / 2, -rotationRectFillSize / 2); + ctx.fillRect(0, 0, rotationRectFillSize, rotationRectFillSize); + }); + } } if (stroke && stroke.width > 0.001) { @@ -74,39 +99,3 @@ function drawRect(ctx: CanvasRenderingContext2D, rect: Rect) { ctx.lineTo(x, y + height); ctx.lineTo(x, y); } - -/** @internal */ -export function renderMultiRect(ctx: CanvasRenderingContext2D, rects: Rect[], fill?: Fill, stroke?: Stroke) { - if (!fill && !stroke && rects.length > 0) { - return; - } - - const rectsLength = rects.length; - ctx.beginPath(); - for (let i = 0; i < rectsLength; i++) { - const { width, height, x, y } = rects[i]; - ctx.moveTo(x, y); - ctx.lineTo(x + width, y); - ctx.lineTo(x + width, y + height); - ctx.lineTo(x, y + height); - ctx.lineTo(x, y); - } - - if (fill) { - ctx.fillStyle = RGBtoString(fill.color); - ctx.fill(); - } - if (stroke && stroke.width > 0.001) { - // Canvas2d stroke ignores an exact zero line width - ctx.strokeStyle = RGBtoString(stroke.color); - ctx.lineWidth = stroke.width; - ctx.stroke(); - - if (stroke.dash) { - ctx.setLineDash(stroke.dash); - } else { - // Setting linecap with dash causes solid line - ctx.lineCap = 'square'; - } - } -} diff --git a/src/chart_types/xy_chart/renderer/canvas/renderers.ts b/src/chart_types/xy_chart/renderer/canvas/renderers.ts index 23a2b953fd..ed6d233b14 100644 --- a/src/chart_types/xy_chart/renderer/canvas/renderers.ts +++ b/src/chart_types/xy_chart/renderer/canvas/renderers.ts @@ -116,7 +116,16 @@ export function renderXYChartCanvas2d( // rendering bars (ctx: CanvasRenderingContext2D) => { withContext(ctx, (ctx) => { - renderBars(ctx, geometries.bars, sharedStyle, clippings, renderingArea, highlightedLegendItem, rotation); + renderBars( + ctx, + imgCanvas, + geometries.bars, + sharedStyle, + clippings, + renderingArea, + highlightedLegendItem, + rotation, + ); }); }, // rendering areas diff --git a/src/chart_types/xy_chart/renderer/canvas/styles/area.ts b/src/chart_types/xy_chart/renderer/canvas/styles/area.ts index 021671b26a..d54334d2c2 100644 --- a/src/chart_types/xy_chart/renderer/canvas/styles/area.ts +++ b/src/chart_types/xy_chart/renderer/canvas/styles/area.ts @@ -39,7 +39,8 @@ export function buildAreaStyles( themeAreaStyle: AreaStyle, geometryStateStyle: GeometryStateStyle, ): Fill { - const fillOpacity: OpacityFn = (opacity) => opacity * themeAreaStyle.opacity * geometryStateStyle.opacity; + const fillOpacity: OpacityFn = (opacity, seriesOpacity = themeAreaStyle.opacity) => + opacity * seriesOpacity * geometryStateStyle.opacity; const texture = getTextureStyles(ctx, imgCanvas, baseColor, fillOpacity, themeAreaStyle.texture); const color = stringToRGB(getColorFromVariant(baseColor, themeAreaStyle.fill), fillOpacity); diff --git a/src/chart_types/xy_chart/renderer/canvas/styles/bar.ts b/src/chart_types/xy_chart/renderer/canvas/styles/bar.ts index 7226cd92fc..e4e697d4c2 100644 --- a/src/chart_types/xy_chart/renderer/canvas/styles/bar.ts +++ b/src/chart_types/xy_chart/renderer/canvas/styles/bar.ts @@ -21,6 +21,7 @@ import { stringToRGB, OpacityFn } from '../../../../../common/color_library_wrap import { Stroke, Fill } from '../../../../../geoms/types'; import { getColorFromVariant } from '../../../../../utils/common'; import { GeometryStateStyle, RectStyle, RectBorderStyle } from '../../../../../utils/themes/theme'; +import { getTextureStyles } from '../../../utils/texture'; /** * Return the rendering styles (stroke and fill) for a bar. @@ -35,15 +36,20 @@ import { GeometryStateStyle, RectStyle, RectBorderStyle } from '../../../../../u * @internal */ export function buildBarStyles( + ctx: CanvasRenderingContext2D, + imgCanvas: HTMLCanvasElement, baseColor: string, themeRectStyle: RectStyle, themeRectBorderStyle: RectBorderStyle, geometryStateStyle: GeometryStateStyle, ): { fill: Fill; stroke: Stroke } { - const fillOpacity: OpacityFn = (opacity) => opacity * themeRectStyle.opacity * geometryStateStyle.opacity; + const fillOpacity: OpacityFn = (opacity, seriesOpacity = themeRectStyle.opacity) => + opacity * seriesOpacity * geometryStateStyle.opacity; + const texture = getTextureStyles(ctx, imgCanvas, baseColor, fillOpacity, themeRectStyle.texture); const fillColor = stringToRGB(getColorFromVariant(baseColor, themeRectStyle.fill), fillOpacity); const fill: Fill = { color: fillColor, + texture, }; const defaultStrokeOpacity = themeRectBorderStyle.strokeOpacity === undefined ? themeRectStyle.opacity : themeRectBorderStyle.strokeOpacity; diff --git a/src/chart_types/xy_chart/utils/texture.ts b/src/chart_types/xy_chart/utils/texture.ts index 194da95329..e5d1b3b122 100644 --- a/src/chart_types/xy_chart/utils/texture.ts +++ b/src/chart_types/xy_chart/utils/texture.ts @@ -49,7 +49,7 @@ function createPattern( ctx: CanvasRenderingContext2D, patternCanvas: HTMLCanvasElement, baseColor: Color | ColorVariant, - getOpacity: OpacityFn, + fillOpacity: OpacityFn, textureStyle?: TexturedStyles, ): CanvasPattern | undefined { const pCtx = patternCanvas.getContext('2d'); @@ -61,7 +61,7 @@ function createPattern( patternCanvas.width = size + spacing.x; patternCanvas.height = size + spacing.y; - pCtx.globalAlpha = opacity ?? getOpacity(1); + pCtx.globalAlpha = opacity ? fillOpacity(opacity, 1) : fillOpacity(1); pCtx.lineWidth = strokeWidth; pCtx.strokeStyle = getColorFromVariant(baseColor, stroke ?? ColorVariant.Series); @@ -91,10 +91,10 @@ export const getTextureStyles = ( ctx: CanvasRenderingContext2D, patternCanvas: HTMLCanvasElement, baseColor: Color | ColorVariant, - getOpacity: OpacityFn, + fillOpacity: OpacityFn, texture?: TexturedStyles, ): Texture | undefined => { - const pattern = createPattern(ctx, patternCanvas, baseColor, getOpacity, texture); + const pattern = createPattern(ctx, patternCanvas, baseColor, fillOpacity, texture); if (!pattern || !texture) return; diff --git a/src/common/color_library_wrappers.ts b/src/common/color_library_wrappers.ts index ca3989be5d..92c5434446 100644 --- a/src/common/color_library_wrappers.ts +++ b/src/common/color_library_wrappers.ts @@ -40,7 +40,7 @@ export const transparentColor: RgbObject = { r: 0, g: 0, b: 0, opacity: 0 }; export const defaultD3Color: D3RGBColor = d3Rgb(defaultColor.r, defaultColor.g, defaultColor.b, defaultColor.opacity); /** @internal */ -export type OpacityFn = (colorOpacity: number) => number; +export type OpacityFn = (opacity: number, seriesOpacity?: number) => number; /** @internal */ export function stringToRGB(cssColorSpecifier?: string, opacity?: number | OpacityFn): RgbObject { diff --git a/src/utils/themes/dark_theme.ts b/src/utils/themes/dark_theme.ts index a209620d3b..79bb60b4b2 100644 --- a/src/utils/themes/dark_theme.ts +++ b/src/utils/themes/dark_theme.ts @@ -80,7 +80,7 @@ export const DARK_THEME: Theme = { }, rectBorder: { visible: false, - strokeWidth: 0, + strokeWidth: 1, }, displayValue: { fontSize: 8, diff --git a/src/utils/themes/light_theme.ts b/src/utils/themes/light_theme.ts index e1e85c5b97..a3a2f73929 100644 --- a/src/utils/themes/light_theme.ts +++ b/src/utils/themes/light_theme.ts @@ -80,7 +80,7 @@ export const LIGHT_THEME: Theme = { }, rectBorder: { visible: false, - strokeWidth: 0, + strokeWidth: 1, }, displayValue: { fontSize: 8, diff --git a/src/utils/themes/theme.ts b/src/utils/themes/theme.ts index c694911091..6d3ba95dbf 100644 --- a/src/utils/themes/theme.ts +++ b/src/utils/themes/theme.ts @@ -465,6 +465,8 @@ export interface RectStyle { /** The ratio of the width limited to [0,1]. If expressed together with `widthPixel` then the `widthRatio` * will express the max available size, where the `widthPixel` express the derived/min width. */ widthRatio?: Ratio; + /** applying textures to the bar on the theme/series */ + texture?: TexturedStyles; } /** @public */ diff --git a/stories/area/area.stories.tsx b/stories/area/area.stories.tsx index f2781da40a..7b16c2dbdc 100644 --- a/stories/area/area.stories.tsx +++ b/stories/area/area.stories.tsx @@ -43,8 +43,6 @@ export { Example as stackedGrouped } from './15_stacked_grouped'; export { Example as withNegativeValues } from './17_negative'; export { Example as withNegativeAndPositive } from './18_negative_positive'; export { Example as withNegativeBand } from './19_negative_band'; -export { Example as withTexture } from './20_with_texture'; -export { Example as textureMultipleSeries } from './21_texture_multiple_series'; export { Example as testLinear } from './11_test_linear'; export { Example as testTime } from './12_test_time'; diff --git a/stories/area/20_with_texture.tsx b/stories/stylings/23_with_texture.tsx similarity index 80% rename from stories/area/20_with_texture.tsx rename to stories/stylings/23_with_texture.tsx index d79002ba49..acc5ec8bd0 100644 --- a/stories/area/20_with_texture.tsx +++ b/stories/stylings/23_with_texture.tsx @@ -22,6 +22,7 @@ import React from 'react'; import { AreaSeries, + BarSeries, Axis, Chart, CurveType, @@ -32,10 +33,14 @@ import { TextureShape, LIGHT_THEME, } from '../../src'; -import { KIBANA_METRICS } from '../../src/utils/data_samples/test_dataset_kibana'; -import { getKnobsFromEnum } from '../utils/knobs'; +import { SeededDataGenerator } from '../../src/mocks/utils'; +import { getKnobsFromEnum, getXYSeriesKnob } from '../utils/knobs'; import { SB_KNOBS_PANEL } from '../utils/storybook'; +const dg = new SeededDataGenerator(); +const barData = dg.generateBasicSeries(4); +const areaData = dg.generateBasicSeries(20, 10); + const group = { texture: 'Texture', pattern: 'Pattern', @@ -61,7 +66,7 @@ const getTextureKnobs = (useCustomPath: boolean): TexturedStyles => ({ dash: array('Stroke dash', [], ',', group.texture).map((n) => parseInt(n, 10)), fill: boolean('Use fill color', true, group.texture) ? color('Fill color', DEFAULT_COLOR, group.texture) : undefined, rotation: number('Rotation (degrees)', 45, { min: -365, max: 365 }, group.pattern), - opacity: number('Opacity', 0.7, { min: 0, max: 1, step: 0.1 }, group.texture), + opacity: number('Opacity', 1, { min: 0, max: 1, step: 0.1 }, group.texture), shapeRotation: number('Shape rotation (degrees)', 0, { min: -365, max: 365 }, group.texture), size: useCustomPath ? number('Shape size - custom path', 20, { min: 0 }, group.texture) @@ -78,13 +83,12 @@ const getTextureKnobs = (useCustomPath: boolean): TexturedStyles => ({ }); export const Example = () => { - const start = KIBANA_METRICS.metrics.kibana_os_load[0].data[0][0]; - const data = KIBANA_METRICS.metrics.kibana_os_load[0].data.slice(0, 20).map((d) => [(d[0] - start) / 30000, d[1]]); const useCustomPath = boolean('Use custom path', false, group.texture); const texture: TexturedStyles = getTextureKnobs(useCustomPath); const opacity = number('Series opacity', 1, { min: 0, max: 1, step: 0.1 }, group.series); const showFill = boolean('Show series fill', false, group.series); const seriesColor = color('Series color', DEFAULT_COLOR, group.series); + const SeriesType = getXYSeriesKnob('Series type', 'area', group.series, { ignore: ['bubble', 'line'] }); return ( @@ -93,33 +97,33 @@ export const Example = () => { areaSeriesStyle: { area: { texture, + opacity, + fill: showFill ? undefined : 'transparent', + }, + }, + barSeriesStyle: { + rect: { + fill: showFill ? undefined : 'transparent', + opacity, + texture, + }, + rectBorder: { + visible: true, + strokeWidth: 2, }, }, }} /> + - Number(d).toFixed(2)} - /> + Number(d).toFixed(2)} /> - diff --git a/stories/area/21_texture_multiple_series.tsx b/stories/stylings/24_texture_multiple_series.tsx similarity index 83% rename from stories/area/21_texture_multiple_series.tsx rename to stories/stylings/24_texture_multiple_series.tsx index e5ac18b819..ab9ab939c5 100644 --- a/stories/area/21_texture_multiple_series.tsx +++ b/stories/stylings/24_texture_multiple_series.tsx @@ -17,26 +17,15 @@ * under the License. */ -import { array, boolean, color, number, button } from '@storybook/addon-knobs'; +import { boolean, color, number, button } from '@storybook/addon-knobs'; import React, { useState } from 'react'; -import { - AreaSeries, - Axis, - Chart, - CurveType, - Position, - ScaleType, - TexturedStyles, - Settings, - TextureShape, -} from '../../src'; +import { Axis, Chart, CurveType, Position, TexturedStyles, Settings, TextureShape } from '../../src'; import { getRandomNumberGenerator, SeededDataGenerator, getRandomEntryFn } from '../../src/mocks/utils'; import { KIBANA_METRICS } from '../../src/utils/data_samples/test_dataset_kibana'; -import { getKnobsFromEnum } from '../utils/knobs'; +import { getKnobsFromEnum, getXYSeriesKnob } from '../utils/knobs'; import { SB_KNOBS_PANEL } from '../utils/storybook'; -const DEFAULT_COLOR = 'black'; const group = { random: 'Randomized parameters', default: 'Default parameters', @@ -117,16 +106,30 @@ export const Example = () => { const [count, setCount] = useState(0); button('Randomize', () => setCount((i) => i + 1), group.random); const n = number('Total series', 4, { min: 0, max: 10, step: 1 }) ?? 2; - const chartColor = color('Chart color', DEFAULT_COLOR); + const showFill = boolean('Show series fill', false); + const chartColor = color('Chart color', '#000'); const random = getRandomKnobs(); + const SeriesType = getXYSeriesKnob('Series type', 'area', undefined, { ignore: ['bubble', 'line'] }); + const texture = getDefaultTextureKnobs(); return ( { /> {new Array(n).fill(0).map((v, i) => ( - { texture: getTexture(random), }, }} + barSeriesStyle={{ + rect: { + texture: getTexture(random), + }, + }} color={chartColor} - xScaleType={ScaleType.Linear} - yScaleType={ScaleType.Linear} stackAccessors={['yes']} data={data[i]} curve={CurveType.CURVE_MONOTONE_X} diff --git a/stories/stylings/stylings.stories.tsx b/stories/stylings/stylings.stories.tsx index de0415db85..9942a0c7e6 100644 --- a/stories/stylings/stylings.stories.tsx +++ b/stories/stylings/stylings.stories.tsx @@ -49,3 +49,5 @@ export { Example as areaSeriesColorVariant } from './19_area_series_color_varian export { Example as partitionBackground } from './20_partition_background'; export { Example as partitionLabels } from './21_partition_labels'; export { Example as darkTheme } from './22_dark_theme'; +export { Example as withTexture } from './23_with_texture'; +export { Example as textureMultipleSeries } from './24_texture_multiple_series'; diff --git a/stories/utils/knobs.ts b/stories/utils/knobs.ts index 4565c0ef60..59485091b9 100644 --- a/stories/utils/knobs.ts +++ b/stories/utils/knobs.ts @@ -22,7 +22,17 @@ import { select, array, number, optionsKnob } from '@storybook/addon-knobs'; import { SelectTypeKnobValue } from '@storybook/addon-knobs/dist/components/types'; import { startCase, kebabCase } from 'lodash'; -import { Rotation, Position, Placement, TooltipProps } from '../../src'; +import { + Rotation, + Position, + Placement, + TooltipProps, + SeriesType, + AreaSeries, + BarSeries, + BubbleSeries, + LineSeries, +} from '../../src'; import { TooltipType } from '../../src/specs/constants'; import { VerticalAlignment, HorizontalAlignment } from '../../src/utils/common'; @@ -257,3 +267,35 @@ export const getHorizontalTextAlignmentKnob = (group?: string) => undefined, group, ) || undefined; + +const seriesTypeMap = { + [SeriesType.Bar]: BarSeries, + [SeriesType.Line]: LineSeries, + [SeriesType.Area]: AreaSeries, + [SeriesType.Bubble]: BubbleSeries, +}; + +export const getXYSeriesTypeKnob = ( + name = 'SeriesType', + value: SeriesType = SeriesType.Bar, + groupId?: string, + options?: { ignore: SeriesType[] }, +) => { + return select( + name, + Object.fromEntries(Object.entries(SeriesType).filter(([, type]) => !(options?.ignore ?? []).includes(type))), + value, + groupId, + ); +}; + +export const getXYSeriesKnob = ( + name = 'SeriesType', + value: SeriesType = SeriesType.Bar, + groupId?: string, + options?: { ignore: SeriesType[] }, +) => { + const spectType = getXYSeriesTypeKnob(name, value, groupId, options); + + return seriesTypeMap[spectType]; +}; From 23b84a375a5d21ea741b5c8f61d5f88767c391ee Mon Sep 17 00:00:00 2001 From: nickofthyme Date: Thu, 27 May 2021 16:32:14 -0500 Subject: [PATCH 09/16] fix: broken bar story --- stories/stylings/24_texture_multiple_series.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/stories/stylings/24_texture_multiple_series.tsx b/stories/stylings/24_texture_multiple_series.tsx index ab9ab939c5..368e8c8185 100644 --- a/stories/stylings/24_texture_multiple_series.tsx +++ b/stories/stylings/24_texture_multiple_series.tsx @@ -125,6 +125,7 @@ export const Example = () => { }, barSeriesStyle: { rect: { + texture, fill: showFill ? undefined : 'transparent', }, rectBorder: { From eb0394b9c13e1ceca803ce64637bcf0c839d7757 Mon Sep 17 00:00:00 2001 From: nickofthyme Date: Fri, 28 May 2021 13:14:59 -0500 Subject: [PATCH 10/16] fix: api ci check --- api/charts.api.md | 46 +++++++++++++++++++ .../xy_chart/renderer/canvas/styles/area.ts | 3 +- src/utils/point.ts | 3 +- src/utils/themes/theme.ts | 9 ++-- 4 files changed, 55 insertions(+), 6 deletions(-) diff --git a/api/charts.api.md b/api/charts.api.md index 55ab927804..26386dc3a5 100644 --- a/api/charts.api.md +++ b/api/charts.api.md @@ -120,6 +120,7 @@ export interface AreaSeriesStyle { export interface AreaStyle { fill?: Color | ColorVariant; opacity: number; + texture?: TexturedStyles; visible: boolean; } @@ -1572,6 +1573,7 @@ export interface RectBorderStyle { export interface RectStyle { fill?: Color | ColorVariant; opacity: number; + texture?: TexturedStyles; widthPixel?: Pixels; widthRatio?: Ratio; } @@ -1951,6 +1953,50 @@ export interface TextStyle { padding: number | SimplePadding; } +// @public (undocumented) +export interface TexturedPathStyles extends TexturedStylesBase { + path: string | Path2D; +} + +// @public (undocumented) +export interface TexturedShapeStyles extends TexturedStylesBase { + shape: TextureShape; +} + +// @public +export type TexturedStyles = TexturedPathStyles | TexturedShapeStyles; + +// @public (undocumented) +export interface TexturedStylesBase { + dash?: number[]; + fill?: Color | ColorVariant; + offset?: Partial & { + global?: boolean; + }; + opacity?: number; + rotation?: number; + shapeRotation?: number; + size?: number; + // Warning: (ae-forgotten-export) The symbol "Point" needs to be exported by the entry point index.d.ts + spacing?: Partial | number; + stroke?: Color | ColorVariant; + strokeWidth?: number; +} + +// @public (undocumented) +export const TextureShape: Readonly<{ + Line: "line"; + Circle: "circle"; + Square: "square"; + Diamond: "diamond"; + Plus: "plus"; + X: "x"; + Triangle: "triangle"; +}>; + +// @public (undocumented) +export type TextureShape = $Values; + // @public (undocumented) export interface Theme { // (undocumented) diff --git a/src/chart_types/xy_chart/renderer/canvas/styles/area.ts b/src/chart_types/xy_chart/renderer/canvas/styles/area.ts index d54334d2c2..66319baa06 100644 --- a/src/chart_types/xy_chart/renderer/canvas/styles/area.ts +++ b/src/chart_types/xy_chart/renderer/canvas/styles/area.ts @@ -17,10 +17,9 @@ * under the License. */ -import { Color, ColorVariant } from '../../../../../../dist'; import { OpacityFn, stringToRGB } from '../../../../../common/color_library_wrappers'; import { Fill } from '../../../../../geoms/types'; -import { getColorFromVariant } from '../../../../../utils/common'; +import { Color, ColorVariant, getColorFromVariant } from '../../../../../utils/common'; import { GeometryStateStyle, AreaStyle } from '../../../../../utils/themes/theme'; import { getTextureStyles } from '../../../utils/texture'; diff --git a/src/utils/point.ts b/src/utils/point.ts index d27cc1c500..0772b7a200 100644 --- a/src/utils/point.ts +++ b/src/utils/point.ts @@ -17,11 +17,12 @@ * under the License. */ -/** @internal */ +/** @public */ export interface Point { x: number; y: number; } + /** @internal * */ export function getDelta(start: Point, end: Point) { return Math.sqrt(Math.pow(end.x - start.x, 2) + Math.pow(end.y - start.y, 2)); diff --git a/src/utils/themes/theme.ts b/src/utils/themes/theme.ts index 6d3ba95dbf..d8761a71e6 100644 --- a/src/utils/themes/theme.ts +++ b/src/utils/themes/theme.ts @@ -378,7 +378,8 @@ export const TextureShape = Object.freeze({ /** @public */ export type TextureShape = $Values; -interface TexturedStylesBase { +/** @public */ +export interface TexturedStylesBase { /** polygon fill color for texture */ fill?: Color | ColorVariant; /** polygon stroke color for texture */ @@ -410,12 +411,14 @@ interface TexturedStylesBase { }; } -interface TexturedShapeStyles extends TexturedStylesBase { +/** @public */ +export interface TexturedShapeStyles extends TexturedStylesBase { /** typed of texture designs currently supported */ shape: TextureShape; } -interface TexturedPathStyles extends TexturedStylesBase { +/** @public */ +export interface TexturedPathStyles extends TexturedStylesBase { /** path for polygon texture */ path: string | Path2D; } From c7011305406158dfaba59bdaa7df916d69029326 Mon Sep 17 00:00:00 2001 From: nickofthyme Date: Fri, 28 May 2021 13:54:45 -0500 Subject: [PATCH 11/16] fix: linting ci check - remove unused imports - refactor knobs to improve data per type - ignore tmp dir from eslint --- .eslintignore | 3 +++ stories/stylings/23_with_texture.tsx | 6 ++---- stories/stylings/24_texture_multiple_series.tsx | 2 +- stories/utils/knobs.ts | 5 +++-- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/.eslintignore b/.eslintignore index 13ca9d8266..f7292e1a66 100644 --- a/.eslintignore +++ b/.eslintignore @@ -16,3 +16,6 @@ license_header.js # Compiled source src/utils/d3-delaunay/* **/dist + +# auto generated directories +integration/tmp diff --git a/stories/stylings/23_with_texture.tsx b/stories/stylings/23_with_texture.tsx index acc5ec8bd0..3fe1c8067b 100644 --- a/stories/stylings/23_with_texture.tsx +++ b/stories/stylings/23_with_texture.tsx @@ -21,8 +21,6 @@ import { array, boolean, color, number, text } from '@storybook/addon-knobs'; import React from 'react'; import { - AreaSeries, - BarSeries, Axis, Chart, CurveType, @@ -88,7 +86,7 @@ export const Example = () => { const opacity = number('Series opacity', 1, { min: 0, max: 1, step: 0.1 }, group.series); const showFill = boolean('Show series fill', false, group.series); const seriesColor = color('Series color', DEFAULT_COLOR, group.series); - const SeriesType = getXYSeriesKnob('Series type', 'area', group.series, { ignore: ['bubble', 'line'] }); + const [SeriesType, seriesType] = getXYSeriesKnob('Series type', 'area', group.series, { ignore: ['bubble', 'line'] }); return ( @@ -123,7 +121,7 @@ export const Example = () => { color={seriesColor} xScaleType={ScaleType.Linear} yScaleType={ScaleType.Linear} - data={barData} + data={seriesType === 'bar' ? barData : areaData} curve={CurveType.CURVE_MONOTONE_X} /> diff --git a/stories/stylings/24_texture_multiple_series.tsx b/stories/stylings/24_texture_multiple_series.tsx index 368e8c8185..b998c16320 100644 --- a/stories/stylings/24_texture_multiple_series.tsx +++ b/stories/stylings/24_texture_multiple_series.tsx @@ -109,7 +109,7 @@ export const Example = () => { const showFill = boolean('Show series fill', false); const chartColor = color('Chart color', '#000'); const random = getRandomKnobs(); - const SeriesType = getXYSeriesKnob('Series type', 'area', undefined, { ignore: ['bubble', 'line'] }); + const [SeriesType] = getXYSeriesKnob('Series type', 'area', undefined, { ignore: ['bubble', 'line'] }); const texture = getDefaultTextureKnobs(); return ( diff --git a/stories/utils/knobs.ts b/stories/utils/knobs.ts index 59485091b9..9967adb529 100644 --- a/stories/utils/knobs.ts +++ b/stories/utils/knobs.ts @@ -21,6 +21,7 @@ import { PopoverAnchorPosition } from '@elastic/eui'; import { select, array, number, optionsKnob } from '@storybook/addon-knobs'; import { SelectTypeKnobValue } from '@storybook/addon-knobs/dist/components/types'; import { startCase, kebabCase } from 'lodash'; +import { $Values } from 'utility-types'; import { Rotation, @@ -294,8 +295,8 @@ export const getXYSeriesKnob = ( value: SeriesType = SeriesType.Bar, groupId?: string, options?: { ignore: SeriesType[] }, -) => { +): [$Values, SeriesType] => { const spectType = getXYSeriesTypeKnob(name, value, groupId, options); - return seriesTypeMap[spectType]; + return [seriesTypeMap[spectType], spectType]; }; From e7a807ecc0ea25333deafa07f33cc704a230396e Mon Sep 17 00:00:00 2001 From: nickofthyme Date: Fri, 28 May 2021 16:30:52 -0500 Subject: [PATCH 12/16] test: fix failing tests, add new texture tests with canvas mocks --- package.json | 1 + .../renderer/canvas/styles/area.test.ts | 36 +++++++++++++++++-- .../renderer/canvas/styles/bar.test.ts | 36 +++++++++++++++++-- .../rendering/rendering.bands.test.ts | 6 ++-- src/mocks/canvas.ts | 31 ++++++++++++++++ src/mocks/index.ts | 1 + src/mocks/series/series_identifiers.ts | 2 ++ src/mocks/theme.ts | 6 ++++ yarn.lock | 34 +++++++++++++----- 9 files changed, 137 insertions(+), 16 deletions(-) create mode 100644 src/mocks/canvas.ts diff --git a/package.json b/package.json index 7abab62381..7681170546 100644 --- a/package.json +++ b/package.json @@ -171,6 +171,7 @@ "html-webpack-plugin": "^4.5.2", "husky": "^4.3.6", "jest": "^26.6.3", + "jest-canvas-mock": "^2.3.1", "jest-extended": "^0.11.5", "jest-image-snapshot": "^4.3.0", "jest-matcher-utils": "^26.6.2", diff --git a/src/chart_types/xy_chart/renderer/canvas/styles/area.test.ts b/src/chart_types/xy_chart/renderer/canvas/styles/area.test.ts index b2558a49ac..75367f1e3b 100644 --- a/src/chart_types/xy_chart/renderer/canvas/styles/area.test.ts +++ b/src/chart_types/xy_chart/renderer/canvas/styles/area.test.ts @@ -19,16 +19,28 @@ import { stringToRGB } from '../../../../../common/color_library_wrappers'; import { Fill } from '../../../../../geoms/types'; -import { MockStyles } from '../../../../../mocks'; +import { getMockCanvas, getMockCanvasContext2D, MockStyles } from '../../../../../mocks'; import * as common from '../../../../../utils/common'; +import { getTextureStyles } from '../../../utils/texture'; import { buildAreaStyles } from './area'; +import 'jest-canvas-mock'; + jest.mock('../../../../../common/color_library_wrappers'); +jest.mock('../../../utils/texture'); jest.spyOn(common, 'getColorFromVariant'); const COLOR = 'aquamarine'; describe('Area styles', () => { + let ctx: CanvasRenderingContext2D; + let imgCanvas: HTMLCanvasElement; + + beforeEach(() => { + ctx = getMockCanvasContext2D(); + imgCanvas = getMockCanvas(); + }); + describe('#buildAreaStyles', () => { let result: Fill; let baseColor = COLOR; @@ -42,7 +54,7 @@ describe('Area styles', () => { } beforeEach(() => { - result = buildAreaStyles(baseColor, themeAreaStyle, geometryStateStyle); + result = buildAreaStyles(ctx, imgCanvas, baseColor, themeAreaStyle, geometryStateStyle); }); it('should call getColorFromVariant with correct args for fill', () => { @@ -84,5 +96,25 @@ describe('Area styles', () => { expect(result.color.opacity).toEqual(expected); }); }); + + describe('Texture', () => { + const texture = {}; + const mockTexture = {}; + + beforeAll(() => { + setDefaults(); + themeAreaStyle = MockStyles.area({ texture }); + (getTextureStyles as jest.Mock).mockReturnValue(mockTexture); + }); + + it('should return correct texture', () => { + expect(result.texture).toEqual(mockTexture); + }); + + it('should call getTextureStyles with params', () => { + expect(getTextureStyles).toBeCalledTimes(1); + expect(getTextureStyles).toBeCalledWith(ctx, imgCanvas, baseColor, expect.anything(), texture); + }); + }); }); }); diff --git a/src/chart_types/xy_chart/renderer/canvas/styles/bar.test.ts b/src/chart_types/xy_chart/renderer/canvas/styles/bar.test.ts index fcef6922b3..07336c6606 100644 --- a/src/chart_types/xy_chart/renderer/canvas/styles/bar.test.ts +++ b/src/chart_types/xy_chart/renderer/canvas/styles/bar.test.ts @@ -19,16 +19,28 @@ import { stringToRGB } from '../../../../../common/color_library_wrappers'; import { Fill, Stroke } from '../../../../../geoms/types'; -import { MockStyles } from '../../../../../mocks'; +import { getMockCanvas, getMockCanvasContext2D, MockStyles } from '../../../../../mocks'; import * as common from '../../../../../utils/common'; +import { getTextureStyles } from '../../../utils/texture'; import { buildBarStyles } from './bar'; +import 'jest-canvas-mock'; + jest.mock('../../../../../common/color_library_wrappers'); +jest.mock('../../../utils/texture'); jest.spyOn(common, 'getColorFromVariant'); const COLOR = 'aquamarine'; describe('Bar styles', () => { + let ctx: CanvasRenderingContext2D; + let imgCanvas: HTMLCanvasElement; + + beforeEach(() => { + ctx = getMockCanvasContext2D(); + imgCanvas = getMockCanvas(); + }); + describe('#buildBarStyles', () => { let result: { fill: Fill; stroke: Stroke }; let baseColor = COLOR; @@ -44,7 +56,7 @@ describe('Bar styles', () => { } beforeEach(() => { - result = buildBarStyles(baseColor, themeRectStyle, themeRectBorderStyle, geometryStateStyle); + result = buildBarStyles(ctx, imgCanvas, baseColor, themeRectStyle, themeRectBorderStyle, geometryStateStyle); }); it('should call getColorFromVariant with correct args for fill', () => { @@ -149,5 +161,25 @@ describe('Bar styles', () => { }); }); }); + + describe('Texture', () => { + const texture = {}; + const mockTexture = {}; + + beforeAll(() => { + setDefaults(); + themeRectStyle = MockStyles.rect({ texture }); + (getTextureStyles as jest.Mock).mockReturnValue(mockTexture); + }); + + it('should return correct texture', () => { + expect(result.fill.texture).toEqual(mockTexture); + }); + + it('should call getTextureStyles with params', () => { + expect(getTextureStyles).toBeCalledTimes(1); + expect(getTextureStyles).toBeCalledWith(ctx, imgCanvas, baseColor, expect.anything(), texture); + }); + }); }); }); diff --git a/src/chart_types/xy_chart/rendering/rendering.bands.test.ts b/src/chart_types/xy_chart/rendering/rendering.bands.test.ts index 1f2e37e32d..630a89928e 100644 --- a/src/chart_types/xy_chart/rendering/rendering.bands.test.ts +++ b/src/chart_types/xy_chart/rendering/rendering.bands.test.ts @@ -353,7 +353,7 @@ describe('Rendering bands - areas', () => { opacity: 1, }, rectBorder: { - strokeWidth: 0, + strokeWidth: 1, visible: false, }, }, @@ -389,7 +389,7 @@ describe('Rendering bands - areas', () => { opacity: 1, }, rectBorder: { - strokeWidth: 0, + strokeWidth: 1, visible: false, }, }, @@ -425,7 +425,7 @@ describe('Rendering bands - areas', () => { opacity: 1, }, rectBorder: { - strokeWidth: 0, + strokeWidth: 1, visible: false, }, }, diff --git a/src/mocks/canvas.ts b/src/mocks/canvas.ts new file mode 100644 index 0000000000..2f57d2b4e5 --- /dev/null +++ b/src/mocks/canvas.ts @@ -0,0 +1,31 @@ +/* + * 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. + */ + +/** @internal */ +export const getMockCanvasContext2D = (): CanvasRenderingContext2D => { + const ctx = document.createElement('canvas').getContext('2d'); + if (ctx) return ctx; + + throw new Error('Unable to create mock context'); +}; + +/** @internal */ +export const getMockCanvas = (): HTMLCanvasElement => { + return document.createElement('canvas'); +}; diff --git a/src/mocks/index.ts b/src/mocks/index.ts index 7f81239f45..df6d39a673 100644 --- a/src/mocks/index.ts +++ b/src/mocks/index.ts @@ -20,3 +20,4 @@ export * from './series'; export * from './geometries'; export * from './theme'; +export * from './canvas'; diff --git a/src/mocks/series/series_identifiers.ts b/src/mocks/series/series_identifiers.ts index bf86d83ba0..d8103aa8d3 100644 --- a/src/mocks/series/series_identifiers.ts +++ b/src/mocks/series/series_identifiers.ts @@ -29,6 +29,8 @@ export class MockSeriesIdentifier { seriesKeys: ['a'], splitAccessors: new Map().set('g', 'a'), key: 'spec{bars}yAccessor{y}splitAccessors{g-a}', + smHorizontalAccessorValue: undefined, + smVerticalAccessorValue: undefined, }; static default(partial?: Partial) { diff --git a/src/mocks/theme.ts b/src/mocks/theme.ts index a35c6ca3f0..56be07cbba 100644 --- a/src/mocks/theme.ts +++ b/src/mocks/theme.ts @@ -55,6 +55,7 @@ export class MockStyles { opacity: 1, }, partial, + { mergeOptionalPartialValues: true }, ); } @@ -67,6 +68,7 @@ export class MockStyles { strokeOpacity: 1, }, partial, + { mergeOptionalPartialValues: true }, ); } @@ -78,6 +80,7 @@ export class MockStyles { opacity: 1, }, partial, + { mergeOptionalPartialValues: true }, ); } @@ -91,6 +94,7 @@ export class MockStyles { dash: [1, 2, 1], }, partial, + { mergeOptionalPartialValues: true }, ); } @@ -105,6 +109,7 @@ export class MockStyles { radius: 10, }, partial, + { mergeOptionalPartialValues: true }, ); } @@ -114,6 +119,7 @@ export class MockStyles { opacity: 1, }, partial, + { mergeOptionalPartialValues: true }, ); } } diff --git a/yarn.lock b/yarn.lock index 61030d0fea..c75f64ba9a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9417,7 +9417,7 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -color-name@^1.0.0, color-name@~1.1.4: +color-name@^1.0.0, color-name@^1.1.4, color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== @@ -10156,6 +10156,11 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== +cssfontparser@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/cssfontparser/-/cssfontparser-1.2.1.tgz#f4022fc8f9700c68029d542084afbaf425a3f3e3" + integrity sha1-9AIvyPlwDGgCnVQghK+69CWj8+M= + csso@^3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/csso/-/csso-3.5.1.tgz#7b9eb8be61628973c1b261e169d2f024008e758b" @@ -11519,7 +11524,8 @@ eslint-module-utils@^2.6.0: pkg-dir "^2.0.0" "eslint-plugin-elastic-charts@link:./packages/eslint-plugin-elastic-charts": - version "1.0.0" + version "0.0.0" + uid "" eslint-plugin-eslint-comments@^3.2.0: version "3.2.0" @@ -14967,6 +14973,14 @@ java-properties@^1.0.0: resolved "https://registry.yarnpkg.com/java-properties/-/java-properties-1.0.2.tgz#ccd1fa73907438a5b5c38982269d0e771fe78211" integrity sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ== +jest-canvas-mock@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/jest-canvas-mock/-/jest-canvas-mock-2.3.1.tgz#9535d14bc18ccf1493be36ac37dd349928387826" + integrity sha512-5FnSZPrX3Q2ZfsbYNE3wqKR3+XorN8qFzDzB5o0golWgt6EOX1+emBnpOc9IAQ+NXFj8Nzm3h7ZdE/9H0ylBcg== + dependencies: + cssfontparser "^1.2.1" + moo-color "^1.0.2" + jest-changed-files@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.6.2.tgz#f6198479e1cc66f22f9ae1e22acaa0b429c042d0" @@ -16150,13 +16164,8 @@ lines-and-columns@^1.1.6: integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= "link-kibana@link:./packages/link_kibana": - version "1.0.0" - dependencies: - chalk "^4.1.1" - change-case "^4.1.2" - glob "^7.1.7" - inquirer "^8.0.0" - ora "^5.4.0" + version "0.0.0" + uid "" lint-staged@^10.5.3: version "10.5.3" @@ -17398,6 +17407,13 @@ monocle-ts@^1.0.0: resolved "https://registry.yarnpkg.com/monocle-ts/-/monocle-ts-1.7.2.tgz#d9825ae18846ab63f915cb6f2194a78a40025610" integrity sha512-F08hPUzQ14vOtac2vOagnvXPr0R0MRKWXF6Bwd3gQ4XnV2qfU0MzPL+L18kX4dXBkat74pxbL88V1BjAj3YOWg== +moo-color@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/moo-color/-/moo-color-1.0.2.tgz#837c40758d2d58763825d1359a84e330531eca64" + integrity sha512-5iXz5n9LWQzx/C2WesGFfpE6RLamzdHwsn3KpfzShwbfIqs7stnoEpaNErf/7+3mbxwZ4s8Foq7I0tPxw7BWHg== + dependencies: + color-name "^1.1.4" + moo@^0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/moo/-/moo-0.4.3.tgz#3f847a26f31cf625a956a87f2b10fbc013bfd10e" From 89c15326844d799b15b27fac84b35e7302bdf6a4 Mon Sep 17 00:00:00 2001 From: nickofthyme Date: Fri, 28 May 2021 17:50:43 -0500 Subject: [PATCH 13/16] test: add vrt test and update broken test --- ...om-theme-visually-looks-correct-1-snap.png | Bin 37720 -> 40707 bytes ...se-theme-visually-looks-correct-1-snap.png | Bin 37720 -> 40707 bytes ...e-series-visually-looks-correct-1-snap.png | Bin 0 -> 97785 bytes ...-texture-visually-looks-correct-1-snap.png | Bin 0 -> 30226 bytes ...ny-random-texture-customization-1-snap.png | Bin 0 -> 139005 bytes ...der-texture-with-lines-as-shape-1-snap.png | Bin 0 -> 49205 bytes ...ure-area-should-use-custom-path-1-snap.png | Bin 0 -> 187699 bytes ...d-use-hover-opacity-for-texture-1-snap.png | Bin 0 -> 95375 bytes ...ny-random-texture-customization-1-snap.png | Bin 0 -> 97977 bytes ...der-texture-with-lines-as-shape-1-snap.png | Bin 0 -> 31549 bytes ...ture-bar-should-use-custom-path-1-snap.png | Bin 0 -> 115499 bytes ...d-use-hover-opacity-for-texture-1-snap.png | Bin 0 -> 53699 bytes integration/tests/stylings_stories.test.ts | 52 ++++++++++++++++++ stories/stylings/23_with_texture.tsx | 2 +- .../stylings/24_texture_multiple_series.tsx | 16 ++---- stories/utils/knobs.ts | 6 +- 16 files changed, 62 insertions(+), 14 deletions(-) create mode 100644 integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-stylings-texture-multiple-series-visually-looks-correct-1-snap.png create mode 100644 integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-stylings-with-texture-visually-looks-correct-1-snap.png create mode 100644 integration/tests/__image_snapshots__/stylings-stories-test-ts-stylings-stories-texture-area-should-allow-any-random-texture-customization-1-snap.png create mode 100644 integration/tests/__image_snapshots__/stylings-stories-test-ts-stylings-stories-texture-area-should-render-texture-with-lines-as-shape-1-snap.png create mode 100644 integration/tests/__image_snapshots__/stylings-stories-test-ts-stylings-stories-texture-area-should-use-custom-path-1-snap.png create mode 100644 integration/tests/__image_snapshots__/stylings-stories-test-ts-stylings-stories-texture-area-should-use-hover-opacity-for-texture-1-snap.png create mode 100644 integration/tests/__image_snapshots__/stylings-stories-test-ts-stylings-stories-texture-bar-should-allow-any-random-texture-customization-1-snap.png create mode 100644 integration/tests/__image_snapshots__/stylings-stories-test-ts-stylings-stories-texture-bar-should-render-texture-with-lines-as-shape-1-snap.png create mode 100644 integration/tests/__image_snapshots__/stylings-stories-test-ts-stylings-stories-texture-bar-should-use-custom-path-1-snap.png create mode 100644 integration/tests/__image_snapshots__/stylings-stories-test-ts-stylings-stories-texture-bar-should-use-hover-opacity-for-texture-1-snap.png create mode 100644 integration/tests/stylings_stories.test.ts diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-stylings-partial-custom-theme-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-stylings-partial-custom-theme-visually-looks-correct-1-snap.png index 55fc9a5a593050f336b5f0e990406ab561eee586..c717e486559efc281dc888da6326b8406bf71d77 100644 GIT binary patch literal 40707 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 literal 37720 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 MLqjc1#mM{r0XKlHPyhe` diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-stylings-partial-custom-theme-with-base-theme-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-stylings-partial-custom-theme-with-base-theme-visually-looks-correct-1-snap.png index 55fc9a5a593050f336b5f0e990406ab561eee586..c717e486559efc281dc888da6326b8406bf71d77 100644 GIT binary patch literal 40707 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 literal 37720 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 MLqjc1#mM{r0XKlHPyhe` diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-stylings-texture-multiple-series-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-stylings-texture-multiple-series-visually-looks-correct-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..47ae395e5eb7260f26279b23f08dd13f6f944412 GIT binary patch literal 97785 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 z zC*qHDm>v7Kp<%8h9Ph`C;ewK(mku2Ui1r|lN`QXctck^WgtpIQ_L~a-l@2)p`Vs3S zQZGbG0j;>OTZ?o3tAjMb%@A^cqpUy;hDD6a&0*+XDOHDz%#~%J)MZp*bP5BmC@SV) z!k{VXFDc*z<2C*ES!`ilQ;T#m1T~VKd9@Q?JCXU38DBPoEezSibtMkh6p91<_}~ZU z-nv^>|13>JID+i_$Fl@QgH?d~{Ww1S;Y{J=7dz&Qh@8T~hx6&;&WeQwm;+{Yc4qDa zibuF|>Jw{dWCUh*vX;`5gkTG1S_yLtGv794gY02x@WoMOAz=VM3bTb(D7?E4bjK7z zj9tD@lx0@fh^P>v56>xU-S8MVpPg~vvf*Xl%dg7!!>-xAdLA#oWvg$ES-|nl4SN3w z=&Gv)sOugRJ=HeFM~C9o7hRD>K#lZsb_O+uhb26bBZ)`r}bxkE&ANLIekj= zQ)}^ntAWa;m`2(ko~x@#o=uSVojk3;GQ)0_E)&@3A z77mOX3kD+F|9i3cO)ZQ`>8tgXN?+#*YmN#tntOc~(zqegl|3F+`{j`QQEFmleck7K ze>pRFW9IP#JGOb;N}W9o@L|>TFc?zxlS|2$sS*#qx;Vp^^{Tv_eX{e<*ICS#53Eh! zVe4qH+yNQZF!x6E`ss{vh-84$y*>XljzIjndh~eJWl>oTr`#Bg1LwK0v>Gh`Q8D*z znBp53e4?9ug-7FX(5d}zvYG?q?D`L!u`_S0{ZjaqJm&63p|;Fv4tbAV$9@md7g#pz z_}%+vjs0C?W2tz;8G#u11;nse+g|AE2;2>f~NUqAA(;{rlD6ANy4M;)KR*AjcDUaJ~-kFby&b2%B+hB*q#* zsNzmj!W_V!8T#oFa^o}a9lQawDEI^OiRAEcQBe(TbPq?E3J2lWZ%3i|HMh3nS$po1 zJNP)xdQ^btU z2<(vVgHM{bXAI-c5F`Q~o*(AaljJ?IaCA@|@I4;pNKpN$mbgnG{%}FpcV0L(mK=#>NO|GJ9BIapq&|0gN5$6Mz!btOj4SLVQ636d(ecvP;@kV$`iv$|=51 zd_CWyM_q_<=G8nM0a`YeBQ`3r7ud;0BMckn++-4&5~u&s&iXr-^`YHLnk|fgduU4I zE`|$duE`|AZ@UfBSnpZ;1A7rX#oWVwuVvwd!v@dDY>FQ6*URH2_Qh#Wp4`>+dBC%k zFjVF59Fn}t8KxqFkXVoWIXiI^-YCLs6`u<5uSZvbBvE^yUpYgUm_ASYaW_O!G`-#XdQ;K-rZKHE-rw12F3QA zn9SySAa)9A$L6*+Qc@C^i_Y>a^=O?f}g=*N;r>*KDo#oF|=+S7l+1mPm6b4<|56%UH69Sv`~tP= z)6tPyl5wQzkfOkqSr&RE4xy6SMm(S8iIKS(PG$Qb*jVrlpB$O+93KZgmlGEA?60-= z1HrR{sY0+6y6u>J-Xy#G?v+#HdThXjy5)O3Wj_}l(-h2tE+frh^-b}I#xL@f|Qb zwX>o!cj4JY4jQu%FaH5F=3Xj9s1%`7dG5QcZC(oW@V2ygNea7u$q7Co&C2Bj5DE|0z!5u=hpj+PUTThG9sSi>|T;;wZPX7h<^<#R}dKI-$rFp^N z1KYfz)z65&vl8Da1amPQjb`*tauo08xtk9)cir6@7cC{gWK|gdW6%t#PkxY&!cBZ% z-|nMgm%bF0Afam`%o3@^%NSByqC5iSH{KmQwud$%kQ~8U2MoSrQ)P|TG;67`e35*RAKd(ldprpLZX2fC{4IVW^kcX+I*&a6=q>`2<5VMPf8(_|r@kMMjJ*sXebo!k0`Aq%BWYU*DTO-dc z{z&xR4v0GV1Q_<2Y4O34C}C&LD5g=?YD?}oCC(OR+^Piv1cMn zlzMmz(+}XKEMawLIEQMEBZ~_8wRy5RUVYF+;ys`;_?>$8!>vqI6)L3dDF?+w(#<>7T*({o5U)-zwW$>ji?o4PL?6d2K;tcVw`r9UQk8xi9 zoU@a&8yOunv))RCob+D6HFFfvLA{0OiLl|HJx^`2B%uv24|e2RyPDuaI>MEk4E987 z42_L>wf-Ei(}~eczLdw{Yl_4edG4yX#%g|9q~o?|ytOcWuAO2t-LKkl^OUFx!=*1y zwF7ogVj_Ouu0M7G+kKa2jPc_ui19$LFXkD`wC5KXio>C&_NwpnA_Ya-2d+gP=EO~A z%F1-tg=((uJFhL7u*&TVPN3b&jx3$Yue@=Ky>G33Oq>=h|{kLcCk?h8Wf`~F^R_&`S)VJz3kGXpciOerv zzC08{QQ3czEztitg@p7UG2_0a;F2T;b2jEqc65h~-%XkntX%e^3x2Cz=Nwoilhi*H zpwzRqI#X!pE<<+HRP!DM-ZoMXI0r7420weGnJmQ2)2FbNDoAc^r3p@bza!h8>x9ns zL*MuhvU_vR4d_SmN^yERGZCF)4cT@&w30p^{*5ARUO3D;9m0p~&Ny}5+z*b^eahE} zNC1)7K<$m{6^X&yvD3m~v$WU25#TSdZ|!BdVPiSe&+2(~pD${791jTo&0H^W^5RZ% z@&rbg8(kzJj%z8q58VSlvh9C z0lmJt`M~o>RY}NCp5U(+-FWbT!QpJI!*4#??+UL6MdgolM=W>BjDlzV$Nf;J0fZ7X zo(dhRd$#&DtK2>E^fv5H&{76CHK%3`6>0hKR)lb8XpI3cL-0yet=W(gPxHwXqF=> z-r?-ilPCS5aV6;rN<6D`;`=&buSKpMUmo>S&SAE`;k5RvRg;qvxDYfvE6pJ1AQ|$@ zmq(G|pej@~*Lt3>$foGDE*Tmgu?=65yFyum?Efk1L*TtgNJ2WAGz6$|!XUAkGZ4iB z#hG;ne-7RNXPfKOD^i{OL4Bw%J8I8}2H*|>5W&9*hSdp;SyFhg(-1iIT@c+%E@zhk zriUGuaF|b>32!I=FeARyx0u(^uHYocs{oNv(|TS|>pU(Hf+Xqlqv>9xBOhB@)GvoqkYj zRz@5U0c^$jQVYPC_rQS%B%=gt_^btuN9zcxK&>Li4@w{2U;s0SNH^l(jeYxhuvp>V z#rzsxPY9UESE&Z&{set(-8t`LZ=I!=N+hRZx&5rxl%?OlZGXJqLVPw()x`()!Ku$? zaUlG9UlZzuU2$%#w|;-^I#vtd|I^|TGlc_D4Hl%mns~@O8?89Yi0g>a+=czM4Cl=< zC_TBDPMx!qj#@WZ&v~uj4p3iT_39=pjq8ISh;Az>+%QU;&1+_$^g&_ORNi^HQ`K#Ag{78yU zFY~R1@->+eDo*IUz)79k?*H`Z4xmGRhL32Ty-jd0-iB@#5(lcvf6ke};E?KM7B}pU zfHCN|vK4m)Abmk}_Y?8;{!x#l@->?D(AdSaOwVa_ssRw*P#UfbQp(LMj=0b4~)rX%YPpL7{Ymn_l zqi`54C1pJlVdxW%wJ8FIg(TEaCuEHWx^IARflTL%ZqPo5Z6Iq@RR_^-(_*GY!&a>z z+SOo$34MX>z+PjLxd`nb^ffl{F=XrPw~)g3=8|`dsPj;Af*8>TS6U(fhs3H#JwVe}^tC)Ze0cDfMOmLMq_qTzyp;DA^-119~VaLw8X&U?;(EYI&Wx zWaK#H<*c9|;$KL!%+AdwVfKC!CeFbfR=9KgH#?f${pNkv75_WcKN+upp{h-Xev zus7p|ww0Tor>C>uq(=t*vAx|JGLaL%4=*_1+-|Y!rm-;X-c)YrxmD%bOXKynK+%zRM!{P3Hhzyx;O?2wvRI3JF|x(%o%_RU86 z@J$BX+m165Kk_6ef4Wp-mZ>Tuyonwpew2XJuN%Qm8kHLkq#sW7sB-R8vDOT@Ntauh ze&*#R8Gg2No9uQ{1cKL4MIAMY2v@dSu94ilYhfhJ|)SIINk^!lXpC=%C9j$xOk173WPNz8N!K9K#tDUHfp+*+g1< zp*;1ND^f;kO$ORq?&zECR&ru+d0ppWv(u#-WnP`fY5W{&qO8hZjl;=OS}&OUc=9KE z_t4AA-bKmULI{YUIfCuOCk0#lSqY>tZ11Y`LCklYm8bv4qxk&9Di^>-ZxhU3)d;-S zkyCTOwv$z;);~ByD!KudO+t>L3k*Fr&f4cRlJW&YE`?5L`HZV2sZ-lk|DP5>8{s8* z)bc5_V%5(#L(~~VVkfpe-y|V7OpGm&Nw30(LJ8W4K7T@)5rrV=8wT8Rl%k*o4#F}} zU0@$i?-ax!ZFd0lG|3Eg{r*1x8clcaV`Mg>^$j5d8*rh$(VbvW5ByoMYe^(7UTR5~ zxbf>M(%z`3Q?OAgEmc4kLooPA4cgAmP6)&hGL<2gTmD(R%mC#|JRc3VGePo90}kFp z>V=b^u)Wao!3s00xdh7^1o+3MCIy*azkcI)Y@?KWNd2OZ>pm7x8nBEa3_OaEi*pKpDs)M>Mz6KZimPyGPjf!v{^&AW&W7 zl3nSLksfwFxi@u^DlOLa9&${kADwN#akf0e z&OMAnOzG)K(!vT@0YwA0-hIeU;H3kx%nn%-w6uDHq9eBQiV_HVJ%<6-W#abO7m+JK z(zmD$NdQ6#I|&sBs1BoeAcu#&qoWCOFtu}=M#k}FUc+&)DTtG`(Z2!oiaOw2!PbaOAnE2$;@xAndGEi_bRZVS8dvzR>NLbkO}-s6JFhxVN=5K3_U1%*5Ccn%_l^%2qnY8Fr|#V`cI^2uayNt#!aML49hFTi~tRG zVu=EtK+#$*@0OvvX=%BZ+z;a4zB0eEysdLLs>TDcng!E!BJtDr*8=57{zHqs15Fqj zc`u-4ChO64;jpcnhlwqI>bnl$`UuU}YtNq%4kHGKFm)o<*Z>rW6Ku(%n0ewA?sf-A zpF+nkgRCy@L!txITh<1=U(bnKOB;ccWWb#d$~@@1nwFpda{LT_xwrE3)D5)A+Mv1x zb9qvlS%GB|-6q5z2%lZKCXG}}ah znvwtpQlaCz!3$c$JTwfV4x{g8la8VZfn**hBo% zNhVkoR;f5M07BQfKS6_0Fl8k`hA|20N3sw7l-X`G7kz5gUS64RVAAu}Uw zoOpcBYI17!^Vr;_ZyM!&MbdJPNHar$NYv1XZ7{nUe!lTuiaq=?dPyao=kPOUl9*s3 zyoeRfHrtx7dU(hPG2-?0K~0?XdeUTK0?{wNY#}b*RLCjg9JUQXF1p-?GGZ#_=Ybck zKh-sD7yGuYJOC?_?2H?eVcEp%`aY;}aD%rZkwVJ4INR4X58GoAm67QoksA9(9++SC zS?&FP$xYr3iVM^_`m*NcZ_XjtCyEjvxOv^r?-v{julHMu{5nM?c1xVcw|vrY$XSOs677&_Ilc5qIE`{{D__V>EQ@n+aw6UU z9>)@Tnw^zXbchW*(Of&U8jy#7>jw%REGnB61%{aYi2w^rvs(?x4KxWAr9Z`4HBIF8 z;H`4{6IT!V4M3bpo-es4(ywHEZMf@ z^x38x{2}dHyt`P(23oRpQqLsdo1Zms*o@-{j-Ssycj}ALft1BE?kLq^L}ica5gIKU zTr9fFG=zLn`6%+Pf=0lZqS;mINrb63^}FAF6gX~rYhJhWujuc?Kph}%`=k4BNnCF( zo=p-D>wnUPQV|Dfb$567nnQd(iA|Qq8M-+-d$)%Rt0=!KTW54&xM~k$|7u$1qiW89 z1s}Yfkw-Cb8AHzSvPJF6$aKGC6Gxz1<&i*BSsqPSv2agt4j@CGi1zEAd$^Yg$vuID zWqE*)9^1IKsxE%=qQ~}!y*nH!GzySFpzfC57Vt#kmb)kclOPctOliyF#72m2aJ+L} z{`-VjzhXb2x!lkbI_M5-zbYMmUFzJXX_e$pC~`Tq`KFi%G;r~q98?l=oYsO)1EUl{198+)}x|8vKQTnN~Jf3Nj8>|lf6 zINr}@7&D`wQf?_fa$YuaT=Vx~_Eww~y}K6=ZF$x5&%YK7E~($ozr7kc*>x#f53s&- zp`n--I{|IIE6f(g>v2*)a5O~`8ql;?~i8#IDc;R)w?b z;r6HD{>&OURiMr+8Mc=i_!+Doj8D`j0NiR|J3uy#w=&x;riHrf-N5|rD+;&j3b+p7 z>f_(M35h@`^L_6Qgh&U0DbS&kbloi`)++)(E=n|^E;n$n@o}2r>uRg((cw?K0 z^9)r&A0JMjYfByOw6 z*83>!WWA%A+*fA`P+Yq4l`a4YL|N3zc0CH#AtCj`mAtU?wRrP1Gc#B{`Je&|`Uon% zeUWALCSFmF`LXIeNdOHYvfu4jSw;p9Np~uVLez*TF=Tr&1K$yW{Rm22cDe`sVwqc; z0XT!|b}bO0_1I1XOCWI0RYCQFqYt!5`~emoAa{6;iT{I;#RfihN?cYg=gse)ytQA<3+HB0Mij?&|U@q zCC;r|bJ}J>%L2s1R}|pc+2w*St*_~Zum&&z0P05O=G|H7?E2~qK<;qrnLSfTlR;sS zKqAGXC`;G=i-#TL33>FF!~4!Owd&FB}`a$Br7s$wr*P;wiT>k?X$(Y_L*+^Rq| zYsdK03#Tizbq-qKG`1i=k8ctT@4L~xErll0+A;$mHE1(@j=sxlf8`y_hD}V`^N|BL z6~zi%0Bb*+;_utwcPv+lyzKf;km*ftdnnBYz=cdQbZaTjN^0mR#D9lh0mR(N`qV1j zcTJ>v!H;7*m>*4T-ym&BQE65BG6mEKNtC|Tr4))vq08ed3@`QRT_&Tp0muLe(Ebcq zH~HbAVT~vfe^2%R?VJDcsE^5d*N_=TmcS<~EBhMAL&su@ZeaYP*?u8nq2pe>;-MaV zs`To|dv{!&!cz@+u<<=MFtAZcrH2BraVP~@78$FLdkSFj z*@Gq>3Y0_d|HJ@|g0sZCDcnsWM{#Vvp3C*!{kK(GU(?sG^)U%R_Q-ewKCoy%4##M} z``QrtRm~ZV5I*%nFPf?m;M$$1ly!p>y72k|dEX;X5AS5% z(n5L3!7|v^H)V6~JfyNnC{Z_@YH&c5MdfBJQDdIkVkvD;f#kKR5z#j9OXi1(lz)Ur zPWhBA1SP$DdJ<9fapHAdOJCki`WpT5aFjPcw_Qc2%vj>%hi4{-^S%jfqJNeUY%Bpw zo>hg0jRQj>z}{i%wzbNnXJ&E8c~Z9<0SDN%<@fU$a0P(49*iP*Q*3P%ml52{*zhmXja3O_MuH6#-2xxrV<=T(_o0^<1Pl;Q7k+mEzQ5)`vkCzD`OC6 zH#Kg!n1b(E-w~{qgkBZkn=Fj9zV7~^2B-t|zjPqbRC}6-a0OHk>($E^C-+K@QOCw5 zJLdm2oxh`2nY`RPG+#7-5G9s{&fn8^<T1^*GK6v2(|M7#yY=49AeeD!QFc(;~pPGWu_;-K{1|U6W z{8OOz!WI|0j0q5z7|eN^Bv6+?^&&MW4sjvT4`3~;=gS~P1%DCZc}0Q)iuvw2*W3el z5kZNwpdlB6BQcT)s4lNm2&gnUfIof{k_w9Q*XTJhKNI8-Krj*f%SBDGF<~wT1j4uX zurnr}bp!r*UtMVCKJ(zNYLYgNRX5B+(nuPssS0_2?H`=&S_lsYja{3yQ?mLO5AvYi z0K9>2iO4T(!KRpra!xES9#+$Hu08X=Bb`x;Vvz$Dy?*{Y{th1;qK}=3FoV=3Cp8-^ zCL|r+bi?~(q@^pYNY;UyvXL1|cc2FN3jBqpVCB|h$D)}opcCm*T%F3&wv`2C3M?Op z^`5xpW+RRkQ}4+j{Yzhj**D(#V|}I?5c<`bC&Lk%3@FZq1r9ViG zm=YA-EJ*8hMPI0|^hzp!pMvZ|wx4aAJM16#N&cGAiTHI#;K!8hqYHmN%M2SW)}6(O zCNR%>ix1%f$pK%+Z%E%?yWeEFj&!bC?P+IzmF$Xh7R@D|mi`+ecKD zm6LmlJXkSqj@|&dq?oV@$i7ZJz>A6V(1{shRHE^A))P> zP?nFok3M{ukpS97o51dyf{yp&AZ36FB2`Iu_x6KZckX|VmYJ|MwYl#x(Pe0e0Ndye zjSzqG@cz|(4A2Q9LiY4rfX|0kCi0)Y58?j)OmKrG-bMO)Gz=cZu@J~n*~B~q4H|+B z%}-Cj^={Z6v*VC%+*7aC!s;S_!@-DejUvjKg6SXY(18W$3oRTSe%h~A@r?~0p#=Gt>*>x$y z?XMs(s4;XU!<@CRH%r9)_DYHwc$&J$xYb%gh(jAJJeln_Ztec2$_S#WPsmQzNGXx=5-qU^N!xt#> z&}##*i-2^E2% z!Hhs0$R|>WR285o#NI%};>Fd2)5@QoT&tP95jhqp14<|89_d2ARz0~fYQGik9(gy(u!h4X$bO;m;X*rrW5IP;gCYa z`IzAfZ5PQ@tSJPpfbkxgh{0Y1BBp84BwJ5XO6tg9J(^TWnQj+^B39YRXdCechd|^C zfJr+y{DTdQ3!bE;s7fY$u;0y3ne2wN21~bW^@hTHZYyJVGlSq}mJNK>a>UUjZLoG8br^dCFkb5%xI_?{5XO+nn}+G^5Vak%vP!k& z`Hu?(m)Vn(i7a>Hhj1tz0k9_I<>^TWAPoaLf`$e5-3+XfC|z|i=>}0zab~+#93hSW zk%Jy}|1pJ;8f91aA;U05r!A_EO$~f3Yo8<~tpQ@6B~0Zzj9M~qqSi>~Ak*Y^PM6dqb7P51-SXcxBTzY8MS zowiFdFd!6HhY&fTS{>sz8ebc9>LbxU4PW> zS*@1Cb{38n+Q3Vb{nvpzI|9#xg z9b&sPW%tg5dQ^u;eUYEY<{-F9xYnQbzR&wu?NPy?b5fCt zqHLyb6Ylc$XuaU(kK5=?14QNxH$T_9fLb%juyL@EPzNFmS;(m!2yU=UaSVN>j@=Hb zvfZE69}*9mq>(ffL;t<8KYFK@nDHBwmJ%E>C)p~8#KgBfSl|Jbe+ZNuIUxvnO1dFw zRs#Y`9y2@y1>B#}i-(96)X+UDG?@{&8eH9VV(Ns;0f&N;oTv>Ui)Dez9A;fRLsb7) z--7G~-3$whjko-XP~2Y!XcrmRxiFW0i+H0c;F+i~5PS8nW5{n6(05MtBsFzC=@W%Z zG2%4*S#i7zg7%vKP2^UHijnS(AZGLuWH-?_eLDxpo5XQ{z(otgCvN$mm8vO-9#lG- zY&apd*!k+r6|GFF+u#LDCg%GHZJcs!Nf(>H53p}J=4c$gp5iS^KgbZIgw>5iV_*ST zkTJ-<_<(7otyAH}f7TFP32J)@d^=E!!e~U;)8iJTmPF*X$PISL+I{Nk3Lpd;EC^8L zL7j5a3AqUI;6o zWpNv9spH3n0QVg`cFYDudM^~$(rhy#)~3I5NRpSQ!;4XAlST|GD%8I8C@cW{fSNjr6d1O}pgCo%0DK^eB13p# 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%0Dp3=p-M%MB0&+jz_I_(p&O75eBLsL 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:Ei*^=&9r*RA4WBT3v4FHoGvsNdAg6g5v5rry(Dh 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 literal 0 HcmV?d00001 diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-stylings-with-texture-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-stylings-with-texture-visually-looks-correct-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..112c8885456c85d0cd685c7c78c556511923d307 GIT binary patch literal 30226 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