Marigold
v18.1.0
Marigold
v18.1.0

Application

MarigoldProvider
RouterProvider

Layout

AppShellbeta
Aside
Aspect
Center
Columns
Container
Grid
Inline
Inset
OverflowRegionbeta
Pagebeta
Panelbeta
Scrollable
Split
Stack
Tiles

Actions

Buttonupdated
ButtonGroupbeta
Link
LinkButton
ToggleButtonbeta

Form

Autocomplete
Calendar
Checkbox
ComboBox
DateField
DatePicker
DateRangePickerbeta
FileField
Form
NumberField
Radio
RangeCalendaralpha
SearchField
SegmentedControlbeta
Select
SelectListupdated
Slider
Switchupdated
TagFieldbeta
TextArea
TextField
TimeField

Collection

Cardupdated
Table
ListViewbeta
Tag
ActionBaralpha

Navigation

Accordion
Breadcrumbs
Pagination
Sidebarbeta
Tabs
TopNavigationbeta

Overlay

ActionMenualpha
ContextualHelp
Dialog
Drawer
Menuupdated
Toastbeta
Tooltip

Content

Badge
Descriptionalpha
Divider
EmptyState
ErrorStatebeta
Headline
Keyboardbeta
List
Loader
SectionMessage
SVG
Text
TextValuealpha
Titlealpha

Formatters

DateFormat
NumericFormat

Hooks and Utils

cn
cva
extendTheme
parseFormData
useAsyncList
useLandmark
useListData
useTheme
VisuallyHidden
Components

SelectList

Pick one or many items from a fully visible list of rich options.

A <SelectList> lets users pick from a list where each option carries additional information beyond a label, like a description, a logo, or a per-row action. Every option stays visible so users can scan and compare without opening anything.

The trade-off is space. A <SelectList> takes more vertical room than a <Radio.Group> or a <Select>, so reach for it when the decision earns the weight: picking a payment method, comparing plans, choosing a shipping speed. For simple text choices, a lighter control reads faster.

Anatomy

A <SelectList> is a labeled container holding a stack of <SelectList.Option> rows. Each row pairs a selection indicator with a label over an optional description, and an optional trailing action.

LabelListSelection indicatorOptionText valueDescriptionAction
  • Label: Names the field above the list.
  • List: The container that holds all options.
  • Option: A single row representing one choice.
  • Selection indicator: A radio circle for single selection, or a checkbox for multiple selection.
  • Text value: The primary text of an option.
  • Description: Optional secondary text within an option that helps the user decide.
  • Action: An optional trailing button or menu for a per-row action that does not toggle the row.

Appearance

The appearance of a component can be customized using the variant and size props. These props adjust the visual style and dimensions of the component, available values are based on the active theme.

The selected theme does not has any options for"size".
Ticket category
A12€49
Standard ticket — €49
Most popular
Open seating in rows 10–25, doors open one hour before the show. Free rebooking up to 24 hours before the event.
VIP ticket — €129
Reserved seat in the first five rows, access to the VIP lounge with complimentary drinks, and a meet-and-greet with the cast after the show.
Student ticket — €29
Discounted entry for full-time students. Bring a valid student ID for entry. tickets cannot be exchanged at the door.
Press ticket
Invitation only
Reserved for accredited press. Pick up your badge at the press desk on arrival. photo ID is required.
PropertyTypeDescription
variantdefault | borderedThe available variants of this component.
size-The available sizes of this component.

<SelectList> has two variants. They handle two different framings of the same choice: rows in a continuous list, or peer cards to commit to.

VariantDescriptionWhen to use
defaultA single surface with dividers between rows.Reads as one continuous list of entries. Default choice. Scans faster on longer lists.
borderedEach row is its own outlined card with a small gap.Commit-level, peer-to-peer choices like plans, payment methods, or shipping modes. Avoid for long lists.

Usage

Hidden lists make users do invisible work. Comparing two options in a dropdown means opening it, scanning, closing it, opening it again, scanning, then deciding, all while keeping the rest of the form alive in their head. <SelectList> moves that work out of memory and into the layout: every option is on screen, so the comparison happens once and stays put. Each row also has space for one inline action, like a "View details" button or a "Configure" menu, that does not trigger selection. <Radio.Group> and <Select> can't host that.

Use <SelectList> when comparison is the point of the field, not when it is one step among many. That usually means a peer-level choice where each option is its own commitment, and getting it right matters more than moving through the form quickly.

Options as cards

The bordered variant renders each option as its own outlined card with a small gap between rows, instead of a continuous surface with dividers. Reach for it when the choice is commit-level and each option is a peer the user weighs against the others, like event spaces, subscription plans, payment methods, or shipping modes. The card framing reads as "pick one of these" more strongly than a plain list, and each card has room for a thumbnail, a title, and a short description, the same anatomy as a <Card>.

This is also the answer whenever you catch yourself wanting a grid of selectable cards. <Card> renders a non-interactive <article> for grouping content, so it has no selection, form, or keyboard support. A bordered <SelectList> keeps the card look while owning the selection state, the value the form submits, and the keyboard navigation.

