@gradio/core 0.0.2 → 0.1.0-beta.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.
Files changed (113) hide show
  1. package/CHANGELOG.md +67 -0
  2. package/dist/blocks.d.ts +1 -0
  3. package/dist/blocks.js +1 -0
  4. package/dist/index.d.ts +4 -0
  5. package/dist/index.js +4 -0
  6. package/dist/login.d.ts +1 -0
  7. package/dist/login.js +1 -0
  8. package/dist/src/Blocks.svelte +728 -0
  9. package/dist/src/Blocks.svelte.d.ts +41 -0
  10. package/dist/src/Embed.svelte +195 -0
  11. package/dist/src/Embed.svelte.d.ts +26 -0
  12. package/dist/src/Login.svelte +107 -0
  13. package/dist/src/Login.svelte.d.ts +19 -0
  14. package/dist/src/MountComponents.svelte +26 -0
  15. package/dist/src/MountComponents.svelte.d.ts +26 -0
  16. package/dist/src/Render.svelte +91 -0
  17. package/dist/src/Render.svelte.d.ts +29 -0
  18. package/dist/src/RenderComponent.svelte +51 -0
  19. package/dist/src/RenderComponent.svelte.d.ts +32 -0
  20. package/dist/src/api_docs/ApiBanner.svelte +115 -0
  21. package/dist/src/api_docs/ApiBanner.svelte.d.ts +19 -0
  22. package/dist/src/api_docs/ApiDocs.svelte +391 -0
  23. package/dist/src/api_docs/ApiDocs.svelte.d.ts +27 -0
  24. package/dist/src/api_docs/ApiRecorder.svelte +72 -0
  25. package/dist/src/api_docs/ApiRecorder.svelte.d.ts +18 -0
  26. package/dist/src/api_docs/CodeSnippet.svelte +189 -0
  27. package/dist/src/api_docs/CodeSnippet.svelte.d.ts +25 -0
  28. package/dist/src/api_docs/CopyButton.svelte +15 -0
  29. package/dist/src/api_docs/CopyButton.svelte.d.ts +16 -0
  30. package/dist/src/api_docs/EndpointDetail.svelte +36 -0
  31. package/dist/src/api_docs/EndpointDetail.svelte.d.ts +18 -0
  32. package/dist/src/api_docs/InputPayload.svelte +149 -0
  33. package/dist/src/api_docs/InputPayload.svelte.d.ts +24 -0
  34. package/dist/src/api_docs/InstallSnippet.svelte +56 -0
  35. package/dist/src/api_docs/InstallSnippet.svelte.d.ts +16 -0
  36. package/dist/src/api_docs/NoApi.svelte +71 -0
  37. package/dist/src/api_docs/NoApi.svelte.d.ts +18 -0
  38. package/dist/src/api_docs/ParametersSnippet.svelte +104 -0
  39. package/dist/src/api_docs/ParametersSnippet.svelte.d.ts +19 -0
  40. package/dist/src/api_docs/RecordingSnippet.svelte +210 -0
  41. package/dist/src/api_docs/RecordingSnippet.svelte.d.ts +22 -0
  42. package/dist/src/api_docs/ResponseSnippet.svelte +95 -0
  43. package/dist/src/api_docs/ResponseSnippet.svelte.d.ts +19 -0
  44. package/dist/src/api_docs/TryButton.svelte +17 -0
  45. package/dist/src/api_docs/TryButton.svelte.d.ts +17 -0
  46. package/dist/src/api_docs/img/api-logo.svg +4 -0
  47. package/dist/src/api_docs/img/bash.svg +8 -0
  48. package/dist/src/api_docs/img/clear.svelte +19 -0
  49. package/dist/src/api_docs/img/clear.svelte.d.ts +23 -0
  50. package/dist/src/api_docs/img/javascript.svg +16 -0
  51. package/dist/src/api_docs/img/python.svg +20 -0
  52. package/dist/src/api_docs/index.d.ts +2 -0
  53. package/dist/src/api_docs/index.js +2 -0
  54. package/dist/src/api_docs/utils.d.ts +2 -0
  55. package/dist/src/api_docs/utils.js +135 -0
  56. package/dist/src/css.d.ts +2 -0
  57. package/dist/src/css.js +93 -0
  58. package/dist/src/gradio_helper.js +4 -0
  59. package/dist/src/i18n.d.ts +6 -0
  60. package/dist/src/i18n.js +22 -0
  61. package/dist/src/images/lightning.svg +2 -0
  62. package/dist/src/images/logo.svg +19 -0
  63. package/dist/src/images/play.svg +2 -0
  64. package/dist/src/images/spaces.svg +7 -0
  65. package/dist/src/init.d.ts +110 -0
  66. package/dist/src/init.js +412 -0
  67. package/dist/src/lang/BCP47_codes.d.ts +2 -0
  68. package/dist/src/lang/BCP47_codes.js +58 -0
  69. package/dist/src/lang/ar.json +16 -0
  70. package/dist/src/lang/ca.json +19 -0
  71. package/dist/src/lang/ckb.json +108 -0
  72. package/dist/src/lang/de.json +16 -0
  73. package/dist/src/lang/en.json +119 -0
  74. package/dist/src/lang/es.json +17 -0
  75. package/dist/src/lang/eu.json +16 -0
  76. package/dist/src/lang/fa.json +16 -0
  77. package/dist/src/lang/fr.json +30 -0
  78. package/dist/src/lang/he.json +16 -0
  79. package/dist/src/lang/hi.json +16 -0
  80. package/dist/src/lang/ja.json +16 -0
  81. package/dist/src/lang/ko.json +16 -0
  82. package/dist/src/lang/lt.json +16 -0
  83. package/dist/src/lang/nl.json +16 -0
  84. package/dist/src/lang/pl.json +16 -0
  85. package/dist/src/lang/pt-BR.json +19 -0
  86. package/dist/src/lang/ru.json +118 -0
  87. package/dist/src/lang/ta.json +16 -0
  88. package/dist/src/lang/tr.json +16 -0
  89. package/dist/src/lang/uk.json +16 -0
  90. package/dist/src/lang/ur.json +16 -0
  91. package/dist/src/lang/uz.json +15 -0
  92. package/dist/src/lang/zh-CN.json +116 -0
  93. package/dist/src/lang/zh-TW.json +16 -0
  94. package/dist/src/s-blocks.d.ts +1 -0
  95. package/dist/src/s-blocks.js +1 -0
  96. package/dist/src/s-login.d.ts +1 -0
  97. package/dist/src/s-login.js +1 -0
  98. package/dist/src/stores.d.ts +31 -0
  99. package/dist/src/stores.js +93 -0
  100. package/dist/src/types.d.ts +98 -0
  101. package/dist/src/types.js +1 -0
  102. package/dist/src/vite-env-override.d.ts +20 -0
  103. package/package.json +71 -60
  104. package/src/Blocks.svelte +92 -9
  105. package/src/Render.svelte +3 -1
  106. package/src/api_docs/ApiDocs.svelte +5 -2
  107. package/src/api_docs/ApiRecorder.svelte +1 -1
  108. package/src/api_docs/CodeSnippet.svelte +6 -2
  109. package/src/init.ts +49 -1
  110. package/src/lang/en.json +3 -2
  111. package/src/lang/zh-CN.json +2 -1
  112. package/src/stores.ts +5 -2
  113. package/src/types.ts +3 -0
