enes

Menu

Menu es un componente para mostrar una lista de acciones u opciones en un formato desplegable. Se puede usar en varios contextos, como navegación, configuración o menús contextuales.

Este componente se basa en la biblioteca Floating UI para el posicionamiento. Proporciona una API flexible para crear estructuras de menú complejas, incluidos menús anidados, elementos seleccionables y elementos deshabilitados.

Para crear un menú, necesitarás usar los siguientes componentes:

  • Menu: El componente raíz que crea todo el estado y proporciona contexto a sus elementos hijos.
  • MenuTrigger: Maneja toda la lógica del elemento activador que abre el menú. Usa un patrón de render prop para proporcionar las propiedades y el estado necesarios al elemento activador.
  • ContextMenuTrigger: Una variante de MenuTrigger diseñada para usarse en menús contextuales. Adjunta el menú a un elemento especificado y se abre con clic derecho.
  • MenuPopover: El contenedor del contenido del menú. Maneja el posicionamiento y la accesibilidad del menú.
  • MenuList: Un contenedor para la lista de elementos del menú.
  • MenuItem: Representa un único elemento del menú. Puede ser una acción simple o un activador para un menú anidado.
  • SplitButton or Button: El elemento activador del menú.

Otros componentes que se pueden usar dentro del menú incluyen:

  • MenuGroup: Un contenedor para agrupar elementos relacionados del menú, con un encabezado opcional.
  • MenuDivider: Un separador visual entre elementos o grupos del menú.
  • MenuItemCheckbox: Un elemento del menú que se puede marcar o desmarcar.
  • MenuItemSwitch: Un elemento del menú que se puede activar o desactivar.
  • MenuItemRadio: Un elemento del menú que se puede seleccionar como parte de un grupo de opciones de radio.

Para adjuntar correctamente los eventos al elemento activador, debes envolver el elemento con el children() snippet . Esto te permite vincular las propiedades y el estado necesarios a tu elemento activador, asegurando que el menú se abra y se cierre como se espera.

<script>
	import { Button, Menu, MenuTrigger, MenuPopover, MenuList, MenuGroup, MenuItem, MenuDivider } from 'fluentui-svelte';
</script>

<Menu>
	<MenuTrigger>
		{#snippet children({ state, menuTriggerProps })}
			<Button bind:ref={state.ref} {...menuTriggerProps}>Open Menu</Button>
		{/snippet}
	</MenuTrigger>
	<MenuPopover>
		<MenuList>
			<MenuGroup header="Group 1">
				<MenuItem>Item 1</MenuItem>
				<MenuItem>Item 2</MenuItem>
			</MenuGroup>
			<MenuDivider />
			<MenuGroup header="Group 2">
				<MenuItem>Item 3</MenuItem>
				<MenuItem>Item 4</MenuItem>
			</MenuGroup>
		</MenuList>
	</MenuPopover>
</Menu>
<Menu hasCheckmarks hasIcons {checkedValues} onCheckedValueChange={(e, value) => (checkedValues = value)}>
	<MenuTrigger>
		{#snippet children({ state, menuTriggerProps })}
			<Button isMenuButton bind:ref={state.ref} {...menuTriggerProps}>
				<AccessTimeRegular /> Open Menu
			</Button>
		{/snippet}
	</MenuTrigger>
	<MenuPopover>
		<MenuList>
			<MenuItem subText="An explanation here">Item With Subtext</MenuItem>
			<MenuDivider />
			<MenuItem disabled>I'm Disabled</MenuItem>
			<MenuItemCheckbox name="item4" value="item4" icon={AccessTimeRegular}>I'm a checkbox</MenuItemCheckbox>
			<MenuItemSwitch>I'm a switch</MenuItemSwitch>
			<MenuItemRadio name="item6" value="item6" icon={AccessTimeRegular}>I'm a radio</MenuItemRadio>
		</MenuList>
	</MenuPopover>
</Menu>
<Menu>
	<MenuTrigger>
		{#snippet children({ state, menuTriggerProps, primaryButtonProps })}
			<SplitButton
				bind:menuTriggerRef={state.ref}
				{menuTriggerProps}
				primaryButtonProps={{ onclick: () => alert('Primary action'), ...primaryButtonProps }}
			>
				Primary Action
			</SplitButton>
		{/snippet}
	</MenuTrigger>
	<MenuPopover>
		<MenuList>
			<MenuItem>Item 1</MenuItem>
			<MenuItem>Item 2</MenuItem>
		</MenuList>
	</MenuPopover>
</Menu>

Esta variante del componente MenuTrigger te permite crear menús contextuales que se abren con clic derecho. Puedes especificar el elemento al que debe adjuntarse el menú contextual usando la propiedad ref . Si no se proporciona ningún elemento, se adjuntará a document.body de forma predeterminada.

Right click anywhere in this box to open the context menu.
NameTypeDescription
checkedValuesRecord<string, string[]>Objeto similar a un mapa de valores marcados, indexado por el nombre del grupo.
onCheckedValueChange(e: Event, checkedValues: Record<string, string[]>) => voidCallback que se ejecuta cuando cambian los valores marcados.
hasCheckmarksbooleanIndica que los elementos del menú pueden contener elementos seleccionables y reservar espacio para la alineación.
hasIconsbooleanIndica que los elementos del menú pueden contener iconos y reservar espacio para la alineación.
openingDelaynumberEl retraso en milisegundos antes de abrir un submenú al pasar el cursor. El valor predeterminado es 0.
openbooleanControla el estado abierto del menú.
onOpenChange(e: Event, open: boolean) => voidCallback que se ejecuta cuando cambia el estado abierto del menú.
openOnHoverbooleanSi es true, el menú se abrirá al pasar el cursor sobre el activador.
persistOnItemActivationbooleanSi es true, el menú no se cerrará cuando se active un elemento del menú.
positionConfigPartial<ComputePositionConfig>Configuración para el posicionamiento de Floating UI. Se pasará a MenuPopover.
NameTypeDescription
shaperounded | circular | squareLa forma del elemento activador. El valor predeterminado es 'rounded'.
iconSnippet | ComponentUn icono opcional para mostrar en el elemento activador.
disabledbooleanSi es true, el elemento activador estará deshabilitado.
NameTypeDescription
iconSnippet | ComponentUn icono opcional para mostrar en el elemento del menú.
subTextstringSubtexto opcional para mostrar debajo del contenido principal del elemento del menú.
secondaryContentstringContenido secundario opcional para mostrar como texto de ayuda.
hrefstringSi se proporciona, el elemento del menú se renderizará como un elemento ancla.
disabledbooleanSi es true, el elemento del menú estará deshabilitado.
onClick(e: Event) => voidCallback que se ejecuta cuando se hace clic en el elemento del menú.
NameTypeDescription
All MenuItem propsTodas las propiedades del componente MenuItem son compatibles.
valuestringEl valor del elemento de casilla. Esto es obligatorio para que el elemento pueda marcarse.
checkedbooleanControla el estado marcado del elemento de casilla. (Bindable)
namestringEl nombre del elemento de casilla, usado para agrupar casillas relacionadas.
NameTypeDescription
headerstringTexto de encabezado opcional para mostrar encima del grupo.