Editable inputs

Finish editable inputs


typo
This commit is contained in:
dapplion 2019-08-01 22:51:21 +02:00
parent 9ff526dcd8
commit 2a74df0332
4 changed files with 371 additions and 118 deletions

View File

@ -1,12 +1,16 @@
{
"name": "augmented-tbc-design",
"version": "0.1.0",
"homepage": "https://dapplion.github.io/augmented-tbc-design",
"dependencies": {
"@material-ui/core": "latest",
"@types/lodash": "^4.14.136",
"@types/react": "latest",
"@types/react-dom": "latest",
"lodash": "^4.17.15",
"react": "latest",
"react-dom": "latest",
"react-number-format": "^4.0.8",
"react-scripts": "latest",
"recharts": "^1.6.2",
"typescript": "latest"
@ -15,6 +19,8 @@
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"predeploy": "npm run build",
"deploy": "gh-pages -d build",
"eject": "react-scripts eject"
},
"browserslist": {
@ -30,6 +36,7 @@
]
},
"devDependencies": {
"@types/recharts": "^1.1.20"
"@types/recharts": "^1.1.20",
"gh-pages": "^2.0.1"
}
}

View File

@ -1,4 +1,4 @@
import React, { useState, useEffect } from "react";
import React, { useState, useEffect, useMemo } from "react";
// Material UI
import { createStyles, makeStyles, Theme } from "@material-ui/core/styles";
import Container from "@material-ui/core/Container";
@ -16,6 +16,7 @@ import ResultParams from "./ResultParams";
import PriceSimulationChart from "./PriceSimulationChart";
// Utils
import { getLast, getAvg, pause } from "./utils";
import { throttle } from "lodash";
// General styles
import "./app.css";
@ -73,11 +74,24 @@ const useStyles = makeStyles((theme: Theme) =>
);
export default function App() {
const [d0, setD0] = useState(1e6); // Initial raise, d0 (DAI)
const [theta, setTheta] = useState(0.35); // fraction allocated to reserve (.)
const [p0, setP0] = useState(0.1); // Hatch sale Price p0 (DAI / token)
const [returnF, setReturnF] = useState(3); // Return factor (.)
const [wFee, setWFee] = useState(0.05); // friction coefficient (.)
const [curveParams, setCurveParams] = useState({
d0: 1e6, // Initial raise, d0 (DAI)
theta: 0.35, // fraction allocated to reserve (.)
p0: 0.1, // Hatch sale Price p0 (DAI / token)
returnF: 3, // Return factor (.)
wFee: 0.05 // friction coefficient (.)
});
const { d0, theta, p0, returnF, wFee } = curveParams;
/**
* Throttle the curve update to prevent the expensive chart
* to re-render too often
*/
const setCurveParamsThrottle = useMemo(
() => throttle(setCurveParams, 500),
[]
);
// Simulation results
const k = returnF / (1 - theta); // Invariant power kappa (.)
@ -198,62 +212,6 @@ export default function App() {
};
}, [simulationActive]);
const inputFields: {
label: string;
value: number;
setter(newValue: any): void;
min: number;
max: number;
step: number;
display(value: number): string;
}[] = [
{
label: "Initial raise",
value: d0,
setter: setD0,
min: 0.1e6,
max: 10e6,
step: 0.1e6,
display: (n: number) => `$${+(n * 1e-6).toFixed(1)}M`
},
{
label: "Allocation to the project",
value: theta,
setter: setTheta,
min: 0,
max: 0.9,
step: 0.01,
display: (n: number) => `${Math.round(100 * n)}%`
},
{
label: "Initial token price",
value: p0,
setter: setP0,
min: 0.01,
max: 1,
step: 0.01,
display: (n: number) => `$${n}`
},
{
label: "Return factor",
value: returnF,
setter: setReturnF,
min: 1,
max: 10,
step: 0.1,
display: (n: number) => `${n}x`
},
{
label: "Withdrawl fee",
value: wFee,
setter: setWFee,
min: 0,
max: 0.1,
step: 0.001,
display: (n: number) => `${+(100 * n).toFixed(1)}%`
}
];
const resultFields = [
{
label: `Average slippage (avg tx size ${avgTxSize} DAI)`,
@ -306,7 +264,7 @@ export default function App() {
{simulationActive ? (
<ResultParams resultFields={resultFields} />
) : (
<InputParams inputFields={inputFields} />
<InputParams setCurveParams={setCurveParamsThrottle} />
)}
</Box>
</Paper>
@ -315,22 +273,7 @@ export default function App() {
<Grid item xs={12} md={6}>
<Paper className={classes.paper}>
<Box className={classes.boxHeader}>
<Grid
container
direction="row"
justify="space-between"
alignItems="center"
>
<Typography variant="h6">Preview</Typography>
<Button
variant="contained"
className={classes.button}
onClick={startSimulation}
disabled={simulationRunning}
>
Run simulation
</Button>
</Grid>
<Typography variant="h6">Preview</Typography>
</Box>
<Box className={classes.boxChart}>
@ -352,6 +295,30 @@ export default function App() {
</Paper>
</Grid>
</Grid>
<Grid container spacing={3}>
<Grid item xs={12} md={12}>
<Paper>
<Box className={classes.boxHeader}>
<Grid
container
direction="row"
justify="center"
alignItems="center"
>
<Button
variant="contained"
className={classes.button}
onClick={startSimulation}
disabled={simulationRunning}
>
Run simulation
</Button>
</Grid>
</Box>
</Paper>
</Grid>
</Grid>
</Container>
</>
);

View File

@ -1,4 +1,4 @@
import React from "react";
import React, { useState, useEffect, useMemo } from "react";
import {
createStyles,
makeStyles,
@ -8,6 +8,11 @@ import {
import Typography from "@material-ui/core/Typography";
import Slider from "@material-ui/core/Slider";
import Grid from "@material-ui/core/Grid";
import TextField from "@material-ui/core/TextField";
import InputLabel from "@material-ui/core/InputLabel";
import InputAdornment from "@material-ui/core/InputAdornment";
import NumberFormat from "react-number-format";
import { throttle } from "lodash";
const grayColor = "#90a4ae";
const blackColor = "#141e27";
@ -86,54 +91,201 @@ const useStyles = makeStyles((theme: Theme) =>
})
);
function NumberFormatCustom(props: any) {
const { inputRef, onChange, prefix, suffix, ...other } = props;
return (
<NumberFormat
{...other}
getInputRef={inputRef}
onValueChange={values => {
onChange({ target: { value: values.value } });
}}
thousandSeparator
prefix={prefix}
suffix={suffix}
/>
);
}
export default function InputParams({
inputFields
curveParams,
setCurveParams
}: {
inputFields: {
curveParams?: {
d0: number;
theta: number;
p0: number;
returnF: number;
wFee: number;
};
setCurveParams(newCurveParams: any): void;
}) {
const [d0, setD0] = useState(1e6); // Initial raise, d0 (DAI)
const [theta, setTheta] = useState(0.35); // fraction allocated to reserve (.)
const [p0, setP0] = useState(0.1); // Hatch sale Price p0 (DAI / token)
const [returnF, setReturnF] = useState(3); // Return factor (.)
const [wFee, setWFee] = useState(0.05); // friction coefficient (.)
function setParentCurveParams() {
setCurveParams({ d0, theta, p0, returnF, wFee });
}
const inputFields: {
label: string;
value: number;
setter(newValue: any): void;
min: number;
max: number;
step: number;
display(value: number): string;
}[];
}) {
unit?: string;
prefix?: string;
suffix?: string;
toText?(value: number): string;
toNum?(value: string): number;
format(value: number): string;
}[] = [
{
label: "Initial raise",
value: d0,
setter: setD0,
min: 0.1e6,
max: 10e6,
step: 0.1e6,
unit: "$M",
prefix: "$",
suffix: "M",
format: (n: number) => `$${+(n * 1e-6).toFixed(1)}M`,
toText: (n: number) => String(+(n * 1e-6).toFixed(1)),
toNum: (n: string) => Math.floor(parseFloat(n) * 1e6)
},
{
label: "Allocation to the project",
value: theta,
setter: setTheta,
min: 0,
max: 0.9,
step: 0.01,
unit: "%",
suffix: "%",
format: (n: number) => `${Math.round(100 * n)}%`,
toText: (n: number) => String(+(n * 1e2).toFixed(0)),
toNum: (n: string) => parseFloat(n) * 1e-2
},
{
label: "Initial token price",
value: p0,
setter: setP0,
min: 0.01,
max: 1,
step: 0.01,
unit: "$",
prefix: "$",
format: (n: number) => `$${n}`
},
{
label: "Return factor",
value: returnF,
setter: setReturnF,
min: 1,
max: 10,
step: 0.1,
unit: "x",
suffix: "x",
format: (n: number) => `${n}x`
},
{
label: "Withdrawl fee",
value: wFee,
setter: setWFee,
min: 0,
max: 0.1,
step: 0.001,
unit: "%",
suffix: "%",
format: (n: number) => `${+(100 * n).toFixed(1)}%`,
toText: (n: number) => String(+(n * 1e2).toFixed(1)),
toNum: (n: string) => parseFloat(n) * 1e-2
}
];
const classes = useStyles();
return (
<div className={classes.listBoxContainer}>
{inputFields.map(({ label, value, setter, min, max, step, display }) => (
<Grid key={label} container spacing={0} className={classes.listBox}>
<Grid item xs={6} className={classes.leftContainer}>
<Typography id={label} gutterBottom>
{label}
</Typography>
</Grid>
{inputFields.map(
({
label,
value,
setter,
min,
max,
step,
prefix,
suffix,
format,
toText,
toNum
}) => {
function sanitizeInput(num: number = 0) {
if (isNaN(num)) num = 0;
if (num > max) num = max;
else if (num < min) num = min;
setter(num);
}
<Grid item xs={2} className={classes.centerContainer}>
<Typography gutterBottom>{display(value)}</Typography>
</Grid>
return (
<Grid key={label} container spacing={0} className={classes.listBox}>
<Grid item xs={6} className={classes.leftContainer}>
<Typography id={label} gutterBottom>
{label}
</Typography>
</Grid>
<Grid item xs={4}>
<PrettoSlider
valueLabelDisplay="auto"
aria-label={label}
defaultValue={value}
onChange={(_, newValue) => setter(Number(newValue))}
min={min}
max={max}
step={step}
valueLabelFormat={value => display(value).replace("$", "")}
// marks={[
// { value: 0, label: "0%" },
// { value: 50, label: "50%" },
// { value: 100, label: "100%" }
// ]}
/>
</Grid>
</Grid>
))}
<Grid item xs={2} className={classes.centerContainer}>
{/* <Typography gutterBottom>{display(value)}</Typography> */}
<TextField
onChange={e => {
sanitizeInput(
toNum ? toNum(e.target.value) : parseFloat(e.target.value)
);
setParentCurveParams();
}}
InputProps={{
inputComponent: NumberFormatCustom,
disableUnderline: true,
inputProps: {
prefix,
suffix
}
}}
value={toText ? toText(value) : value}
/>
</Grid>
<Grid item xs={4}>
<PrettoSlider
valueLabelDisplay="auto"
aria-label={label}
defaultValue={value}
onChange={(_, newValue) => sanitizeInput(Number(newValue))}
onChangeCommitted={setParentCurveParams}
value={value}
min={min}
max={max}
step={step}
valueLabelFormat={value => format(value).replace("$", "")}
// marks={[
// { value: 0, label: "0%" },
// { value: 50, label: "50%" },
// { value: 100, label: "100%" }
// ]}
/>
</Grid>
</Grid>
);
}
)}
</div>
);
}

133
yarn.lock
View File

@ -1380,6 +1380,11 @@
"@types/istanbul-lib-coverage" "*"
"@types/istanbul-lib-report" "*"
"@types/lodash@^4.14.136":
version "4.14.136"
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.136.tgz#413e85089046b865d960c9ff1d400e04c31ab60f"
integrity sha512-0GJhzBdvsW2RUccNHOBkabI8HZVdOXmXbXhuKlDEd5Vv12P7oAVGfomGp3Ne21o5D/qu1WmthlNKFaoZJJeErA==
"@types/prop-types@*":
version "15.7.1"
resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.1.tgz#f1a11e7babb0c3cad68100be381d1e064c68f1f6"
@ -1922,6 +1927,13 @@ async@^1.5.2:
resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=
async@^2.6.1:
version "2.6.3"
resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff"
integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==
dependencies:
lodash "^4.17.14"
asynckit@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
@ -2702,7 +2714,7 @@ commander@2.17.x:
resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf"
integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==
commander@^2.11.0, commander@^2.19.0, commander@^2.20.0, commander@~2.20.0:
commander@^2.11.0, commander@^2.18.0, commander@^2.19.0, commander@^2.20.0, commander@~2.20.0:
version "2.20.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422"
integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==
@ -3607,6 +3619,11 @@ elliptic@^6.0.0:
minimalistic-assert "^1.0.0"
minimalistic-crypto-utils "^1.0.0"
email-addresses@^3.0.1:
version "3.0.3"
resolved "https://registry.yarnpkg.com/email-addresses/-/email-addresses-3.0.3.tgz#fc3c6952f68da24239914e982c8a7783bc2ed96d"
integrity sha512-kUlSC06PVvvjlMRpNIl3kR1NRXLEe86VQ7N0bQeaCZb2g+InShCeHQp/JvyYNTugMnRN2NvJhHlc3q12MWbbpg==
emoji-regex@^7.0.1, emoji-regex@^7.0.2:
version "7.0.3"
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
@ -4144,6 +4161,28 @@ file-loader@3.0.1:
loader-utils "^1.0.2"
schema-utils "^1.0.0"
filename-reserved-regex@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz#e61cf805f0de1c984567d0386dc5df50ee5af7e4"
integrity sha1-5hz4BfDeHJhFZ9A4bcXfUO5a9+Q=
filenamify-url@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/filenamify-url/-/filenamify-url-1.0.0.tgz#b32bd81319ef5863b73078bed50f46a4f7975f50"
integrity sha1-syvYExnvWGO3MHi+1Q9GpPeXX1A=
dependencies:
filenamify "^1.0.0"
humanize-url "^1.0.0"
filenamify@^1.0.0:
version "1.2.1"
resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-1.2.1.tgz#a9f2ffd11c503bed300015029272378f1f1365a5"
integrity sha1-qfL/0RxQO+0wABUCknI3jx8TZaU=
dependencies:
filename-reserved-regex "^1.0.0"
strip-outer "^1.0.0"
trim-repeated "^1.0.0"
filesize@3.6.1:
version "3.6.1"
resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317"
@ -4429,6 +4468,20 @@ getpass@^0.1.1:
dependencies:
assert-plus "^1.0.0"
gh-pages@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/gh-pages/-/gh-pages-2.0.1.tgz#aefe47a43b8d9d2aa3130576b33fe95641e29a2f"
integrity sha512-uFlk3bukljeiWKQ2XvPfjcSi/ou7IfoDf2p+Fj672saLAr8bnOdFVqI/JSgrSgInKpCg5BksxEwGUl++dbg8Dg==
dependencies:
async "^2.6.1"
commander "^2.18.0"
email-addresses "^3.0.1"
filenamify-url "^1.0.0"
fs-extra "^7.0.0"
globby "^6.1.0"
graceful-fs "^4.1.11"
rimraf "^2.6.2"
glob-parent@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
@ -4807,6 +4860,14 @@ https-browserify@^1.0.0:
resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=
humanize-url@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/humanize-url/-/humanize-url-1.0.1.tgz#f4ab99e0d288174ca4e1e50407c55fbae464efff"
integrity sha1-9KuZ4NKIF0yk4eUEB8VfuuRk7/8=
dependencies:
normalize-url "^1.0.0"
strip-url-auth "^1.0.0"
hyphenate-style-name@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.3.tgz#097bb7fa0b8f1a9cf0bd5c734cf95899981a9b48"
@ -5215,6 +5276,11 @@ is-path-inside@^1.0.0:
dependencies:
path-is-inside "^1.0.1"
is-plain-obj@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4=
is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
@ -6200,7 +6266,7 @@ lodash.uniq@^4.5.0:
resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=
"lodash@>=3.5 <5", lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.5, lodash@~4.17.4:
"lodash@>=3.5 <5", lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.5, lodash@~4.17.4:
version "4.17.15"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
@ -6725,6 +6791,16 @@ normalize-scroll-left@^0.2.0:
resolved "https://registry.yarnpkg.com/normalize-scroll-left/-/normalize-scroll-left-0.2.0.tgz#9445d74275f303cc661e113329aefa492f58114c"
integrity sha512-t5oCENZJl8TGusJKoCJm7+asaSsPuNmK6+iEjrZ5TyBj2f02brCRsd4c83hwtu+e5d4LCSBZ0uoDlMjBo+A8yA==
normalize-url@^1.0.0:
version "1.9.1"
resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c"
integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=
dependencies:
object-assign "^4.0.1"
prepend-http "^1.0.0"
query-string "^4.1.0"
sort-keys "^1.0.0"
normalize-url@^3.0.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559"
@ -7946,6 +8022,11 @@ prelude-ls@~1.1.2:
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
prepend-http@^1.0.0:
version "1.0.4"
resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=
pretty-bytes@^5.1.0:
version "5.3.0"
resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.3.0.tgz#f2849e27db79fb4d6cfe24764fc4134f165989f2"
@ -8103,6 +8184,14 @@ qs@~6.5.2:
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
query-string@^4.1.0:
version "4.3.4"
resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb"
integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s=
dependencies:
object-assign "^4.1.0"
strict-uri-encode "^1.0.0"
querystring-es3@^0.2.0:
version "0.2.1"
resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
@ -8233,6 +8322,13 @@ react-lifecycles-compat@^3.0.4:
resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362"
integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==
react-number-format@^4.0.8:
version "4.0.8"
resolved "https://registry.yarnpkg.com/react-number-format/-/react-number-format-4.0.8.tgz#f0a0dfbeded9a746f4d8b309926cf55d7effebb2"
integrity sha512-A7Gi4BSkdgnyY1DO98lwFvWujcyxZCOfNP6tkiOKkwMY6oFP+JTQhd/vQ9dXXs6TpyXfl1eBJdueokM7o98YTQ==
dependencies:
prop-types "^15.7.2"
react-resize-detector@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/react-resize-detector/-/react-resize-detector-2.3.0.tgz#57bad1ae26a28a62a2ddb678ba6ffdf8fa2b599c"
@ -8705,7 +8801,7 @@ rgba-regex@^1.0.0:
resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3"
integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=
rimraf@2.6.3, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3:
rimraf@2.6.3, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3:
version "2.6.3"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
@ -9073,6 +9169,13 @@ sockjs@0.3.19:
faye-websocket "^0.10.0"
uuid "^3.0.1"
sort-keys@^1.0.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad"
integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0=
dependencies:
is-plain-obj "^1.0.0"
source-list-map@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34"
@ -9255,6 +9358,11 @@ stream-shift@^1.0.0:
resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952"
integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=
strict-uri-encode@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=
string-length@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed"
@ -9356,6 +9464,18 @@ strip-json-comments@^2.0.1, strip-json-comments@~2.0.1:
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
strip-outer@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631"
integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==
dependencies:
escape-string-regexp "^1.0.2"
strip-url-auth@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/strip-url-auth/-/strip-url-auth-1.0.1.tgz#22b0fa3a41385b33be3f331551bbb837fa0cd7ae"
integrity sha1-IrD6OkE4WzO+PzMVUbu4N/oM164=
style-loader@0.23.1:
version "0.23.1"
resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.23.1.tgz#cb9154606f3e771ab6c4ab637026a1049174d925"
@ -9627,6 +9747,13 @@ tr46@^1.0.1:
dependencies:
punycode "^2.1.0"
trim-repeated@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21"
integrity sha1-42RqLqTokTEr9+rObPsFOAvAHCE=
dependencies:
escape-string-regexp "^1.0.2"
trim-right@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"