VESYL UI

List

A grouped list of rows with dividers between items. The default card variant adds a border and rounded corners; use variant="rail" when the parent pane owns the surrounding chrome. Rail lists keep a bottom border so the final row still has a visible boundary.

ListItem is a static row. Use ListItemButton for click handlers and ListItemLink for typesafe navigation — both ship with hover, focus, and cursor styles built in.

Props

PropValuesDefaultNotes
as'div' | 'ul''div'ul renders real list semantics; wrap each row in your own <li>.
variant'card' | 'rail''card'card adds a border and rounded corners; rail keeps only a bottom border.

Prefer as="ul". An explicit ARIA role replaces the implicit one, so the div form has to put role="listitem" on each row — which costs that row its own button or link role. Rows read the form from List and drop the role automatically under as="ul", so nothing to set per item:

<List as="ul" variant="rail">
  {rows.map((row) => (
    <li key={row.id}>
      <ListItemButton selected={row.id === selectedId}>{row.title}</ListItemButton>
    </li>
  ))}
</List>

Basic

Profile

Your personal information.

Notifications

Manage what you hear from us.

SettingsNew

Tune the app to your preferences.

With Actions

Rows that own a control (switch, checkbox, trailing button) stay as static ListItems — never nest a button inside a clickable row.

Email notifications

Receive a summary every morning.

Push notifications

Get pinged on this device.

ListItemLink wraps ListItemButton with TanStack Router’s createLink. Pass to, params, search directly — fully typed against the consumer’s route tree. Always pass dynamic segments through params (e.g. to="/orgs/$orgSlug" params={{ orgSlug }}) rather than interpolating into the path string — interpolation skips type checking and silently breaks when a route changes.

As Buttons

Use ListItemButton when the entire row should fire an onClick instead of navigate.

Inactive

inactive sinks the row (muted in light, subtle in dark — muted is a lift on dark rows) and fades its content. Trailing ListItemActions stay full strength so enable/disable (or similar) still read. Use interactive on a static ListItem when the row is clickable but owns nested buttons — ListItemButton cannot wrap other buttons. size="sm" tightens vertical padding.

Hold international

Holds order when country is not US

Singles

Disabled — Adds tag "Singles" when product SKUs match

Selected

Use selected for the current item in a list-to-detail flow. The default selection is neutral. selectionVariant="accent" gives interactive rows a faint accent hover and a stronger accent tint when selected.

With Trailing Button

Some rows have a primary action instead of a link or a switch.

Delete account

Permanently remove this account and all its data.