repack, data auto loading

This commit is contained in:
T__o 2020-04-23 17:52:44 +02:00
parent 1720c6134b
commit c4db1aa587
21 changed files with 1889 additions and 112 deletions

View File

@ -1,24 +1,9 @@
# covcharts
## Project setup
```
yarn install
```
Charts on COVID 19
### Compiles and hot-reloads for development
```
yarn serve
```
Using vuejs and d3
### Compiles and minifies for production
```
yarn build
```
Data source from : https://github.com/pomber/covid19
### Lints and fixes files
```
yarn lint
```
### Customize configuration
See [Configuration Reference](https://cli.vuejs.org/config/).

29
brain.md Normal file
View File

@ -0,0 +1,29 @@
# todo list
## First production :
load data source
vuejs prod
git clean
hosting
load data source
local storage :
save all data
save timeStamp
on load
if delay > 1hour : reload data
Data source :
https://github.com/pomber/covid19
curl -o data/timeseries0.json https://pomber.github.io/covid19/timeseries.json

23
doc.md Normal file
View File

@ -0,0 +1,23 @@
# Changelog
v0.01 repack, data auto loading
### Project dataviz d3js vue
https://medialab.sciencespo.fr/actu/coronavirus-country-comparator/
https://boogheta.github.io/coronavirus-countries/#deceased&places=China,France,Iran,Italy,Spain,USA,United%20Kingdom&alignTo=deceased
https://github.com/boogheta/coronavirus-countries/blob/master/js/corona.js
### vuejs d3
Workshop :
Composing D3.js Visuals with Vue.js Workshop https://www.youtube.com/watch?v=CkFktv0p3pw
Visualizing Hierarchies with Vue.js and D3.js https://www.youtube.com/watch?v=GuecoTcqmVE
Bar with animation :
https://codepen.io/callumacrae/pen/oyXXWR

View File

@ -9,7 +9,9 @@
},
"dependencies": {
"core-js": "^3.6.4",
"vue": "^2.6.11"
"d3": "^5.16.0",
"vue": "^2.6.11",
"vuetify": "^2.2.11"
},
"devDependencies": {
"@vue/cli-plugin-babel": "^4.3.0",
@ -18,7 +20,11 @@
"babel-eslint": "^10.1.0",
"eslint": "^6.7.2",
"eslint-plugin-vue": "^6.2.2",
"vue-template-compiler": "^2.6.11"
"sass": "^1.19.0",
"sass-loader": "^8.0.0",
"vue-cli-plugin-vuetify": "^2.0.5",
"vue-template-compiler": "^2.6.11",
"vuetify-loader": "^1.3.0"
},
"eslintConfig": {
"root": true,

View File

@ -6,6 +6,8 @@
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title><%= htmlWebpackPlugin.options.title %></title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@mdi/font@latest/css/materialdesignicons.min.css">
</head>
<body>
<noscript>

View File

@ -1,28 +1,215 @@
<template>
<div id="app">
<img alt="Vue logo" src="./assets/logo.png">
<HelloWorld msg="Welcome to Your Vue.js App"/>
</div>
<v-app id="inspire">
<v-app-bar app clipped-left>
<v-app-bar-nav-icon @click.stop="drawer = !drawer"/>
<v-toolbar-title>{{title}}</v-toolbar-title>
</v-app-bar>
<v-navigation-drawer
v-model="drawer"
app
clipped
stateless
>
<ChartConfig
:configs="chartConfig"
:configLists="configLists"
v-model="chartConfig"
/>
<CountriesConfig
:lists="countriesLists"
:configs="countriesConfig"
/>
<DataLoader
v-model="allData"
></DataLoader>
</v-navigation-drawer>
<v-content>
<v-container class="sfill-height" fluid>
<v-row align="center" justify="center" id="maincontent" ref="maincontent">
<v-col class="shrink">
<MultiCountryChart
:countries="countriesData"
:scaleType="chartConfig.scaleSelected"
:dataType="chartConfig.typeSelected"
:width="chartWidth"
:height="chartWidth * (2/3)"
/>
<MultiBarChartSingle
:countriesData="countriesData"
:scaleType="chartConfig.scaleSelected"
:width="260"
:height="100"
/>
</v-col>
</v-row>
</v-container>
</v-content>
<v-footer app>
<span>
Using <a href="https://vuejs.org/" target="_blank">Vuejs</a>
and <a href="https://d3js.org/" target="_blank">d3</a> -
<a href="https://github.com/pomber/covid19" target="_blank">Data source</a>
</span>
</v-footer>
</v-app>
</template>
<script>
import HelloWorld from './components/HelloWorld.vue'
export default {
name: 'App',
components: {
HelloWorld
//import AllData from '../data/timeseries.json'
import ChartConfig from './components/ChartConfig'
import CountriesConfig from './components/CountriesConfig'
import MultiCountryChart from './components/d3/MultiCountryChart'
import MultiBarChartSingle from './components/MultiBarChartSingle'
import DataLoader from './components/DataLoader'
let limit = (value, min, max) => {
return value > max ? max : value < min ? min : value
}
}
</script>
limit()
function formatDate(date) {
var d = new Date(date),
month = '' + (d.getMonth() + 1),
day = '' + d.getDate(),
year = d.getFullYear();
if (month.length < 2)
month = '0' + month;
if (day.length < 2)
day = '0' + day;
return [year, month, day].join('-');
}
export default {
name: 'AppVuetify',
components: {ChartConfig, CountriesConfig, MultiCountryChart, MultiBarChartSingle, DataLoader},
props: {
source: String,
},
data: () => ({
drawer: true,
title: 'Cov Charts',
allData: {},
chartConfig: {
typeSelected: 'confirmed',
scaleSelected: 'linear',
dayStart: 30,
dayEnd: 0,
ymax: 0,
},
chartWidth: 500,
configLists: {
scaleList: ['log', 'linear'],
typesList: ['confirmed', 'deaths', 'recovered'],
},
countriesConfig: {
selected: [{name: "France"}, {name: "Italy"}],
basePalette: "tolRainbowColor"
},
countriesLists: {
top: ['Belgium', 'Sweden', 'France', 'Japan', 'Korea, South', 'Russia', 'Germany', 'Spain', 'Italy', 'China', 'United Kingdom', 'US'],
// Todo list of all countries using localstorage
//all: Object.keys(AllData).sort(),
}
}),
watch: {
drawer() {
console.log('dd', this.drawer)
}
},
created() {
this.$vuetify.theme.dark = true
},
mounted() {
// Todo find a better way to get size
//this.chartWidth = this.$refs.maincontent.clientWidth * 2 / 3
this.chartWidth = 800
},
computed: {
countriesData() {
if (!('France' in this.allData)) {
return []
}
let formatedData = []
const addSomeDays = false
this.countriesConfig.selected.map((country) => {
let cdata = JSON.parse(JSON.stringify(this.allData[country.name]))
let itemsCount = cdata.length
let filtered = cdata.filter((e, i) =>
i >= (this.chartConfig.dayStart - 1) &&
i < (itemsCount - this.chartConfig.dayEnd))
if (addSomeDays) {
// Adding addDays data points
let datebase = new Date(filtered.slice(-1)[0].date)
for (let i = 0; i < this.chartConfig.addDays; i++) {
let dd = new Date(datebase.getFullYear(), datebase.getMonth(), datebase.getDate() + i);
filtered.push({
date: formatDate(dd),
deaths: undefined,
recovered: undefined,
confirmed: undefined,
})
}
}
if (this.chartConfig.ymax > 0) {
filtered = filtered.map((d) => {
this.configLists.typesList.map(e => {
d[e] = d[e] > this.chartConfig.ymax ? this.chartConfig.ymax : d[e]
})
return d
})
}
// // Get ymax
// filtered.map(d => {
// ymax = d[this.dataSelected] > ymax ? d[this.dataSelected] : ymax
// })
country.list = filtered
formatedData.push(country)
})
return formatedData
}
}
}
</script>
<style>
#app {
font-family: Avenir, Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
html, body {
height: 100%;
margin: 0;
font-size: 12px;
}
input, select, .v-input {
font-size: 12px;
}
</style>

View File

@ -0,0 +1,110 @@
<template>
<div>
<v-list dense>
<v-list-item>
<v-list-item-action> Scale</v-list-item-action>
<v-list-item-content>
<v-select
class="vselect"
:items="configLists.scaleList"
v-model="configs.scaleSelected"
single-line
hide-details
></v-select>
</v-list-item-content>
</v-list-item>
<v-list-item>
<v-list-item-action> Type</v-list-item-action>
<v-list-item-content>
<v-select
class="vselect"
:items="configLists.typesList"
v-model="configs.typeSelected"
single-line
hide-details
></v-select>
</v-list-item-content>
</v-list-item>
<v-list-item>
<v-list-item-action> DayStart</v-list-item-action>
<v-list-item-content>
<Counter
v-model="configs.dayStart"
:input="configs.dayStart"
classname="themeGrey"
:max="100"
></Counter>
</v-list-item-content>
</v-list-item>
<v-list-item>
<v-list-item-action> DayEnd</v-list-item-action>
<v-list-item-content>
<Counter
v-model="configs.dayEnd"
:input="configs.dayEnd"
classname="themeGrey"
:max="100"
></Counter>
</v-list-item-content>
</v-list-item>
<v-list-item>
<v-list-item-action> y Max</v-list-item-action>
<v-list-item-content>
<v-text-field
class="ymax"
v-model="configs.ymax"
label="ymaxx"
solo
hide-details
single-line
/>
</v-list-item-content>
</v-list-item>
</v-list>
</div>
</template>
<script>
import Counter from './html/Counter'
export default {
name: "ChartConfig",
props: ['configs', 'configLists'],
components: {Counter},
data() {
return {}
},
watch: {
config(prev,neww){
if (prev.ymax !== neww.ymax){
console.log('new y',neww.ymax)
}
}
},
methods: {},
}
</script>
<style scoped>
.vselect {
padding: 0px;
margin: 0px;
}
.ymax{
max-width:50%;
}
</style>

View File

@ -0,0 +1,156 @@
<template>
<div>
<div>
<v-list dense shaped subheader>
<v-list-item>
<v-list-item-content>
<v-autocomplete
class="vselect"
:items="lists.top"
v-model="selected"
label="Countries"
outlined
dense
hide-details
></v-autocomplete>
</v-list-item-content>
</v-list-item>
<v-list-item v-for="(cinfo,id) in configs.selected" :key="id" class="countryLine">
<v-list-item-action>
<v-btn fab dark x-small
@click="removeCountry(cinfo.name)">
<v-icon dark>mdi-close</v-icon>
</v-btn>
</v-list-item-action>
<v-list-item-content>
<v-list-item-title>
<v-chip :style="{background:cinfo.color}"><span> &nbsp; </span></v-chip>
{{cinfo.name}}
</v-list-item-title>
</v-list-item-content>
</v-list-item>
</v-list>
</div>
</div>
</template>
<script>
import Palette from './html/Palette'
import {getPalette} from '../libs/thpalette'
import SelectO from './html/SelectO'
Palette, SelectO
export default {
name: "CountriesConfig",
props: ['lists', 'configs'],
components: {},
data() {
return {
addCountry: false,
selected: '',
// TODO : change the base list used for countries
}
},
created() {
this.setColors();
},
watch: {
selected() {
if (this.selected === '') return // prevent the reset in this function
if (this.configs.selected.map(d => d.name).indexOf(this.selected) === -1) {
this.configs.selected.push({name: this.selected})
this.setColors()
}
this.addCountry = !this.addCountry
this.selected = ''
}
},
methods: {
setColors() {
let colors = getPalette(this.configs.basePalette, this.configs.selected.length)
this.configs.selected = this.configs.selected.map((d, i) => {
d.color = colors[i]
return d
})
},
addCountryClick() {
this.addCountry = !this.addCountry
},
removeCountry(country) {
this.configs.selected = this.configs.selected.filter(d => d.name !== country)
},
},
computed: {
getActiveCountries() {
// TODO filter out selected countries
return []
}
},
}
</script>
<style scoped>
.countryLine {
display: flex;
}
.countryItem {
display: inline-block;
width: 70px;
padding-left: 3px;
}
.countryBtn {
line-height: 15px;
width: 20px;
text-align: center;
padding: 0px;
}
.countryColor {
display: inline-block;
border: 1px solid #2c3e50;
border-radius: 10px;
width: 15px;
height: 15px;
margin: 2px 7px 0px 2px;
}
.countryLine .v-list-item__action {
margin: 2px;
}
.countryLine .v-list-item__content {
padding: 2px;
}
.countryLine .v-btn {
width: 20px;
height: 20px;
font-size: 8px;
}
.countryLine .v-chip {
height: 20px;
font-size: 8px;
}
.countryLine.v-list-item {
min-height: 24px;
font-size: 8px;
}
</style>

View File

@ -0,0 +1,96 @@
<template>
<v-list dense>
<v-list-item>
<v-list-item-action> Data </v-list-item-action>
<v-list-item-content>
{{localDate}} {{checkData}}
</v-list-item-content>
</v-list-item>
<v-list-item v-if="errorMessage">
<v-list-item-action> Error:</v-list-item-action>
<v-list-item-content>
{{errorMessage}}
</v-list-item-content>
</v-list-item>
</v-list>
</template>
<script>
const APIURL = "https://pomber.github.io/covid19/timeseries.json"
export default {
name: "DataLoader",
props: [''],
components: {},
data() {
return {
localTimestamp: 0,
localData: {},
refetchDelay: 1000 * 3600,
errorMessage: ""
}
},
created() {
this.readLocal()
},
watch: {
localData() {
this.$emit('input', this.localData)
}
},
methods: {
readLocal() {
let ls = localStorage.getItem('localTimestamp')
if (ls) {
this.localTimestamp = parseInt(ls);
this.localData = JSON.parse(localStorage.getItem('localData'));
}
if ((this.localTimestamp + this.refetchDelay) < new Date().getTime()) {
this.fetch()
}
},
fetch() {
fetch(APIURL)
.then(response => response.json())
.then(data => {
this.saveData(data)
}).catch(() => {
this.errorMessage = "Network Error"
});
},
saveData(data) {
if ('France' in data) {
// todo control data
this.localData = data
this.localTimestamp = new Date().getTime()
localStorage.setItem('localData', JSON.stringify(this.localData))
localStorage.setItem('localTimestamp', this.localTimestamp)
} else {
this.errorMessage = "Wrong data"
}
}
},
computed: {
checkData() {
if ('France' in this.localData) {
let last = this.localData['France'].slice(-1)[0]
if ('date' in last && 'recovered' in last) return 'OK'
}
return "No data"
},
localDate() {
return new Date(this.localTimestamp).toLocaleString()
}
},
}
</script>
<style scoped>
</style>

View File

@ -1,58 +0,0 @@
<template>
<div class="hello">
<h1>{{ msg }}</h1>
<p>
For a guide and recipes on how to configure / customize this project,<br>
check out the
<a href="https://cli.vuejs.org" target="_blank" rel="noopener">vue-cli documentation</a>.
</p>
<h3>Installed CLI Plugins</h3>
<ul>
<li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-babel" target="_blank" rel="noopener">babel</a></li>
<li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-eslint" target="_blank" rel="noopener">eslint</a></li>
</ul>
<h3>Essential Links</h3>
<ul>
<li><a href="https://vuejs.org" target="_blank" rel="noopener">Core Docs</a></li>
<li><a href="https://forum.vuejs.org" target="_blank" rel="noopener">Forum</a></li>
<li><a href="https://chat.vuejs.org" target="_blank" rel="noopener">Community Chat</a></li>
<li><a href="https://twitter.com/vuejs" target="_blank" rel="noopener">Twitter</a></li>
<li><a href="https://news.vuejs.org" target="_blank" rel="noopener">News</a></li>
</ul>
<h3>Ecosystem</h3>
<ul>
<li><a href="https://router.vuejs.org" target="_blank" rel="noopener">vue-router</a></li>
<li><a href="https://vuex.vuejs.org" target="_blank" rel="noopener">vuex</a></li>
<li><a href="https://github.com/vuejs/vue-devtools#vue-devtools" target="_blank" rel="noopener">vue-devtools</a></li>
<li><a href="https://vue-loader.vuejs.org" target="_blank" rel="noopener">vue-loader</a></li>
<li><a href="https://github.com/vuejs/awesome-vue" target="_blank" rel="noopener">awesome-vue</a></li>
</ul>
</div>
</template>
<script>
export default {
name: 'HelloWorld',
props: {
msg: String
}
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
h3 {
margin: 40px 0 0;
}
ul {
list-style-type: none;
padding: 0;
}
li {
display: inline-block;
margin: 0 10px;
}
a {
color: #42b983;
}
</style>

View File

@ -0,0 +1,99 @@
<template>
<div class="rowC">
<div class="row countrytitle">
<div> _</div>
<div v-for="(cinfo,id) in countriesData"
:key="'ns'+id"
class="rodw"
:style="{height:(height+7)+'px'}">
{{cinfo.name}}
</div>
</div>
<div v-for="dtype in dataType" :key="'mcs'+dtype">
<div >
{{dtype}}
</div>
<div v-for="(cinfo,id) in countriesData" :key="'ns'+id">
<div class="chartBlock">
<BarChartSingle
:dataType="dtype"
:country="cinfo.name"
:dataChart="dataProcess(cinfo.list,dtype)"
:scaleType="scaleType"
:width="width"
:height="height"
/>
</div>
</div>
</div>
</div>
</template>
<script>
import BarChartSingle from './d3/BarChartSingle'
export default {
name: 'MultiBarChartSingle',
props: {
countriesData: Array,
scaleType: String,
width: Number,
height: Number,
},
components: {
BarChartSingle: BarChartSingle
},
data() {
return {
dataType: ['confirmed', 'deaths', 'recovered']
}
},
computed: {},
methods: {
dataProcessOne(list, datatype) {
return list.map(d => {
return {date: d.date, value: d[datatype]}
})
},
dataProcess(list, datatype) {
let prevDayTotal = 0
let dailyList = list.map((d) => {
let current = d[datatype] - prevDayTotal
prevDayTotal = d[datatype]
return {
date: d.date,
value: current
}
})
return dailyList
}
}
}
</script>
<style scoped>
.rowC {
display: flex;
}
.row {
display: inline-block;
}
.chartBlock {
/*background: #efffe3;*/
margin: 0px 5px 5px 0px;
}
.countrytitle {
width: 70px;
flex: none;
}
</style>

View File

@ -0,0 +1,156 @@
<template>
<svg :class="svgClass +' svgg'" :width="width" :height="height">
<g>
<rect v-for="(day ,id) in dataChart"
:alt="id"
:key="'bcs'+id"
:x="scales.x(new Date(day.date))"
:y="scales.y(day.value)"
:width="colsize"
:height="height-scales.y(day.value)"
class="barChartRect"
></rect>
<!-- <path-->
<!-- :d="calculatePath(dataChart)"-->
<!-- />-->
<!-- :style="{stroke:cinfo.color}"-->
</g>
<g class="axisg"></g>
</svg>
</template>
<script>
import {scaleLinear, scaleLog, scalePow, scaleTime} from 'd3';
import {axisLeft, axisBottom,timeDay} from 'd3';
import {axisRight, axisTop} from 'd3';
import {select, line} from 'd3';
select, scaleLinear, scaleLog, scalePow, scaleTime,
axisLeft, axisRight, axisTop, axisBottom, line
export default {
name: 'BarChartSingle',
props: {
dataChart: Array, // [{date,value}]
scaleType: String,
dataType: String,
width: Number,
height: Number,
country: String,
},
data() {
return {
margin: {
x: 5,
y: 0,
},
svgClass: "svg" + Math.random().toString(36).substring(7),
overpoint: {
x: 0,
y: 0,
text: "",
country: ""
}
}
},
mounted() {
this.drawAxis()
//console.log('',this.country,this.dataType, this.dataChart.slice(-1)[0])
},
watch: {
scaleType() {
this.drawAxis()
},
dataChart() {
this.drawAxis()
},
},
computed: {
colsize() {
return this.scales.x(new Date(this.dataChart[1].date)) - 1
},
minmax() {
let first = this.dataChart[0]
let max = {x: new Date(first.date), y: first.value}
let min = {x: new Date(first.date), y: first.value}
this.dataChart.forEach(item => {
let value = item.value
let dayvalue = new Date(item.date)
max.x = max.x < dayvalue ? dayvalue : max.x
max.y = max.y < value ? value : max.y
min.x = min.x > dayvalue ? dayvalue : min.x
if (typeof min.y === "undefined") min.y = value
min.y = min.y > value ? value : min.y
if (min.y <= 0) min.y = 1 // for log scale
})
//console.log(' dd',this.dataChart)
//console.log(' {min: min, max: max} ', min.y, max, this.scaleType)
return {min: min, max: max}
},
scales() {
let scales = {}
scales.x = scaleTime()
.domain([this.minmax.min.x, this.minmax.max.x])
.range([0, this.width - 2 * this.margin.x])
// !!scaleLog need to start at 1 not 0!!
scales.y = this.scaleType === 'linear' ? scaleLinear() : scaleLog()
scales.y = scales.y
.domain([this.minmax.min.y, this.minmax.max.y])
.range([this.height - 2 * this.margin.y, 1])
return scales
},
},
methods: {
calculatePath(data) {
//console.log('datata',data)
const path = line()
.x((d) => this.scales.x(new Date(d.date)))
.y(d => this.scales.y(d.value === 0 ? 1 : d.value))
return path(data)
},
drawAxis() {
let axis = select("." + this.svgClass + " .axisg")
axis.selectAll("*").remove()
axis.append("g")
.attr("class", "axis ") // axis--y
//.attr("transform", "translate(" + 0 + ", 0)")
.call(axisRight(this.scales.y).ticks(3));
axis.append("g")
.attr("class", "axis") // axis--x
.attr("transform", "translate( 0," + (this.height - 1) + ")")
.call(axisTop(this.scales.x).ticks(timeDay.every(10))
);
},
},
}
</script>
<style scoped>
.barChartRect {
fill: #87a2a8;
}
</style>

View File

@ -0,0 +1,208 @@
<template>
<div>
<svg :class="svgClass" :width="width" :height="height">
<g style="transform: translate(2px, 2px)">
<g v-for="cinfo in countries"
:key="cinfo.country"
@mouseleave="overPoint('reset')"
>
<path :style="{stroke:cinfo.color}"
:d="calculatePath(cinfo.list)"
/>
<circle v-for="(point,i) in (cinfo.list)"
:key="'c'+i"
:style="{fill:cinfo.color}"
:cx="scales.x(new Date(point.date))"
:cy="scales.y(point[dataType])"
r="2"
/>
<circle v-for="(point,i) in (cinfo.list)"
opacity="0"
:key="'cinv'+i"
:cx="scales.x(new Date(point.date))"
:cy="scales.y(point[dataType])"
r="7"
@mouseover="overPoint(point,cinfo.color)"
/>
<rect :x="overpoint.x"
:y="overpoint.y-10"
:width=" (6+overpoint.text.toString().length) * 4"
:height="18"
/>
<text :x="overpoint.x+4"
:y="overpoint.y+4"
class="overpoint"
:style="{fill:overpoint.color}"
>
{{overpoint.text}}
</text>
</g>
<g class="axisg"></g>
</g>
</svg>
</div>
</template>
<script>
import {scaleLinear, scaleLog, scalePow, scaleTime} from 'd3';
import {axisLeft, axisBottom} from 'd3';
import {axisRight, axisTop} from 'd3';
import {select, line} from 'd3';
select, scaleLinear, scaleLog, scalePow, scaleTime,
axisLeft, axisRight, axisTop, axisBottom
export default {
name: 'MultiCountryChart',
props: {
countries: Array,
scaleType: String,
dataType: String,
width: Number,
height: Number,
},
data() {
return {
margin: {
x: 5,
y: 5,
},
svgClass: "svg" + Math.random().toString(36).substring(7),
overpoint: {
x: 0,
y: 0,
text: "",
country: ""
}
}
},
mounted() {
this.drawAxis()
console.log('dataType', this.dataType)
},
watch: {
scaleType(neww) {
console.log('', neww)
this.drawAxis()
},
countries() {
this.drawAxis()
},
},
computed: {
minmax() {
let max = {x: 0, y: 0}
let min = {x: new Date(), y: undefined}
this.countries.forEach(country => {
country.list.forEach((item) => {
let value = item[this.dataType]
let dayvalue = new Date(item.date)
max.x = max.x < dayvalue ? dayvalue : max.x
max.y = max.y < value ? value : max.y
min.x = min.x > dayvalue ? dayvalue : min.x
if (typeof min.y === "undefined") min.y = value
min.y = min.y > value ? value : min.y
if (min.y <= 1) min.y = 1 // for log scale
})
})
//console.log(' {min: min, max: max} ', min.y, max, this.scaleType)
return {min: min, max: max}
},
scales() {
let scales = {}
scales.x = scaleTime()
.domain([this.minmax.min.x, this.minmax.max.x])
.range([0, this.width - 2 * this.margin.x])
// !!scaleLog need to start at 1 not 0!!
scales.y = this.scaleType === 'linear' ? scaleLinear() : scaleLog()
scales.y = scales.y
.domain([this.minmax.min.y, this.minmax.max.y])
.range([this.height - 2 * this.margin.y, 1])
return scales
},
},
methods: {
overPoint(point, color) {
if (point === 'reset') {
this.overpoint = {
x: 0, y: 0, text: ""
}
return
}
this.overpoint = {
x: this.scales.x(new Date(point.date)),
y: this.scales.y(point [this.dataType]),
text: point.date.slice(5,10)+": "+point [this.dataType],
color: color,
}
},
calculatePath(data) {
//console.log('datata',data)
const path = line()
.x((d) => this.scales.x(new Date(d.date)))
.y(d => this.scales.y(d[this.dataType] === 0 ? 1 : d[this.dataType]))
return path(data)
},
drawAxis() {
let axis = select("." + this.svgClass + " .axisg")
axis.selectAll("*").remove()
axis.append("g")
.attr("class", "axis axis--y")
.attr("transform", "translate(" + 0 + ", 0)")
.call(axisRight(this.scales.y));
axis.append("g")
.attr("class", "axis axis--x")
.attr("transform", "translate( 0," + (this.height - this.margin.y/2) + ")")
.call(axisTop(this.scales.x));
},
}
}
</script>
<style lang="sass" scoped>
path
fill: none
stroke: #bf674d
stroke-width: 1px
</style>
<style>
.overpoint {
font-size: 11px;
}
</style>

View File

@ -0,0 +1,93 @@
<template>
<div :class="'counter '+ classname">
<button @click="click(-1)" class="bleft">-</button>
<span>{{value}}</span>
<button @click="click(1)" class="bright">+</button>
</div>
</template>
<script>
export default {
name: 'Counter',
props: {
min: {type: Number, default: 0},
max: {type: Number, default: 10},
inc: {type: Number, default: 1},
input: {type: Number, default: 1},
classname: {type: String, default: 'themeGreen'},
},
data() {
return {
value: this.input,
}
},
methods: {
click(dirfactor) {
this.value = this.value + (dirfactor * this.inc)
if (this.value > this.max) this.value = this.max
if (this.value < this.min) this.value = this.min
this.$emit('input', this.value)
}
}
}
</script>
<style scoped>
.counter {
display: inline-block;
border-radius: 5px;
padding: 0;
}
.counter button {
padding: 0;
width: 15px;
line-height: 15px;
/*/margin: 0 px 3 px 0 px 3 px;*/
}
.bleft, .bright {
border: 0px solid red;
border-radius: 5px;
}
.bleft {
margin-right: 3px;
}
.bright {
margin-left: 3px;
}
.themeGreen.counter {
border: 1px solid #2c3e50;
background: #d3e3e0;
color:white;
}
.themeGreen.counter button {
background: #d3e3e0;
}
.themeGreen .bleft {
border-right: 1px solid #2c3e50;
}
.themeGreen .bright {
border-left: 1px solid #2c3e50;
}
.themeGrey.counter {
border: 0px solid #8ecaf9;
background: inherit;
color:white;
}
.themeGrey.counter button {
background: #767676;
width: 18px;
line-height: 18px;
}
.themeGrey .bleft {
border-right: 0px solid #8ecaf9;
}
.themeGrey .bright {
border-left: 0px solid #8ecaf9;
}
</style>

View File

@ -0,0 +1,71 @@
<template>
<div>
<h2>Palettes</h2>
<SelectO
name="Scale"
:list="palettesList"
:selectedItem="paletteSelected"
v-model="paletteSelected"
@change="onChange(paletteSelected)"
></SelectO>
<div>
<input type="text" v-model="count" size="1"/>
{{paletteSelected}}
</div>
<div v-for="color in palettes" :key="color">
<div :style="{backgroundColor: color}">
{{color}}
</div>
</div>
</div>
</template>
<script>
import SelectO from './SelectO'
import {getPalette, palettesList} from '../../libs/thpalette'
export default {
name: "Palette",
components: {
SelectO,
},
data() {
return {
count: 10,
palettesList: palettesList,
paletteSelected: palettesList[0]
}
},
watch:{
paletteSelected: function (neww){
console.log(' nn',neww)
// this.$emit('input', neww)
this.onChange(neww)
}
},
computed: {
palettes() {
return getPalette(this.paletteSelected, this.count)
}
},
methods: {
onChange(selectedItem) {
//if (selectedItem === this.paletteSelected) return
console.log('select onChange', selectedItem)
this.$emit('input', selectedItem)
},
}
}
</script>
<style scoped>
</style>

View File

@ -0,0 +1,77 @@
<template>
<div class="selectBox">
<div class="title">{{name}}</div>
<select
:class="classNam"
@change="onChange($event.target.value)"
>
<option v-if="selectedItem.length === 0" :value='phValue'>
{{placeholder}}
</option>
<option v-for="(item, id) in list"
:value="item"
:key="id"
:selected="selectedItem == item"
>
{{item}}
</option>
</select>
</div>
</template>
<script>
export default {
name: 'SelectO',
props: {
list: Array,
selectedItem: String,
classNam: {type: String, default: () => "sone"},
name: String,
},
data() {
return {
placeholder: '--',
phValue:'pvalue'
}
},
methods: {
onChange(selectedItem) {
if (selectedItem === this.phValue) return
//console.log('select onChange', selectedItem)
this.$emit('input', selectedItem)
},
}
}
</script>
<style scoped>
div.selectBox {
display: inline-block;
margin: 2px;
padding: 0px;
border: 1px solid rgba(155, 191, 208, 0.83);
}
select.sone {
width: 100px;
background: rgba(169, 175, 180, 0.35);
border: 1px solid aliceblue;
line-height: 20px;
margin: 0px;
}
.title {
margin: 0px;
width: 60px;
line-height: 20px;
display: inline-block;
background: rgba(155, 191, 208, 0.56);
}
</style>

112
src/libs/thpalette.js Normal file
View File

@ -0,0 +1,112 @@
/*
*
* Hacked from : http://google.github.io/palette.js/
*
*
* */
let clamp = (v) => {
return v > 0 ? (v < 1 ? v : 1) : 0;
}
let rgb = (r, g, b) => {
return [r, g, b].map(function (v) {
v = Number(Math.round(clamp(v) * 255)).toString(16);
return v.length == 1 ? '0' + v : v;
}).join('');
}
let poly = function (x, varargs) {
varargs
var i = arguments.length - 1, n = arguments[i];
while (i > 1) {
n = n * x + arguments[--i];
}
return n;
}
let erf = function (x) {
// https://en.wikipedia.org/wiki/Error_function#Approximation_with_elementary_functions
// This produces a maximum error of 0.0005 which is more then we need. In
// the worst case, that error is multiplied by four and then divided by two
// before being multiplied by 255, so in the end, the error is multiplied by
// 510 which produces 0.255 which is less than a single colour step.
var y = poly(Math.abs(x), 1, 0.278393, 0.230389, 0.000972, 0.078108);
y *= y; // y^2
y *= y; // y^4
y = 1 - 1 / y;
return x < 0 ? -y : y;
};
let rgbColor = function (r, g, b) {
return [r, g, b].map(function (v) {
v = Number(Math.round(clamp(v) * 255)).toString(16);
return v.length == 1 ? '0' + v : v;
}).join('');
};
let hsvColor = function (h, opt_s, opt_v) {
h *= 6;
var s = opt_s === void (0) ? 1 : clamp(opt_s);
var v = opt_v === void (0) ? 1 : clamp(opt_v);
var x = v * (1 - s * Math.abs(h % 2 - 1));
var m = v * (1 - s);
switch (Math.floor(h) % 6) {
case 0:
return rgbColor(v, x, m);
case 1:
return rgbColor(x, v, m);
case 2:
return rgbColor(m, v, x);
case 3:
return rgbColor(m, x, v);
case 4:
return rgbColor(x, m, v);
default:
return rgbColor(v, m, x);
}
};
let palettes = {
tolRainbowColor: (x) => {
return rgb(poly(x, 0.472, -0.567, 4.05) / poly(x, 1, 8.72, -19.17, 14.1),
poly(x, 0.108932, -1.22635, 27.284, -98.577, 163.3, -131.395,
40.634),
1 / poly(x, 1.97, 3.54, -68.5, 243, -297, 125));
},
tolDivergingColor: (x) => {
var g = poly(x, 0.572, 1.524, -1.811) / poly(x, 1, -0.291, 0.1574);
return rgb(poly(x, 0.235, -2.13, 26.92, -65.5, 63.5, -22.36),
g * g,
1 / poly(x, 1.579, -4.03, 12.92, -31.4, 48.6, -23.36));
},
tolSequentialColor: function (x) {
return rgb(1 - 0.392 * (1 + erf((x - 0.869) / 0.255)),
1.021 - 0.456 * (1 + erf((x - 0.527) / 0.376)),
1 - 0.493 * (1 + erf((x - 0.272) / 0.309)));
},
hsv: x => hsvColor(x, 1, 1),
hsvLight: x => hsvColor(x, .5, 1),
hsvDark: x => hsvColor(x, 1, .5)
}
let getPalette = (type, count) => {
let palette = []
let factor = 1 / count
for (let i = 0; i < count; i++) {
let id = i * factor
palette.push('#' + palettes[type](id))
}
return palette
}
let palettesList = ['tolRainbowColor',
'tolDivergingColor',
'tolSequentialColor',
'hsv',
'hsvLight',
'hsvDark',]
export {getPalette, palettesList}

View File

@ -1,8 +1,10 @@
import Vue from 'vue'
import App from './App.vue'
import vuetify from './plugins/vuetify';
Vue.config.productionTip = false
new Vue({
render: h => h(App),
vuetify,
render: h => h(App)
}).$mount('#app')

7
src/plugins/vuetify.js Normal file
View File

@ -0,0 +1,7 @@
import Vue from 'vue';
import Vuetify from 'vuetify/lib';
Vue.use(Vuetify);
export default new Vuetify({
});

5
vue.config.js Normal file
View File

@ -0,0 +1,5 @@
module.exports = {
"transpileDependencies": [
"vuetify"
]
}

437
yarn.lock
View File

@ -1423,6 +1423,14 @@ anymatch@^2.0.0:
micromatch "^3.1.4"
normalize-path "^2.1.1"
anymatch@~3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142"
integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==
dependencies:
normalize-path "^3.0.0"
picomatch "^2.0.4"
aproba@^1.1.1:
version "1.2.0"
resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
@ -1661,6 +1669,11 @@ binary-extensions@^1.0.0:
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65"
integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==
binary-extensions@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c"
integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==
bindings@^1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df"
@ -1735,6 +1748,13 @@ braces@^2.3.1, braces@^2.3.2:
split-string "^3.0.2"
to-regex "^3.0.1"
braces@~3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
dependencies:
fill-range "^7.0.1"
brorand@^1.0.1:
version "1.1.0"
resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
@ -2030,6 +2050,21 @@ check-types@^8.0.3:
resolved "https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552"
integrity sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==
"chokidar@>=2.0.0 <4.0.0":
version "3.3.1"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450"
integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==
dependencies:
anymatch "~3.1.1"
braces "~3.0.2"
glob-parent "~5.1.0"
is-binary-path "~2.1.0"
is-glob "~4.0.1"
normalize-path "~3.0.0"
readdirp "~3.3.0"
optionalDependencies:
fsevents "~2.1.2"
chokidar@^2.1.8:
version "2.1.8"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917"
@ -2159,6 +2194,15 @@ cliui@^6.0.0:
strip-ansi "^6.0.0"
wrap-ansi "^6.2.0"
clone-deep@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387"
integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==
dependencies:
is-plain-object "^2.0.4"
kind-of "^6.0.2"
shallow-clone "^3.0.0"
clone@^1.0.2:
version "1.0.4"
resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
@ -2233,16 +2277,16 @@ combined-stream@^1.0.6, combined-stream@~1.0.6:
dependencies:
delayed-stream "~1.0.0"
commander@2, commander@^2.18.0, commander@^2.20.0:
version "2.20.3"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
commander@2.17.x:
version "2.17.1"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf"
integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==
commander@^2.18.0, commander@^2.20.0:
version "2.20.3"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
commander@~2.19.0:
version "2.19.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
@ -2652,6 +2696,254 @@ cyclist@^1.0.1:
resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9"
integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=
d3-array@1, d3-array@^1.1.1, d3-array@^1.2.0:
version "1.2.4"
resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.4.tgz#635ce4d5eea759f6f605863dbcfc30edc737f71f"
integrity sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==
d3-axis@1:
version "1.0.12"
resolved "https://registry.yarnpkg.com/d3-axis/-/d3-axis-1.0.12.tgz#cdf20ba210cfbb43795af33756886fb3638daac9"
integrity sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==
d3-brush@1:
version "1.1.5"
resolved "https://registry.yarnpkg.com/d3-brush/-/d3-brush-1.1.5.tgz#066b8e84d17b192986030446c97c0fba7e1bacdc"
integrity sha512-rEaJ5gHlgLxXugWjIkolTA0OyMvw8UWU1imYXy1v642XyyswmI1ybKOv05Ft+ewq+TFmdliD3VuK0pRp1VT/5A==
dependencies:
d3-dispatch "1"
d3-drag "1"
d3-interpolate "1"
d3-selection "1"
d3-transition "1"
d3-chord@1:
version "1.0.6"
resolved "https://registry.yarnpkg.com/d3-chord/-/d3-chord-1.0.6.tgz#309157e3f2db2c752f0280fedd35f2067ccbb15f"
integrity sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==
dependencies:
d3-array "1"
d3-path "1"
d3-collection@1:
version "1.0.7"
resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.7.tgz#349bd2aa9977db071091c13144d5e4f16b5b310e"
integrity sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==
d3-color@1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.4.1.tgz#c52002bf8846ada4424d55d97982fef26eb3bc8a"
integrity sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==
d3-contour@1:
version "1.3.2"
resolved "https://registry.yarnpkg.com/d3-contour/-/d3-contour-1.3.2.tgz#652aacd500d2264cb3423cee10db69f6f59bead3"
integrity sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==
dependencies:
d3-array "^1.1.1"
d3-dispatch@1:
version "1.0.6"
resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-1.0.6.tgz#00d37bcee4dd8cd97729dd893a0ac29caaba5d58"
integrity sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==
d3-drag@1:
version "1.2.5"
resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-1.2.5.tgz#2537f451acd39d31406677b7dc77c82f7d988f70"
integrity sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==
dependencies:
d3-dispatch "1"
d3-selection "1"
d3-dsv@1:
version "1.2.0"
resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-1.2.0.tgz#9d5f75c3a5f8abd611f74d3f5847b0d4338b885c"
integrity sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==
dependencies:
commander "2"
iconv-lite "0.4"
rw "1"
d3-ease@1:
version "1.0.6"
resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-1.0.6.tgz#ebdb6da22dfac0a22222f2d4da06f66c416a0ec0"
integrity sha512-SZ/lVU7LRXafqp7XtIcBdxnWl8yyLpgOmzAk0mWBI9gXNzLDx5ybZgnRbH9dN/yY5tzVBqCQ9avltSnqVwessQ==
d3-fetch@1:
version "1.1.2"
resolved "https://registry.yarnpkg.com/d3-fetch/-/d3-fetch-1.1.2.tgz#957c8fbc6d4480599ba191b1b2518bf86b3e1be2"
integrity sha512-S2loaQCV/ZeyTyIF2oP8D1K9Z4QizUzW7cWeAOAS4U88qOt3Ucf6GsmgthuYSdyB2HyEm4CeGvkQxWsmInsIVA==
dependencies:
d3-dsv "1"
d3-force@1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-1.2.1.tgz#fd29a5d1ff181c9e7f0669e4bd72bdb0e914ec0b"
integrity sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==
dependencies:
d3-collection "1"
d3-dispatch "1"
d3-quadtree "1"
d3-timer "1"
d3-format@1:
version "1.4.4"
resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-1.4.4.tgz#356925f28d0fd7c7983bfad593726fce46844030"
integrity sha512-TWks25e7t8/cqctxCmxpUuzZN11QxIA7YrMbram94zMQ0PXjE4LVIMe/f6a4+xxL8HQ3OsAFULOINQi1pE62Aw==
d3-geo@1:
version "1.12.0"
resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-1.12.0.tgz#58ddbdf4d9db5f199db69d1b7c93dca6454a6f24"
integrity sha512-NalZVW+6/SpbKcnl+BCO67m8gX+nGeJdo6oGL9H6BRUGUL1e+AtPcP4vE4TwCQ/gl8y5KE7QvBzrLn+HsKIl+w==
dependencies:
d3-array "1"
d3-hierarchy@1:
version "1.1.9"
resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz#2f6bee24caaea43f8dc37545fa01628559647a83"
integrity sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==
d3-interpolate@1:
version "1.4.0"
resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.4.0.tgz#526e79e2d80daa383f9e0c1c1c7dcc0f0583e987"
integrity sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==
dependencies:
d3-color "1"
d3-path@1:
version "1.0.9"
resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.9.tgz#48c050bb1fe8c262493a8caf5524e3e9591701cf"
integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==
d3-polygon@1:
version "1.0.6"
resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-1.0.6.tgz#0bf8cb8180a6dc107f518ddf7975e12abbfbd38e"
integrity sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==
d3-quadtree@1:
version "1.0.7"
resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-1.0.7.tgz#ca8b84df7bb53763fe3c2f24bd435137f4e53135"
integrity sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==
d3-random@1:
version "1.1.2"
resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-1.1.2.tgz#2833be7c124360bf9e2d3fd4f33847cfe6cab291"
integrity sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==
d3-scale-chromatic@1:
version "1.5.0"
resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz#54e333fc78212f439b14641fb55801dd81135a98"
integrity sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==
dependencies:
d3-color "1"
d3-interpolate "1"
d3-scale@2:
version "2.2.2"
resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-2.2.2.tgz#4e880e0b2745acaaddd3ede26a9e908a9e17b81f"
integrity sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==
dependencies:
d3-array "^1.2.0"
d3-collection "1"
d3-format "1"
d3-interpolate "1"
d3-time "1"
d3-time-format "2"
d3-selection@1, d3-selection@^1.1.0:
version "1.4.1"
resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-1.4.1.tgz#98eedbbe085fbda5bafa2f9e3f3a2f4d7d622a98"
integrity sha512-BTIbRjv/m5rcVTfBs4AMBLKs4x8XaaLkwm28KWu9S2vKNqXkXt2AH2Qf0sdPZHjFxcWg/YL53zcqAz+3g4/7PA==
d3-shape@1:
version "1.3.7"
resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.7.tgz#df63801be07bc986bc54f63789b4fe502992b5d7"
integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==
dependencies:
d3-path "1"
d3-time-format@2:
version "2.2.3"
resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-2.2.3.tgz#0c9a12ee28342b2037e5ea1cf0b9eb4dd75f29cb"
integrity sha512-RAHNnD8+XvC4Zc4d2A56Uw0yJoM7bsvOlJR33bclxq399Rak/b9bhvu/InjxdWhPtkgU53JJcleJTGkNRnN6IA==
dependencies:
d3-time "1"
d3-time@1:
version "1.1.0"
resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-1.1.0.tgz#b1e19d307dae9c900b7e5b25ffc5dcc249a8a0f1"
integrity sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==
d3-timer@1:
version "1.0.10"
resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.10.tgz#dfe76b8a91748831b13b6d9c793ffbd508dd9de5"
integrity sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==
d3-transition@1:
version "1.3.2"
resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-1.3.2.tgz#a98ef2151be8d8600543434c1ca80140ae23b398"
integrity sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==
dependencies:
d3-color "1"
d3-dispatch "1"
d3-ease "1"
d3-interpolate "1"
d3-selection "^1.1.0"
d3-timer "1"
d3-voronoi@1:
version "1.1.4"
resolved "https://registry.yarnpkg.com/d3-voronoi/-/d3-voronoi-1.1.4.tgz#dd3c78d7653d2bb359284ae478645d95944c8297"
integrity sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==
d3-zoom@1:
version "1.8.3"
resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-1.8.3.tgz#b6a3dbe738c7763121cd05b8a7795ffe17f4fc0a"
integrity sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==
dependencies:
d3-dispatch "1"
d3-drag "1"
d3-interpolate "1"
d3-selection "1"
d3-transition "1"
d3@^5.16.0:
version "5.16.0"
resolved "https://registry.yarnpkg.com/d3/-/d3-5.16.0.tgz#9c5e8d3b56403c79d4ed42fbd62f6113f199c877"
integrity sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw==
dependencies:
d3-array "1"
d3-axis "1"
d3-brush "1"
d3-chord "1"
d3-collection "1"
d3-color "1"
d3-contour "1"
d3-dispatch "1"
d3-drag "1"
d3-dsv "1"
d3-ease "1"
d3-fetch "1"
d3-force "1"
d3-format "1"
d3-geo "1"
d3-hierarchy "1"
d3-interpolate "1"
d3-path "1"
d3-polygon "1"
d3-quadtree "1"
d3-random "1"
d3-scale "2"
d3-scale-chromatic "1"
d3-selection "1"
d3-shape "1"
d3-time "1"
d3-time-format "2"
d3-timer "1"
d3-transition "1"
d3-voronoi "1"
d3-zoom "1"
dashdash@^1.12.0:
version "1.14.1"
resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
@ -3487,6 +3779,13 @@ fill-range@^4.0.0:
repeat-string "^1.6.1"
to-regex-range "^2.1.0"
fill-range@^7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
dependencies:
to-regex-range "^5.0.1"
finalhandler@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
@ -3669,6 +3968,11 @@ fsevents@^1.2.7:
bindings "^1.5.0"
nan "^2.12.1"
fsevents@~2.1.2:
version "2.1.3"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e"
integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==
function-bind@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
@ -3733,7 +4037,7 @@ glob-parent@^3.1.0:
is-glob "^3.1.0"
path-dirname "^1.0.0"
glob-parent@^5.0.0:
glob-parent@^5.0.0, glob-parent@~5.1.0:
version "5.1.1"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229"
integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==
@ -3745,7 +4049,7 @@ glob-to-regexp@^0.3.0:
resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab"
integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=
glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4:
glob@^7.0.0, glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4:
version "7.1.6"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
@ -4110,7 +4414,7 @@ human-signals@^1.1.1:
resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3"
integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==
iconv-lite@0.4.24, iconv-lite@^0.4.24:
iconv-lite@0.4, iconv-lite@0.4.24, iconv-lite@^0.4.24:
version "0.4.24"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
@ -4252,6 +4556,11 @@ internal-ip@^4.3.0:
default-gateway "^4.2.0"
ipaddr.js "^1.9.0"
interpret@^1.0.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296"
integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==
invariant@^2.2.2, invariant@^2.2.4:
version "2.2.4"
resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
@ -4325,6 +4634,13 @@ is-binary-path@^1.0.0:
dependencies:
binary-extensions "^1.0.0"
is-binary-path@~2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
dependencies:
binary-extensions "^2.0.0"
is-buffer@^1.1.5:
version "1.1.6"
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
@ -4437,7 +4753,7 @@ is-glob@^3.1.0:
dependencies:
is-extglob "^2.1.0"
is-glob@^4.0.0, is-glob@^4.0.1:
is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
@ -4451,6 +4767,11 @@ is-number@^3.0.0:
dependencies:
kind-of "^3.0.2"
is-number@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
is-obj@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982"
@ -4793,7 +5114,7 @@ loader-utils@^0.2.16:
json5 "^0.5.0"
object-assign "^4.0.1"
loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0:
loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.0, loader-utils@^1.2.3, loader-utils@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613"
integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==
@ -5337,7 +5658,7 @@ normalize-path@^2.1.1:
dependencies:
remove-trailing-separator "^1.0.1"
normalize-path@^3.0.0:
normalize-path@^3.0.0, normalize-path@~3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
@ -5828,6 +6149,11 @@ performance-now@^2.1.0:
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
picomatch@^2.0.4, picomatch@^2.0.7:
version "2.2.2"
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad"
integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==
pify@^2.0.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
@ -6471,6 +6797,20 @@ readdirp@^2.2.1:
micromatch "^3.1.10"
readable-stream "^2.0.2"
readdirp@~3.3.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.3.0.tgz#984458d13a1e42e2e9f5841b129e162f369aff17"
integrity sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==
dependencies:
picomatch "^2.0.7"
rechoir@^0.6.2:
version "0.6.2"
resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384"
integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=
dependencies:
resolve "^1.1.6"
regenerate-unicode-properties@^8.2.0:
version "8.2.0"
resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec"
@ -6656,7 +6996,7 @@ resolve-url@^0.2.1:
resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
resolve@^1.10.0, resolve@^1.12.0, resolve@^1.3.2, resolve@^1.8.1:
resolve@^1.1.6, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.3.2, resolve@^1.8.1:
version "1.17.0"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444"
integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==
@ -6735,6 +7075,11 @@ run-queue@^1.0.0, run-queue@^1.0.3:
dependencies:
aproba "^1.1.1"
rw@1:
version "1.3.3"
resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4"
integrity sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=
rxjs@^6.5.3:
version "6.5.5"
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec"
@ -6764,6 +7109,24 @@ safe-regex@^1.1.0:
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
sass-loader@^8.0.0:
version "8.0.2"
resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-8.0.2.tgz#debecd8c3ce243c76454f2e8290482150380090d"
integrity sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==
dependencies:
clone-deep "^4.0.1"
loader-utils "^1.2.3"
neo-async "^2.6.1"
schema-utils "^2.6.1"
semver "^6.3.0"
sass@^1.19.0:
version "1.26.3"
resolved "https://registry.yarnpkg.com/sass/-/sass-1.26.3.tgz#412df54486143b76b5a65cdf7569e86f44659f46"
integrity sha512-5NMHI1+YFYw4sN3yfKjpLuV9B5l7MqQ6FlkTcC4FT+oHbBRUZoSjHrrt/mE0nFXJyY2kQtU9ou9HxvFVjLFuuw==
dependencies:
chokidar ">=2.0.0 <4.0.0"
sax@~1.2.4:
version "1.2.4"
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
@ -6778,7 +7141,7 @@ schema-utils@^1.0.0:
ajv-errors "^1.0.0"
ajv-keywords "^3.1.0"
schema-utils@^2.0.0, schema-utils@^2.5.0, schema-utils@^2.6.4, schema-utils@^2.6.5:
schema-utils@^2.0.0, schema-utils@^2.5.0, schema-utils@^2.6.1, schema-utils@^2.6.4, schema-utils@^2.6.5:
version "2.6.6"
resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.6.tgz#299fe6bd4a3365dc23d99fd446caff8f1d6c330c"
integrity sha512-wHutF/WPSbIi9x6ctjGGk2Hvl0VOz5l3EKEuKbjPlB30mKZUzb9A5k9yEXRX3pwyqVLPvpfZZEllaFq/M718hA==
@ -6813,6 +7176,11 @@ semver@^6.0.0, semver@^6.1.0, semver@^6.1.2, semver@^6.3.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
semver@^7.1.2:
version "7.3.2"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938"
integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==
send@0.17.1:
version "0.17.1"
resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8"
@ -6898,6 +7266,13 @@ sha.js@^2.4.0, sha.js@^2.4.8:
inherits "^2.0.1"
safe-buffer "^5.0.1"
shallow-clone@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3"
integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==
dependencies:
kind-of "^6.0.2"
shebang-command@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
@ -6927,6 +7302,15 @@ shell-quote@^1.6.1:
resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2"
integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==
shelljs@^0.8.3:
version "0.8.3"
resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.3.tgz#a7f3319520ebf09ee81275b2368adb286659b097"
integrity sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A==
dependencies:
glob "^7.0.0"
interpret "^1.0.0"
rechoir "^0.6.2"
signal-exit@^3.0.0, signal-exit@^3.0.2:
version "3.0.3"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
@ -7544,6 +7928,13 @@ to-regex-range@^2.1.0:
is-number "^3.0.0"
repeat-string "^1.6.1"
to-regex-range@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
dependencies:
is-number "^7.0.0"
to-regex@^3.0.1, to-regex@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
@ -7868,6 +8259,14 @@ vm-browserify@^1.0.1:
resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0"
integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==
vue-cli-plugin-vuetify@^2.0.5:
version "2.0.5"
resolved "https://registry.yarnpkg.com/vue-cli-plugin-vuetify/-/vue-cli-plugin-vuetify-2.0.5.tgz#09ba78928653fc7e3801ea37e5120f957413dda4"
integrity sha512-jtxcidjLT5f1H9QLYKLFjo/ZG42ud4pI9bK3WNO5DXyhiMDMTwSZ7b3NcJVRH7tKYbv5/ty0VPdDGlf4w22AMA==
dependencies:
semver "^7.1.2"
shelljs "^0.8.3"
vue-eslint-parser@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-7.0.0.tgz#a4ed2669f87179dedd06afdd8736acbb3a3864d6"
@ -7922,6 +8321,18 @@ vue@^2.6.11:
resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.11.tgz#76594d877d4b12234406e84e35275c6d514125c5"
integrity sha512-VfPwgcGABbGAue9+sfrD4PuwFar7gPb1yl1UK1MwXoQPAw0BKSqWfoYCT/ThFrdEVWoI51dBuyCoiNU9bZDZxQ==
vuetify-loader@^1.3.0:
version "1.4.3"
resolved "https://registry.yarnpkg.com/vuetify-loader/-/vuetify-loader-1.4.3.tgz#df1323c558be09890877e5fbe817b3a71a6c538d"
integrity sha512-fS0wRil682Ebsj2as+eruBoMPKaQYDhu/fDAndnTItzSY4RK4LOEIsssVL4vD6QY8dvUgoGL84SUQ6vGr777CA==
dependencies:
loader-utils "^1.2.0"
vuetify@^2.2.11:
version "2.2.23"
resolved "https://registry.yarnpkg.com/vuetify/-/vuetify-2.2.23.tgz#9529094425e710d7534e95e41302c7d7d6ea5d8e"
integrity sha512-VZ0kBLXH7KsVj8dKLz0X1MFvbyf1kOPwh0jXa6M/gKqKkWsEAnwNXpM/H5EMOKDp2H6fjwI1yGAZO0GTpQHoXg==
watchpack@^1.6.1:
version "1.6.1"
resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.1.tgz#280da0a8718592174010c078c7585a74cd8cd0e2"