Set variant="bordered" and pick a selectionMode. The example below takes the venue card grid and rebuilds it as a selectable list, laid out with orientation="horizontal" so the cards sit side by side. Each option keeps the same photo, title, and details, and now carries single selection and the value the form submits.

Event space
Main Street Park Amphitheater
Laughville, United States
Outdoor Venue
Up to 500 guests
$1,000
Shakytown Comedy Club
Shakytown, United States
Club or Lounge
Up to 300 guests
$750
Oak Ridge Barn
Hee-Haw City, Canada
Rustic or Alternative Venue
Up to 150 guests
$500
Pick the venue to book. You can change it before you confirm.

Number of options

The right control depends on list length and how much space the field can take. <SelectList> earns its space when comparing options side by side or hosting per-row actions matters. For shorter lists of plain choices, longer lists, or when space is tight, a lighter control fits better. The table below maps common situations to the control that fits.

WhenUse
Short list of plain text choices (3 to 5 items)<Radio.Group> (single) or <Checkbox.Group> (multiple)
Each option needs decision-relevant context (up to 10 items)<SelectList>
Space is limited, with or without rich rows (5 to 15 items)<Select> (single or multiple)
More than ~15 options, or users need to search<Combobox> or <TagField>

Writing options

The label, description, and order of each row decide whether the list reads at a glance or makes users work for it.

Keep labels short and concrete. Lead with the most distinctive word, since that's where the eye lands first. The description line earns its space when it differentiates options that look similar at the title level. Skip it for marketing copy, restated labels, or boilerplate that repeats on every row (like "All major cards accepted").

Be consistent. All rows should follow the same shape: either every row has a description or none of them do. Mixed-height rows break the visual rhythm and slow scanning.

Order by what users pick most often. Readers scan top to bottom (or left to right), so the most common choice belongs first. Avoid alphabetical or system-driven order: a "Bank transfer" sorted to the top alphabetically is unhelpful when most users pay by card. If options have a natural progression (free → pro → enterprise, or fastest → cheapest), follow that order instead.

Keep it accessible

When a row contains more than plain text (a wrapped label, a logo, a trailing action), pass textValue on the option. Screen readers use it as the option's accessible name.

Do

Keep labels short, lead with the most distinctive word, and order options by how often users pick them.

Don't

Don't mix one-line and two-line rows in the same list, and don't truncate labels with an ellipsis.

Multiselection

Sometimes users need to pick several options and see what they picked at a glance. A multi-select <Select> truncates as picks pile up. <SelectList> keeps every option and every checkmark on screen. That's the right trade when the selection itself matters as much as the choosing: which payment methods accept checkout traffic, which channels deliver a given notification, which features ship in a plan.

Set selectionMode="multiple" to switch the list to checkboxes.

Accepted payment methods
Credit and debit cards
Recommended
Accept Visa, Mastercard, and Amex. Includes 3-D Secure for European customers.
1.4% + €0.25
per transaction
PayPal
Customers pay with their PayPal balance, linked bank account, or saved card. Funds settle within 1 business day.
2.5% + €0.35
per transaction
Klarna — Pay later
New
Buy now and pay in 30 days, or split the order in 3 interest-free payments. Klarna takes on fraud risk.
2.99% + €0.30
per transaction
SEPA direct debit
European customers pay directly from their bank account. Funds clear in 2–3 business days.
0.8%
per transaction
Pick which methods customers see at checkout.

Per-row actions

Reach for a per-row action when a row needs context it can't carry on its own, or when the picker doubles as configuration for each item. Without it, users either commit to a choice they don't fully understand or leave the form to look something up, losing their place. Two patterns hold up: actions that help the user decide which row to pick, and actions that configure the row they're already keeping.

A per-row action sits on the trailing edge of an option, separate from the selection target. Keep it to one action per row so the row's tap target stays predictable, and group multiples inside a single <ActionMenu> rather than placing two icons side by side. Clicking the action does not toggle the row.

Decision-help

The action gives the user the context they need to commit, without leaving the form. A "View details" button on a saved card shows the billing address and expiry. A "Preview" button on an email template opens a side panel with the rendered output. A "Show on map" pin disambiguates pickup locations with similar names. The action removes the need to navigate away to make an informed choice.

In the example below, each plan pairs with a <ContextualHelp> icon. The summary on the row is enough to scan and pick. The popover covers the long tail of features, limits, and SLA without sending the user to a separate page.

Free
€0
forever
For small teams trying things out. No credit card required to get started.
  • Up to 3 projects
  • Community support
  • 1 GB storage included
Pro
Most popular
€29
per user / month
For growing teams that need priority support and advanced reporting.
  • Unlimited projects
  • Priority email support
  • 50 GB storage included
  • Custom branding and domains
Enterprise
Custom
billed annually
For organizations that need SSO, audit logs, and a 99.95% uptime SLA.
  • SSO with SAML and SCIM
  • Dedicated success manager
  • Custom data residency
  • Audit logs and access reviews

Configuration

