Files
rn-app/assets/styles/css.js
2025-08-27 19:20:10 +08:00

201 lines
5.8 KiB
JavaScript

import { StyleSheet, StatusBar } from 'react-native';
// create useStyles hooks
export const useStyles = (props = {}) =>
StyleSheet.create({ value: props }).value;
export const paddingTopStatusBarHeight = useStyles({
paddingTop: StatusBar.currentHeight || 0,
});
export const statusBarHeight = useStyles({
height: StatusBar.currentHeight || 0,
});
export const flexRow = useStyles({
display: 'flex',
flexDirection: 'row',
});
export const flexColumn = useStyles({
display: 'flex',
flexDirection: 'column',
});
export const flexSub = useStyles({
flex: 1,
});
export const flexShrink = useStyles({
flexShrink: 0,
});
export const flexWrap = useStyles({
flexWrap: 'wrap',
});
export const flexnoWrap = useStyles({
flexWrap: 'nowrap',
});
export const justifyStart = useStyles({
justifyContent: 'flex-start',
});
export const justifyEnd = useStyles({
justifyContent: 'flex-end',
});
export const justifyCenter = useStyles({
justifyContent: 'center',
});
export const justifyBetween = useStyles({
justifyContent: 'space-between',
});
export const justifyAround = useStyles({
justifyContent: 'space-around',
});
export const justifyEvenly = useStyles({
justifyContent: 'space-evenly',
});
export const alignItemsStart = useStyles({
alignItems: 'flex-start',
});
export const alignItemsEnd = useStyles({
alignItems: 'flex-end',
});
export const alignItemsCenter = useStyles({
alignItems: 'center',
});
export const alignItemsStretch = useStyles({
alignItems: 'stretch',
});
export const positionRelative = useStyles({
position: 'relative',
});
export const positionAbsolute = useStyles({
position: 'absolute',
});
export const positionSticky = useStyles({
position: 'sticky',
});
export const positionStatic = useStyles({
position: 'static',
});
export const positionFixed = useStyles({
position: 'fixed',
});
export const getColor = (color = {brandPrimary: '#ff6600', brandPrimaryTap: '#ff6600' }) => {
const brandPrimary = color.brandPrimary || '#108ee9';
const brandPrimaryTap = color.brandPrimaryTap || '#1284d6';
return {
transparent: 'transparent',
brandPrimary,
brandPrimaryTap,
// 文字色
color_text_base: color.color_text_base || '#000000', // 基本
color_text_base_inverse: color.color_text_base_inverse || '#ffffff', // 基本 _ 反色
color_text_placeholder: color.color_text_placeholder || '#bbbbbb', // 文本框提示
color_text_disabled: color.color_text_disabled || '#bbbbbb', // 失效
color_text_caption: color.color_text_caption || '#888888', // 辅助描述
color_text_paragraph: color.color_text_paragraph || '#333333', // 段落
color_link: color.color_link || brandPrimary, // 链接
color_icon_base: color.color_icon_base || '#cccccc', // 许多小图标的背景,比如一些小圆点,加减号
// 背景色
fill_body: color.fill_body || '#f5f5f9', // 页面背景
fill_base: color.fill_base || '#ffffff', // 组件默认背景
fill_tap: color.fill_tap || '#dddddd', // 组件默认背景 _ 按下
fill_disabled: color.fill_disabled || '#dddddd', // 通用失效背景
fill_mask: color.fill_mask || 'rgba(0, 0, 0, .4)', // 遮罩背景
fill_grey: color.fill_grey || '#f7f7f7',
// 全局/品牌色
brand_primary: color.brand_primary || brandPrimary,
brand_primary_tap: color.brand_primary_tap || brandPrimaryTap,
brand_success: color.brand_success || '#6abf47',
brand_warning: color.brand_warning || '#faad14',
brand_error: color.brand_error || '#f4333c', // 错误(form validate)
brand_important: color.brand_important || '#ff5b05', // 用于小红点
// 边框色
border_color_base: color.border_color_base || '#dddddd', // 基础的
border_color_thin: color.border_color_thin || '#eeeeee', // 更细的
primary_button_fill: color.primary_button_fill || brandPrimary,
primary_button_fill_tap: color.primary_button_fill_tap || brandPrimaryTap,
ghost_button_color: color.ghost_button_color || brandPrimary, // 同时应用于背景、文字颜色、边框色
ghost_button_fill_tap: color.ghost_button_fill_tap || `${brandPrimary}99`, // alpha 60%
warning_button_fill: color.warning_button_fill || '#e94f4f',
warning_button_fill_tap: color.warning_button_fill_tap || '#d24747',
// tab_bar
tab_bar_fill: color.tab_bar_fill || '#ebeeef',
// toast
toast_fill: color.toast_fill || 'rgba(0, 0, 0, .8)',
// search_bar
search_bar_fill: color.search_bar_fill || '#efeff4',
search_color_icon: color.search_color_icon || '#bbbbbb', // input search icon 的背景色
// notice_bar
notice_bar_fill: color.notice_bar_fill || '#fffada',
// checkbox
checkbox_fill_disabled: color.checkbox_fill_disabled || '#f5f5f5',
checkbox_border: color.checkbox_border || '#d9d9d9',
checkbox_border_disabled: color.checkbox_border_disabled || '#b9b9b9',
// switch
switch_unchecked: color.switch_unchecked || '#cccccc',
switch_unchecked_disabled: color.switch_unchecked_disabled || '#cccccc66', // switch_fill的40%透明度
// tooltip
tooltip_dark: color.tooltip_dark || 'rgba(0, 0, 0, 0.9)',
};
};
export const getColorStyles = color => {
return {
default: useStyles({
color: color.default,
}),
defaultBg: useStyles({
backgroundColor: color.default,
}),
primary: useStyles({
color: color.primary,
}),
primaryBg: useStyles({
backgroundColor: color.primary,
}),
};
};
export default {
statusBarHeight,
paddingTopStatusBarHeight,
flexRow,
flexColumn,
flexSub,
flexShrink,
flexWrap,
flexnoWrap,
justifyStart,
justifyEnd,
justifyCenter,
justifyBetween,
justifyAround,
justifyEvenly,
alignItemsStart,
alignItemsEnd,
alignItemsCenter,
alignItemsStretch,
positionRelative,
positionAbsolute,
getColor,
getColorStyles,
useStyles,
};