Spaces:
Running
Running
| <script lang="ts"> | |
| import Icon from '@iconify/svelte'; | |
| import type { Model } from "$lib/utils/type"; | |
| let open = false; | |
| export let items: Model[]; | |
| export let value: string; | |
| export let onChange: (value: string) => void; | |
| $: selectedModel = items.find(({ id }) => id === value) | |
| const handleSelect = (id: string) => { | |
| onChange(id) | |
| open = false; | |
| } | |
| const handleOpen = () => open = !open | |
| </script> | |
| <div class="w-full flex flex-col gap-2.5"> | |
| <label | |
| for="model" | |
| class="font-sans text-slate-400 font-regular text-sm" | |
| > | |
| Model: | |
| </label> | |
| <div | |
| id="model" | |
| class={`cursor-pointer shadow-inner font-code border hover:bg-slate-900/90 hover:border-slate-700/80 text-white rounded-lg text-sm w-full transition-all duration-200 leading-relaxed outline-none relative ${open ? 'bg-slate-900/90 border-slate-700/80' : 'border-slate-800 bg-slate-900/60'}`} | |
| > | |
| <button class="w-full flex justify-between items-center px-4 py-3" role="searchbox" on:click={handleOpen}> | |
| {#if selectedModel} | |
| <div class="flex items-center justify-start gap-3"> | |
| <img | |
| src={selectedModel.logo} | |
| alt={selectedModel.id} | |
| width={22} | |
| height={22} | |
| class="rounded-full" | |
| /> | |
| <p>{selectedModel?.label ?? selectedModel?.id}</p> | |
| {#if selectedModel?.label} | |
| <p class="text-slate-400 text-xs">({selectedModel?.id})</p> | |
| {/if} | |
| </div> | |
| {:else} | |
| <p class="opacity-70">Select a model</p> | |
| {/if} | |
| <Icon icon="iconamoon:arrow-right-2-light" class={`text-slate-400 w-5 h-5 transition-all duration-150 ${open && 'transform rotate-90'}`} /> | |
| </button> | |
| <div | |
| class="absolute bottom-0 left-0 w-full pt-4 translate-y-full transition-all duration-150" | |
| class:pointer-events-none={!open} | |
| class:opacity-0={!open} | |
| > | |
| <div class="bg-slate-900 border border-slate-700/80 text-white p-2 font-code rounded-lg"> | |
| {#each items as { id, logo, label }} | |
| <button | |
| class={`w-full flex items-center justify-start gap-3 p-2 cursor-pointer hover:bg-slate-800/60 rounded-lg ${selectedModel?.id === id && 'bg-slate-800/60'}`} | |
| on:click={() => handleSelect(id)} | |
| > | |
| <img | |
| src={logo} | |
| alt={id} | |
| width={22} | |
| height={22} | |
| class="rounded-full" | |
| /> | |
| <p>{label ?? id}</p> | |
| </button> | |
| {/each} | |
| </div> | |
| </div> | |
| </div> | |
| </div> |