Select

Composable select primitives whose panel bouncily unfolds out of the trigger and separates, plus a Morph variant where the trigger grows into the panel via shared layout.

Select

select.tsx

Composable primitives (Select, SelectTrigger, SelectValue, SelectContent, SelectItem); the panel pinches off the trigger and separates, with staggered items. Position-aware (opens upward when needed).

Install

$ bunx --bun shadcn add @beui/select

API Reference

Select

value?
string
defaultValue?
string
onValueChange?
((value: string) => void)
open?
boolean

Controlled open state of the panel. A layout that stacks selects can hold this to keep exactly one panel open — the panel is absolutely positioned inside its field, so two open at once paint over each other's options.

defaultOpen?
boolean

Uncontrolled initial open state. Default false.

false
onOpenChange?
((open: boolean) => void)

Fires whenever the panel opens or closes. The panel is absolutely positioned inside the field, so a layout that stacks selects has to know which one is open to paint it above its neighbours.

disabled?
boolean
false
className?
string

SelectTrigger

className?
string

SelectValue

placeholder?
string
className?
string

SelectContent

className?
string

SelectItem

value
string
disabled?
boolean
false
className?
string

Morph Select

select-morph.tsx

Composable primitives (MorphSelect, MorphSelectTrigger, MorphSelectValue, MorphSelectContent, MorphSelectItem) where the trigger morphs into the panel via a shared layoutId — one continuous surface that grows open and shrinks back, never detaching.

Install

$ bunx --bun shadcn add @beui/select-morph

API Reference

MorphSelect

value?
string
defaultValue?
string
onValueChange?
((value: string) => void)
disabled?
boolean
false
className?
string

MorphSelectValue

placeholder?
string
className?
string

MorphSelectTrigger

className?
string

MorphSelectContent

className?
string

MorphSelectItem

value
string
disabled?
boolean
false
className?
string

Updated