diff --git a/.github/workflows/deploy-spaces.yml b/.github/workflows/deploy-spaces.yml
index 7adb3b55f1..f1c4b32519 100644
--- a/.github/workflows/deploy-spaces.yml
+++ b/.github/workflows/deploy-spaces.yml
@@ -19,6 +19,11 @@ jobs:
uses: pnpm/action-setup@v2.2.2
with:
version: 7
+ - uses: actions/setup-node@v3
+ with:
+ node-version: 16
+ cache: pnpm
+ cache-dependency-path: ui/pnpm-lock.yaml
- name: Install pip
run: python -m pip install build requests
- name: Get PR Number
@@ -33,11 +38,13 @@ jobs:
export AWS_DEFAULT_REGION=us-east-1
echo ${{ env.GRADIO_VERSION }} > gradio/version.txt
cd ui
- pnpm i
+ pnpm i --frozen-lockfile
pnpm build
cd ..
python3 -m build -w
aws s3 cp dist/gradio-${{ env.GRADIO_VERSION }}-py3-none-any.whl s3://gradio-builds/${{ github.sha }}/
+ env:
+ NODE_OPTIONS: --max_old_space_size=8192
- name: Install Hub Client Library
run: pip install huggingface-hub
- name: Set up Demos
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 03e390474b..2a5d3bd5d6 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,7 +2,38 @@
## New Features:
-### Set the color of a Label component with a function
+### Support for altair plots
+
+The `Plot` component can now accept altair plots as values!
+Simply return an altair plot from your event listener and gradio will display it in the front-end.
+See the example below:
+
+```python
+import gradio as gr
+import altair as alt
+from vega_datasets import data
+
+cars = data.cars()
+chart = (
+ alt.Chart(cars)
+ .mark_point()
+ .encode(
+ x="Horsepower",
+ y="Miles_per_Gallon",
+ color="Origin",
+ )
+)
+
+with gr.Blocks() as demo:
+ gr.Plot(value=chart)
+demo.launch()
+```
+
+
+
+By [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2741](https://github.com/gradio-app/gradio/pull/2741)
+
+### Set the background color of a Label component
The `Label` component now accepts a `color` argument by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 2736](https://github.com/gradio-app/gradio/pull/2736).
The `color` argument should either be a valid css color name or hexadecimal string.
diff --git a/demo/altair_plot/requirements.txt b/demo/altair_plot/requirements.txt
new file mode 100644
index 0000000000..5a45a80196
--- /dev/null
+++ b/demo/altair_plot/requirements.txt
@@ -0,0 +1,2 @@
+altair
+vega_datasets
\ No newline at end of file
diff --git a/demo/altair_plot/run.ipynb b/demo/altair_plot/run.ipynb
new file mode 100644
index 0000000000..d98c209bd0
--- /dev/null
+++ b/demo/altair_plot/run.ipynb
@@ -0,0 +1 @@
+{"cells": [{"cell_type": "markdown", "id": 302934307671667531413257853548643485645, "metadata": {}, "source": ["# Gradio Demo: altair_plot"]}, {"cell_type": "code", "execution_count": null, "id": 272996653310673477252411125948039410165, "metadata": {}, "outputs": [], "source": ["!pip install -q gradio altair vega_datasets"]}, {"cell_type": "code", "execution_count": null, "id": 288918539441861185822528903084949547379, "metadata": {}, "outputs": [], "source": ["import altair as alt\n", "import gradio as gr\n", "import numpy as np\n", "import pandas as pd\n", "from vega_datasets import data\n", "\n", "\n", "def make_plot(plot_type):\n", " if plot_type == \"scatter_plot\":\n", " cars = data.cars()\n", " return alt.Chart(cars).mark_point().encode(\n", " x='Horsepower',\n", " y='Miles_per_Gallon',\n", " color='Origin',\n", " )\n", " elif plot_type == \"heatmap\":\n", " # Compute x^2 + y^2 across a 2D grid\n", " x, y = np.meshgrid(range(-5, 5), range(-5, 5))\n", " z = x ** 2 + y ** 2\n", "\n", " # Convert this grid to columnar data expected by Altair\n", " source = pd.DataFrame({'x': x.ravel(),\n", " 'y': y.ravel(),\n", " 'z': z.ravel()})\n", " return alt.Chart(source).mark_rect().encode(\n", " x='x:O',\n", " y='y:O',\n", " color='z:Q'\n", " )\n", " elif plot_type == \"us_map\":\n", " states = alt.topo_feature(data.us_10m.url, 'states')\n", " source = data.income.url\n", "\n", " return alt.Chart(source).mark_geoshape().encode(\n", " shape='geo:G',\n", " color='pct:Q',\n", " tooltip=['name:N', 'pct:Q'],\n", " facet=alt.Facet('group:N', columns=2),\n", " ).transform_lookup(\n", " lookup='id',\n", " from_=alt.LookupData(data=states, key='id'),\n", " as_='geo'\n", " ).properties(\n", " width=300,\n", " height=175,\n", " ).project(\n", " type='albersUsa'\n", " )\n", " elif plot_type == \"interactive_barplot\":\n", " source = data.movies.url\n", "\n", " pts = alt.selection(type=\"single\", encodings=['x'])\n", "\n", " rect = alt.Chart(data.movies.url).mark_rect().encode(\n", " alt.X('IMDB_Rating:Q', bin=True),\n", " alt.Y('Rotten_Tomatoes_Rating:Q', bin=True),\n", " alt.Color('count()',\n", " scale=alt.Scale(scheme='greenblue'),\n", " legend=alt.Legend(title='Total Records')\n", " )\n", " )\n", "\n", " circ = rect.mark_point().encode(\n", " alt.ColorValue('grey'),\n", " alt.Size('count()',\n", " legend=alt.Legend(title='Records in Selection')\n", " )\n", " ).transform_filter(\n", " pts\n", " )\n", "\n", " bar = alt.Chart(source).mark_bar().encode(\n", " x='Major_Genre:N',\n", " y='count()',\n", " color=alt.condition(pts, alt.ColorValue(\"steelblue\"), alt.ColorValue(\"grey\"))\n", " ).properties(\n", " width=550,\n", " height=200\n", " ).add_selection(pts)\n", "\n", " plot = alt.vconcat(\n", " rect + circ,\n", " bar\n", " ).resolve_legend(\n", " color=\"independent\",\n", " size=\"independent\"\n", " )\n", " return plot\n", " elif plot_type == \"radial\":\n", " source = pd.DataFrame({\"values\": [12, 23, 47, 6, 52, 19]})\n", "\n", " base = alt.Chart(source).encode(\n", " theta=alt.Theta(\"values:Q\", stack=True),\n", " radius=alt.Radius(\"values\", scale=alt.Scale(type=\"sqrt\", zero=True, rangeMin=20)),\n", " color=\"values:N\",\n", " )\n", "\n", " c1 = base.mark_arc(innerRadius=20, stroke=\"#fff\")\n", "\n", " c2 = base.mark_text(radiusOffset=10).encode(text=\"values:Q\")\n", "\n", " return c1 + c2\n", " elif plot_type == \"multiline\":\n", " source = data.stocks()\n", "\n", " highlight = alt.selection(type='single', on='mouseover',\n", " fields=['symbol'], nearest=True)\n", "\n", " base = alt.Chart(source).encode(\n", " x='date:T',\n", " y='price:Q',\n", " color='symbol:N'\n", " )\n", "\n", " points = base.mark_circle().encode(\n", " opacity=alt.value(0)\n", " ).add_selection(\n", " highlight\n", " ).properties(\n", " width=600\n", " )\n", "\n", " lines = base.mark_line().encode(\n", " size=alt.condition(~highlight, alt.value(1), alt.value(3))\n", " )\n", "\n", " return points + lines\n", "\n", "\n", "with gr.Blocks() as demo:\n", " button = gr.Radio(label=\"Plot type\",\n", " choices=['scatter_plot', 'heatmap', 'us_map',\n", " 'interactive_barplot', \"radial\", \"multiline\"], value='scatter_plot')\n", " plot = gr.Plot(label=\"Plot\")\n", " button.change(make_plot, inputs=button, outputs=[plot])\n", " demo.load(make_plot, inputs=[button], outputs=[plot])\n", "\n", "\n", "if __name__ == \"__main__\":\n", " demo.launch()\n"]}], "metadata": {}, "nbformat": 4, "nbformat_minor": 5}
\ No newline at end of file
diff --git a/demo/altair_plot/run.py b/demo/altair_plot/run.py
new file mode 100644
index 0000000000..2fd137fae7
--- /dev/null
+++ b/demo/altair_plot/run.py
@@ -0,0 +1,140 @@
+import altair as alt
+import gradio as gr
+import numpy as np
+import pandas as pd
+from vega_datasets import data
+
+
+def make_plot(plot_type):
+ if plot_type == "scatter_plot":
+ cars = data.cars()
+ return alt.Chart(cars).mark_point().encode(
+ x='Horsepower',
+ y='Miles_per_Gallon',
+ color='Origin',
+ )
+ elif plot_type == "heatmap":
+ # Compute x^2 + y^2 across a 2D grid
+ x, y = np.meshgrid(range(-5, 5), range(-5, 5))
+ z = x ** 2 + y ** 2
+
+ # Convert this grid to columnar data expected by Altair
+ source = pd.DataFrame({'x': x.ravel(),
+ 'y': y.ravel(),
+ 'z': z.ravel()})
+ return alt.Chart(source).mark_rect().encode(
+ x='x:O',
+ y='y:O',
+ color='z:Q'
+ )
+ elif plot_type == "us_map":
+ states = alt.topo_feature(data.us_10m.url, 'states')
+ source = data.income.url
+
+ return alt.Chart(source).mark_geoshape().encode(
+ shape='geo:G',
+ color='pct:Q',
+ tooltip=['name:N', 'pct:Q'],
+ facet=alt.Facet('group:N', columns=2),
+ ).transform_lookup(
+ lookup='id',
+ from_=alt.LookupData(data=states, key='id'),
+ as_='geo'
+ ).properties(
+ width=300,
+ height=175,
+ ).project(
+ type='albersUsa'
+ )
+ elif plot_type == "interactive_barplot":
+ source = data.movies.url
+
+ pts = alt.selection(type="single", encodings=['x'])
+
+ rect = alt.Chart(data.movies.url).mark_rect().encode(
+ alt.X('IMDB_Rating:Q', bin=True),
+ alt.Y('Rotten_Tomatoes_Rating:Q', bin=True),
+ alt.Color('count()',
+ scale=alt.Scale(scheme='greenblue'),
+ legend=alt.Legend(title='Total Records')
+ )
+ )
+
+ circ = rect.mark_point().encode(
+ alt.ColorValue('grey'),
+ alt.Size('count()',
+ legend=alt.Legend(title='Records in Selection')
+ )
+ ).transform_filter(
+ pts
+ )
+
+ bar = alt.Chart(source).mark_bar().encode(
+ x='Major_Genre:N',
+ y='count()',
+ color=alt.condition(pts, alt.ColorValue("steelblue"), alt.ColorValue("grey"))
+ ).properties(
+ width=550,
+ height=200
+ ).add_selection(pts)
+
+ plot = alt.vconcat(
+ rect + circ,
+ bar
+ ).resolve_legend(
+ color="independent",
+ size="independent"
+ )
+ return plot
+ elif plot_type == "radial":
+ source = pd.DataFrame({"values": [12, 23, 47, 6, 52, 19]})
+
+ base = alt.Chart(source).encode(
+ theta=alt.Theta("values:Q", stack=True),
+ radius=alt.Radius("values", scale=alt.Scale(type="sqrt", zero=True, rangeMin=20)),
+ color="values:N",
+ )
+
+ c1 = base.mark_arc(innerRadius=20, stroke="#fff")
+
+ c2 = base.mark_text(radiusOffset=10).encode(text="values:Q")
+
+ return c1 + c2
+ elif plot_type == "multiline":
+ source = data.stocks()
+
+ highlight = alt.selection(type='single', on='mouseover',
+ fields=['symbol'], nearest=True)
+
+ base = alt.Chart(source).encode(
+ x='date:T',
+ y='price:Q',
+ color='symbol:N'
+ )
+
+ points = base.mark_circle().encode(
+ opacity=alt.value(0)
+ ).add_selection(
+ highlight
+ ).properties(
+ width=600
+ )
+
+ lines = base.mark_line().encode(
+ size=alt.condition(~highlight, alt.value(1), alt.value(3))
+ )
+
+ return points + lines
+
+
+with gr.Blocks() as demo:
+ button = gr.Radio(label="Plot type",
+ choices=['scatter_plot', 'heatmap', 'us_map',
+ 'interactive_barplot', "radial", "multiline"], value='scatter_plot')
+ plot = gr.Plot(label="Plot")
+ button.change(make_plot, inputs=button, outputs=[plot])
+ demo.load(make_plot, inputs=[button], outputs=[plot])
+
+
+if __name__ == "__main__":
+ demo.launch()
diff --git a/demo/outbreak_forecast/requirements.txt b/demo/outbreak_forecast/requirements.txt
index aad0724c8d..5615a533fc 100644
--- a/demo/outbreak_forecast/requirements.txt
+++ b/demo/outbreak_forecast/requirements.txt
@@ -1,4 +1,5 @@
numpy
matplotlib
bokeh
-plotly
\ No newline at end of file
+plotly
+altair
\ No newline at end of file
diff --git a/demo/outbreak_forecast/run.ipynb b/demo/outbreak_forecast/run.ipynb
index 41e991d6d3..816159e1e2 100644
--- a/demo/outbreak_forecast/run.ipynb
+++ b/demo/outbreak_forecast/run.ipynb
@@ -1 +1 @@
-{"cells": [{"cell_type": "markdown", "id": 302934307671667531413257853548643485645, "metadata": {}, "source": ["# Gradio Demo: outbreak_forecast\n", "### Generate a plot based on 5 inputs.\n", " "]}, {"cell_type": "code", "execution_count": null, "id": 272996653310673477252411125948039410165, "metadata": {}, "outputs": [], "source": ["!pip install -q gradio numpy matplotlib bokeh plotly"]}, {"cell_type": "code", "execution_count": null, "id": 288918539441861185822528903084949547379, "metadata": {}, "outputs": [], "source": ["import gradio as gr\n", "from math import sqrt\n", "import matplotlib\n", "\n", "matplotlib.use(\"Agg\")\n", "\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import plotly.express as px\n", "import pandas as pd\n", "\n", "\n", "def outbreak(plot_type, r, month, countries, social_distancing):\n", " months = [\"January\", \"February\", \"March\", \"April\", \"May\"]\n", " m = months.index(month)\n", " start_day = 30 * m\n", " final_day = 30 * (m + 1)\n", " x = np.arange(start_day, final_day + 1)\n", " pop_count = {\"USA\": 350, \"Canada\": 40, \"Mexico\": 300, \"UK\": 120}\n", " if social_distancing:\n", " r = sqrt(r)\n", " df = pd.DataFrame({\"day\": x})\n", " for country in countries:\n", " df[country] = x ** (r) * (pop_count[country] + 1)\n", "\n", " if plot_type == \"Matplotlib\":\n", " fig = plt.figure()\n", " plt.plot(df[\"day\"], df[countries].to_numpy())\n", " plt.title(\"Outbreak in \" + month)\n", " plt.ylabel(\"Cases\")\n", " plt.xlabel(\"Days since Day 0\")\n", " plt.legend(countries)\n", " return fig\n", " elif plot_type == \"Plotly\":\n", " fig = px.line(df, x=\"day\", y=countries)\n", " fig.update_layout(\n", " title=\"Outbreak in \" + month,\n", " xaxis_title=\"Cases\",\n", " yaxis_title=\"Days Since Day 0\",\n", " )\n", " return fig\n", " else:\n", " raise ValueError(\"A plot type must be selected\")\n", "\n", "\n", "inputs = [\n", " gr.Dropdown([\"Matplotlib\", \"Plotly\"], label=\"Plot Type\"),\n", " gr.Slider(1, 4, 3.2, label=\"R\"),\n", " gr.Dropdown([\"January\", \"February\", \"March\", \"April\", \"May\"], label=\"Month\"),\n", " gr.CheckboxGroup(\n", " [\"USA\", \"Canada\", \"Mexico\", \"UK\"], label=\"Countries\", value=[\"USA\", \"Canada\"]\n", " ),\n", " gr.Checkbox(label=\"Social Distancing?\"),\n", "]\n", "outputs = gr.Plot()\n", "\n", "demo = gr.Interface(\n", " fn=outbreak,\n", " inputs=inputs,\n", " outputs=outputs,\n", " examples=[\n", " [\"Matplotlib\", 2, \"March\", [\"Mexico\", \"UK\"], True],\n", " [\"Plotly\", 3.6, \"February\", [\"Canada\", \"Mexico\", \"UK\"], False],\n", " ],\n", " cache_examples=True,\n", ")\n", "\n", "if __name__ == \"__main__\":\n", " demo.launch()\n"]}], "metadata": {}, "nbformat": 4, "nbformat_minor": 5}
\ No newline at end of file
+{"cells": [{"cell_type": "markdown", "id": 302934307671667531413257853548643485645, "metadata": {}, "source": ["# Gradio Demo: outbreak_forecast\n", "### Generate a plot based on 5 inputs.\n", " "]}, {"cell_type": "code", "execution_count": null, "id": 272996653310673477252411125948039410165, "metadata": {}, "outputs": [], "source": ["!pip install -q gradio numpy matplotlib bokeh plotly altair"]}, {"cell_type": "code", "execution_count": null, "id": 288918539441861185822528903084949547379, "metadata": {}, "outputs": [], "source": ["import altair\n", "\n", "import gradio as gr\n", "from math import sqrt\n", "import matplotlib\n", "\n", "matplotlib.use(\"Agg\")\n", "\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import plotly.express as px\n", "import pandas as pd\n", "\n", "\n", "def outbreak(plot_type, r, month, countries, social_distancing):\n", " months = [\"January\", \"February\", \"March\", \"April\", \"May\"]\n", " m = months.index(month)\n", " start_day = 30 * m\n", " final_day = 30 * (m + 1)\n", " x = np.arange(start_day, final_day + 1)\n", " pop_count = {\"USA\": 350, \"Canada\": 40, \"Mexico\": 300, \"UK\": 120}\n", " if social_distancing:\n", " r = sqrt(r)\n", " df = pd.DataFrame({\"day\": x})\n", " for country in countries:\n", " df[country] = x ** (r) * (pop_count[country] + 1)\n", "\n", " if plot_type == \"Matplotlib\":\n", " fig = plt.figure()\n", " plt.plot(df[\"day\"], df[countries].to_numpy())\n", " plt.title(\"Outbreak in \" + month)\n", " plt.ylabel(\"Cases\")\n", " plt.xlabel(\"Days since Day 0\")\n", " plt.legend(countries)\n", " return fig\n", " elif plot_type == \"Plotly\":\n", " fig = px.line(df, x=\"day\", y=countries)\n", " fig.update_layout(\n", " title=\"Outbreak in \" + month,\n", " xaxis_title=\"Cases\",\n", " yaxis_title=\"Days Since Day 0\",\n", " )\n", " return fig\n", " elif plot_type == \"Altair\":\n", " df = df.melt(id_vars=\"day\").rename(columns={\"variable\": \"country\"})\n", " fig = altair.Chart(df).mark_line().encode(x=\"day\", y='value', color='country')\n", " return fig\n", " else:\n", " raise ValueError(\"A plot type must be selected\")\n", "\n", "\n", "inputs = [\n", " gr.Dropdown([\"Matplotlib\", \"Plotly\", \"Altair\"], label=\"Plot Type\"),\n", " gr.Slider(1, 4, 3.2, label=\"R\"),\n", " gr.Dropdown([\"January\", \"February\", \"March\", \"April\", \"May\"], label=\"Month\"),\n", " gr.CheckboxGroup(\n", " [\"USA\", \"Canada\", \"Mexico\", \"UK\"], label=\"Countries\", value=[\"USA\", \"Canada\"]\n", " ),\n", " gr.Checkbox(label=\"Social Distancing?\"),\n", "]\n", "outputs = gr.Plot()\n", "\n", "demo = gr.Interface(\n", " fn=outbreak,\n", " inputs=inputs,\n", " outputs=outputs,\n", " examples=[\n", " [\"Matplotlib\", 2, \"March\", [\"Mexico\", \"UK\"], True],\n", " [\"Altair\", 2, \"March\", [\"Mexico\", \"Canada\"], True],\n", " [\"Plotly\", 3.6, \"February\", [\"Canada\", \"Mexico\", \"UK\"], False],\n", " ],\n", " cache_examples=True,\n", ")\n", "\n", "if __name__ == \"__main__\":\n", " demo.launch()\n"]}], "metadata": {}, "nbformat": 4, "nbformat_minor": 5}
\ No newline at end of file
diff --git a/demo/outbreak_forecast/run.py b/demo/outbreak_forecast/run.py
index 1f96759c80..2d0101de67 100644
--- a/demo/outbreak_forecast/run.py
+++ b/demo/outbreak_forecast/run.py
@@ -1,3 +1,5 @@
+import altair
+
import gradio as gr
from math import sqrt
import matplotlib
@@ -39,12 +41,16 @@ def outbreak(plot_type, r, month, countries, social_distancing):
yaxis_title="Days Since Day 0",
)
return fig
+ elif plot_type == "Altair":
+ df = df.melt(id_vars="day").rename(columns={"variable": "country"})
+ fig = altair.Chart(df).mark_line().encode(x="day", y='value', color='country')
+ return fig
else:
raise ValueError("A plot type must be selected")
inputs = [
- gr.Dropdown(["Matplotlib", "Plotly"], label="Plot Type"),
+ gr.Dropdown(["Matplotlib", "Plotly", "Altair"], label="Plot Type"),
gr.Slider(1, 4, 3.2, label="R"),
gr.Dropdown(["January", "February", "March", "April", "May"], label="Month"),
gr.CheckboxGroup(
@@ -60,6 +66,7 @@ demo = gr.Interface(
outputs=outputs,
examples=[
["Matplotlib", 2, "March", ["Mexico", "UK"], True],
+ ["Altair", 2, "March", ["Mexico", "Canada"], True],
["Plotly", 3.6, "February", ["Canada", "Mexico", "UK"], False],
],
cache_examples=True,
diff --git a/gradio/components.py b/gradio/components.py
index 3de6ea9eba..b6b7938595 100644
--- a/gradio/components.py
+++ b/gradio/components.py
@@ -3862,7 +3862,7 @@ class Plot(Changeable, Clearable, IOComponent, JSONSerializable):
Preprocessing: this component does *not* accept input.
Postprocessing: expects either a {matplotlib.figure.Figure}, a {plotly.graph_objects._figure.Figure}, or a {dict} corresponding to a bokeh plot (json_item format)
- Demos: outbreak_forecast, blocks_kinematics, stock_forecast, map_airbnb
+ Demos: altair_plot, outbreak_forecast, blocks_kinematics, stock_forecast, map_airbnb
Guides: plot_component_for_maps
"""
@@ -3878,7 +3878,7 @@ class Plot(Changeable, Clearable, IOComponent, JSONSerializable):
):
"""
Parameters:
- value: Optionally, supply a default plot object to display, must be a matplotlib, plotly, or bokeh figure. If callable, the function will be called whenever the app loads to set the initial value of the component.
+ value: Optionally, supply a default plot object to display, must be a matplotlib, plotly, altair, or bokeh figure. If callable, the function will be called whenever the app loads to set the initial value of the component.
label: component name in interface.
show_label: if True, will display label.
visible: If False, component will be hidden.
@@ -3929,7 +3929,11 @@ class Plot(Changeable, Clearable, IOComponent, JSONSerializable):
dtype = "bokeh"
out_y = json.dumps(y)
else:
- dtype = "plotly"
+ is_altair = "altair" in y.__module__
+ if is_altair:
+ dtype = "altair"
+ else:
+ dtype = "plotly"
out_y = y.to_json()
return {"type": dtype, "plot": out_y}
diff --git a/scripts/copy_demos.py b/scripts/copy_demos.py
index 2dd5870372..efd59cd494 100644
--- a/scripts/copy_demos.py
+++ b/scripts/copy_demos.py
@@ -8,6 +8,7 @@ import argparse
def copy_all_demos(source_dir: str, dest_dir: str):
demos_to_copy = [
"audio_debugger",
+ "altair_plot",
"blocks_essay",
"blocks_js_methods",
"blocks_layout",
@@ -64,5 +65,7 @@ if __name__ == "__main__":
opencv-python==4.6.0.66
transformers==4.21.1
torch==1.12.1
+ altair
+ vega_datasets
"""
open(reqs_file_path, "w").write(textwrap.dedent(requirements))
diff --git a/test/requirements.in b/test/requirements.in
index 3c10728b70..6b035924cc 100644
--- a/test/requirements.in
+++ b/test/requirements.in
@@ -19,4 +19,6 @@ flake8
httpx
pydantic
respx
-fastapi>=0.87.0
\ No newline at end of file
+fastapi>=0.87.0
+altair
+vega_datasets
\ No newline at end of file
diff --git a/test/requirements.txt b/test/requirements.txt
index b19aca909a..a891b4af92 100644
--- a/test/requirements.txt
+++ b/test/requirements.txt
@@ -6,6 +6,8 @@
#
alembic==1.8.1
# via mlflow
+altair==4.2.0
+ # via -r requirements.in
anyio==3.6.1
# via
# httpcore
@@ -61,7 +63,9 @@ docker-pycreds==0.4.0
dulwich==0.20.45
# via comet-ml
entrypoints==0.4
- # via mlflow
+ # via
+ # altair
+ # mlflow
everett[ini]==3.0.0
# via comet-ml
fastapi==0.87.0
@@ -123,11 +127,15 @@ itsdangerous==2.1.2
jedi==0.18.1
# via ipython
jinja2==3.1.2
- # via flask
+ # via
+ # altair
+ # flask
joblib==1.1.0
# via scikit-learn
jsonschema==4.7.2
- # via comet-ml
+ # via
+ # altair
+ # comet-ml
llvmlite==0.38.1
# via numba
mako==1.2.1
@@ -150,6 +158,7 @@ numba==0.55.2
# via shap
numpy==1.21.6
# via
+ # altair
# imageio
# mlflow
# numba
@@ -175,8 +184,10 @@ packaging==21.3
# transformers
pandas==1.3.5
# via
+ # altair
# mlflow
# shap
+ # vega-datasets
parso==0.8.3
# via jedi
pathspec==0.9.0
@@ -334,6 +345,8 @@ tomli==2.0.1
# black
# coverage
# pytest
+toolz==0.12.0
+ # via altair
torch==1.12.0
# via -r requirements.in
tqdm==4.64.0
@@ -359,6 +372,8 @@ urllib3==1.26.10
# dulwich
# requests
# sentry-sdk
+vega-datasets==0.9.0
+ # via -r requirements.in
wandb==0.12.21
# via -r requirements.in
wcwidth==0.2.5
diff --git a/test/test_components.py b/test/test_components.py
index 104a865dff..1bb3676ab2 100644
--- a/test/test_components.py
+++ b/test/test_components.py
@@ -688,6 +688,24 @@ class TestPlot:
component = gr.Plot(None)
assert component.get_config().get("value") is None
+ def test_postprocess_altair(self):
+ import altair as alt
+ from vega_datasets import data
+
+ cars = data.cars()
+ chart = (
+ alt.Chart(cars)
+ .mark_point()
+ .encode(
+ x="Horsepower",
+ y="Miles_per_Gallon",
+ color="Origin",
+ )
+ )
+ out = gr.Plot().postprocess(chart)
+ assert isinstance(out["plot"], str)
+ assert out["plot"] == chart.to_json()
+
class TestAudio:
def test_component_functions(self):
diff --git a/ui/packages/app/package.json b/ui/packages/app/package.json
index 981b47f7dc..0a822b624f 100644
--- a/ui/packages/app/package.json
+++ b/ui/packages/app/package.json
@@ -40,6 +40,7 @@
"@gradio/video": "workspace:^0.0.1",
"d3-dsv": "^3.0.1",
"mime-types": "^2.1.34",
+ "svelte": "^3.25.1",
"svelte-i18n": "^3.3.13"
}
}
diff --git a/ui/packages/plot/package.json b/ui/packages/plot/package.json
index 511b6aa333..2c9d2fa155 100644
--- a/ui/packages/plot/package.json
+++ b/ui/packages/plot/package.json
@@ -10,6 +10,10 @@
"dependencies": {
"@gradio/icons": "workspace:^0.0.1",
"@gradio/utils": "workspace:^0.0.1",
- "plotly.js-dist-min": "^2.10.1"
+ "@rollup/plugin-json": "^5.0.2",
+ "plotly.js-dist-min": "^2.10.1",
+ "svelte-vega": "^1.2.0",
+ "vega": ">=5.21.0 <6.0.0",
+ "vega-lite": "*"
}
}
diff --git a/ui/packages/plot/src/Plot.svelte b/ui/packages/plot/src/Plot.svelte
index d820a81771..774cc50648 100644
--- a/ui/packages/plot/src/Plot.svelte
+++ b/ui/packages/plot/src/Plot.svelte
@@ -2,14 +2,21 @@
//@ts-nocheck
import Plotly from "plotly.js-dist-min";
import { Plot as PlotIcon } from "@gradio/icons";
+ import { Vega } from "svelte-vega";
import { afterUpdate, onDestroy } from "svelte";
export let value;
export let target;
+ let spec = null;
+
+ $: if(value && value['type'] == "altair") {
+ spec = JSON.parse(value['plot'])
+ }
+
// Plotly
- let plotDiv;
+ let plotDiv;
let plotlyGlobalStyle;
const main_src = "https://cdn.bokeh.org/bokeh/release/bokeh-2.4.2.min.js";
@@ -109,6 +116,10 @@
{:else if value && value["type"] == "bokeh"}
+{:else if value && value['type'] == "altair"}
+
+
+
{:else if value && value["type"] == "matplotlib"}
diff --git a/ui/packages/workbench/package.json b/ui/packages/workbench/package.json
index 2cf2ed38c5..e0f01cf624 100644
--- a/ui/packages/workbench/package.json
+++ b/ui/packages/workbench/package.json
@@ -42,7 +42,8 @@
"@gradio/tabs": "workspace:^0.0.1",
"@gradio/theme": "workspace:^0.0.1",
"@gradio/upload": "workspace:^0.0.1",
+ "@gradio/uploadbutton": "workspace:^0.0.1",
"@gradio/video": "workspace:^0.0.1",
- "@gradio/uploadbutton": "workspace:^0.0.1"
+ "svelte": ">=3.44.0 <4.0.0"
}
}
diff --git a/ui/pnpm-lock.yaml b/ui/pnpm-lock.yaml
index fb92474e29..a156ee1631 100644
--- a/ui/pnpm-lock.yaml
+++ b/ui/pnpm-lock.yaml
@@ -1,4 +1,4 @@
-lockfileVersion: 5.3
+lockfileVersion: 5.4
importers:
@@ -43,7 +43,7 @@ importers:
'@tailwindcss/forms': 0.5.0_tailwindcss@3.1.6
'@testing-library/dom': 8.11.3
'@testing-library/svelte': 3.1.0_svelte@3.49.0
- '@testing-library/user-event': 13.5.0_@testing-library+dom@8.11.3
+ '@testing-library/user-event': 13.5.0_gzufz4q333be4gqfrvipwvqt6a
autoprefixer: 10.4.4_postcss@8.4.6
babylonjs: 5.18.0
babylonjs-loaders: 5.18.0
@@ -56,13 +56,13 @@ importers:
postcss: 8.4.6
postcss-nested: 5.0.6_postcss@8.4.6
prettier: 2.6.2
- prettier-plugin-svelte: 2.7.0_prettier@2.6.2+svelte@3.49.0
+ prettier-plugin-svelte: 2.7.0_3cyj5wbackxvw67rnaarcmbw7y
sirv: 2.0.2
sirv-cli: 2.0.2
svelte: 3.49.0
- svelte-check: 2.8.0_postcss@8.4.6+svelte@3.49.0
+ svelte-check: 2.8.0_mgmdnb6x5rpawk37gozc2sbtta
svelte-i18n: 3.3.13_svelte@3.49.0
- svelte-preprocess: 4.10.6_62d50a01257de5eec5be08cad9d3ed66
+ svelte-preprocess: 4.10.6_mlkquajfpxs65rn6bdfntu7nmy
tailwindcss: 3.1.6
tinyspy: 0.3.0
typescript: 4.7.4
@@ -105,6 +105,7 @@ importers:
'@gradio/video': workspace:^0.0.1
d3-dsv: ^3.0.1
mime-types: ^2.1.34
+ svelte: ^3.25.1
svelte-i18n: ^3.3.13
dependencies:
'@gradio/atoms': link:../atoms
@@ -133,6 +134,7 @@ importers:
'@gradio/video': link:../video
d3-dsv: 3.0.1
mime-types: 2.1.34
+ svelte: 3.49.0
svelte-i18n: 3.3.13_svelte@3.49.0
packages/atoms:
@@ -279,11 +281,19 @@ importers:
specifiers:
'@gradio/icons': workspace:^0.0.1
'@gradio/utils': workspace:^0.0.1
+ '@rollup/plugin-json': ^5.0.2
plotly.js-dist-min: ^2.10.1
+ svelte-vega: ^1.2.0
+ vega: '>=5.21.0 <6.0.0'
+ vega-lite: '*'
dependencies:
'@gradio/icons': link:../icons
'@gradio/utils': link:../utils
+ '@rollup/plugin-json': 5.0.2
plotly.js-dist-min: 2.11.1
+ svelte-vega: 1.2.0_36sthfwhgi34qytpvkzggbhnle
+ vega: 5.22.1
+ vega-lite: 5.6.0_vega@5.22.1
packages/table:
specifiers:
@@ -372,6 +382,7 @@ importers:
autoprefixer: ^10.4.2
postcss: ^8.4.5
postcss-load-config: ^3.1.1
+ svelte: '>=3.44.0 <4.0.0'
svelte-check: ^2.2.6
svelte-preprocess: ^4.10.1
tailwindcss: ^3.0.12
@@ -400,14 +411,15 @@ importers:
'@gradio/upload': link:../upload
'@gradio/uploadbutton': link:../upload-button
'@gradio/video': link:../video
+ svelte: 3.49.0
devDependencies:
- '@sveltejs/adapter-auto': 1.0.0-next.89
+ '@sveltejs/adapter-auto': 1.0.0-next.90
'@sveltejs/kit': 1.0.0-next.318_svelte@3.49.0
autoprefixer: 10.4.2_postcss@8.4.6
postcss: 8.4.6
postcss-load-config: 3.1.1
- svelte-check: 2.4.1_736abba5ed1eb6f8ecf70b1d49ead14b
- svelte-preprocess: 4.10.2_d50790bb30dd88cc44babe7efa52bace
+ svelte-check: 2.4.1_onvlxjpnd23pr3hxbmout2wrjm
+ svelte-preprocess: 4.10.2_2udzbozq3wemyrf2xz7puuv2zy
tailwindcss: 3.0.23_autoprefixer@10.4.2
tslib: 2.3.1
typescript: 4.5.5
@@ -546,6 +558,18 @@ packages:
resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==}
dev: false
+ /@rollup/plugin-json/5.0.2:
+ resolution: {integrity: sha512-D1CoOT2wPvadWLhVcmpkDnesTzjhNIQRWLsc3fA49IFOP2Y84cFOOJ+nKGYedvXHKUsPeq07HR4hXpBBr+CHlA==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ rollup: ^1.20.0||^2.0.0||^3.0.0
+ peerDependenciesMeta:
+ rollup:
+ optional: true
+ dependencies:
+ '@rollup/pluginutils': 5.0.2
+ dev: false
+
/@rollup/pluginutils/4.2.1:
resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==}
engines: {node: '>= 8.0.0'}
@@ -553,10 +577,24 @@ packages:
estree-walker: 2.0.2
picomatch: 2.3.1
- /@sveltejs/adapter-auto/1.0.0-next.89:
- resolution: {integrity: sha512-S+sASFX4sSZD1xEKmZ3zHxQh2DGxXBUpCGAtUakKkI2MRvFIm+zYIm+7GPekofMLd19FjdFDKkuOjBKPdmA8+w==}
+ /@rollup/pluginutils/5.0.2:
+ resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ rollup: ^1.20.0||^2.0.0||^3.0.0
+ peerDependenciesMeta:
+ rollup:
+ optional: true
dependencies:
- import-meta-resolve: 2.1.0
+ '@types/estree': 1.0.0
+ estree-walker: 2.0.2
+ picomatch: 2.3.1
+ dev: false
+
+ /@sveltejs/adapter-auto/1.0.0-next.90:
+ resolution: {integrity: sha512-qxH46Oqqn40998wTmnbffONI0HcW/kiZ3OIjZoysjONne+LU4uEsG425MZ2RHDxmR04zxhsdjCAsn6B4du8D7w==}
+ dependencies:
+ import-meta-resolve: 2.2.0
dev: true
/@sveltejs/kit/1.0.0-next.318_svelte@3.49.0:
@@ -671,7 +709,7 @@ packages:
svelte: 3.49.0
dev: false
- /@testing-library/user-event/13.5.0_@testing-library+dom@8.11.3:
+ /@testing-library/user-event/13.5.0_gzufz4q333be4gqfrvipwvqt6a:
resolution: {integrity: sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==}
engines: {node: '>=10', npm: '>=6'}
peerDependencies:
@@ -695,6 +733,10 @@ packages:
resolution: {integrity: sha512-/zPMqDkzSZ8t3VtxOa4KPq7uzzW978M9Tvh+j7GHKuo6k6GTLxPJ4J5gE5cjfJ26pnXst0N5Hax8Sr0T2Mi9zQ==}
dev: false
+ /@types/clone/2.1.1:
+ resolution: {integrity: sha512-BZIU34bSYye0j/BFcPraiDZ5ka6MJADjcDVELGf7glr9K+iE8NYVjFslJFVWzskSxkLLyCrSPScE82/UUoBSvg==}
+ dev: false
+
/@types/concat-stream/1.6.1:
resolution: {integrity: sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==}
dependencies:
@@ -724,6 +766,14 @@ packages:
resolution: {integrity: sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==}
dev: true
+ /@types/estree/0.0.50:
+ resolution: {integrity: sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==}
+ dev: false
+
+ /@types/estree/1.0.0:
+ resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==}
+ dev: false
+
/@types/form-data/0.0.33:
resolution: {integrity: sha1-yayFsqX9GENbjIXZ7LUObWyJP/g=}
dependencies:
@@ -1072,6 +1122,20 @@ packages:
optionalDependencies:
fsevents: 2.3.2
+ /cliui/8.0.1:
+ resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wrap-ansi: 7.0.0
+ dev: false
+
+ /clone/2.1.2:
+ resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==}
+ engines: {node: '>=0.8'}
+ dev: false
+
/color-convert/1.9.3:
resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
dependencies:
@@ -1096,6 +1160,10 @@ packages:
delayed-stream: 1.0.0
dev: false
+ /commander/2.20.3:
+ resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
+ dev: false
+
/commander/7.2.0:
resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
engines: {node: '>= 10'}
@@ -1200,6 +1268,18 @@ packages:
engines: {node: '>=12'}
dev: false
+ /d3-delaunay/6.0.2:
+ resolution: {integrity: sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ delaunator: 5.0.0
+ dev: false
+
+ /d3-dispatch/3.0.1:
+ resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==}
+ engines: {node: '>=12'}
+ dev: false
+
/d3-dsv/3.0.1:
resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==}
engines: {node: '>=12'}
@@ -1210,11 +1290,42 @@ packages:
rw: 1.3.3
dev: false
+ /d3-force/3.0.0:
+ resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==}
+ engines: {node: '>=12'}
+ dependencies:
+ d3-dispatch: 3.0.1
+ d3-quadtree: 3.0.1
+ d3-timer: 3.0.1
+ dev: false
+
/d3-format/3.1.0:
resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==}
engines: {node: '>=12'}
dev: false
+ /d3-geo-projection/4.0.0:
+ resolution: {integrity: sha512-p0bK60CEzph1iqmnxut7d/1kyTmm3UWtPlwdkM31AU+LW+BXazd5zJdoCn7VFxNCHXRngPHRnsNn5uGjLRGndg==}
+ engines: {node: '>=12'}
+ hasBin: true
+ dependencies:
+ commander: 7.2.0
+ d3-array: 3.1.1
+ d3-geo: 3.0.1
+ dev: false
+
+ /d3-geo/3.0.1:
+ resolution: {integrity: sha512-Wt23xBych5tSy9IYAM1FR2rWIBFWa52B/oF/GYe5zbdHrg08FU8+BuI6X4PvTwPDdqdAdq04fuWJpELtsaEjeA==}
+ engines: {node: '>=12'}
+ dependencies:
+ d3-array: 3.1.1
+ dev: false
+
+ /d3-hierarchy/3.1.2:
+ resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==}
+ engines: {node: '>=12'}
+ dev: false
+
/d3-interpolate/3.0.1:
resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==}
engines: {node: '>=12'}
@@ -1227,6 +1338,11 @@ packages:
engines: {node: '>=12'}
dev: false
+ /d3-quadtree/3.0.1:
+ resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==}
+ engines: {node: '>=12'}
+ dev: false
+
/d3-scale/4.0.2:
resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==}
engines: {node: '>=12'}
@@ -1259,6 +1375,11 @@ packages:
d3-array: 3.1.1
dev: false
+ /d3-timer/3.0.1:
+ resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==}
+ engines: {node: '>=12'}
+ dev: false
+
/dashify/2.0.0:
resolution: {integrity: sha512-hpA5C/YrPjucXypHPPc0oJ1l9Hf6wWbiOL7Ik42cxnsUOhWiCB/fylKbKqqJalW9FgkNQCw16YO8uW9Hs0Iy1A==}
engines: {node: '>=4'}
@@ -1296,6 +1417,12 @@ packages:
/defined/1.0.0:
resolution: {integrity: sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==}
+ /delaunator/5.0.0:
+ resolution: {integrity: sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==}
+ dependencies:
+ robust-predicates: 3.0.1
+ dev: false
+
/delayed-stream/1.0.0:
resolution: {integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk=}
engines: {node: '>=0.4.0'}
@@ -1375,6 +1502,10 @@ packages:
resolution: {integrity: sha512-EVTZ+igi8x63pK4bPuA95PXIs2b2Cowi3WQwI9f9qManLiZJOD1Lash1J3W4TvvcUCcIR4o/rgi9o8UicXSO+w==}
dev: false
+ /emoji-regex/8.0.0:
+ resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+ dev: false
+
/entities/2.2.0:
resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==}
dev: false
@@ -1658,6 +1789,10 @@ packages:
tslib: 2.4.0
dev: false
+ /fast-deep-equal/3.1.3:
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+ dev: false
+
/fast-glob/3.2.11:
resolution: {integrity: sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==}
engines: {node: '>=8.6.0'}
@@ -1668,6 +1803,14 @@ packages:
merge2: 1.4.1
micromatch: 4.0.4
+ /fast-json-patch/3.1.1:
+ resolution: {integrity: sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==}
+ dev: false
+
+ /fast-json-stable-stringify/2.1.0:
+ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+ dev: false
+
/fast-unique-numbers/6.0.21:
resolution: {integrity: sha512-MW8UAAypyhNtbnMlSch9EiEAuiMo1y6O02WzI5mcHAzvirdIm/hXMVp4QH9ijWnU1xzW23GXk6Bf+5B1kv9hzw==}
engines: {node: '>=12.20.1'}
@@ -1717,6 +1860,11 @@ packages:
/function-bind/1.1.1:
resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
+ /get-caller-file/2.0.5:
+ resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
+ engines: {node: 6.* || 8.* || >= 10.*}
+ dev: false
+
/get-func-name/2.0.0:
resolution: {integrity: sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=}
dev: false
@@ -1865,8 +2013,8 @@ packages:
parent-module: 1.0.1
resolve-from: 4.0.0
- /import-meta-resolve/2.1.0:
- resolution: {integrity: sha512-yG9pxkWJVTy4cmRsNWE3ztFdtFuYIV8G4N+cbCkO8b+qngkLyIUhxQFuZ0qJm67+0nUOxjMPT7nfksPKza1v2g==}
+ /import-meta-resolve/2.2.0:
+ resolution: {integrity: sha512-CpPOtiCHxP9HdtDM5F45tNiAe66Cqlv3f5uHoJjt+KlaLrUh9/Wz9vepADZ78SlqEo62aDWZtj9ydMGXV+CPnw==}
dev: true
/indefinite-article/0.0.2:
@@ -1955,6 +2103,11 @@ packages:
resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
engines: {node: '>=0.10.0'}
+ /is-fullwidth-code-point/3.0.0:
+ resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+ engines: {node: '>=8'}
+ dev: false
+
/is-glob/4.0.3:
resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
engines: {node: '>=0.10.0'}
@@ -2028,6 +2181,10 @@ packages:
resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
dev: true
+ /json-stringify-pretty-compact/3.0.0:
+ resolution: {integrity: sha512-Rc2suX5meI0S3bfdZuA7JMFBGkJ875ApfVyq2WHELjBiiG22My/l7/8zPpH/CfFVQHuVLd8NLR0nv6vi0BYYKA==}
+ dev: false
+
/kleur/4.1.4:
resolution: {integrity: sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==}
engines: {node: '>=6'}
@@ -2076,6 +2233,13 @@ packages:
get-func-name: 2.0.0
dev: false
+ /lru-cache/6.0.0:
+ resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
+ engines: {node: '>=10'}
+ dependencies:
+ yallist: 4.0.0
+ dev: false
+
/lz-string/1.4.4:
resolution: {integrity: sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY=}
hasBin: true
@@ -2534,7 +2698,7 @@ packages:
picocolors: 1.0.0
source-map-js: 1.0.2
- /prettier-plugin-svelte/2.7.0_prettier@2.6.2+svelte@3.49.0:
+ /prettier-plugin-svelte/2.7.0_3cyj5wbackxvw67rnaarcmbw7y:
resolution: {integrity: sha512-fQhhZICprZot2IqEyoiUYLTRdumULGRvw0o4dzl5jt0jfzVWdGqeYW27QTWAeXhoupEZJULmNoH3ueJwUWFLIA==}
peerDependencies:
prettier: ^1.16.4 || ^2.0.0
@@ -2657,6 +2821,11 @@ packages:
engines: {node: '>=6'}
dev: false
+ /require-directory/2.1.1:
+ resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
/resize-observer-polyfill/1.5.1:
resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==}
dev: false
@@ -2692,6 +2861,10 @@ packages:
dependencies:
glob: 7.2.0
+ /robust-predicates/3.0.1:
+ resolution: {integrity: sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==}
+ dev: false
+
/rollup/2.66.1:
resolution: {integrity: sha512-crSgLhSkLMnKr4s9iZ/1qJCplgAgrRY+igWv8KhG/AjKOJ0YX/WpmANyn8oxrw+zenF3BXWDLa7Xl/QZISH+7w==}
engines: {node: '>=10.0.0'}
@@ -2744,6 +2917,14 @@ packages:
hasBin: true
dev: false
+ /semver/7.3.8:
+ resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==}
+ engines: {node: '>=10'}
+ hasBin: true
+ dependencies:
+ lru-cache: 6.0.0
+ dev: false
+
/shebang-command/1.2.0:
resolution: {integrity: sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=}
engines: {node: '>=0.10.0'}
@@ -2843,6 +3024,15 @@ packages:
tslib: 2.4.0
dev: false
+ /string-width/4.2.3:
+ resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+ engines: {node: '>=8'}
+ dependencies:
+ emoji-regex: 8.0.0
+ is-fullwidth-code-point: 3.0.0
+ strip-ansi: 6.0.1
+ dev: false
+
/string.prototype.padend/3.1.3:
resolution: {integrity: sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg==}
engines: {node: '>= 0.4'}
@@ -2872,6 +3062,13 @@ packages:
safe-buffer: 5.1.2
dev: false
+ /strip-ansi/6.0.1:
+ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+ engines: {node: '>=8'}
+ dependencies:
+ ansi-regex: 5.0.1
+ dev: false
+
/strip-bom/3.0.0:
resolution: {integrity: sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=}
engines: {node: '>=4'}
@@ -2907,7 +3104,7 @@ packages:
resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
engines: {node: '>= 0.4'}
- /svelte-check/2.4.1_736abba5ed1eb6f8ecf70b1d49ead14b:
+ /svelte-check/2.4.1_onvlxjpnd23pr3hxbmout2wrjm:
resolution: {integrity: sha512-xhf3ShP5rnRwBokrgTBJ/0cO9QIc1DAVu1NWNRTfCDsDBNjGmkS3HgitgUadRuoMKj1+irZR/yHJ+Uqobnkbrw==}
hasBin: true
peerDependencies:
@@ -2921,7 +3118,7 @@ packages:
sade: 1.8.1
source-map: 0.7.3
svelte: 3.49.0
- svelte-preprocess: 4.10.2_d50790bb30dd88cc44babe7efa52bace
+ svelte-preprocess: 4.10.2_2udzbozq3wemyrf2xz7puuv2zy
typescript: 4.5.5
transitivePeerDependencies:
- '@babel/core'
@@ -2936,7 +3133,7 @@ packages:
- sugarss
dev: true
- /svelte-check/2.8.0_postcss@8.4.6+svelte@3.49.0:
+ /svelte-check/2.8.0_mgmdnb6x5rpawk37gozc2sbtta:
resolution: {integrity: sha512-HRL66BxffMAZusqe5I5k26mRWQ+BobGd9Rxm3onh7ZVu0nTk8YTKJ9vu3LVPjUGLU9IX7zS+jmwPVhJYdXJ8vg==}
hasBin: true
peerDependencies:
@@ -2949,7 +3146,7 @@ packages:
picocolors: 1.0.0
sade: 1.8.1
svelte: 3.49.0
- svelte-preprocess: 4.10.6_62d50a01257de5eec5be08cad9d3ed66
+ svelte-preprocess: 4.10.6_mlkquajfpxs65rn6bdfntu7nmy
typescript: 4.7.4
transitivePeerDependencies:
- '@babel/core'
@@ -2987,7 +3184,7 @@ packages:
tiny-glob: 0.2.9
dev: false
- /svelte-preprocess/4.10.2_d50790bb30dd88cc44babe7efa52bace:
+ /svelte-preprocess/4.10.2_2udzbozq3wemyrf2xz7puuv2zy:
resolution: {integrity: sha512-aPpkCreSo8EL/y8kJSa1trhiX0oyAtTjlNNM7BNjRAsMJ8Yy2LtqHt0zyd4pQPXt+D4PzbO3qTjjio3kwOxDlA==}
engines: {node: '>= 9.11.2'}
requiresBuild: true
@@ -3040,7 +3237,7 @@ packages:
typescript: 4.5.5
dev: true
- /svelte-preprocess/4.10.6_62d50a01257de5eec5be08cad9d3ed66:
+ /svelte-preprocess/4.10.6_mlkquajfpxs65rn6bdfntu7nmy:
resolution: {integrity: sha512-I2SV1w/AveMvgIQlUF/ZOO3PYVnhxfcpNyGt8pxpUVhPfyfL/CZBkkw/KPfuFix5FJ9TnnNYMhACK3DtSaYVVQ==}
engines: {node: '>= 9.11.2'}
requiresBuild: true
@@ -3096,6 +3293,18 @@ packages:
resolution: {integrity: sha512-VTWHOdwDyWbndGZnI0PQJY9DO7hgQlNubtCcCL6Wlypv5dU4vEsc4A1sX9TWMuvebEe4332SgsQQHzOdZ+guhQ==}
dev: false
+ /svelte-vega/1.2.0_36sthfwhgi34qytpvkzggbhnle:
+ resolution: {integrity: sha512-MsDdO+l7o/d9d4mVkh8MBDhqZvJ45lpuprBaTj0V/ZilIG902QERHFQlam3ZFcR9C9OIKSpmPqINssWNPkDdcA==}
+ peerDependencies:
+ vega: '*'
+ vega-lite: '*'
+ dependencies:
+ fast-deep-equal: 3.1.3
+ vega: 5.22.1
+ vega-embed: 6.21.0_36sthfwhgi34qytpvkzggbhnle
+ vega-lite: 5.6.0_vega@5.22.1
+ dev: false
+
/svelte/3.49.0:
resolution: {integrity: sha512-+lmjic1pApJWDfPCpUUTc1m8azDqYCG1JN9YEngrx/hUyIcFJo6VZhj0A1Ai0wqoHcEIuQy+e9tk+4uDgdtsFA==}
engines: {node: '>= 8'}
@@ -3229,6 +3438,13 @@ packages:
dependencies:
is-number: 7.0.0
+ /topojson-client/3.1.0:
+ resolution: {integrity: sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==}
+ hasBin: true
+ dependencies:
+ commander: 2.20.3
+ dev: false
+
/totalist/3.0.0:
resolution: {integrity: sha512-eM+pCBxXO/njtF7vdFsHuqb+ElbxqtI4r5EAvk6grfAFyJ6IvWlSkfZ5T9ozC6xWw3Fj1fGoSmrl0gUs46JVIw==}
engines: {node: '>=6'}
@@ -3292,6 +3508,392 @@ packages:
spdx-expression-parse: 3.0.1
dev: false
+ /vega-canvas/1.2.6:
+ resolution: {integrity: sha512-rgeYUpslYn/amIfnuv3Sw6n4BGns94OjjZNtUc9IDji6b+K8LGS/kW+Lvay8JX/oFqtulBp8RLcHN6QjqPLA9Q==}
+ dev: false
+
+ /vega-crossfilter/4.1.0:
+ resolution: {integrity: sha512-aiOJcvVpiEDIu5uNc4Kf1hakkkPaVOO5fw5T4RSFAw6GEDbdqcB6eZ1xePcsLVic1hxYD5SGiUPdiiIs0SMh2g==}
+ dependencies:
+ d3-array: 3.1.1
+ vega-dataflow: 5.7.4
+ vega-util: 1.17.0
+ transitivePeerDependencies:
+ - encoding
+ dev: false
+
+ /vega-dataflow/5.7.4:
+ resolution: {integrity: sha512-JGHTpUo8XGETH3b1V892we6hdjzCWB977ybycIu8DPqRoyrZuj6t1fCVImazfMgQD1LAfJlQybWP+alwKDpKig==}
+ dependencies:
+ vega-format: 1.1.0
+ vega-loader: 4.5.0
+ vega-util: 1.17.0
+ transitivePeerDependencies:
+ - encoding
+ dev: false
+
+ /vega-embed/6.21.0_36sthfwhgi34qytpvkzggbhnle:
+ resolution: {integrity: sha512-Tzo9VAfgNRb6XpxSFd7uphSeK2w5OxDY2wDtmpsQ+rQlPSEEI9TE6Jsb2nHRLD5J4FrmXKLrTcORqidsNQSXEg==}
+ peerDependencies:
+ vega: ^5.21.0
+ vega-lite: '*'
+ dependencies:
+ fast-json-patch: 3.1.1
+ json-stringify-pretty-compact: 3.0.0
+ semver: 7.3.8
+ tslib: 2.4.0
+ vega: 5.22.1
+ vega-interpreter: 1.0.4
+ vega-lite: 5.6.0_vega@5.22.1
+ vega-schema-url-parser: 2.2.0
+ vega-themes: 2.12.0_36sthfwhgi34qytpvkzggbhnle
+ vega-tooltip: 0.28.0
+ dev: false
+ bundledDependencies:
+ - yallist
+
+ /vega-encode/4.9.0:
+ resolution: {integrity: sha512-etv2BHuCn9bzEc0cxyA2TnbtcAFQGVFmsaqmB4sgBCaqTSEfXMoX68LK3yxBrsdm5LU+y3otJVoewi3qWYCx2g==}
+ dependencies:
+ d3-array: 3.1.1
+ d3-interpolate: 3.0.1
+ vega-dataflow: 5.7.4
+ vega-scale: 7.2.0
+ vega-util: 1.17.0
+ transitivePeerDependencies:
+ - encoding
+ dev: false
+
+ /vega-event-selector/3.0.0:
+ resolution: {integrity: sha512-Gls93/+7tEJGE3kUuUnxrBIxtvaNeF01VIFB2Q2Of2hBIBvtHX74jcAdDtkh5UhhoYGD8Q1J30P5cqEBEwtPoQ==}
+ dev: false
+
+ /vega-expression/5.0.0:
+ resolution: {integrity: sha512-y5+c2frq0tGwJ7vYXzZcfVcIRF/QGfhf2e+bV1Z0iQs+M2lI1II1GPDdmOcMKimpoCVp/D61KUJDIGE1DSmk2w==}
+ dependencies:
+ '@types/estree': 0.0.50
+ vega-util: 1.17.0
+ dev: false
+
+ /vega-force/4.1.0:
+ resolution: {integrity: sha512-Sssf8iH48vYlz+E7/RpU+SUaJbuLoIL87U4tG2Av4gf/hRiImU49x2TI3EuhFWg1zpaCFxlz0CAaX++Oh/gjdw==}
+ dependencies:
+ d3-force: 3.0.0
+ vega-dataflow: 5.7.4
+ vega-util: 1.17.0
+ transitivePeerDependencies:
+ - encoding
+ dev: false
+
+ /vega-format/1.1.0:
+ resolution: {integrity: sha512-6mgpeWw8yGdG0Zdi8aVkx5oUrpJGOpNxqazC2858RSDPvChM/jDFlgRMTYw52qk7cxU0L08ARp4BwmXaI75j0w==}
+ dependencies:
+ d3-array: 3.1.1
+ d3-format: 3.1.0
+ d3-time-format: 4.1.0
+ vega-time: 2.1.0
+ vega-util: 1.17.0
+ dev: false
+
+ /vega-functions/5.13.0:
+ resolution: {integrity: sha512-Mf53zNyx+c9fFqagEI0T8zc9nMlx0zozOngr8oOpG1tZDKOgwOnUgN99zQKbLHjyv+UzWrq3LYTnSLyVe0ZmhQ==}
+ dependencies:
+ d3-array: 3.1.1
+ d3-color: 3.0.1
+ d3-geo: 3.0.1
+ vega-dataflow: 5.7.4
+ vega-expression: 5.0.0
+ vega-scale: 7.2.0
+ vega-scenegraph: 4.10.1
+ vega-selections: 5.4.0
+ vega-statistics: 1.8.0
+ vega-time: 2.1.0
+ vega-util: 1.17.0
+ transitivePeerDependencies:
+ - encoding
+ dev: false
+
+ /vega-geo/4.4.0:
+ resolution: {integrity: sha512-3YX41y+J5pu0PMjvBCASg0/lgvu9+QXWJZ+vl6FFKa8AlsIopQ67ZL7ObwqjZcoZMolJ4q0rc+ZO8aj1pXCYcw==}
+ dependencies:
+ d3-array: 3.1.1
+ d3-color: 3.0.1
+ d3-geo: 3.0.1
+ vega-canvas: 1.2.6
+ vega-dataflow: 5.7.4
+ vega-projection: 1.5.0
+ vega-statistics: 1.8.0
+ vega-util: 1.17.0
+ transitivePeerDependencies:
+ - encoding
+ dev: false
+
+ /vega-hierarchy/4.1.0:
+ resolution: {integrity: sha512-DWBK39IEt4FiQru12twzKSFUvFFZ7KtlH9+lAaqrJnKuIZFCyQ1XOUfKScfbKIlk4KS+DuCTNLI/pxC/f7Sk9Q==}
+ dependencies:
+ d3-hierarchy: 3.1.2
+ vega-dataflow: 5.7.4
+ vega-util: 1.17.0
+ transitivePeerDependencies:
+ - encoding
+ dev: false
+
+ /vega-interpreter/1.0.4:
+ resolution: {integrity: sha512-6tpYIa/pJz0cZo5fSxDSkZkAA51pID2LjOtQkOQvbzn+sJiCaWKPFhur8MBqbcmYZ9bnap1OYNwlrvpd2qBLvg==}
+ dev: false
+
+ /vega-label/1.2.0:
+ resolution: {integrity: sha512-1prOqkCAfXaUvMqavbGI0nbYGqV8UQR9qvuVwrPJ6Yxm3GIUIOA/JRqNY8eZR8USwMP/kzsqlfVEixj9+Y75VQ==}
+ dependencies:
+ vega-canvas: 1.2.6
+ vega-dataflow: 5.7.4
+ vega-scenegraph: 4.10.1
+ vega-util: 1.17.0
+ transitivePeerDependencies:
+ - encoding
+ dev: false
+
+ /vega-lite/5.6.0_vega@5.22.1:
+ resolution: {integrity: sha512-aTjQk//SzL9ctHY4ItA8yZSGflHMWPJmCXEs8LeRlixuOaAbamZmeL8xNMbQpS/vAZQeFAqjcJ32Fuztz/oGww==}
+ engines: {node: '>=12'}
+ hasBin: true
+ peerDependencies:
+ vega: ^5.22.0
+ dependencies:
+ '@types/clone': 2.1.1
+ clone: 2.1.2
+ fast-deep-equal: 3.1.3
+ fast-json-stable-stringify: 2.1.0
+ json-stringify-pretty-compact: 3.0.0
+ tslib: 2.4.0
+ vega: 5.22.1
+ vega-event-selector: 3.0.0
+ vega-expression: 5.0.0
+ vega-util: 1.17.0
+ yargs: 17.6.2
+ dev: false
+
+ /vega-loader/4.5.0:
+ resolution: {integrity: sha512-EkAyzbx0pCYxH3v3wghGVCaKINWxHfgbQ2pYDiYv0yo8e04S8Mv/IlRGTt6BAe7cLhrk1WZ4zh20QOppnGG05w==}
+ dependencies:
+ d3-dsv: 3.0.1
+ node-fetch: 2.6.7
+ topojson-client: 3.1.0
+ vega-format: 1.1.0
+ vega-util: 1.17.0
+ transitivePeerDependencies:
+ - encoding
+ dev: false
+
+ /vega-parser/6.1.4:
+ resolution: {integrity: sha512-tORdpWXiH/kkXcpNdbSVEvtaxBuuDtgYp9rBunVW9oLsjFvFXbSWlM1wvJ9ZFSaTfx6CqyTyGMiJemmr1QnTjQ==}
+ dependencies:
+ vega-dataflow: 5.7.4
+ vega-event-selector: 3.0.0
+ vega-functions: 5.13.0
+ vega-scale: 7.2.0
+ vega-util: 1.17.0
+ transitivePeerDependencies:
+ - encoding
+ dev: false
+
+ /vega-projection/1.5.0:
+ resolution: {integrity: sha512-aob7qojh555x3hQWZ/tr8cIJNSWQbm6EoWTJaheZgFOY2x3cDa4Qrg3RJbGw6KwVj/IQk2p40paRzixKZ2kr+A==}
+ dependencies:
+ d3-geo: 3.0.1
+ d3-geo-projection: 4.0.0
+ dev: false
+
+ /vega-regression/1.1.0:
+ resolution: {integrity: sha512-09K0RemY6cdaXBAyakDUNFfEkRcLkGjkDJyWQPAUqGK59hV2J+G3i4uxkZp18Vu0t8oqU7CgzwWim1s5uEpOcA==}
+ dependencies:
+ d3-array: 3.1.1
+ vega-dataflow: 5.7.4
+ vega-statistics: 1.8.0
+ vega-util: 1.17.0
+ transitivePeerDependencies:
+ - encoding
+ dev: false
+
+ /vega-runtime/6.1.3:
+ resolution: {integrity: sha512-gE+sO2IfxMUpV0RkFeQVnHdmPy3K7LjHakISZgUGsDI/ZFs9y+HhBf8KTGSL5pcZPtQsZh3GBQ0UonqL1mp9PA==}
+ dependencies:
+ vega-dataflow: 5.7.4
+ vega-util: 1.17.0
+ transitivePeerDependencies:
+ - encoding
+ dev: false
+
+ /vega-scale/7.2.0:
+ resolution: {integrity: sha512-QYltO/otrZHLrCGGf06Y99XtPtqWXITr6rw7rO9oL+l3d9o5RFl9sjHrVxiM7v+vGoZVWbBd5IPbFhPsXZ6+TA==}
+ dependencies:
+ d3-array: 3.1.1
+ d3-interpolate: 3.0.1
+ d3-scale: 4.0.2
+ vega-time: 2.1.0
+ vega-util: 1.17.0
+ dev: false
+
+ /vega-scenegraph/4.10.1:
+ resolution: {integrity: sha512-takIpkmNxYHhJYALOYzhTin3EDzbys6U4g+l1yJZVlXG9YTdiCMuEVAdtaQOCqF9/7qytD6pCrMxJY2HaoN0qQ==}
+ dependencies:
+ d3-path: 3.0.1
+ d3-shape: 3.1.0
+ vega-canvas: 1.2.6
+ vega-loader: 4.5.0
+ vega-scale: 7.2.0
+ vega-util: 1.17.0
+ transitivePeerDependencies:
+ - encoding
+ dev: false
+
+ /vega-schema-url-parser/2.2.0:
+ resolution: {integrity: sha512-yAtdBnfYOhECv9YC70H2gEiqfIbVkq09aaE4y/9V/ovEFmH9gPKaEgzIZqgT7PSPQjKhsNkb6jk6XvSoboxOBw==}
+ dev: false
+
+ /vega-selections/5.4.0:
+ resolution: {integrity: sha512-Un3JdLDPjIpF9Dh4sw6m1c/QAcfam6m1YXHJ9vJxE/GdJ+sOrPxc7bcEU8VhOmTUN7IQUn4/1ry4JqqOVMbEhw==}
+ dependencies:
+ d3-array: 3.1.1
+ vega-expression: 5.0.0
+ vega-util: 1.17.0
+ dev: false
+
+ /vega-statistics/1.8.0:
+ resolution: {integrity: sha512-dl+LCRS6qS4jWDme/NEdPVt5r649uB4IK6Kyr2/czmGA5JqjuFmtQ9lHQOnRu8945XLkqLf+JIQQo7vnw+nslA==}
+ dependencies:
+ d3-array: 3.1.1
+ dev: false
+
+ /vega-themes/2.12.0_36sthfwhgi34qytpvkzggbhnle:
+ resolution: {integrity: sha512-gHNYCzDgexSQDmGzQsxH57OYgFVbAOmvhIYN3MPOvVucyI+zhbUawBVIVNzG9ftucRp0MaaMVXi6ctC5HLnBsg==}
+ peerDependencies:
+ vega: '*'
+ vega-lite: '*'
+ dependencies:
+ vega: 5.22.1
+ vega-lite: 5.6.0_vega@5.22.1
+ dev: false
+
+ /vega-time/2.1.0:
+ resolution: {integrity: sha512-Q9/l3S6Br1RPX5HZvyLD/cQ4K6K8DtpR09/1y7D66gxNorg2+HGzYZINH9nUvN3mxoXcBWg4cCUh3+JvmkDaEg==}
+ dependencies:
+ d3-array: 3.1.1
+ d3-time: 3.0.0
+ vega-util: 1.17.0
+ dev: false
+
+ /vega-tooltip/0.28.0:
+ resolution: {integrity: sha512-DbK0V5zzk+p9cphZZXV91ZGeKq0zr6JIS0VndUoGTisldzw4tRgmpGQcTfMjew53o7/voeTM2ELTnJAJRzX4tg==}
+ dependencies:
+ vega-util: 1.17.0
+ dev: false
+
+ /vega-transforms/4.10.0:
+ resolution: {integrity: sha512-Yk6ByzVq5F2niFfPlSsrU5wi+NZhsF7IBpJCcTfms4U7eoyNepUXagdFEJ3VWBD/Lit6GorLXFgO17NYcyS5gg==}
+ dependencies:
+ d3-array: 3.1.1
+ vega-dataflow: 5.7.4
+ vega-statistics: 1.8.0
+ vega-time: 2.1.0
+ vega-util: 1.17.0
+ transitivePeerDependencies:
+ - encoding
+ dev: false
+
+ /vega-typings/0.22.3:
+ resolution: {integrity: sha512-PREcya3nXT9Tk7xU0IhEpOLVTlqizNtKXV55NhI6ApBjJtqVYbJL7IBh2ckKxGBy3YeUQ37BQZl56UqqiYVWBw==}
+ dependencies:
+ vega-event-selector: 3.0.0
+ vega-expression: 5.0.0
+ vega-util: 1.17.0
+ dev: false
+
+ /vega-util/1.17.0:
+ resolution: {integrity: sha512-HTaydZd9De3yf+8jH66zL4dXJ1d1p5OIFyoBzFiOli4IJbwkL1jrefCKz6AHDm1kYBzDJ0X4bN+CzZSCTvNk1w==}
+ dev: false
+
+ /vega-view-transforms/4.5.8:
+ resolution: {integrity: sha512-966m7zbzvItBL8rwmF2nKG14rBp7q+3sLCKWeMSUrxoG+M15Smg5gWEGgwTG3A/RwzrZ7rDX5M1sRaAngRH25g==}
+ dependencies:
+ vega-dataflow: 5.7.4
+ vega-scenegraph: 4.10.1
+ vega-util: 1.17.0
+ transitivePeerDependencies:
+ - encoding
+ dev: false
+
+ /vega-view/5.11.0:
+ resolution: {integrity: sha512-MI9NTRFmtFX6ADk6KOHhi8bhHjC9pPm42Bj2+74c6l1d3NQZf9Jv7lkiGqKohdkQDNH9LPwz/6slhKwPU9JdkQ==}
+ dependencies:
+ d3-array: 3.1.1
+ d3-timer: 3.0.1
+ vega-dataflow: 5.7.4
+ vega-format: 1.1.0
+ vega-functions: 5.13.0
+ vega-runtime: 6.1.3
+ vega-scenegraph: 4.10.1
+ vega-util: 1.17.0
+ transitivePeerDependencies:
+ - encoding
+ dev: false
+
+ /vega-voronoi/4.2.0:
+ resolution: {integrity: sha512-1iuNAVZgUHRlBpdq4gSga3KlQmrgFfwy+KpyDgPLQ8HbLkhcVeT7RDh2L6naluqD7Op0xVLms3clR920WsYryQ==}
+ dependencies:
+ d3-delaunay: 6.0.2
+ vega-dataflow: 5.7.4
+ vega-util: 1.17.0
+ transitivePeerDependencies:
+ - encoding
+ dev: false
+
+ /vega-wordcloud/4.1.3:
+ resolution: {integrity: sha512-is4zYn9FMAyp9T4SAcz2P/U/wqc0Lx3P5YtpWKCbOH02a05vHjUQrQ2TTPOuvmMfAEDCSKvbMSQIJMOE018lJA==}
+ dependencies:
+ vega-canvas: 1.2.6
+ vega-dataflow: 5.7.4
+ vega-scale: 7.2.0
+ vega-statistics: 1.8.0
+ vega-util: 1.17.0
+ transitivePeerDependencies:
+ - encoding
+ dev: false
+
+ /vega/5.22.1:
+ resolution: {integrity: sha512-KJBI7OWSzpfCPbmWl3GQCqBqbf2TIdpWS0mzO6MmWbvdMhWHf74P9IVnx1B1mhg0ZTqWFualx9ZYhWzMMwudaQ==}
+ dependencies:
+ vega-crossfilter: 4.1.0
+ vega-dataflow: 5.7.4
+ vega-encode: 4.9.0
+ vega-event-selector: 3.0.0
+ vega-expression: 5.0.0
+ vega-force: 4.1.0
+ vega-format: 1.1.0
+ vega-functions: 5.13.0
+ vega-geo: 4.4.0
+ vega-hierarchy: 4.1.0
+ vega-label: 1.2.0
+ vega-loader: 4.5.0
+ vega-parser: 6.1.4
+ vega-projection: 1.5.0
+ vega-regression: 1.1.0
+ vega-runtime: 6.1.3
+ vega-scale: 7.2.0
+ vega-scenegraph: 4.10.1
+ vega-statistics: 1.8.0
+ vega-time: 2.1.0
+ vega-transforms: 4.10.0
+ vega-typings: 0.22.3
+ vega-util: 1.17.0
+ vega-view: 5.11.0
+ vega-view-transforms: 4.5.8
+ vega-voronoi: 4.2.0
+ vega-wordcloud: 4.1.3
+ transitivePeerDependencies:
+ - encoding
+ dev: false
+
/vite/2.9.5:
resolution: {integrity: sha512-dvMN64X2YEQgSXF1lYabKXw3BbN6e+BL67+P3Vy4MacnY+UzT1AfkHiioFSi9+uiDUiaDy7Ax/LQqivk6orilg==}
engines: {node: '>=12.2.0'}
@@ -3426,6 +4028,15 @@ packages:
tslib: 2.4.0
dev: false
+ /wrap-ansi/7.0.0:
+ resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
+ engines: {node: '>=10'}
+ dependencies:
+ ansi-styles: 4.3.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ dev: false
+
/wrappy/1.0.2:
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
@@ -3433,6 +4044,33 @@ packages:
resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
engines: {node: '>=0.4'}
+ /y18n/5.0.8:
+ resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
+ engines: {node: '>=10'}
+ dev: false
+
+ /yallist/4.0.0:
+ resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
+ dev: false
+
/yaml/1.10.2:
resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
engines: {node: '>= 6'}
+
+ /yargs-parser/21.1.1:
+ resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /yargs/17.6.2:
+ resolution: {integrity: sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==}
+ engines: {node: '>=12'}
+ dependencies:
+ cliui: 8.0.1
+ escalade: 3.1.1
+ get-caller-file: 2.0.5
+ require-directory: 2.1.1
+ string-width: 4.2.3
+ y18n: 5.0.8
+ yargs-parser: 21.1.1
+ dev: false