|
|
|
|
|
/**
|
|
|
|
|
|
* 主题演示组件
|
|
|
|
|
|
*
|
|
|
|
|
|
* 展示所有主题颜色和组件在不同主题下的效果
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
import React from 'react';
|
|
|
|
|
|
import { StyleSheet, View, Text, TouchableOpacity, ScrollView } from 'react-native';
|
|
|
|
|
|
import { ThemedText, ThemedView, useThemeColor } from './Themed';
|
|
|
|
|
|
import { useTheme, useSettingsActions } from '@/stores';
|
|
|
|
|
|
import { useHaptics } from '@/hooks';
|
|
|
|
|
|
|
|
|
|
|
|
export function ThemeDemo() {
|
|
|
|
|
|
const theme = useTheme();
|
|
|
|
|
|
const { setTheme } = useSettingsActions();
|
|
|
|
|
|
const haptics = useHaptics();
|
|
|
|
|
|
|
|
|
|
|
|
// 获取主题颜色
|
|
|
|
|
|
const primary = useThemeColor({}, 'primary');
|
|
|
|
|
|
const secondary = useThemeColor({}, 'secondary');
|
|
|
|
|
|
const success = useThemeColor({}, 'success');
|
|
|
|
|
|
const warning = useThemeColor({}, 'warning');
|
|
|
|
|
|
const error = useThemeColor({}, 'error');
|
|
|
|
|
|
const info = useThemeColor({}, 'info');
|
|
|
|
|
|
const border = useThemeColor({}, 'border');
|
|
|
|
|
|
const card = useThemeColor({}, 'card');
|
|
|
|
|
|
const textSecondary = useThemeColor({}, 'textSecondary');
|
|
|
|
|
|
|
|
|
|
|
|
const handleThemeChange = (newTheme: 'light' | 'dark' | 'auto') => {
|
|
|
|
|
|
haptics.selection();
|
|
|
|
|
|
console.log('🎨 Changing theme to:', newTheme);
|
|
|
|
|
|
setTheme(newTheme);
|
|
|
|
|
|
console.log('🎨 Theme colors after change:', { primary, secondary, background: card });
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
|
<ThemedView style={styles.container}>
|
|
|
|
|
|
<ScrollView>
|
|
|
|
|
|
{/* 主题切换器 */}
|
|
|
|
|
|
<View style={styles.section}>
|
|
|
|
|
|
<ThemedText type="subtitle">主题切换</ThemedText>
|
|
|
|
|
|
<View style={styles.themeButtons}>
|
|
|
|
|
|
<TouchableOpacity
|
|
|
|
|
|
style={[
|
|
|
|
|
|
styles.themeButton,
|
|
|
|
|
|
{ borderColor: border },
|
|
|
|
|
|
theme === 'light' && { backgroundColor: primary },
|
|
|
|
|
|
]}
|
|
|
|
|
|
onPress={() => handleThemeChange('light')}
|
|
|
|
|
|
>
|
|
|
|
|
|
<Text style={[styles.themeButtonText, theme === 'light' && styles.activeButtonText]}>
|
|
|
|
|
|
☀️ 浅色
|
|
|
|
|
|
</Text>
|
|
|
|
|
|
</TouchableOpacity>
|
|
|
|
|
|
|
|
|
|
|
|
<TouchableOpacity
|
|
|
|
|
|
style={[
|
|
|
|
|
|
styles.themeButton,
|
|
|
|
|
|
{ borderColor: border },
|
|
|
|
|
|
theme === 'dark' && { backgroundColor: primary },
|
|
|
|
|
|
]}
|
|
|
|
|
|
onPress={() => handleThemeChange('dark')}
|
|
|
|
|
|
>
|
|
|
|
|
|
<Text style={[styles.themeButtonText, theme === 'dark' && styles.activeButtonText]}>
|
|
|
|
|
|
🌙 深色
|
|
|
|
|
|
</Text>
|
|
|
|
|
|
</TouchableOpacity>
|
|
|
|
|
|
|
|
|
|
|
|
<TouchableOpacity
|
|
|
|
|
|
style={[
|
|
|
|
|
|
styles.themeButton,
|
|
|
|
|
|
{ borderColor: border },
|
|
|
|
|
|
theme === 'auto' && { backgroundColor: primary },
|
|
|
|
|
|
]}
|
|
|
|
|
|
onPress={() => handleThemeChange('auto')}
|
|
|
|
|
|
>
|
|
|
|
|
|
<Text style={[styles.themeButtonText, theme === 'auto' && styles.activeButtonText]}>
|
|
|
|
|
|
🔄 自动
|
|
|
|
|
|
</Text>
|
|
|
|
|
|
</TouchableOpacity>
|
|
|
|
|
|
</View>
|
|
|
|
|
|
<ThemedText style={styles.hint}>
|
|
|
|
|
|
当前主题: {theme === 'light' ? '浅色' : theme === 'dark' ? '深色' : '自动'}
|
|
|
|
|
|
</ThemedText>
|
|
|
|
|
|
</View>
|
|
|
|
|
|
|
|
|
|
|
|
{/* 文本样式 */}
|
|
|
|
|
|
<View style={styles.section}>
|
|
|
|
|
|
<ThemedText type="subtitle">文本样式</ThemedText>
|
|
|
|
|
|
<ThemedText type="title">标题文本 (Title)</ThemedText>
|
|
|
|
|
|
<ThemedText type="subtitle">副标题文本 (Subtitle)</ThemedText>
|
|
|
|
|
|
<ThemedText type="defaultSemiBold">加粗文本 (SemiBold)</ThemedText>
|
|
|
|
|
|
<ThemedText type="default">默认文本 (Default)</ThemedText>
|
|
|
|
|
|
<ThemedText type="link">链接文本 (Link)</ThemedText>
|
|
|
|
|
|
</View>
|
|
|
|
|
|
|
|
|
|
|
|
{/* 颜色展示 */}
|
|
|
|
|
|
<View style={styles.section}>
|
|
|
|
|
|
<ThemedText type="subtitle">主题颜色</ThemedText>
|
|
|
|
|
|
<View style={styles.colorGrid}>
|
|
|
|
|
|
<View style={styles.colorItem}>
|
|
|
|
|
|
<View style={[styles.colorBox, { backgroundColor: primary }]} />
|
|
|
|
|
|
<ThemedText style={styles.colorLabel}>Primary</ThemedText>
|
|
|
|
|
|
</View>
|
|
|
|
|
|
<View style={styles.colorItem}>
|
|
|
|
|
|
<View style={[styles.colorBox, { backgroundColor: secondary }]} />
|
|
|
|
|
|
<ThemedText style={styles.colorLabel}>Secondary</ThemedText>
|
|
|
|
|
|
</View>
|
|
|
|
|
|
<View style={styles.colorItem}>
|
|
|
|
|
|
<View style={[styles.colorBox, { backgroundColor: success }]} />
|
|
|
|
|
|
<ThemedText style={styles.colorLabel}>Success</ThemedText>
|
|
|
|
|
|
</View>
|
|
|
|
|
|
<View style={styles.colorItem}>
|
|
|
|
|
|
<View style={[styles.colorBox, { backgroundColor: warning }]} />
|
|
|
|
|
|
<ThemedText style={styles.colorLabel}>Warning</ThemedText>
|
|
|
|
|
|
</View>
|
|
|
|
|
|
<View style={styles.colorItem}>
|
|
|
|
|
|
<View style={[styles.colorBox, { backgroundColor: error }]} />
|
|
|
|
|
|
<ThemedText style={styles.colorLabel}>Error</ThemedText>
|
|
|
|
|
|
</View>
|
|
|
|
|
|
<View style={styles.colorItem}>
|
|
|
|
|
|
<View style={[styles.colorBox, { backgroundColor: info }]} />
|
|
|
|
|
|
<ThemedText style={styles.colorLabel}>Info</ThemedText>
|
|
|
|
|
|
</View>
|
|
|
|
|
|
</View>
|
|
|
|
|
|
</View>
|
|
|
|
|
|
|
|
|
|
|
|
{/* 卡片示例 */}
|
|
|
|
|
|
<View style={styles.section}>
|
|
|
|
|
|
<ThemedText type="subtitle">卡片组件</ThemedText>
|
|
|
|
|
|
<View style={[styles.card, { backgroundColor: card, borderColor: border }]}>
|
|
|
|
|
|
<ThemedText type="defaultSemiBold">卡片标题</ThemedText>
|
|
|
|
|
|
<ThemedText style={{ color: textSecondary }}>
|
|
|
|
|
|
这是一个卡片组件示例,会根据主题自动调整颜色
|
|
|
|
|
|
</ThemedText>
|
|
|
|
|
|
</View>
|
|
|
|
|
|
</View>
|
|
|
|
|
|
|
|
|
|
|
|
{/* 按钮示例 */}
|
|
|
|
|
|
<View style={styles.section}>
|
|
|
|
|
|
<ThemedText type="subtitle">按钮组件</ThemedText>
|
|
|
|
|
|
<TouchableOpacity style={[styles.button, { backgroundColor: primary }]}>
|
|
|
|
|
|
<Text style={styles.buttonText}>Primary Button</Text>
|
|
|
|
|
|
</TouchableOpacity>
|
|
|
|
|
|
<TouchableOpacity style={[styles.button, { backgroundColor: secondary }]}>
|
|
|
|
|
|
<Text style={styles.buttonText}>Secondary Button</Text>
|
|
|
|
|
|
</TouchableOpacity>
|
|
|
|
|
|
<TouchableOpacity style={[styles.button, { backgroundColor: success }]}>
|
|
|
|
|
|
<Text style={styles.buttonText}>Success Button</Text>
|
|
|
|
|
|
</TouchableOpacity>
|
|
|
|
|
|
<TouchableOpacity style={[styles.button, { backgroundColor: error }]}>
|
|
|
|
|
|
<Text style={styles.buttonText}>Error Button</Text>
|
|
|
|
|
|
</TouchableOpacity>
|
|
|
|
|
|
</View>
|
|
|
|
|
|
</ScrollView>
|
|
|
|
|
|
</ThemedView>
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const styles = StyleSheet.create({
|
|
|
|
|
|
container: {
|
|
|
|
|
|
flex: 1,
|
|
|
|
|
|
padding: 16,
|
|
|
|
|
|
},
|
|
|
|
|
|
section: {
|
|
|
|
|
|
marginBottom: 24,
|
|
|
|
|
|
},
|
|
|
|
|
|
themeButtons: {
|
|
|
|
|
|
flexDirection: 'row',
|
|
|
|
|
|
gap: 12,
|
|
|
|
|
|
marginTop: 12,
|
|
|
|
|
|
},
|
|
|
|
|
|
themeButton: {
|
|
|
|
|
|
flex: 1,
|
|
|
|
|
|
paddingVertical: 12,
|
|
|
|
|
|
paddingHorizontal: 16,
|
|
|
|
|
|
borderRadius: 8,
|
|
|
|
|
|
borderWidth: 1,
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
},
|
|
|
|
|
|
themeButtonText: {
|
|
|
|
|
|
fontSize: 14,
|
|
|
|
|
|
fontWeight: '600',
|
|
|
|
|
|
},
|
|
|
|
|
|
activeButtonText: {
|
|
|
|
|
|
color: '#FFFFFF',
|
|
|
|
|
|
},
|
|
|
|
|
|
hint: {
|
|
|
|
|
|
marginTop: 8,
|
|
|
|
|
|
fontSize: 12,
|
|
|
|
|
|
opacity: 0.7,
|
|
|
|
|
|
},
|
|
|
|
|
|
colorGrid: {
|
|
|
|
|
|
flexDirection: 'row',
|
|
|
|
|
|
flexWrap: 'wrap',
|
|
|
|
|
|
gap: 16,
|
|
|
|
|
|
marginTop: 12,
|
|
|
|
|
|
},
|
|
|
|
|
|
colorItem: {
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
width: 80,
|
|
|
|
|
|
},
|
|
|
|
|
|
colorBox: {
|
|
|
|
|
|
width: 60,
|
|
|
|
|
|
height: 60,
|
|
|
|
|
|
borderRadius: 8,
|
|
|
|
|
|
marginBottom: 8,
|
|
|
|
|
|
},
|
|
|
|
|
|
colorLabel: {
|
|
|
|
|
|
fontSize: 12,
|
|
|
|
|
|
textAlign: 'center',
|
|
|
|
|
|
},
|
|
|
|
|
|
card: {
|
|
|
|
|
|
padding: 16,
|
|
|
|
|
|
borderRadius: 12,
|
|
|
|
|
|
borderWidth: 1,
|
|
|
|
|
|
marginTop: 12,
|
|
|
|
|
|
},
|
|
|
|
|
|
button: {
|
|
|
|
|
|
paddingVertical: 12,
|
|
|
|
|
|
paddingHorizontal: 24,
|
|
|
|
|
|
borderRadius: 8,
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
marginTop: 12,
|
|
|
|
|
|
},
|
|
|
|
|
|
buttonText: {
|
|
|
|
|
|
color: '#FFFFFF',
|
|
|
|
|
|
fontSize: 16,
|
|
|
|
|
|
fontWeight: '600',
|
|
|
|
|
|
},
|
|
|
|
|
|
});
|
|
|
|
|
|
|