Components

BasicSelector

Generic single-select dropdown with controlled/uncontrolled modes

Overview

BasicSelector is a generic single-select dropdown. Built with the compound component pattern, it supports both controlled and uncontrolled modes.

  • Compound — Composed of Root, Trigger, Content, Viewport, Value, Item
  • Keyboard — Open with Enter/Space/ArrowDown, close with Escape
  • Accessiblerole="combobox", role="listbox", role="option" applied

Use TagSelector and BadgeSelector for tag/badge selection respectively.

Basic Usage

import { BasicSelector } from '@illog/ui'
 
<BasicSelector.Root value={selected} onValueChange={setSelected}>
  <BasicSelector.Trigger ariaLabel="Sort by">
    <BasicSelector.Value placeholder="Select an option" />
  </BasicSelector.Trigger>
  <BasicSelector.Content>
    <BasicSelector.Viewport>
      <BasicSelector.Item value="latest">Latest</BasicSelector.Item>
      <BasicSelector.Item value="oldest">Oldest</BasicSelector.Item>
      <BasicSelector.Item value="name">Name</BasicSelector.Item>
    </BasicSelector.Viewport>
  </BasicSelector.Content>
</BasicSelector.Root>

Uncontrolled Mode

<BasicSelector.Root defaultValue="latest">
  <BasicSelector.Trigger>
    <BasicSelector.Value />
  </BasicSelector.Trigger>
  <BasicSelector.Content>
    <BasicSelector.Viewport>
      <BasicSelector.Item value="latest">Latest</BasicSelector.Item>
      <BasicSelector.Item value="oldest">Oldest</BasicSelector.Item>
    </BasicSelector.Viewport>
  </BasicSelector.Content>
</BasicSelector.Root>

Custom Value Rendering

<BasicSelector.Value placeholder="Select an option">
  {(value) => <Text color="textBrandDefault">{value}</Text>}
</BasicSelector.Value>

Sub-components

BasicSelector.Root

PropTypeDefaultDescription
valuestringControlled selected value
defaultValuestring''Uncontrolled default value
isOpenedbooleanControlled open state
isDefaultOpenbooleanfalseUncontrolled default open state
disabledbooleanfalseDisabled state
onValueChange(value: string) => voidValue change callback
onOpenChange(open: boolean) => voidOpen state change callback

BasicSelector.Trigger

PropTypeDefaultDescription
ariaLabelstringAccessibility label
classNamestringAdditional CSS class

BasicSelector.Content

PropTypeDefaultDescription
position'item-aligned' | 'popover''item-aligned'Positioning mode
side'top' | 'bottom' | 'left' | 'right''bottom'Popover mode direction
sideOffsetnumber0Gap from trigger (px)

BasicSelector.Item

PropTypeDefaultDescription
valuestringrequiredSelection value
disabledbooleanfalseDisabled state

BasicSelector.Value

PropTypeDefaultDescription
placeholderstringText to display when no value is selected
children(value: string) => ReactNodeCustom render function

Guidelines

  • Consider ToggleMenu for 3 or fewer options
  • Always specify ariaLabel to ensure accessibility