Files
wehub-resource-sync adf0d17497
publish / version_or_publish (push) Has been cancelled
storybook-build / changes (push) Has been cancelled
storybook-build / :storybook-build (push) Has been cancelled
Sync Gradio Skills to Hugging Face / sync-skills (push) Has been cancelled
functional / changes (push) Has been cancelled
functional / build-frontend (push) Has been cancelled
functional / functional-test-SSR=false (push) Has been cancelled
functional / functional-reload (push) Has been cancelled
js / changes (push) Has been cancelled
js / js-test (push) Has been cancelled
docs-build / changes (push) Has been cancelled
docs-build / docs-build (push) Has been cancelled
docs-build / website-build (push) Has been cancelled
functional / functional-test-SSR=true (push) Has been cancelled
hygiene / hygiene-test (push) Has been cancelled
python / changes (push) Has been cancelled
python / build (push) Has been cancelled
python / test-ubuntu-latest-flaky (push) Has been cancelled
python / test-ubuntu-latest-not-flaky (push) Has been cancelled
python / test-windows-latest-flaky (push) Has been cancelled
python / test-windows-latest-not-flaky (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:17:32 +08:00

115 lines
3.1 KiB
Svelte

<script lang="ts">
import { IconButton } from "@gradio/atoms";
import ThumbDownActive from "./ThumbDownActive.svelte";
import ThumbDownDefault from "./ThumbDownDefault.svelte";
import ThumbUpActive from "./ThumbUpActive.svelte";
import ThumbUpDefault from "./ThumbUpDefault.svelte";
import Flag from "./Flag.svelte";
import FlagActive from "./FlagActive.svelte";
import type { I18nFormatter } from "js/core/src/gradio_helper";
let {
i18n,
handle_action,
feedback_options,
selected: selected_prop = null
}: {
i18n: I18nFormatter;
handle_action: (selected: string | null) => void;
feedback_options: string[];
selected?: string | null;
} = $props();
let selected = $state(selected_prop);
$effect(() => {
selected = selected_prop;
});
let extra_feedback = $derived(
feedback_options.filter(
(option) => option !== "Like" && option !== "Dislike"
)
);
function toggleSelection(newSelection: string): void {
selected = selected === newSelection ? null : newSelection;
handle_action(selected);
}
</script>
{#if feedback_options.includes("Like") || feedback_options.includes("Dislike")}
{#if feedback_options.includes("Dislike")}
<IconButton
Icon={selected === "Dislike" ? ThumbDownActive : ThumbDownDefault}
label={selected === "Dislike" ? "Disliked" : i18n("chatbot.dislike")}
color={selected === "Dislike"
? "var(--color-accent)"
: "var(--block-label-text-color)"}
onclick={() => toggleSelection("Dislike")}
/>
{/if}
{#if feedback_options.includes("Like")}
<IconButton
Icon={selected === "Like" ? ThumbUpActive : ThumbUpDefault}
label={selected === "Like" ? "Liked" : i18n("chatbot.like")}
color={selected === "Like"
? "var(--color-accent)"
: "var(--block-label-text-color)"}
onclick={() => toggleSelection("Like")}
/>
{/if}
{/if}
{#if extra_feedback.length > 0}
<div class="extra-feedback no-border">
<IconButton
Icon={selected && extra_feedback.includes(selected) ? FlagActive : Flag}
label="Feedback"
color={selected && extra_feedback.includes(selected)
? "var(--color-accent)"
: "var(--block-label-text-color)"}
/>
<div class="extra-feedback-options">
{#each extra_feedback as option}
<button
class="extra-feedback-option"
style:font-weight={selected === option ? "bold" : "normal"}
onclick={() => {
toggleSelection(option);
handle_action(selected ? selected : null);
}}>{option}</button
>
{/each}
</div>
</div>
{/if}
<style>
.extra-feedback {
display: flex;
align-items: center;
position: relative;
}
.extra-feedback-options {
display: none;
position: absolute;
padding: var(--spacing-md) 0;
flex-direction: column;
gap: var(--spacing-sm);
top: 100%;
}
.extra-feedback:hover .extra-feedback-options {
display: flex;
}
.extra-feedback-option {
border: 1px solid var(--border-color-primary);
border-radius: var(--radius-sm);
color: var(--block-label-text-color);
background-color: var(--block-background-fill);
font-size: var(--text-xs);
padding: var(--spacing-xxs) var(--spacing-sm);
width: max-content;
}
</style>