Menu

1.5.6

El componente Menu permite agrupar un conjunto de acciones o navegaciones en un listado desplegable, en ocaciones activado desde un botón o ícono. Es fundamental para presentar opciones de manera organizada, evitando el ruido visual y manteniendo la interfaz limpia. Favorece la accesibilidad a funciones secundarias sin comprometer la jerarquía visual del contenido principal.

import React from "react";
import { Menu } from "@nimbus-ds/patterns";
import { Badge, Box, Icon, IconButton, Tag, Text } from "@nimbus-ds/components";
import {
  TiendanubeIcon,
  ExternalLinkIcon,
  HomeIcon,
  StatsIcon,
  CashIcon,
  TagIcon,
  UserIcon,
  DiscountCircleIcon,
  ToolsIcon,
  AppsIcon,
  EcosystemIcon,
  CogIcon,
} from "@nimbus-ds/icons";

const Example: React.FC = () => (
  <Menu>
    <Menu.Header>
      <Box display="flex" gap="2" alignItems="center" width="100%">
        <Icon
          color="neutral-textHigh"
          source={<TiendanubeIcon size="medium" />}
        />
        <Box display="inline-flex" flex="1">
          <Text fontSize="base" color="neutral-textHigh" fontWeight="bold">
            Tienda demo
          </Text>
        </Box>
        <IconButton source={<ExternalLinkIcon />} size="2rem" />
      </Box>
    </Menu.Header>
    <Menu.Body>
      <Menu.Section>
        <Menu.Button startIcon={HomeIcon} label="Inicio" />
        <Menu.Button startIcon={StatsIcon} label="Estadísticas" />
      </Menu.Section>
      <Menu.Section title="Administrar">
        <Menu.ButtonAccordion
          controlled
          contentId="content-1"
          menuButton={{
            id: "control-1",
            startIcon: CashIcon,
            label: "Ventas",
            children: <Badge appearance="primary" count="1299" />,
            "aria-controls": "content-1",
          }}
        >
          <Menu.Button label="Lista de ventas" active />
          <Menu.Button label="Exportar lista" />
        </Menu.ButtonAccordion>
        <Menu.Button startIcon={TagIcon} label="Productos" />
        <Menu.Button startIcon={UserIcon} label="Clientes">
          <Tag appearance="primary">¡Nuevo!</Tag>
        </Menu.Button>
        <Menu.Button startIcon={DiscountCircleIcon} label="Marketing" />
      </Menu.Section>
      <Menu.Section title="Personalizar">
        <Menu.Button startIcon={ToolsIcon} label="Mi Tiendanube" />
      </Menu.Section>
      <Menu.Section title="Potenciar">
        <Menu.Button startIcon={AppsIcon} label="Mis aplicaciones" />
        <Menu.Button startIcon={EcosystemIcon} label="Canales de venta" />
      </Menu.Section>
    </Menu.Body>
    <Menu.Footer label="Configuración" startIcon={CogIcon} />
  </Menu>
);

export default Example;

Instalá el componente via terminal.

npm install @nimbus-ds/menu

Menu

Utilizar Menu cuando sea necesario:

  • Mostrar acciones relacionadas con una función (ej. configuración, canales de venta).
  • Agrupar accesos secundarios que no requieren protagonismo constante.
  • Guiar al usuario sobre el mapa de navegación del sistema o un flujo de configuracion.

Evitar usar el Menu en estos casos:

  • Cuando hay menos de dos acciones disponibles. Mostralas directamente.
  • Para acciones principales o críticas. Estas deben estar visibles sin interacción adicional.
  • En flujos donde cada opción requiere explicación o contexto extenso.
  • En flujos donde se requieran navegar de manera secuencial (pasos) ese caso usar Accordion o Stepper según sea el caso.
  • Acceso rápido a funciones: Reduce el número de clics y mantiene el foco en el contenido principal.
  • Optimiza el uso del espacio: Presenta acciones solo cuando se requieren, evitando sobrecargar la interfaz.
  • Agrupación lógica: Las acciones agrupadas reducen la carga cognitiva y simplifican la toma de decisiones.

Para garantizar una experiencia inclusiva:

  • Soporte total para navegación con teclado (Tab, Shift+Tab, flechas).
  • Roles ARIA apropiados: menu, menuitem.
  • Labels claros y visibles para lectores de pantalla.
  • Estados de foco visibles y claros.
  • Áreas táctiles adecuadas en dispositivos mobiles (mínimo 44x44px).
  • No depender del color como único indicador de estado.

El Menu incluye:

  1. Activator: Botón o ícono que dispara el menú.
  2. Container
  3. Logo
  4. Menu buttons: Opciones del menú con iconos opcionales.
  5. Separadores: Para agrupar acciones por contexto.
  6. Label: Nombre de la categorias de accesos
  • MenuButton
  • Icon
  • Tooltip
  • List item
  • Default: Menu sin contenedor
  • Fixed menu: Menu fijo ubicado a la izquierda de la interfaz.
  • Drawer menu: Menu anclado dentro de un Side Modal. Se dispara desde un tigger

Do

  • Ordenar las acciones de más a menos utilizadas.
  • Cerrar el menú al hacer clic fuera o tras seleccionar una opción.
  • Desplegar acciones secundarias al hacer click sobre acción principal

Don't

  • No ocultar acciones importantes que deberían ser visibles permanentemente.
  • No usar solo íconos sin etiquetas (falla de accesibilidad).
  • En menu contextuales en tooltip no sobrecargar el menú con más de 7 ítems.
  • No permitir acciones destructivas sin confirmación contextual.

Additional props are passed to the <Menu> element. See div docs for a list of props accepted by the <Menu> element.

Menu

NameTypeDefaultDescription

children*

React.ReactNode

Content of the menu.

Menu.Section

NameTypeDefaultDescription

title

string

Optional title of the section.

children*

React.ReactNode

Content of the menu section.

Menu.Header

NameTypeDefaultDescription

children*

React.ReactNode

Content of the menu header.

Menu.Body

NameTypeDefaultDescription

children*

React.ReactNode

Content of the menu body.

Menu.Footer

NameTypeDefaultDescription

active

boolean

Sets the state of the button as active/inactive.

label*

string

Text label for the button.

onClick

() => void;

Function executed when clicking the button.

startIcon

React.FC<IconProps>

Sets an icon element on the left of the button.