ナビゲーション · 準拠済み
FabMenu
FabMenuFabMenuPropsFabMenuItemFabMenuItemProps
import { useState } from 'react'
import { FabMenu, FabMenuItem, Icon, Surface, Text } from '@language-lit/material3-expressive'
export function FabMenuExample() {
const [open, setOpen] = useState(false)
return (
<Surface
as="section"
aria-labelledby="fab-menu-example-title"
color="surface-container-low"
shape="extra-large"
className="fab-menu-example"
>
<Text as="h2" id="fab-menu-example-title" variant="titleLarge" emphasis="emphasized">
FAB menu
</Text>
<Text as="p" variant="bodyMedium">
Click the trigger to morph it into a close button and reveal a
staggered column of items, closest-to-trigger first.
</Text>
<div className="fab-menu-example__row">
<FabMenu
triggerLabel="Create"
icon={<Icon source="add" />}
closeIcon={<Icon source="close" />}
expanded={open}
onExpandedChange={setOpen}
>
<FabMenuItem icon={<Icon source="edit" />} onClick={() => setOpen(false)}>
Edit
</FabMenuItem>
<FabMenuItem icon={<Icon source="share" />} onClick={() => setOpen(false)}>
Share
</FabMenuItem>
<FabMenuItem icon={<Icon source="delete" />} onClick={() => setOpen(false)}>
Delete
</FabMenuItem>
<FabMenuItem onClick={() => setOpen(false)}>Archive</FabMenuItem>
<FabMenuItem icon={<Icon source="lock" />} disabled>
Restricted
</FabMenuItem>
</FabMenu>
</div>
</Surface>
)
}FabMenuはトリガーとなるFABのシェイプ、色、アイコンサイズを切り替えながら、その上にFabMenuItemを順番に表示します。
import { FabMenu, FabMenuItem } from '@language-lit/material3-expressive'
import '@language-lit/material3-expressive/styles.css'
<FabMenu
triggerLabel="Create"
icon={<AddIcon />}
closeIcon={<CloseIcon />}
expanded={open}
onExpandedChange={setOpen}
>
<FabMenuItem icon={<EditIcon />} onClick={edit}>
Edit
</FabMenuItem>
<FabMenuItem icon={<ShareIcon />} onClick={share}>
Share
</FabMenuItem>
</FabMenu>仕様
triggerLabel(トリガーのアクセシブルな名前)、icon(閉じた状態で表示)、closeIcon(展開時に表示)は必須です。expanded/defaultExpanded/onExpandedChangeは、IconButtonのselected/onSelectedChangeと同じ制御/非制御のトグル契約です。childrenにはFabMenuItemを渡します。各項目はicon、ラベルとなるchildren、onClick、disabledを受け取ります。閉じた状態の項目はinertになり、表示遷移のためDOMに残りながら、アクセシビリティツリーとTab順から除外されます。- トリガーは
aria-expanded、aria-haspopup="true"、aria-controlsを公開します。展開中のトリガーにフォーカスがある状態でArrowDown(またはTab)を押すと、最初の項目にフォーカスが移ります。 - メニューを実際のナビゲーションやアクションにつなぐ処理は、各
FabMenuItemのonClickに委ねられます。FabMenuは前述のdisclosureパターンを超えて、ルーティングやoverlay/menuの意味を管理しません。
トークンと境界
色、形状、モーション時間はすべて、Material3Providerでスコープされる--m3e-comp-fab-menu-* CSSカスタムプロパティから取得します。FabMenuは実行時スタイルもrequestAnimationFrameループも使いません。トリガーの閉じた状態と展開状態の変化、および各項目の順次表示はCSSトランジションで実現します。