アクション · 準拠済み
ButtonGroup
ButtonGroupButtonGroupProps
import { Button, ButtonGroup, Icon, IconButton, Surface, Text } from '@language-lit/material3-expressive'
export function ButtonGroupExample() {
return (
<Surface
as="section"
aria-labelledby="button-group-example-title"
color="surface-container-low"
shape="extra-large"
className="button-group-example"
>
<Text as="h2" id="button-group-example-title" variant="titleLarge" emphasis="emphasized">
Button groups
</Text>
<Text as="p" variant="bodyMedium">
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.
</Text>
<div className="button-group-example__row">
<ButtonGroup aria-label="Text formatting">
<IconButton aria-label="Bold" variant="tonal">
<Icon source="format_bold" />
</IconButton>
<IconButton aria-label="Italic" variant="tonal">
<Icon source="format_italic" />
</IconButton>
<IconButton aria-label="Underline" variant="tonal">
<Icon source="format_underlined" />
</IconButton>
</ButtonGroup>
</div>
<div className="button-group-example__row">
<ButtonGroup aria-label="Actions">
<Button variant="outlined">One</Button>
<Button variant="outlined">Two</Button>
<Button variant="outlined">Three</Button>
<Button variant="outlined">Four</Button>
</ButtonGroup>
</div>
</Surface>
)
}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によるレイアウト計測は行いません。