CSS contract table
| Selector | Applied on | Purpose |
|---|---|---|
[data-slot='select'] | root host | Own the outer shell, root spacing, and open-state driven layout changes. |
[data-slot='select-trigger'] | trigger button | Apply focus ring, border, surface, and text treatment to the visible trigger. |
[data-slot='select-listbox'] | listbox container | Define overlay padding, option spacing, and owned scrolling behavior. |
[data-slot='select-option'] | option row | Style idle option rows before layering active, selected, and disabled states on top. |
[data-active] / [data-selected] / [data-disabled] | option state | Represent focus movement, committed selection, and unavailable rows without custom JavaScript. |
State selectors
Selectbox state selectors
css
[data-slot='select'][data-state='open'] { ... }
[data-slot='select-trigger']:focus-visible { ... }
[data-slot='select-option'][data-active] { ... }
[data-slot='select-option'][data-selected] { ... }
[data-slot='select-option'][data-selected][data-active] { ... }
[data-slot='select-option'][data-disabled] { ... }Example shells
The primitive contract stays the same while your shell defines the trigger, overlay, and option row treatment.
Release owners (Plain-CSS)
Release owners
The primitive stays native while your wrapper card and option rows carry the visual style.
Release owners (Tailwind CSS)
Release owners
The primitive stays native while your wrapper card and option rows carry the visual style.
Abigail Chen
Design systems
Mina Lee
Core UI
Omar Aziz
Compliance
Sanjay Patel
Documentation