Skip to content

Commit c8aca25

Browse files
authored
feat: menu support to set divider (#205)
* feat: menu support to set divider * feat: divider color support to theme change
1 parent 72b7dcc commit c8aca25

File tree

7 files changed

+52
-0
lines changed

7 files changed

+52
-0
lines changed

src/components/menu/base.ts

+4
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ export const defaultMenuItemClassName = getBEMElement(
2020
defaultMenuClassName,
2121
'item'
2222
);
23+
export const defaultDividerClassName = getBEMElement(
24+
defaultMenuClassName,
25+
'divider'
26+
);
2327
export const checkClassName = getBEMElement(defaultMenuClassName, 'check');
2428
export const disabledClassName = getBEMModifier(
2529
defaultMenuItemClassName,

src/components/menu/divider.tsx

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { classNames } from 'mo/common/className';
2+
import React from 'react';
3+
import {
4+
defaultDividerClassName,
5+
defaultMenuItemClassName,
6+
disabledClassName,
7+
} from './base';
8+
9+
const Divider = () => {
10+
return (
11+
<li
12+
className={classNames(defaultMenuItemClassName, disabledClassName)}
13+
role="separator"
14+
>
15+
<a className={defaultDividerClassName} />
16+
</li>
17+
);
18+
};
19+
20+
export { Divider };

src/components/menu/menu.tsx

+12
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { mergeFunctions } from 'mo/common/utils';
1414
import { cloneReactChildren } from 'mo/react';
1515
import { em2Px } from 'mo/common/css';
1616
import { getRelativePosition, triggerEvent } from 'mo/common/dom';
17+
import { Divider } from './divider';
1718

1819
export type IMenuProps = ISubMenuProps;
1920

@@ -81,6 +82,7 @@ export function Menu(props: React.PropsWithChildren<IMenuProps>) {
8182
if (data.length > 0) {
8283
const renderMenusByData = (menus: IMenuProps[]) => {
8384
return menus.map((item: IMenuProps) => {
85+
if (item.type === 'divider') return <Divider />;
8486
const handleClick = mergeFunctions(onClick, item.onClick);
8587
if (item.data && item.data.length > 0) {
8688
return (
@@ -159,6 +161,16 @@ export function Menu(props: React.PropsWithChildren<IMenuProps>) {
159161
// sub menu do not listen any event
160162
if (claNames?.includes(defaultSubMenuClassName)) return {};
161163
return {
164+
onContextMenu: (e) => {
165+
e.preventDefault();
166+
e.persist();
167+
e.stopPropagation();
168+
},
169+
onClick: (e) => {
170+
e.preventDefault();
171+
e.persist();
172+
e.stopPropagation();
173+
},
162174
[triggerEvent(trigger)]: handleTriggerEvent,
163175
onMouseOut: handleMouseOut,
164176
};

src/components/menu/menuItem.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ export interface IMenuItemProps extends HTMLElementProps {
1414
* The name of icon
1515
*/
1616
icon?: string;
17+
type?: 'divider';
1718
/**
1819
* Item Name
1920
*/

src/components/menu/style.scss

+13
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,22 @@
66
line-height: 13px;
77
}
88

9+
#{$menu}__divider {
10+
border-bottom: 1px solid var(--menu-separatorBackground);
11+
flex: 1;
12+
font-size: inherit;
13+
height: 0;
14+
margin: 0 0.8em 0.2em;
15+
padding: 0.2em 0 0;
16+
}
17+
918
#{$menu} {
1019
display: flex;
1120
list-style: none;
1221
margin: 0;
1322
min-width: 200px;
1423
padding: 0;
24+
user-select: none;
1525

1626
&--vertical {
1727
flex-direction: column;
@@ -30,6 +40,9 @@
3040
}
3141

3242
&__item {
43+
align-items: center;
44+
border: thin solid transparent;
45+
display: flex;
3346
min-width: 120px;
3447

3548
&--disabled {

src/extensions/theme-defaults/themes/dark_defaults.json

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
"menu.background": "#252526",
3131
"menu.foreground": "#CCCCCC",
3232
"menu.selectionBackground": "#094771",
33+
"menu.separatorBackground": "#BBBBBB",
3334
"statusBarItem.remoteForeground": "#FFF",
3435
"statusBarItem.remoteBackground": "#16825D",
3536
"sidebarSectionHeader.background": "#0000",

src/extensions/theme-defaults/themes/light_defaults.json

+1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
"sidebarSectionHeader.border": "#61616130",
3737
"tab.border": "#333",
3838
"menu.selectionBackground": "#0060C0",
39+
"menu.separatorBackground": "#888888",
3940
"tab.inactiveBackground": "rgb(236, 236, 236)",
4041
"tab.inactiveForeground": "rgba(51, 51, 51, 0.7)",
4142
"tab.activeForeground": "rgb(255, 255, 255)"

0 commit comments

Comments
 (0)