diff --git a/src/AppBarButton/index.tsx b/src/AppBarButton/index.tsx index 8dc9b940..bfa26dd8 100644 --- a/src/AppBarButton/index.tsx +++ b/src/AppBarButton/index.tsx @@ -1,7 +1,7 @@ import * as React from "react"; import * as PropTypes from "prop-types"; -import ElementState from "../ElementState"; +import PseudoClassesComponent from "../PseudoClassesComponent"; import Icon from "../Icon"; export interface DataProps { @@ -42,30 +42,37 @@ export class AppBarButtonButton extends React.Component iconStyle, hoverStyle, label, + className, labelPosition, ...attributes } = this.props; const { theme } = this.context; - const styles = getStyles(this); - return ( - -
- - {icon} - - {labelPosition !== "collapsed" &&

- {label} -

} -
-
+ const styles = theme.prepareStyles({ + styles: getStyles(this), + className: "app-bar-button" + }); + + const rootProps = { + ...attributes, + style: styles.root.style, + className: theme.classNames(className, styles.root.className) + }; + const normalRender = ( +
+ + {icon} + + {labelPosition !== "collapsed" &&

+ {label} +

} +
); + return theme.useInlineStyle ? ( + + {normalRender} + + ) : normalRender; } } @@ -74,7 +81,15 @@ function getStyles(AppBarButtonButton: AppBarButtonButton): { icon?: React.CSSProperties; label?: React.CSSProperties; } { - const { context, props: { labelPosition, style, iconStyle } } = AppBarButtonButton; + const { + context, + props: { + labelPosition, + style, + iconStyle, + hoverStyle + } + } = AppBarButtonButton; const { theme } = context; const { prefixStyle } = theme; const flexDirection: any = { @@ -99,6 +114,9 @@ function getStyles(AppBarButtonButton: AppBarButtonButton): { maxWidth: isRight ? 120 : 72, cursor: "default", transition: "all .25s", + "&:hover": hoverStyle || { + background: theme.listAccentLow + }, ...style }), label: { diff --git a/src/Button/index.tsx b/src/Button/index.tsx index 57d2833f..66407a92 100644 --- a/src/Button/index.tsx +++ b/src/Button/index.tsx @@ -64,6 +64,7 @@ export class Button extends React.Component { const { borderSize, style, + className, hoverStyle, children, icon, @@ -77,9 +78,8 @@ export class Button extends React.Component { } = this.props; const { theme } = this.context; - const rootAttributes = theme.styleManager.setStyleToManager({ + const rootAttributes = theme.prepareStyle({ className: "button-root", - theme, style: { display: "inline-block", verticalAlign: "middle", @@ -102,12 +102,12 @@ export class Button extends React.Component { cursor: "not-allowed", color: theme.baseMedium } - } + }, + extendsClassName: className }); - const iconAttributes = theme.styleManager.setStyleToManager({ + const iconAttributes = theme.prepareStyle({ className: "button-icon", - theme, style: { padding: "0 4px", display: "inline-block", diff --git a/src/ElementState.tsx b/src/ElementState.tsx index d465a5f2..0dc9f781 100644 --- a/src/ElementState.tsx +++ b/src/ElementState.tsx @@ -156,8 +156,8 @@ export default class ElementState extends React.Component ...attributes, style: this.context.theme.prefixStyle({ transition: "all .25s", - ...(disabled ? disabledStyle : void 0), - ...style + ...style, + ...(disabled ? disabledStyle : void 0) }), onMouseEnter: hoverStyle ? this.hover : onMouseEnter, onMouseLeave: hoverStyle ? this.unHover : onMouseLeave, diff --git a/src/PseudoClassesComponent.tsx b/src/PseudoClassesComponent.tsx index 27128e13..7cc23d16 100644 --- a/src/PseudoClassesComponent.tsx +++ b/src/PseudoClassesComponent.tsx @@ -14,7 +14,7 @@ export class PseudoClassesComponent extends React.Component { const { style, children, ...attributes } = this.props; if (style) { - const { primaryObject, secondaryObject } = spreadObject(this.props, pseudoClassesNames); + const { primaryObject, secondaryObject } = spreadObject(style, pseudoClassesNames); return ( (prev || "") + curr ? ` ${curr}` : ""); + }, toasts: [], diff --git a/typings/index.d.ts b/typings/index.d.ts index d351510d..2235fcdf 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -9,6 +9,20 @@ export as namespace ReactUWP; +export interface CustomCSSProperties extends React.CSSProperties { + "&:hover"?: React.CSSProperties; + "&:active"?: React.CSSProperties; + "&:visited"?: React.CSSProperties; + "&:focus"?: React.CSSProperties; + "&:disabled"?: React.CSSProperties; + dynamicStyle?: React.CSSProperties; +} + +export interface StyleWithClasses { + style?: CustomCSSProperties; + className?: string; +} + export interface ScrollReveal { rootElm?: HTMLElement; animated?: boolean; @@ -97,6 +111,18 @@ export interface ThemeType { chromeWhite?: string; prefixStyle?: (style?: React.CSSProperties) => React.CSSProperties; + prepareStyle?: (config?: { + style?: CustomCSSProperties; + className?: string; + extendsClassName?: string; + }, callback?: (theme?: ReactUWP.ThemeType) => StyleWithClasses) => StyleWithClasses ; + prepareStyles?: (config?: { + styles: { [key: string]: StyleWithClasses | CustomCSSProperties }; + className?: string; + extendsClassName?: string; + }, callback?: (theme?: ReactUWP.ThemeType) => { [key: string]: StyleWithClasses }) => { [key: string]: StyleWithClasses }; + classNames?: (...classNames: string[]) => string; + isDarkTheme?: boolean; updateTheme?: (theme: ThemeType) => void; forceUpdateTheme?: (theme: ThemeType) => void;