open-webui/src/lib/components/common/DropdownOptions.svelte

63 lines
1.6 KiB
Svelte
Raw Normal View History

2025-12-09 21:45:08 +00:00
<script lang="ts">
import { getContext } from 'svelte';
import { Select, DropdownMenu } from 'bits-ui';
import ChevronDown from '$lib/components/icons/ChevronDown.svelte';
const i18n = getContext('i18n');
export let align = 'center';
export let className = '';
export let value = '';
export let placeholder = 'Select an option';
export let items = [
{ value: 'new', label: $i18n.t('New') },
{ value: 'top', label: $i18n.t('Top') }
];
2025-12-09 22:19:42 +00:00
export let onChange: (value: string) => void = () => {};
2025-12-09 21:45:08 +00:00
let open = false;
</script>
<DropdownMenu.Root bind:open>
<DropdownMenu.Trigger>
<div
class={className
? className
: 'flex w-full items-center gap-2 truncate bg-transparent px-0.5 text-sm placeholder-gray-400 outline-hidden focus:outline-hidden'}
>
{items.find((item) => item.value === value)?.label ?? placeholder}
<ChevronDown className=" size-3" strokeWidth="2.5" />
</div>
</DropdownMenu.Trigger>
<DropdownMenu.Content {align}>
<div
class="dark:bg-gray-850 z-50 w-full rounded-2xl border border-gray-100 bg-white p-1 shadow-lg dark:border-gray-800 dark:text-white"
>
{#each items as item}
<button
class="flex w-full cursor-pointer items-center gap-2 rounded-xl px-3 py-1.5 text-sm hover:bg-gray-50 dark:hover:bg-gray-800 {value ===
item.value
? ' '
: ' text-gray-500 dark:text-gray-400'}"
type="button"
on:click={() => {
2025-12-10 04:57:46 +00:00
if (value === item.value) {
value = null;
} else {
value = item.value;
}
2025-12-09 21:45:08 +00:00
open = false;
2025-12-09 22:19:42 +00:00
onChange(value);
2025-12-09 21:45:08 +00:00
}}
>
{item.label}
</button>
{/each}
</div>
</DropdownMenu.Content>
</DropdownMenu.Root>