When the picker doubles as a settings form, the row is the natural home for per-item configuration. Two examples: a payment-methods picker with a "Configure" menu per row to set fees and currencies, or a notification-channels picker with a "Customize" menu per row to set frequency and quiet hours. The form submits which items are active, the row menu configures how each behaves.

Notification channels
Email
Sent to ops@example.com · Instant · Quiet hours 9pm–7am
In-app push
Browser and desktop notifications · Instant
SMS
Text to verified phone · Critical incidents only
Slack
Posts to #incidents · Daily digest at 9am
We'll deliver incident alerts to the channels you enable. Use the menu to set per-channel rules.

When management is its own job, give it its own surface: a separate page or panel where users come to manage saved records, not to pick one for the current form.

Do

Keep it to one action per row, and group multiples inside a single action menu rather than placing icons side by side.

Don't

Don't pair management actions like Edit or Remove with form selection. Mutating the underlying record mid-form breaks the flow with confirmation dialogs or network calls.

Horizontal orientation

A vertical stack of three or four short options claims a column the form doesn't need. Flowing those options left to right keeps the whole comparison in one row, and the surface only takes the width it needs. Reach for it on peer-level choices that fit on one line, like a shipping speed at checkout, a date range on an analytics view, or a sort order on a list.

Set orientation="horizontal" to switch the layout.

Shipping speed
Standard
€4.99
3–5 business days
Express
€12.99
1–2 business days
Overnight
€24.99
Next business day
Faster options include live tracking and a signature on delivery.

A horizontally arranged list automatically flips to a vertical stack once its wrapping container is narrower than 40rem (≈640px). The flip is driven by a CSS container query on the list's own wrapper, so it reacts to the parent it is rendered into, whether a sidebar, a drawer, or a narrow card, not just the viewport width. Keyboard navigation continues to work in both axes after the flip.

Do

Use horizontal for short, peer-level choices that fit on one line, like a shipping speed or a sort order.

Don't

Don't use horizontal for long lists or rich rows that wouldn't read well stacked. Pick the orientation the content fits.

Empty state

When the collection is empty, for example because the user hasn't saved any payment methods yet, render a placeholder via the emptyState prop. A good empty state explains why the list is empty and offers a single next step.

When the list is empty because of an active filter or search, surface a "Clear filters" action so users can recover without leaving the field.

Saved payment methods

No saved payment methods yet

Add a card or bank account to charge invoices automatically. Saved methods show up here the next time you check out.
Pick a saved method or add a new one to charge this invoice.

Do

Explain why the list is empty and provide a clear next action when one exists.

Don't

Don't leave the list area blank. An empty surface gives users no signal whether the system is loading, broken, or simply empty.

Accessibility

<SelectList> is fully keyboard accessible:

  • Arrow keys move focus between options. Direction follows the layout: up/down when vertical, left/right when horizontal.
  • Space toggles the focused option.
  • Tab reaches any action inside the focused row.

This two-tier model is what lets a per-row button or menu coexist with row selection without breaking keyboard navigation.

Always give the list a label, or pass aria-labelledby when a heading nearby already names it. Without one, screen readers announce a list with no idea what it's for.

For rows with rich content like a wrapped label, a logo, or a trailing action, set textValue on the option. Screen readers use it as the option's accessible name. Without it, the announcement collapses to whatever text fragment is reachable, which is rarely the right one.

When an option carries an image, decide whether it conveys information. A decorative photo, like the venue thumbnails in the Options as cards example, takes alt="" so screen readers skip it, since the textValue already names the option. Give the image a real alt only when it says something the surrounding text does not.

Props

Did you know? You can explore, test, and customize props live in Marigold's storybook. Watch the effects they have in real-time!
View SelectList stories

SelectList

Prop

Type

Accessibility props (4)

Prop

Type

DOM event handlers (64)

Prop

Type

SelectList.Option

Prop

Type

DOM event handlers (63)

Prop

Type

Alternative components

  • Radio: Use for a small set of mutually exclusive, text-only choices where a description per option is not needed.
  • Checkbox: Use for a small set of independent boolean options where each option is a short label.
  • Select: Use when the list is long, options are single-line, and saving vertical space matters more than seeing every option at once.
  • Combobox: Use for long lists where typing narrows results faster than scanning.
  • TagField: Use for multi-select with search, where users add and remove choices as tags.
  • Table: Use when each row is a record with multiple columns of structured data, not a selectable choice.

Related

Forms

How to structure, validate, and submit forms with Marigold.

Multiple selection

Patterns and guidelines for multiple selection.

Form fields

How form fields work in Marigold.
Last update: a month ago

Select

Dropdown for selecting an option among different options.

Slider

Allows to make selections from a range of values.

© Reservix GmbH — Marigold Design System
ImpressumDatenschutzGitHubRSS

On this page

AnatomyAppearanceUsageOptions as cardsNumber of optionsWriting optionsMultiselectionPer-row actionsHorizontal orientationEmpty stateAccessibilityPropsSelectListSelectList.OptionAlternative componentsRelated