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() +``` + +image + +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