FabMenu

A Fab that opens a stack of actions - extended pills, each a FabMenuItem - from one corner of a page.

A Fab that opens a stack of actions - extended pills, each a FabMenuItem - from one corner of a page. The trigger is a disclosure button (aria-expanded, aria-controls) whose icon turns to a close one while the menu is open. The actions zoom in over theme.transitions, the one next to the trigger first, and are out of the tree while it is closed. Where it floats is the page's: no position is built in.

import { FabMenu, FabMenuItem } from '@soroush.tech/design-system/FabMenu'

;<FabMenu aria-label="Create">
  <FabMenuItem icon={<Icon name="add" color="inherit" />} onClick={newDocument}>
    New document
  </FabMenuItem>
  <FabMenuItem onClick={newFolder}>New folder</FabMenuItem>
</FabMenu>

Examples

Default

const args: Partial<FabMenuProps> = { 'aria-label': 'Create' }

<Corner>
  <FabMenu {...args}>{actions}</FabMenu>
</Corner>

Extended

const args: Partial<FabMenuProps> = { label: 'Create' }

<Corner>
  <FabMenu {...args}>{actions}</FabMenu>
</Corner>

Down

const args: Partial<FabMenuProps> = { direction: 'down', align: 'start', 'aria-label': 'Create' }

<Flex flexDirection="row" alignItems="flex-start" width="22rem" minHeight="16rem">
  <FabMenu {...args}>{actions}</FabMenu>
</Flex>

Open

const args: Partial<FabMenuProps> = { 'aria-label': 'Create' }

<Corner>
  <FabMenu {...args} defaultOpen>
    {actions}
  </FabMenu>
</Corner>

Colors

const args: Partial<FabMenuProps> = { 'aria-label': 'Create', defaultOpen: true }

<Corner>
  <FabMenu {...args}>
    <FabMenuItem icon={add}>Secondary</FabMenuItem>
    <FabMenuItem icon={add} color="success">
      Success
    </FabMenuItem>
    <FabMenuItem icon={add} color="error">
      Error
    </FabMenuItem>
    <FabMenuItem icon={add} disabled>
      Off
    </FabMenuItem>
  </FabMenu>
</Corner>

Corners

const args: Partial<FabMenuProps> = { 'aria-label': 'Create' }

<CornersDemo {...args} axis="column" />

Corners Sideways

const args: Partial<FabMenuProps> = { 'aria-label': 'Create' }

<CornersDemo {...args} axis="row" />

Sideways

const args: Partial<FabMenuProps> = { 'aria-label': 'Create' }

<Flex flexDirection="column" gap={6} alignItems="center" width="32rem">
  <Flex flexDirection="row" justifyContent="flex-end" width="100%">
    <FabMenu {...args} direction="left" defaultOpen>
      {actions}
    </FabMenu>
  </Flex>
  <Flex flexDirection="row" justifyContent="flex-start" width="100%">
    <FabMenu {...args} direction="right" defaultOpen>
      {actions}
    </FabMenu>
  </Flex>
</Flex>

Controlled

Nothing yet
const args: Partial<FabMenuProps> = { 'aria-label': 'Create' }

<ControlledDemo {...args} />