Aller au contenu

Menu

Composant de menu de navigation pour afficher des éléments de navigation hiérarchiques.

import { Menu } from 'asterui'

Menu basique

Menu vertical simple avec éléments sélectionnables.

import { Menu } from 'asterui'
import { useState } from 'react'

function App() {
  const [selected, setSelected] = useState('dashboard')
  
  return (
      <Menu selectedKeys={[selected]} onSelect={setSelected}>
        <Menu.Item key="dashboard">Dashboard</Menu.Item>
        <Menu.Item key="projects">Projects</Menu.Item>
        <Menu.Item key="team">Team</Menu.Item>
        <Menu.Item key="settings">Settings</Menu.Item>
      </Menu>
    )
}

export default App

Menu horizontal

Menu affiché horizontalement.

import { Menu } from 'asterui'
import { useState } from 'react'

function App() {
  const [selected, setSelected] = useState('home')
  
  return (
      <Menu mode="horizontal" selectedKeys={[selected]} onSelect={setSelected}>
        <Menu.Item key="home">Home</Menu.Item>
        <Menu.Item key="about">About</Menu.Item>
        <Menu.Item key="services">Services</Menu.Item>
        <Menu.Item key="contact">Contact</Menu.Item>
      </Menu>
    )
}

export default App

Avec icônes

Éléments de menu avec icônes pour un meilleur contexte visuel.

import { Menu } from 'asterui'
import { HomeIcon, FolderIcon, UsersIcon, Cog6ToothIcon } from '@aster-ui/icons'
import { useState } from 'react'

function App() {
  const [selected, setSelected] = useState('dashboard')
  
  return (
      <Menu selectedKeys={[selected]} onSelect={setSelected}>
        <Menu.Item key="dashboard" icon={<HomeIcon />}>
          Dashboard
        </Menu.Item>
        <Menu.Item key="projects" icon={<FolderIcon />}>
          Projects
        </Menu.Item>
        <Menu.Item key="team" icon={<UsersIcon />}>
          Team
        </Menu.Item>
        <Menu.Item key="settings" icon={<Cog6ToothIcon />}>
          Settings
        </Menu.Item>
      </Menu>
    )
}

export default App

Avec sous-menu

Menu avec sous-menus imbriqués.

import { Menu } from 'asterui'
import { useState } from 'react'

function App() {
  const [selected, setSelected] = useState('dashboard')
  
  return (
      <Menu selectedKeys={[selected]} onSelect={setSelected} defaultOpenKeys={['projects']}>
        <Menu.Item key="dashboard">Dashboard</Menu.Item>
        <Menu.SubMenu key="projects" label="Projects">
          <Menu.Item key="active">Active Projects</Menu.Item>
          <Menu.Item key="archived">Archived</Menu.Item>
          <Menu.Item key="templates">Templates</Menu.Item>
        </Menu.SubMenu>
        <Menu.SubMenu key="team" label="Team">
          <Menu.Item key="members">Members</Menu.Item>
          <Menu.Item key="roles">Roles</Menu.Item>
          <Menu.Item key="permissions">Permissions</Menu.Item>
        </Menu.SubMenu>
        <Menu.Divider />
        <Menu.Title>Admin</Menu.Title>
        <Menu.Item key="admin-settings">Settings</Menu.Item>
        <Menu.Item key="billing">Billing</Menu.Item>
      </Menu>
    )
}

export default App

Tailles

Menu en différentes tailles.

import { Menu, Space } from 'asterui'

function App() {
  return (
      <Space direction="horizontal" size="lg" wrap>
        <div>
          <div className="text-sm font-semibold mb-2">Extra Small</div>
          <Menu size="xs" defaultSelectedKeys={['dashboard']}>
            <Menu.Item key="dashboard">Dashboard</Menu.Item>
            <Menu.Item key="projects">Projects</Menu.Item>
            <Menu.Item key="team">Team</Menu.Item>
          </Menu>
        </div>
  
        <div>
          <div className="text-sm font-semibold mb-2">Small</div>
          <Menu size="sm" defaultSelectedKeys={['dashboard']}>
            <Menu.Item key="dashboard">Dashboard</Menu.Item>
            <Menu.Item key="projects">Projects</Menu.Item>
            <Menu.Item key="team">Team</Menu.Item>
          </Menu>
        </div>
  
        <div>
          <div className="text-sm font-semibold mb-2">Medium</div>
          <Menu size="md" defaultSelectedKeys={['dashboard']}>
            <Menu.Item key="dashboard">Dashboard</Menu.Item>
            <Menu.Item key="projects">Projects</Menu.Item>
            <Menu.Item key="team">Team</Menu.Item>
          </Menu>
        </div>
  
        <div>
          <div className="text-sm font-semibold mb-2">Large</div>
          <Menu size="lg" defaultSelectedKeys={['dashboard']}>
            <Menu.Item key="dashboard">Dashboard</Menu.Item>
            <Menu.Item key="projects">Projects</Menu.Item>
            <Menu.Item key="team">Team</Menu.Item>
          </Menu>
        </div>
      </Space>
    )
}

