|
<script lang="ts"> |
|
import { createEventDispatcher } from "svelte"; |
|
import { type FileData } from "@gradio/client"; |
|
import { BaseButton } from "@gradio/button"; |
|
|
|
export let elem_id = ""; |
|
export let elem_classes: string[] = []; |
|
export let visible = true; |
|
export let variant: "primary" | "secondary" | "stop" = "secondary"; |
|
export let size: "sm" | "lg" = "lg"; |
|
export let value: null | FileData; |
|
export let icon: null | FileData; |
|
export let disabled = false; |
|
export let scale: number | null = null; |
|
export let min_width: number | undefined = undefined; |
|
const dispatch = createEventDispatcher(); |
|
|
|
function download_file(): void { |
|
dispatch("click"); |
|
if (!value?.url) { |
|
return; |
|
} |
|
let file_name; |
|
if (!value.orig_name && value.url) { |
|
const parts = value.url.split("/"); |
|
file_name = parts[parts.length - 1]; |
|
file_name = file_name.split("?")[0].split("#")[0]; |
|
} else { |
|
file_name = value.orig_name; |
|
} |
|
const a = document.createElement("a"); |
|
a.href = value.url; |
|
a.download = file_name || "file"; |
|
document.body.appendChild(a); |
|
a.click(); |
|
document.body.removeChild(a); |
|
} |
|
</script> |
|
|
|
<BaseButton |
|
{size} |
|
{variant} |
|
{elem_id} |
|
{elem_classes} |
|
{visible} |
|
on:click={download_file} |
|
{scale} |
|
{min_width} |
|
{disabled} |
|
> |
|
{#if icon} |
|
<img class="button-icon" src={icon.url} alt={`${value} icon`} /> |
|
{/if} |
|
<slot /> |
|
</BaseButton> |
|
|
|
<style> |
|
.button-icon { |
|
width: var(--text-xl); |
|
height: var(--text-xl); |
|
margin-right: var(--spacing-xl); |
|
} |
|
</style> |
|
|