apphouse
Version:
Component library for React that uses observable state management and theme-able components.
84 lines (80 loc) • 2.02 kB
text/typescript
import { mergeStyles } from '../..';
import {
ApphouseTheme,
InputStyles
} from '../../styles/defaults/themes.interface';
import { getValueWithUnit } from '../../themes/utils/getValueWithUnit';
import {
InputComponentStyles,
InputLabelStyles,
InputToggleTypeButtonStyles
} from './input.styles.interface';
export const getComponentInputLabelStyles = (
theme: ApphouseTheme,
variant: keyof InputStyles
): InputLabelStyles => {
const { tokens, colors } = theme;
let fontSize = tokens.fontSize.standard;
if (variant === 'xl') {
fontSize = tokens.fontSize.title;
} else if (variant === 'l') {
fontSize = tokens.fontSize.title;
} else if (variant === 's') {
fontSize = tokens.fontSize.small;
}
return {
text: {
color: 'inherit',
fontFamily: tokens.fontFamily.default,
fontSize,
fontWeight: 600
},
required: {
color: colors.error,
marginLeft: tokens.spacings.xs
}
};
};
export const getComponentInputStyles = (
theme: ApphouseTheme,
variant: keyof InputStyles
): InputComponentStyles => {
const { tokens, styles } = theme;
const inputStyles = styles.input[variant];
return {
container: {
display: 'flex',
flexDirection: 'column',
gap: tokens.spacings.s
},
input: mergeStyles(inputStyles, { color: 'inherit' })
};
};
export const getComponentButtonInputToggleStyles = (
theme: ApphouseTheme,
size: keyof InputStyles
): InputToggleTypeButtonStyles => {
const { styles } = theme;
const inputStyles = styles.input[size];
const padding = getValueWithUnit(
parseInt(inputStyles?.paddingTop) / 1.5,
'px'
);
// here we make the button paddings match the input paddings
return {
wrapper: {
position: 'absolute',
top: 0,
right: 0,
zIndex: 1
},
button: {
...styles.button.tertiary,
padding: padding,
paddingTop: padding,
paddingBottom: padding,
paddingLeft: padding,
paddingRight: padding
}
};
};