Security News
Research
Data Theft Repackaged: A Case Study in Malicious Wrapper Packages on npm
The Socket Research Team breaks down a malicious wrapper package that uses obfuscation to harvest credentials and exfiltrate sensitive data.
@leafygreen-ui/menu
Advanced tools
yarn add @leafygreen-ui/menu
npm install @leafygreen-ui/menu
Package | Version |
---|---|
@leafygreen-ui/leafygreen-provider | ^1.1.0 |
import { Menu, MenuSeparator, MenuItem } from '@leafygreen-ui/menu';
// Trigger as an HTML Element
<Menu align="bottom" justify="start" trigger={<button>trigger</button>}>
<MenuItem active>Active Menu Item</MenuItem>
<MenuItem
disabled={boolean('Disabled', true)}
description="I am a description"
>
Disabled Menu Item
</MenuItem>
<MenuItem description="I am also a description">
Menu Item With Description
</MenuItem>
<MenuItem href="http://mongodb.design">I am a link!</MenuItem>
</Menu>;
// Trigger as a function
<Menu
align="bottom"
justify="start"
trigger={({ onClick, children }) => (
<button onClick={onClick}>
Example Trigger
{children}
</button>
)}
>
<MenuItem>Menu Item 1</MenuItem>
<MenuItem>Menu Item 2</MenuItem>
<MenuItem>Menu Item 3</MenuItem>
</Menu>;
Output HTML
<!-- Trigger as an HTML Element -->
<button>
trigger
<div class="leafygreen-ui-1hyfx7x"></div>
</button>
<div class="leafygreen-ui-19z0mfw">
<ul class="leafygreen-ui-1guv7w9" role="menu">
<li role="none">
<button
data-leafygreen-ui="menu-item-container"
class="leafygreen-ui-19xfwtd"
role="menuitem"
aria-disabled="false"
>
<div class="leafygreen-ui-14a8fex">Active Menu Item</div>
</button>
</li>
<li role="none">
<button
data-leafygreen-ui="menu-item-container"
class="leafygreen-ui-7pgwa0"
role="menuitem"
aria-disabled="true"
tabindex="-1"
>
<div class="leafygreen-ui-10xqyru">Disabled Menu Item</div>
<div class="leafygreen-ui-17sf9go">I am a description</div>
</button>
</li>
<li role="none">
<button
data-leafygreen-ui="menu-item-container"
class="leafygreen-ui-1sk3xcx"
role="menuitem"
aria-disabled="false"
>
<div class="leafygreen-ui-r0sqyc">Menu Item With Description</div>
<div class="leafygreen-ui-1dm36mc">I am also a description</div>
</button>
</li>
<li role="none">
<a
data-leafygreen-ui="menu-item-container"
target="_blank"
rel="noopener noreferrer"
class="leafygreen-ui-1sk3xcx"
role="menuitem"
aria-disabled="false"
href="http://mongodb.design"
><div class="leafygreen-ui-r0sqyc">I am a link!</div></a
>
</li>
</ul>
</div>
<!-- Trigger as a function -->
<button>
Example Trigger
<div class="leafygreen-ui-1hyfx7x"></div>
</button>
<div class="leafygreen-ui-1td4qre">
<ul class="leafygreen-ui-1guv7w9" role="menu">
<li role="none">
<button
data-leafygreen-ui="menu-item-container"
class="leafygreen-ui-1sk3xcx"
role="menuitem"
aria-disabled="false"
>
<div class="leafygreen-ui-r0sqyc">Menu Item 1</div>
</button>
</li>
<li role="none">
<button
data-leafygreen-ui="menu-item-container"
class="leafygreen-ui-1sk3xcx"
role="menuitem"
aria-disabled="false"
>
<div class="leafygreen-ui-r0sqyc">Menu Item 2</div>
</button>
</li>
<li role="none">
<button
data-leafygreen-ui="menu-item-container"
class="leafygreen-ui-1sk3xcx"
role="menuitem"
aria-disabled="false"
>
<div class="leafygreen-ui-r0sqyc">Menu Item 3</div>
</button>
</li>
</ul>
</div>
We recommend using Menu
with NextJS's links components in the following pattern:
import NextLink from 'next/link';
function CustomLink({ href, children, ...props }) {
return (
<NextLink href={href}>
<a {...props}>
{children}
</a>
</NextLink>
);
}
<Menu trigger={<button onClick={handleClick}>trigger</button>} open={open}>
<MenuItem as={CustomLink} href="/test">
Test
</MenuItem>
<SubMenu
title="Submenu"
href="http://mongodb.design"
>
<MenuItem>SubMenu Item 1</MenuItem>
<MenuItem as={CustomLink} href="/test-2">
SubMenu Item 2
</MenuItem>
</SubMenu>
</Menu>
This pattern is recommended given the SubMenu
component expects to pass styling through the className
prop, which would not apply correctly if it was passed to NextLink
.
In other words, defining a MenuItem
as:
<MenuItem as={CustomLink} href="/test-2">
SubMenu Item 2
</MenuItem>
would render, but without the correct styles.
Prop | Type | Description | Default |
---|---|---|---|
open | boolean | Determines whether or not the <Menu /> will appear as open or closed | false |
setOpen | function | When controlling the component, use setOpen to keep track of the <Menu /> component's state so that clicks on the document's backdrop as well as a user pressing the Escape Key will close the Menu and update the consuming application's local state accordingly. | |
initialOpen | boolean | Passes an initial value for "open" to an uncontrolled menu | false |
shouldClose | function | Determines if the Menu should close when the backdrop or Escape keys are clicked. Defaults to true. | () => true |
align | 'top' , 'bottom' , 'left' , 'right' | Determines the alignment of the <Menu /> component relative to a reference element, or the element's nearest parent | 'bottom' |
justify | 'start' , 'middle' , 'end' | Determines the justification of the Menu component (based on the alignment) relative to a reference element or the element's nearest parent | 'end' |
refEl | HTMLElement | Pass a reference to an element that the Menu component should be positioned against | |
trigger | function , React.ReactNode | A ReactNode against which the Menu will be positioned. The trigger prop can also support being passed a function. To work as expected, the function must accept an argument of children , which should be rendered inside of the function passed to trigger. | |
adjustOnMutation | boolean | Determines whether or not the <Menu/> should reposition itself based on changes to trigger or reference element position. | false |
renderMode | 'inline' | 'portal' | 'top-layer' | Options to render the popover element * [deprecated] 'inline' will render the popover element inline in the DOM where it's written * [deprecated] 'portal' will render the popover element in a new div appended to the body. Alternatively, can be portaled into a provided portalContainer * 'top-layer' will render the popover element in the top layer | 'top-layer' |
portalContainer (deprecated) | HTMLElement , null | Sets the container used for the popover's portal. | |
scrollContainer (deprecated) | HTMLElement , null | If the popover portal has a scrollable ancestor other than the window, this prop allows passing a reference to that lement to allow the portal to position properly. | |
portalClassName (deprecated) | string | Passes the given className to the popover's portal container if the default portal container is being used. | |
popoverZIndex (deprecated) | number | Sets the z-index CSS property for the popover. | |
darkMode | boolean | Determines whether or not the component will be rendered in dark theme. |
Any other properties will be spread on the Menu ul
container
Prop | Type | Description | Default |
---|---|---|---|
href | string | If supplied, will render the <MenuItem /> inside of an <a> tag, rather than a <button> tag | |
children | node | Content to appear inside of <MenuItem /> component | |
className | string | Classname applied to li element | |
onClick | function | Function that will be called when a <MenuItem /> is clicked | |
active | boolean | Determines if the <MenuItem /> is active | false |
disabled | boolean | Determines if the <MenuItem /> is disabled | false |
description | node | Content to appear below main text of the <MenuItem /> | |
as | React.ElementType | Determines what the <MenuItem /> will be rendered as | |
size | default , large | Size of the <MenuItem /> component | 'default' |
glyph | React.ReactElement | Slot to pass in an Icon rendered to the left of <MenuItem /> text. | |
variant | 'default', 'destructive' | Determines variant of <MenuItem /> component | 'default' |
... | native attributes of component passed to as prop | Any other props will be spread on the root element |
Prop | Type | Description | Default |
---|---|---|---|
open | boolean | Determines if <SubMenu /> item appears open | false |
setOpen | function | Function to set the value of open in <SubMenu /> | |
className | string | className applied to SubMenu root element | |
description | string , React.ReactElement | Content to appear below main text of SubMenu | |
active | boolean | Determines if <SubMenu /> appears active | false |
disabled | boolean | Determines if <SubMenu /> appears disabled | false |
glyph | React.ReactElement | Slot to pass in an Icon rendered to the left of <SubMenu /> text. | |
title | string | Main text rendered in <SubMenu /> | |
href | string | If supplied, will render the <SubMenu /> inside of an <a> tag, rather than a <button> tag | |
spacing | number | Distance between the content rendered inside of the Menu and the trigger | 15 |
... | native anchor or button attributes | Any other props will be spread on the root element |
FAQs
LeafyGreen UI Kit Menu
The npm package @leafygreen-ui/menu receives a total of 43,702 weekly downloads. As such, @leafygreen-ui/menu popularity was classified as popular.
We found that @leafygreen-ui/menu demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 0 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Research
The Socket Research Team breaks down a malicious wrapper package that uses obfuscation to harvest credentials and exfiltrate sensitive data.
Research
Security News
Attackers used a malicious npm package typosquatting a popular ESLint plugin to steal sensitive data, execute commands, and exploit developer systems.
Security News
The Ultralytics' PyPI Package was compromised four times in one weekend through GitHub Actions cache poisoning and failure to rotate previously compromised API tokens.