@gradio/core 0.0.2 → 0.0.4

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