Skip to content

Commit f2b9126

Browse files
committed
feat: Add AppBarButton support css-in-js
1 parent 1d11548 commit f2b9126

File tree

7 files changed

+99
-29
lines changed

7 files changed

+99
-29
lines changed

src/AppBarButton/index.tsx

Lines changed: 38 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import * as React from "react";
22
import * as PropTypes from "prop-types";
33

4-
import ElementState from "../ElementState";
4+
import PseudoClassesComponent from "../PseudoClassesComponent";
55
import Icon from "../Icon";
66

77
export interface DataProps {
@@ -42,30 +42,37 @@ export class AppBarButtonButton extends React.Component<AppBarButtonButtonProps>
4242
iconStyle,
4343
hoverStyle,
4444
label,
45+
className,
4546
labelPosition,
4647
...attributes
4748
} = this.props;
4849
const { theme } = this.context;
49-
const styles = getStyles(this);
5050

51-
return (
52-
<ElementState
53-
{...attributes as any}
54-
style={styles.root}
55-
hoverStyle={hoverStyle || {
56-
background: theme.listAccentLow
57-
}}
58-
>
59-
<div>
60-
<Icon style={styles.icon}>
61-
{icon}
62-
</Icon>
63-
{labelPosition !== "collapsed" && <p style={styles.label}>
64-
{label}
65-
</p>}
66-
</div>
67-
</ElementState>
51+
const styles = theme.prepareStyles({
52+
styles: getStyles(this),
53+
className: "app-bar-button"
54+
});
55+
56+
const rootProps = {
57+
...attributes,
58+
style: styles.root.style,
59+
className: theme.classNames(className, styles.root.className)
60+
};
61+
const normalRender = (
62+
<div {...rootProps}>
63+
<Icon {...styles.icon}>
64+
{icon}
65+
</Icon>
66+
{labelPosition !== "collapsed" && <p {...styles.label}>
67+
{label}
68+
</p>}
69+
</div>
6870
);
71+
return theme.useInlineStyle ? (
72+
<PseudoClassesComponent {...rootProps}>
73+
{normalRender}
74+
</PseudoClassesComponent>
75+
) : normalRender;
6976
}
7077
}
7178

