diff --git a/.config/eslint.config.js b/.config/eslint.config.js index 41f34981991b..48a257bebbf8 100644 --- a/.config/eslint.config.js +++ b/.config/eslint.config.js @@ -18,7 +18,7 @@ const js_rules_disabled = Object.fromEntries( const js_rules = { ...js_rules_disabled, - "no-console": ["error", { allow: ["warn", "error", "debug"] }], + "no-console": ["error", { allow: ["warn", "error", "debug", "info"] }], "no-constant-condition": "error", "no-dupe-args": "error", "no-extra-boolean-cast": "error", diff --git a/demo/kitchen_sink/run.ipynb b/demo/kitchen_sink/run.ipynb index a1c1bd5e5cce..428f1d231e4d 100644 --- a/demo/kitchen_sink/run.ipynb +++ b/demo/kitchen_sink/run.ipynb @@ -1 +1 @@ -{"cells": [{"cell_type": "markdown", "id": 302934307671667531413257853548643485645, "metadata": {}, "source": ["# Gradio Demo: kitchen_sink"]}, {"cell_type": "code", "execution_count": null, "id": 272996653310673477252411125948039410165, "metadata": {}, "outputs": [], "source": ["!pip install -q gradio "]}, {"cell_type": "code", "execution_count": null, "id": 288918539441861185822528903084949547379, "metadata": {}, "outputs": [], "source": ["# Downloading files from the demo repo\n", "import os\n", "os.mkdir('files')\n", "!wget -q -O files/cantina.wav https://github.com/gradio-app/gradio/raw/main/demo/kitchen_sink/files/cantina.wav\n", "!wget -q -O files/cheetah1.jpg https://github.com/gradio-app/gradio/raw/main/demo/kitchen_sink/files/cheetah1.jpg\n", "!wget -q -O files/lion.jpg https://github.com/gradio-app/gradio/raw/main/demo/kitchen_sink/files/lion.jpg\n", "!wget -q -O files/logo.png https://github.com/gradio-app/gradio/raw/main/demo/kitchen_sink/files/logo.png\n", "!wget -q -O files/time.csv https://github.com/gradio-app/gradio/raw/main/demo/kitchen_sink/files/time.csv\n", "!wget -q -O files/titanic.csv https://github.com/gradio-app/gradio/raw/main/demo/kitchen_sink/files/titanic.csv\n", "!wget -q -O files/tower.jpg https://github.com/gradio-app/gradio/raw/main/demo/kitchen_sink/files/tower.jpg\n", "!wget -q -O files/world.mp4 https://github.com/gradio-app/gradio/raw/main/demo/kitchen_sink/files/world.mp4"]}, {"cell_type": "code", "execution_count": null, "id": 44380577570523278879349135829904343037, "metadata": {}, "outputs": [], "source": ["import os\n", "import json\n", "\n", "import numpy as np\n", "\n", "import gradio as gr\n", "\n", "CHOICES = [\"foo\", \"bar\", \"baz\"]\n", "JSONOBJ = \"\"\"{\"items\":{\"item\":[{\"id\": \"0001\",\"type\": null,\"is_good\": false,\"ppu\": 0.55,\"batters\":{\"batter\":[{ \"id\": \"1001\", \"type\": \"Regular\" },{ \"id\": \"1002\", \"type\": \"Chocolate\" },{ \"id\": \"1003\", \"type\": \"Blueberry\" },{ \"id\": \"1004\", \"type\": \"Devil's Food\" }]},\"topping\":[{ \"id\": \"5001\", \"type\": \"None\" },{ \"id\": \"5002\", \"type\": \"Glazed\" },{ \"id\": \"5005\", \"type\": \"Sugar\" },{ \"id\": \"5007\", \"type\": \"Powdered Sugar\" },{ \"id\": \"5006\", \"type\": \"Chocolate with Sprinkles\" },{ \"id\": \"5003\", \"type\": \"Chocolate\" },{ \"id\": \"5004\", \"type\": \"Maple\" }]}]}}\"\"\"\n", "\n", "\n", "def fn(\n", " text1,\n", " text2,\n", " num,\n", " slider1,\n", " slider2,\n", " single_checkbox,\n", " checkboxes,\n", " radio,\n", " dropdown,\n", " multi_dropdown,\n", " im1,\n", " im2,\n", " im3,\n", " im4,\n", " video,\n", " audio1,\n", " audio2,\n", " file,\n", " df1,\n", " df2,\n", "):\n", " return (\n", " (text1 if single_checkbox else text2)\n", " + \", selected:\"\n", " + \", \".join(checkboxes), # Text\n", " {\n", " \"positive\": num / (num + slider1 + slider2),\n", " \"negative\": slider1 / (num + slider1 + slider2),\n", " \"neutral\": slider2 / (num + slider1 + slider2),\n", " }, # Label\n", " (audio1[0], np.flipud(audio1[1]))\n", " if audio1 is not None\n", " else os.path.join(os.path.abspath(''), \"files/cantina.wav\"), # Audio\n", " np.flipud(im1)\n", " if im1 is not None\n", " else os.path.join(os.path.abspath(''), \"files/cheetah1.jpg\"), # Image\n", " video\n", " if video is not None\n", " else os.path.join(os.path.abspath(''), \"files/world.mp4\"), # Video\n", " [\n", " (\"The\", \"art\"),\n", " (\"quick brown\", \"adj\"),\n", " (\"fox\", \"nn\"),\n", " (\"jumped\", \"vrb\"),\n", " (\"testing testing testing\", None),\n", " (\"over\", \"prp\"),\n", " (\"the\", \"art\"),\n", " (\"testing\", None),\n", " (\"lazy\", \"adj\"),\n", " (\"dogs\", \"nn\"),\n", " (\".\", \"punc\"),\n", " ]\n", " + [(f\"test {x}\", f\"test {x}\") for x in range(10)], # HighlightedText\n", " # [(\"The testing testing testing\", None), (\"quick brown\", 0.2), (\"fox\", 1), (\"jumped\", -1), (\"testing testing testing\", 0), (\"over\", 0), (\"the\", 0), (\"testing\", 0), (\"lazy\", 1), (\"dogs\", 0), (\".\", 1)] + [(f\"test {x}\", x/10) for x in range(-10, 10)], # HighlightedText\n", " [\n", " (\"The testing testing testing\", None),\n", " (\"over\", 0.6),\n", " (\"the\", 0.2),\n", " (\"testing\", None),\n", " (\"lazy\", -0.1),\n", " (\"dogs\", 0.4),\n", " (\".\", 0),\n", " ]\n", " + [(f\"test\", x / 10) for x in range(-10, 10)], # HighlightedText\n", " json.loads(JSONOBJ), # JSON\n", " \"\", # HTML\n", " os.path.join(os.path.abspath(''), \"files/titanic.csv\"),\n", " df1, # Dataframe\n", " np.random.randint(0, 10, (4, 4)), # Dataframe\n", " )\n", "\n", "\n", "demo = gr.Interface(\n", " fn,\n", " inputs=[\n", " gr.Textbox(value=\"Lorem ipsum\", label=\"Textbox\"),\n", " gr.Textbox(lines=3, placeholder=\"Type here..\", label=\"Textbox 2\"),\n", " gr.Number(label=\"Number\", value=42),\n", " gr.Slider(10, 20, value=15, label=\"Slider: 10 - 20\"),\n", " gr.Slider(maximum=20, step=0.04, label=\"Slider: step @ 0.04\"),\n", " gr.Checkbox(label=\"Checkbox\"),\n", " gr.CheckboxGroup(label=\"CheckboxGroup\", choices=CHOICES, value=CHOICES[0:2]),\n", " gr.Radio(label=\"Radio\", choices=CHOICES, value=CHOICES[2]),\n", " gr.Dropdown(label=\"Dropdown\", choices=CHOICES),\n", " gr.Dropdown(label=\"Multiselect Dropdown (Max choice: 2)\", choices=CHOICES, multiselect=True, max_choices=2),\n", " gr.Image(label=\"Image\"),\n", " gr.Image(label=\"Image w/ Cropper\", tool=\"select\"),\n", " gr.Image(label=\"Sketchpad\", source=\"canvas\"),\n", " gr.Image(label=\"Webcam\", source=\"webcam\"),\n", " gr.Video(label=\"Video\"),\n", " gr.Audio(label=\"Audio\"),\n", " gr.Audio(label=\"Microphone\", source=\"microphone\"),\n", " gr.File(label=\"File\"),\n", " gr.Dataframe(label=\"Dataframe\", headers=[\"Name\", \"Age\", \"Gender\"]),\n", " ],\n", " outputs=[\n", " gr.Textbox(label=\"Textbox\"),\n", " gr.Label(label=\"Label\"),\n", " gr.Audio(label=\"Audio\"),\n", " gr.Image(label=\"Image\"),\n", " gr.Video(label=\"Video\"),\n", " gr.HighlightedText(label=\"HighlightedText\", \n", " color_map={\"punc\": \"pink\", \"test 0\": \"blue\"}\n", " ),\n", " gr.HighlightedText(label=\"HighlightedText\", show_legend=True),\n", " gr.JSON(label=\"JSON\"),\n", " gr.HTML(label=\"HTML\"),\n", " gr.File(label=\"File\"),\n", " gr.Dataframe(label=\"Dataframe\"),\n", " gr.Dataframe(label=\"Numpy\"),\n", " ],\n", " examples=[\n", " [\n", " \"the quick brown fox\",\n", " \"jumps over the lazy dog\",\n", " 10,\n", " 12,\n", " 4,\n", " True,\n", " [\"foo\", \"baz\"],\n", " \"baz\",\n", " \"bar\",\n", " [\"foo\", \"bar\"],\n", " os.path.join(os.path.abspath(''), \"files/cheetah1.jpg\"),\n", " os.path.join(os.path.abspath(''), \"files/cheetah1.jpg\"),\n", " os.path.join(os.path.abspath(''), \"files/cheetah1.jpg\"),\n", " os.path.join(os.path.abspath(''), \"files/cheetah1.jpg\"),\n", " os.path.join(os.path.abspath(''), \"files/world.mp4\"),\n", " os.path.join(os.path.abspath(''), \"files/cantina.wav\"),\n", " os.path.join(os.path.abspath(''), \"files/cantina.wav\"),\n", " os.path.join(os.path.abspath(''), \"files/titanic.csv\"),\n", " [[1, 2, 3, 4], [4, 5, 6, 7], [8, 9, 1, 2], [3, 4, 5, 6]],\n", " os.path.join(os.path.abspath(''), \"files/time.csv\"),\n", " ]\n", " ]\n", " * 3,\n", " title=\"Kitchen Sink\",\n", " description=\"Try out all the components!\",\n", " article=\"Learn more about [Gradio](http://gradio.app)\",\n", " cache_examples=True,\n", ")\n", "\n", "if __name__ == \"__main__\":\n", " demo.launch()"]}], "metadata": {}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file +{"cells": [{"cell_type": "markdown", "id": 302934307671667531413257853548643485645, "metadata": {}, "source": ["# Gradio Demo: kitchen_sink"]}, {"cell_type": "code", "execution_count": null, "id": 272996653310673477252411125948039410165, "metadata": {}, "outputs": [], "source": ["!pip install -q gradio "]}, {"cell_type": "code", "execution_count": null, "id": 288918539441861185822528903084949547379, "metadata": {}, "outputs": [], "source": ["# Downloading files from the demo repo\n", "import os\n", "os.mkdir('files')\n", "!wget -q -O files/cantina.wav https://github.com/gradio-app/gradio/raw/main/demo/kitchen_sink/files/cantina.wav\n", "!wget -q -O files/cheetah1.jpg https://github.com/gradio-app/gradio/raw/main/demo/kitchen_sink/files/cheetah1.jpg\n", "!wget -q -O files/lion.jpg https://github.com/gradio-app/gradio/raw/main/demo/kitchen_sink/files/lion.jpg\n", "!wget -q -O files/logo.png https://github.com/gradio-app/gradio/raw/main/demo/kitchen_sink/files/logo.png\n", "!wget -q -O files/time.csv https://github.com/gradio-app/gradio/raw/main/demo/kitchen_sink/files/time.csv\n", "!wget -q -O files/titanic.csv https://github.com/gradio-app/gradio/raw/main/demo/kitchen_sink/files/titanic.csv\n", "!wget -q -O files/tower.jpg https://github.com/gradio-app/gradio/raw/main/demo/kitchen_sink/files/tower.jpg\n", "!wget -q -O files/world.mp4 https://github.com/gradio-app/gradio/raw/main/demo/kitchen_sink/files/world.mp4"]}, {"cell_type": "code", "execution_count": null, "id": 44380577570523278879349135829904343037, "metadata": {}, "outputs": [], "source": ["import os\n", "import json\n", "\n", "import numpy as np\n", "\n", "import gradio as gr\n", "\n", "CHOICES = [\"foo\", \"bar\", \"baz\"]\n", "JSONOBJ = \"\"\"{\"items\":{\"item\":[{\"id\": \"0001\",\"type\": null,\"is_good\": false,\"ppu\": 0.55,\"batters\":{\"batter\":[{ \"id\": \"1001\", \"type\": \"Regular\" },{ \"id\": \"1002\", \"type\": \"Chocolate\" },{ \"id\": \"1003\", \"type\": \"Blueberry\" },{ \"id\": \"1004\", \"type\": \"Devil's Food\" }]},\"topping\":[{ \"id\": \"5001\", \"type\": \"None\" },{ \"id\": \"5002\", \"type\": \"Glazed\" },{ \"id\": \"5005\", \"type\": \"Sugar\" },{ \"id\": \"5007\", \"type\": \"Powdered Sugar\" },{ \"id\": \"5006\", \"type\": \"Chocolate with Sprinkles\" },{ \"id\": \"5003\", \"type\": \"Chocolate\" },{ \"id\": \"5004\", \"type\": \"Maple\" }]}]}}\"\"\"\n", "\n", "\n", "def fn(\n", " text1,\n", " text2,\n", " num,\n", " slider1,\n", " slider2,\n", " single_checkbox,\n", " checkboxes,\n", " radio,\n", " dropdown,\n", " multi_dropdown,\n", " im1,\n", " im2,\n", " im3,\n", " im4,\n", " video,\n", " audio1,\n", " audio2,\n", " file,\n", " df1,\n", "):\n", " return (\n", " (text1 if single_checkbox else text2)\n", " + \", selected:\"\n", " + \", \".join(checkboxes), # Text\n", " {\n", " \"positive\": num / (num + slider1 + slider2),\n", " \"negative\": slider1 / (num + slider1 + slider2),\n", " \"neutral\": slider2 / (num + slider1 + slider2),\n", " }, # Label\n", " (audio1[0], np.flipud(audio1[1]))\n", " if audio1 is not None\n", " else os.path.join(os.path.abspath(''), \"files/cantina.wav\"), # Audio\n", " np.flipud(im1)\n", " if im1 is not None\n", " else os.path.join(os.path.abspath(''), \"files/cheetah1.jpg\"), # Image\n", " video\n", " if video is not None\n", " else os.path.join(os.path.abspath(''), \"files/world.mp4\"), # Video\n", " [\n", " (\"The\", \"art\"),\n", " (\"quick brown\", \"adj\"),\n", " (\"fox\", \"nn\"),\n", " (\"jumped\", \"vrb\"),\n", " (\"testing testing testing\", None),\n", " (\"over\", \"prp\"),\n", " (\"the\", \"art\"),\n", " (\"testing\", None),\n", " (\"lazy\", \"adj\"),\n", " (\"dogs\", \"nn\"),\n", " (\".\", \"punc\"),\n", " ]\n", " + [(f\"test {x}\", f\"test {x}\") for x in range(10)], # HighlightedText\n", " # [(\"The testing testing testing\", None), (\"quick brown\", 0.2), (\"fox\", 1), (\"jumped\", -1), (\"testing testing testing\", 0), (\"over\", 0), (\"the\", 0), (\"testing\", 0), (\"lazy\", 1), (\"dogs\", 0), (\".\", 1)] + [(f\"test {x}\", x/10) for x in range(-10, 10)], # HighlightedText\n", " [\n", " (\"The testing testing testing\", None),\n", " (\"over\", 0.6),\n", " (\"the\", 0.2),\n", " (\"testing\", None),\n", " (\"lazy\", -0.1),\n", " (\"dogs\", 0.4),\n", " (\".\", 0),\n", " ]\n", " + [(f\"test\", x / 10) for x in range(-10, 10)], # HighlightedText\n", " json.loads(JSONOBJ), # JSON\n", " \"\", # HTML\n", " os.path.join(os.path.abspath(''), \"files/titanic.csv\"),\n", " df1, # Dataframe\n", " np.random.randint(0, 10, (4, 4)), # Dataframe\n", " )\n", "\n", "\n", "demo = gr.Interface(\n", " fn,\n", " inputs=[\n", " gr.Textbox(value=\"Lorem ipsum\", label=\"Textbox\"),\n", " gr.Textbox(lines=3, placeholder=\"Type here..\", label=\"Textbox 2\"),\n", " gr.Number(label=\"Number\", value=42),\n", " gr.Slider(10, 20, value=15, label=\"Slider: 10 - 20\"),\n", " gr.Slider(maximum=20, step=0.04, label=\"Slider: step @ 0.04\"),\n", " gr.Checkbox(label=\"Checkbox\"),\n", " gr.CheckboxGroup(label=\"CheckboxGroup\", choices=CHOICES, value=CHOICES[0:2]),\n", " gr.Radio(label=\"Radio\", choices=CHOICES, value=CHOICES[2]),\n", " gr.Dropdown(label=\"Dropdown\", choices=CHOICES),\n", " gr.Dropdown(\n", " label=\"Multiselect Dropdown (Max choice: 2)\",\n", " choices=CHOICES,\n", " multiselect=True,\n", " max_choices=2,\n", " ),\n", " gr.Image(label=\"Image\"),\n", " gr.Image(label=\"Image w/ Cropper\", tool=\"select\"),\n", " gr.Image(label=\"Sketchpad\", source=\"canvas\"),\n", " gr.Image(label=\"Webcam\", source=\"webcam\"),\n", " gr.Video(label=\"Video\"),\n", " gr.Audio(label=\"Audio\"),\n", " gr.Audio(label=\"Microphone\", source=\"microphone\"),\n", " gr.File(label=\"File\"),\n", " gr.Dataframe(label=\"Dataframe\", headers=[\"Name\", \"Age\", \"Gender\"]),\n", " ],\n", " outputs=[\n", " gr.Textbox(label=\"Textbox\"),\n", " gr.Label(label=\"Label\"),\n", " gr.Audio(label=\"Audio\"),\n", " gr.Image(label=\"Image\"),\n", " gr.Video(label=\"Video\"),\n", " gr.HighlightedText(\n", " label=\"HighlightedText\", color_map={\"punc\": \"pink\", \"test 0\": \"blue\"}\n", " ),\n", " gr.HighlightedText(label=\"HighlightedText\", show_legend=True),\n", " gr.JSON(label=\"JSON\"),\n", " gr.HTML(label=\"HTML\"),\n", " gr.File(label=\"File\"),\n", " gr.Dataframe(label=\"Dataframe\"),\n", " gr.Dataframe(label=\"Numpy\"),\n", " ],\n", " examples=[\n", " [\n", " \"the quick brown fox\",\n", " \"jumps over the lazy dog\",\n", " 10,\n", " 12,\n", " 4,\n", " True,\n", " [\"foo\", \"baz\"],\n", " \"baz\",\n", " \"bar\",\n", " [\"foo\", \"bar\"],\n", " os.path.join(os.path.abspath(''), \"files/cheetah1.jpg\"),\n", " os.path.join(os.path.abspath(''), \"files/cheetah1.jpg\"),\n", " os.path.join(os.path.abspath(''), \"files/cheetah1.jpg\"),\n", " os.path.join(os.path.abspath(''), \"files/cheetah1.jpg\"),\n", " os.path.join(os.path.abspath(''), \"files/world.mp4\"),\n", " os.path.join(os.path.abspath(''), \"files/cantina.wav\"),\n", " os.path.join(os.path.abspath(''), \"files/cantina.wav\"),\n", " os.path.join(os.path.abspath(''), \"files/titanic.csv\"),\n", " [[1, 2, 3, 4], [4, 5, 6, 7], [8, 9, 1, 2], [3, 4, 5, 6]],\n", " ]\n", " ]\n", " * 3,\n", " title=\"Kitchen Sink\",\n", " description=\"Try out all the components!\",\n", " article=\"Learn more about [Gradio](http://gradio.app)\",\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/kitchen_sink/run.py b/demo/kitchen_sink/run.py index 8bd475f0ece8..bc5343244c8c 100755 --- a/demo/kitchen_sink/run.py +++ b/demo/kitchen_sink/run.py @@ -29,7 +29,6 @@ def fn( audio2, file, df1, - df2, ): return ( (text1 if single_checkbox else text2) @@ -96,7 +95,12 @@ def fn( gr.CheckboxGroup(label="CheckboxGroup", choices=CHOICES, value=CHOICES[0:2]), gr.Radio(label="Radio", choices=CHOICES, value=CHOICES[2]), gr.Dropdown(label="Dropdown", choices=CHOICES), - gr.Dropdown(label="Multiselect Dropdown (Max choice: 2)", choices=CHOICES, multiselect=True, max_choices=2), + gr.Dropdown( + label="Multiselect Dropdown (Max choice: 2)", + choices=CHOICES, + multiselect=True, + max_choices=2, + ), gr.Image(label="Image"), gr.Image(label="Image w/ Cropper", tool="select"), gr.Image(label="Sketchpad", source="canvas"), @@ -113,8 +117,8 @@ def fn( gr.Audio(label="Audio"), gr.Image(label="Image"), gr.Video(label="Video"), - gr.HighlightedText(label="HighlightedText", - color_map={"punc": "pink", "test 0": "blue"} + gr.HighlightedText( + label="HighlightedText", color_map={"punc": "pink", "test 0": "blue"} ), gr.HighlightedText(label="HighlightedText", show_legend=True), gr.JSON(label="JSON"), @@ -144,7 +148,6 @@ def fn( os.path.join(os.path.dirname(__file__), "files/cantina.wav"), os.path.join(os.path.dirname(__file__), "files/titanic.csv"), [[1, 2, 3, 4], [4, 5, 6, 7], [8, 9, 1, 2], [3, 4, 5, 6]], - os.path.join(os.path.dirname(__file__), "files/time.csv"), ] ] * 3, @@ -155,4 +158,4 @@ def fn( ) if __name__ == "__main__": - demo.launch() \ No newline at end of file + demo.launch() diff --git a/gradio/cli/commands/create.py b/gradio/cli/commands/create.py index b98b7df11608..171c6344533f 100644 --- a/gradio/cli/commands/create.py +++ b/gradio/cli/commands/create.py @@ -93,9 +93,14 @@ def ignore(s, names): source_package_json = json.load(open(str(frontend / "package.json"))) source_package_json["name"] = name.lower() for dep in source_package_json.get("dependencies", []): - source_package_json["dependencies"][dep] = get_js_dependency_version( - dep, p / "_frontend_code" - ) + # if curent working directory is the gradio repo, use the local version of the dependency + if ( + "gradio/js/gradio-preview/test" not in pathlib.Path.cwd().as_posix() + and dep.startswith("@gradio/") + ): + source_package_json["dependencies"][dep] = get_js_dependency_version( + dep, p / "_frontend_code" + ) json.dump( source_package_json, open(str(frontend / "package.json"), "w"), indent=2 @@ -125,7 +130,9 @@ def _create_backend(name: str, template: str, directory: pathlib.Path): from {name.lower()} import {name} with gr.Blocks() as demo: - {name}() + {name}(interactive=True) + {name}(interactive=False) + demo.launch() """ @@ -246,6 +253,7 @@ def _create( ) if pipe.returncode != 0: live.update(":red_square: NPM install [bold][red]failed[/][/]") + live.update(pipe.stdout) live.update(pipe.stderr) else: live.update(":white_check_mark: NPM install succeeded!") diff --git a/gradio/components/file.py b/gradio/components/file.py index 827313300ab6..db89439986d2 100644 --- a/gradio/components/file.py +++ b/gradio/components/file.py @@ -246,7 +246,7 @@ def postprocess(self, y: str | list[str] | None) -> ListFiles | FileData | None: "data": None, "is_file": True, } - return FileData(value=d) + return FileData(**d) def as_example(self, input_data: str | list | None) -> str: if input_data is None: diff --git a/gradio/components/json_component.py b/gradio/components/json_component.py index 362bcba86efa..ef7967605875 100644 --- a/gradio/components/json_component.py +++ b/gradio/components/json_component.py @@ -3,6 +3,7 @@ from __future__ import annotations import json +from pathlib import Path from typing import Any, Callable, Literal from gradio_client.documentation import document, set_documentation_group @@ -116,6 +117,12 @@ def preprocess(self, x: Any) -> Any: def example_inputs(self) -> Any: return {"foo": "bar"} + def flag(self, x: Any, flag_dir: str | Path = "") -> str: + return json.dumps(x) + + def read_from_flag(self, x: Any, flag_dir: str | Path | None = None): + return json.loads(x) + def style(self, *, container: bool | None = None, **kwargs): """ This method is deprecated. Please set these arguments in the constructor instead. diff --git a/gradio/events.py b/gradio/events.py index 2edfdad0c3b8..d0aaca0665fb 100644 --- a/gradio/events.py +++ b/gradio/events.py @@ -48,12 +48,13 @@ def __init__(self, trigger: Block, key_vals, dep_index): """ Triggered after directly preceding event is completed, regardless of success or failure. """ - self.success = partial(EventListener( - "success", - trigger_after=dep_index, - trigger_only_on_success=True, - ).listener, - trigger + self.success = partial( + EventListener( + "success", + trigger_after=dep_index, + trigger_only_on_success=True, + ).listener, + trigger, ) """ Triggered after directly preceding event is completed, if it was successful. diff --git a/gradio/routes.py b/gradio/routes.py index 05c9a1857cb3..73a599df4930 100644 --- a/gradio/routes.py +++ b/gradio/routes.py @@ -685,7 +685,6 @@ async def get_queue_status(): async def upload_file( files: List[UploadFile] = File(...), ): - print("Here") output_files = [] file_manager = gradio.File() for input_file in files: diff --git a/js/app/build_plugins.ts b/js/app/build_plugins.ts index fdccb7c47484..aad8ce091463 100644 --- a/js/app/build_plugins.ts +++ b/js/app/build_plugins.ts @@ -106,6 +106,10 @@ export function generate_dev_entry({ enable }: { enable: boolean }): Plugin { if (id === "svelte/internal") { return "../../../node/dev/svelte-internal.js"; } + + if (id === "svelte/internal/disclose-version") { + return "../../../node/dev/svelte-disclose.js"; + } }, writeBundle(config, bundle) { if (!enable) return; diff --git a/js/app/package.json b/js/app/package.json index 834e2ff06e44..3a70dcf08d2a 100644 --- a/js/app/package.json +++ b/js/app/package.json @@ -39,6 +39,7 @@ "@gradio/column": "workspace:^", "@gradio/dataframe": "workspace:^", "@gradio/dropdown": "workspace:^", + "@gradio/fallback": "workspace:^", "@gradio/file": "workspace:^", "@gradio/form": "workspace:^", "@gradio/gallery": "workspace:^", diff --git a/js/app/src/Blocks.svelte b/js/app/src/Blocks.svelte index 17b01c49c5aa..01e6d2cd5b04 100644 --- a/js/app/src/Blocks.svelte +++ b/js/app/src/Blocks.svelte @@ -3,7 +3,10 @@ import { _ } from "svelte-i18n"; import type { client } from "@gradio/client"; - import { component_map } from "./components/directory"; + import { + component_map, + fallback_component_map + } from "./components/directory"; import { create_loading_status_store, app_state } from "./stores"; import type { LoadingStatusCollection } from "./stores"; @@ -120,7 +123,7 @@ async function load_component( name: T, - mode: ComponentMeta["props"]["mode"] + mode: ComponentMeta["props"]["mode"] | "example" ): Promise<{ name: T; component: LoadedComponent; @@ -133,6 +136,16 @@ component: c as LoadedComponent }; } catch (e) { + if (mode === "example") { + try { + return load_custom_component(name, "example"); + } catch (e) { + return { + name, + component: await import("@gradio/fallback/example") + }; + } + } if (mode === "interactive") { try { const c = await component_map[name]["static"](); @@ -196,13 +209,20 @@ async function load_custom_component( name: T, - mode: ComponentMeta["props"]["mode"] + mode: ComponentMeta["props"]["mode"] | "example" ): Promise<{ name: T; component: LoadedComponent; }> { const comps = "__ROOT_PATH__"; try { + if ( + typeof comps !== "object" || + !comps?.[name] || + !comps?.[name]?.[mode] + ) { + throw new Error(`Component ${name} not found`); + } //@ts-ignore const c = await comps[name][mode](); return { @@ -212,6 +232,7 @@ } catch (e) { if (mode === "interactive") { try { + //@ts-ignore const c = await comps[name]["static"](); return { name, @@ -223,8 +244,8 @@ throw e; } } else { - console.error(`failed to load: ${name}`); - console.error(e); + // console.error(`failed to load: ${name}`); + // console.error(e); throw e; } } @@ -288,6 +309,24 @@ } __type_for_id.set(c.id, c.props.mode); + if (c.type === "dataset") { + const example_component_map = new Map(); + + (c.props.components as string[]).forEach((name: string) => { + if (example_component_map.has(name)) { + return; + } + let _c; + + //@ts-ignore + _c = load_component(name, "example"); + + example_component_map.set(name, _c); + }); + + c.props.component_map = example_component_map; + } + // maybe load custom const _c = c.props.custom_component diff --git a/js/app/src/Index.svelte b/js/app/src/Index.svelte index 26112c5b86b6..21c7ea73eda1 100644 --- a/js/app/src/Index.svelte +++ b/js/app/src/Index.svelte @@ -196,14 +196,16 @@ active_theme_mode = handle_darkmode(wrapper); } + //@ts-ignore const gradio_dev_mode = window.__GRADIO_DEV__; - const server_port = "__GRADIO__SERVER_PORT__"; - - console.log({ gradio_dev_mode, server_port }); + //@ts-ignore + const server_port = window.__GRADIO__SERVER_PORT__; const api_url = BUILD_MODE === "dev" || gradio_dev_mode === "dev" - ? "http://localhost:7860" + ? `http://localhost:${ + typeof server_port === "number" ? server_port : 7860 + }` : host || space || src || location.origin; app = await client(api_url, { diff --git a/js/app/src/components/Dataset/Dataset.svelte b/js/app/src/components/Dataset/Dataset.svelte index fdd87b503c1e..c5d9dfdaf19c 100644 --- a/js/app/src/components/Dataset/Dataset.svelte +++ b/js/app/src/components/Dataset/Dataset.svelte @@ -1,10 +1,16 @@ handle_mouseenter(i)} on:mouseleave={() => handle_mouseleave()} > - {#if Object.keys(component_map).includes(components[0]) && component_map[components[0]]} + {#if component_meta.length && component_map.get(components[0])} {#each sample_row as { value, component }, j} {@const component_name = components[j]} - {#if component_name !== undefined && component_map[component_name] !== undefined} + {#if component_name !== undefined && component_map.get(component_name) !== undefined} import("@gradio/audio/static"), - interactive: () => import("@gradio/audio/interactive") + interactive: () => import("@gradio/audio/interactive"), + example: () => import("@gradio/audio/example") }, box: { static: () => import("@gradio/box/static") @@ -20,37 +21,44 @@ export const component_map = { }, checkbox: { static: () => import("@gradio/checkbox/static"), - interactive: () => import("@gradio/checkbox/interactive") + interactive: () => import("@gradio/checkbox/interactive"), + example: () => import("@gradio/checkbox/example") }, checkboxgroup: { static: () => import("@gradio/checkboxgroup/static"), - interactive: () => import("@gradio/checkboxgroup/interactive") + interactive: () => import("@gradio/checkboxgroup/interactive"), + example: () => import("@gradio/checkboxgroup/example") }, code: { static: () => import("@gradio/code/static"), - interactive: () => import("@gradio/code/interactive") + interactive: () => import("@gradio/code/interactive"), + example: () => import("@gradio/code/example") }, colorpicker: { static: () => import("@gradio/colorpicker/static"), - interactive: () => import("@gradio/colorpicker/interactive") + interactive: () => import("@gradio/colorpicker/interactive"), + example: () => import("@gradio/colorpicker/example") }, column: { static: () => import("@gradio/column/static") }, dataframe: { static: () => import("@gradio/dataframe/static"), - interactive: () => import("@gradio/dataframe/interactive") + interactive: () => import("@gradio/dataframe/interactive"), + example: () => import("@gradio/dataframe/example") }, dataset: { static: () => import("./Dataset") }, dropdown: { static: () => import("@gradio/dropdown/static"), - interactive: () => import("@gradio/dropdown/interactive") + interactive: () => import("@gradio/dropdown/interactive"), + example: () => import("@gradio/dropdown/example") }, file: { static: () => import("@gradio/file/static"), - interactive: () => import("@gradio/file/interactive") + interactive: () => import("@gradio/file/interactive"), + example: () => import("@gradio/file/example") }, form: { static: () => import("@gradio/form/static") @@ -65,11 +73,13 @@ export const component_map = { static: () => import("@gradio/highlightedtext/static") }, html: { - static: () => import("@gradio/html/static") + static: () => import("@gradio/html/static"), + example: () => import("@gradio/html/example") }, image: { static: () => import("@gradio/image/static"), - interactive: () => import("@gradio/image/interactive") + interactive: () => import("@gradio/image/interactive"), + example: () => import("@gradio/image/example") }, interpretation: { static: () => import("./Interpretation"), @@ -82,29 +92,34 @@ export const component_map = { static: () => import("@gradio/label/static") }, markdown: { - static: () => import("@gradio/markdown/static") + static: () => import("@gradio/markdown/static"), + example: () => import("@gradio/markdown/example") }, model3d: { static: () => import("@gradio/model3d/static"), - interactive: () => import("@gradio/model3d/interactive") + interactive: () => import("@gradio/model3d/interactive"), + example: () => import("@gradio/model3d/example") }, number: { static: () => import("@gradio/number/static"), - interactive: () => import("@gradio/number/interactive") + interactive: () => import("@gradio/number/interactive"), + example: () => import("@gradio/number/example") }, plot: { static: () => import("@gradio/plot/static") }, radio: { static: () => import("@gradio/radio/static"), - interactive: () => import("@gradio/radio/interactive") + interactive: () => import("@gradio/radio/interactive"), + example: () => import("@gradio/radio/example") }, row: { static: () => import("@gradio/row/static") }, slider: { static: () => import("@gradio/slider/static"), - interactive: () => import("@gradio/slider/interactive") + interactive: () => import("@gradio/slider/interactive"), + example: () => import("@gradio/slider/example") }, state: { static: () => import("./State") @@ -120,7 +135,8 @@ export const component_map = { }, textbox: { static: () => import("@gradio/textbox/static"), - interactive: () => import("@gradio/textbox/interactive") + interactive: () => import("@gradio/textbox/interactive"), + example: () => import("@gradio/textbox/example") }, uploadbutton: { static: () => import("@gradio/uploadbutton/static"), @@ -128,6 +144,17 @@ export const component_map = { }, video: { static: () => import("@gradio/video/static"), - interactive: () => import("@gradio/video/interactive") + interactive: () => import("@gradio/video/interactive"), + example: () => import("@gradio/video/example") } }; + +import InteractiveFallback from "@gradio/fallback/interactive"; +import StaticFallback from "@gradio/fallback/static"; +import ExampleFallback from "@gradio/fallback/example"; + +export const fallback_component_map = { + interactive: InteractiveFallback, + static: StaticFallback, + example: ExampleFallback +}; diff --git a/js/app/vite.config.ts b/js/app/vite.config.ts index 0435dd8d5b59..5733681d49c4 100644 --- a/js/app/vite.config.ts +++ b/js/app/vite.config.ts @@ -137,7 +137,8 @@ export default defineConfig(({ mode }) => { svelte({ inspector: true, compilerOptions: { - dev: true + dev: true, + discloseVersion: false }, hot: !process.env.VITEST && !production, preprocess: sveltePreprocess({ diff --git a/js/atoms/src/ShareButton.svelte b/js/atoms/src/ShareButton.svelte index d98fec0e7acf..450e02a8621a 100644 --- a/js/atoms/src/ShareButton.svelte +++ b/js/atoms/src/ShareButton.svelte @@ -4,7 +4,7 @@ import { createEventDispatcher } from "svelte"; import type { ShareData } from "@gradio/utils"; import { ShareError } from "@gradio/utils"; - import type { I18nFormatter } from "../@gradio/utils"; + import type { I18nFormatter } from "@gradio/utils"; const dispatch = createEventDispatcher<{ share: ShareData; diff --git a/js/atoms/src/UploadText.svelte b/js/atoms/src/UploadText.svelte index 4c6ee81d60bd..fc32638ba1b1 100644 --- a/js/atoms/src/UploadText.svelte +++ b/js/atoms/src/UploadText.svelte @@ -1,5 +1,5 @@ + +
+ {value} +
+ + diff --git a/js/fallback/example/index.ts b/js/fallback/example/index.ts new file mode 100644 index 000000000000..595694a6cfd4 --- /dev/null +++ b/js/fallback/example/index.ts @@ -0,0 +1 @@ +export { default } from "./Fallback.svelte"; diff --git a/js/fallback/interactive/InteractiveFallback.svelte b/js/fallback/interactive/InteractiveFallback.svelte new file mode 100644 index 000000000000..cd1bbf0d74cf --- /dev/null +++ b/js/fallback/interactive/InteractiveFallback.svelte @@ -0,0 +1,32 @@ + + + + + + + diff --git a/js/fallback/interactive/index.ts b/js/fallback/interactive/index.ts new file mode 100644 index 000000000000..c38e7d2fa971 --- /dev/null +++ b/js/fallback/interactive/index.ts @@ -0,0 +1 @@ +export { default } from "./InteractiveFallback.svelte"; diff --git a/js/fallback/package.json b/js/fallback/package.json new file mode 100644 index 000000000000..f7a990c833b9 --- /dev/null +++ b/js/fallback/package.json @@ -0,0 +1,23 @@ +{ + "name": "@gradio/fallback", + "version": "0.1.1", + "description": "Gradio UI packages", + "type": "module", + "main": "./index.svelte", + "author": "", + "license": "ISC", + "private": true, + "main_changeset": true, + "exports": { + "./package.json": "./package.json", + "./interactive": "./interactive/index.ts", + "./static": "./static/index.ts", + "./example": "./example/index.ts" + }, + "dependencies": { + "@gradio/atoms": "workspace:^", + "@gradio/statustracker": "workspace:^", + "@gradio/utils": "workspace:^", + "@zerodevx/svelte-json-view": "^1.0.7" + } +} diff --git a/js/fallback/static/StaticFallback.svelte b/js/fallback/static/StaticFallback.svelte new file mode 100644 index 000000000000..cd1bbf0d74cf --- /dev/null +++ b/js/fallback/static/StaticFallback.svelte @@ -0,0 +1,32 @@ + + + + + + + diff --git a/js/fallback/static/index.ts b/js/fallback/static/index.ts new file mode 100644 index 000000000000..c031ab5467cd --- /dev/null +++ b/js/fallback/static/index.ts @@ -0,0 +1 @@ +export { default } from "./StaticFallback.svelte"; diff --git a/js/gradio-preview/rollup.config.js b/js/gradio-preview/rollup.config.js index 968c7a8ff5ce..44ffe9b3cd54 100644 --- a/js/gradio-preview/rollup.config.js +++ b/js/gradio-preview/rollup.config.js @@ -4,7 +4,6 @@ import cjs from "@rollup/plugin-commonjs"; import { cpSync, writeFileSync, rmdirSync, existsSync } from "fs"; import { join } from "path"; import json from "@rollup/plugin-json"; -import ignore from "rollup-plugin-ignore"; import { dirname } from "path"; import { fileURLToPath } from "url"; @@ -16,7 +15,7 @@ const require = createRequire(import.meta.url); const esbuild_binary_path = require.resolve("esbuild"); const vite_client = require.resolve("vite/dist/client/client.mjs"); const hmr = require.resolve("svelte-hmr"); - +console.log(__dirname); export default [ { input: "src/index.ts", @@ -59,6 +58,10 @@ export default [ if (id === "svelte/internal") { return "../svelte-internal.js"; } + + if (id === "svelte/internal/disclose-version") { + return "../svelte-disclose.js"; + } }, transform(code, id) { @@ -74,6 +77,14 @@ export default [ recursive: true }); + cpSync( + join(__dirname, "node_modules", "svelte"), + "../../gradio/node/dev/node_modules/svelte", + { + recursive: true + } + ); + cpSync( join(hmr, "../runtime"), "../../gradio/node/dev/files/runtime", @@ -123,6 +134,10 @@ export default [ if (id === "svelte/action") { return "./svelte-action.js"; } + + if (id === "svelte/internal/disclose-version") { + return "./svelte-disclose.js"; + } } } ] @@ -143,6 +158,14 @@ export default [ }, plugins: [node(), json(), cjs(), ts()] }, + { + input: "src/svelte-disclose.ts", + output: { + file: "../../gradio/node/dev/svelte-disclose.js", + format: "esm" + }, + plugins: [node(), json(), cjs(), ts()] + }, { input: "src/compiler.ts", output: { diff --git a/js/gradio-preview/src/dev_server.ts b/js/gradio-preview/src/dev_server.ts index 97834f13e485..307d72df89b9 100644 --- a/js/gradio-preview/src/dev_server.ts +++ b/js/gradio-preview/src/dev_server.ts @@ -1,13 +1,25 @@ import { fileURLToPath } from "url"; -import { createServer, build } from "vite"; -import { readdirSync, existsSync, readFileSync } from "fs"; +import { createServer, build, createLogger } from "vite"; import { join } from "path"; const __dirname = fileURLToPath(new URL(".", import.meta.url)); import { svelte } from "@sveltejs/vite-plugin-svelte"; import { transform } from "sucrase"; import { viteCommonjs } from "@originjs/vite-plugin-commonjs"; -import { read } from "vega"; -// import { typescript } from "svelte-preprocess"; + +const vite_messages_to_ignore = [ + "Default and named imports from CSS files are deprecated." +]; +const svelte_codes_to_ignore: Record = { + "reactive-component": "Icon" +}; + +const logger = createLogger(); +const originalWarning = logger.warn; +logger.warn = (msg, options) => { + if (vite_messages_to_ignore.some((m) => msg.includes(m))) return; + + originalWarning(msg, options); +}; interface ServerOptions { component_dir: string; @@ -24,11 +36,11 @@ export async function create_server({ }: ServerOptions): Promise { process.env.gradio_mode = "dev"; const imports = generate_imports(component_dir); - console.log(imports); const NODE_DIR = join(root_dir, "..", "..", "node", "dev"); const server = await createServer({ // any valid user config options, plus `mode` and `configFile` + customLogger: logger, mode: "development", configFile: false, root: root_dir, @@ -52,29 +64,8 @@ export async function create_server({ } }, plugins: [ + //@ts-ignore viteCommonjs(), - svelte({ - prebundleSvelteLibraries: false, - hot: true, - preprocess: [ - { - script: ({ attributes, filename, content }) => { - if (attributes.lang === "ts") { - const compiledCode = transform(content, { - transforms: ["typescript"], - keepUnusedImports: true - }); - - return { - code: compiledCode.code, - map: compiledCode.sourceMap - }; - } - } - } - ] - }), - { name: "gradio", enforce: "pre", @@ -90,26 +81,72 @@ export async function create_server({ if (importee === "svelte/action") { return join(NODE_DIR, "svelte-action.js"); } + + if (importee === "svelte/internal/disclose-version") { + console.log("================================"); + console.log("HELLO DISCLOSE VERSION!!!!!!!!!!!!"); + console.log({ importer }); + console.log("================================"); + return join(NODE_DIR, "svelte-action.js"); + } }, transform(code) { if (code.includes("__ROOT_PATH__")) { return code.replace(`"__ROOT_PATH__"`, imports); } + }, + transformIndexHtml(html) { + return html.replace( + `window.__GRADIO_DEV__ = "dev"`, + `window.__GRADIO_DEV__ = "dev"; + window.__GRADIO__SERVER_PORT__ = ${backend_port};` + ); + } + }, + //@ts-ignore + svelte({ + onwarn(warning, handler) { + if ( + svelte_codes_to_ignore.hasOwnProperty(warning.code) && + svelte_codes_to_ignore[warning.code] && + warning.message.includes(svelte_codes_to_ignore[warning.code]) + ) { + return; + } - if (code.includes("__GRADIO__SERVER_PORT__")) { - return code.replace( - `"__GRADIO__SERVER_PORT__"`, - backend_port.toString() - ); + handler!(warning); + }, + prebundleSvelteLibraries: false, + hot: true, + compilerOptions: { + discloseVersion: false + }, + preprocess: [ + { + script: ({ attributes, filename, content }) => { + if (attributes.lang === "ts") { + const compiledCode = transform(content, { + transforms: ["typescript"], + keepUnusedImports: true + }); + + return { + code: compiledCode.code, + map: compiledCode.sourceMap + }; + } + } } - } - } + ] + }) ] }); await server.listen(); - console.log(`[orange3]Frontend Server[/] (Go here): ${server.resolvedUrls?.local}`); + console.info( + `[orange3]Frontend Server[/] (Go here): ${server.resolvedUrls?.local}` + ); } import * as fs from "fs"; @@ -119,7 +156,7 @@ function find_frontend_folders( start_path: string ): { dir: string; package_name: string }[] { if (!fs.existsSync(start_path)) { - console.log("No directory found at:", start_path); + console.warn("No directory found at:", start_path); return []; } @@ -167,11 +204,13 @@ function generate_imports(component_dir: string): string { const imports = components.reduce((acc, component) => { const x = { interactive: join(component.dir, "interactive"), - static: join(component.dir, "static") + static: join(component.dir, "static"), + example: join(component.dir, "example") }; return `${acc}"${component.package_name}": { interactive: () => import("${x.interactive}"), - static: () => import("${x.static}") + static: () => import("${x.static}"), + example: () => import("${x.example}") },\n`; }, ""); diff --git a/js/gradio-preview/src/index.ts b/js/gradio-preview/src/index.ts index 826ac6eda35d..187262c96994 100644 --- a/js/gradio-preview/src/index.ts +++ b/js/gradio-preview/src/index.ts @@ -1,4 +1,4 @@ -import { spawn } from "node:child_process"; +import { ChildProcess, spawn } from "node:child_process"; import { create_server } from "./dev_server"; const args = process.argv.slice(2); @@ -19,7 +19,6 @@ function parse_args(args: string[]): Record { } const parsed_args = parse_args(args); -console.log({ parsed_args }); async function run(): Promise { const [backend_port, frontend_port] = await find_free_ports(7860, 8860); @@ -31,7 +30,6 @@ async function run(): Promise { ...parsed_args }; process.env.GRADIO_BACKEND_PORT = backend_port.toString(); - const server = create_server({ ...options }); const _process = spawn( `gradio`, @@ -50,9 +48,13 @@ async function run(): Promise { _process.stdout.setEncoding("utf8"); - function std_out(data) { + function std_out(data: Buffer): void { const _data = data.toString(); + if (_data.includes("Running on")) { + const server = create_server({ ...options }); + } + process.stdout.write(_data); } @@ -63,7 +65,7 @@ async function run(): Promise { _process.on("disconnect", () => kill_process(_process)); } -function kill_process(process) { +function kill_process(process: ChildProcess): void { process.kill("SIGKILL"); } @@ -102,6 +104,7 @@ export function is_free_port(port: number): Promise { }); sock.once("error", (e) => { sock.destroy(); + //@ts-ignore if (e.code === "ECONNREFUSED") { accept(true); } else { diff --git a/js/gradio-preview/src/svelte-disclose.ts b/js/gradio-preview/src/svelte-disclose.ts new file mode 100644 index 000000000000..54354dfd5a9e --- /dev/null +++ b/js/gradio-preview/src/svelte-disclose.ts @@ -0,0 +1 @@ +export * from "svelte/internal/disclose-version"; diff --git a/js/image/interactive/Image.svelte b/js/image/interactive/Image.svelte index f14a0b623f0c..748e3834a737 100644 --- a/js/image/interactive/Image.svelte +++ b/js/image/interactive/Image.svelte @@ -3,7 +3,7 @@ import { createEventDispatcher, tick, onMount } from "svelte"; import { BlockLabel } from "@gradio/atoms"; import { Image, Sketch as SketchIcon } from "@gradio/icons"; - import type { SelectData } from "@gradio/utils"; + import type { SelectData, I18nFormatter } from "@gradio/utils"; import { get_coordinates_of_clicked_image } from "../shared/utils"; import Cropper from "./Cropper.svelte"; @@ -36,6 +36,7 @@ export let mask_opacity; export let selectable = false; export let root: string; + export let i18n: I18nFormatter; let sketch: Sketch; let cropper: Cropper; @@ -117,8 +118,6 @@ normalise_file(value_, root, null); } - $: console.log(value_); - function handle_image_load(event: Event): void { const element = event.currentTarget as HTMLImageElement; img_width = element.naturalWidth; @@ -227,12 +226,12 @@ on:crop={handle_save} /> (handle_clear(e), (tool = "editor"))} /> {:else if tool === "editor"} (tool = "select")} on:clear={handle_clear} editable @@ -347,12 +346,12 @@ {:else if tool === "select"} (handle_clear(e), (tool = "editor"))} /> {:else if tool === "editor"} (tool = "select")} on:clear={handle_clear} editable diff --git a/js/image/interactive/InteractiveImage.svelte b/js/image/interactive/InteractiveImage.svelte index cecfe54a9a1b..6c1aeb84673f 100644 --- a/js/image/interactive/InteractiveImage.svelte +++ b/js/image/interactive/InteractiveImage.svelte @@ -97,6 +97,7 @@ {pending} {streaming} {mirror_webcam} + i18n={gradio.i18n} > diff --git a/js/image/static/StaticImage.svelte b/js/image/static/StaticImage.svelte index 7fd60bc0ad3b..30cae5f8138f 100644 --- a/js/image/static/StaticImage.svelte +++ b/js/image/static/StaticImage.svelte @@ -67,5 +67,6 @@ {show_download_button} {selectable} {show_share_button} + i18n={gradio.i18n} />
diff --git a/js/markdown/static/MarkdownCode.svelte b/js/markdown/static/MarkdownCode.svelte index c68a2cbde0bf..f9110f810a34 100644 --- a/js/markdown/static/MarkdownCode.svelte +++ b/js/markdown/static/MarkdownCode.svelte @@ -46,7 +46,7 @@ html = ""; } async function render_html(value: string): Promise { - if (latex_delimiters.length > 0) { + if (latex_delimiters?.length > 0) { render_math_in_element(el, { delimiters: latex_delimiters, throwOnError: false diff --git a/js/statustracker/package.json b/js/statustracker/package.json index 2de38a7fd52a..c64e8a38c68d 100644 --- a/js/statustracker/package.json +++ b/js/statustracker/package.json @@ -18,6 +18,7 @@ "dependencies": { "@gradio/atoms": "workspace:^", "@gradio/column": "workspace:^", - "@gradio/icons": "workspace:^" + "@gradio/icons": "workspace:^", + "@gradio/utils": "workspace:^" } } diff --git a/js/statustracker/static/index.svelte b/js/statustracker/static/index.svelte index c00e117761ae..42f3c76ca7f1 100644 --- a/js/statustracker/static/index.svelte +++ b/js/statustracker/static/index.svelte @@ -50,7 +50,7 @@ import { app_state } from "../../app/src/stores"; import Loader from "./Loader.svelte"; import type { LoadingStatus } from "./types"; - import type { I18nFormatter } from "../@gradio/utils"; + import type { I18nFormatter } from "@gradio/utils"; export let i18n: I18nFormatter; export let eta: number | null = null; diff --git a/js/storybook/preview.ts b/js/storybook/preview.ts index 4faab1516d08..d78f387101ef 100644 --- a/js/storybook/preview.ts +++ b/js/storybook/preview.ts @@ -1,7 +1,7 @@ import type { Preview } from "@storybook/svelte"; import "./theme.css"; import { setupi18n } from "../app/src/i18n"; -import { Gradio } from "@gradio/utils"; +import { Gradio } from "../app/src/gradio_helper"; setupi18n(); const preview: Preview = { diff --git a/js/textbox/interactive/InteractiveTextbox.svelte b/js/textbox/interactive/InteractiveTextbox.svelte index 47226d4eebe2..37e33bc10b1a 100644 --- a/js/textbox/interactive/InteractiveTextbox.svelte +++ b/js/textbox/interactive/InteractiveTextbox.svelte @@ -24,7 +24,8 @@ select: SelectData; input: never; focus: never; - }>; + }> = { dispatch, i18n: (s: string) => s }; + export let label = "Textbox"; export let info: string | undefined = undefined; export let elem_id = ""; diff --git a/js/tootils/package.json b/js/tootils/package.json index 57bd0cd053d1..9ae02d280702 100644 --- a/js/tootils/package.json +++ b/js/tootils/package.json @@ -6,5 +6,8 @@ "main": "src/index.ts", "author": "", "license": "ISC", - "private": true + "private": true, + "dependencies": { + "@gradio/utils": "workspace:^" + } } diff --git a/js/tootils/src/render.ts b/js/tootils/src/render.ts index 4370f15dda3d..a1525886d7b7 100644 --- a/js/tootils/src/render.ts +++ b/js/tootils/src/render.ts @@ -14,7 +14,7 @@ import type { FireObject } from "@testing-library/dom"; import { spy, type Spy } from "tinyspy"; -import { Gradio } from "../@gradio/utils"; +import { Gradio } from "@gradio/utils"; const containerCache = new Map(); const componentCache = new Set(); diff --git a/js/upload/package.json b/js/upload/package.json index 9a27894f7f57..ea9d5b2fd219 100644 --- a/js/upload/package.json +++ b/js/upload/package.json @@ -11,7 +11,8 @@ "@gradio/atoms": "workspace:^", "@gradio/icons": "workspace:^", "@gradio/client": "workspace:^", - "@gradio/upload": "workspace:^" + "@gradio/upload": "workspace:^", + "@gradio/utils": "workspace:^" }, "main_changeset": true } diff --git a/js/upload/src/ModifyUpload.svelte b/js/upload/src/ModifyUpload.svelte index b78b1f502951..2bee880c60d0 100644 --- a/js/upload/src/ModifyUpload.svelte +++ b/js/upload/src/ModifyUpload.svelte @@ -1,7 +1,7 @@ gradio.dispatch("end")} on:start_recording={() => gradio.dispatch("start_recording")} on:stop_recording={() => gradio.dispatch("stop_recording")} + i18n={gradio.i18n} > diff --git a/js/video/interactive/Video.svelte b/js/video/interactive/Video.svelte index 248a00d19310..b24d03a7742b 100644 --- a/js/video/interactive/Video.svelte +++ b/js/video/interactive/Video.svelte @@ -5,10 +5,10 @@ import { BlockLabel } from "@gradio/atoms"; import { Webcam } from "@gradio/image/interactive"; import { Video } from "@gradio/icons"; - import { normalise_file } from "@gradio/upload"; import { prettyBytes, playable } from "../shared/utils"; import Player from "../shared/Player.svelte"; + import type { I18nFormatter } from "@gradio/utils"; export let value: FileData | null = null; export let subtitle: FileData | null = null; @@ -19,6 +19,7 @@ export let include_audio: boolean; export let autoplay: boolean; export let root: string; + export let i18n: I18nFormatter; const dispatch = createEventDispatcher<{ change: any; @@ -71,10 +72,11 @@ on:capture={({ detail }) => dispatch("change", detail)} on:start_recording on:stop_recording + {i18n} /> {/if} {:else} - + {#if playable()} {#key value?.data} gradio.dispatch("end")} on:share={({ detail }) => gradio.dispatch("share", detail)} on:error={({ detail }) => gradio.dispatch("error", detail)} + i18n={gradio.i18n} /> diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 738b2e12d227..bf324416fcd9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -409,6 +409,9 @@ importers: '@gradio/dropdown': specifier: workspace:^ version: link:../dropdown + '@gradio/fallback': + specifier: workspace:^ + version: link:../fallback '@gradio/file': specifier: workspace:^ version: link:../file @@ -769,6 +772,21 @@ importers: specifier: workspace:^ version: link:../utils + js/fallback: + dependencies: + '@gradio/atoms': + specifier: workspace:^ + version: link:../atoms + '@gradio/statustracker': + specifier: workspace:^ + version: link:../statustracker + '@gradio/utils': + specifier: workspace:^ + version: link:../utils + '@zerodevx/svelte-json-view': + specifier: ^1.0.7 + version: 1.0.7(svelte@4.2.0) + js/file: dependencies: '@gradio/atoms': @@ -893,6 +911,33 @@ importers: specifier: ^4.4.9 version: 4.4.9(@types/node@20.3.1)(less@4.1.3)(lightningcss@1.21.7)(sass@1.66.1)(stylus@0.60.0)(sugarss@4.0.1) + js/gradio-preview/test/imageslider/frontend: + dependencies: + '@gradio/atoms': + specifier: workspace:^ + version: link:../../../../atoms + '@gradio/icons': + specifier: workspace:^ + version: link:../../../../icons + '@gradio/statustracker': + specifier: workspace:^ + version: link:../../../../statustracker + '@gradio/upload': + specifier: workspace:^ + version: link:../../../../upload + '@gradio/utils': + specifier: workspace:^ + version: link:../../../../utils + cropperjs: + specifier: ^1.5.12 + version: 1.5.12 + lazy-brush: + specifier: ^1.0.1 + version: 1.0.1 + resize-observer-polyfill: + specifier: ^1.5.1 + version: 1.5.1 + js/gradio-preview/test/newnewtext/frontend: dependencies: '@gradio/atoms': @@ -908,6 +953,12 @@ importers: specifier: workspace:^ version: link:../../../../utils + js/gradio-preview/test/newtext/frontend: + dependencies: + '@zerodevx/svelte-json-view': + specifier: ^1.0 + version: 1.0.7(svelte@4.2.0) + js/group: {} js/highlightedtext: @@ -1153,6 +1204,9 @@ importers: '@gradio/icons': specifier: workspace:^ version: link:../icons + '@gradio/utils': + specifier: workspace:^ + version: link:../utils js/tabitem: dependencies: @@ -1191,7 +1245,11 @@ importers: js/tooltip: {} - js/tootils: {} + js/tootils: + dependencies: + '@gradio/utils': + specifier: workspace:^ + version: link:../utils js/upload: dependencies: @@ -1207,6 +1265,9 @@ importers: '@gradio/upload': specifier: workspace:^ version: 'link:' + '@gradio/utils': + specifier: workspace:^ + version: link:../utils js/uploadbutton: dependencies: @@ -6481,7 +6542,7 @@ packages: peerDependencies: '@sveltejs/kit': ^1.0.0 dependencies: - '@sveltejs/kit': 1.16.3(svelte@3.59.2)(vite@4.3.9) + '@sveltejs/kit': 1.16.3(svelte@3.57.0)(vite@4.3.5) import-meta-resolve: 3.0.0 dev: true @@ -7459,6 +7520,14 @@ packages: tslib: 2.6.1 dev: true + /@zerodevx/svelte-json-view@1.0.7(svelte@4.2.0): + resolution: {integrity: sha512-yW0MV+9BCKOwzt3h86y3xDqYdI5st+Rxk+L5pa0Utq7nlPD+VvxyhL7R1gJoLxQvWwjyAvY/fyUCFTdwDyI14w==} + peerDependencies: + svelte: ^3.57.0 || ^4.0.0 + dependencies: + svelte: 4.2.0 + dev: false + /@zxing/text-encoding@0.9.0: resolution: {integrity: sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==} requiresBuild: true