Dropdown
Componente de menu dropdown para exibir ações e opções.
Importação
Seção intitulada “Importação”import { Dropdown } from 'asterui'Exemplos
Seção intitulada “Exemplos”Dropdown Básico
Menu dropdown simples com itens usando padrão composto.
import { Dropdown, Button } from 'asterui'
function App() {
return (
<Dropdown>
<Dropdown.Trigger>
<Button color="primary">Actions</Button>
</Dropdown.Trigger>
<Dropdown.Menu>
<Dropdown.Item>Edit</Dropdown.Item>
<Dropdown.Item>Duplicate</Dropdown.Item>
<Dropdown.Item>Delete</Dropdown.Item>
</Dropdown.Menu>
</Dropdown>
)
}
export default App Orientado a Dados (prop menu)
Defina itens de menu via prop menu em vez de componentes compostos.
import { Dropdown, Button } from 'asterui'
import { PencilIcon, DocumentDuplicateIcon, TrashIcon } from '@aster-ui/icons'
function App() {
const menuItems = [
{ key: 'edit', label: 'Edit', icon: <PencilIcon size="sm" /> },
{ key: 'duplicate', label: 'Duplicate', icon: <DocumentDuplicateIcon size="sm" /> },
{ type: 'divider' as const },
{ key: 'delete', label: 'Delete', danger: true, icon: <TrashIcon size="sm" /> },
]
return (
<Dropdown menu={{ items: menuItems }}>
<Dropdown.Trigger>
<Button color="primary">Data-Driven</Button>
</Dropdown.Trigger>
</Dropdown>
)
}
export default App Posicionamento
Menu dropdown pode ser posicionado em diferentes direções.
import { Dropdown, Button, Space } from 'asterui'
function App() {
return (
<Space direction="horizontal" size="sm" wrap>
<Dropdown placement="top">
<Dropdown.Trigger>
<Button>Top</Button>
</Dropdown.Trigger>
<Dropdown.Menu>
<Dropdown.Item>Option 1</Dropdown.Item>
<Dropdown.Item>Option 2</Dropdown.Item>
<Dropdown.Item>Option 3</Dropdown.Item>
</Dropdown.Menu>
</Dropdown>
<Dropdown placement="bottom">
<Dropdown.Trigger>
<Button>Bottom</Button>
</Dropdown.Trigger>
<Dropdown.Menu>
<Dropdown.Item>Option 1</Dropdown.Item>
<Dropdown.Item>Option 2</Dropdown.Item>
<Dropdown.Item>Option 3</Dropdown.Item>
</Dropdown.Menu>
</Dropdown>
<Dropdown placement="left">
<Dropdown.Trigger>
<Button>Left</Button>
</Dropdown.Trigger>
<Dropdown.Menu>
<Dropdown.Item>Option 1</Dropdown.Item>
<Dropdown.Item>Option 2</Dropdown.Item>
<Dropdown.Item>Option 3</Dropdown.Item>
</Dropdown.Menu>
</Dropdown>
<Dropdown placement="right">
<Dropdown.Trigger>
<Button>Right</Button>
</Dropdown.Trigger>
<Dropdown.Menu>
<Dropdown.Item>Option 1</Dropdown.Item>
<Dropdown.Item>Option 2</Dropdown.Item>
<Dropdown.Item>Option 3</Dropdown.Item>
</Dropdown.Menu>
</Dropdown>
</Space>
)
}
export default App Modos de Acionamento
Controle como o dropdown abre: clique, hover ou ambos.
import { Dropdown, Button, Space } from 'asterui'
function App() {
return (
<Space direction="horizontal" size="sm" wrap>
<Dropdown trigger={['click']}>
<Dropdown.Trigger>
<Button>Click</Button>
</Dropdown.Trigger>
<Dropdown.Menu>
<Dropdown.Item>Option 1</Dropdown.Item>
<Dropdown.Item>Option 2</Dropdown.Item>
</Dropdown.Menu>
</Dropdown>
<Dropdown trigger={['hover']}>
<Dropdown.Trigger>
<Button>Hover</Button>
</Dropdown.Trigger>
<Dropdown.Menu>
<Dropdown.Item>Option 1</Dropdown.Item>
<Dropdown.Item>Option 2</Dropdown.Item>
</Dropdown.Menu>
</Dropdown>
</Space>
)
}
export default App Com Ícones
Itens de menu com ícones para melhor contexto visual.
import { Dropdown, Button } from 'asterui'
import { PencilIcon, DocumentDuplicateIcon, TrashIcon } from '@aster-ui/icons'
function App() {
return (
<Dropdown>
<Dropdown.Trigger>
<Button color="primary">Options</Button>
</Dropdown.Trigger>
<Dropdown.Menu>
<Dropdown.Item icon={<PencilIcon size="sm" />}>Edit</Dropdown.Item>
<Dropdown.Item icon={<DocumentDuplicateIcon size="sm" />}>Duplicate</Dropdown.Item>
<Dropdown.Item icon={<TrashIcon size="sm" />}>Delete</Dropdown.Item>
</Dropdown.Menu>
</Dropdown>
)
}
export default App Com Divisor
Separe seções do menu com divisores.
import { Dropdown, Button } from 'asterui'
function App() {
return (
<Dropdown>
<Dropdown.Trigger>
<Button>Account</Button>
</Dropdown.Trigger>
<Dropdown.Menu>
<Dropdown.Item>Profile</Dropdown.Item>
<Dropdown.Item>Settings</Dropdown.Item>
<Dropdown.Divider />
<Dropdown.Item>Help</Dropdown.Item>
<Dropdown.Item danger>Sign out</Dropdown.Item>
</Dropdown.Menu>
</Dropdown>
)
}
export default App Estados do Item
Itens podem estar ativos, desabilitados ou estilizados como perigo.
import { Dropdown, Button } from 'asterui'
function App() {
return (
<Dropdown>
<Dropdown.Trigger>
<Button>States</Button>
</Dropdown.Trigger>
<Dropdown.Menu>
<Dropdown.Item active>Active Item</Dropdown.Item>
<Dropdown.Item>Normal Item</Dropdown.Item>
<Dropdown.Item disabled>Disabled Item</Dropdown.Item>
<Dropdown.Divider />
<Dropdown.Item danger>Delete Account</Dropdown.Item>
</Dropdown.Menu>
</Dropdown>
)
}
export default App Alinhamento
Alinhe o menu dropdown ao início, centro ou fim.
import { Dropdown, Button, Space } from 'asterui'
function App() {
return (
<Space direction="horizontal" size="sm" wrap>
<Dropdown placement="bottomLeft">
<Dropdown.Trigger>
<Button>Bottom Left</Button>
</Dropdown.Trigger>
<Dropdown.Menu>
<Dropdown.Item>Option 1</Dropdown.Item>
<Dropdown.Item>Option 2</Dropdown.Item>
</Dropdown.Menu>
</Dropdown>
<Dropdown placement="bottom">
<Dropdown.Trigger>
<Button>Bottom Center</Button>
</Dropdown.Trigger>
<Dropdown.Menu>
<Dropdown.Item>Option 1</Dropdown.Item>
<Dropdown.Item>Option 2</Dropdown.Item>
</Dropdown.Menu>
</Dropdown>
<Dropdown placement="bottomRight">
<Dropdown.Trigger>
<Button>Bottom Right</Button>
</Dropdown.Trigger>
<Dropdown.Menu>
<Dropdown.Item>Option 1</Dropdown.Item>
<Dropdown.Item>Option 2</Dropdown.Item>
</Dropdown.Menu>
</Dropdown>
</Space>
)
}
export default App Menu de Contexto
Abra dropdown com clique direito usando acionamento contextMenu.
import { Dropdown, Typography } from 'asterui'
import { PencilIcon, DocumentDuplicateIcon, TrashIcon } from '@aster-ui/icons'
function App() {
return (
<Dropdown trigger={['contextMenu']}>
<Dropdown.Trigger>
<div className="p-8 border-2 border-dashed border-base-300 rounded-lg text-center cursor-context-menu">
<Typography.Text type="secondary">Right-click here</Typography.Text>
</div>
</Dropdown.Trigger>
<Dropdown.Menu>
<Dropdown.Item icon={<PencilIcon size="sm" />}>Edit</Dropdown.Item>
<Dropdown.Item icon={<DocumentDuplicateIcon size="sm" />}>Copy</Dropdown.Item>
<Dropdown.Divider />
<Dropdown.Item icon={<TrashIcon size="sm" />} danger>Delete</Dropdown.Item>
</Dropdown.Menu>
</Dropdown>
)
}
export default App Com Submenu
Submenus aninhados para opções hierárquicas.
import { Dropdown, Button } from 'asterui'
import { PencilIcon, FolderIcon, Cog6ToothIcon } from '@aster-ui/icons'
function App() {
return (
<Dropdown>
<Dropdown.Trigger>
<Button>With Submenu</Button>
</Dropdown.Trigger>
<Dropdown.Menu>
<Dropdown.Item icon={<PencilIcon size="sm" />}>Edit</Dropdown.Item>
<Dropdown.SubMenu title="More Options" icon={<FolderIcon size="sm" />}>
<Dropdown.Item>Option A</Dropdown.Item>
<Dropdown.Item>Option B</Dropdown.Item>
<Dropdown.Item>Option C</Dropdown.Item>
</Dropdown.SubMenu>
<Dropdown.SubMenu title="Settings" icon={<Cog6ToothIcon size="sm" />}>
<Dropdown.Item>Preferences</Dropdown.Item>
<Dropdown.Item>Account</Dropdown.Item>
</Dropdown.SubMenu>
<Dropdown.Divider />
<Dropdown.Item danger>Delete</Dropdown.Item>
</Dropdown.Menu>
</Dropdown>
)
}
export default App Botão Compacto com Dropdown
Combine um botão com um menu dropdown usando Join para uma aparência compacta de botão dividido. O botão é automaticamente tratado como acionador sem precisar do wrapper Dropdown.Trigger. Abre ao passar o mouse automaticamente.
import { Dropdown, Button, Join } from 'asterui'
import { UserIcon } from '@aster-ui/icons'
function App() {
const menuItems = [
{ key: 'profile', label: 'Profile' },
{ key: 'settings', label: 'Settings' },
{ type: 'divider' as const },
{ key: 'logout', label: 'Sign out', danger: true },
]
return (
<Join>
<Button color="primary">Actions</Button>
<Dropdown menu={{ items: menuItems }} placement="bottomRight">
<Button color="primary" icon={<UserIcon />} />
</Dropdown>
</Join>
)
}
export default App Dropdown de Ícone Compacto
Botão dropdown apenas com ícone unido a outro botão usando a API simplificada (não precisa de wrapper Dropdown.Trigger). Abre ao passar o mouse para acesso rápido.
import { Dropdown, Button, Join } from 'asterui'
import { EllipsisVerticalIcon } from '@aster-ui/icons'
function App() {
return (
<Join>
<Button>Save</Button>
<Dropdown placement="bottomRight">
<Button icon={<EllipsisVerticalIcon />} />
<Dropdown.Menu>
<Dropdown.Item>Save and Close</Dropdown.Item>
<Dropdown.Item>Save as Draft</Dropdown.Item>
<Dropdown.Divider />
<Dropdown.Item>Discard</Dropdown.Item>
</Dropdown.Menu>
</Dropdown>
</Join>
)
}
export default App Dropdown
Seção intitulada “Dropdown”| Propriedade | Descrição | Tipo | Padrão |
|---|---|---|---|
children | Elemento acionador e conteúdo dropdown (padrão composto) | React.ReactNode | - |
menu | Configuração do menu (padrão orientado a dados) | { items: DropdownMenuItemType[], onClick?: (info: { key: string; keyPath: string[] }) => void } | - |
trigger | Modo(s) de acionamento para dropdown | ('click' | 'hover' | 'contextMenu')[] | ['hover'] |
placement | Posicionamento do menu dropdown | 'top' | 'topLeft' | 'topRight' | 'bottom' | 'bottomLeft' | 'bottomRight' | 'left' | 'right' | 'bottomLeft' |
open | Estado aberto controlado | boolean | - |
onOpenChange | Callback quando estado aberto muda | (open: boolean, info?: { source }) => void | - |
disabled | Desabilitar o dropdown | boolean | false |
arrow | Mostrar seta apontando para o acionador | boolean | { pointAtCenter?: boolean } | false |
autoAdjustOverflow | Ajustar automaticamente o posicionamento do dropdown quando estiver fora da tela | boolean | true |
mouseEnterDelay | Atraso antes de mostrar ao passar o mouse (segundos) | number | 0.15 |
mouseLeaveDelay | Atraso antes de esconder ao sair o mouse (segundos) | number | 0.1 |
destroyOnHidden | Destruir dropdown quando oculto | boolean | false |
popupRender | Personalizar conteúdo do popup | (menu: ReactNode) => ReactNode | - |
data-testid | Prefixo de ID de teste para elementos filhos | string | - |
className | Classes CSS adicionais | string | - |
Dropdown.Item
Seção intitulada “Dropdown.Item”| Propriedade | Descrição | Tipo | Padrão |
|---|---|---|---|
key | Chave única para o item (prop key do React) | string | - |
children | Conteúdo do item | React.ReactNode | - |
label | Rótulo do item (alternativa a children) | React.ReactNode | - |
icon | Ícone a exibir antes do rótulo | React.ReactNode | - |
onClick | Manipulador de clique | () => void | - |
active | Estado ativo/selecionado | boolean | false |
disabled | Desabilitar o item | boolean | false |
danger | Estilo de perigo/destrutivo | boolean | false |
className | Classes CSS adicionais | string | - |
Dropdown.SubMenu
Seção intitulada “Dropdown.SubMenu”| Propriedade | Descrição | Tipo | Padrão |
|---|---|---|---|
key | Chave única para o submenu (prop key do React) | string | - |
children | Itens do submenu | React.ReactNode | - |
title | Título/rótulo do submenu | React.ReactNode | - |
icon | Ícone a exibir antes do título | React.ReactNode | - |
disabled | Desabilitar o submenu | boolean | false |
Acessibilidade
Seção intitulada “Acessibilidade”- Navegação por teclado com teclas
Enter,SpaceeEscape - Teclas de seta para navegar pelos itens do menu
- Atributos ARIA apropriados para leitores de tela
- Gerenciamento de foco ao abrir e fechar o menu
- Comportamento de fechar ao clicar fora