@gradio/core 0.1.0-beta.1 → 0.1.0-beta.3

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 CHANGED
@@ -1,5 +1,59 @@
1
1
  # @gradio/core
2
2
 
3
+ ## 0.1.0-beta.3
4
+
5
+ ### Features
6
+
7
+ - [#9412](https://github.com/gradio-app/gradio/pull/9412) [`c2c2fd9`](https://github.com/gradio-app/gradio/commit/c2c2fd989348f826566773c07c0e0bda200199ff) - fix SSR apps on spaces. Thanks @pngwn!
8
+
9
+ ### Dependency updates
10
+
11
+ - @gradio/upload@0.13.0-beta.3
12
+ - @gradio/video@0.11.0-beta.3
13
+ - @gradio/code@0.10.0-beta.3
14
+ - @gradio/client@1.6.0-beta.3
15
+ - @gradio/button@0.3.0-beta.3
16
+ - @gradio/gallery@0.13.0-beta.3
17
+ - @gradio/file@0.10.0-beta.3
18
+ - @gradio/image@0.16.0-beta.3
19
+
20
+ ## 0.1.0-beta.2
21
+
22
+ ### Features
23
+
24
+ - [#9323](https://github.com/gradio-app/gradio/pull/9323) [`06babda`](https://github.com/gradio-app/gradio/commit/06babda0395fd3fbd323c1c3cb33704ecfd6deb0) - Disable liking user message in chatbot by default but make it configurable. Thanks @freddyaboulton!
25
+ - [#9339](https://github.com/gradio-app/gradio/pull/9339) [`4c8c6f2`](https://github.com/gradio-app/gradio/commit/4c8c6f2fe603081941c5fdc43f48a0632b9f31ad) - Ssr part 2. Thanks @pngwn!
26
+ - [#9269](https://github.com/gradio-app/gradio/pull/9269) [`e05f568`](https://github.com/gradio-app/gradio/commit/e05f568f47e9fa33ef91dbbe5cc477d32762bc36) - Fix reload mode and streaming in 5.0 dev. Thanks @freddyaboulton!
27
+ - [#9253](https://github.com/gradio-app/gradio/pull/9253) [`99648ec`](https://github.com/gradio-app/gradio/commit/99648ec7c4443e74799941e47b0015ac9ca581e1) - Adds ability to block event trigger when file is uploading. Thanks @dawoodkhan82!
28
+ - [#9335](https://github.com/gradio-app/gradio/pull/9335) [`b543465`](https://github.com/gradio-app/gradio/commit/b543465d06d7d1b399c4d0755da05e022611a97f) - Remove lite/theme.css from the Git-managed file tree. Thanks @whitphx!
29
+
30
+ ### Fixes
31
+
32
+ - [#9299](https://github.com/gradio-app/gradio/pull/9299) [`aa35b07`](https://github.com/gradio-app/gradio/commit/aa35b0788e613fdd45446d267513e6f94fa208ea) - Trigger state change event on iterators. Thanks @freddyaboulton!
33
+
34
+ ### Dependency updates
35
+
36
+ - @gradio/atoms@0.9.0-beta.2
37
+ - @gradio/gallery@0.13.0-beta.2
38
+ - @gradio/upload@0.13.0-beta.2
39
+ - @gradio/wasm@0.14.0-beta.2
40
+ - @gradio/markdown@0.10.0-beta.2
41
+ - @gradio/client@1.6.0-beta.2
42
+ - @gradio/icons@0.8.0-beta.2
43
+ - @gradio/statustracker@0.8.0-beta.2
44
+ - @gradio/utils@0.7.0-beta.2
45
+ - @gradio/plot@0.6.5-beta.2
46
+ - @gradio/button@0.3.0-beta.2
47
+ - @gradio/file@0.10.0-beta.2
48
+ - @gradio/image@0.16.0-beta.2
49
+ - @gradio/video@0.11.0-beta.2
50
+ - @gradio/code@0.10.0-beta.2
51
+ - @gradio/paramviewer@0.4.22-beta.2
52
+ - @gradio/checkbox@0.4.0-beta.2
53
+ - @gradio/column@0.2.0-beta.0
54
+ - @gradio/textbox@0.7.0-beta.2
55
+ - @gradio/tabs@0.3.0-beta.2
56
+
3
57
  ## 0.1.0-beta.1
4
58
 
5
59
  ### Features
@@ -39,33 +93,41 @@
39
93
  - [#9052](https://github.com/gradio-app/gradio/pull/9052) [`f3652eb`](https://github.com/gradio-app/gradio/commit/f3652ebe08211e12739df73c15fd97e5ff81276a) - Video gallery. Thanks @dawoodkhan82!
40
94
  - [#8941](https://github.com/gradio-app/gradio/pull/8941) [`97a7bf6`](https://github.com/gradio-app/gradio/commit/97a7bf66a79179d1b91a3199d68e5c11216ca500) - Streaming inputs for 5.0. Thanks @freddyaboulton!
41
95
 
96
+ ## 0.0.4
97
+
98
+ ### Fixes
99
+
100
+ - [#9188](https://github.com/gradio-app/gradio/pull/9188) [`8f8e1c6`](https://github.com/gradio-app/gradio/commit/8f8e1c6a0b09b0d1985b8377d94d693cb00f8a18) - Fix multiple trigger bug when function has js. Thanks @freddyaboulton!
101
+
102
+ ## 0.0.3
103
+
42
104
  ### Fixes
43
105
 
44
106
  - [#9163](https://github.com/gradio-app/gradio/pull/9163) [`2b6cbf2`](https://github.com/gradio-app/gradio/commit/2b6cbf25908e42cf027324e54ef2cc0baad11a91) - fix exports and generate types. Thanks @pngwn!
45
107
 
46
108
  ### Dependency updates
47
109
 
48
- - @gradio/utils@0.7.0-beta.0
49
- - @gradio/statustracker@0.8.0-beta.0
50
- - @gradio/atoms@0.8.1-beta.0
51
- - @gradio/paramviewer@0.4.22-beta.0
52
- - @gradio/code@0.9.1-beta.0
53
- - @gradio/client@1.6.0-beta.0
54
- - @gradio/icons@0.8.0-beta.0
55
- - @gradio/button@0.2.51-beta.0
56
- - @gradio/upload@0.12.4-beta.0
57
- - @gradio/wasm@0.13.1-beta.0
58
- - @gradio/theme@0.2.5-beta.0
59
- - @gradio/image@0.16.0-beta.0
60
- - @gradio/video@0.11.0-beta.0
61
- - @gradio/file@0.9.4-beta.0
62
- - @gradio/checkbox@0.3.13-beta.0
63
- - @gradio/column@0.2.0-beta.0
64
- - @gradio/markdown@0.9.4-beta.0
65
- - @gradio/gallery@0.13.0-beta.0
66
- - @gradio/plot@0.6.5-beta.0
67
- - @gradio/textbox@0.7.0-beta.0
68
- - @gradio/tabs@0.2.14-beta.0
110
+ - @gradio/code@0.9.1
111
+ - @gradio/paramviewer@0.4.22
112
+ - @gradio/utils@0.6.1
113
+ - @gradio/statustracker@0.7.6
114
+ - @gradio/atoms@0.8.1
115
+ - @gradio/icons@0.7.2
116
+ - @gradio/wasm@0.13.1
117
+ - @gradio/client@1.5.2
118
+ - @gradio/upload@0.12.4
119
+ - @gradio/button@0.2.51
120
+ - @gradio/markdown@0.9.4
121
+ - @gradio/gallery@0.12.2
122
+ - @gradio/theme@0.2.5
123
+ - @gradio/plot@0.6.5
124
+ - @gradio/textbox@0.7.0
125
+ - @gradio/image@0.15.1
126
+ - @gradio/video@0.10.4
127
+ - @gradio/file@0.9.4
128
+ - @gradio/checkbox@0.3.13
129
+ - @gradio/column@0.1.4
130
+ - @gradio/tabs@0.2.14
69
131
 
70
132
  ## 0.0.2
71
133
 
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export { default as Embed } from "./src/Embed.svelte";
2
2
  export { prefix_css, mount_css } from "./src/css";
3
+ export { create_components } from "./src/init";
3
4
  export * from "./src/i18n";
4
5
  export * from "./src/types";
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  export { default as Embed } from "./src/Embed.svelte";
2
2
  export { prefix_css, mount_css } from "./src/css";
3
+ export { create_components } from "./src/init";
3
4
  export * from "./src/i18n";
4
5
  export * from "./src/types";
@@ -1,4 +1,4 @@
1
- <script>import { tick } from "svelte";
1
+ <script>import { tick, onMount } from "svelte";
2
2
  import { _ } from "svelte-i18n";
3
3
  import { Client } from "@gradio/client";
4
4
  import { setupi18n } from "./i18n";
@@ -28,7 +28,10 @@ export let js;
28
28
  export let fill_height = false;
29
29
  export let ready;
30
30
  export let username;
31
- const {
31
+ export let api_prefix;
32
+ export let max_file_size;
33
+ export let initial_layout = void 0;
34
+ let {
32
35
  layout: _layout,
33
36
  targets,
34
37
  update_value,
@@ -41,33 +44,37 @@ const {
41
44
  create_layout,
42
45
  rerender_layout
43
46
  } = create_components();
47
+ $_layout = initial_layout;
44
48
  $:
45
- create_layout({
49
+ components, layout, dependencies, root, app, fill_height, target, run();
50
+ $: {
51
+ ready = !!$_layout;
52
+ }
53
+ async function run() {
54
+ await create_layout({
46
55
  components,
47
56
  layout,
48
57
  dependencies,
49
- root: root + app.api_prefix,
58
+ root: root + api_prefix,
50
59
  app,
51
60
  options: {
52
61
  fill_height
53
62
  }
54
63
  });
55
- $: {
56
- ready = !!$_layout;
57
64
  }
58
- let params = new URLSearchParams(window.location.search);
59
- let api_docs_visible = params.get("view") === "api" && show_api;
60
- let api_recorder_visible = params.get("view") === "api-recorder" && show_api;
65
+ export let search_params;
66
+ let api_docs_visible = search_params.get("view") === "api" && show_api;
67
+ let api_recorder_visible = search_params.get("view") === "api-recorder" && show_api;
61
68
  function set_api_docs_visible(visible) {
62
69
  api_recorder_visible = false;
63
70
  api_docs_visible = visible;
64
- let params2 = new URLSearchParams(window.location.search);
71
+ let params = new URLSearchParams(window.location.search);
65
72
  if (visible) {
66
- params2.set("view", "api");
73
+ params.set("view", "api");
67
74
  } else {
68
- params2.delete("view");
75
+ params.delete("view");
69
76
  }
70
- history.replaceState(null, "", "?" + params2.toString());
77
+ history.replaceState(null, "", "?" + params.toString());
71
78
  }
72
79
  let api_calls = [];
73
80
  export let render_complete = false;
@@ -124,22 +131,17 @@ export function add_new_message(message, type) {
124
131
  }
125
132
  let _error_id = -1;
126
133
  let user_left_page = false;
127
- document.addEventListener("visibilitychange", function() {
128
- if (document.visibilityState === "hidden") {
129
- user_left_page = true;
130
- }
131
- });
132
134
  const MESSAGE_QUOTE_RE = /^'([^]+)'$/;
133
135
  const DUPLICATE_MESSAGE = $_("blocks.long_requests_queue");
134
136
  const MOBILE_QUEUE_WARNING = $_("blocks.connection_can_break");
135
137
  const MOBILE_RECONNECT_MESSAGE = $_("blocks.lost_connection");
138
+ const WAITING_FOR_INPUTS_MESSAGE = $_("blocks.waiting_for_inputs");
136
139
  const SHOW_DUPLICATE_MESSAGE_ON_ETA = 15;
137
140
  const SHOW_MOBILE_QUEUE_WARNING_ON_ETA = 10;
138
- const is_mobile_device = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(
139
- navigator.userAgent
140
- );
141
+ let is_mobile_device = false;
141
142
  let showed_duplicate_message = false;
142
143
  let showed_mobile_warning = false;
144
+ let inputs_waiting = [];
143
145
  function wait_then_trigger_api_call(dep_index, trigger_id = null, event_data = null) {
144
146
  let _unsub = () => {
145
147
  };
@@ -165,6 +167,14 @@ async function get_component_value_or_event_data(component_id, trigger_id, event
165
167
  }
166
168
  async function trigger_api_call(dep_index, trigger_id = null, event_data = null) {
167
169
  let dep = dependencies.find((dep2) => dep2.id === dep_index);
170
+ if (inputs_waiting.length > 0) {
171
+ for (const input of inputs_waiting) {
172
+ if (dep.inputs.includes(input)) {
173
+ add_new_message(WAITING_FOR_INPUTS_MESSAGE, "warning");
174
+ return;
175
+ }
176
+ }
177
+ }
168
178
  const current_status = loading_status.get_status_for_fn(dep_index);
169
179
  messages = messages.filter(({ fn_index }) => fn_index !== dep_index);
170
180
  if (current_status === "pending" || current_status === "generating") {
@@ -188,7 +198,7 @@ async function trigger_api_call(dep_index, trigger_id = null, event_data = null)
188
198
  ).then((v) => {
189
199
  if (dep.backend_fn) {
190
200
  payload.data = v;
191
- make_prediction(payload);
201
+ trigger_prediction(dep, payload);
192
202
  } else {
193
203
  handle_update(v, dep_index);
194
204
  }
@@ -203,17 +213,20 @@ async function trigger_api_call(dep_index, trigger_id = null, event_data = null)
203
213
  );
204
214
  } else {
205
215
  if (dep.backend_fn) {
206
- if (dep.trigger_mode === "once") {
207
- if (!dep.pending_request)
208
- make_prediction(payload, dep.connection == "stream");
209
- } else if (dep.trigger_mode === "multiple") {
210
- make_prediction(payload, dep.connection == "stream");
211
- } else if (dep.trigger_mode === "always_last") {
212
- if (!dep.pending_request) {
213
- make_prediction(payload, dep.connection == "stream");
214
- } else {
215
- dep.final_event = payload;
216
- }
216
+ trigger_prediction(dep, payload);
217
+ }
218
+ }
219
+ function trigger_prediction(dep2, payload2) {
220
+ if (dep2.trigger_mode === "once") {
221
+ if (!dep2.pending_request)
222
+ make_prediction(payload2, dep2.connection == "stream");
223
+ } else if (dep2.trigger_mode === "multiple") {
224
+ make_prediction(payload2, dep2.connection == "stream");
225
+ } else if (dep2.trigger_mode === "always_last") {
226
+ if (!dep2.pending_request) {
227
+ make_prediction(payload2, dep2.connection == "stream");
228
+ } else {
229
+ dep2.final_event = payload2;
217
230
  }
218
231
  }
219
232
  }
@@ -231,7 +244,7 @@ async function trigger_api_call(dep_index, trigger_id = null, event_data = null)
231
244
  } else if (submit_map.has(dep_index) && dep.inputs.some((id) => get_stream_state(id) === "open")) {
232
245
  await app.post_data(
233
246
  // @ts-ignore
234
- `${app.config.root}/stream/${submit_map.get(dep_index).event_id()}`,
247
+ `${app.config.root + app.config.api_prefix}/stream/${submit_map.get(dep_index).event_id()}`,
235
248
  { ...payload2, session_hash: app.session_hash }
236
249
  );
237
250
  return;
@@ -273,7 +286,7 @@ async function trigger_api_call(dep_index, trigger_id = null, event_data = null)
273
286
  const { data, fn_index } = message;
274
287
  if (dep.pending_request && dep.final_event) {
275
288
  dep.pending_request = false;
276
- make_prediction(dep.final_event);
289
+ make_prediction(dep.final_event, dep.connection == "stream");
277
290
  }
278
291
  dep.pending_request = false;
279
292
  handle_update(data, fn_index);
@@ -349,12 +362,14 @@ async function trigger_api_call(dep_index, trigger_id = null, event_data = null)
349
362
  ...messages
350
363
  ];
351
364
  }
352
- if (status.stage === "complete") {
365
+ if (status.stage === "complete" || status.stage === "generating") {
353
366
  status.changed_state_ids?.forEach((id) => {
354
367
  dependencies.filter((dep2) => dep2.targets.some(([_id, _2]) => _id === id)).forEach((dep2) => {
355
368
  wait_then_trigger_api_call(dep2.id, payload2.trigger_id);
356
369
  });
357
370
  });
371
+ }
372
+ if (status.stage === "complete") {
358
373
  dependencies.forEach(async (dep2) => {
359
374
  if (dep2.trigger_after === fn_index) {
360
375
  wait_then_trigger_api_call(dep2.id, payload2.trigger_id);
@@ -439,13 +454,19 @@ async function handle_mount() {
439
454
  wait_then_trigger_api_call(dep.id);
440
455
  }
441
456
  });
442
- if (render_complete)
457
+ if (!target || render_complete)
443
458
  return;
444
459
  target.addEventListener("prop_change", (e) => {
445
460
  if (!isCustomEvent(e))
446
461
  throw new Error("not a custom event");
447
462
  const { id, prop, value } = e.detail;
448
463
  update_value([{ id, prop, value }]);
464
+ if (prop === "input_ready" && value === false) {
465
+ inputs_waiting.push(id);
466
+ }
467
+ if (prop === "input_ready" && value === true) {
468
+ inputs_waiting = inputs_waiting.filter((item) => item !== id);
469
+ }
449
470
  });
450
471
  target.addEventListener("gradio", (e) => {
451
472
  if (!isCustomEvent(e))
@@ -464,7 +485,7 @@ async function handle_mount() {
464
485
  if (submit_map.has(dep_id)) {
465
486
  app.post_data(
466
487
  // @ts-ignore
467
- `${app.config.root}/stream/${submit_map.get(dep_id).event_id()}/close`,
488
+ `${app.config.root + app.config.api_prefix}/stream/${submit_map.get(dep_id).event_id()}/close`,
468
489
  {}
469
490
  );
470
491
  }
@@ -524,6 +545,16 @@ function set_status(statuses) {
524
545
  function isCustomEvent(event) {
525
546
  return "detail" in event;
526
547
  }
548
+ onMount(() => {
549
+ document.addEventListener("visibilitychange", function() {
550
+ if (document.visibilityState === "hidden") {
551
+ user_left_page = true;
552
+ }
553
+ });
554
+ is_mobile_device = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(
555
+ navigator.userAgent
556
+ );
557
+ });
527
558
  </script>
528
559
 
529
560
  <svelte:head>
@@ -534,19 +565,19 @@ function isCustomEvent(event) {
534
565
 
535
566
  <div class="wrap" style:min-height={app_mode ? "100%" : "auto"}>
536
567
  <div class="contain" style:flex-grow={app_mode ? "1" : "auto"}>
537
- {#if $_layout && app.config}
538
- <MountComponents
539
- rootNode={$_layout}
540
- {root}
541
- {target}
542
- {theme_mode}
543
- on:mount={handle_mount}
544
- {version}
545
- {autoscroll}
546
- max_file_size={app.config.max_file_size}
547
- client={app}
548
- />
549
- {/if}
568
+ <!-- {#if $_layout} -->
569
+ <MountComponents
570
+ rootNode={$_layout}
571
+ {root}
572
+ {target}
573
+ {theme_mode}
574
+ on:mount={handle_mount}
575
+ {version}
576
+ {autoscroll}
577
+ {max_file_size}
578
+ client={app}
579
+ />
580
+ <!-- {/if} -->
550
581
  </div>
551
582
 
552
583
  {#if show_footer}
@@ -24,6 +24,10 @@ declare const __propDef: {
24
24
  fill_height?: boolean | undefined;
25
25
  ready: boolean;
26
26
  username: string | null;
27
+ api_prefix: string;
28
+ max_file_size: number;
29
+ initial_layout?: LayoutNode | undefined;
30
+ search_params: URLSearchParams;
27
31
  render_complete?: boolean | undefined;
28
32
  add_new_message?: ((message: string, type: ToastMessage["type"]) => void) | undefined;
29
33
  };
@@ -14,13 +14,15 @@ onMount(() => {
14
14
  });
15
15
  </script>
16
16
 
17
- <Render
18
- node={rootNode}
19
- {root}
20
- {target}
21
- {theme_mode}
22
- {version}
23
- {autoscroll}
24
- {max_file_size}
25
- {client}
26
- />
17
+ {#if rootNode}
18
+ <Render
19
+ node={rootNode}
20
+ {root}
21
+ {target}
22
+ {theme_mode}
23
+ {version}
24
+ {autoscroll}
25
+ {max_file_size}
26
+ {client}
27
+ />
28
+ {/if}
@@ -25,17 +25,20 @@ onMount(() => {
25
25
  }
26
26
  };
27
27
  });
28
- $:
29
- node.children = node.children && node.children.filter((v) => {
30
- const valid_node = node.type !== "statustracker";
31
- if (!valid_node) {
32
- filtered_children.push(v);
33
- }
34
- return valid_node;
35
- });
28
+ $: {
29
+ if (node) {
30
+ node.children = node.children && node.children.filter((v) => {
31
+ const valid_node = node.type !== "statustracker";
32
+ if (!valid_node) {
33
+ filtered_children.push(v);
34
+ }
35
+ return valid_node;
36
+ });
37
+ }
38
+ }
36
39
  setContext("BLOCK_KEY", parent);
37
40
  $: {
38
- if (node.type === "form") {
41
+ if (node && node.type === "form") {
39
42
  if (node.children?.every((c) => !c.props.visible)) {
40
43
  node.props.visible = false;
41
44
  } else {
@@ -44,7 +47,7 @@ $: {
44
47
  }
45
48
  }
46
49
  $:
47
- gradio_class = new Gradio(
50
+ node.props.gradio = new Gradio(
48
51
  node.id,
49
52
  target,
50
53
  theme_mode,
@@ -59,7 +62,7 @@ $:
59
62
  </script>
60
63
 
61
64
  <RenderComponent
62
- _id={node.id}
65
+ _id={node?.id}
63
66
  component={node.component}
64
67
  bind:instance={node.instance}
65
68
  bind:value={node.props.value}
@@ -70,7 +73,6 @@ $:
70
73
  {...node.props}
71
74
  {theme_mode}
72
75
  {root}
73
- gradio={gradio_class}
74
76
  >
75
77
  {#if node.children && node.children.length}
76
78
  {#each node.children as _node (_node.id)}
@@ -7,7 +7,6 @@ export let target;
7
7
  export let theme_mode;
8
8
  export let instance;
9
9
  export let value;
10
- export let gradio;
11
10
  export let elem_id;
12
11
  export let elem_classes;
13
12
  export let _id;
@@ -19,6 +18,8 @@ function wrap(component2) {
19
18
  const props = Object.keys(instance2.$$.props);
20
19
  function report(props2) {
21
20
  return function(propargs) {
21
+ if (!target)
22
+ return;
22
23
  const ev = s(_id, props2, propargs);
23
24
  target.dispatchEvent(ev);
24
25
  };
@@ -45,7 +46,6 @@ const _component = wrap(component);
45
46
  {...$$restProps}
46
47
  {theme_mode}
47
48
  {root}
48
- {gradio}
49
49
  >
50
50
  <slot />
51
51
  </svelte:component>
@@ -1,5 +1,4 @@
1
1
  import { SvelteComponent } from "svelte";
2
- import type { Gradio } from "./gradio_helper";
3
2
  import type { ComponentMeta, ThemeMode } from "./types";
4
3
  declare const __propDef: {
5
4
  props: {
@@ -10,7 +9,6 @@ declare const __propDef: {
10
9
  theme_mode: ThemeMode;
11
10
  instance: ComponentMeta["instance"];
12
11
  value: any;
13
- gradio: Gradio;
14
12
  elem_id: string;
15
13
  elem_classes: string[];
16
14
  _id: number;
package/dist/src/css.js CHANGED
@@ -1,5 +1,6 @@
1
1
  let supports_adopted_stylesheets = false;
2
- if ("attachShadow" in Element.prototype &&
2
+ if (typeof window !== "undefined" &&
3
+ "attachShadow" in Element.prototype &&
3
4
  "adoptedStyleSheets" in Document.prototype) {
4
5
  // Both Shadow DOM and adoptedStyleSheets are supported
5
6
  const shadow_root_test = document
@@ -30,7 +30,7 @@ export declare function create_components(): {
30
30
  options: {
31
31
  fill_height: boolean;
32
32
  };
33
- }) => void;
33
+ }) => Promise<void>;
34
34
  rerender_layout: (args: {
35
35
  render_id: number;
36
36
  components: ComponentMeta[];
package/dist/src/init.js CHANGED
@@ -3,6 +3,10 @@ import { load_component } from "virtual:component-loader";
3
3
  import { create_loading_status_store } from "./stores";
4
4
  import { _ } from "svelte-i18n";
5
5
  let pending_updates = [];
6
+ const is_browser = typeof window !== "undefined";
7
+ const raf = is_browser
8
+ ? requestAnimationFrame
9
+ : async (fn) => await fn();
6
10
  /**
7
11
  * Create a store with the layout and a map of targets
8
12
  * @returns A store with the layout and a map of targets
@@ -21,17 +25,19 @@ export function create_components() {
21
25
  let app;
22
26
  let keyed_component_values = {};
23
27
  let _rootNode;
24
- function set_stream_every(dependencies) {
28
+ function set_event_specific_args(dependencies) {
25
29
  dependencies.forEach((dep) => {
26
30
  dep.targets.forEach((target) => {
27
31
  const instance = instance_map[target[0]];
28
- if (instance && dep.connection == "stream") {
29
- instance.props.stream_every = dep.stream_every;
32
+ if (instance && dep.event_specific_args?.length > 0) {
33
+ dep.event_specific_args?.forEach((arg) => {
34
+ instance.props[arg] = dep[arg];
35
+ });
30
36
  }
31
37
  });
32
38
  });
33
39
  }
34
- function create_layout({ app: _app, components, layout, dependencies, root, options }) {
40
+ async function create_layout({ app: _app, components, layout, dependencies, root, options }) {
35
41
  // make sure the state is settled before proceeding
36
42
  flush();
37
43
  app = _app;
@@ -66,10 +72,9 @@ export function create_components() {
66
72
  acc[c.id] = c;
67
73
  return acc;
68
74
  }, {});
69
- walk_layout(layout, root).then(() => {
70
- layout_store.set(_rootNode);
71
- });
72
- set_stream_every(dependencies);
75
+ await walk_layout(layout, root);
76
+ layout_store.set(_rootNode);
77
+ set_event_specific_args(dependencies);
73
78
  }
74
79
  /**
75
80
  * Rerender the layout when the config has been modified to attach new components
@@ -118,7 +123,7 @@ export function create_components() {
118
123
  walk_layout(layout, root, current_element.parent).then(() => {
119
124
  layout_store.set(_rootNode);
120
125
  });
121
- set_stream_every(dependencies);
126
+ set_event_specific_args(dependencies);
122
127
  }
123
128
  async function walk_layout(node, root, parent) {
124
129
  const instance = instance_map[node.id];
@@ -190,7 +195,7 @@ export function create_components() {
190
195
  if (!update_scheduled) {
191
196
  update_scheduled = true;
192
197
  update_scheduled_store.set(true);
193
- requestAnimationFrame(flush);
198
+ raf(flush);
194
199
  }
195
200
  }
196
201
  function get_data(id) {
@@ -231,7 +236,7 @@ export function create_components() {
231
236
  set_time_limit,
232
237
  loading_status,
233
238
  scheduled_updates: update_scheduled_store,
234
- create_layout: (...args) => requestAnimationFrame(() => create_layout(...args)),
239
+ create_layout: create_layout,
235
240
  rerender_layout
236
241
  };
237
242
  }
@@ -22,7 +22,8 @@
22
22
  "blocks": {
23
23
  "connection_can_break": "On mobile, the connection can break if this tab is unfocused or the device sleeps, losing your position in queue.",
24
24
  "long_requests_queue": "There is a long queue of requests pending. Duplicate this Space to skip.",
25
- "lost_connection": "Lost connection due to leaving page. Rejoining queue..."
25
+ "lost_connection": "Lost connection due to leaving page. Rejoining queue...",
26
+ "waiting_for_inputs": "Waiting for file(s) to finish uploading, please retry."
26
27
  },
27
28
  "checkbox": {
28
29
  "checkbox": "Checkbox",
@@ -67,6 +67,8 @@ export interface Dependency {
67
67
  connection: "stream" | "sse";
68
68
  time_limit: number;
69
69
  stream_every: number;
70
+ like_user_message: boolean;
71
+ event_specific_args: string[];
70
72
  }
71
73
  interface TypeDescription {
72
74
  input_payload?: string;
package/index.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export { default as Embed } from "./src/Embed.svelte";
2
2
  export { prefix_css, mount_css } from "./src/css";
3
+ export { create_components } from "./src/init";
3
4
  export * from "./src/i18n";
4
5
  export * from "./src/types";
package/package.json CHANGED
@@ -1,64 +1,64 @@
1
1
  {
2
2
  "name": "@gradio/core",
3
- "version": "0.1.0-beta.1",
3
+ "version": "0.1.0-beta.3",
4
4
  "type": "module",
5
5
  "devDependencies": {
6
- "@gradio/accordion": "^0.3.23-beta.1",
7
- "@gradio/annotatedimage": "^0.7.2-beta.1",
8
- "@gradio/audio": "^0.14.0-beta.1",
9
- "@gradio/atoms": "^0.8.1-beta.1",
10
- "@gradio/button": "^0.3.0-beta.1",
11
- "@gradio/box": "^0.1.25-beta.1",
12
- "@gradio/chatbot": "^0.14.0-beta.1",
13
- "@gradio/checkbox": "^0.4.0-beta.1",
14
- "@gradio/checkboxgroup": "^0.6.0-beta.1",
15
- "@gradio/client": "^1.6.0-beta.1",
16
- "@gradio/colorpicker": "^0.3.13-beta.1",
17
- "@gradio/code": "^0.9.1-beta.1",
6
+ "@gradio/accordion": "^0.3.23-beta.2",
7
+ "@gradio/annotatedimage": "^0.8.0-beta.3",
8
+ "@gradio/audio": "^0.14.0-beta.3",
9
+ "@gradio/atoms": "^0.9.0-beta.2",
10
+ "@gradio/button": "^0.3.0-beta.3",
11
+ "@gradio/chatbot": "^0.14.0-beta.3",
12
+ "@gradio/box": "^0.2.0-beta.0",
13
+ "@gradio/checkbox": "^0.4.0-beta.2",
14
+ "@gradio/client": "^1.6.0-beta.3",
15
+ "@gradio/colorpicker": "^0.3.13-beta.2",
16
+ "@gradio/checkboxgroup": "^0.6.0-beta.2",
17
+ "@gradio/code": "^0.10.0-beta.3",
18
18
  "@gradio/column": "^0.2.0-beta.0",
19
- "@gradio/dataframe": "^0.10.1-beta.1",
20
- "@gradio/dataset": "^0.2.5-beta.1",
21
- "@gradio/downloadbutton": "^0.1.28-beta.1",
22
- "@gradio/datetime": "^0.1.4-beta.1",
23
- "@gradio/dropdown": "^0.7.13-beta.1",
24
- "@gradio/fallback": "^0.3.13-beta.1",
25
- "@gradio/file": "^0.9.4-beta.1",
26
- "@gradio/fileexplorer": "^0.4.19-beta.1",
27
- "@gradio/form": "^0.1.25-beta.1",
28
- "@gradio/gallery": "^0.13.0-beta.1",
29
- "@gradio/highlightedtext": "^0.7.7-beta.1",
19
+ "@gradio/dataframe": "^0.11.0-beta.3",
20
+ "@gradio/dataset": "^0.2.5-beta.3",
21
+ "@gradio/datetime": "^0.1.4-beta.2",
22
+ "@gradio/downloadbutton": "^0.1.28-beta.3",
23
+ "@gradio/dropdown": "^0.7.13-beta.2",
24
+ "@gradio/file": "^0.10.0-beta.3",
25
+ "@gradio/fallback": "^0.3.13-beta.2",
26
+ "@gradio/fileexplorer": "^0.5.0-beta.3",
27
+ "@gradio/form": "^0.1.25-beta.2",
28
+ "@gradio/gallery": "^0.13.0-beta.3",
30
29
  "@gradio/group": "^0.2.0-beta.1",
31
- "@gradio/html": "^0.3.6-beta.1",
32
- "@gradio/icons": "^0.8.0-beta.1",
33
- "@gradio/imageeditor": "^0.11.0-beta.1",
34
- "@gradio/image": "^0.16.0-beta.1",
35
- "@gradio/json": "^0.4.1-beta.1",
36
- "@gradio/label": "^0.3.13-beta.1",
37
- "@gradio/markdown": "^0.9.4-beta.1",
38
- "@gradio/multimodaltextbox": "^0.6.0-beta.1",
39
- "@gradio/model3d": "^0.12.2-beta.1",
40
- "@gradio/number": "^0.4.13-beta.1",
41
- "@gradio/nativeplot": "^0.3.2-beta.1",
42
- "@gradio/paramviewer": "^0.4.22-beta.1",
43
- "@gradio/plot": "^0.6.5-beta.1",
44
- "@gradio/radio": "^0.6.0-beta.1",
45
- "@gradio/row": "^0.1.5-beta.0",
46
- "@gradio/simpledropdown": "^0.2.13-beta.1",
47
- "@gradio/simpleimage": "^0.7.1-beta.1",
48
- "@gradio/slider": "^0.5.0-beta.1",
49
- "@gradio/simpletextbox": "^0.2.13-beta.1",
50
- "@gradio/state": "^0.1.2-beta.0",
51
- "@gradio/statustracker": "^0.8.0-beta.1",
52
- "@gradio/tabitem": "^0.3.0-beta.1",
53
- "@gradio/tabs": "^0.3.0-beta.1",
54
- "@gradio/textbox": "^0.7.0-beta.1",
30
+ "@gradio/highlightedtext": "^0.7.7-beta.2",
31
+ "@gradio/html": "^0.4.0-beta.2",
32
+ "@gradio/image": "^0.16.0-beta.3",
33
+ "@gradio/icons": "^0.8.0-beta.2",
34
+ "@gradio/imageeditor": "^0.11.0-beta.3",
35
+ "@gradio/label": "^0.3.13-beta.2",
36
+ "@gradio/markdown": "^0.10.0-beta.2",
37
+ "@gradio/json": "^0.5.0-beta.2",
38
+ "@gradio/model3d": "^0.13.0-beta.3",
39
+ "@gradio/multimodaltextbox": "^0.6.0-beta.3",
40
+ "@gradio/number": "^0.4.13-beta.2",
41
+ "@gradio/paramviewer": "^0.4.22-beta.2",
42
+ "@gradio/plot": "^0.6.5-beta.2",
43
+ "@gradio/radio": "^0.6.0-beta.2",
44
+ "@gradio/row": "^0.2.0-beta.1",
45
+ "@gradio/simpledropdown": "^0.2.13-beta.2",
46
+ "@gradio/nativeplot": "^0.4.0-beta.2",
47
+ "@gradio/simpletextbox": "^0.2.13-beta.2",
48
+ "@gradio/state": "^0.1.2",
49
+ "@gradio/slider": "^0.5.0-beta.2",
50
+ "@gradio/statustracker": "^0.8.0-beta.2",
51
+ "@gradio/simpleimage": "^0.8.0-beta.3",
52
+ "@gradio/tabs": "^0.3.0-beta.2",
53
+ "@gradio/textbox": "^0.7.0-beta.2",
55
54
  "@gradio/theme": "^0.3.0-beta.1",
56
- "@gradio/timer": "^0.3.3-beta.1",
57
- "@gradio/upload": "^0.12.4-beta.1",
58
- "@gradio/uploadbutton": "^0.6.19-beta.1",
59
- "@gradio/utils": "^0.7.0-beta.1",
60
- "@gradio/video": "^0.11.0-beta.1",
61
- "@gradio/wasm": "^0.13.1-beta.1"
55
+ "@gradio/uploadbutton": "^0.7.0-beta.3",
56
+ "@gradio/video": "^0.11.0-beta.3",
57
+ "@gradio/tabitem": "^0.3.0-beta.2",
58
+ "@gradio/timer": "^0.3.3-beta.2",
59
+ "@gradio/utils": "^0.7.0-beta.2",
60
+ "@gradio/wasm": "^0.14.0-beta.2",
61
+ "@gradio/upload": "^0.13.0-beta.3"
62
62
  },
63
63
  "msw": {
64
64
  "workerDirectory": "public"
package/src/Blocks.svelte CHANGED
@@ -1,5 +1,5 @@
1
1
  <script lang="ts">
2
- import { tick } from "svelte";
2
+ import { tick, onMount } from "svelte";
3
3
  import { _ } from "svelte-i18n";
4
4
  import { Client } from "@gradio/client";
5
5
 
@@ -45,8 +45,11 @@
45
45
  export let fill_height = false;
46
46
  export let ready: boolean;
47
47
  export let username: string | null;
48
+ export let api_prefix: string;
49
+ export let max_file_size: number;
50
+ export let initial_layout: LayoutNode | undefined = undefined;
48
51
 
49
- const {
52
+ let {
50
53
  layout: _layout,
51
54
  targets,
52
55
  update_value,
@@ -60,24 +63,32 @@
60
63
  rerender_layout
61
64
  } = create_components();
62
65
 
63
- $: create_layout({
64
- components,
65
- layout,
66
- dependencies,
67
- root: root + app.api_prefix,
68
- app,
69
- options: {
70
- fill_height
71
- }
72
- });
66
+ // @ts-ignore
67
+ $_layout = initial_layout;
68
+
69
+ $: components, layout, dependencies, root, app, fill_height, target, run();
73
70
 
74
71
  $: {
75
72
  ready = !!$_layout;
76
73
  }
77
74
 
78
- let params = new URLSearchParams(window.location.search);
79
- let api_docs_visible = params.get("view") === "api" && show_api;
80
- let api_recorder_visible = params.get("view") === "api-recorder" && show_api;
75
+ async function run(): Promise<void> {
76
+ await create_layout({
77
+ components,
78
+ layout,
79
+ dependencies,
80
+ root: root + api_prefix,
81
+ app,
82
+ options: {
83
+ fill_height
84
+ }
85
+ });
86
+ }
87
+
88
+ export let search_params: URLSearchParams;
89
+ let api_docs_visible = search_params.get("view") === "api" && show_api;
90
+ let api_recorder_visible =
91
+ search_params.get("view") === "api-recorder" && show_api;
81
92
  function set_api_docs_visible(visible: boolean): void {
82
93
  api_recorder_visible = false;
83
94
  api_docs_visible = visible;
@@ -169,25 +180,19 @@
169
180
  let _error_id = -1;
170
181
 
171
182
  let user_left_page = false;
172
- document.addEventListener("visibilitychange", function () {
173
- if (document.visibilityState === "hidden") {
174
- user_left_page = true;
175
- }
176
- });
177
183
 
178
184
  const MESSAGE_QUOTE_RE = /^'([^]+)'$/;
179
185
 
180
186
  const DUPLICATE_MESSAGE = $_("blocks.long_requests_queue");
181
187
  const MOBILE_QUEUE_WARNING = $_("blocks.connection_can_break");
182
188
  const MOBILE_RECONNECT_MESSAGE = $_("blocks.lost_connection");
189
+ const WAITING_FOR_INPUTS_MESSAGE = $_("blocks.waiting_for_inputs");
183
190
  const SHOW_DUPLICATE_MESSAGE_ON_ETA = 15;
184
191
  const SHOW_MOBILE_QUEUE_WARNING_ON_ETA = 10;
185
- const is_mobile_device =
186
- /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(
187
- navigator.userAgent
188
- );
192
+ let is_mobile_device = false;
189
193
  let showed_duplicate_message = false;
190
194
  let showed_mobile_warning = false;
195
+ let inputs_waiting: number[] = [];
191
196
 
192
197
  // as state updates are not synchronous, we need to ensure updates are flushed before triggering any requests
193
198
  function wait_then_trigger_api_call(
@@ -233,7 +238,14 @@
233
238
  event_data: unknown = null
234
239
  ): Promise<void> {
235
240
  let dep = dependencies.find((dep) => dep.id === dep_index)!;
236
-
241
+ if (inputs_waiting.length > 0) {
242
+ for (const input of inputs_waiting) {
243
+ if (dep.inputs.includes(input)) {
244
+ add_new_message(WAITING_FOR_INPUTS_MESSAGE, "warning");
245
+ return;
246
+ }
247
+ }
248
+ }
237
249
  const current_status = loading_status.get_status_for_fn(dep_index);
238
250
  messages = messages.filter(({ fn_index }) => fn_index !== dep_index);
239
251
  if (current_status === "pending" || current_status === "generating") {
@@ -261,7 +273,7 @@
261
273
  .then((v: unknown[]) => {
262
274
  if (dep.backend_fn) {
263
275
  payload.data = v;
264
- make_prediction(payload);
276
+ trigger_prediction(dep, payload);
265
277
  } else {
266
278
  handle_update(v, dep_index);
267
279
  }
@@ -276,17 +288,21 @@
276
288
  );
277
289
  } else {
278
290
  if (dep.backend_fn) {
279
- if (dep.trigger_mode === "once") {
280
- if (!dep.pending_request)
281
- make_prediction(payload, dep.connection == "stream");
282
- } else if (dep.trigger_mode === "multiple") {
291
+ trigger_prediction(dep, payload);
292
+ }
293
+ }
294
+
295
+ function trigger_prediction(dep: Dependency, payload: Payload): void {
296
+ if (dep.trigger_mode === "once") {
297
+ if (!dep.pending_request)
283
298
  make_prediction(payload, dep.connection == "stream");
284
- } else if (dep.trigger_mode === "always_last") {
285
- if (!dep.pending_request) {
286
- make_prediction(payload, dep.connection == "stream");
287
- } else {
288
- dep.final_event = payload;
289
- }
299
+ } else if (dep.trigger_mode === "multiple") {
300
+ make_prediction(payload, dep.connection == "stream");
301
+ } else if (dep.trigger_mode === "always_last") {
302
+ if (!dep.pending_request) {
303
+ make_prediction(payload, dep.connection == "stream");
304
+ } else {
305
+ dep.final_event = payload;
290
306
  }
291
307
  }
292
308
  }
@@ -315,7 +331,7 @@
315
331
  ) {
316
332
  await app.post_data(
317
333
  // @ts-ignore
318
- `${app.config.root}/stream/${submit_map.get(dep_index).event_id()}`,
334
+ `${app.config.root + app.config.api_prefix}/stream/${submit_map.get(dep_index).event_id()}`,
319
335
  { ...payload, session_hash: app.session_hash }
320
336
  );
321
337
  return;
@@ -360,7 +376,7 @@
360
376
  const { data, fn_index } = message;
361
377
  if (dep.pending_request && dep.final_event) {
362
378
  dep.pending_request = false;
363
- make_prediction(dep.final_event);
379
+ make_prediction(dep.final_event, dep.connection == "stream");
364
380
  }
365
381
  dep.pending_request = false;
366
382
  handle_update(data, fn_index);
@@ -417,6 +433,7 @@
417
433
  }
418
434
  }
419
435
 
436
+ /* eslint-disable complexity */
420
437
  function handle_status_update(message: StatusMessage): void {
421
438
  const { fn_index, ...status } = message;
422
439
  if (status.stage === "streaming" && status.time_limit) {
@@ -463,7 +480,7 @@
463
480
  ];
464
481
  }
465
482
 
466
- if (status.stage === "complete") {
483
+ if (status.stage === "complete" || status.stage === "generating") {
467
484
  status.changed_state_ids?.forEach((id) => {
468
485
  dependencies
469
486
  .filter((dep) => dep.targets.some(([_id, _]) => _id === id))
@@ -471,6 +488,8 @@
471
488
  wait_then_trigger_api_call(dep.id, payload.trigger_id);
472
489
  });
473
490
  });
491
+ }
492
+ if (status.stage === "complete") {
474
493
  dependencies.forEach(async (dep) => {
475
494
  if (dep.trigger_after === fn_index) {
476
495
  wait_then_trigger_api_call(dep.id, payload.trigger_id);
@@ -519,6 +538,7 @@
519
538
  }
520
539
  }
521
540
  }
541
+ /* eslint-enable complexity */
522
542
 
523
543
  function trigger_share(title: string | undefined, description: string): void {
524
544
  if (space_id === null) {
@@ -571,12 +591,18 @@
571
591
  }
572
592
  });
573
593
 
574
- if (render_complete) return;
594
+ if (!target || render_complete) return;
575
595
 
576
596
  target.addEventListener("prop_change", (e: Event) => {
577
597
  if (!isCustomEvent(e)) throw new Error("not a custom event");
578
598
  const { id, prop, value } = e.detail;
579
599
  update_value([{ id, prop, value }]);
600
+ if (prop === "input_ready" && value === false) {
601
+ inputs_waiting.push(id);
602
+ }
603
+ if (prop === "input_ready" && value === true) {
604
+ inputs_waiting = inputs_waiting.filter((item) => item !== id);
605
+ }
580
606
  });
581
607
  target.addEventListener("gradio", (e: Event) => {
582
608
  if (!isCustomEvent(e)) throw new Error("not a custom event");
@@ -596,7 +622,7 @@
596
622
  if (submit_map.has(dep_id)) {
597
623
  app.post_data(
598
624
  // @ts-ignore
599
- `${app.config.root}/stream/${submit_map.get(dep_id).event_id()}/close`,
625
+ `${app.config.root + app.config.api_prefix}/stream/${submit_map.get(dep_id).event_id()}/close`,
600
626
  {}
601
627
  );
602
628
  }
@@ -671,6 +697,19 @@
671
697
  function isCustomEvent(event: Event): event is CustomEvent {
672
698
  return "detail" in event;
673
699
  }
700
+
701
+ onMount(() => {
702
+ document.addEventListener("visibilitychange", function () {
703
+ if (document.visibilityState === "hidden") {
704
+ user_left_page = true;
705
+ }
706
+ });
707
+
708
+ is_mobile_device =
709
+ /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(
710
+ navigator.userAgent
711
+ );
712
+ });
674
713
  </script>
675
714
 
676
715
  <svelte:head>
@@ -681,19 +720,19 @@
681
720
 
682
721
  <div class="wrap" style:min-height={app_mode ? "100%" : "auto"}>
683
722
  <div class="contain" style:flex-grow={app_mode ? "1" : "auto"}>
684
- {#if $_layout && app.config}
685
- <MountComponents
686
- rootNode={$_layout}
687
- {root}
688
- {target}
689
- {theme_mode}
690
- on:mount={handle_mount}
691
- {version}
692
- {autoscroll}
693
- max_file_size={app.config.max_file_size}
694
- client={app}
695
- />
696
- {/if}
723
+ <!-- {#if $_layout} -->
724
+ <MountComponents
725
+ rootNode={$_layout}
726
+ {root}
727
+ {target}
728
+ {theme_mode}
729
+ on:mount={handle_mount}
730
+ {version}
731
+ {autoscroll}
732
+ {max_file_size}
733
+ client={app}
734
+ />
735
+ <!-- {/if} -->
697
736
  </div>
698
737
 
699
738
  {#if show_footer}
@@ -18,13 +18,15 @@
18
18
  });
19
19
  </script>
20
20
 
21
- <Render
22
- node={rootNode}
23
- {root}
24
- {target}
25
- {theme_mode}
26
- {version}
27
- {autoscroll}
28
- {max_file_size}
29
- {client}
30
- />
21
+ {#if rootNode}
22
+ <Render
23
+ node={rootNode}
24
+ {root}
25
+ {target}
26
+ {theme_mode}
27
+ {version}
28
+ {autoscroll}
29
+ {max_file_size}
30
+ {client}
31
+ />
32
+ {/if}
package/src/Render.svelte CHANGED
@@ -36,20 +36,24 @@
36
36
  };
37
37
  });
38
38
 
39
- $: node.children =
40
- node.children &&
41
- node.children.filter((v) => {
42
- const valid_node = node.type !== "statustracker";
43
- if (!valid_node) {
44
- filtered_children.push(v);
45
- }
46
- return valid_node;
47
- });
39
+ $: {
40
+ if (node) {
41
+ node.children =
42
+ node.children &&
43
+ node.children.filter((v) => {
44
+ const valid_node = node.type !== "statustracker";
45
+ if (!valid_node) {
46
+ filtered_children.push(v);
47
+ }
48
+ return valid_node;
49
+ });
50
+ }
51
+ }
48
52
 
49
53
  setContext("BLOCK_KEY", parent);
50
54
 
51
55
  $: {
52
- if (node.type === "form") {
56
+ if (node && node.type === "form") {
53
57
  if (node.children?.every((c) => !c.props.visible)) {
54
58
  node.props.visible = false;
55
59
  } else {
@@ -58,7 +62,7 @@
58
62
  }
59
63
  }
60
64
 
61
- $: gradio_class = new Gradio<Record<string, any>>(
65
+ $: node.props.gradio = new Gradio<Record<string, any>>(
62
66
  node.id,
63
67
  target,
64
68
  theme_mode,
@@ -73,7 +77,7 @@
73
77
  </script>
74
78
 
75
79
  <RenderComponent
76
- _id={node.id}
80
+ _id={node?.id}
77
81
  component={node.component}
78
82
  bind:instance={node.instance}
79
83
  bind:value={node.props.value}
@@ -84,7 +88,6 @@
84
88
  {...node.props}
85
89
  {theme_mode}
86
90
  {root}
87
- gradio={gradio_class}
88
91
  >
89
92
  {#if node.children && node.children.length}
90
93
  {#each node.children as _node (_node.id)}
@@ -13,7 +13,7 @@
13
13
  export let theme_mode: ThemeMode;
14
14
  export let instance: ComponentMeta["instance"];
15
15
  export let value: any;
16
- export let gradio: Gradio;
16
+ // export let gradio: Gradio;
17
17
  export let elem_id: string;
18
18
  export let elem_classes: string[];
19
19
  export let _id: number;
@@ -32,6 +32,7 @@
32
32
 
33
33
  function report(props: string) {
34
34
  return function (propargs: any) {
35
+ if (!target) return;
35
36
  const ev = s(_id, props, propargs);
36
37
  target.dispatchEvent(ev);
37
38
  };
@@ -61,7 +62,6 @@
61
62
  {...$$restProps}
62
63
  {theme_mode}
63
64
  {root}
64
- {gradio}
65
65
  >
66
66
  <slot />
67
67
  </svelte:component>
package/src/css.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  let supports_adopted_stylesheets = false;
2
2
 
3
3
  if (
4
+ typeof window !== "undefined" &&
4
5
  "attachShadow" in Element.prototype &&
5
6
  "adoptedStyleSheets" in Document.prototype
6
7
  ) {
package/src/init.ts CHANGED
@@ -18,6 +18,10 @@ export interface UpdateTransaction {
18
18
  }
19
19
 
20
20
  let pending_updates: UpdateTransaction[][] = [];
21
+ const is_browser = typeof window !== "undefined";
22
+ const raf = is_browser
23
+ ? requestAnimationFrame
24
+ : async (fn: () => Promise<void> | void) => await fn();
21
25
 
22
26
  /**
23
27
  * Create a store with the layout and a map of targets
@@ -42,7 +46,7 @@ export function create_components(): {
42
46
  options: {
43
47
  fill_height: boolean;
44
48
  };
45
- }) => void;
49
+ }) => Promise<void>;
46
50
  rerender_layout: (args: {
47
51
  render_id: number;
48
52
  components: ComponentMeta[];
@@ -67,18 +71,20 @@ export function create_components(): {
67
71
  let keyed_component_values: Record<string | number, any> = {};
68
72
  let _rootNode: ComponentMeta;
69
73
 
70
- function set_stream_every(dependencies: Dependency[]): void {
74
+ function set_event_specific_args(dependencies: Dependency[]): void {
71
75
  dependencies.forEach((dep) => {
72
76
  dep.targets.forEach((target) => {
73
77
  const instance = instance_map[target[0]];
74
- if (instance && dep.connection == "stream") {
75
- instance.props.stream_every = dep.stream_every;
78
+ if (instance && dep.event_specific_args?.length > 0) {
79
+ dep.event_specific_args?.forEach((arg: string) => {
80
+ instance.props[arg] = dep[arg as keyof Dependency];
81
+ });
76
82
  }
77
83
  });
78
84
  });
79
85
  }
80
86
 
81
- function create_layout({
87
+ async function create_layout({
82
88
  app: _app,
83
89
  components,
84
90
  layout,
@@ -94,7 +100,7 @@ export function create_components(): {
94
100
  options: {
95
101
  fill_height: boolean;
96
102
  };
97
- }): void {
103
+ }): Promise<void> {
98
104
  // make sure the state is settled before proceeding
99
105
  flush();
100
106
  app = _app;
@@ -146,11 +152,10 @@ export function create_components(): {
146
152
  {} as { [id: number]: ComponentMeta }
147
153
  );
148
154
 
149
- walk_layout(layout, root).then(() => {
150
- layout_store.set(_rootNode);
151
- });
155
+ await walk_layout(layout, root);
152
156
 
153
- set_stream_every(dependencies);
157
+ layout_store.set(_rootNode);
158
+ set_event_specific_args(dependencies);
154
159
  }
155
160
 
156
161
  /**
@@ -227,7 +232,7 @@ export function create_components(): {
227
232
  layout_store.set(_rootNode);
228
233
  });
229
234
 
230
- set_stream_every(dependencies);
235
+ set_event_specific_args(dependencies);
231
236
  }
232
237
 
233
238
  async function walk_layout(
@@ -333,7 +338,7 @@ export function create_components(): {
333
338
  if (!update_scheduled) {
334
339
  update_scheduled = true;
335
340
  update_scheduled_store.set(true);
336
- requestAnimationFrame(flush);
341
+ raf(flush);
337
342
  }
338
343
  }
339
344
 
@@ -384,8 +389,7 @@ export function create_components(): {
384
389
  set_time_limit,
385
390
  loading_status,
386
391
  scheduled_updates: update_scheduled_store,
387
- create_layout: (...args) =>
388
- requestAnimationFrame(() => create_layout(...args)),
392
+ create_layout: create_layout,
389
393
  rerender_layout
390
394
  };
391
395
  }
package/src/lang/en.json CHANGED
@@ -22,7 +22,8 @@
22
22
  "blocks": {
23
23
  "connection_can_break": "On mobile, the connection can break if this tab is unfocused or the device sleeps, losing your position in queue.",
24
24
  "long_requests_queue": "There is a long queue of requests pending. Duplicate this Space to skip.",
25
- "lost_connection": "Lost connection due to leaving page. Rejoining queue..."
25
+ "lost_connection": "Lost connection due to leaving page. Rejoining queue...",
26
+ "waiting_for_inputs": "Waiting for file(s) to finish uploading, please retry."
26
27
  },
27
28
  "checkbox": {
28
29
  "checkbox": "Checkbox",
package/src/types.ts CHANGED
@@ -72,6 +72,8 @@ export interface Dependency {
72
72
  connection: "stream" | "sse";
73
73
  time_limit: number;
74
74
  stream_every: number;
75
+ like_user_message: boolean;
76
+ event_specific_args: string[];
75
77
  }
76
78
 
77
79
  interface TypeDescription {