diff --git a/.changeset/loud-cloths-wait.md b/.changeset/loud-cloths-wait.md new file mode 100644 index 000000000000..4a5945920967 --- /dev/null +++ b/.changeset/loud-cloths-wait.md @@ -0,0 +1,7 @@ +--- +"@gradio/audio": minor +"gradio": minor +"website": minor +--- + +feat:JS READMEs and Storybook on Docs diff --git a/js/_website/generate_jsons/src/docs/__init__.py b/js/_website/generate_jsons/src/docs/__init__.py index 1e2c1ce99b9a..b3cfd0a2e621 100644 --- a/js/_website/generate_jsons/src/docs/__init__.py +++ b/js/_website/generate_jsons/src/docs/__init__.py @@ -8,6 +8,7 @@ DIR = os.path.dirname(__file__) DEMOS_DIR = os.path.abspath(os.path.join(DIR, "../../../../../demo")) JS_CLIENT_README = os.path.abspath(os.path.join(DIR, "../../../../../client/js/README.md")) +JS_DIR = os.path.abspath(os.path.join(DIR, "../../../../../js/")) docs = generate_documentation() docs["component"].sort(key=lambda x: x["name"]) @@ -267,7 +268,6 @@ def organize_docs(d): organized["py-client"][cls]["prev_obj"] = organized["py-client"][ c_keys[len(c_keys) - 2] ]["name"] - organized["py-client"][cls]["next_obj"] = "JS-Client" else: organized["py-client"][cls]["prev_obj"] = organized["py-client"][ c_keys[i - 1] @@ -300,9 +300,28 @@ def organize_docs(d): organized["events_matrix"] = component_events organized["events"] = events + js = {} + js_pages = [] + + for js_component in os.listdir(JS_DIR): + if not js_component.startswith("_") and js_component not in ["app", "highlighted-text", "playground", "preview", "upload-button"]: + if os.path.exists(os.path.join(JS_DIR, js_component, "README.md")): + with open(os.path.join(JS_DIR, js_component, "README.md")) as f: + readme_content = f.read() + js[js_component] = readme_content + js_pages.append(js_component) + + with open(JS_CLIENT_README) as f: readme_content = f.read() - return {"docs": organized, "pages": pages, "js_client": readme_content} + js_pages.append("js-client") + + js["js-client"] = readme_content + + js_pages.sort() + + + return {"docs": organized, "pages": pages, "js": js, "js_pages": js_pages} docs = organize_docs(docs) diff --git a/js/_website/package.json b/js/_website/package.json index 3fcd25089ad9..8f5dcd7ea59c 100644 --- a/js/_website/package.json +++ b/js/_website/package.json @@ -27,7 +27,7 @@ }, "type": "module", "dependencies": { - "@gradio/code": "workspace:^", + "@gradio/code": "0.2.0-beta.6", "@sindresorhus/slugify": "^2.2.0", "@sveltejs/adapter-vercel": "^3.0.3", "hast-util-to-string": "^3.0.0", diff --git a/js/_website/src/lib/components/DemosLite.svelte b/js/_website/src/lib/components/DemosLite.svelte index 18bb51407c12..6cf787914487 100644 --- a/js/_website/src/lib/components/DemosLite.svelte +++ b/js/_website/src/lib/components/DemosLite.svelte @@ -97,7 +97,7 @@ {#each demos as demo, i} diff --git a/js/_website/src/lib/components/Header.svelte b/js/_website/src/lib/components/Header.svelte index cda1b2677e84..aa342c661c15 100644 --- a/js/_website/src/lib/components/Header.svelte +++ b/js/_website/src/lib/components/Header.svelte @@ -11,8 +11,8 @@ // $: selected_version === version && is_versioned && goto("/guides/quickstart"); -
+

diff --git a/js/_website/src/lib/components/JSDocsNav.svelte b/js/_website/src/lib/components/JSDocsNav.svelte new file mode 100644 index 000000000000..c41b9190ffff --- /dev/null +++ b/js/_website/src/lib/components/JSDocsNav.svelte @@ -0,0 +1,152 @@ + + + + +

+ +
(show_nav = false)} + class:hidden={!show_nav} + class="min-w-[200px] navigation mobile-nav overflow-y-auto fixed backdrop-blur-lg z-50 bg-gray-200/50 pr-6 pl-4 py-4 -ml-4 h-full inset-0 w-5/6 lg:inset-auto lg:ml-0 lg:z-0 lg:backdrop-blur-none lg:navigation lg:p-0 lg:pb-4 lg:h-screen lg:leading-relaxed lg:sticky lg:top-0 lg:text-md lg:block rounded-t-xl lg:bg-gradient-to-r lg:from-white lg:to-gray-50 lg:overflow-x-clip lg:w-2/12" + id="mobile-nav" +> + + + + +

+ + + + + + + + Storybook → +

+ +

Components

+ + {#each js_components as name} + {name} + {/each} +

Client

+ JS Client +
diff --git a/js/_website/src/lib/components/VersionDropdown.svelte b/js/_website/src/lib/components/VersionDropdown.svelte index 99d8bde48b7f..ea8be52ce462 100644 --- a/js/_website/src/lib/components/VersionDropdown.svelte +++ b/js/_website/src/lib/components/VersionDropdown.svelte @@ -7,12 +7,15 @@ export let choices = [version, "main"]; export let value: string = $page.params?.version || version; + export let docs_type = "python"; $: is_guide = $page.route.id?.includes("/guides"); $: is_docs = $page.route.id?.includes("/docs/"); $: docs_url = `${value === version ? "" : `/${value}`}/docs/${ - $page.params?.doc || + docs_type == "js" ? "js/" : "" + }${ + $page.params?.jsdoc || $page.params?.doc || (is_dynamic || path_parts.length !== 4 ? "" : path_parts[path_parts.length - 1]) diff --git a/js/_website/src/routes/[[version]]/docs/+layout.server.ts b/js/_website/src/routes/[[version]]/docs/+layout.server.ts index 3e0d105c3661..522359b5bfaa 100644 --- a/js/_website/src/routes/[[version]]/docs/+layout.server.ts +++ b/js/_website/src/routes/[[version]]/docs/+layout.server.ts @@ -33,7 +33,8 @@ export async function load({ params, url }) { let modals = docs_json.docs.modals || []; let routes = docs_json.docs.routes; let py_client = docs_json.docs["py-client"]; - let js_client = docs_json.js_client; + let js = docs_json.js || {}; + let js_pages = docs_json.js_pages || []; let on_main = params.version === "main"; let wheel: string = WHEEL; let pages: string[] = docs_json.pages; @@ -45,7 +46,8 @@ export async function load({ params, url }) { modals, routes, py_client, - js_client, + js, + js_pages, on_main, wheel, pages diff --git a/js/_website/src/routes/[[version]]/docs/[doc]/+page.svelte b/js/_website/src/routes/[[version]]/docs/[doc]/+page.svelte index 7b211db4fa17..5019ae714134 100644 --- a/js/_website/src/routes/[[version]]/docs/[doc]/+page.svelte +++ b/js/_website/src/routes/[[version]]/docs/[doc]/+page.svelte @@ -67,6 +67,7 @@ $: modals = data.modals; $: routes = data.routes; $: py_client = data.py_client; +
- +
@@ -81,4 +81,4 @@ code { font-size: 1rem; } - + \ No newline at end of file diff --git a/js/_website/src/routes/[[version]]/docs/js/+page.server.ts b/js/_website/src/routes/[[version]]/docs/js/+page.server.ts new file mode 100644 index 000000000000..27cb95867aa6 --- /dev/null +++ b/js/_website/src/routes/[[version]]/docs/js/+page.server.ts @@ -0,0 +1,7 @@ +import { redirect } from "@sveltejs/kit"; + +export const prerender = true; + +export function load({ params }) { + throw redirect(302, `./js/accordion`); +} diff --git a/js/_website/src/routes/[[version]]/docs/js/[jsdoc]/+page.server.ts b/js/_website/src/routes/[[version]]/docs/js/[jsdoc]/+page.server.ts new file mode 100644 index 000000000000..4e23cdb67475 --- /dev/null +++ b/js/_website/src/routes/[[version]]/docs/js/[jsdoc]/+page.server.ts @@ -0,0 +1,130 @@ +import { compile } from "mdsvex"; +import anchor from "$lib/assets/img/anchor.svg"; +import { make_slug_processor } from "$lib/utils"; +import { toString as to_string } from "hast-util-to-string"; +import Prism from "prismjs"; +import "prismjs/components/prism-python"; +import "prismjs/components/prism-bash"; +import "prismjs/components/prism-json"; +import "prismjs/components/prism-typescript"; +import "prismjs/components/prism-javascript"; +import "prismjs/components/prism-csv"; +import "prismjs/components/prism-markup"; +import { error } from "@sveltejs/kit"; + +export const prerender = true; + +function plugin() { + return function transform(tree: any) { + tree.children.forEach((n: any) => { + if (n.type === "heading") { + } + }); + }; +} + +const langs = { + python: "python", + py: "python", + bash: "bash", + csv: "csv", + html: "html", + shell: "bash", + json: "json", + typescript: "typescript", + javascript: "javascript", + directory: "json" +}; + +function highlight(code: string, lang: string | undefined) { + const _lang = langs[lang as keyof typeof langs] || ""; + + const highlighted = _lang + ? `
${Prism.highlight(
+				code,
+				Prism.languages[_lang],
+				_lang
+		  )}
` + : code; + + return highlighted; +} + +export async function load({ params, parent }) { + const { + js, + js_pages, + } = await parent(); + + let name = params.jsdoc; + const guide_slug = []; + + const get_slug = make_slug_processor(); + + if (!js_pages.some((p: string) => p === params.jsdoc)) { + throw error(404); + } + function plugin() { + return function transform(tree: any) { + tree.children.forEach((n: any) => { + if ( + n.type === "element" && + ["h2", "h3", "h4", "h5", "h6"].includes(n.tagName) + ) { + const str_of_heading = to_string(n); + const slug = get_slug(str_of_heading); + + guide_slug.push({ + text: str_of_heading, + href: `#${slug}`, + level: parseInt(n.tagName.replace("h", "")) + }); + + if (!n.children) n.children = []; + n.properties.className = ["group"]; + n.properties.id = [slug]; + n.children.push({ + type: "element", + tagName: "a", + properties: { + href: `#${slug}`, + className: ["invisible", "group-hover-visible"] + }, + children: [ + { + type: "element", + tagName: "img", + properties: { + src: anchor, + className: ["anchor-img"] + }, + children: [] + } + ] + }); + } + }); + }; + } + + let readme_html; + + for (const key in js) { + if (key == name) { + const compiled = await compile(js[key], { + rehypePlugins: [plugin], + highlight: { + highlighter: highlight + } + }); + + readme_html = await compiled?.code; + } + } + + return { + name, + readme_html, + js_pages, + }; +} diff --git a/js/_website/src/routes/[[version]]/docs/js/[jsdoc]/+page.svelte b/js/_website/src/routes/[[version]]/docs/js/[jsdoc]/+page.svelte new file mode 100644 index 000000000000..6c44f0bb4511 --- /dev/null +++ b/js/_website/src/routes/[[version]]/docs/js/[jsdoc]/+page.svelte @@ -0,0 +1,69 @@ + + + + +
+
+ + +
+
+

+ New to Gradio? Start here: Getting Started +

+

+ See the Release History +

+
+ +
+
+
+ {@html readme_html} +
+
+
+
+
+
+ + diff --git a/js/_website/src/routes/[[version]]/docs/js/storybook/+page.server.ts b/js/_website/src/routes/[[version]]/docs/js/storybook/+page.server.ts new file mode 100644 index 000000000000..7ea14e23cabd --- /dev/null +++ b/js/_website/src/routes/[[version]]/docs/js/storybook/+page.server.ts @@ -0,0 +1,125 @@ +import { compile } from "mdsvex"; +import anchor from "$lib/assets/img/anchor.svg"; +import { make_slug_processor } from "$lib/utils"; +import { toString as to_string } from "hast-util-to-string"; +import Prism from "prismjs"; +import "prismjs/components/prism-python"; +import "prismjs/components/prism-bash"; +import "prismjs/components/prism-json"; +import "prismjs/components/prism-typescript"; +import "prismjs/components/prism-csv"; +import "prismjs/components/prism-markup"; +import { error } from "@sveltejs/kit"; + +export const prerender = true; + +function plugin() { + return function transform(tree: any) { + tree.children.forEach((n: any) => { + if (n.type === "heading") { + } + }); + }; +} + +const langs = { + python: "python", + py: "python", + bash: "bash", + csv: "csv", + html: "html", + shell: "bash", + json: "json", + typescript: "typescript", + directory: "json" +}; + +function highlight(code: string, lang: string | undefined) { + const _lang = langs[lang as keyof typeof langs] || ""; + + const highlighted = _lang + ? `
${Prism.highlight(
+				code,
+				Prism.languages[_lang],
+				_lang
+		  )}
` + : code; + + return highlighted; +} + +export async function load({ params, parent }) { + const { + js, + js_pages, + } = await parent(); + + let name = params.jsdoc; + const guide_slug = []; + + const get_slug = make_slug_processor(); + + function plugin() { + return function transform(tree: any) { + tree.children.forEach((n: any) => { + if ( + n.type === "element" && + ["h2", "h3", "h4", "h5", "h6"].includes(n.tagName) + ) { + const str_of_heading = to_string(n); + const slug = get_slug(str_of_heading); + + guide_slug.push({ + text: str_of_heading, + href: `#${slug}`, + level: parseInt(n.tagName.replace("h", "")) + }); + + if (!n.children) n.children = []; + n.properties.className = ["group"]; + n.properties.id = [slug]; + n.children.push({ + type: "element", + tagName: "a", + properties: { + href: `#${slug}`, + className: ["invisible", "group-hover-visible"] + }, + children: [ + { + type: "element", + tagName: "img", + properties: { + src: anchor, + className: ["anchor-img"] + }, + children: [] + } + ] + }); + } + }); + }; + } + + let readme_html; + + for (const key in js) { + if (key == name) { + const compiled = await compile(js[key], { + rehypePlugins: [plugin], + highlight: { + highlighter: highlight + } + }); + + readme_html = await compiled?.code; + } + } + + return { + name, + readme_html, + js_pages, + }; +} diff --git a/js/_website/src/routes/[[version]]/docs/js/storybook/+page.svelte b/js/_website/src/routes/[[version]]/docs/js/storybook/+page.svelte new file mode 100644 index 000000000000..82510aa38a5d --- /dev/null +++ b/js/_website/src/routes/[[version]]/docs/js/storybook/+page.svelte @@ -0,0 +1,66 @@ + + + + +
+
+ + +
+
+

+ New to Gradio? Start here: Getting Started +

+

+ See the Release History +

+
+ +
+ +
+
+
+
+ + diff --git a/js/_website/svelte.config.js b/js/_website/svelte.config.js index afa90713a0af..f4a2bc60ddf4 100644 --- a/js/_website/svelte.config.js +++ b/js/_website/svelte.config.js @@ -12,12 +12,17 @@ const config = { kit: { prerender: { + crawl: true, entries: [ "*", `/${version}/docs`, `/${version}/guides`, + `/${version}/docs/js`, + `/${version}/docs/js/storybook`, + `/${version}/docs/js/`, `/main/docs`, - `/main/guides` + `/main/guides`, + `/main/docs/js` // "/main/docs/interface" ] }, diff --git a/js/audio/README.md b/js/audio/README.md index ef337cd8686a..8481b7e275f2 100644 --- a/js/audio/README.md +++ b/js/audio/README.md @@ -2,14 +2,65 @@ ```svelte +``` + + +BaseExample: +```javascript + export let value: string; + export let type: "gallery" | "table"; + export let selected = false; +``` -