Skip to content

Commit da0f28c

Browse files
committed
feat: add component context-menu
1 parent 6e564f8 commit da0f28c

22 files changed

+701
-0
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { Root, Trigger } from '@radix-ui/react-context-menu';
2+
3+
import ContextMenuContent from './ContextMenuContent';
4+
import ContextMenuOption from './ContextMenuOption';
5+
import type { ContextMenuProps } from './types';
6+
7+
const ContextMenu = (props: ContextMenuProps) => {
8+
const { children, classNames, contentProps, dir, items, modal, onOpenChange, size } = props;
9+
10+
return (
11+
<Root
12+
dir={dir}
13+
modal={modal}
14+
onOpenChange={onOpenChange}
15+
>
16+
<Trigger asChild>{children}</Trigger>
17+
18+
<ContextMenuContent {...contentProps}>
19+
{items.map((item, index) => {
20+
return (
21+
<ContextMenuOption
22+
classNames={classNames}
23+
item={item}
24+
key={String(index)}
25+
size={size}
26+
/>
27+
);
28+
})}
29+
</ContextMenuContent>
30+
</Root>
31+
);
32+
};
33+
34+
export default ContextMenu;
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { Arrow } from '@radix-ui/react-context-menu';
2+
3+
import MenuArrow from '../menu/MenuArrow';
4+
5+
import type { ContextMenuArrowProps } from './types';
6+
7+
const ContextMenuArrow = (props: ContextMenuArrowProps) => {
8+
return (
9+
<MenuArrow
10+
{...props}
11+
component={Arrow as typeof MenuArrow}
12+
/>
13+
);
14+
};
15+
16+
export default ContextMenuArrow;
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { Root, Trigger } from '@radix-ui/react-context-menu';
2+
3+
import ContextMenuCheckboxGroup from './ContextMenuCheckboxGroup';
4+
import ContextMenuContent from './ContextMenuContent';
5+
import type { ContextMenuCheckboxProps } from './types';
6+
7+
const ContextMenuCheckbox = (props: ContextMenuCheckboxProps) => {
8+
const { children, className, classNames, contentProps, dir, modal, onOpenChange, size, ...rest } = props;
9+
10+
return (
11+
<Root
12+
dir={dir}
13+
modal={modal}
14+
onOpenChange={onOpenChange}
15+
>
16+
<Trigger asChild>{children}</Trigger>
17+
18+
<ContextMenuContent
19+
arrowClass={classNames?.arrow}
20+
className={className || classNames?.content}
21+
size={size}
22+
{...contentProps}
23+
>
24+
<ContextMenuCheckboxGroup
25+
classNames={classNames}
26+
size={size}
27+
{...rest}
28+
/>
29+
</ContextMenuContent>
30+
</Root>
31+
);
32+
};
33+
34+
export default ContextMenuCheckbox;
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { Group } from '@radix-ui/react-context-menu';
2+
3+
import MenuCheckboxGroup from '../menu/MenuCheckboxGroup';
4+
5+
import ContextMenuCheckboxItem from './ContextMenuCheckboxItem';
6+
import ContextMenuLabel from './ContextMenuLabel';
7+
import ContextMenuSeparator from './ContextMenuSeparator';
8+
import type { ContextMenuCheckboxGroupProps } from './types';
9+
10+
const ContextMenuCheckboxGroup = (props: ContextMenuCheckboxGroupProps) => {
11+
return (
12+
<MenuCheckboxGroup
13+
component={ContextMenuCheckboxItem}
14+
groupComponent={Group}
15+
labelComponent={ContextMenuLabel}
16+
separatorComponent={ContextMenuSeparator}
17+
{...props}
18+
/>
19+
);
20+
};
21+
22+
export default ContextMenuCheckboxGroup;
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { CheckboxItem } from '@radix-ui/react-context-menu';
2+
3+
import MenuCheckboxItem from '../menu/MenuCheckboxItem';
4+
5+
import ContextMenuItemIndicator from './ContextMenuItemIndicator';
6+
import type { ContextMenuCheckboxItemProps } from './types';
7+
8+
const ContextMenuCheckboxItem = (props: ContextMenuCheckboxItemProps) => {
9+
return (
10+
<MenuCheckboxItem
11+
component={CheckboxItem as typeof MenuCheckboxItem}
12+
indicatorComponent={ContextMenuItemIndicator}
13+
{...props}
14+
/>
15+
);
16+
};
17+
18+
export default ContextMenuCheckboxItem;
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { Content, Portal } from '@radix-ui/react-context-menu';
2+
import type { ComponentRef } from 'react';
3+
import { forwardRef } from 'react';
4+
5+
import MenuContent from '../menu/MenuContent';
6+
7+
import ContextMenuArrow from './ContextMenuArrow';
8+
import type { ContextMenuContentProps } from './types';
9+
10+
const ContextMenuContent = forwardRef<ComponentRef<typeof Content>, ContextMenuContentProps>((props, ref) => {
11+
return (
12+
<MenuContent
13+
arrowComponent={ContextMenuArrow}
14+
component={Content as typeof MenuContent}
15+
portalComponent={Portal}
16+
ref={ref}
17+
{...props}
18+
/>
19+
);
20+
});
21+
22+
ContextMenuContent.displayName = 'ContextMenuContent';
23+
24+
export default ContextMenuContent;
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { Item } from '@radix-ui/react-context-menu';
2+
3+
import MenuItem from '../menu/MenuItem';
4+
5+
import type { ContextMenuItemProps } from './types';
6+
7+
const ContextMenuItem = (props: ContextMenuItemProps) => {
8+
return (
9+
<MenuItem
10+
{...props}
11+
component={Item as typeof MenuItem}
12+
/>
13+
);
14+
};
15+
16+
export default ContextMenuItem;
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { ItemIndicator } from '@radix-ui/react-context-menu';
2+
3+
import MenuItemIndicator from '../menu/MenuItemIndicator';
4+
5+
import type { ContextMenuItemIndicatorProps } from './types';
6+
7+
const ContextMenuItemIndicator = (props: ContextMenuItemIndicatorProps) => {
8+
return (
9+
<MenuItemIndicator
10+
component={ItemIndicator as typeof MenuItemIndicator}
11+
{...props}
12+
/>
13+
);
14+
};
15+
16+
export default ContextMenuItemIndicator;
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { Label } from '@radix-ui/react-context-menu';
2+
3+
import MenuLabel from '../menu/MenuLabel';
4+
5+
import type { ContextMenuLabelProps } from './types';
6+
7+
const ContextMenuLabel = (props: ContextMenuLabelProps) => {
8+
return (
9+
<MenuLabel
10+
component={Label as typeof MenuLabel}
11+
{...props}
12+
/>
13+
);
14+
};
15+
16+
export default ContextMenuLabel;
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { Sub } from '@radix-ui/react-context-menu';
2+
3+
import MenuOption from '../menu/MenuOption';
4+
5+
import ContextMenuItem from './ContextMenuItem';
6+
import ContextMenuLabel from './ContextMenuLabel';
7+
import ContextMenuSeparator from './ContextMenuSeparator';
8+
import ContextMenuSubContent from './ContextMenuSubContent';
9+
import ContextMenuSubTrigger from './ContextMenuSubTrigger';
10+
import type { ContextMenuOptionProps } from './types';
11+
12+
const ContextMenuOption = (props: ContextMenuOptionProps) => {
13+
return (
14+
<MenuOption
15+
{...props}
16+
component={ContextMenuItem}
17+
labelComponent={ContextMenuLabel}
18+
separatorComponent={ContextMenuSeparator}
19+
subComponent={Sub}
20+
subContentComponent={ContextMenuSubContent}
21+
subTriggerComponent={ContextMenuSubTrigger}
22+
/>
23+
);
24+
};
25+
26+
ContextMenuOption.displayName = 'ContextMenuOption';
27+
28+
export default ContextMenuOption;

0 commit comments

Comments
 (0)