@@ -0,0 +1,728 @@
1
+ <script>import { tick } from "svelte";
2
+ import { _ } from "svelte-i18n";
3
+ import { Client } from "@gradio/client";
4
+ import { setupi18n } from "./i18n";
5
+ import { ApiDocs, ApiRecorder } from "./api_docs/";
6
+ import { Toast } from "@gradio/statustracker";
7
+ import MountComponents from "./MountComponents.svelte";
8
+ import logo from "./images/logo.svg";
9
+ import api_logo from "./api_docs/img/api-logo.svg";
10
+ import { create_components, AsyncFunction } from "./init";
11
+ setupi18n();
12
+ export let root;
13
+ export let components;
14
+ export let layout;
15
+ export let dependencies;
16
+ export let title = "Gradio";
17
+ export let target;
18
+ export let autoscroll;
19
+ export let show_api = true;
20
+ export let show_footer = true;
21
+ export let control_page_title = false;
22
+ export let app_mode;
23
+ export let theme_mode;
24
+ export let app;
25
+ export let space_id;
26
+ export let version;
27
+ export let js;
28
+ export let fill_height = false;
29
+ export let ready;
30
+ export let username;
31
+ const {
32
+ layout: _layout,
33
+ targets,
34
+ update_value,
35
+ get_data,
36
+ modify_stream,
37
+ get_stream_state,
38
+ set_time_limit,
39
+ loading_status,
40
+ scheduled_updates,
41
+ create_layout,
42
+ rerender_layout
43
+ } = create_components();
44
+ $:
45
+ create_layout({
46
+ components,
47
+ layout,
48
+ dependencies,
49
+ root: root + app.api_prefix,
50
+ app,
51
+ options: {
52
+ fill_height
53
+ }
54
+ });
55
+ $: {
56
+ ready = !!$_layout;
57
+ }
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;
61
+ function set_api_docs_visible(visible) {
62
+ api_recorder_visible = false;
63
+ api_docs_visible = visible;
64
+ let params2 = new URLSearchParams(window.location.search);
65
+ if (visible) {
66
+ params2.set("view", "api");
67
+ } else {
68
+ params2.delete("view");
69
+ }
70
+ history.replaceState(null, "", "?" + params2.toString());
71
+ }
72
+ let api_calls = [];
73
+ export let render_complete = false;
74
+ async function handle_update(data, fn_index) {
75
+ const outputs = dependencies.find((dep) => dep.id == fn_index).outputs;
76
+ const meta_updates = data?.map((value, i) => {
77
+ return {
78
+ id: outputs[i],
79
+ prop: "value_is_output",
80
+ value: true
81
+ };
82
+ });
83
+ update_value(meta_updates);
84
+ await tick();
85
+ const updates = [];
86
+ data?.forEach((value, i) => {
87
+ if (typeof value === "object" && value !== null && value.__type__ === "update") {
88
+ for (const [update_key, update_value2] of Object.entries(value)) {
89
+ if (update_key === "__type__") {
90
+ continue;
91
+ } else {
92
+ updates.push({
93
+ id: outputs[i],
94
+ prop: update_key,
95
+ value: update_value2
96
+ });
97
+ }
98
+ }
99
+ } else {
100
+ updates.push({
101
+ id: outputs[i],
102
+ prop: "value",
103
+ value
104
+ });
105
+ }
106
+ });
107
+ update_value(updates);
108
+ await tick();
109
+ }
110
+ let submit_map = /* @__PURE__ */ new Map();
111
+ let messages = [];
112
+ function new_message(message, fn_index, type, duration = 10, visible = true) {
113
+ return {
114
+ message,
115
+ fn_index,
116
+ type,
117
+ id: ++_error_id,
118
+ duration,
119
+ visible
120
+ };
121
+ }
122
+ export function add_new_message(message, type) {
123
+ messages = [new_message(message, -1, type), ...messages];
124
+ }
125
+ let _error_id = -1;
126
+ let user_left_page = false;
127
+ document.addEventListener("visibilitychange", function() {
128
+ if (document.visibilityState === "hidden") {
129
+ user_left_page = true;
130
+ }
131
+ });
132
+ const MESSAGE_QUOTE_RE = /^'([^]+)'$/;
133
+ const DUPLICATE_MESSAGE = $_("blocks.long_requests_queue");
134
+ const MOBILE_QUEUE_WARNING = $_("blocks.connection_can_break");
135
+ const MOBILE_RECONNECT_MESSAGE = $_("blocks.lost_connection");
136
+ const SHOW_DUPLICATE_MESSAGE_ON_ETA = 15;
137
+ 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 showed_duplicate_message = false;
142
+ let showed_mobile_warning = false;
143
+ function wait_then_trigger_api_call(dep_index, trigger_id = null, event_data = null) {
144
+ let _unsub = () => {
145
+ };
146
+ function unsub() {
147
+ _unsub();
148
+ }
149
+ if ($scheduled_updates) {
150
+ _unsub = scheduled_updates.subscribe((updating) => {
151
+ if (!updating) {
152
+ trigger_api_call(dep_index, trigger_id, event_data);
153
+ unsub();
154
+ }
155
+ });
156
+ } else {
157
+ trigger_api_call(dep_index, trigger_id, event_data);
158
+ }
159
+ }
160
+ async function get_component_value_or_event_data(component_id, trigger_id, event_data) {
161
+ if (component_id === trigger_id && event_data && event_data.is_value_data === true) {
162
+ return event_data.value;
163
+ }
164
+ return get_data(component_id);
165
+ }
166
+ async function trigger_api_call(dep_index, trigger_id = null, event_data = null) {
167
+ let dep = dependencies.find((dep2) => dep2.id === dep_index);
168
+ const current_status = loading_status.get_status_for_fn(dep_index);
169
+ messages = messages.filter(({ fn_index }) => fn_index !== dep_index);
170
+ if (current_status === "pending" || current_status === "generating") {
171
+ dep.pending_request = true;
172
+ }
173
+ let payload = {
174
+ fn_index: dep_index,
175
+ data: await Promise.all(
176
+ dep.inputs.map(
177
+ (id) => get_component_value_or_event_data(id, trigger_id, event_data)
178
+ )
179
+ ),
180
+ event_data: dep.collects_event_data ? event_data : null,
181
+ trigger_id
182
+ };
183
+ if (dep.frontend_fn) {
184
+ dep.frontend_fn(
185
+ payload.data.concat(
186
+ await Promise.all(dep.outputs.map((id) => get_data(id)))
187
+ )
188
+ ).then((v) => {
189
+ if (dep.backend_fn) {
190
+ payload.data = v;
191
+ make_prediction(payload);
192
+ } else {
193
+ handle_update(v, dep_index);
194
+ }
195
+ });
196
+ } else if (dep.types.cancel && dep.cancels) {
197
+ await Promise.all(
198
+ dep.cancels.map(async (fn_index) => {
199
+ const submission = submit_map.get(fn_index);
200
+ submission?.cancel();
201
+ return submission;
202
+ })
203
+ );
204
+ } else {
205
+ 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
+ }
217
+ }
218
+ }
219
+ }
220
+ async function make_prediction(payload2, streaming = false) {
221
+ if (api_recorder_visible) {
222
+ api_calls = [...api_calls, JSON.parse(JSON.stringify(payload2))];
223
+ }
224
+ let submission;
225
+ app.set_current_payload(payload2);
226
+ if (streaming) {
227
+ if (!submit_map.has(dep_index)) {
228
+ dep.inputs.forEach((id) => modify_stream(id, "waiting"));
229
+ } else if (submit_map.has(dep_index) && dep.inputs.some((id) => get_stream_state(id) === "waiting")) {
230
+ return;
231
+ } else if (submit_map.has(dep_index) && dep.inputs.some((id) => get_stream_state(id) === "open")) {
232
+ await app.post_data(
233
+ // @ts-ignore
234
+ `${app.config.root}/stream/${submit_map.get(dep_index).event_id()}`,
235
+ { ...payload2, session_hash: app.session_hash }
236
+ );
237
+ return;
238
+ }
239
+ }
240
+ try {
241
+ submission = app.submit(
242
+ payload2.fn_index,
243
+ payload2.data,
244
+ payload2.event_data,
245
+ payload2.trigger_id
246
+ );
247
+ } catch (e) {
248
+ const fn_index = 0;
249
+ messages = [new_message(String(e), fn_index, "error"), ...messages];
250
+ loading_status.update({
251
+ status: "error",
252
+ fn_index,
253
+ eta: 0,
254
+ queue: false,
255
+ queue_position: null
256
+ });
257
+ set_status($loading_status);
258
+ return;
259
+ }
260
+ submit_map.set(dep_index, submission);
261
+ for await (const message of submission) {
262
+ if (message.type === "data") {
263
+ handle_data(message);
264
+ } else if (message.type === "render") {
265
+ handle_render(message);
266
+ } else if (message.type === "status") {
267
+ handle_status_update(message);
268
+ } else if (message.type === "log") {
269
+ handle_log(message);
270
+ }
271
+ }
272
+ function handle_data(message) {
273
+ const { data, fn_index } = message;
274
+ if (dep.pending_request && dep.final_event) {
275
+ dep.pending_request = false;
276
+ make_prediction(dep.final_event);
277
+ }
278
+ dep.pending_request = false;
279
+ handle_update(data, fn_index);
280
+ set_status($loading_status);
281
+ }
282
+ function handle_render(message) {
283
+ const { data } = message;
284
+ let _components = data.components;
285
+ let render_layout = data.layout;
286
+ let _dependencies = data.dependencies;
287
+ let render_id = data.render_id;
288
+ let deps_to_remove = [];
289
+ dependencies.forEach((dep2, i) => {
290
+ if (dep2.rendered_in === render_id) {
291
+ deps_to_remove.push(i);
292
+ }
293
+ });
294
+ deps_to_remove.reverse().forEach((i) => {
295
+ dependencies.splice(i, 1);
296
+ });
297
+ _dependencies.forEach((dep2) => {
298
+ dependencies.push(dep2);
299
+ });
300
+ rerender_layout({
301
+ components: _components,
302
+ layout: render_layout,
303
+ root,
304
+ dependencies,
305
+ render_id
306
+ });
307
+ }
308
+ function handle_log(msg) {
309
+ const { log, fn_index, level, duration, visible } = msg;
310
+ messages = [
311
+ new_message(log, fn_index, level, duration, visible),
312
+ ...messages
313
+ ];
314
+ }
315
+ function open_stream_events(status, id, dep2) {
316
+ if (status.original_msg === "process_starts" && dep2.connection === "stream") {
317
+ modify_stream(id, "open");
318
+ }
319
+ }
320
+ function handle_status_update(message) {
321
+ const { fn_index, ...status } = message;
322
+ if (status.stage === "streaming" && status.time_limit) {
323
+ dep.inputs.forEach((id) => {
324
+ set_time_limit(id, status.time_limit);
325
+ });
326
+ }
327
+ dep.inputs.forEach((id) => {
328
+ open_stream_events(message, id, dep);
329
+ });
330
+ loading_status.update({
331
+ ...status,
332
+ time_limit: status.time_limit,
333
+ status: status.stage,
334
+ progress: status.progress_data,
335
+ fn_index
336
+ });
337
+ set_status($loading_status);
338
+ if (!showed_duplicate_message && space_id !== null && status.position !== void 0 && status.position >= 2 && status.eta !== void 0 && status.eta > SHOW_DUPLICATE_MESSAGE_ON_ETA) {
339
+ showed_duplicate_message = true;
340
+ messages = [
341
+ new_message(DUPLICATE_MESSAGE, fn_index, "warning"),
342
+ ...messages
343
+ ];
344
+ }
345
+ if (!showed_mobile_warning && is_mobile_device && status.eta !== void 0 && status.eta > SHOW_MOBILE_QUEUE_WARNING_ON_ETA) {
346
+ showed_mobile_warning = true;
347
+ messages = [
348
+ new_message(MOBILE_QUEUE_WARNING, fn_index, "warning"),
349
+ ...messages
350
+ ];
351
+ }
352
+ if (status.stage === "complete") {
353
+ status.changed_state_ids?.forEach((id) => {
354
+ dependencies.filter((dep2) => dep2.targets.some(([_id, _2]) => _id === id)).forEach((dep2) => {
355
+ wait_then_trigger_api_call(dep2.id, payload2.trigger_id);
356
+ });
357
+ });
358
+ dependencies.forEach(async (dep2) => {
359
+ if (dep2.trigger_after === fn_index) {
360
+ wait_then_trigger_api_call(dep2.id, payload2.trigger_id);
361
+ }
362
+ });
363
+ dep.inputs.forEach((id) => {
364
+ modify_stream(id, "closed");
365
+ });
366
+ submit_map.delete(dep_index);
367
+ }
368
+ if (status.broken && is_mobile_device && user_left_page) {
369
+ window.setTimeout(() => {
370
+ messages = [
371
+ new_message(MOBILE_RECONNECT_MESSAGE, fn_index, "error"),
372
+ ...messages
373
+ ];
374
+ }, 0);
375
+ wait_then_trigger_api_call(dep.id, payload2.trigger_id, event_data);
376
+ user_left_page = false;
377
+ } else if (status.stage === "error") {
378
+ if (status.message) {
379
+ const _message = status.message.replace(
380
+ MESSAGE_QUOTE_RE,
381
+ (_2, b) => b
382
+ );
383
+ messages = [
384
+ new_message(
385
+ _message,
386
+ fn_index,
387
+ "error",
388
+ status.duration,
389
+ status.visible
390
+ ),
391
+ ...messages
392
+ ];
393
+ }
394
+ dependencies.map(async (dep2) => {
395
+ if (dep2.trigger_after === fn_index && !dep2.trigger_only_on_success) {
396
+ wait_then_trigger_api_call(dep2.id, payload2.trigger_id);
397
+ }
398
+ });
399
+ }
400
+ }
401
+ }
402
+ }
403
+ function trigger_share(title2, description) {
404
+ if (space_id === null) {
405
+ return;
406
+ }
407
+ const discussion_url = new URL(
408
+ `https://huggingface.co/spaces/${space_id}/discussions/new`
409
+ );
410
+ if (title2 !== void 0 && title2.length > 0) {
411
+ discussion_url.searchParams.set("title", title2);
412
+ }
413
+ discussion_url.searchParams.set("description", description);
414
+ window.open(discussion_url.toString(), "_blank");
415
+ }
416
+ function handle_error_close(e) {
417
+ const _id = e.detail;
418
+ messages = messages.filter((m) => m.id !== _id);
419
+ }
420
+ const is_external_url = (link) => !!(link && new URL(link, location.href).origin !== location.origin);
421
+ async function handle_mount() {
422
+ if (js) {
423
+ let blocks_frontend_fn = new AsyncFunction(
424
+ `let result = await (${js})();
425
+ return (!Array.isArray(result)) ? [result] : result;`
426
+ );
427
+ await blocks_frontend_fn();
428
+ }
429
+ await tick();
430
+ var a = target.getElementsByTagName("a");
431
+ for (var i = 0; i < a.length; i++) {
432
+ const _target = a[i].getAttribute("target");
433
+ const _link = a[i].getAttribute("href");
434
+ if (is_external_url(_link) && _target !== "_blank")
435
+ a[i].setAttribute("target", "_blank");
436
+ }
437
+ dependencies.forEach((dep) => {
438
+ if (dep.targets.some((dep2) => dep2[1] === "load")) {
439
+ wait_then_trigger_api_call(dep.id);
440
+ }
441
+ });
442
+ if (render_complete)
443
+ return;
444
+ target.addEventListener("prop_change", (e) => {
445
+ if (!isCustomEvent(e))
446
+ throw new Error("not a custom event");
447
+ const { id, prop, value } = e.detail;
448
+ update_value([{ id, prop, value }]);
449
+ });
450
+ target.addEventListener("gradio", (e) => {
451
+ if (!isCustomEvent(e))
452
+ throw new Error("not a custom event");
453
+ const { id, event, data } = e.detail;
454
+ if (event === "share") {
455
+ const { title: title2, description } = data;
456
+ trigger_share(title2, description);
457
+ } else if (event === "error" || event === "warning") {
458
+ messages = [new_message(data, -1, event), ...messages];
459
+ } else if (event == "clear_status") {
460
+ update_status(id, "complete", data);
461
+ } else if (event == "close_stream") {
462
+ const deps = $targets[id]?.[data];
463
+ deps?.forEach((dep_id) => {
464
+ if (submit_map.has(dep_id)) {
465
+ app.post_data(
466
+ // @ts-ignore
467
+ `${app.config.root}/stream/${submit_map.get(dep_id).event_id()}/close`,
468
+ {}
469
+ );
470
+ }
471
+ });
472
+ } else {
473
+ const deps = $targets[id]?.[event];
474
+ deps?.forEach((dep_id) => {
475
+ requestAnimationFrame(() => {
476
+ wait_then_trigger_api_call(dep_id, id, data);
477
+ });
478
+ });
479
+ }
480
+ });
481
+ render_complete = true;
482
+ }
483
+ $:
484
+ set_status($loading_status);
485
+ function update_status(id, status, data) {
486
+ data.status = status;
487
+ update_value([
488
+ {
489
+ id,
490
+ prop: "loading_status",
491
+ value: data
492
+ }
493
+ ]);
494
+ }
495
+ function set_status(statuses) {
496
+ let updates = [];
497
+ Object.entries(statuses).forEach(([id, loading_status2]) => {
498
+ let dependency = dependencies.find(
499
+ (dep) => dep.id == loading_status2.fn_index
500
+ );
501
+ if (dependency === void 0) {
502
+ return;
503
+ }
504
+ loading_status2.scroll_to_output = dependency.scroll_to_output;
505
+ loading_status2.show_progress = dependency.show_progress;
506
+ updates.push({
507
+ id: parseInt(id),
508
+ prop: "loading_status",
509
+ value: loading_status2
510
+ });
511
+ });
512
+ const inputs_to_update = loading_status.get_inputs_to_update();
513
+ const additional_updates = Array.from(inputs_to_update).map(
514
+ ([id, pending_status]) => {
515
+ return {
516
+ id,
517
+ prop: "pending",
518
+ value: pending_status === "pending"
519
+ };
520
+ }
521
+ );
522
+ update_value([...updates, ...additional_updates]);
523
+ }
524
+ function isCustomEvent(event) {
525
+ return "detail" in event;
526
+ }
527
+ </script>
528
+
529
+ <svelte:head>
530
+ {#if control_page_title}
531
+ <title>{title}</title>
532
+ {/if}
533
+ </svelte:head>
534
+
535
+ <div class="wrap" style:min-height={app_mode ? "100%" : "auto"}>
536
+ <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}
550
+ </div>
551
+
552
+ {#if show_footer}
553
+ <footer>
554
+ {#if show_api}
555
+ <button
556
+ on:click={() => {
557
+ set_api_docs_visible(!api_docs_visible);
558
+ }}
559
+ class="show-api"
560
+ >
561
+ {$_("errors.use_via_api")}
562
+ <img src={api_logo} alt={$_("common.logo")} />
563
+ </button>
564
+ <div>·</div>
565
+ {/if}
566
+ <a
567
+ href="https://gradio.app"
568
+ class="built-with"
569
+ target="_blank"
570
+ rel="noreferrer"
571
+ >
572
+ {$_("common.built_with_gradio")}
573
+ <img src={logo} alt={$_("common.logo")} />
574
+ </a>
575
+ </footer>
576
+ {/if}
577
+ </div>
578
+
579
+ {#if api_recorder_visible}
580
+ <!-- TODO: fix -->
581
+ <!-- svelte-ignore a11y-click-events-have-key-events-->
582
+ <!-- svelte-ignore a11y-no-static-element-interactions-->
583
+ <div
584
+ id="api-recorder-container"
585
+ on:click={() => {
586
+ set_api_docs_visible(true);
587
+ api_recorder_visible = false;
588
+ }}
589
+ >
590
+ <ApiRecorder {api_calls} {dependencies} />
591
+ </div>
592
+ {/if}
593
+
594
+ {#if api_docs_visible && $_layout}
595
+ <div class="api-docs">
596
+ <!-- TODO: fix -->
597
+ <!-- svelte-ignore a11y-click-events-have-key-events-->
598
+ <!-- svelte-ignore a11y-no-static-element-interactions-->
599
+ <div
600
+ class="backdrop"
601
+ on:click={() => {
602
+ set_api_docs_visible(false);
603
+ }}
604
+ />
605
+ <div class="api-docs-wrap">
606
+ <ApiDocs
607
+ root_node={$_layout}
608
+ on:close={(event) => {
609
+ set_api_docs_visible(false);
610
+ api_calls = [];
611
+ api_recorder_visible = event.detail.api_recorder_visible;
612
+ }}
613
+ {dependencies}
614
+ {root}
615
+ {app}
616
+ {space_id}
617
+ {api_calls}
618
+ {username}
619
+ />
620
+ </div>
621
+ </div>
622
+ {/if}
623
+
624
+ {#if messages}
625
+ <Toast {messages} on:close={handle_error_close} />
626
+ {/if}
627
+
628
+ <style>
629
+ .wrap {
630
+ display: flex;
631
+ flex-grow: 1;
632
+ flex-direction: column;
633
+ width: var(--size-full);
634
+ font-weight: var(--body-text-weight);
635
+ font-size: var(--body-text-size);
636
+ }
637
+
638
+ .contain {
639
+ display: flex;
640
+ flex-direction: column;
641
+ }
642
+
643
+ footer {
644
+ display: flex;
645
+ justify-content: center;
646
+ margin-top: var(--size-4);
647
+ color: var(--body-text-color-subdued);
648
+ }
649
+
650
+ footer > * + * {
651
+ margin-left: var(--size-2);
652
+ }
653
+
654
+ .show-api {
655
+ display: flex;
656
+ align-items: center;
657
+ }
658
+ .show-api:hover {
659
+ color: var(--body-text-color);
660
+ }
661
+
662
+ .show-api img {
663
+ margin-right: var(--size-1);
664
+ margin-left: var(--size-2);
665
+ width: var(--size-3);
666
+ }
667
+
668
+ .built-with {
669
+ display: flex;
670
+ align-items: center;
671
+ }
672
+
673
+ .built-with:hover {
674
+ color: var(--body-text-color);
675
+ }
676
+
677
+ .built-with img {
678
+ margin-right: var(--size-1);
679
+ margin-left: var(--size-1);
680
+ margin-bottom: 1px;
681
+ width: var(--size-4);
682
+ }
683
+
684
+ .api-docs {
685
+ display: flex;
686
+ position: fixed;
687
+ top: 0;
688
+ right: 0;
689
+ z-index: var(--layer-top);
690
+ background: rgba(0, 0, 0, 0.5);
691
+ width: var(--size-screen);
692
+ height: var(--size-screen-h);
693
+ }
694
+
695
+ .backdrop {
696
+ flex: 1 1 0%;
697
+ -webkit-backdrop-filter: blur(4px);
698
+ backdrop-filter: blur(4px);
699
+ }
700
+
701
+ .api-docs-wrap {
702
+ box-shadow: var(--shadow-drop-lg);
703
+ background: var(--background-fill-primary);
704
+ overflow-x: hidden;
705
+ overflow-y: auto;
706
+ }
707
+
708
+ @media (--screen-md) {
709
+ .api-docs-wrap {
710
+ border-top-left-radius: var(--radius-lg);
711
+ border-bottom-left-radius: var(--radius-lg);
712
+ width: 950px;
713
+ }
714
+ }
715
+
716
+ @media (--screen-xxl) {
717
+ .api-docs-wrap {
718
+ width: 1150px;
719
+ }
720
+ }
721
+
722
+ #api-recorder-container {
723
+ position: fixed;
724
+ left: 10px;
725
+ bottom: 10px;
726
+ z-index: 1000;
727
+ }
728
+ </style>