@@ -74,7 +81,15 @@ function getStyles(AppBarButtonButton: AppBarButtonButton): {
7481
icon?: React.CSSProperties;
7582
label?: React.CSSProperties;
7683
} {
77-
const { context, props: { labelPosition, style, iconStyle } } = AppBarButtonButton;
84+
const {
85+
context,
86+
props: {
87+
labelPosition,
88+
style,
89+
iconStyle,
90+
hoverStyle
91+
}
92+
} = AppBarButtonButton;
7893
const { theme } = context;
7994
const { prefixStyle } = theme;
8095
const flexDirection: any = {
@@ -99,6 +114,9 @@ function getStyles(AppBarButtonButton: AppBarButtonButton): {
99114
maxWidth: isRight ? 120 : 72,
100115
cursor: "default",
101116
transition: "all .25s",
117+
"&:hover": hoverStyle || {
118+
background: theme.listAccentLow
119+
},
102120
...style
103121
}),
104122
label: {

src/Button/index.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ export class Button extends React.Component<ButtonProps> {
6464
const {
6565
borderSize,
6666
style,
67+
className,
6768
hoverStyle,
6869
children,
6970
icon,
@@ -77,9 +78,8 @@ export class Button extends React.Component<ButtonProps> {
7778
} = this.props;
7879
const { theme } = this.context;
7980

80-
const rootAttributes = theme.styleManager.setStyleToManager({
81+
const rootAttributes = theme.prepareStyle({
8182
className: "button-root",
82-
theme,
8383
style: {
8484
display: "inline-block",
8585
verticalAlign: "middle",
@@ -102,12 +102,12 @@ export class Button extends React.Component<ButtonProps> {
102102
cursor: "not-allowed",
103103
color: theme.baseMedium
104104
}
105-
}
105+
},
106+
extendsClassName: className
106107
});
107108

108-
const iconAttributes = theme.styleManager.setStyleToManager({
109+
const iconAttributes = theme.prepareStyle({
109110
className: "button-icon",
110-
theme,
111111
style: {
112112
padding: "0 4px",
113113
display: "inline-block",

src/ElementState.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,8 +156,8 @@ export default class ElementState extends React.Component<ElementStateProps, {}>
156156
...attributes,
157157
style: this.context.theme.prefixStyle({
158158
transition: "all .25s",
159-
...(disabled ? disabledStyle : void 0),
160-
...style
159+
...style,
160+
...(disabled ? disabledStyle : void 0)
161161
}),
162162
onMouseEnter: hoverStyle ? this.hover : onMouseEnter,
163163
onMouseLeave: hoverStyle ? this.unHover : onMouseLeave,

src/PseudoClassesComponent.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export class PseudoClassesComponent extends React.Component<any> {
1414
const { style, children, ...attributes } = this.props;
1515

1616
if (style) {
17-
const { primaryObject, secondaryObject } = spreadObject(this.props, pseudoClassesNames);
17+
const { primaryObject, secondaryObject } = spreadObject(style, pseudoClassesNames);
1818
return (
1919
<ElementState
2020
{...attributes}

src/common/spreadObject.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ export function spreadObject(obj: any, keys: string[]) {
55
const symbols = canCheckObjectSymbol ? Object.getOwnPropertySymbols(obj) : null;
66
const symbolsSize = canCheckObjectSymbol ? symbols.length : 0;
77

8-
for (let property of obj) {
8+
for (let property in obj) {
99
if (Object.prototype.hasOwnProperty.call(obj, property) && keys.indexOf(property) < 0) {
1010
primaryObject[property] = obj[property];
1111
} else {

src/styles/getTheme.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,32 @@ export default function getTheme(themeConfig?: ThemeConfig): ReactUWP.ThemeType
128128

129129
isDarkTheme: isDark,
130130
prefixStyle: prefixAll(userAgent),
131+
prepareStyle(config, callback) {
132+
const { extendsClassName, ...managerConfig } = config;
133+
if (this.useInlineStyle) {
134+
managerConfig.className += extendsClassName ? ` ${extendsClassName}` : "";
135+
return managerConfig;
136+
} else {
137+
const styleWithClasses = this.styleManager.setStyleToManager(managerConfig, callback);
138+
styleWithClasses.className += extendsClassName ? ` ${extendsClassName}` : "";
139+
return styleWithClasses;
140+
}
141+
},
142+
prepareStyles(config, callback) {
143+
if (this.useInlineStyle) {
144+
const { styles } = config;
145+
for (let key in styles) {
146+
styles[key] = { style: styles[key] };
147+
}
148+
return config.styles;
149+
} else {
150+
const styleWithClasses = this.styleManager.setStylesToManager(config, callback);
151+
return styleWithClasses;
152+
}
153+
},
154+
classNames(...classNames) {
155+
return classNames.reduce((prev, curr) => (prev || "") + curr ? ` ${curr}` : "");
156+
},
131157

132158
toasts: [],
133159

typings/index.d.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,20 @@
99

1010
export as namespace ReactUWP;
1111

12+
export interface CustomCSSProperties extends React.CSSProperties {
13+
"&:hover"?: React.CSSProperties;
14+
"&:active"?: React.CSSProperties;
15+
"&:visited"?: React.CSSProperties;
16+
"&:focus"?: React.CSSProperties;
17+
"&:disabled"?: React.CSSProperties;
18+
dynamicStyle?: React.CSSProperties;
19+
}
20+
21+
export interface StyleWithClasses {
22+
style?: CustomCSSProperties;
23+
className?: string;
24+
}
25+
1226
export interface ScrollReveal {
1327
rootElm?: HTMLElement;
1428
animated?: boolean;
@@ -97,6 +111,18 @@ export interface ThemeType {
97111
chromeWhite?: string;
98112

99113
prefixStyle?: (style?: React.CSSProperties) => React.CSSProperties;
114+
prepareStyle?: (config?: {
115+
style?: CustomCSSProperties;
116+
className?: string;
117+
extendsClassName?: string;
118+
}, callback?: (theme?: ReactUWP.ThemeType) => StyleWithClasses) => StyleWithClasses ;
119+
prepareStyles?: (config?: {
120+
styles: { [key: string]: StyleWithClasses | CustomCSSProperties };
121+
className?: string;
122+
extendsClassName?: string;
123+
}, callback?: (theme?: ReactUWP.ThemeType) => { [key: string]: StyleWithClasses }) => { [key: string]: StyleWithClasses };
124+
classNames?: (...classNames: string[]) => string;
125+
100126
isDarkTheme?: boolean;
101127
updateTheme?: (theme: ThemeType) => void;
102128
forceUpdateTheme?: (theme: ThemeType) => void;

0 commit comments

Comments
 (0)