本文へスキップ
Material 3 Expressivev1.3.0-rc.1
アクション · 準拠済み

ButtonGroup

ButtonGroupButtonGroupProps

Button groups

Arbitrary children arranged in a row. Press one to see it grow and its neighbors compress, reading each child's own native :active state via CSS :has() -- no JavaScript layout measurement.

playground/examples/ButtonGroup.example.tsx

ButtonGroupはButton、IconButtonなどのインタラクティブな子要素を横一列に並べます。子要素を押すと、その要素が視覚的に大きくなり、隣接する要素が縮小します。これはMaterial 3 Expressiveの「押下をきっかけとした隣接要素の圧縮」インタラクションです。

import { Button, ButtonGroup } from '@language-lit/material3-expressive'
import '@language-lit/material3-expressive/styles.css'

<ButtonGroup aria-label="Text formatting">
  <Button variant="tonal">Bold</Button>
  <Button variant="tonal">Italic</Button>
  <Button variant="tonal">Underline</Button>
</ButtonGroup>

仕様

  • childrenは指定どおりflex行に直接描画され、仕様に沿ったBetweenSpaceの間隔が適用されます。データ配列で項目を指定するAPIはありません。通常使うButtonやIconButtonなどのインタラクティブ要素を渡してください。
  • 既定のroleは"group"です。"toolbar"などを明示して上書きできます。aria-labelまたはaria-labelledbyでグループ全体に名前を付けます。子要素はそれぞれのアクセシブルな名前とネイティブのTab順を保ちます。
  • 対応するのは標準の行レイアウトです。連結された単一選択または複数選択のボタン行には、代わりにSegmentedButtonGroupを使います。
  • 項目が収まらないときに自動でドロップダウンメニューへ切り替える機能はありません。必要に応じてflex-wrapや独自のレスポンシブ処理を使ってください。

トークンと境界

間隔と押下時の圧縮率はすべて、Material3Providerでスコープされる--m3e-comp-button-group-* CSSカスタムプロパティから取得します。ButtonGroupは実行時スタイルを挿入せず、requestAnimationFrameループも使いません。圧縮動作はCSSのtransform: scale()で実現します。:has()を通じて各子要素自身のネイティブな:active状態を参照し、JavaScriptによるレイアウト計測は行いません。