feature/search-select-search-in-trigger

This commit is contained in:
hreyes
2026-02-11 16:58:59 -06:00
parent cfdbd7771e
commit bbb4e46d58
8 changed files with 104 additions and 135 deletions

View File

@@ -2,6 +2,8 @@
import { Select as SelectPrimitive } from "bits-ui";
import ChevronDownIcon from "@lucide/svelte/icons/chevron-down";
import { cn, type WithoutChild } from "$lib/utils.js";
import { getContext } from "svelte";
import { selectSearchContextKey, type SelectSearchContext } from "./select-search-context";
let {
ref = $bindable(null),
@@ -12,12 +14,25 @@
}: WithoutChild<SelectPrimitive.TriggerProps> & {
size?: "sm" | "default";
} = $props();
const searchContext = getContext<SelectSearchContext | undefined>(selectSearchContextKey);
function handleTriggerKeydown(event: KeyboardEvent) {
if (!searchContext) return;
if (event.ctrlKey || event.metaKey || event.altKey) return;
if (event.key.length === 1) {
searchContext.setOpen(true);
searchContext.query.update((value) => value + event.key);
event.preventDefault();
}
}
</script>
<SelectPrimitive.Trigger
bind:ref
data-slot="select-trigger"
data-size={size}
onkeydown={handleTriggerKeydown}
class={cn(
"border-input data-[placeholder]:text-muted-foreground [&_svg:not([class*='text-'])]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 dark:hover:bg-input/50 shadow-xs flex w-fit select-none items-center justify-between gap-2 whitespace-nowrap rounded-md border bg-transparent px-3 py-2 text-sm outline-none transition-[color,box-shadow] focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0",
className