import { css, type Handle } from '@remix-run/ui' import { Combobox, ComboboxOption, onComboboxChange } from '@remix-run/ui/combobox' import { theme } from '@remix-run/ui/theme' /** * @name Combobox Overview * @description A searchable combobox with keyboard navigation. Try typing airport names or codes like ord, lax, or jfk. * @layout center */ export default function Example(handle: Handle) { let value: string | null = null return () => (
{ value = event.value void handle.update() }), ]} name="airport" placeholder="Search airports or codes" > {airportOptions.map((airport) => ( ))}
Try typing `san`, `wash`, or airport codes like `ord`, `lax`, or `jfk`, then use ArrowDown and Enter.

{`value=${value ?? 'null'}`}

) } type AirportOption = { disabled?: boolean label: string searchValue: string[] value: string } const airportOptions: AirportOption[] = [ { label: 'Hartsfield-Jackson Atlanta International', searchValue: ['atl', 'atlanta', 'hartsfield-jackson atlanta international'], value: 'ATL', }, { label: 'Austin-Bergstrom International', searchValue: ['aus', 'austin', 'austin-bergstrom international'], value: 'AUS', }, { label: 'Boston Logan International', searchValue: ['bos', 'boston', 'boston logan international'], value: 'BOS', }, { label: 'Baltimore/Washington International', searchValue: ['bwi', 'baltimore', 'washington', 'baltimore/washington international'], value: 'BWI', }, { label: 'Ronald Reagan Washington National', searchValue: ['dca', 'reagan', 'washington', 'ronald reagan washington national'], value: 'DCA', }, { label: 'Denver International', searchValue: ['den', 'denver', 'denver international'], value: 'DEN', }, { label: 'Dallas/Fort Worth International', searchValue: ['dfw', 'dallas', 'fort worth', 'dallas/fort worth international'], value: 'DFW', }, { label: 'Newark Liberty International', searchValue: ['ewr', 'newark', 'newark liberty international'], value: 'EWR', }, { label: 'Daniel K. Inouye International', searchValue: ['hnl', 'honolulu', 'daniel k. inouye international'], value: 'HNL', }, { label: 'Washington Dulles International', searchValue: ['iad', 'dulles', 'washington', 'washington dulles international'], value: 'IAD', }, { label: 'John F. Kennedy International', searchValue: ['jfk', 'kennedy', 'new york', 'john f. kennedy international'], value: 'JFK', }, { label: 'Harry Reid International', searchValue: ['las', 'las vegas', 'harry reid international'], value: 'LAS', }, { label: 'Los Angeles International', searchValue: ['lax', 'los angeles', 'los angeles international'], value: 'LAX', }, { label: 'Orlando International', searchValue: ['mco', 'orlando', 'orlando international'], value: 'MCO', }, { label: 'Miami International', searchValue: ['mia', 'miami', 'miami international'], value: 'MIA', }, { label: "Chicago O'Hare International", searchValue: ['ord', 'ohare', 'chicago', "chicago o'hare international"], value: 'ORD', }, { label: 'Portland International', searchValue: ['pdx', 'portland', 'portland international'], value: 'PDX', }, { label: 'San Diego International', searchValue: ['san', 'san diego', 'san diego international'], value: 'SAN', }, { label: 'San Francisco International', searchValue: ['sfo', 'san francisco', 'san francisco international'], value: 'SFO', }, { disabled: true, label: 'San Jose Mineta International', searchValue: ['sjc', 'san jose', 'san jose mineta international'], value: 'SJC', }, ] const comboboxCss = css({ width: '16rem', }) const stackCss = css({ display: 'flex', flexDirection: 'column', gap: theme.space.sm, width: '100%', }) const fieldCss = css({ display: 'flex', flexDirection: 'column', gap: theme.space.xs, }) const labelCss = css({ margin: 0, fontSize: theme.fontSize.xs, fontWeight: theme.fontWeight.semibold, color: theme.colors.text.primary, }) const helpCss = css({ fontSize: theme.fontSize.xs, lineHeight: theme.lineHeight.relaxed, color: theme.colors.text.secondary, }) const valueCss = css({ margin: 0, fontFamily: theme.fontFamily.mono, fontSize: theme.fontSize.xs, color: theme.colors.text.secondary, })