Skip to main content
The ButtonGroup component provides a set of mutually exclusive options displayed as buttons or tabs. Only one option can be selected at a time.

Basic Usage

<ButtonGroup name="timeframe">
  <ButtonGroupItem value="day" valueLabel="Daily" />
  <ButtonGroupItem value="week" valueLabel="Weekly" />
  <ButtonGroupItem value="month" valueLabel="Monthly" />
</ButtonGroup>

Props

name
string
required
Unique identifier for the input. Used to reference the selected value using {inputs.name}
title
string
Label displayed above the button group
data
Query
Query result to populate button options. When provided, requires value and label props.
value
string
Column name from query to use as the button value. Required when using data prop.
label
string
Column name from query to use as the button label. Required when using data prop.
order
string
SQL ORDER BY clause to sort buttons
<ButtonGroup name="priority" data={priorities} value="id" label="name" order="name ASC" />
where
string
SQL WHERE clause to filter button options
defaultValue
string
Initial value to select
<ButtonGroup name="view" defaultValue="grid">
  <ButtonGroupItem value="list" valueLabel="List" />
  <ButtonGroupItem value="grid" valueLabel="Grid" />
</ButtonGroup>
preset
'dates'
Use a predefined set of options. Currently supports "dates" preset with values: “1 day”, “1 week”, “1 month”, “3 months”, “1 year”, “all”
<ButtonGroup name="period" preset="dates" />
display
'buttons' | 'tabs'
default:"buttons"
Visual style of the button group
  • buttons: Compact button group with border
  • tabs: Larger tab-style buttons with spacing
color
string
default:"hsla(207, 65%, 39%, 1)"
Color for the active button state (accepts any CSS color value)
description
string
Help text displayed as an info icon next to the title
hideDuringPrint
boolean
default:"true"
Whether to hide the button group when printing

Static Options

<ButtonGroup name="chartType" title="Chart Type">
  <ButtonGroupItem value="bar" valueLabel="Bar Chart" />
  <ButtonGroupItem value="line" valueLabel="Line Chart" />
  <ButtonGroupItem value="area" valueLabel="Area Chart" />
</ButtonGroup>

Query-Based Options

<script>
  const statuses = Query.create(`
    SELECT 
      status_code as value,
      status_name as label
    FROM order_statuses
    ORDER BY display_order
  `);
</script>

<ButtonGroup 
  name="orderStatus"
  data={statuses}
  value="value"
  label="label"
  title="Filter by Status"
/>

Display Styles

Button Style (Default)

<ButtonGroup name="view" display="buttons">
  <ButtonGroupItem value="table" valueLabel="Table" />
  <ButtonGroupItem value="chart" valueLabel="Chart" />
</ButtonGroup>

Tab Style

<ButtonGroup name="tab" display="tabs">
  <ButtonGroupItem value="overview" valueLabel="Overview" />
  <ButtonGroupItem value="details" valueLabel="Details" />
  <ButtonGroupItem value="history" valueLabel="History" />
</ButtonGroup>

Using Presets

The dates preset provides common time period options:
<ButtonGroup name="timePeriod" preset="dates" title="Time Period" />
This creates buttons for: 1 day, 1 week, 1 month, 3 months, 1 year, and all time.

Using Selected Values

Access the selected value in queries:
SELECT * 
FROM sales 
WHERE date >= current_date - INTERVAL {inputs.timePeriod}

Input Store Structure

The selected value is stored directly:
// Single value (e.g., "week")
inputs.timeframe // "week"

// Can be used directly in queries
// WHERE period = {inputs.timeframe}

Examples

Chart Type Switcher

<ButtonGroup name="chartType" title="Visualization">
  <ButtonGroupItem value="bar" valueLabel="Bar" />
  <ButtonGroupItem value="line" valueLabel="Line" />
  <ButtonGroupItem value="scatter" valueLabel="Scatter" />
</ButtonGroup>

{#if inputs.chartType === 'bar'}
  <BarChart data={salesData} />
{:else if inputs.chartType === 'line'}
  <LineChart data={salesData} />
{:else}
  <ScatterPlot data={salesData} />
{/if}

Time Period Filter

<ButtonGroup name="period" preset="dates" defaultValue="1 month" />

```sql time_filtered_sales
SELECT 
  date,
  SUM(amount) as total
FROM sales
WHERE date >= current_date - INTERVAL {inputs.period}
GROUP BY date
ORDER BY date

### Mixed Static and Query Options

```svelte
<script>
  const categories = Query.create(`SELECT DISTINCT category FROM products`);
</script>

<ButtonGroup name="filter" data={categories} value="category">
  <ButtonGroupItem value="all" valueLabel="All Categories" />
</ButtonGroup>

Custom Styling

<ButtonGroup 
  name="status"
  display="tabs"
  color="#10b981"
  title="Order Status"
>
  <ButtonGroupItem value="pending" valueLabel="Pending" />
  <ButtonGroupItem value="shipped" valueLabel="Shipped" />
  <ButtonGroupItem value="delivered" valueLabel="Delivered" />
</ButtonGroup>

Build docs developers (and LLMs) love