Forms

Select for option lists

Select surfaces help users pick one or many values from structured lists. Use them in React forms and Next.js settings pages where native selects fall short on styling or behavior.

Examples

Single-select, multi-select, and controlled value patterns with trigger and content variants.




Select variants examples

Trigger uses CVA variant and size; the list panel uses appearance and size on SelectContent. Each snippet starts with a Variant: lead-in.


Select · multi, controlled value + onChange



























SelectContent · Appearance · glass, Size · sm, Spacing · default


SelectContent · Appearance · glass, Size · md, Spacing · default


SelectContent · Appearance · glass, Size · lg, Spacing · default


SelectContent · Appearance · sky, Size · md, Spacing · none


SelectContent · Appearance · sky, Size · md, Spacing · default


SelectContent · Appearance · sky, Size · md, Spacing · sm


SelectContent · Appearance · sky, Size · md, Spacing · md


SelectContent · Appearance · sky, Size · md, Spacing · lg


SelectContent · Appearance · sky, Size · md, Spacing · xl

CSS variable overrides

Select CSS variables

Override these select variables on :root, a theme selector, or a component wrapper.

287 variables

Pattern: --zui-<component>-<slot?>-<variant?>-<property>-<state?>-dark?

:root {
  --zui-select-trigger-ring-focus: oklch(44.6% 0.03 256.802);
  --zui-select-trigger-default-border: oklch(87.2% 0.01 258.338);
  --zui-select-trigger-default-bg: #ffffff;
  --zui-select-trigger-default-fg: oklch(13% 0.028 261.692);
  --zui-select-trigger-outline-border: oklch(55.1% 0.027 264.364);
  --zui-select-trigger-outline-fg: oklch(13% 0.028 261.692);
  --zui-select-trigger-ghost-border: transparent;
  --zui-select-trigger-ghost-fg: oklch(13% 0.028 261.692);
  --zui-select-trigger-sky-border: oklch(44.3% 0.11 240.79);
  --zui-select-trigger-sky-fg: oklch(29.3% 0.066 243.157);
  --zui-select-trigger-rose-border: oklch(45.5% 0.188 13.697);
  --zui-select-trigger-rose-fg: oklch(27.1% 0.105 12.094);
  --zui-select-trigger-purple-border: oklch(43.8% 0.218 303.724);
  --zui-select-trigger-purple-fg: oklch(29.1% 0.149 302.717);
  --zui-select-trigger-pink-border: oklch(45.9% 0.187 3.815);
  --zui-select-trigger-pink-fg: oklch(28.4% 0.109 3.907);
  --zui-select-trigger-orange-border: oklch(47% 0.157 37.304);
  --zui-select-trigger-orange-fg: oklch(26.6% 0.079 36.259);
  --zui-select-trigger-yellow-border: oklch(47.6% 0.114 61.907);
  --zui-select-trigger-yellow-fg: oklch(28.6% 0.066 53.813);
  --zui-select-trigger-teal-border: oklch(43.7% 0.078 188.216);
  --zui-select-trigger-teal-fg: oklch(27.7% 0.046 192.524);
  --zui-select-trigger-indigo-border: oklch(58.5% 0.233 277.117);
  --zui-select-trigger-indigo-fg: oklch(25.7% 0.09 281.288);
  --zui-select-trigger-emerald-border: oklch(43.2% 0.095 166.913);
  --zui-select-trigger-emerald-fg: oklch(26.2% 0.051 172.552);
  --zui-select-trigger-glass-border: #00000026;
  --zui-select-trigger-glass-bg: #0000001a;
  --zui-select-trigger-glass-fg: oklch(13% 0.028 261.692);
  --zui-select-trigger-gradient-blue-from: oklch(37.9% 0.146 265.522);
  --zui-select-trigger-gradient-blue-to: oklch(38.1% 0.176 304.987);
  --zui-select-trigger-gradient-blue-fg: #ffffff;
  --zui-select-trigger-gradient-green-from: oklch(39.3% 0.095 152.535);
  --zui-select-trigger-gradient-green-to: oklch(40.5% 0.101 131.063);
  --zui-select-trigger-gradient-green-fg: #ffffff;
  --zui-select-trigger-gradient-red-from: oklch(39.6% 0.141 25.723);
  --zui-select-trigger-gradient-red-to: oklch(40.8% 0.153 2.432);
  --zui-select-trigger-gradient-red-fg: #ffffff;
  --zui-select-trigger-gradient-yellow-from: oklch(42.1% 0.095 57.708);
  --zui-select-trigger-gradient-yellow-to: oklch(40.8% 0.123 38.172);
  --zui-select-trigger-gradient-yellow-fg: #ffffff;
  --zui-select-trigger-gradient-purple-from: oklch(38.1% 0.176 304.987);
  --zui-select-trigger-gradient-purple-to: oklch(40.8% 0.153 2.432);
  --zui-select-trigger-gradient-purple-fg: #ffffff;
  --zui-select-trigger-gradient-teal-from: oklch(38.6% 0.063 188.416);
  --zui-select-trigger-gradient-teal-to: oklch(39.8% 0.07 227.392);
  --zui-select-trigger-gradient-teal-fg: #ffffff;
  --zui-select-trigger-gradient-indigo-from: oklch(35.9% 0.144 278.697);
  --zui-select-trigger-gradient-indigo-to: oklch(38.1% 0.176 304.987);
  --zui-select-trigger-gradient-indigo-fg: #ffffff;
  --zui-select-trigger-gradient-pink-from: oklch(40.8% 0.153 2.432);
  --zui-select-trigger-gradient-pink-to: oklch(41% 0.159 10.272);
  --zui-select-trigger-gradient-pink-fg: #ffffff;
  --zui-select-trigger-gradient-orange-from: oklch(40.8% 0.123 38.172);
  --zui-select-trigger-gradient-orange-to: oklch(39.6% 0.141 25.723);
  --zui-select-trigger-gradient-orange-fg: #ffffff;
  --zui-select-item-ring-focus: oklch(44.6% 0.03 256.802);
  --zui-select-item-default-bg: #ffffff;
  --zui-select-item-default-fg: oklch(21% 0.034 264.665);
  --zui-select-item-glass-bg: #0000001a;
  --zui-select-item-glass-fg: oklch(37.3% 0.034 259.733);
  --zui-select-item-outline-border: oklch(55.1% 0.027 264.364);
  --zui-select-item-outline-fg: oklch(21% 0.034 264.665);
  --zui-select-item-outline-bg: oklch(92.8% 0.006 264.531);
  --zui-select-item-ghost-border: transparent;
  --zui-select-item-ghost-fg: oklch(21% 0.034 264.665);
  --zui-select-item-ghost-bg: transparent;
  --zui-select-item-sky-border: oklch(39.1% 0.09 240.876);
  --zui-select-item-sky-fg: oklch(39.1% 0.09 240.876);
  --zui-select-item-sky-bg: oklch(90.1% 0.058 230.902);
  --zui-select-item-rose-border: oklch(41% 0.159 10.272);
  --zui-select-item-rose-fg: oklch(41% 0.159 10.272);
  --zui-select-item-rose-bg: oklch(89.2% 0.058 10.001);
  --zui-select-item-purple-border: oklch(38.1% 0.176 304.987);
  --zui-select-item-purple-fg: oklch(38.1% 0.176 304.987);
  --zui-select-item-purple-bg: oklch(90.2% 0.063 306.703);
  --zui-select-item-pink-border: oklch(40.8% 0.153 2.432);
  --zui-select-item-pink-fg: oklch(40.8% 0.153 2.432);
  --zui-select-item-pink-bg: oklch(89.9% 0.061 343.231);
  --zui-select-item-orange-border: oklch(40.8% 0.123 38.172);
  --zui-select-item-orange-fg: oklch(40.8% 0.123 38.172);
  --zui-select-item-orange-bg: oklch(90.1% 0.076 70.697);
  --zui-select-item-yellow-border: oklch(42.1% 0.095 57.708);
  --zui-select-item-yellow-fg: oklch(42.1% 0.095 57.708);
  --zui-select-item-yellow-bg: oklch(94.5% 0.129 101.54);
  --zui-select-item-teal-border: oklch(38.6% 0.063 188.416);
  --zui-select-item-teal-fg: oklch(38.6% 0.063 188.416);
  --zui-select-item-teal-bg: oklch(91% 0.096 180.426);
  --zui-select-item-indigo-border: oklch(35.9% 0.144 278.697);
  --zui-select-item-indigo-fg: oklch(35.9% 0.144 278.697);
  --zui-select-item-indigo-bg: oklch(87% 0.065 274.039);
  --zui-select-item-emerald-border: oklch(37.8% 0.077 168.94);
  --zui-select-item-emerald-fg: oklch(37.8% 0.077 168.94);
  --zui-select-item-emerald-bg: oklch(90.5% 0.093 164.15);
  --zui-select-item-gradient-blue-bg: transparent;
  --zui-select-item-gradient-blue-fg: oklch(97% 0.014 254.604);
  --zui-select-item-gradient-blue-from: oklch(97% 0.014 254.604);
  --zui-select-item-gradient-blue-to: oklch(97.7% 0.014 308.299);
  --zui-select-item-gradient-green-bg: transparent;
  --zui-select-item-gradient-green-fg: oklch(98.2% 0.018 155.826);
  --zui-select-item-gradient-green-from: oklch(98.2% 0.018 155.826);
  --zui-select-item-gradient-green-to: oklch(98.6% 0.031 120.757);
  --zui-select-item-gradient-red-bg: transparent;
  --zui-select-item-gradient-red-fg: oklch(97.1% 0.013 17.38);
  --zui-select-item-gradient-red-from: oklch(97.1% 0.013 17.38);
  --zui-select-item-gradient-red-to: oklch(97.1% 0.014 343.198);
  --zui-select-item-gradient-yellow-bg: transparent;
  --zui-select-item-gradient-yellow-fg: oklch(98.7% 0.026 102.212);
  --zui-select-item-gradient-yellow-from: oklch(98.7% 0.026 102.212);
  --zui-select-item-gradient-yellow-to: oklch(98% 0.016 73.684);
  --zui-select-item-gradient-purple-bg: transparent;
  --zui-select-item-gradient-purple-fg: oklch(97.7% 0.014 308.299);
  --zui-select-item-gradient-purple-from: oklch(97.7% 0.014 308.299);
  --zui-select-item-gradient-purple-to: oklch(97.1% 0.014 343.198);
  --zui-select-item-gradient-teal-bg: transparent;
  --zui-select-item-gradient-teal-fg: oklch(98.4% 0.014 180.72);
  --zui-select-item-gradient-teal-from: oklch(98.4% 0.014 180.72);
  --zui-select-item-gradient-teal-to: oklch(98.4% 0.019 200.873);
  --zui-select-item-gradient-indigo-bg: transparent;
  --zui-select-item-gradient-indigo-fg: oklch(96.2% 0.018 272.314);
  --zui-select-item-gradient-indigo-from: oklch(96.2% 0.018 272.314);
  --zui-select-item-gradient-indigo-to: oklch(97.7% 0.014 308.299);
  --zui-select-item-gradient-pink-bg: transparent;
  --zui-select-item-gradient-pink-fg: oklch(97.1% 0.014 343.198);
  --zui-select-item-gradient-pink-from: oklch(97.1% 0.014 343.198);
  --zui-select-item-gradient-pink-to: oklch(96.9% 0.015 12.422);
  --zui-select-item-gradient-orange-bg: transparent;
  --zui-select-item-gradient-orange-fg: oklch(98% 0.016 73.684);
  --zui-select-item-gradient-orange-from: oklch(98% 0.016 73.684);
  --zui-select-item-gradient-orange-to: oklch(97.1% 0.013 17.38);
  --zui-select-content-bg: #ffffff;
  --zui-select-content-default-bg: #ffffff;
  --zui-select-content-glass-bg: #0000001a;
  --zui-select-content-outline-border: oklch(55.1% 0.027 264.364);
  --zui-select-content-ghost-border: transparent;
  --zui-select-content-sky-border: oklch(39.1% 0.09 240.876);
  --zui-select-content-rose-border: oklch(41% 0.159 10.272);
  --zui-select-content-purple-border: oklch(38.1% 0.176 304.987);
  --zui-select-content-pink-border: oklch(40.8% 0.153 2.432);
  --zui-select-content-orange-border: oklch(40.8% 0.123 38.172);
  --zui-select-content-yellow-border: oklch(42.1% 0.095 57.708);
  --zui-select-content-teal-border: oklch(38.6% 0.063 188.416);
  --zui-select-content-indigo-border: oklch(35.9% 0.144 278.697);
  --zui-select-content-emerald-border: oklch(37.8% 0.077 168.94);
  --zui-select-content-gradient-blue-from: oklch(37.9% 0.146 265.522);
  --zui-select-content-gradient-blue-to: oklch(38.1% 0.176 304.987);
  --zui-select-content-gradient-green-from: oklch(39.3% 0.095 152.535);
  --zui-select-content-gradient-green-to: oklch(40.5% 0.101 131.063);
  --zui-select-content-gradient-red-from: oklch(39.6% 0.141 25.723);
  --zui-select-content-gradient-red-to: oklch(40.8% 0.153 2.432);
  --zui-select-content-gradient-yellow-from: oklch(42.1% 0.095 57.708);
  --zui-select-content-gradient-yellow-to: oklch(40.8% 0.123 38.172);
  --zui-select-content-gradient-purple-from: oklch(38.1% 0.176 304.987);
  --zui-select-content-gradient-purple-to: oklch(40.8% 0.153 2.432);
  --zui-select-content-gradient-teal-from: oklch(38.6% 0.063 188.416);
  --zui-select-content-gradient-teal-to: oklch(39.8% 0.07 227.392);
  --zui-select-content-gradient-indigo-from: oklch(35.9% 0.144 278.697);
  --zui-select-content-gradient-indigo-to: oklch(38.1% 0.176 304.987);
  --zui-select-content-gradient-pink-from: oklch(40.8% 0.153 2.432);
  --zui-select-content-gradient-pink-to: oklch(41% 0.159 10.272);
  --zui-select-content-gradient-orange-from: oklch(40.8% 0.123 38.172);
  --zui-select-content-gradient-orange-to: oklch(39.6% 0.141 25.723);
}

