| <script lang="ts"> |
| import CodeExecutionModal from './CodeExecutionModal.svelte'; |
| import Spinner from '$lib/components/common/Spinner.svelte'; |
| import Check from '$lib/components/icons/Check.svelte'; |
| import XMark from '$lib/components/icons/XMark.svelte'; |
| import EllipsisHorizontal from '$lib/components/icons/EllipsisHorizontal.svelte'; |
| |
| export let codeExecutions = []; |
| |
| let selectedCodeExecution = null; |
| let showCodeExecutionModal = false; |
| |
| $: if (codeExecutions) { |
| updateSelectedCodeExecution(); |
| } |
| |
| const updateSelectedCodeExecution = () => { |
| if (selectedCodeExecution) { |
| selectedCodeExecution = codeExecutions.find( |
| (execution) => execution.id === selectedCodeExecution.id |
| ); |
| } |
| }; |
| </script> |
|
|
| <CodeExecutionModal bind:show={showCodeExecutionModal} codeExecution={selectedCodeExecution} /> |
|
|
| {#if codeExecutions.length > 0} |
| <div class="mt-1 mb-2 w-full flex gap-1 items-center flex-wrap"> |
| {#each codeExecutions as execution (execution.id)} |
| <div class="flex gap-1 text-xs font-semibold"> |
| <button |
| class="flex dark:text-gray-300 py-1 px-1 bg-gray-50 hover:bg-gray-100 dark:bg-gray-850 dark:hover:bg-gray-800 transition rounded-xl max-w-96" |
| on:click={() => { |
| selectedCodeExecution = execution; |
| showCodeExecutionModal = true; |
| }} |
| > |
| <div |
| class="bg-white dark:bg-gray-700 rounded-full size-4 flex items-center justify-center" |
| > |
| {#if execution?.result} |
| {#if execution.result?.error} |
| <XMark /> |
| {:else if execution.result?.output} |
| <Check strokeWidth="3" className="size-3" /> |
| {:else} |
| <EllipsisHorizontal /> |
| {/if} |
| {:else} |
| <Spinner className="size-4" /> |
| {/if} |
| </div> |
| <div |
| class="flex-1 mx-2 line-clamp-1 code-execution-name {execution?.result ? '' : 'pulse'}" |
| > |
| {execution.name} |
| </div> |
| </button> |
| </div> |
| {/each} |
| </div> |
| {/if} |
|
|
| <style> |
| @keyframes pulse { |
| 0%, |
| 100% { |
| opacity: 1; |
| } |
| 50% { |
| opacity: 0.6; |
| } |
| } |
| |
| .pulse { |
| opacity: 1; |
| animation: pulse 1.5s ease; |
| } |
| </style> |
|
|