|
<script lang="ts">
|
|
import type { I18nFormatter } from "@gradio/utils";
|
|
import { Upload as UploadIcon, ImagePaste } from "@gradio/icons";
|
|
import { inject } from "./utils/parse_placeholder";
|
|
|
|
export let type:
|
|
| "video"
|
|
| "image"
|
|
| "audio"
|
|
| "file"
|
|
| "csv"
|
|
| "clipboard"
|
|
| "gallery" = "file";
|
|
export let i18n: I18nFormatter;
|
|
export let message: string | undefined = undefined;
|
|
export let mode: "full" | "short" = "full";
|
|
export let hovered = false;
|
|
export let placeholder: string | undefined = undefined;
|
|
|
|
const defs = {
|
|
image: "upload_text.drop_image",
|
|
video: "upload_text.drop_video",
|
|
audio: "upload_text.drop_audio",
|
|
file: "upload_text.drop_file",
|
|
csv: "upload_text.drop_csv",
|
|
gallery: "upload_text.drop_gallery",
|
|
clipboard: "upload_text.paste_clipboard"
|
|
};
|
|
|
|
$: [heading, paragraph] = placeholder ? inject(placeholder) : [false, false];
|
|
</script>
|
|
|
|
<div class="wrap">
|
|
<span class="icon-wrap" class:hovered>
|
|
{#if type === "clipboard"}
|
|
<ImagePaste />
|
|
{:else}
|
|
<UploadIcon />
|
|
{/if}
|
|
</span>
|
|
|
|
{#if heading || paragraph}
|
|
{#if heading}
|
|
<h2>{heading}</h2>
|
|
{/if}
|
|
{#if paragraph}
|
|
<p>{paragraph}</p>
|
|
{/if}
|
|
{:else}
|
|
{i18n(defs[type] || defs.file)}
|
|
|
|
{#if mode !== "short"}
|
|
<span class="or">- {i18n("common.or")} -</span>
|
|
{message || i18n("upload_text.click_to_upload")}
|
|
{/if}
|
|
{/if}
|
|
</div>
|
|
|
|
<style>
|
|
h2 {
|
|
font-size: var(--text-xl) !important;
|
|
}
|
|
|
|
p,
|
|
h2 {
|
|
white-space: pre-line;
|
|
}
|
|
|
|
.wrap {
|
|
display: flex;
|
|
flex-direction: column;
|
|
justify-content: center;
|
|
align-items: center;
|
|
min-height: var(--size-60);
|
|
color: var(--block-label-text-color);
|
|
line-height: var(--line-md);
|
|
height: 100%;
|
|
padding-top: var(--size-3);
|
|
text-align: center;
|
|
margin: auto var(--spacing-lg);
|
|
}
|
|
|
|
.or {
|
|
color: var(--body-text-color-subdued);
|
|
display: flex;
|
|
}
|
|
|
|
.icon-wrap {
|
|
width: 30px;
|
|
margin-bottom: var(--spacing-lg);
|
|
}
|
|
|
|
@media (--screen-md) {
|
|
.wrap {
|
|
font-size: var(--text-lg);
|
|
}
|
|
}
|
|
|
|
.hovered {
|
|
color: var(--color-accent);
|
|
}
|
|
</style>
|
|
|