<script lang="ts"> import { type FileData } from "@gradio/client"; 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: string | null = null; export let link: string | null = null; export let icon: FileData | null = null; export let disabled = false; export let scale: number | null = null; export let min_width: number | undefined = undefined; </script> {#if link && link.length > 0} <a href={link} rel="noopener noreferrer" class:hidden={!visible} class:disabled aria-disabled={disabled} class="{size} {variant} {elem_classes.join(' ')}" style:flex-grow={scale} style:pointer-events={disabled ? "none" : null} style:width={scale === 0 ? "fit-content" : null} style:min-width={typeof min_width === "number" ? `calc(min(${min_width}px, 100%))` : null} id={elem_id} > {#if icon} <img class="button-icon" src={icon.url} alt={`${value} icon`} /> {/if} <slot /> </a> {:else} <button on:click class:hidden={!visible} class="{size} {variant} {elem_classes.join(' ')}" style:flex-grow={scale} style:width={scale === 0 ? "fit-content" : null} style:min-width={typeof min_width === "number" ? `calc(min(${min_width}px, 100%))` : null} id={elem_id} {disabled} > {#if icon} <img class="button-icon" src={icon.url} alt={`${value} icon`} /> {/if} <slot /> </button> {/if} <style> button, a { display: inline-flex; justify-content: center; align-items: center; transition: var(--button-transition); box-shadow: var(--button-shadow); padding: var(--size-0-5) var(--size-2); text-align: center; } button:hover, button[disabled], a:hover, a.disabled { box-shadow: var(--button-shadow-hover); } button:active, a:active { box-shadow: var(--button-shadow-active); } button[disabled], a.disabled { opacity: 0.5; filter: grayscale(30%); cursor: not-allowed; } .hidden { display: none; } .primary { border: var(--button-border-width) solid var(--button-primary-border-color); background: var(--button-primary-background-fill); color: var(--button-primary-text-color); } .primary:hover, .primary[disabled] { border-color: var(--button-primary-border-color-hover); background: var(--button-primary-background-fill-hover); color: var(--button-primary-text-color-hover); } .secondary { border: var(--button-border-width) solid var(--button-secondary-border-color); background: var(--button-secondary-background-fill); color: var(--button-secondary-text-color); } .secondary:hover, .secondary[disabled] { border-color: var(--button-secondary-border-color-hover); background: var(--button-secondary-background-fill-hover); color: var(--button-secondary-text-color-hover); } .stop { border: var(--button-border-width) solid var(--button-cancel-border-color); background: var(--button-cancel-background-fill); color: var(--button-cancel-text-color); } .stop:hover, .stop[disabled] { border-color: var(--button-cancel-border-color-hover); background: var(--button-cancel-background-fill-hover); color: var(--button-cancel-text-color-hover); } .sm { border-radius: var(--button-small-radius); padding: var(--button-small-padding); font-weight: var(--button-small-text-weight); font-size: var(--button-small-text-size); } .lg { border-radius: var(--button-large-radius); padding: var(--button-large-padding); font-weight: var(--button-large-text-weight); font-size: var(--button-large-text-size); } .button-icon { width: var(--text-xl); height: var(--text-xl); margin-right: var(--spacing-xl); } </style>