apphouse
Version:
Component library for React that uses observable state management and theme-able components.
108 lines (98 loc) • 2.96 kB
text/typescript
import { CSSProperties } from 'glamor';
import { UseStyles } from '../../../styles/defaults/styles.interface';
import { ApphouseTheme } from '../../../styles/defaults/themes.interface';
import { mergeStyles } from '../../../styles/mergeStyles';
export interface ButtonOptionToggleStyle {
text?: CSSProperties;
label?: CSSProperties;
input?: CSSProperties;
selected?: CSSProperties;
}
export interface SliderToggleStyles {
container?: CSSProperties;
colorSchemeToggle?: CSSProperties;
buttonOptionToggle?: ButtonOptionToggleStyle;
}
function getSliderStyles(theme: ApphouseTheme): SliderToggleStyles {
const { colors } = theme;
const SliderToggleStyles: SliderToggleStyles = {
container: {
boxSizing: 'content-box',
color: colors.brand,
borderBottomColor: colors.brand,
borderBottomStyle: 'solid',
borderBottomWidth: '1px',
borderImageOutset: '0',
borderImageRepeat: 'stretch',
borderImageSlice: '100%',
borderImageSource: 'none',
borderImageWidth: '1',
borderLeftColor: colors.brand,
borderLeftStyle: 'solid',
borderLeftWidth: '1px',
borderRightColor: colors.brand,
borderRightStyle: 'solid',
borderRightWidth: '1px',
borderTopColor: colors.brand,
borderTopStyle: 'solid',
borderTopWidth: '1px',
borderRadius: '16px'
},
colorSchemeToggle: {
fontSize: '12px',
lineHeight: '1.33337',
fontWeight: '400',
letterSpacing: '-.01em'
},
buttonOptionToggle: {}
};
return SliderToggleStyles;
}
function getButtonToggleStyles(theme: ApphouseTheme): ButtonOptionToggleStyle {
const { colors } = theme;
return {
input: {
position: 'absolute',
clip: 'rect(1px, 1px, 1px, 1px)',
clipPath: 'inset(0px 0px 99.9% 99.9%)',
overflow: 'hidden',
height: '1px',
width: '1px',
padding: '0',
border: '0',
appearance: 'none'
},
text: {
backgroundColor: 'transparent',
color: colors.brand,
boxSizing: 'border-box',
display: 'inline-block',
padding: '1px 6px',
minWidth: '42px',
border: '1px solid transparent',
borderRadius: '17px',
textAlign: 'center'
},
selected: {
backgroundColor: colors.brand,
color: colors.onBrand,
boxSizing: 'border-box',
display: 'inline-block',
padding: '1px 6px',
minWidth: '42px',
border: '1px solid transparent',
borderRadius: '17px',
textAlign: 'center'
}
};
}
export function useSliderToggleStyles(styles: UseStyles<SliderToggleStyles>) {
const componentStyles = getSliderStyles(styles.theme);
return mergeStyles(componentStyles, styles?.overwrites);
}
export function useButtonToggleStyles(
styles: UseStyles<ButtonOptionToggleStyle>
) {
const componentStyles = getButtonToggleStyles(styles.theme);
return mergeStyles(componentStyles, styles?.overwrites);
}