/* Dark theme variables follow the same names with -dark appended. */
.dark {
  --zui-select-trigger-ring-focus-dark: oklch(70.7% 0.022 261.325);
  --zui-select-trigger-default-border-dark: oklch(87.2% 0.01 258.338);
  /* ...same variables with -dark at the end */
}

What it does

Compound parts separate triggers, portals, and listboxes.

Keep option text concise to preserve scan speed.

Composition and API

Prefer compound subcomponents instead of one oversized prop bag. Export a small, documented API for your design system.

Announce selection changes when they drive expensive remote fetches.

Common use cases

  • Choose tenants or projects in admin shells.
  • Pick assignees on issue forms.
  • Filter charts by dimension values.
  • Configure feature flags with grouped options.

Accessibility

Keyboard order, focus rings, and ARIA attributes should match production usage. Test with your supported browsers and assistive technologies when semantics are non-trivial.

This preview page exposes a single h1 in the hero for a clean outline.

Next.js integration notes

Colocate examples under the App Router, keep server and client boundaries explicit, and avoid pulling interactive overlays into unexpected server layouts.

Set NEXT_PUBLIC_SITE_URL so canonical and Open Graph URLs resolve on deploy.

FAQ

Does the Select component work with Next.js App Router?

Yes. Import it like any other React component; keep interactive subtrees in client components when you need hooks or browser APIs, and leave static structure in server components where possible.

Can I customize select with Tailwind CSS?

Zentauri UI exposes class-friendly variants and slots so you can extend styles with Tailwind utilities without fighting inline styles.

Is this Select implementation accessible by default?

Primitives follow sensible defaults, but accessibility depends on how you label controls, manage focus, and wire keyboard handlers in your app. Validate critical flows with keyboard-only use and screen readers.