- tokens.scss: 修正字号 token 对齐 18 份原型稿 fontSize 统计
--tk-font-h1: 26→28px, --tk-font-h2: 24→22px
--tk-font-body-lg: 28→18px, --tk-font-body: 22→16px
--tk-font-body-sm: 16→14px
elder-mode 同步重新计算比例系数
- ContentCard: 新增 margin prop ('none'|'md'),margin-bottom
从 CSS 类移至 inline style,支持列表容器内无间距模式
- Profile 页: 用户卡片添加 profile-user-card flex 布局
菜单组/积分卡片使用 margin="none",修复布局对齐
- Login 页: SCSS 全部改为 design token 引用
62 lines
1.4 KiB
TypeScript
62 lines
1.4 KiB
TypeScript
import React from 'react';
|
|
import { View } from '@tarojs/components';
|
|
import { CSSProperties, ReactNode, useMemo } from 'react';
|
|
import './index.scss';
|
|
|
|
interface ContentCardProps {
|
|
variant?: 'default' | 'outlined' | 'elevated';
|
|
onPress?: () => void;
|
|
padding?: 'none' | 'sm' | 'md' | 'lg';
|
|
margin?: 'none' | 'md';
|
|
activeFeedback?: 'bg' | 'opacity' | 'scale' | 'none';
|
|
className?: string;
|
|
style?: CSSProperties;
|
|
children: ReactNode;
|
|
}
|
|
|
|
const PADDING_MAP = {
|
|
none: '0',
|
|
sm: 'var(--tk-card-padding-sm)',
|
|
md: 'var(--tk-card-padding)',
|
|
lg: 'var(--tk-card-padding-lg)',
|
|
} as const;
|
|
|
|
const MARGIN_MAP = {
|
|
none: '0',
|
|
md: 'var(--tk-gap-md)',
|
|
} as const;
|
|
|
|
const ContentCard: React.FC<ContentCardProps> = ({
|
|
variant = 'default',
|
|
onPress,
|
|
padding = 'md',
|
|
margin = 'md',
|
|
activeFeedback = 'bg',
|
|
className,
|
|
style,
|
|
children,
|
|
}) => {
|
|
const innerStyle = useMemo(() => ({
|
|
padding: PADDING_MAP[padding],
|
|
marginBottom: MARGIN_MAP[margin],
|
|
...style,
|
|
}), [padding, margin, style]);
|
|
|
|
const hasPress = !!onPress;
|
|
const cls = [
|
|
'content-card',
|
|
`content-card--${variant}`,
|
|
hasPress && 'content-card--pressable',
|
|
hasPress && activeFeedback !== 'none' && `content-card--feedback-${activeFeedback}`,
|
|
className,
|
|
].filter(Boolean).join(' ');
|
|
|
|
return (
|
|
<View className={cls} style={innerStyle} onClick={onPress}>
|
|
{children}
|
|
</View>
|
|
);
|
|
};
|
|
|
|
export default React.memo(ContentCard);
|