First experiment with vega

This commit is contained in:
Ozzie Gooen 2020-08-08 09:06:29 +01:00
parent 59cd9cab8c
commit 69246703c3
9 changed files with 366 additions and 472 deletions

View File

@ -58,7 +58,8 @@
"reason-react": ">=0.7.0", "reason-react": ">=0.7.0",
"reschema": "1.3.0", "reschema": "1.3.0",
"tailwindcss": "1.2.0", "tailwindcss": "1.2.0",
"victory": "^30.3.1" "vega": "5.11.1",
"vega-embed": "6.6.0"
}, },
"devDependencies": { "devDependencies": {
"@glennsl/bs-jest": "^0.5.1", "@glennsl/bs-jest": "^0.5.1",

View File

@ -189,9 +189,13 @@ module DemoDist = {
Ok(`DistPlus(distPlus3)), Ok(`DistPlus(distPlus3)),
) => ) =>
<> <>
<DistPlusPlot distPlus={DistPlus.T.normalize(distPlus1)} /> <PercentilesChart
<DistPlusPlot distPlus={DistPlus.T.normalize(distPlus2)} /> dists=[|
<DistPlusPlot distPlus={DistPlus.T.normalize(distPlus3)} /> (5.0, distPlus1),
(10.0, distPlus2),
(20.0, distPlus3),
|]
/>
</> </>
| (Error(r), _, _) => r |> R.ste | (Error(r), _, _) => r |> R.ste
| _ => "Failure " |> R.ste | _ => "Failure " |> R.ste
@ -217,7 +221,7 @@ let make = () => {
~onSubmit=({state}) => {None}, ~onSubmit=({state}) => {None},
~initialState={ ~initialState={
//guesstimatorString: "mm(normal(-10, 2), uniform(18, 25), lognormal({mean: 10, stdev: 8}), triangular(31,40,50))", //guesstimatorString: "mm(normal(-10, 2), uniform(18, 25), lognormal({mean: 10, stdev: 8}), triangular(31,40,50))",
guesstimatorString: "mm(1, 2, 3, normal(2, 1))", // , triangular(30, 40, 60) guesstimatorString: "foo(t) = mm(normal(5,t));foo", // , triangular(30, 40, 60)
domainType: "Complete", domainType: "Complete",
xPoint: "50.0", xPoint: "50.0",
xPoint2: "60.0", xPoint2: "60.0",
@ -344,40 +348,6 @@ let make = () => {
}; };
<div className=Styles.parent> <div className=Styles.parent>
Victory.(
<VictoryChart
padding={"top": 1, "bottom": 9, "right": 1, "left": 3}
minDomain=0.0
maxDomain=2.0
height=20
width=20>
<VictoryAxis
height=200
scale={"x": "linear", "y": "log"}
style={
"axis": {
"stroke": "#aaa",
},
"tickLabels": {
"fontSize": 7,
"padding": 2,
},
}
/>
<VictoryLine
data=[|
{"x": 0.5, "y": 0.8},
{"x": 0.8, "y": 0.9},
{"x": 0.2, "y": 1.1},
|]
style={
"data": {
"stroke": "#aaa",
},
}
/>
</VictoryChart>
)
<div className=Styles.spacer /> <div className=Styles.spacer />
demoDist demoDist
<div className=Styles.spacer /> <div className=Styles.spacer />

View File

@ -0,0 +1,49 @@
import * as _ from 'lodash';
import React from 'react';
import * as vega from 'vega';
import spec from './spec-percentiles';
export class PercentilesChart extends React.PureComponent {
constructor(props) {
super(props);
this.containerRef = React.createRef();
this.view = null;
this.spec = _.cloneDeep(spec);
this.spec.data[0].values = this.props.data;
}
componentDidMount() {
this.view = new vega.View(vega.parse(this.spec), {
renderer: 'canvas',
container: this.containerRef.current,
hover: true
});
this.view.addEventListener('mouseover', function (name, value) {
console.log("Got event back", name, value)
});
return this.view.runAsync();
}
componentWillUnmount() {
if (this.view) {
this.view.finalize();
}
}
// https://gist.github.com/simonw/7e4b21d0f3cc1d17eaa314fb3f904843
componentDidUpdate() {
console.log("Update", this.props);
var changeset = vega.changeset().remove(() => true).insert(this.props.data);
this.view.change("table", changeset).run()
}
render() {
return React.createElement("div", {
ref: this.containerRef,
});
}
}

View File

@ -0,0 +1,30 @@
[@bs.module "./PercentilesChart.js"]
external percentilesChart: ReasonReact.reactClass = "PercentilesChart";
module Internal = {
[@react.component]
let make = (~data, ~children=ReasonReact.null) =>
ReasonReact.wrapJsForReason(
~reactClass=percentilesChart,
~props={"data": data},
children,
)
|> ReasonReact.element;
};
[@react.component]
let make =
(~dists: array((float, DistTypes.distPlus)), ~children=ReasonReact.null) => {
let data =
dists
|> E.A.fmap(((x, r)) => {
{
"x": x,
"p5": r |> DistPlus.T.Integral.yToX(0.05),
"p50": r |> DistPlus.T.Integral.yToX(0.5),
"p95": r |> DistPlus.T.Integral.yToX(0.95),
}
});
Js.log3("Data", dists, data);
<Internal data />;
};

View File

@ -0,0 +1,11 @@
[@bs.module "./thingy.js"]
external reactClass : ReasonReact.reactClass = "Input";
[@react.component]
let make = (~data=?, ~children=ReasonReact.null) =>
ReasonReact.wrapJsForReason(
~reactClass,
~props={"data": Js.Undefined.fromOption(data)},
children,
)|> ReasonReact.element;

View File

@ -0,0 +1,117 @@
{
"$schema": "https://vega.github.io/schema/vega/v5.json",
"width": 900,
"height": 200,
"padding": 5,
"data": [
{
"name": "facet",
"values": [
{
"x": 1,
"p5": 2,
"p95": 3,
"p50": 2.5
},
{ "x": 2,"p5": 3, "p95": 5, "p50": 4 },
{
"x":3,
"p5": 2,
"p95": 8,
"p50": 5
}
],
"format": { "type": "json", "parse": { "timestamp": "date" } }
},
{
"name": "table",
"source": "facet",
"transform": [
{
"type": "aggregate",
"groupby": ["x"],
"ops": ["mean", "mean", "mean"],
"fields": ["p5", "p95", "p50"],
"as": ["p5", "p95", "p50"]
}
]
}
],
"scales": [
{
"name": "xscale",
"type": "linear",
"nice": true,
"domain": { "data": "facet", "field": "x"},
"range": "width"
},
{
"name": "yscale",
"type": "linear",
"range": "height",
"nice": true,
"zero": true,
"domain": { "data": "facet", "field": "p95" }
}
],
"axes": [
{
"orient": "bottom",
"scale": "xscale",
"grid": false,
"title": "X Value",
"encode": {
"grid": { "enter": { "stroke": { "value": "#ccc" } } },
"ticks": { "enter": { "stroke": { "value": "#ccc" } } }
}
},
{
"orient": "left",
"scale": "yscale",
"title": "Values and Percentiles",
"grid": false,
"domain": false,
"tickSize": 2,
"encode": {
"grid": { "enter": { "stroke": { "value": "#ccc" } } },
"ticks": { "enter": { "stroke": { "value": "#ccc" } } }
}
}
],
"marks": [
{
"type": "area",
"from": { "data": "table" },
"encode": {
"enter": { "fill": { "value": "#C9D6E5" } },
"update": {
"interpolate": { "value": "monotone" },
"x": { "scale": "xscale", "field": "x" },
"y": { "scale": "yscale", "field": "p5" },
"y2": { "scale": "yscale", "field": "p95" },
"opacity": { "value": 0.75 }
},
"hover": { "opacity": { "value": 0.5 } }
}
},
{
"type": "line",
"from": { "data": "table" },
"encode": {
"update": {
"interpolate": { "value": "monotone" },
"stroke": { "value": "#4C78A8" },
"strokeWidth": { "value": 2 },
"opacity": { "value": 0.8 }
},
"hover": { "opacity": { "value": 0.5 } },
"enter": {
"x": { "scale": "xscale", "field": "x" },
"y": { "scale": "yscale", "field": "p50" }
}
}
}
]
}

View File

@ -0,0 +1,11 @@
import React from "react";
export class Input extends React.Component {
constructor(props) {
super(props);
}
render() {
return ( < div > < /div> )
}
}

View File

@ -1,144 +1,144 @@
type victoryData = { // type victoryData = {
. // .
"x": int, // "x": int,
"y": int, // "y": int,
}; // };
module VictoryTheme = { // module VictoryTheme = {
type t; // type t;
[@bs.module "victory-core/es/victory-theme/material"] [@bs.val] // [@bs.module "victory-core/es/victory-theme/material"] [@bs.val]
external material : t = "default"; // external material : t = "default";
[@bs.module "victory-core/es/victory-theme/grayscale"] [@bs.val] // [@bs.module "victory-core/es/victory-theme/grayscale"] [@bs.val]
external grayscale : t = "default"; // external grayscale : t = "default";
}; // };
module VictoryBar = { // module VictoryBar = {
[@bs.module "victory"] // [@bs.module "victory"]
external victoryBar : ReasonReact.reactClass = "VictoryBar"; // external victoryBar : ReasonReact.reactClass = "VictoryBar";
let make = (~data=?, children) => // let make = (~data=?, children) =>
ReasonReact.wrapJsForReason( // ReasonReact.wrapJsForReason(
~reactClass=victoryBar, // ~reactClass=victoryBar,
~props={"data": Js.Undefined.fromOption(data)}, // ~props={"data": Js.Undefined.fromOption(data)},
children, // children,
); // );
}; // };
module VictoryStack = { // module VictoryStack = {
[@bs.module "victory"] // [@bs.module "victory"]
external victoryStack : ReasonReact.reactClass = "VictoryStack"; // external victoryStack : ReasonReact.reactClass = "VictoryStack";
let make = (~colorScale=?, children) => // let make = (~colorScale=?, children) =>
ReasonReact.wrapJsForReason( // ReasonReact.wrapJsForReason(
~reactClass=victoryStack, // ~reactClass=victoryStack,
~props={"colorScale": Js.Undefined.fromOption(colorScale)}, // ~props={"colorScale": Js.Undefined.fromOption(colorScale)},
children, // children,
); // );
}; // };
module VictoryChart = { // module VictoryChart = {
[@bs.module "victory"] // [@bs.module "victory"]
external victoryChart : ReasonReact.reactClass = "VictoryChart"; // external victoryChart : ReasonReact.reactClass = "VictoryChart";
[@react.component] // [@react.component]
let make = // let make =
( // (
~domainPadding=?, // ~domainPadding=?,
~theme: option(VictoryTheme.t)=?, // ~theme: option(VictoryTheme.t)=?,
~scale=?, // ~scale=?,
~maxDomain=?, // ~maxDomain=?,
~minDomain=?, // ~minDomain=?,
~padding=?, // ~padding=?,
~height=?, // ~height=?,
~width=?, // ~width=?,
~children=ReasonReact.null // ~children=ReasonReact.null
) => // ) =>
ReasonReact.wrapJsForReason( // ReasonReact.wrapJsForReason(
~reactClass=victoryChart, // ~reactClass=victoryChart,
~props={ // ~props={
"domainPadding": Js.Undefined.fromOption(domainPadding), // "domainPadding": Js.Undefined.fromOption(domainPadding),
"theme": Js.Undefined.fromOption(theme), // "theme": Js.Undefined.fromOption(theme),
"scale": Js.Undefined.fromOption(scale), // "scale": Js.Undefined.fromOption(scale),
"maxDomain": Js.Undefined.fromOption(maxDomain), // "maxDomain": Js.Undefined.fromOption(maxDomain),
"minDomain": Js.Undefined.fromOption(minDomain), // "minDomain": Js.Undefined.fromOption(minDomain),
"padding": Js.Undefined.fromOption(padding), // "padding": Js.Undefined.fromOption(padding),
"height": Js.Undefined.fromOption(height), // "height": Js.Undefined.fromOption(height),
"width": Js.Undefined.fromOption(width), // "width": Js.Undefined.fromOption(width),
}, // },
children, // children,
) |> ReasonReact.element // ) |> ReasonReact.element
}; // };
module VictoryLine = { // module VictoryLine = {
[@bs.module "victory"] // [@bs.module "victory"]
external victoryLine : ReasonReact.reactClass = "VictoryLine"; // external victoryLine : ReasonReact.reactClass = "VictoryLine";
[@react.component] // [@react.component]
let make = (~data=?, ~style=?, ~children=ReasonReact.null) => // let make = (~data=?, ~style=?, ~children=ReasonReact.null) =>
ReasonReact.wrapJsForReason( // ReasonReact.wrapJsForReason(
~reactClass=victoryLine, // ~reactClass=victoryLine,
~props={ // ~props={
"data": Js.Undefined.fromOption(data), // "data": Js.Undefined.fromOption(data),
"style": Js.Undefined.fromOption(style), // "style": Js.Undefined.fromOption(style),
}, // },
children, // children,
) |> ReasonReact.element // ) |> ReasonReact.element
}; // };
module VictoryAxis = { // module VictoryAxis = {
[@bs.module "victory"] // [@bs.module "victory"]
external victoryAxis : ReasonReact.reactClass = "VictoryAxis"; // external victoryAxis : ReasonReact.reactClass = "VictoryAxis";
[@react.component] // [@react.component]
let make = // let make =
( // (
~tickValues=?, // ~tickValues=?,
~height=?, // ~height=?,
~style=?, // ~style=?,
~scale=?, // ~scale=?,
~tickFormat: option('a => string)=?, // ~tickFormat: option('a => string)=?,
~dependentAxis: option(bool)=?, // ~dependentAxis: option(bool)=?,
~children=ReasonReact.null, // ~children=ReasonReact.null,
) => // ) =>
ReasonReact.wrapJsForReason( // ReasonReact.wrapJsForReason(
~reactClass=victoryAxis, // ~reactClass=victoryAxis,
~props={ // ~props={
"height": Js.Undefined.fromOption(height), // "height": Js.Undefined.fromOption(height),
"tickValues": Js.Undefined.fromOption(tickValues), // "tickValues": Js.Undefined.fromOption(tickValues),
"tickFormat": Js.Undefined.fromOption(tickFormat), // "tickFormat": Js.Undefined.fromOption(tickFormat),
"dependentAxis": Js.Undefined.fromOption(dependentAxis), // "dependentAxis": Js.Undefined.fromOption(dependentAxis),
"style": Js.Undefined.fromOption(style), // "style": Js.Undefined.fromOption(style),
"scale": Js.Undefined.fromOption(scale), // "scale": Js.Undefined.fromOption(scale),
}, // },
children, // children,
) |> ReasonReact.element // ) |> ReasonReact.element
}; // };
module VictoryArea = { // module VictoryArea = {
[@bs.module "victory"] // [@bs.module "victory"]
external victoryArea : ReasonReact.reactClass = "VictoryArea"; // external victoryArea : ReasonReact.reactClass = "VictoryArea";
let make = // let make =
(~animate=?, ~data=?, ~interpolation="linear", ~style=?, children) => // (~animate=?, ~data=?, ~interpolation="linear", ~style=?, children) =>
ReasonReact.wrapJsForReason( // ReasonReact.wrapJsForReason(
~reactClass=victoryArea, // ~reactClass=victoryArea,
~props={ // ~props={
"animate": Js.Undefined.fromOption(animate), // "animate": Js.Undefined.fromOption(animate),
"data": Js.Undefined.fromOption(data), // "data": Js.Undefined.fromOption(data),
"style": Js.Undefined.fromOption(style), // "style": Js.Undefined.fromOption(style),
"interpolation": interpolation, // "interpolation": interpolation,
}, // },
children, // children,
); // );
}; // };
module VictoryScatter = { // module VictoryScatter = {
[@bs.module "victory"] // [@bs.module "victory"]
external victoryScatter : ReasonReact.reactClass = "victoryScatter"; // external victoryScatter : ReasonReact.reactClass = "victoryScatter";
let make = (~data=?, ~style=?, children) => // let make = (~data=?, ~style=?, children) =>
ReasonReact.wrapJsForReason( // ReasonReact.wrapJsForReason(
~reactClass=victoryScatter, // ~reactClass=victoryScatter,
~props={ // ~props={
"data": Js.Undefined.fromOption(data), // "data": Js.Undefined.fromOption(data),
"style": Js.Undefined.fromOption(style), // "style": Js.Undefined.fromOption(style),
}, // },
children, // children,
); // );
}; // };

305
yarn.lock
View File

@ -3382,7 +3382,7 @@ d3-dsv@1, d3-dsv@^1.2.0:
iconv-lite "0.4" iconv-lite "0.4"
rw "1" rw "1"
d3-ease@1, d3-ease@^1.0.0: d3-ease@1:
version "1.0.6" version "1.0.6"
resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-1.0.6.tgz#ebdb6da22dfac0a22222f2d4da06f66c416a0ec0" resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-1.0.6.tgz#ebdb6da22dfac0a22222f2d4da06f66c416a0ec0"
integrity sha512-SZ/lVU7LRXafqp7XtIcBdxnWl8yyLpgOmzAk0mWBI9gXNzLDx5ybZgnRbH9dN/yY5tzVBqCQ9avltSnqVwessQ== integrity sha512-SZ/lVU7LRXafqp7XtIcBdxnWl8yyLpgOmzAk0mWBI9gXNzLDx5ybZgnRbH9dN/yY5tzVBqCQ9avltSnqVwessQ==
@ -3440,7 +3440,7 @@ d3-hierarchy@1, d3-hierarchy@^1.1.9:
resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz#2f6bee24caaea43f8dc37545fa01628559647a83" resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz#2f6bee24caaea43f8dc37545fa01628559647a83"
integrity sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ== integrity sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==
d3-interpolate@1, d3-interpolate@^1.1.1, d3-interpolate@^1.2.0, d3-interpolate@^1.4.0: d3-interpolate@1, d3-interpolate@^1.2.0, d3-interpolate@^1.4.0:
version "1.4.0" version "1.4.0"
resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.4.0.tgz#526e79e2d80daa383f9e0c1c1c7dcc0f0583e987" resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.4.0.tgz#526e79e2d80daa383f9e0c1c1c7dcc0f0583e987"
integrity sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA== integrity sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==
@ -3487,19 +3487,6 @@ d3-scale@2:
d3-time "1" d3-time "1"
d3-time-format "2" d3-time-format "2"
d3-scale@^1.0.0:
version "1.0.7"
resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-1.0.7.tgz#fa90324b3ea8a776422bd0472afab0b252a0945d"
integrity sha512-KvU92czp2/qse5tUfGms6Kjig0AhHOwkzXG0+PqIJB3ke0WUv088AHMZI0OssO9NCkXt4RP8yju9rpH8aGB7Lw==
dependencies:
d3-array "^1.2.0"
d3-collection "1"
d3-color "1"
d3-format "1"
d3-interpolate "1"
d3-time "1"
d3-time-format "2"
d3-scale@^3.2.1: d3-scale@^3.2.1:
version "3.2.1" version "3.2.1"
resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-3.2.1.tgz#da1684adce7261b4bc7a76fe193d887f0e909e69" resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-3.2.1.tgz#da1684adce7261b4bc7a76fe193d887f0e909e69"
@ -3516,7 +3503,7 @@ d3-selection@1, d3-selection@^1.1.0:
resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-1.4.1.tgz#98eedbbe085fbda5bafa2f9e3f3a2f4d7d622a98" resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-1.4.1.tgz#98eedbbe085fbda5bafa2f9e3f3a2f4d7d622a98"
integrity sha512-BTIbRjv/m5rcVTfBs4AMBLKs4x8XaaLkwm28KWu9S2vKNqXkXt2AH2Qf0sdPZHjFxcWg/YL53zcqAz+3g4/7PA== integrity sha512-BTIbRjv/m5rcVTfBs4AMBLKs4x8XaaLkwm28KWu9S2vKNqXkXt2AH2Qf0sdPZHjFxcWg/YL53zcqAz+3g4/7PA==
d3-shape@1, d3-shape@^1.0.0, d3-shape@^1.2.0, d3-shape@^1.3.7: d3-shape@1, d3-shape@^1.3.7:
version "1.3.7" version "1.3.7"
resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.7.tgz#df63801be07bc986bc54f63789b4fe502992b5d7" resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.7.tgz#df63801be07bc986bc54f63789b4fe502992b5d7"
integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw== integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==
@ -3535,7 +3522,7 @@ d3-time@1, d3-time@^1.1.0:
resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-1.1.0.tgz#b1e19d307dae9c900b7e5b25ffc5dcc249a8a0f1" resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-1.1.0.tgz#b1e19d307dae9c900b7e5b25ffc5dcc249a8a0f1"
integrity sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA== integrity sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==
d3-timer@1, d3-timer@^1.0.0, d3-timer@^1.0.10: d3-timer@1, d3-timer@^1.0.10:
version "1.0.10" version "1.0.10"
resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.10.tgz#dfe76b8a91748831b13b6d9c793ffbd508dd9de5" resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.10.tgz#dfe76b8a91748831b13b6d9c793ffbd508dd9de5"
integrity sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw== integrity sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==
@ -3552,7 +3539,7 @@ d3-transition@1:
d3-selection "^1.1.0" d3-selection "^1.1.0"
d3-timer "1" d3-timer "1"
d3-voronoi@1, d3-voronoi@^1.1.2: d3-voronoi@1:
version "1.1.4" version "1.1.4"
resolved "https://registry.yarnpkg.com/d3-voronoi/-/d3-voronoi-1.1.4.tgz#dd3c78d7653d2bb359284ae478645d95944c8297" resolved "https://registry.yarnpkg.com/d3-voronoi/-/d3-voronoi-1.1.4.tgz#dd3c78d7653d2bb359284ae478645d95944c8297"
integrity sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg== integrity sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==
@ -8390,11 +8377,6 @@ react-dom@>=16.8.1, react-dom@^16.8.0:
prop-types "^15.6.2" prop-types "^15.6.2"
scheduler "^0.19.1" scheduler "^0.19.1"
react-fast-compare@^2.0.0:
version "2.0.4"
resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9"
integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==
react-icons-kit@1.3.1: react-icons-kit@1.3.1:
version "1.3.1" version "1.3.1"
resolved "https://registry.yarnpkg.com/react-icons-kit/-/react-icons-kit-1.3.1.tgz#fbe56ce4379fc4391b4c6dfc1aa96e2b31e23623" resolved "https://registry.yarnpkg.com/react-icons-kit/-/react-icons-kit-1.3.1.tgz#fbe56ce4379fc4391b4c6dfc1aa96e2b31e23623"
@ -10451,283 +10433,6 @@ verror@1.10.0:
core-util-is "1.0.2" core-util-is "1.0.2"
extsprintf "^1.2.0" extsprintf "^1.2.0"
victory-area@^30.6.1:
version "30.6.1"
resolved "https://registry.yarnpkg.com/victory-area/-/victory-area-30.6.1.tgz#03f19be259b1da78f9ab5f7c1297b9ef7eccacad"
integrity sha512-Ksu0dnS2Ssiiuv/OH/1XK/a3M2D7to20JUkzVSyvm3m1HvKyvRCK4fDuBI2mXFWaX5iT2gJmqtVj6R22b+NOtg==
dependencies:
d3-shape "^1.2.0"
lodash "^4.17.5"
prop-types "^15.5.8"
victory-core "^30.6.1"
victory-axis@^30.6.1:
version "30.6.1"
resolved "https://registry.yarnpkg.com/victory-axis/-/victory-axis-30.6.1.tgz#d9eae9b31ec8b78ad9f99383b54ab03f3bf7a0b2"
integrity sha512-SJFdMDYOLG9EfPovskomeXvb4VOJnTF//DvXCIcw6Ysy6sMpkwvWfpJVKgh9JAzELirW8OSU775f5BcwZ+z1xg==
dependencies:
lodash "^4.17.5"
prop-types "^15.5.8"
victory-core "^30.6.1"
victory-bar@^30.6.1:
version "30.6.1"
resolved "https://registry.yarnpkg.com/victory-bar/-/victory-bar-30.6.1.tgz#04793a0c83cc77d695f94a92358a14eec5f1d657"
integrity sha512-P9v6OAz9w71+cTvRuRm43jtXV9Ag41bGn2RXf7nUgp1M0GFvaFQGujSILdSVsE8zEdyQLmwUxJRSz+s5b6CeSQ==
dependencies:
d3-shape "^1.2.0"
lodash "^4.17.5"
prop-types "^15.5.8"
victory-core "^30.6.1"
victory-box-plot@^30.6.1:
version "30.6.1"
resolved "https://registry.yarnpkg.com/victory-box-plot/-/victory-box-plot-30.6.1.tgz#d82e726069d891dd0e54fed04bc75f112a212df4"
integrity sha512-2UVGOG+E4Nm0LLQyj3q13oAaE8vChAkrOZryTFFtDLZHVw5pUxDzZtWlgysna82tkJQA4vjlcq2h2lbZw9G1Rw==
dependencies:
d3-array "^1.2.0"
lodash "^4.17.5"
prop-types "^15.5.8"
victory-core "^30.6.1"
victory-brush-container@^30.6.1:
version "30.6.1"
resolved "https://registry.yarnpkg.com/victory-brush-container/-/victory-brush-container-30.6.1.tgz#2db8c4f3d6e6facfafc69285e8cb6a2f94e2499e"
integrity sha512-V76eHU0Mn92DgOjnYJVHT+4skHkACBn2wQROd0E9ZFNqqyTa76U/ISD+4ihjNSqy0HfGdaHTjxcjL83E/EfONw==
dependencies:
lodash "^4.17.5"
prop-types "^15.5.8"
victory-core "^30.6.1"
victory-brush-line@^30.6.1:
version "30.6.1"
resolved "https://registry.yarnpkg.com/victory-brush-line/-/victory-brush-line-30.6.1.tgz#d0cf8c32f55674fda8c1fcd16d548ea4e1119361"
integrity sha512-wOeIIPm8BDNqqDJQFfHe6txJ8JPWNKzHeQ6WTiwntw/IN8oLk4cwnbbW5yhQQC6rOniRFZH5iqb5V+zdCLUCWg==
dependencies:
lodash "^4.17.5"
prop-types "^15.5.8"
victory-core "^30.6.1"
victory-candlestick@^30.6.1:
version "30.6.1"
resolved "https://registry.yarnpkg.com/victory-candlestick/-/victory-candlestick-30.6.1.tgz#14fa5220ce2ee766c721a71eff0ecab80528e6d1"
integrity sha512-cF0/jRU8LY14vBWHugU/5Ei1a+Lcc6u1k4o03m7ujKSsBffvVDnj4CN+nR9jwMMEMUeViBiVpY8HfhzFXVQ5KQ==
dependencies:
lodash "^4.17.5"
prop-types "^15.5.8"
victory-core "^30.6.1"
victory-chart@^30.6.1:
version "30.6.1"
resolved "https://registry.yarnpkg.com/victory-chart/-/victory-chart-30.6.1.tgz#ee74341b6ec14ef7954161296e8f6e9f4e6c851f"
integrity sha512-JHP51QSJweuOQqMMqVim5u/vLKnvD3hjANpJdPPzthTrrmm1IPHAMLkUQ0m0tPiKsAf/5E49jDx4mDz7r6IK7w==
dependencies:
lodash "^4.17.5"
prop-types "^15.5.8"
react-fast-compare "^2.0.0"
victory-axis "^30.6.1"
victory-core "^30.6.1"
victory-polar-axis "^30.6.1"
victory-shared-events "^30.6.1"
victory-core@^30.6.1:
version "30.6.1"
resolved "https://registry.yarnpkg.com/victory-core/-/victory-core-30.6.1.tgz#edb3eb6f8d48dc9953273e7f77fafdedeadf1460"
integrity sha512-oP5gHIVnpcp6I8oHPLDlIHqaEJ3lWMQHjwOTKr/ICsbabdtWBd0D8AByrV0qaXm8vgUmvyBhQqH2UCXb1Zh+jA==
dependencies:
d3-ease "^1.0.0"
d3-interpolate "^1.1.1"
d3-scale "^1.0.0"
d3-shape "^1.2.0"
d3-timer "^1.0.0"
lodash "^4.17.5"
prop-types "^15.5.8"
react-fast-compare "^2.0.0"
victory-create-container@^30.6.1:
version "30.6.1"
resolved "https://registry.yarnpkg.com/victory-create-container/-/victory-create-container-30.6.1.tgz#f24f4f6269e11ef04a5f2d08831a347e5b01ccfc"
integrity sha512-Bm23Yk9xzdO8uCK99G+IFFclWx/vpDLea2vcW2MyHlTT2Iwa1HHW8UAYFfwr6858LYMaOa/Y9UV/YvP+twctoA==
dependencies:
lodash "^4.17.5"
victory-brush-container "^30.6.1"
victory-core "^30.6.1"
victory-cursor-container "^30.6.1"
victory-selection-container "^30.6.1"
victory-voronoi-container "^30.6.1"
victory-zoom-container "^30.6.1"
victory-cursor-container@^30.6.1:
version "30.6.1"
resolved "https://registry.yarnpkg.com/victory-cursor-container/-/victory-cursor-container-30.6.1.tgz#054ba4a9caf3b32a4b467d77a9c0b0410f54a06e"
integrity sha512-XjmLUdQWEiv8F+AwfpVvi3kETJz7OCWlpkypbiIJjLvYM8lUeT84boOftMfyw+HRjUAxPQFh1D7yBUvAqrwKiA==
dependencies:
lodash "^4.17.5"
prop-types "^15.5.8"
victory-core "^30.6.1"
victory-errorbar@^30.6.1:
version "30.6.1"
resolved "https://registry.yarnpkg.com/victory-errorbar/-/victory-errorbar-30.6.1.tgz#bee14bf0c0853ad841454ec060b290f7588dd7a2"
integrity sha512-SBowNqH5MBh1GoqA3UF5YVsFB0h0o60IkR5Yjhe/uaGhwyZVAu5X9+BE0CXRq0uDLhOX9GDvqDs59hAe0D3xiw==
dependencies:
lodash "^4.17.5"
prop-types "^15.5.8"
victory-core "^30.6.1"
victory-group@^30.6.1:
version "30.6.1"
resolved "https://registry.yarnpkg.com/victory-group/-/victory-group-30.6.1.tgz#59a55858750a3f880860ebe64faf0b21575f3da4"
integrity sha512-fGt6/+GgsBqFiuzVdzQHRc2joYEDL9Bo2wE8rCH5HAUnj/oI6drKi8euooUpBOIhbOQeycCj7r6BXJvp8H9CfQ==
dependencies:
lodash "^4.17.5"
prop-types "^15.5.8"
victory-core "^30.6.1"
victory-legend@^30.6.1:
version "30.6.1"
resolved "https://registry.yarnpkg.com/victory-legend/-/victory-legend-30.6.1.tgz#9f411b07915f058ed17b061e274c622b426e4c08"
integrity sha512-iadVJSaj+mhT9Crx2eYMF39qTyvn03B5p44OjeLqKcvb0MDElVDsXyYHTwsUgnE4i+YPOFz9+buMaw2UWXU0NA==
dependencies:
lodash "^4.17.5"
prop-types "^15.5.8"
victory-core "^30.6.1"
victory-line@^30.6.1:
version "30.6.1"
resolved "https://registry.yarnpkg.com/victory-line/-/victory-line-30.6.1.tgz#ce43f4d68b0faea28025881580b6b3914b427950"
integrity sha512-JmL17SK4bLkhQEelDoj6QK9KLF8o5uW0aNNxdhSqluFxROLtuixUzvffEYlN0weHCkIR6f/o2PqbujLVtoxOOg==
dependencies:
d3-shape "^1.2.0"
lodash "^4.17.5"
prop-types "^15.5.8"
victory-core "^30.6.1"
victory-pie@^30.6.1:
version "30.6.1"
resolved "https://registry.yarnpkg.com/victory-pie/-/victory-pie-30.6.1.tgz#f791286fb9e57b5e575ec51ea5b4275a4aa7d68d"
integrity sha512-03jIWh/+17j7FX21KSNWSglhb50DqJQ9Jy5+nVAEcTlhIiI3bffuDd9IvoCfXMMwDmoRvaRq1xtXSElq4jZYpw==
dependencies:
d3-shape "^1.0.0"
lodash "^4.17.5"
prop-types "^15.5.8"
victory-core "^30.6.1"
victory-polar-axis@^30.6.1:
version "30.6.1"
resolved "https://registry.yarnpkg.com/victory-polar-axis/-/victory-polar-axis-30.6.1.tgz#a8b13e9210627abe70605bf7d8e11d34d66cf632"
integrity sha512-OQIAKURdTdmOk/rXr+DNeE9xoROEOqmAdanTYXdpeazbYiClSbhcbIypK0Z7qyGziIV8D8W4r4at/mAMA9AkXQ==
dependencies:
lodash "^4.17.5"
prop-types "^15.5.8"
victory-core "^30.6.1"
victory-scatter@^30.6.1:
version "30.6.1"
resolved "https://registry.yarnpkg.com/victory-scatter/-/victory-scatter-30.6.1.tgz#96797fefff3d31ede944e95ac51682846705a1a8"
integrity sha512-UsIne7V/LruhkA5r+BqUa4MNuMGSgOgPyklOOyKur1jrYm83kE3t0T7ObiTrFBLsL7SqVnmxARXW66Lv2GWE+g==
dependencies:
lodash "^4.17.5"
prop-types "^15.5.8"
victory-core "^30.6.1"
victory-selection-container@^30.6.1:
version "30.6.1"
resolved "https://registry.yarnpkg.com/victory-selection-container/-/victory-selection-container-30.6.1.tgz#627148c84ae43472682c9f135487035cbdadf6d4"
integrity sha512-ihv1aGOwu3IX/v94IRawMAlWRMlt/BogrU28FXhhVMdqXemPFkq3J9COq0khGhh+wuqtC1tu9Ni7uw4YA3fdZg==
dependencies:
lodash "^4.17.5"
prop-types "^15.5.8"
victory-core "^30.6.1"
victory-shared-events@^30.6.1:
version "30.6.1"
resolved "https://registry.yarnpkg.com/victory-shared-events/-/victory-shared-events-30.6.1.tgz#788e6c45a752c521a3f067675b9b9196fcee552c"
integrity sha512-4zQ6gfkrQVNtx+bUv+kgNNtVX5Mr6T68Hs2xV4H0f3FrToyFrsXtANGFhAzgmi+00Mk06FVIAIY94tZW3Cej1Q==
dependencies:
lodash "^4.17.5"
prop-types "^15.5.8"
victory-core "^30.6.1"
victory-stack@^30.6.1:
version "30.6.1"
resolved "https://registry.yarnpkg.com/victory-stack/-/victory-stack-30.6.1.tgz#873be79c492f0d7ed02ad03bd82e592d6f778ea8"
integrity sha512-WJk9FIe/GuqXaZsB+vZSTbgIyg53I6cwCtyMvh4Jj3iFWHuRmpVaT7vwJ46/I2WOKLvQWyd0EY380kby5PNUVg==
dependencies:
lodash "^4.17.5"
prop-types "^15.5.8"
victory-core "^30.6.1"
victory-tooltip@^30.6.1:
version "30.6.1"
resolved "https://registry.yarnpkg.com/victory-tooltip/-/victory-tooltip-30.6.1.tgz#234e23954c9b4543cee22ac45f9b91325207fe42"
integrity sha512-Mezqycvoxms6ON6ftBKU8TpB8Ggsiy+1gJREeOt83TfvrIp8DKher33kj83ofD853rPcmRJeMNAz57I1mpXtHA==
dependencies:
lodash "^4.17.5"
prop-types "^15.5.8"
victory-core "^30.6.1"
victory-voronoi-container@^30.6.1:
version "30.6.1"
resolved "https://registry.yarnpkg.com/victory-voronoi-container/-/victory-voronoi-container-30.6.1.tgz#58a16af999e0c6ff528905aec812c2fdd5b93dff"
integrity sha512-rHT7rgYLuetgi67CFyM8N3AgomzNi1/tjjUKC2SmD2qq8bBysVXlyzTh2Zx4aTLVX59XNNGAaLxPjUjkZWYY2g==
dependencies:
d3-voronoi "^1.1.2"
lodash "^4.17.5"
prop-types "^15.5.8"
victory-core "^30.6.1"
victory-tooltip "^30.6.1"
victory-voronoi@^30.6.1:
version "30.6.1"
resolved "https://registry.yarnpkg.com/victory-voronoi/-/victory-voronoi-30.6.1.tgz#d3de9db4997778f2f8acd0427bab14898e137b9e"
integrity sha512-bxzYmGROFYtpP3EmmcKwHMDAvpIVNYK+7LNOuYwu0z/IHBT//K2EplWAV90IYIvTdKVT75lgqiYsFOWY78L2yw==
dependencies:
d3-voronoi "^1.1.2"
lodash "^4.17.5"
prop-types "^15.5.8"
victory-core "^30.6.1"
victory-zoom-container@^30.6.1:
version "30.6.1"
resolved "https://registry.yarnpkg.com/victory-zoom-container/-/victory-zoom-container-30.6.1.tgz#41ee41e4168f311375508d2ed1b8581f2b437bb6"
integrity sha512-F/b2l6LJjkR1OF+ioU49yGDW0rJJusKqrOFtcSDbnyeSwKkQGkgJ0T+Nv/TN5jSBdC3Wb/kKtwqHRYCrxtt3Zg==
dependencies:
lodash "^4.17.5"
prop-types "^15.5.8"
victory-core "^30.6.1"
victory@^30.3.1:
version "30.6.1"
resolved "https://registry.yarnpkg.com/victory/-/victory-30.6.1.tgz#607a0ca643bf4f4a32a08a4a4e1a84d601611159"
integrity sha512-VJAFvZz4s6qT3KhDKLv9qMKtSwLjbRZiuK917KrfomTLYcjMgrA1FckW/8nIn1URwNdkawe4YvgAE0wdtbDO3A==
dependencies:
victory-area "^30.6.1"
victory-axis "^30.6.1"
victory-bar "^30.6.1"
victory-box-plot "^30.6.1"
victory-brush-container "^30.6.1"
victory-brush-line "^30.6.1"
victory-candlestick "^30.6.1"
victory-chart "^30.6.1"
victory-core "^30.6.1"
victory-create-container "^30.6.1"
victory-cursor-container "^30.6.1"
victory-errorbar "^30.6.1"
victory-group "^30.6.1"
victory-legend "^30.6.1"
victory-line "^30.6.1"
victory-pie "^30.6.1"
victory-polar-axis "^30.6.1"
victory-scatter "^30.6.1"
victory-selection-container "^30.6.1"
victory-shared-events "^30.6.1"
victory-stack "^30.6.1"
victory-tooltip "^30.6.1"
victory-voronoi "^30.6.1"
victory-voronoi-container "^30.6.1"
victory-zoom-container "^30.6.1"
vlq@^0.2.2: vlq@^0.2.2:
version "0.2.3" version "0.2.3"
resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26" resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26"