@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/package.json CHANGED
@@ -1,69 +1,68 @@
1
1
  {
2
2
  "name": "@gradio/core",
3
- "version": "0.28.0",
3
+ "version": "0.29.1",
4
4
  "type": "module",
5
5
  "devDependencies": {
6
- "@gradio/accordion": "^0.5.23",
7
- "@gradio/annotatedimage": "^0.9.30",
8
- "@gradio/atoms": "^0.17.0",
9
- "@gradio/audio": "^0.18.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.24",
12
- "@gradio/button": "^0.5.12",
13
- "@gradio/chatbot": "^0.26.24",
14
- "@gradio/checkbox": "^0.4.29",
15
- "@gradio/checkboxgroup": "^0.6.28",
16
- "@gradio/client": "^1.18.0",
17
- "@gradio/code": "^0.14.16",
18
- "@gradio/colorpicker": "^0.4.28",
19
- "@gradio/dataframe": "^0.19.2",
20
- "@gradio/dataset": "^0.4.33",
21
- "@gradio/datetime": "^0.3.21",
22
- "@gradio/downloadbutton": "^0.4.11",
23
- "@gradio/dropdown": "^0.10.3",
24
- "@gradio/fallback": "^0.4.28",
25
- "@gradio/column": "^0.2.1",
26
- "@gradio/file": "^0.12.29",
27
- "@gradio/fileexplorer": "^0.5.40",
28
- "@gradio/form": "^0.2.24",
29
- "@gradio/highlightedtext": "^0.9.11",
30
- "@gradio/group": "^0.2.0",
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/imageeditor": "^0.16.6",
35
- "@gradio/imageslider": "^0.2.14",
36
- "@gradio/image": "^0.22.18",
37
- "@gradio/json": "^0.5.30",
38
- "@gradio/label": "^0.5.20",
39
- "@gradio/multimodaltextbox": "^0.10.18",
40
- "@gradio/nativeplot": "^0.7.5",
41
- "@gradio/model3d": "^0.14.26",
42
- "@gradio/markdown": "^0.13.21",
43
- "@gradio/number": "^0.7.0",
44
- "@gradio/paramviewer": "^0.7.16",
45
- "@gradio/row": "^0.2.1",
46
- "@gradio/simpleimage": "^0.8.40",
47
- "@gradio/sidebar": "^0.1.21",
48
- "@gradio/plot": "^0.9.23",
49
- "@gradio/simpledropdown": "^0.3.28",
50
- "@gradio/simpletextbox": "^0.3.29",
51
- "@gradio/sketchbox": "^0.6.16",
52
- "@gradio/slider": "^0.6.17",
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/statustracker": "^0.11.0",
55
- "@gradio/tabitem": "^0.6.0",
56
- "@gradio/radio": "^0.7.11",
57
- "@gradio/tabs": "^0.5.0",
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.11",
62
+ "@gradio/uploadbutton": "^0.9.12",
63
+ "@gradio/vibeeditor": "^0.3.0",
62
64
  "@gradio/utils": "^0.10.2",
63
- "@gradio/upload": "^0.16.17",
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
- { id, prop: "loading_status", value: { validation_error: undefined } }
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((mutations) => {
1075
- if ("parentIFrame" in window) {
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
- ? pages.map(([route, label], index) =>
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
- : pages;
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
- {#if is_lite}
95
- <button
96
- class:active={route === current_page}
97
- on:click={(e) => {
98
- e.preventDefault();
99
- set_page?.(route);
100
- }}
101
- >{label}
102
- </button>
103
- {:else}
104
- <a
105
- href={route.startsWith("http://") || route.startsWith("https://")
106
- ? route
107
- : `${root}/${route}`}
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
- node.children?.every(
59
- (c) => typeof c.props.visible === "boolean" && !c.props.visible
60
- )
61
- ) {
62
- node.props.visible = false;
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
- client = Client(<span class="token string">"{space_id || root}"</span
61
+ client = Client(<span class="token string">"{space_id || root}"</span
62
62
  >{#if username !== null}, auth=("{username}", **password**){/if})
63
- result = client.<span class="highlight">predict</span
63
+ result = client.<span class="highlight">predict</span
64
64
  >(<!--
65
- -->{#each endpoint_parameters as { python_type, example_input, parameter_name, parameter_has_default, parameter_default }, i}<!--
66
- -->
67
- {parameter_name
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
- api_name=<span class="api-name">"/{dependency.api_name}"</span><!--
79
- -->
80
- )
81
- <span class="highlight">print</span>(result)</pre>
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
- const browser_locale = preferred_locale ?? getLocaleFromNavigator();
177
-
178
- let initial_locale =
179
- browser_locale && available_locales.includes(browser_locale)
180
- ? browser_locale
181
- : null;
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];