mirror of
https://github.com/gradio-app/gradio.git
synced 2025-01-24 10:54:04 +08:00
1419538ea7
* asd * changes * fix everything * cleanup * add changeset * fix casing * lockfile * fix casing * fix ci, enable linting * fix test * add changeset * add changeset * delete changeset * fix dirs * fix casing * fix notebooks * fix casing * fix casing * fix casing * fix casing * fix casing * fix casing * fix casing * fix casing --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com>
126 lines
3.0 KiB
Svelte
126 lines
3.0 KiB
Svelte
<script lang="ts">
|
|
import { createEventDispatcher, afterUpdate } from "svelte";
|
|
import { BlockTitle } from "@gradio/atoms";
|
|
import type { SelectData } from "@gradio/utils";
|
|
|
|
export let value: string | null;
|
|
export let value_is_output = false;
|
|
export let choices: string[];
|
|
export let disabled = false;
|
|
export let label: string;
|
|
export let info: string | undefined = undefined;
|
|
export let show_label = true;
|
|
export let elem_id: string;
|
|
|
|
const dispatch = createEventDispatcher<{
|
|
change: string | null;
|
|
input: undefined;
|
|
select: SelectData;
|
|
}>();
|
|
|
|
function handle_change(): void {
|
|
dispatch("change", value);
|
|
if (!value_is_output) {
|
|
dispatch("input");
|
|
}
|
|
}
|
|
afterUpdate(() => {
|
|
value_is_output = false;
|
|
});
|
|
$: value, handle_change();
|
|
</script>
|
|
|
|
<BlockTitle {show_label} {info}>{label}</BlockTitle>
|
|
|
|
<div class="wrap">
|
|
{#each choices as choice, i (i)}
|
|
<label
|
|
class:disabled
|
|
class:selected={value === choice}
|
|
data-testid={`${choice}-radio-label`}
|
|
>
|
|
<input
|
|
{disabled}
|
|
bind:group={value}
|
|
on:input={() => dispatch("select", { value: choice, index: i })}
|
|
type="radio"
|
|
name="radio-{elem_id}"
|
|
value={choice}
|
|
/>
|
|
<span class="ml-2">{choice}</span>
|
|
</label>
|
|
{/each}
|
|
</div>
|
|
|
|
<style>
|
|
.wrap {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
gap: var(--checkbox-label-gap);
|
|
}
|
|
label {
|
|
display: flex;
|
|
align-items: center;
|
|
transition: var(--button-transition);
|
|
cursor: pointer;
|
|
box-shadow: var(--checkbox-label-shadow);
|
|
border: var(--checkbox-label-border-width) solid
|
|
var(--checkbox-label-border-color);
|
|
border-radius: var(--button-small-radius);
|
|
background: var(--checkbox-label-background-fill);
|
|
padding: var(--checkbox-label-padding);
|
|
color: var(--checkbox-label-text-color);
|
|
font-weight: var(--checkbox-label-text-weight);
|
|
font-size: var(--checkbox-label-text-size);
|
|
line-height: var(--line-md);
|
|
}
|
|
|
|
label:hover {
|
|
background: var(--checkbox-label-background-fill-hover);
|
|
}
|
|
label:focus {
|
|
background: var(--checkbox-label-background-fill-focus);
|
|
}
|
|
label.selected {
|
|
background: var(--checkbox-label-background-fill-selected);
|
|
color: var(--checkbox-label-text-color-selected);
|
|
}
|
|
|
|
label > * + * {
|
|
margin-left: var(--size-2);
|
|
}
|
|
|
|
input {
|
|
--ring-color: transparent;
|
|
position: relative;
|
|
box-shadow: var(--checkbox-shadow);
|
|
border: var(--checkbox-border-width) solid var(--checkbox-border-color);
|
|
border-radius: var(--radius-full);
|
|
background-color: var(--checkbox-background-color);
|
|
line-height: var(--line-sm);
|
|
}
|
|
|
|
input:checked,
|
|
input:checked:hover,
|
|
input:checked:focus {
|
|
border-color: var(--checkbox-border-color-selected);
|
|
background-image: var(--radio-circle);
|
|
background-color: var(--checkbox-background-color-selected);
|
|
}
|
|
|
|
input:hover {
|
|
border-color: var(--checkbox-border-color-hover);
|
|
background-color: var(--checkbox-background-color-hover);
|
|
}
|
|
|
|
input:focus {
|
|
border-color: var(--checkbox-border-color-focus);
|
|
background-color: var(--checkbox-background-color-focus);
|
|
}
|
|
|
|
input[disabled],
|
|
.disabled {
|
|
cursor: not-allowed;
|
|
}
|
|
</style>
|