react-circular-menu
Version:
Circle menu component for React.
261 lines (171 loc) • 6.69 kB
Markdown
# React Circular Menu
[](https://www.npmjs.com/package/react-circular-menu)
[](https://www.npmjs.com/package/react-circular-menu)
Circle based menu component for React with custom angle range and any number of menu items.
Demo: [https://9inpachi.github.io/react-circular-menu](https://9inpachi.github.io/react-circular-menu)
<div align="center">
<img alt="React Circular Menu" title="React Circular Menu Example" src="https://user-images.githubusercontent.com/36920441/158416612-b9765cd1-334b-4d45-8d12-b64aa1c759de.gif">
</div>
## Table of Contents
- [Setup](#setup)
- [Example](#example)
- [Props](#props)
- [CircleMenu](#circlemenu)
- [CircleMenuItem](#circlemenuitem)
## Setup
Install the npm package.
```bash
npm install react-circular-menu
# or
yarn add react-circular-menu
```
Install external dependency `styled-components` if you don't already have it.
```bash
npm install styled-components
# or
yarn add styled-components
```
## Example
```jsx
import MailIcon from "@material-ui/icons/Mail";
import HelpOutlineIcon from "@material-ui/icons/HelpOutline";
import MapIcon from "@material-ui/icons/Map";
// Import the circular menu
import {
CircleMenu,
CircleMenuItem,
TooltipPlacement,
} from "react-circular-menu";
export const TestMenuComponent = (props) => {
return (
<CircleMenu
startAngle={-90}
rotationAngle={360}
itemSize={2}
radius={5}
/**
* rotationAngleInclusive (default true)
* Whether to include the ending angle in rotation because an
* item at 360deg is the same as an item at 0deg if inclusive.
* Leave this prop for angles other than 360deg unless otherwise desired.
*/
rotationAngleInclusive={false}
>
<CircleMenuItem
onClick={() => alert("Clicked the item")}
tooltip="Email"
tooltipPlacement={TooltipPlacement.Right}
>
<MailIcon />
</CircleMenuItem>
<CircleMenuItem tooltip="Help">
<HelpOutlineIcon />
</CircleMenuItem>
<CircleMenuItem tooltip="Location">
<MapIcon />
</CircleMenuItem>
<CircleMenuItem tooltip="Info">
<InfoIcon />
</CircleMenuItem>
</CircleMenu>
);
};
```
## Props
All angles are in degrees.
- [CircleMenu](#circlemenu)
- [CircleMenuItem](#circlemenuitem)
### CircleMenu
- [`startAngle: number`](#startangle-number)
- [`rotationAngle: number`](#rotationangle-number)
- [`rotationAngleInclusive?: boolean`](#rotationangleinclusive-boolean)
- [`radius?: number`](#radius-number)
- [`itemSize?: number`](#itemsize-number)
- [`className?: string`](#classname-string)
- [`menuToggleElement?: ReactElement`](#menutoggleelement-reactelement)
- [`menuToggleClassName?: string`](#menutoggleclassname-string)
- [`onMenuToggle?: (menuActive: boolean) => void`](#onmenutoggle-menuactive-boolean--void)
- [`open?: boolean`](#open-boolean)
- [`children: ReactNode`](#children-reactnode)
#### `startAngle: number`
The angle at which the circle menu starts. That is, the angle at which the first item exists.
Example: `-90`
#### `rotationAngle: number`
The angle by which the menu is to be rotated. For example, 360 for a complete circle.
Example: `270`
#### `rotationAngleInclusive?: boolean`
Whether to include the ending angle in rotation. Because an item at 360 degrees is the same as an item at 0 degree if inclusive. Leave this prop for angles other than 360 degrees unless otherwise desired.
Example: `false`
#### `radius?: number`
Radius of the circle (in em).
Example: `5`
#### `itemSize?: number`
Size of the menu toggle and menu items (in em).
Example: `2`
#### `className?: string`
Class name to apply custom styles to circle menu wrapper.
Example: `testClass`
#### `menuToggleElement?: ReactElement`
Custom element for the menu toggle.
**NOTE: The element must have an `onClick` prop. The prop doesn't need to be specified but it should exist.**
Example: `<button>Toggle Menu</button>`
#### `menuToggleClassName?: string`
Class name to apply custom styles to circle menu toggle.
Example: `testClass`
#### `onMenuToggle?: (menuActive: boolean) => void`
Callback called on toggling the menu.
Example:
```js
(menuActive) => console.log(menuActive);
```
#### `open?: boolean`
Whether the menu is open or not. This can be used to control the menu's toggle state from the parent component.
Example: `false`
#### `children: ReactNode`
Children of the menu.
### CircleMenuItem
- [`size?: number`](#size-number)
- [`link?: string`](#link-string)
- [`tooltipPlacement?: 'bottom-end' | 'bottom-start' | 'bottom' | 'left-end' | 'left-start' | 'left' | 'right-end' | 'right-start' | 'right' | 'top-end' | 'top-start' | 'top'`](#tooltipplacement-bottom-end--bottom-start--bottom--left-end--left-start--left--right-end--right-start--right--top-end--top-start--top)
- [`target?: string`](#target-string)
- [`className?: string`](#classname-string-1)
- [`style?: CSSProperties`](#style-cssproperties)
- [`onClick?: (event: MouseEvent) => void`](#onclick-event-mouseevent--void)
- [`radius?: number`](#radius-number-1)
- [`menuActive?: boolean`](#menuactive-boolean)
- [`children: ReactNode`](#children-reactnode-1)
#### `size?: number`
Size of the menu item. Set by `itemSize` of `CircleMenu` component.
Example: `2`
#### `link?: string`
Link to point to a URL.
Example: `https://google.com`
#### `tooltipPlacement?: 'bottom-end' | 'bottom-start' | 'bottom' | 'left-end' | 'left-start' | 'left' | 'right-end' | 'right-start' | 'right' | 'top-end' | 'top-start' | 'top'`
Placement position of the menu item tooltip.
Example: `top`
#### `target?: string`
The `target` attribute of anchor tag (`<a target="_blank"></a>`) if link prop is set.
Example: `_blank`
#### `className?: string`
Extra class name for applying custom styles.
Example: `testClass`
#### `style?: CSSProperties`
Extra inline styles for the component.
Example: `{ background: 'red' }`
#### `onClick?: (event: MouseEvent) => void`
Callback when the component is clicked.
Example:
```js
(event) => console.log("Clicked");
```
#### `radius?: number`
Radius of the menu item from the menu toggle. Set by `CircleMenu` component.
Example: `5`
#### `menuActive?: boolean`
Whether the menu and thus the menu item is active or not. Set by `CircleMenu` component.
Example: `true`
#### `rotationAngle?: number`
Rotation angle in degrees of the menu item from the `startAngle` of `CircleMenu`. Set by `CircleMenu` component.
Example: `90`
#### `children: ReactNode`
Children of the menu.