Skip to content

Commit

Permalink
feat: Add Menu support css-in-js
Browse files Browse the repository at this point in the history
  • Loading branch information
myxvisual committed Aug 8, 2017
1 parent b69fbc6 commit aa05440
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 15 deletions.
34 changes: 20 additions & 14 deletions src/Menu/MenuItem.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { codes } from "keycode";

import AddBlurEvent from "../common/AddBlurEvent";
import Icon from "../Icon";
import ElementState from "../ElementState";
import PseudoClasses from "../PseudoClasses";

export interface DataProps {
/**
Expand Down Expand Up @@ -58,7 +58,7 @@ export class MenuItem extends React.Component<MenuItemProps, MenuItemState> {
};

addBlurEvent = new AddBlurEvent();
elementState: ElementState;
rootElm: HTMLDivElement;

static contextTypes = { theme: PropTypes.object };
context: { theme: ReactUWP.ThemeType };
Expand All @@ -74,7 +74,7 @@ export class MenuItem extends React.Component<MenuItemProps, MenuItemState> {
addBlurEventMethod = () => {
this.addBlurEvent.setConfig({
addListener: this.state.expanded,
clickExcludeElm: this.elementState.rootElm,
clickExcludeElm: this.rootElm,
blurCallback: () => {
this.setState({
expanded: false
Expand Down Expand Up @@ -116,32 +116,34 @@ export class MenuItem extends React.Component<MenuItemProps, MenuItemState> {
itemHeight,
children,
defaultExpanded,
className,
hoverStyle,
...attributes
} = this.props;
const { theme } = this.context;
const { expanded } = this.state;
const styles = getStyles(this);
const inlineStyles = getStyles(this);
const styles = theme.prepareStyles({
className: "menu",
styles: inlineStyles
});

const iconProps = {
size: itemHeight,
style: { fontSize: itemHeight / 3 }
};

return (
<ElementState
<PseudoClasses
{...attributes}
style={styles.root}
hoverStyle={hoverStyle || {
background: theme.listLow
}}
ref={(elementState) => this.elementState = elementState}
className={theme.classNames(styles.root.className, className)}
style={styles.root.style}
>
<div>
<div ref={rootElm => this.rootElm = rootElm}>
<Icon {...iconProps}>
{icon}
</Icon>
<span style={styles.label}>{label}</span>
<span {...styles.label}>{label}</span>
{children && (
<Icon
{...iconProps}
Expand All @@ -156,12 +158,12 @@ export class MenuItem extends React.Component<MenuItemProps, MenuItemState> {
</Icon>
)}
{children && (
<div style={styles.child}>
<div {...styles.child}>
{children}
</div>
)}
</div>
</ElementState>
</PseudoClasses>
);
}
}
Expand All @@ -174,6 +176,7 @@ function getStyles(menuItem: MenuItem): {
const {
context: { theme },
props: {
hoverStyle,
children,
style,
itemWidth,
Expand All @@ -194,6 +197,9 @@ function getStyles(menuItem: MenuItem): {
lineHeight: `${itemHeight}px`,
width: "100%",
position: children ? "relative" : void 0,
"&:hover": hoverStyle || {
background: theme.listLow
},
...style
}),
label: {
Expand Down
8 changes: 7 additions & 1 deletion src/Menu/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -79,15 +79,21 @@ export class Menu extends React.Component<MenuProps, MenuState> {
menuItemHeight,
menuItemHoverStyle,
children,
className,
...attributes
} = this.props;
const { theme } = this.context;
const styles = getStyles(this);
const styleClasses = theme.prepareStyle({
className: "menu",
style: styles.root,
extendsClassName: className
});

return (
<div
{...attributes}
style={styles.root}
{...styleClasses}
>
{children && React.Children.map(children, (child: any, index) => (
child.type === Menu ? React.cloneElement(child, {
Expand Down

0 comments on commit aa05440

Please sign in to comment.