Menu

1.7.0

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.

Las propiedades adicionales se pasan al elemento <Menu>. Consultá la documentación para ver la lista de atributos aceptados por el elemento <Menu>.

Menu

NameTypeDefaultDescription

children*

React.ReactNode

Content of the menu.

expanded

boolean

Whether the menu should render in expanded mode. If `undefined`, it follows `MenuExpandContext` value. If provided, it overrides the context.

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.

expanded

boolean

Controlled override for menu expansion state. This prop does not manage internal state and is not forwarded to the DOM as an attribute. It is used only for layout and visual state determination. If not provided, the expanded state will be determined by the context.

onClick

() => void;

Function executed when clicking the button.

startIcon

React.FC<IconProps>

Sets an icon element on the left of the button.