User menu
Menú de usuario · components/menus/user-menu
El menú de la cuenta detrás del avatar en la cabecera: una cabecera compacta con nombre, plan y correo, un grupo corto de destinos (Perfil, Configuración, Facturación), el selector de tema claro / oscuro / sistema adentro y "Cerrar sesión" en rojo. El panel crece desde el avatar con un resorte y las filas entran en ola; un solo resaltado sigue al puntero y al teclado deslizándose de fila en fila, y el pulgar del selector de tema se desliza entre los íconos. Elegir tema o estado deja el menú abierto; todo lo demás lo cierra y devuelve el foco al botón. Si cerrar sesión tarda, el ítem muestra un spinner y "Cerrando sesión…" hasta que termina. En pantallas angostas se abre como hoja desde abajo, arrastrable para cerrar.
Por qué entró
El desplegable con el formato y las opciones claras, el cambio de tonalidad del tema adentro y el cerrar sesión en otro color.
Sirve para
- menú de la cuenta en la cabecera de todas las apps
- cambiar el tema
- cerrar sesión
- mostrar el estado de presencia (disponible, ocupado, ausente) y cambiarlo sin salir del menú
No sirve para
- Listas de comandos genéricas: ahí va un menú desplegable común
- Un interruptor de tema suelto, fuera del menú de la cuenta
Origen: Arc UI, porteado a nuestro stack y traducido. La licencia del sitio no está declarada: se usa en nuestras apps, no se publica.
Cómo se usa
import { UserMenu } from '@/components/ui/user-menu/UserMenu'
import { CreditCard, Settings, User } from 'lucide-react'
<UserMenu
user={{ name: 'Emma Collins', email: 'emma@example.com', plan: 'Pro', avatarSrc: '/avatares/emma.jpg' }}
items={[
{ label: 'Perfil', icon: <User size={16} />, keys: ['⌘', 'P'], onSelect: () => router.push('/perfil') },
{ label: 'Configuración', icon: <Settings size={16} />, keys: ['⌘', ','], onSelect: () => router.push('/configuracion') },
{ label: 'Facturación', icon: <CreditCard size={16} />, onSelect: () => router.push('/facturacion') },
]}
theme={tema}
onThemeChange={setTema}
onSignOut={cerrarSesion}
signOutKeys={['⇧', '⌘', 'Q']}
showName
/>
user:name,emaily opcionalesplan(la pastilla al lado del nombre),avatarSrcyavatarSrcSet. Sin foto muestra las iniciales.items: destinos de la cuenta, cada uno conlabel,icon,onSelectykeys(el atajo como pista visual, p. ej.['⌘', 'P']; el atajo lo ata tu app). Tres o cuatro, no más.theme/defaultTheme/onThemeChange:light,darkosystem. El menú avisa la elección; aplicarla a la página es cosa de la app.showTheme={false}lo saca.status/defaultStatus/onStatusChange:available,busyoaway. Con cualquiera de los tres aparece el punto de presencia sobre el avatar y el selector de estado adentro.onSignOut: si devuelve una promesa, el ítem muestra el progreso y el menú se cierra al terminar.signOutKeyses la pista del atajo.showNamemuestra el nombre y un chevron al lado del avatar (no en pantallas angostas).align:start,centeroend(por defecto) respecto del botón.open/defaultOpen/onOpenChangepara controlarlo desde afuera.portal={false}deja el panel adentro del contenedor del botón en vez de sobre el body.sheetBelow: ancho en px por debajo del cual se abre como hoja desde abajo (640 por defecto;0lo desactiva).- Teclado: flechas arriba y abajo recorren las filas, izquierda y derecha eligen dentro del
selector de tema o de estado, Inicio y Fin saltan a los extremos, escribir salta a la fila
que empiece con eso, Escape y Tab cierran y devuelven el foco. Con
prefers-reduced-motiontodo cambia sin animación.
Qué toma de tu app
Fondo del panel, bordes, textos, la pastilla del plan y el resaltado salen de los tokens
--ui-*; el resaltado y la pastilla son el acento al 12 %. "Cerrar sesión" y el estado
"ocupado" son rojos, "ausente" naranja y "disponible" verde: semánticos, con el matiz fijo
y la luz y saturación del acento. Las duraciones salen de --ui-dur y --ui-ease.
Necesita motion y lucide-react.
Details
- Source
- Arc UI · Not declared
- Added
- October 2, 2026 · francovassallo
- Tags
- menuusuariocuentadropdowntemacerrar-sesioncabecera
- Tokens used
--ui-accent--ui-ink-muted--ui-dur--ui-ease--ui-ink--ui-line--ui-surface--ui-radius-lg--ui-ink-soft--ui-surface-2--ui-font-text- Dependencies
lucide-reactmotion- Used in
- campus