diff --git a/.changeset/large-cloths-fall.md b/.changeset/large-cloths-fall.md new file mode 100644 index 000000000000..b72dda77a06b --- /dev/null +++ b/.changeset/large-cloths-fall.md @@ -0,0 +1,6 @@ +--- +"gradio": minor +"website": minor +--- + +feat:Reorganize Docs Navbar and Fill in Gaps diff --git a/gradio/exceptions.py b/gradio/exceptions.py index 738d79424bee..bca214460e8f 100644 --- a/gradio/exceptions.py +++ b/gradio/exceptions.py @@ -37,13 +37,20 @@ class ReloadError(ValueError): InvalidApiName = InvalidApiNameError # backwards compatibility +set_documentation_group("modals") + @document() class Error(Exception): """ This class allows you to pass custom error messages to the user. You can do so by raising a gr.Error("custom message") anywhere in the code, and when that line is executed the custom message will appear in a modal on the demo. - - Demos: calculator + Example: + import gradio as gr + def divide(numerator, denominator): + if denominator == 0: + raise gr.Error("Cannot divide by zero!") + gr.Interface(divide, ["number", "number"], "number").launch() + Demos: calculator, blocks_chained_events """ def __init__(self, message: str = "Error raised."): diff --git a/gradio/helpers.py b/gradio/helpers.py index 99a4bdfa5a48..87ddab00bbd0 100644 --- a/gradio/helpers.py +++ b/gradio/helpers.py @@ -1116,12 +1116,25 @@ def log_message(message: str, level: Literal["info", "warning"] = "info"): blocks._queue.log_message(event_id=event_id, log=message, level=level) +set_documentation_group("modals") + + @document() def Warning(message: str = "Warning issued."): # noqa: N802 """ - This function allows you to pass custom warning messages to the user. You can do so simply with `gr.Warning('message here')`, and when that line is executed the custom message will appear in a modal on the demo. + This function allows you to pass custom warning messages to the user. You can do so simply with `gr.Warning('message here')`, and when that line is executed the custom message will appear in a modal on the demo. The modal is yellow by default and has the heading: "Warning." Queue must be enabled to use Warning. + Demos: blocks_chained_events Parameters: message: The warning message to be displayed to the user. + Example: + import gradio as gr + def hello_world(): + gr.Warning('This is a warning message.') + return "hello world" + with gr.Blocks() as demo: + md = gr.Markdown() + demo.load(hello_world, inputs=None, outputs=[md]) + demo.queue().launch() """ log_message(message, level="warning") @@ -1129,7 +1142,18 @@ def Warning(message: str = "Warning issued."): # noqa: N802 @document() def Info(message: str = "Info issued."): # noqa: N802 """ + This function allows you to pass custom info messages to the user. You can do so simply by writing `gr.Info('message here')` in your function, and when that line is executed the custom message will appear in a (gray, by default) modal on the demo. Queue must be enabled to use Info. + Demos: blocks_chained_events Parameters: message: The info message to be displayed to the user. + Example: + import gradio as gr + def hello_world(): + gr.Info('This is some info.') + return "hello world" + with gr.Blocks() as demo: + md = gr.Markdown() + demo.load(hello_world, inputs=None, outputs=[md]) + demo.queue().launch() """ log_message(message, level="info") diff --git a/js/_website/generate_jsons/src/docs/__init__.py b/js/_website/generate_jsons/src/docs/__init__.py index dc743c321b38..e2170e3a0ce2 100644 --- a/js/_website/generate_jsons/src/docs/__init__.py +++ b/js/_website/generate_jsons/src/docs/__init__.py @@ -149,6 +149,7 @@ def organize_docs(d): "building": {}, "components": {}, "helpers": {}, + "modals": {}, "routes": {}, "events": {}, "py-client": {}, @@ -175,7 +176,7 @@ def organize_docs(d): if mode == "component": organized["components"][c["name"].lower()] = c pages.append(c["name"].lower()) - elif mode in ["helpers", "routes", "py-client", "chatinterface"]: + elif mode in ["helpers", "routes", "py-client", "chatinterface", "modals"]: organized[mode][c["name"].lower()] = c pages.append(c["name"].lower()) @@ -196,7 +197,7 @@ def organize_docs(d): organized["components"][cls]["prev_obj"] = organized["components"][ c_keys[len(c_keys) - 2] ]["name"] - organized["components"][cls]["next_obj"] = "Examples" + organized["components"][cls]["next_obj"] = "load" else: organized["components"][cls]["prev_obj"] = organized["components"][ c_keys[i - 1] @@ -215,7 +216,7 @@ def organize_docs(d): organized["helpers"][cls]["prev_obj"] = organized["helpers"][ c_keys[len(c_keys) - 2] ]["name"] - organized["helpers"][cls]["next_obj"] = "Request" + organized["helpers"][cls]["next_obj"] = "Error" else: organized["helpers"][cls]["prev_obj"] = organized["helpers"][c_keys[i - 1]][ "name" @@ -223,10 +224,30 @@ def organize_docs(d): organized["helpers"][cls]["next_obj"] = organized["helpers"][c_keys[i + 1]][ "name" ] + c_keys = list(organized["modals"].keys()) + for i, cls in enumerate(organized["modals"]): + if not i: + organized["modals"][cls]["prev_obj"] = "EventData" + organized["modals"][cls]["next_obj"] = organized["modals"][c_keys[1]][ + "name" + ] + elif i == len(c_keys) - 1: + organized["modals"][cls]["prev_obj"] = organized["modals"][ + c_keys[len(c_keys) - 2] + ]["name"] + organized["modals"][cls]["next_obj"] = "Request" + else: + organized["modals"][cls]["prev_obj"] = organized["modals"][c_keys[i - 1]][ + "name" + ] + organized["modals"][cls]["next_obj"] = organized["modals"][c_keys[i + 1]][ + "name" + ] + c_keys = list(organized["routes"].keys()) for i, cls in enumerate(organized["routes"]): if not i: - organized["routes"][cls]["prev_obj"] = "make_waveform" + organized["routes"][cls]["prev_obj"] = "Info" organized["routes"][cls]["next_obj"] = organized["routes"][c_keys[1]][ "name" ] @@ -234,7 +255,7 @@ def organize_docs(d): organized["routes"][cls]["prev_obj"] = organized["routes"][ c_keys[len(c_keys) - 2] ]["name"] - organized["routes"][cls]["next_obj"] = "Python-Client" + organized["routes"][cls]["next_obj"] = "Flagging" else: organized["routes"][cls]["prev_obj"] = organized["routes"][c_keys[i - 1]][ "name" @@ -266,6 +287,23 @@ def organize_docs(d): organized["chatinterface"][cls]["prev_obj"] = "Block-Layouts" organized["chatinterface"][cls]["next_obj"] = "Themes" + layout_keys = ["row", "column", "tab", "group", "accordion"] + for i, cls in enumerate(layout_keys): + if not i: + organized["building"][cls]["prev_obj"] = "Blocks" + organized["building"][cls]["next_obj"] = layout_keys[i+1].capitalize() + elif i == len(layout_keys) - 1: + organized["building"][cls]["prev_obj"] = layout_keys[i-1].capitalize() + organized["building"][cls]["next_obj"] = "Components" + else: + organized["building"][cls]["prev_obj"] = layout_keys[i-1].capitalize() + organized["building"][cls]["next_obj"] = layout_keys[i+1].capitalize() + + + organized["building"][cls]["prev_obj"] + + + organized["events_matrix"] = component_events organized["events"] = events diff --git a/js/_website/src/lib/components/DocsNav.svelte b/js/_website/src/lib/components/DocsNav.svelte index ba7aae0ce32c..a46dd181c97c 100644 --- a/js/_website/src/lib/components/DocsNav.svelte +++ b/js/_website/src/lib/components/DocsNav.svelte @@ -4,6 +4,7 @@ export let components: any; export let helpers: any; + export let modals: any; export let routes: any; export let py_client: any; @@ -105,43 +106,59 @@ - Building Demos +

