Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
inference-widgets
/
packages
/widgets
/src
/lib
/components
/InferenceWidget
/shared
/WidgetOutputChart
/WidgetOutputChart.svelte
| <!-- | |
| for Tailwind: | |
| from-blue-400 to-blue-200 dark:from-blue-400 dark:to-blue-600 | |
| from-cyan-400 to-cyan-200 dark:from-cyan-400 dark:to-cyan-600 | |
| from-green-400 to-green-200 dark:from-green-400 dark:to-green-600 | |
| from-indigo-400 to-indigo-200 dark:from-indigo-400 dark:to-indigo-600 | |
| from-lime-400 to-lime-200 dark:from-lime-400 dark:to-lime-600 | |
| from-orange-400 to-orange-200 dark:from-orange-400 dark:to-orange-600 | |
| from-purple-400 to-purple-200 dark:from-purple-400 dark:to-purple-600 | |
| from-red-400 to-red-200 dark:from-red-400 dark:to-red-600 | |
| from-yellow-400 to-yellow-200 dark:from-yellow-400 dark:to-yellow-600 | |
| --> | |
| <script lang="ts"> | |
| export let classNames = ""; | |
| export let defaultBarColor = "purple"; | |
| type LabelField = "label" | "answer"; | |
| export let labelField: LabelField = "label"; | |
| export let output: Array< | |
| { label: string; score?: number; color?: string } | { answer: string; score?: number; color?: string } | |
| > = []; | |
| export let highlightIndex = -1; | |
| export let mouseover: (index: number) => void = () => {}; | |
| export let mouseout: () => void = () => {}; | |
| $: scoreMax = Math.max(0, ...output.map((x) => x.score ?? 0)); | |
| function text(outputItem: (typeof output)[0]) { | |
| if (labelField in outputItem) { | |
| return outputItem[labelField as keyof typeof outputItem]; | |
| } else { | |
| return ""; | |
| } | |
| } | |
| </script> | |
| {#if output.length} | |
| <div class="space-y-3.5 {classNames}"> | |
| <!-- NB: We sadly can't do color = defaultBarColor as the Svelte compiler will throw an unused-export-let warning (bug on their side) ... --> | |
| {#each output as { score, color }, index} | |
| <!-- svelte-ignore a11y-mouse-events-have-key-events --> | |
| <div | |
| class="animate__animated animate__fadeIn flex items-start justify-between font-mono | |
| text-xs leading-none transition duration-200 ease-in-out | |
| {highlightIndex !== -1 && highlightIndex !== index && 'opacity-30 grayscale filter'} | |
| " | |
| style="animation-delay: {0.04 * index}s" | |
| on:mouseover={() => mouseover(index)} | |
| on:mouseout={mouseout} | |
| > | |
| <div class="flex-1"> | |
| <div | |
| class="mb-1 h-1 rounded bg-gradient-to-r | |
| from-{color ?? defaultBarColor}-400 | |
| to-{color ?? defaultBarColor}-200 | |
| dark:from-{color ?? defaultBarColor}-400 | |
| dark:to-{color ?? defaultBarColor}-600" | |
| style={`width: ${score ? Math.ceil((score / scoreMax) * 100 * 0.8) : 0}%;`} | |
| /> | |
| <span class="leading-snug">{text(output[index])}</span> | |
| </div> | |
| {#if typeof score === "number"} | |
| <span class="pl-2">{score.toFixed(3)}</span> | |
| {/if} | |
| </div> | |
| {/each} | |
| </div> | |
| {/if} | |