2020-07-15 21:30:37 +00:00
# Menu Item
[component-header:sl-menu-item]
Menu items provide options for the user to pick from in a menu.
```html preview
2022-03-02 15:10:41 +00:00
< sl-menu
style="max-width: 200px; border: solid 1px var(--sl-panel-border-color); background: var(--sl-panel-background-color); border-radius: var(--sl-border-radius-medium);"
>
2020-07-15 21:30:37 +00:00
< sl-menu-item > Option 1< / sl-menu-item >
< sl-menu-item > Option 2< / sl-menu-item >
< sl-menu-item > Option 3< / sl-menu-item >
2021-09-29 12:03:03 +00:00
< sl-divider > < / sl-divider >
2020-07-15 21:30:37 +00:00
< sl-menu-item checked > Checked< / sl-menu-item >
< sl-menu-item disabled > Disabled< / sl-menu-item >
2021-09-29 12:03:03 +00:00
< sl-divider > < / sl-divider >
2020-07-15 21:30:37 +00:00
< sl-menu-item >
Prefix Icon
< sl-icon slot = "prefix" name = "gift" > < / sl-icon >
< / sl-menu-item >
< sl-menu-item >
Suffix Icon
< sl-icon slot = "suffix" name = "heart" > < / sl-icon >
< / sl-menu-item >
< / sl-menu >
```
2021-11-04 22:12:47 +00:00
```jsx react
2022-03-02 15:10:41 +00:00
import { SlDivider, SlIcon, SlMenu, SlMenuItem } from '@shoelace-style/shoelace/dist/react';
2021-11-04 22:12:47 +00:00
const App = () => (
2022-03-02 15:10:41 +00:00
< SlMenu
2021-11-04 22:12:47 +00:00
style={{
maxWidth: '200px',
2021-11-18 22:41:03 +00:00
border: 'solid 1px var(--sl-panel-border-color)',
2021-11-04 22:12:47 +00:00
borderRadius: 'var(--sl-border-radius-medium)'
}}
>
< SlMenuItem > Option 1< / SlMenuItem >
< SlMenuItem > Option 2< / SlMenuItem >
< SlMenuItem > Option 3< / SlMenuItem >
< SlDivider / >
< SlMenuItem checked > Checked< / SlMenuItem >
< SlMenuItem disabled > Disabled< / SlMenuItem >
< SlDivider / >
< SlMenuItem >
Prefix Icon
< SlIcon slot = "prefix" name = "gift" / >
< / SlMenuItem >
< SlMenuItem >
Suffix Icon
< SlIcon slot = "suffix" name = "heart" / >
< / SlMenuItem >
2022-03-02 15:10:41 +00:00
< / SlMenu >
2021-11-04 22:12:47 +00:00
);
```
2021-09-29 12:33:52 +00:00
## Examples
### Checked
Use the `checked` attribute to draw menu items in a checked state.
```html preview
2022-03-02 15:10:41 +00:00
< sl-menu
style="max-width: 200px; border: solid 1px var(--sl-panel-border-color); background: var(--sl-panel-background-color); border-radius: var(--sl-border-radius-medium);"
>
2021-09-29 12:33:52 +00:00
< sl-menu-item > Option 1< / sl-menu-item >
< sl-menu-item checked > Option 2< / sl-menu-item >
< sl-menu-item > Option 3< / sl-menu-item >
< / sl-menu >
```
2021-11-04 22:12:47 +00:00
```jsx react
2022-03-02 15:10:41 +00:00
import { SlMenu, SlMenuItem } from '@shoelace-style/shoelace/dist/react';
2021-11-04 22:12:47 +00:00
const App = () => (
2022-03-02 15:10:41 +00:00
< SlMenu
2021-11-04 22:12:47 +00:00
style={{
maxWidth: '200px',
2021-11-18 22:41:03 +00:00
border: 'solid 1px var(--sl-panel-border-color)',
2021-11-04 22:12:47 +00:00
borderRadius: 'var(--sl-border-radius-medium)'
}}
>
< SlMenuItem > Option 1< / SlMenuItem >
< SlMenuItem checked > Option 2< / SlMenuItem >
< SlMenuItem > Option 3< / SlMenuItem >
2022-03-02 15:10:41 +00:00
< / SlMenu >
2021-11-04 22:12:47 +00:00
);
```
2021-09-29 12:33:52 +00:00
### Disabled
Add the `disabled` attribute to disable the menu item so it cannot be selected.
```html preview
2022-03-02 15:10:41 +00:00
< sl-menu
style="max-width: 200px; border: solid 1px var(--sl-panel-border-color); background: var(--sl-panel-background-color); border-radius: var(--sl-border-radius-medium);"
>
2021-09-29 12:33:52 +00:00
< sl-menu-item > Option 1< / sl-menu-item >
< sl-menu-item disabled > Option 2< / sl-menu-item >
< sl-menu-item > Option 3< / sl-menu-item >
< / sl-menu >
```
2021-11-04 22:12:47 +00:00
```jsx react
2022-03-02 15:10:41 +00:00
import { SlMenu, SlMenuItem } from '@shoelace-style/shoelace/dist/react';
2021-11-04 22:12:47 +00:00
const App = () => (
2022-03-02 15:10:41 +00:00
< SlMenu
2021-11-04 22:12:47 +00:00
style={{
maxWidth: '200px',
2021-11-18 22:41:03 +00:00
border: 'solid 1px var(--sl-panel-border-color)',
2021-11-04 22:12:47 +00:00
borderRadius: 'var(--sl-border-radius-medium)'
}}
>
< SlMenuItem > Option 1< / SlMenuItem >
< SlMenuItem disabled > Option 2< / SlMenuItem >
< SlMenuItem > Option 3< / SlMenuItem >
2022-03-02 15:10:41 +00:00
< / SlMenu >
2021-11-04 22:12:47 +00:00
);
```
2021-09-29 12:33:52 +00:00
### Prefix & Suffix
Add content to the start and end of menu items using the `prefix` and `suffix` slots.
```html preview
2022-03-02 15:10:41 +00:00
< sl-menu
style="max-width: 200px; border: solid 1px var(--sl-panel-border-color); background: var(--sl-panel-background-color); border-radius: var(--sl-border-radius-medium);"
>
2021-09-29 12:33:52 +00:00
< sl-menu-item >
< sl-icon slot = "prefix" name = "house" > < / sl-icon >
Home
< / sl-menu-item >
< sl-menu-item >
< sl-icon slot = "prefix" name = "envelope" > < / sl-icon >
Messages
2021-12-13 22:38:40 +00:00
< sl-badge slot = "suffix" variant = "primary" pill > 12< / sl-badge >
2021-09-29 12:33:52 +00:00
< / sl-menu-item >
< sl-divider > < / sl-divider >
< sl-menu-item >
< sl-icon slot = "prefix" name = "gear" > < / sl-icon >
Settings
< / sl-menu-item >
< / sl-menu >
```
2021-11-04 22:12:47 +00:00
```jsx react
2022-03-02 15:10:41 +00:00
import { SlBadge, SlDivider, SlIcon, SlMenu, SlMenuItem } from '@shoelace-style/shoelace/dist/react';
2021-11-04 22:12:47 +00:00
const App = () => (
2022-03-02 15:10:41 +00:00
< SlMenu
2021-11-04 22:12:47 +00:00
style={{
maxWidth: '200px',
2021-11-18 22:41:03 +00:00
border: 'solid 1px var(--sl-panel-border-color)',
2021-11-04 22:12:47 +00:00
borderRadius: 'var(--sl-border-radius-medium)'
}}
>
< SlMenuItem >
< SlIcon slot = "prefix" name = "house" / >
Home
< / SlMenuItem >
< SlMenuItem >
< SlIcon slot = "prefix" name = "envelope" / >
Messages
2022-03-02 15:10:41 +00:00
< SlBadge slot = "suffix" variant = "primary" pill >
12
< / SlBadge >
2021-11-04 22:12:47 +00:00
< / SlMenuItem >
< SlDivider / >
< SlMenuItem >
< SlIcon slot = "prefix" name = "gear" / >
Settings
< / SlMenuItem >
2022-03-02 15:10:41 +00:00
< / SlMenu >
2021-11-04 22:12:47 +00:00
);
```
2021-09-29 12:33:52 +00:00
### Value & Selection
The `value` attribute can be used to assign a hidden value, such as a unique identifier, to a menu item. When an item is selected, the `sl-select` event will be emitted and a reference to the item will be available at `event.detail.item` . You can use this reference to access the selected item's value, its checked state, and more.
```html preview
2022-03-02 15:10:41 +00:00
< sl-menu
class="menu-value"
style="max-width: 200px; border: solid 1px var(--sl-panel-border-color); background: var(--sl-panel-background-color); border-radius: var(--sl-border-radius-medium);"
>
2021-09-29 12:33:52 +00:00
< sl-menu-item value = "opt-1" > Option 1< / sl-menu-item >
< sl-menu-item value = "opt-2" > Option 2< / sl-menu-item >
< sl-menu-item value = "opt-3" > Option 3< / sl-menu-item >
< / sl-menu >
< script >
const menu = document.querySelector('.menu-value');
menu.addEventListener('sl-select', event => {
const item = event.detail.item;
// Toggle checked state
item.checked = !item.checked;
// Log value
console.log(`Selected value: ${item.value}`);
});
< / script >
```
2021-11-04 22:12:47 +00:00
```jsx react
2022-03-02 15:10:41 +00:00
import { SlMenu, SlMenuItem } from '@shoelace-style/shoelace/dist/react';
2021-11-04 22:12:47 +00:00
const App = () => {
function handleSelect(event) {
const item = event.detail.item;
// Toggle checked state
item.checked = !item.checked;
// Log value
console.log(`Selected value: ${item.value}`);
}
return (
2022-03-02 15:10:41 +00:00
< SlMenu
2021-11-04 22:12:47 +00:00
style={{
maxWidth: '200px',
2021-11-18 22:41:03 +00:00
border: 'solid 1px var(--sl-panel-border-color)',
2021-11-04 22:12:47 +00:00
borderRadius: 'var(--sl-border-radius-medium)'
}}
onSlSelect={handleSelect}
>
< SlMenuItem value = "opt-1" > Option 1< / SlMenuItem >
< SlMenuItem value = "opt-2" > Option 2< / SlMenuItem >
< SlMenuItem value = "opt-3" > Option 3< / SlMenuItem >
< / SlMenu >
);
};
```
2020-07-15 21:30:37 +00:00
[component-metadata:sl-menu-item]