| <script lang="ts"> | |
| import { onMount } from "svelte"; | |
| import { Image } from "@gradio/image/shared"; | |
| import { Video } from "@gradio/video/shared"; | |
| import type { FileData } from "@gradio/client"; | |
| export let value: { text: string; files: FileData[] } = { | |
| text: "", | |
| files: [] | |
| }; | |
| export let type: "gallery" | "table"; | |
| export let selected = false; | |
| let size: number; | |
| let el: HTMLDivElement; | |
| function set_styles(element: HTMLElement, el_width: number): void { | |
| if (!element || !el_width) return; | |
| el.style.setProperty( | |
| "--local-text-width", | |
| `${el_width < 150 ? el_width : 200}px` | |
| ); | |
| el.style.whiteSpace = "unset"; | |
| } | |
| onMount(() => { | |
| set_styles(el, size); | |
| }); | |
| </script> | |
| <div | |
| class="container" | |
| bind:clientWidth={size} | |
| bind:this={el} | |
| class:table={type === "table"} | |
| class:gallery={type === "gallery"} | |
| class:selected | |
| class:border={value} | |
| > | |
| <p>{value.text ? value.text : ""}</p> | |
| {#each value.files as file} | |
| {#if file.mime_type && file.mime_type.includes("image")} | |
| <Image src={file.url} alt="" /> | |
| {:else if file.mime_type && file.mime_type.includes("video")} | |
| <Video src={file.url} alt="" loop={true} is_stream={false} /> | |
| {:else if file.mime_type && file.mime_type.includes("audio")} | |
| <audio src={file.url} controls /> | |
| {:else} | |
| {file.orig_name} | |
| {/if} | |
| {/each} | |
| </div> | |
| <style> | |
| .gallery { | |
| padding: var(--size-1) var(--size-2); | |
| display: flex; | |
| align-items: center; | |
| gap: 20px; | |
| overflow-x: auto; | |
| } | |
| div { | |
| overflow: hidden; | |
| min-width: var(--local-text-width); | |
| white-space: nowrap; | |
| } | |
| .container :global(img), | |
| .container :global(video) { | |
| object-fit: contain; | |
| width: 100px; | |
| height: 100px; | |
| } | |
| .container.selected { | |
| border-color: var(--border-color-accent); | |
| } | |
| .border.table { | |
| border: 2px solid var(--border-color-primary); | |
| } | |
| .container.table { | |
| margin: 0 auto; | |
| border-radius: var(--radius-lg); | |
| overflow-x: auto; | |
| width: max-content; | |
| height: max-content; | |
| object-fit: cover; | |
| padding: var(--size-2); | |
| } | |
| .container.gallery { | |
| object-fit: cover; | |
| } | |
| div > :global(p) { | |
| font-size: var(--text-lg); | |
| white-space: normal; | |
| } | |
| </style> | |