export default App

Modèle piloté par les données

Utilisez la prop items pour les menus pilotés par les données.

import { Menu, notification } from 'asterui'
import { HomeIcon, FolderIcon, Cog6ToothIcon } from '@aster-ui/icons'
import { useState } from 'react'

function App() {
  const [selected, setSelected] = useState('dashboard')
  
  const items = [
    { key: 'dashboard', label: 'Dashboard', icon: <HomeIcon /> },
    { key: 'projects', label: 'Projects', icon: <FolderIcon />, children: [
      { key: 'active', label: 'Active Projects' },
      { key: 'archived', label: 'Archived' },
    ]},
    { key: 'divider1', divider: true },
    { key: 'admin', label: 'Admin', title: true },
    { key: 'settings', label: 'Settings', icon: <Cog6ToothIcon /> },
  ]
  
  return (
      <Menu
        items={items}
        selectedKeys={[selected]}
        onSelect={(key) => {
          setSelected(key)
          notification.info({ message: `Selected: ${key}` })
        }}
      />
    )
}

export default App
PropriétéDescriptionTypePar défaut
childrenÉléments de menu (modèle composé)React.ReactNode-
itemsÉléments de menu (modèle piloté par les données)MenuItem[]-
modeMode d’affichage du menu'vertical' | 'horizontal' | 'inline''vertical'
sizeTaille du menu'xs' | 'sm' | 'md' | 'lg' | 'xl'-
selectedKeysClés d’éléments sélectionnés contrôléesstring[]-
defaultSelectedKeysClés sélectionnées par défaut (non contrôlées)string[][]
openKeysClés de sous-menu ouvertes contrôléesstring[]-
defaultOpenKeysClés de sous-menu ouvertes par défaut (non contrôlées)string[][]
onSelectCallback lorsqu’un élément est sélectionné(key: string) => void-
onOpenChangeCallback lorsque l’état d’ouverture du sous-menu change(openKeys: string[]) => void-
classNameClasses CSS supplémentairesstring-
PropriétéDescriptionTypePar défaut
keyIdentifiant uniquestring-
labelÉtiquette de l’élémentReact.ReactNode-
iconÉlément icôneReact.ReactNode-
disabledIndique si l’élément est désactivébooleanfalse
childrenÉléments de sous-menuMenuItem[]-
dividerRendre comme diviseurbooleanfalse
titleRendre comme titre de sectionbooleanfalse
PropriétéDescriptionTypePar défaut
keyClé unique pour la sélection (prop key React)string-
childrenContenu de l’élémentReact.ReactNode-
iconÉlément icôneReact.ReactNode-
disabledIndique si l’élément est désactivébooleanfalse
onClickGestionnaire de clic() => void-
classNameClasses CSS supplémentairesstring-
PropriétéDescriptionTypePar défaut
keyClé unique pour l’état d’ouverture (prop key React)string-
labelÉtiquette du sous-menuReact.ReactNode-
iconÉlément icôneReact.ReactNode-
disabledIndique si le sous-menu est désactivébooleanfalse
childrenÉléments du sous-menuReact.ReactNode-
classNameClasses CSS supplémentairesstring-
PropriétéDescriptionTypePar défaut
childrenContenu du titreReact.ReactNode-
classNameClasses CSS supplémentairesstring-
PropriétéDescriptionTypePar défaut
classNameClasses CSS supplémentairesstring-
  • Utilise des modèles de navigation sémantiques avec des attributs ARIA appropriés
  • Support de la navigation au clavier avec les touches fléchées pour traverser le menu
  • Les éléments sélectionnés sont correctement marqués pour les lecteurs d’écran
  • Les états d’ouverture/fermeture des sous-menus sont communiqués aux technologies d’assistance
  • Les éléments de menu désactivés sont correctement marqués et non focalisables
  • Les états de focus sont visibles pour la navigation au clavier