Epicenter
Local-first, open source apps
Installation
Install bits-ui:
Copy and paste the following code into your project.
Usage
<script lang="ts">
import * as Select from "$lib/components/ui/select/index.js";
</script> <Select.Root type="single">
<Select.Trigger class="w-[180px]">
<Select.Value placeholder="Select a theme" />
</Select.Trigger>
<Select.Content>
<Select.Item value="light">Light</Select.Item>
<Select.Item value="dark">Dark</Select.Item>
<Select.Item value="system">System</Select.Item>
</Select.Content>
</Select.Root> Select.Value renders the label of the selected item, falling back to placeholder when nothing is selected.
It reads the label from the matching Select.Item, which only exists in the DOM while the menu is open. Pass items to Select.Root so the label survives the menu closing:
<script lang="ts">
const themes = [
{ value: "light", label: "Light" },
{ value: "dark", label: "Dark" },
{ value: "system", label: "System" },
];
</script>
<Select.Root type="single" items={themes}>
<Select.Trigger class="w-[180px]">
<Select.Value placeholder="Select a theme" />
</Select.Trigger>
<Select.Content>
{#each themes as theme (theme.value)}
<Select.Item value={theme.value}>{theme.label}</Select.Item>
{/each}
</Select.Content>
</Select.Root> Without items the trigger falls back to the raw value, so you only need it when an item's label differs from its value.