Spaces:
Paused
Paused
| <script lang="ts"> | |
| import type { WebSearchUpdate } from "$lib/types/MessageUpdate"; | |
| import CarbonCaretRight from "~icons/carbon/caret-right"; | |
| import CarbonCheckmark from "~icons/carbon/checkmark-filled"; | |
| import CarbonError from "~icons/carbon/error-filled"; | |
| import EosIconsLoading from "~icons/eos-icons/loading"; | |
| export let loading = false; | |
| export let classNames = ""; | |
| export let webSearchMessages: WebSearchUpdate[] = []; | |
| let detailsOpen: boolean; | |
| let error: boolean; | |
| $: error = webSearchMessages[webSearchMessages.length - 1]?.messageType === "error"; | |
| </script> | |
| <details | |
| class="flex w-fit rounded-xl border border-gray-200 bg-white shadow-sm dark:border-gray-800 dark:bg-gray-900 {classNames} max-w-full" | |
| bind:open={detailsOpen} | |
| > | |
| <summary | |
| class="align-center flex cursor-pointer select-none list-none py-1 pl-2.5 pr-2 align-text-top transition-all" | |
| > | |
| {#if error} | |
| <CarbonError class="my-auto text-red-700 dark:text-red-500" /> | |
| {:else if loading} | |
| <EosIconsLoading class="my-auto text-gray-500" /> | |
| {:else} | |
| <CarbonCheckmark class="my-auto text-gray-500" /> | |
| {/if} | |
| <span class="px-2 font-medium" class:text-red-700={error} class:dark:text-red-500={error} | |
| >Web search | |
| </span> | |
| <div class="my-auto transition-all" class:rotate-90={detailsOpen}> | |
| <CarbonCaretRight /> | |
| </div> | |
| </summary> | |
| <div class="content px-5 pb-5 pt-4"> | |
| {#if webSearchMessages.length === 0} | |
| <div class="mx-auto w-fit"> | |
| <EosIconsLoading class="mb-3 h-4 w-4" /> | |
| </div> | |
| {:else} | |
| <ol> | |
| {#each webSearchMessages as message} | |
| {#if message.messageType === "update"} | |
| <li class="group border-l pb-6 last:!border-transparent last:pb-0 dark:border-gray-800"> | |
| <div class="flex items-start"> | |
| <div | |
| class="-ml-1.5 h-3 w-3 flex-none rounded-full bg-gray-200 dark:bg-gray-600 {loading | |
| ? 'group-last:animate-pulse group-last:bg-gray-300 group-last:dark:bg-gray-500' | |
| : ''}" | |
| /> | |
| <h3 class="text-md -mt-1.5 pl-2.5 text-gray-800 dark:text-gray-100"> | |
| {message.message} | |
| </h3> | |
| </div> | |
| {#if message.args} | |
| <p class="mt-1.5 pl-4 text-gray-500 dark:text-gray-400"> | |
| {message.args} | |
| </p> | |
| {/if} | |
| </li> | |
| {:else if message.messageType === "error"} | |
| <li class="group border-l pb-6 last:!border-transparent last:pb-0 dark:border-gray-800"> | |
| <div class="flex items-start"> | |
| <CarbonError | |
| class="-ml-1.5 h-3 w-3 flex-none scale-110 text-red-700 dark:text-red-500" | |
| /> | |
| <h3 class="text-md -mt-1.5 pl-2.5 text-red-700 dark:text-red-500"> | |
| {message.message} | |
| </h3> | |
| </div> | |
| {#if message.args} | |
| <p class="mt-1.5 pl-4 text-gray-500 dark:text-gray-400"> | |
| {message.args} | |
| </p> | |
| {/if} | |
| </li> | |
| {/if} | |
| {/each} | |
| </ol> | |
| {/if} | |
| </div> | |
| </details> | |
| <style> | |
| @keyframes grow { | |
| 0% { | |
| font-size: 0; | |
| opacity: 0; | |
| } | |
| 30% { | |
| font-size: 1em; | |
| opacity: 0; | |
| } | |
| 100% { | |
| opacity: 1; | |
| } | |
| } | |
| details[open] .content { | |
| animation-name: grow; | |
| animation-duration: 300ms; | |
| animation-delay: 0ms; | |
| } | |
| details summary::-webkit-details-marker { | |
| display: none; | |
| } | |
| </style> | |