@gradio/core 0.28.0 → 0.29.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +61 -0
- package/dist/src/Blocks.svelte +16 -9
- package/dist/src/Embed.svelte +27 -35
- package/dist/src/Embed.svelte.d.ts +1 -2
- package/dist/src/Render.svelte +10 -5
- package/dist/src/RenderComponent.svelte.d.ts +1 -1
- package/dist/src/api_docs/CodeSnippet.svelte +10 -10
- package/dist/src/i18n.js +23 -4
- package/dist/src/init.js +32 -49
- package/dist/src/lang/ar.json +22 -14
- package/dist/src/types.d.ts +1 -0
- package/package.json +55 -56
- package/src/Blocks.svelte +18 -9
- package/src/Embed.svelte +28 -37
- package/src/Render.svelte +15 -7
- package/src/RenderComponent.svelte +1 -1
- package/src/api_docs/CodeSnippet.svelte +10 -10
- package/src/i18n.ts +27 -6
- package/src/init.ts +45 -59
- package/src/lang/ar.json +22 -14
- package/src/types.ts +1 -0
- package/dist/src/stories/I18nMultiLanguageTest.stories.d.ts +0 -11
- package/public/static/img/Bunny.obj +0 -7474
- package/public/static/img/Duck.glb +0 -0
package/package.json
CHANGED
|
@@ -1,69 +1,68 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gradio/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.29.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"devDependencies": {
|
|
6
|
-
"@gradio/accordion": "^0.5.
|
|
7
|
-
"@gradio/annotatedimage": "^0.
|
|
8
|
-
"@gradio/atoms": "^0.
|
|
9
|
-
"@gradio/audio": "^0.
|
|
6
|
+
"@gradio/accordion": "^0.5.24",
|
|
7
|
+
"@gradio/annotatedimage": "^0.10.0",
|
|
8
|
+
"@gradio/atoms": "^0.18.1",
|
|
9
|
+
"@gradio/audio": "^0.19.2",
|
|
10
10
|
"@gradio/browserstate": "^0.3.2",
|
|
11
|
-
"@gradio/box": "^0.2.
|
|
12
|
-
"@gradio/button": "^0.5.
|
|
13
|
-
"@gradio/chatbot": "^0.
|
|
14
|
-
"@gradio/
|
|
15
|
-
"@gradio/
|
|
16
|
-
"@gradio/client": "^1.
|
|
17
|
-
"@gradio/code": "^0.
|
|
18
|
-
"@gradio/
|
|
19
|
-
"@gradio/
|
|
20
|
-
"@gradio/
|
|
21
|
-
"@gradio/
|
|
22
|
-
"@gradio/
|
|
23
|
-
"@gradio/
|
|
24
|
-
"@gradio/fallback": "^0.4.
|
|
25
|
-
"@gradio/
|
|
26
|
-
"@gradio/
|
|
27
|
-
"@gradio/fileexplorer": "^0.5.
|
|
28
|
-
"@gradio/form": "^0.2.
|
|
29
|
-
"@gradio/
|
|
30
|
-
"@gradio/group": "^0.2.
|
|
31
|
-
"@gradio/html": "^0.7.1",
|
|
32
|
-
"@gradio/gallery": "^0.15.32",
|
|
11
|
+
"@gradio/box": "^0.2.25",
|
|
12
|
+
"@gradio/button": "^0.5.13",
|
|
13
|
+
"@gradio/chatbot": "^0.27.0",
|
|
14
|
+
"@gradio/checkboxgroup": "^0.7.0",
|
|
15
|
+
"@gradio/checkbox": "^0.4.31",
|
|
16
|
+
"@gradio/client": "^1.19.1",
|
|
17
|
+
"@gradio/code": "^0.15.0",
|
|
18
|
+
"@gradio/column": "^0.2.2",
|
|
19
|
+
"@gradio/colorpicker": "^0.4.29",
|
|
20
|
+
"@gradio/dataframe": "^0.20.1",
|
|
21
|
+
"@gradio/dataset": "^0.4.34",
|
|
22
|
+
"@gradio/datetime": "^0.3.22",
|
|
23
|
+
"@gradio/downloadbutton": "^0.4.12",
|
|
24
|
+
"@gradio/fallback": "^0.4.29",
|
|
25
|
+
"@gradio/file": "^0.13.0",
|
|
26
|
+
"@gradio/dropdown": "^0.10.4",
|
|
27
|
+
"@gradio/fileexplorer": "^0.5.41",
|
|
28
|
+
"@gradio/form": "^0.2.25",
|
|
29
|
+
"@gradio/gallery": "^0.15.34",
|
|
30
|
+
"@gradio/group": "^0.2.1",
|
|
33
31
|
"@gradio/icons": "^0.14.0",
|
|
34
|
-
"@gradio/
|
|
35
|
-
"@gradio/
|
|
36
|
-
"@gradio/image": "^0.
|
|
37
|
-
"@gradio/
|
|
38
|
-
"@gradio/
|
|
39
|
-
"@gradio/
|
|
40
|
-
"@gradio/
|
|
41
|
-
"@gradio/
|
|
42
|
-
"@gradio/
|
|
43
|
-
"@gradio/
|
|
44
|
-
"@gradio/
|
|
45
|
-
"@gradio/
|
|
46
|
-
"@gradio/
|
|
47
|
-
"@gradio/
|
|
48
|
-
"@gradio/
|
|
49
|
-
"@gradio/
|
|
50
|
-
"@gradio/
|
|
51
|
-
"@gradio/
|
|
52
|
-
"@gradio/
|
|
32
|
+
"@gradio/highlightedtext": "^0.9.13",
|
|
33
|
+
"@gradio/html": "^0.7.2",
|
|
34
|
+
"@gradio/image": "^0.23.1",
|
|
35
|
+
"@gradio/imageeditor": "^0.17.1",
|
|
36
|
+
"@gradio/imageslider": "^0.3.0",
|
|
37
|
+
"@gradio/json": "^0.5.31",
|
|
38
|
+
"@gradio/markdown": "^0.13.22",
|
|
39
|
+
"@gradio/multimodaltextbox": "^0.10.20",
|
|
40
|
+
"@gradio/model3d": "^0.15.0",
|
|
41
|
+
"@gradio/label": "^0.5.21",
|
|
42
|
+
"@gradio/nativeplot": "^0.8.0",
|
|
43
|
+
"@gradio/paramviewer": "^0.8.1",
|
|
44
|
+
"@gradio/number": "^0.7.1",
|
|
45
|
+
"@gradio/plot": "^0.9.24",
|
|
46
|
+
"@gradio/radio": "^0.7.12",
|
|
47
|
+
"@gradio/sidebar": "^0.1.23",
|
|
48
|
+
"@gradio/row": "^0.2.2",
|
|
49
|
+
"@gradio/simpleimage": "^0.9.0",
|
|
50
|
+
"@gradio/simpletextbox": "^0.3.30",
|
|
51
|
+
"@gradio/sketchbox": "^0.6.17",
|
|
52
|
+
"@gradio/simpledropdown": "^0.3.29",
|
|
53
|
+
"@gradio/slider": "^0.6.18",
|
|
53
54
|
"@gradio/state": "^0.1.2",
|
|
54
|
-
"@gradio/
|
|
55
|
-
"@gradio/
|
|
56
|
-
"@gradio/
|
|
57
|
-
"@gradio/
|
|
58
|
-
"@gradio/textbox": "^0.11.0",
|
|
55
|
+
"@gradio/tabitem": "^0.6.1",
|
|
56
|
+
"@gradio/textbox": "^0.11.1",
|
|
57
|
+
"@gradio/tabs": "^0.5.1",
|
|
58
|
+
"@gradio/statustracker": "^0.11.1",
|
|
59
59
|
"@gradio/timer": "^0.4.5",
|
|
60
|
+
"@gradio/upload": "^0.17.1",
|
|
60
61
|
"@gradio/theme": "^0.4.0",
|
|
61
|
-
"@gradio/uploadbutton": "^0.9.
|
|
62
|
+
"@gradio/uploadbutton": "^0.9.12",
|
|
63
|
+
"@gradio/vibeeditor": "^0.3.0",
|
|
62
64
|
"@gradio/utils": "^0.10.2",
|
|
63
|
-
"@gradio/
|
|
64
|
-
"@gradio/vibeeditor": "^0.2.3",
|
|
65
|
-
"@gradio/video": "^0.15.1",
|
|
66
|
-
"@gradio/wasm": "^0.18.1"
|
|
65
|
+
"@gradio/video": "^0.16.0"
|
|
67
66
|
},
|
|
68
67
|
"msw": {
|
|
69
68
|
"workerDirectory": "public"
|
package/src/Blocks.svelte
CHANGED
|
@@ -876,7 +876,11 @@
|
|
|
876
876
|
const { id, prop, value } = e.detail;
|
|
877
877
|
if (prop === "value") {
|
|
878
878
|
update_value([
|
|
879
|
-
{
|
|
879
|
+
{
|
|
880
|
+
id,
|
|
881
|
+
prop: "loading_status",
|
|
882
|
+
value: { validation_error: undefined }
|
|
883
|
+
}
|
|
880
884
|
]);
|
|
881
885
|
}
|
|
882
886
|
update_value([{ id, prop, value }]);
|
|
@@ -1059,25 +1063,27 @@
|
|
|
1059
1063
|
let footer_height = 0;
|
|
1060
1064
|
|
|
1061
1065
|
let root_container: HTMLElement;
|
|
1062
|
-
$: root_node = $_layout && get_root_node(root_container);
|
|
1063
1066
|
|
|
1064
1067
|
function get_root_node(container: HTMLElement | null): HTMLElement | null {
|
|
1065
1068
|
if (!container) return null;
|
|
1066
1069
|
return container.children[container.children.length - 1] as HTMLElement;
|
|
1067
1070
|
}
|
|
1068
1071
|
|
|
1072
|
+
function handle_resize(): void {
|
|
1073
|
+
if ("parentIFrame" in window) {
|
|
1074
|
+
const box = root_container.children[0].getBoundingClientRect();
|
|
1075
|
+
if (!box) return;
|
|
1076
|
+
window.parentIFrame?.size(box.bottom + footer_height + 32);
|
|
1077
|
+
}
|
|
1078
|
+
}
|
|
1079
|
+
|
|
1069
1080
|
onMount(() => {
|
|
1070
1081
|
if ("parentIFrame" in window) {
|
|
1071
1082
|
window.parentIFrame?.autoResize(false);
|
|
1072
1083
|
}
|
|
1073
1084
|
|
|
1074
|
-
const mut = new MutationObserver(
|
|
1075
|
-
|
|
1076
|
-
const box = root_node?.getBoundingClientRect();
|
|
1077
|
-
if (!box) return;
|
|
1078
|
-
window.parentIFrame?.size(box.bottom + footer_height + 32);
|
|
1079
|
-
}
|
|
1080
|
-
});
|
|
1085
|
+
const mut = new MutationObserver(handle_resize);
|
|
1086
|
+
const res = new ResizeObserver(handle_resize);
|
|
1081
1087
|
|
|
1082
1088
|
mut.observe(root_container, {
|
|
1083
1089
|
childList: true,
|
|
@@ -1085,8 +1091,11 @@
|
|
|
1085
1091
|
attributes: true
|
|
1086
1092
|
});
|
|
1087
1093
|
|
|
1094
|
+
res.observe(root_container);
|
|
1095
|
+
|
|
1088
1096
|
return () => {
|
|
1089
1097
|
mut.disconnect();
|
|
1098
|
+
res.disconnect();
|
|
1090
1099
|
};
|
|
1091
1100
|
});
|
|
1092
1101
|
</script>
|
package/src/Embed.svelte
CHANGED
|
@@ -9,20 +9,16 @@
|
|
|
9
9
|
export let initial_height: string;
|
|
10
10
|
export let fill_width: boolean;
|
|
11
11
|
export let is_embed: boolean;
|
|
12
|
-
export let is_lite: boolean;
|
|
13
12
|
|
|
14
13
|
export let space: string | null;
|
|
15
14
|
export let display: boolean;
|
|
16
15
|
export let info: boolean;
|
|
17
16
|
export let loaded: boolean;
|
|
18
|
-
export let pages: [string, string][] = [];
|
|
17
|
+
export let pages: [string, string, boolean][] = [];
|
|
19
18
|
export let current_page = "";
|
|
20
19
|
export let root: string;
|
|
21
20
|
export let components: any[] = [];
|
|
22
21
|
|
|
23
|
-
const set_page: ((page: string) => void) | undefined =
|
|
24
|
-
getContext("set_lite_page");
|
|
25
|
-
|
|
26
22
|
let navbar_component = components.find((c) => c.type === "navbar");
|
|
27
23
|
let navbar: {
|
|
28
24
|
visible: boolean;
|
|
@@ -52,16 +48,25 @@
|
|
|
52
48
|
pages.length > 1 && (navbar === null || navbar.visible !== false);
|
|
53
49
|
|
|
54
50
|
$: effective_pages = (() => {
|
|
51
|
+
let visible_pages = pages.filter(([route, label, show], index) => {
|
|
52
|
+
if (index === 0 && route === "") {
|
|
53
|
+
return navbar?.main_page_name !== false;
|
|
54
|
+
}
|
|
55
|
+
return show !== false;
|
|
56
|
+
});
|
|
57
|
+
|
|
55
58
|
let base_pages =
|
|
56
59
|
navbar &&
|
|
57
60
|
navbar.main_page_name !== false &&
|
|
58
61
|
navbar.main_page_name !== "Home"
|
|
59
|
-
?
|
|
62
|
+
? visible_pages.map(([route, label, show], index) =>
|
|
60
63
|
index === 0 && route === "" && label === "Home"
|
|
61
64
|
? ([route, navbar!.main_page_name] as [string, string])
|
|
62
65
|
: ([route, label] as [string, string])
|
|
63
66
|
)
|
|
64
|
-
:
|
|
67
|
+
: visible_pages.map(
|
|
68
|
+
([route, label]) => [route, label] as [string, string]
|
|
69
|
+
);
|
|
65
70
|
|
|
66
71
|
if (navbar?.value && navbar.value.length > 0) {
|
|
67
72
|
const existing_routes = new Set(base_pages.map(([route]) => route));
|
|
@@ -91,32 +96,20 @@
|
|
|
91
96
|
<div class="nav-holder">
|
|
92
97
|
<nav class="fillable" class:fill_width>
|
|
93
98
|
{#each effective_pages as [route, label], i}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
class:active={route === current_page}
|
|
109
|
-
data-sveltekit-reload
|
|
110
|
-
target={route.startsWith("http://") ||
|
|
111
|
-
route.startsWith("https://")
|
|
112
|
-
? "_blank"
|
|
113
|
-
: "_self"}
|
|
114
|
-
rel={route.startsWith("http://") || route.startsWith("https://")
|
|
115
|
-
? "noopener noreferrer"
|
|
116
|
-
: ""}
|
|
117
|
-
>{label}
|
|
118
|
-
</a>
|
|
119
|
-
{/if}
|
|
99
|
+
<a
|
|
100
|
+
href={route.startsWith("http://") || route.startsWith("https://")
|
|
101
|
+
? route
|
|
102
|
+
: `${root}/${route}`}
|
|
103
|
+
class:active={route === current_page}
|
|
104
|
+
data-sveltekit-reload
|
|
105
|
+
target={route.startsWith("http://") || route.startsWith("https://")
|
|
106
|
+
? "_blank"
|
|
107
|
+
: "_self"}
|
|
108
|
+
rel={route.startsWith("http://") || route.startsWith("https://")
|
|
109
|
+
? "noopener noreferrer"
|
|
110
|
+
: ""}
|
|
111
|
+
>{label}
|
|
112
|
+
</a>
|
|
120
113
|
{/each}
|
|
121
114
|
</nav>
|
|
122
115
|
</div>
|
|
@@ -162,16 +155,14 @@
|
|
|
162
155
|
margin: 0 auto;
|
|
163
156
|
padding: 0 var(--size-8);
|
|
164
157
|
}
|
|
165
|
-
nav a
|
|
166
|
-
button {
|
|
158
|
+
nav a {
|
|
167
159
|
padding: var(--size-1) var(--size-2);
|
|
168
160
|
border-radius: var(--block-radius);
|
|
169
161
|
border-width: var(--block-border-width);
|
|
170
162
|
border-color: transparent;
|
|
171
163
|
color: var(--body-text-color-subdued);
|
|
172
164
|
}
|
|
173
|
-
nav a.active
|
|
174
|
-
button.active {
|
|
165
|
+
nav a.active {
|
|
175
166
|
color: var(--body-text-color);
|
|
176
167
|
border-color: var(--block-border-color);
|
|
177
168
|
background-color: var(--block-background-fill);
|
package/src/Render.svelte
CHANGED
|
@@ -54,13 +54,20 @@
|
|
|
54
54
|
|
|
55
55
|
$: {
|
|
56
56
|
if (node && node.type === "form") {
|
|
57
|
-
if (
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
57
|
+
// Check if all children are invisible (false or "hidden")
|
|
58
|
+
const allChildrenInvisible = node.children?.every(
|
|
59
|
+
(c) => c.props.visible === false || c.props.visible === "hidden"
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
if (allChildrenInvisible) {
|
|
63
|
+
// Check if any child is "hidden" vs false
|
|
64
|
+
const hasHiddenChild = node.children?.some(
|
|
65
|
+
(c) => c.props.visible === "hidden"
|
|
66
|
+
);
|
|
67
|
+
// If any child is "hidden", form should be "hidden", otherwise false
|
|
68
|
+
node.props.visible = hasHiddenChild ? "hidden" : false;
|
|
63
69
|
} else {
|
|
70
|
+
// If any child is visible, form should be visible
|
|
64
71
|
node.props.visible = true;
|
|
65
72
|
}
|
|
66
73
|
}
|
|
@@ -94,7 +101,8 @@
|
|
|
94
101
|
{...node.props}
|
|
95
102
|
{theme_mode}
|
|
96
103
|
{root}
|
|
97
|
-
visible={typeof node.props.visible === "boolean"
|
|
104
|
+
visible={typeof node.props.visible === "boolean" ||
|
|
105
|
+
node.props.visible === "hidden"
|
|
98
106
|
? node.props.visible
|
|
99
107
|
: true}
|
|
100
108
|
>
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
export let elem_id: string;
|
|
18
18
|
export let elem_classes: string[];
|
|
19
19
|
export let _id: number;
|
|
20
|
-
export let visible: boolean;
|
|
20
|
+
export let visible: boolean | "hidden";
|
|
21
21
|
|
|
22
22
|
const s = (id: number, p: string, v: any): CustomEvent =>
|
|
23
23
|
new CustomEvent("prop_change", { detail: { id, prop: p, value: v } });
|
|
@@ -58,13 +58,13 @@
|
|
|
58
58
|
class="highlight">import</span
|
|
59
59
|
> Client{#if has_file_path}, handle_file{/if}
|
|
60
60
|
|
|
61
|
-
|
|
61
|
+
client = Client(<span class="token string">"{space_id || root}"</span
|
|
62
62
|
>{#if username !== null}, auth=("{username}", **password**){/if})
|
|
63
|
-
|
|
63
|
+
result = client.<span class="highlight">predict</span
|
|
64
64
|
>(<!--
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
65
|
+
-->{#each endpoint_parameters as { python_type, example_input, parameter_name, parameter_has_default, parameter_default }, i}<!--
|
|
66
|
+
-->
|
|
67
|
+
{parameter_name
|
|
68
68
|
? parameter_name + "="
|
|
69
69
|
: ""}<span
|
|
70
70
|
>{represent_value(
|
|
@@ -74,11 +74,11 @@
|
|
|
74
74
|
)}</span
|
|
75
75
|
>,{/each}<!--
|
|
76
76
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
77
|
+
-->
|
|
78
|
+
api_name=<span class="api-name">"/{dependency.api_name}"</span><!--
|
|
79
|
+
-->
|
|
80
|
+
)
|
|
81
|
+
<span class="highlight">print</span>(result)</pre>
|
|
82
82
|
</div>
|
|
83
83
|
</code>
|
|
84
84
|
</Block>
|
package/src/i18n.ts
CHANGED
|
@@ -155,6 +155,23 @@ export let all_common_keys: Set<string> = new Set();
|
|
|
155
155
|
let i18n_initialized = false;
|
|
156
156
|
let previous_translations: Record<string, Record<string, string>> | undefined;
|
|
157
157
|
|
|
158
|
+
function get_lang_from_preferred_locale(header: string): string | null {
|
|
159
|
+
const options = header
|
|
160
|
+
.split(",")
|
|
161
|
+
.map((value) =>
|
|
162
|
+
value.includes(";") ? value.split(";").slice(0, 2) : [value, 1]
|
|
163
|
+
);
|
|
164
|
+
options.sort(
|
|
165
|
+
(a, b) => parseFloat(b[1] as string) - parseFloat(a[1] as string)
|
|
166
|
+
);
|
|
167
|
+
for (const [lang, _] of options) {
|
|
168
|
+
if (available_locales.includes(lang as string)) {
|
|
169
|
+
return lang as string;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
|
|
158
175
|
export async function setupi18n(
|
|
159
176
|
custom_translations?: Record<string, Record<string, string>>,
|
|
160
177
|
preferred_locale?: string
|
|
@@ -173,12 +190,16 @@ export async function setupi18n(
|
|
|
173
190
|
custom_translations: custom_translations ?? {}
|
|
174
191
|
});
|
|
175
192
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
193
|
+
let initial_locale: string | null = null;
|
|
194
|
+
const browser_locale = getLocaleFromNavigator();
|
|
195
|
+
if (preferred_locale) {
|
|
196
|
+
initial_locale = get_lang_from_preferred_locale(preferred_locale);
|
|
197
|
+
} else {
|
|
198
|
+
initial_locale =
|
|
199
|
+
browser_locale && available_locales.includes(browser_locale)
|
|
200
|
+
? browser_locale
|
|
201
|
+
: null;
|
|
202
|
+
}
|
|
182
203
|
|
|
183
204
|
if (!initial_locale) {
|
|
184
205
|
const normalized_locale = browser_locale?.split("-")[0];
|