Building Demos

Interface FlaggingChatInterfaceNEW Combining InterfacesTabbedInterface + Blocks + +

Block Layouts

+ Block LayoutsRow ChatInterfaceNEWColumn ThemesTab + Group + Accordion + {obj.name} {/each} - Helpers +

Helpers

{#each Object.entries(helpers) as [name, obj] (name)} {obj.name} {/each} - Routes +

Modals

+ {#each Object.entries(modals) as [name, obj] (name)} + {obj.name} + {/each} + +

Routes

{#each Object.entries(routes) as [name, obj] (name)} {obj.name} {/each} + +

Other

+ + Flagging + Themes + @@ -506,7 +513,7 @@ -
+
{#if obj.prev_obj} { - if (fn.name) fn.slug = get_slug(`${obj.name} ${fn.name}`); - }); - } - - if ("demos" in obj) { - obj.demos.forEach((demo: string[]) => { - demo.push( - Prism.highlight(demo[1], Prism.languages[language], "python") - ); - }); - } - if (obj.example) { - obj.highlighted_example = Prism.highlight( - obj.example, - Prism.languages[language], - "python" - ); - } - - if ("fns" in obj && obj.fns.length > 0) { - for (const fn of obj.fns) { - if (fn.example) { - fn.highlighted_example = Prism.highlight( - fn.example, - Prism.languages[language], - "python" - ); - } - } - } - } - let mode = "block-layouts"; - - let description = `Customize the layout of your Blocks UI with the layout classes below.`; - - return { - objs, - mode, - description, - components, - helpers, - routes, - py_client, - COLOR_SETS, - headers, - method_headers, - on_main, - wheel - }; -} diff --git a/js/_website/src/routes/[[version]]/docs/block-layouts/+page.svelte b/js/_website/src/routes/[[version]]/docs/block-layouts/+page.svelte deleted file mode 100644 index 0afb61fe8c53..000000000000 --- a/js/_website/src/routes/[[version]]/docs/block-layouts/+page.svelte +++ /dev/null @@ -1,528 +0,0 @@ - - - - - - -
-
- - -
- - - {#if on_main} -
-

- To install Gradio from main, run the following command: -

- -
pip install {wheel}
-

- *Note: Setting share=True in launch() will not work. -

-
- {/if} - - - -
-
-
- -
-

- Block Layouts - -

-
- -
-

- Description - -

-

{@html description}

-
- - {#each objs as obj} -
-
-

- {obj.name} - -

-
- - {#if obj.override_signature} -
-
{obj.override_signature}
-
- {:else} -
-
{obj.parent}.{obj.name}({#each obj.parameters as param}{#if !("kwargs" in param) && !("default" in param) && param.name != "self"}{param.name}, {/if}{/each}···)
-
- {/if} - - {#if mode === "components"} -
- {#key obj.name} - - {/key} -
- {/if} - -

- Description - -

-

{@html obj.description}

- - {#if mode === "components"} -

- As input: - {@html obj.preprocessing} -

-

- As output: - {@html obj.postprocessing} -

- {#if obj.examples_format} -

- Format expected for examples: - {@html obj.examples_format}} -

- {/if} - {#if obj.events && obj.events.length > 0} -

- Supported events: - {@html obj.events} -

- {/if} - {/if} - - {#if obj.example} -

- Example Usage - -

-
-
{@html obj.highlighted_example}
-
- {/if} - - {#if (obj.parameters.length > 0 && obj.parameters[0].name != "self") || obj.parameters.length > 1} -

- Initialization - -

- - - - - - - - - {#each obj.parameters as param} - {#if param["name"] != "self"} - - - - - {/if} - {/each} - -
ParameterDescription
- - {param["name"]} - -

- {param["annotation"]} -

- {#if "default" in param} -

- default: {param["default"]} -

- {:else if !("kwargs" in param)} -

- required -

- {/if} -
-

{param["doc"] || ""}

-
- {/if} - - {#if mode === "components" && obj.string_shortcuts} - - - - - - - - - - {#each obj.string_shortcuts as shortcut} - - - - - - {/each} - -
ClassInterface String ShortcutInitialization
-

- gradio.{shortcut[0]} -

-
-

"{shortcut[1]}"

-
- {shortcut[2]} -
- {/if} - - {#if obj.fns && obj.fns.length > 0} -

Methods

-
- {#each obj.fns as fn} - - {/each} -
-
- {/if} - - {#if obj.guides && obj.guides.length > 0} -
-

- Guides - -

- -
- {#each obj.guides as guide, i} - -
-

- {guide.pretty_name} -

-
-
- {/each} -
-
- {/if} - - {#if obj.demos} -
-
-

- ✨ {obj.name} Examples - -

-
-
-
-
- {#each obj.demos as demo, i} - - {/each} -
- {#each obj.demos as demo, i} -
- -
- {/each} -
-
-
-
-
- {/if} -
- {/each} -
-
- - -
- -
-
diff --git a/js/_website/src/routes/[[version]]/docs/combining-interfaces/+page.server.ts b/js/_website/src/routes/[[version]]/docs/combining-interfaces/+page.server.ts deleted file mode 100644 index e6a3cf3a616c..000000000000 --- a/js/_website/src/routes/[[version]]/docs/combining-interfaces/+page.server.ts +++ /dev/null @@ -1,88 +0,0 @@ -import Prism from "prismjs"; -import "prismjs/components/prism-python"; -import { make_slug_processor } from "$lib/utils"; - -let language = "python"; - -const COLOR_SETS = [ - ["from-green-100", "to-green-50"], - ["from-yellow-100", "to-yellow-50"], - ["from-red-100", "to-red-50"], - ["from-blue-100", "to-blue-50"], - ["from-pink-100", "to-pink-50"], - ["from-purple-100", "to-purple-50"] -]; - -export async function load({ parent }) { - const { docs, components, helpers, py_client, routes, on_main, wheel } = await parent(); - - let objs = [ - docs.building.tabbedinterface, - docs.building.parallel, - docs.building.series - ]; - let headers = [ - ["Tabbed Interface", "tabbed-interface"], - ["Parallel", "parallel"], - ["Series", "series"] - ]; - let method_headers: string[][] = []; - const get_slug = make_slug_processor(); - - for (let obj of objs) { - if (obj.name) { - obj.slug = get_slug(obj.name); - } - - if (obj.fns && obj.fns.length) { - obj.fns.forEach((fn: any) => { - if (fn.name) fn.slug = get_slug(`${obj.name} ${fn.name}`); - }); - } - - if ("demos" in obj) { - obj.demos.forEach((demo: string[]) => { - demo.push( - Prism.highlight(demo[1], Prism.languages[language], "python") - ); - }); - } - if (obj.example) { - obj.highlighted_example = Prism.highlight( - obj.example, - Prism.languages[language], - "python" - ); - } - - if ("fns" in obj && obj.fns.length > 0) { - for (const fn of obj.fns) { - if (fn.example) { - fn.highlighted_example = Prism.highlight( - fn.example, - Prism.languages[language], - "python" - ); - } - } - } - } - let mode = "combining-interfaces"; - - let description = `Once you have created several Interfaces, we provide several classes that let you start combining them together. For example, you can chain them in Series or compare their outputs in Parallel if the inputs and outputs match accordingly. You can also display arbitrary Interfaces together in a tabbed layout using TabbedInterface.`; - - return { - objs, - mode, - description, - components, - helpers, - routes, - py_client, - COLOR_SETS, - headers, - method_headers, - on_main, - wheel - }; -} diff --git a/js/_website/src/routes/[[version]]/docs/combining-interfaces/+page.svelte b/js/_website/src/routes/[[version]]/docs/combining-interfaces/+page.svelte deleted file mode 100644 index 0cbad2d7a90e..000000000000 --- a/js/_website/src/routes/[[version]]/docs/combining-interfaces/+page.svelte +++ /dev/null @@ -1,528 +0,0 @@ - - - - - -
-
- - -
-
-

- New to Gradio? Start here: Getting Started -

-

- See the Release History -

-
- - {#if on_main} -
-

- To install Gradio from main, run the following command: -

- -
pip install {wheel}
-

- *Note: Setting share=True in launch() will not work. -

-
- {/if} - - - -
-
-
-
-

- Combining Interfaces - -

-
-
-

- Description - -

-

{@html description}

-
-
- - {#each objs as obj} -
-
-

- {obj.name} - -

-
- - {#if obj.override_signature} -
-
{obj.override_signature}
-
- {:else} -
-
{obj.parent}.{obj.name}({#each obj.parameters as param}{#if !("kwargs" in param) && !("default" in param) && param.name != "self"}{param.name}, {/if}{/each}···)
-
- {/if} - - {#if mode === "components"} -
- {#key obj.name} - - {/key} -
- {/if} - -

- Description - -

-

{@html obj.description}

- - {#if mode === "components"} -

- As input: - {@html obj.preprocessing} -

-

- As output: - {@html obj.postprocessing} -

- {#if obj.examples_format} -

- Format expected for examples: - {@html obj.examples_format}} -

- {/if} - {#if obj.events && obj.events.length > 0} -

- Supported events: - {@html obj.events} -

- {/if} - {/if} - - {#if obj.example} -

- Example Usage - -

-
-
{@html obj.highlighted_example}
-
- {/if} - - {#if (obj.parameters.length > 0 && obj.parameters[0].name != "self") || obj.parameters.length > 1} -

- Initialization - -

- - - - - - - - - {#each obj.parameters as param} - {#if param["name"] != "self"} - - - - - {/if} - {/each} - -
ParameterDescription
- - {param["name"]} - -

- {param["annotation"]} -

- {#if "default" in param} -

- default: {param["default"]} -

- {:else if !("kwargs" in param)} -

- required -

- {/if} -
-

{param["doc"] || ""}

-
- {/if} - - {#if mode === "components" && obj.string_shortcuts} - - - - - - - - - - {#each obj.string_shortcuts as shortcut} - - - - - - {/each} - -
ClassInterface String ShortcutInitialization
-

- gradio.{shortcut[0]} -

-
-

"{shortcut[1]}"

-
- {shortcut[2]} -
- {/if} - - {#if obj.fns && obj.fns.length > 0} -

Methods

-
- {#each obj.fns as fn} - - {/each} -
-
- {/if} - - {#if obj.guides && obj.guides.length > 0} -

- Guides - -

- -
- {#each obj.guides as guide, i} - -
-

- {guide.pretty_name} -

-
-
- {/each} -
- {/if} - - {#if obj.demos} -
-

- Demos - -

-
-
-
-
- {#each obj.demos as demo, i} - - {/each} -
- {#each obj.demos as demo, i} -
- -
- {/each} -
-
-
-
- {/if} -
- {/each} -
-
- -
- -
-
diff --git a/js/_website/src/routes/[[version]]/docs/components/+page.server.ts b/js/_website/src/routes/[[version]]/docs/components/+page.server.ts index 1c0e02dc1c16..e6ed7870f670 100644 --- a/js/_website/src/routes/[[version]]/docs/components/+page.server.ts +++ b/js/_website/src/routes/[[version]]/docs/components/+page.server.ts @@ -1,11 +1,12 @@ export async function load({ parent }) { - const { docs, components, helpers, py_client, routes, on_main, wheel } = await parent(); + const { docs, components, helpers, modals, py_client, routes, on_main, wheel } = await parent(); let events = docs.events; let events_matrix = docs.events_matrix; return { components, helpers, + modals, routes, py_client, events, diff --git a/js/_website/src/routes/[[version]]/docs/components/+page.svelte b/js/_website/src/routes/[[version]]/docs/components/+page.svelte index 1d9c74a9355a..8429fe463322 100644 --- a/js/_website/src/routes/[[version]]/docs/components/+page.svelte +++ b/js/_website/src/routes/[[version]]/docs/components/+page.svelte @@ -10,6 +10,7 @@ let components = data.components; let helpers = data.helpers; + let modals = data.modals; let routes = data.routes; let events = data.events; let events_matrix = data.events_matrix; @@ -26,6 +27,11 @@ } $: on_main = data.on_main; + $: components = data.components; + $: helpers = data.helpers; + $: modals = data.modals; + $: routes = data.routes; + $: py_client = data.py_client; @@ -82,24 +89,24 @@
- - + \ No newline at end of file diff --git a/js/_website/src/routes/[[version]]/docs/flagging/+page.server.ts b/js/_website/src/routes/[[version]]/docs/flagging/+page.server.ts index c58fdf0e847b..5e79c9b9f682 100644 --- a/js/_website/src/routes/[[version]]/docs/flagging/+page.server.ts +++ b/js/_website/src/routes/[[version]]/docs/flagging/+page.server.ts @@ -14,7 +14,7 @@ const COLOR_SETS = [ ]; export async function load({ parent }) { - const { docs, components, helpers, py_client, routes, on_main, wheel } = await parent(); + const { docs, components, helpers, modals, py_client, routes, on_main, wheel } = await parent(); let objs = [ docs.building.simplecsvlogger, @@ -78,6 +78,7 @@ export async function load({ parent }) { description, components, helpers, + modals, routes, py_client, COLOR_SETS, diff --git a/js/_website/src/routes/[[version]]/docs/flagging/+page.svelte b/js/_website/src/routes/[[version]]/docs/flagging/+page.svelte index 64d91ac3c6cc..7867b47966af 100644 --- a/js/_website/src/routes/[[version]]/docs/flagging/+page.svelte +++ b/js/_website/src/routes/[[version]]/docs/flagging/+page.svelte @@ -16,6 +16,7 @@ let description = data.description; let components = data.components; let helpers = data.helpers; + let modals = data.modals; let routes = data.routes; let headers = data.headers; let method_headers = data.method_headers; @@ -64,6 +65,11 @@ } $: on_main = data.on_main; + $: components = data.components; + $: helpers = data.helpers; + $: modals = data.modals; + $: routes = data.routes; + $: py_client = data.py_client; @@ -122,19 +129,19 @@ @@ -468,21 +475,21 @@
-
+ diff --git a/js/_website/src/routes/[[version]]/docs/js-client/+page.server.ts b/js/_website/src/routes/[[version]]/docs/js-client/+page.server.ts index 51cac062ab77..d341272f5d35 100644 --- a/js/_website/src/routes/[[version]]/docs/js-client/+page.server.ts +++ b/js/_website/src/routes/[[version]]/docs/js-client/+page.server.ts @@ -46,7 +46,7 @@ function highlight(code: string, lang: string | undefined) { } export async function load({ parent }) { - const { components, helpers, py_client, routes, js_client, on_main, wheel } = await parent(); + const { components, helpers, modals, py_client, routes, js_client, on_main, wheel } = await parent(); const guide_slug = []; @@ -106,6 +106,7 @@ export async function load({ parent }) { readme_html, components, helpers, + modals, routes, py_client }; diff --git a/js/_website/src/routes/[[version]]/docs/js-client/+page.svelte b/js/_website/src/routes/[[version]]/docs/js-client/+page.svelte index fa677649924c..813e1d5a4f44 100644 --- a/js/_website/src/routes/[[version]]/docs/js-client/+page.svelte +++ b/js/_website/src/routes/[[version]]/docs/js-client/+page.svelte @@ -7,10 +7,16 @@ let components = data.components; let helpers = data.helpers; + let modals = data.modals; let routes = data.routes; let py_client = data.py_client; let readme_html = data.readme_html; + $: components = data.components; + $: helpers = data.helpers; + $: modals = data.modals; + $: routes = data.routes; + $: py_client = data.py_client; diff --git a/js/_website/src/routes/[[version]]/docs/python-client/+page.server.ts b/js/_website/src/routes/[[version]]/docs/python-client/+page.server.ts index 8a6ea06efeca..7c29501fb288 100644 --- a/js/_website/src/routes/[[version]]/docs/python-client/+page.server.ts +++ b/js/_website/src/routes/[[version]]/docs/python-client/+page.server.ts @@ -1,9 +1,10 @@ export async function load({ parent }) { - const { components, helpers, py_client, routes, on_main, wheel } = await parent(); + const { components, helpers, modals, py_client, routes, on_main, wheel } = await parent(); return { components, helpers, + modals, routes, py_client, on_main, diff --git a/js/_website/src/routes/[[version]]/docs/python-client/+page.svelte b/js/_website/src/routes/[[version]]/docs/python-client/+page.svelte index d22e9db4e34a..16078a89f684 100644 --- a/js/_website/src/routes/[[version]]/docs/python-client/+page.svelte +++ b/js/_website/src/routes/[[version]]/docs/python-client/+page.svelte @@ -8,6 +8,7 @@ export let data; let components = data.components; let helpers = data.helpers; + let modals = data.modals; let routes = data.routes; let py_client = data.py_client; @@ -22,7 +23,11 @@ } $: on_main = data.on_main; - + $: components = data.components; + $: helpers = data.helpers; + $: modals = data.modals; + $: routes = data.routes; + $: py_client = data.py_client; @@ -79,11 +85,11 @@
-
+