Caroa UI

Segmented Control

少数の選択肢から1つを選ぶボタンの列。選んでいる印が次の選択肢へ滑って移る。

インポート

import { SegmentedControl } from '@caroainc/ui-components/client'

個別サブパス(バンドルサイズを抑えたい場合):

import { SegmentedControl } from '@caroainc/ui-components/segmented-control'

基本的な使い方

選択肢が2〜5個ほどで、全部を並べて見せたいときに使います。選び直すと、選んでいる印(白い面)が次の選択肢へ滑って少し弾んで止まります。最初の表示や画面幅の変化では動きません。

Loading...
const [parking, setParking] = useState('unknown')

<SegmentedControl
  aria-label="駐車場"
  value={parking}
  onValueChange={setParking}
  options={[
    { value: 'unknown', label: '不明' },
    { value: 'yes', label: 'あり' },
    { value: 'no', label: 'なし' },
  ]}
/>

弾み方

bounceで、印が移るときの弾み方を選びます。noneは弾まずに減速して止まります。動きを減らす設定(prefers-reduced-motion)の利用者には、どの値でも動かさずに切り替えます。

Loading...
<SegmentedControl bounce="none" ... />
<SegmentedControl bounce="subtle" ... /> {/* 既定 */}
<SegmentedControl bounce="medium" ... />
<SegmentedControl bounce="strong" ... />

サイズ

Loading...
<SegmentedControl size="sm" ... />
<SegmentedControl ... /> {/* default */}

無効状態

Loading...
<SegmentedControl options={[{ value: 'standing', label: '立ち歩き', disabled: true }, ...]} />
<SegmentedControl disabled ... />

使い分け

  • 選択肢が多い・長い場合はSelectかCommandComboboxを使う(幅が足りないと折り返して並ぶ)
  • 表示する内容(パネル)を切り替える場合はTabsを使う(見た目は似ているが、Tabsは「表示の切り替え」、SegmentedControlは「値を選ぶ」)
  • 中身はラジオボタン(RadioGroupと同じRadixの部品)。選択肢に説明文を付けて縦に並べたい場合はRadioGroupを使う
  • キーボードは矢印キーで前後の選択肢へ移り、そのまま選ぶ(ラジオボタンと同じ操作)

Props

PropTypeDefaultDescription
options{ value: string; label: ReactNode; disabled?: boolean }[]-選択肢(必須)
valuestring-選んでいる値(制御コンポーネント)
defaultValuestring-初期値(非制御コンポーネント)
onValueChange(value: string) => void-選び直したときのコールバック。同じ選択肢を押しても呼ばない
bounce'none' | 'subtle' | 'medium' | 'strong''subtle'印が移るときの弾み方
size'sm' | 'default''default'選択肢の高さと左右の余白
disabledbooleanfalseすべての選択肢を無効にする
aria-labelstring-グループの名前(読み上げ用)。見出しと結び付ける場合はaria-labelledby