Select

A dropdown selector for choosing one option from a list. The trigger looks like an input field with a trailing chevron. The dropdown panel uses paper background, shadow-md, and 14px radius. Selected items get a teal checkmark. Used for currency, category, and payer selection in the expense form.

Variants

No selection (placeholder)

Value selected

Expanded dropdown

🍜 Food & drink
Common
🍜 Food & drink
✈︎ Travel
βŒ‚ Accommodation
Other
Entertainment
Shopping
Other

The trigger is styled to match the text input β€” same height (44px), same border, same font. It's clearly a selector because of the trailing chevron, not a free-text field.

The dropdown panel anchors directly below the trigger with a 4px gap. It uses --shadow-md for elevation and border-radius: var(--r-md) (14px). Options are 40px tall β€” large enough for confident tapping on mobile.

The selected option shows a teal checkmark (βœ“) aligned to the right. Only one option can be selected at a time.

Sizes

β‚Ή INR
β‚Ή INR β€” Indian rupee
β‚Ή INR β€” Indian rupee
SizeHeightFontUse case
Small36px13pxInline selectors in compact forms
Default44px15pxStandard β€” category, currency, payer in expense form
Large52px17pxProminent selectors in onboarding or settings screens

States

Default

Select…

Focused / open

🍜 Food & drink

Disabled

β‚Ή INR
StateTriggerChevronTransition
Default--ink-line borderPointing downβ€”
Hover--ink-body borderPointing down140ms ease-out
Focused / open--teal border + glowRotated 180Β°140ms ease-out
Disabled40% opacityPointing downβ€”

On dark surfaces

Select a category
🍜 Food & drink
🍜 Food & drink
✈︎ Travel

Anatomy

🍜 Food & drink
Trigger (14px radius, input-like)
Chevron
🍜 Food & drink
✈︎ Travel
Panel (14px radius, shadow-md)
Selected option (teal, check visible)
PartElementNotes
Triggerdiv.select-trigger[role="combobox"]44px height, 14px radius. aria-expanded synced to open/closed state.
Labelspan.select-trigger__labelFlex-grows to fill. Placeholder uses muted color.
ChevronSVG .select-trigger__chevronRotates 180Β° when open. 16px.
Paneldiv.select-panel[role="listbox"]Positioned below trigger, 4px gap. 14px radius, shadow-md.
Optiondiv.select-option[role="option"]40px height. Add .select-option--selected for active item.
CheckSVG .select-option__checkHidden by default, visible on selected option. Teal color.
Group labeldiv.select-group-labelOptional divider with mono text heading.
Separatordiv.select-separator1px warm line between groups.

Usage

Do Use select when there are 6+ options that don't benefit from always being visible. Use group labels and separators when options have natural categories (e.g. food / travel / other). Always pre-select the most common option.
Don't Don't use a select for fewer than 6 options β€” use a radio group. Don't use it for boolean choices β€” use a toggle. Don't put more than 15 items in a dropdown without a search filter.
Do Close the dropdown when an option is selected, when the user clicks outside, or when Escape is pressed. On mobile, consider opening a native picker or a bottom sheet instead.
Don't Don't use a native <select> element β€” it can't be styled to match Settld's design. Don't position the panel so it clips off-screen β€” flip it above the trigger when there's no room below.

Accessibility

ARIA Trigger: role="combobox", aria-haspopup="listbox", aria-expanded="true|false". Panel: role="listbox". Options: role="option", aria-selected="true|false". The trigger's aria-label should describe what's being selected ("Category", "Currency").
Keyboard Enter or Space opens the dropdown. Arrow keys navigate options. Enter selects the focused option. Escape closes without changing selection. Tab closes and moves focus forward.
Focus management When the dropdown opens, focus moves to the listbox or the selected option. When it closes, focus returns to the trigger.

Code

HTML

<!-- Trigger -->
<div class="select-trigger"
     role="combobox"
     aria-haspopup="listbox"
     aria-expanded="false"
     aria-label="Category"
     tabindex="0">
  <span class="select-trigger__label select-trigger__placeholder">Select a category</span>
  <svg class="select-trigger__chevron" aria-hidden="true" viewBox="0 0 16 16" fill="none">
    <path d="M4 6l4 4 4-4" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/>
  </svg>
</div>

<!-- Panel -->
<div class="select-panel" role="listbox" aria-label="Category">
  <div class="select-group-label">Common</div>
  <div class="select-option select-option--selected" role="option" aria-selected="true">
    🍜 Food & drink
    <svg class="select-option__check" aria-hidden="true" viewBox="0 0 16 16" fill="none">
      <path d="M3 8l3.5 3.5 6.5-7" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/>
    </svg>
  </div>
  <!-- More options -->
</div>

CSS classes

ClassPurpose
.select-triggerInput-like trigger button with chevron
.select-trigger__labelSelected value text (flex-grows)
.select-trigger__placeholderMuted placeholder text style
.select-trigger__chevronTrailing arrow SVG β€” rotates on open
.select-panelDropdown container β€” paper bg, shadow-md, 14px radius
.select-option40px item row
.select-option--selectedTeal text + visible check
.select-option__checkCheckmark SVG β€” hidden until selected
.select-group-labelMono uppercase group header
.select-separator1px warm divider between groups