gradio
63 строки · 1.5 Кб
1<script lang="ts">
2import { createEventDispatcher } from "svelte";
3import { type FileData } from "@gradio/client";
4import { BaseButton } from "@gradio/button";
5
6export let elem_id = "";
7export let elem_classes: string[] = [];
8export let visible = true;
9export let variant: "primary" | "secondary" | "stop" = "secondary";
10export let size: "sm" | "lg" = "lg";
11export let value: null | FileData;
12export let icon: null | FileData;
13export let disabled = false;
14export let scale: number | null = null;
15export let min_width: number | undefined = undefined;
16const dispatch = createEventDispatcher();
17
18function download_file(): void {
19if (!value?.url) {
20return;
21}
22let file_name;
23if (!value.orig_name && value.url) {
24const parts = value.url.split("/");
25file_name = parts[parts.length - 1];
26file_name = file_name.split("?")[0].split("#")[0];
27} else {
28file_name = value.orig_name;
29}
30const a = document.createElement("a");
31a.href = value.url;
32a.download = file_name || "file";
33document.body.appendChild(a);
34a.click();
35document.body.removeChild(a);
36dispatch("click");
37}
38</script>
39
40<BaseButton
41{size}
42{variant}
43{elem_id}
44{elem_classes}
45{visible}
46on:click={download_file}
47{scale}
48{min_width}
49{disabled}
50>
51{#if icon}
52<img class="button-icon" src={icon.url} alt={`${value} icon`} />
53{/if}
54<slot />
55</BaseButton>
56
57<style>
58.button-icon {
59width: var(--text-xl);
60height: var(--text-xl);
61margin-right: var(--spacing-xl);
62}
63</style>
64