155 lines
4.9 KiB
TypeScript
155 lines
4.9 KiB
TypeScript
/**
|
|
* Example component demonstrating theme usage
|
|
* Shows different ways to use the theme system
|
|
*/
|
|
|
|
import React from "react";
|
|
import { View, Text, TouchableOpacity, ScrollView } from "react-native";
|
|
import { ThemedText } from "@/components/themed-text";
|
|
import { ThemedView } from "@/components/themed-view";
|
|
import { useAppTheme } from "@/hooks/use-app-theme";
|
|
import { useThemeColor } from "@/hooks/use-theme-color";
|
|
|
|
export function ThemeExampleComponent() {
|
|
const { colors, styles, utils } = useAppTheme();
|
|
|
|
// Example of using useThemeColor hook
|
|
const customTextColor = useThemeColor({}, "textSecondary");
|
|
const customBackgroundColor = useThemeColor({}, "surfaceSecondary");
|
|
|
|
return (
|
|
<ScrollView style={styles.container}>
|
|
<ThemedView style={styles.surface}>
|
|
<ThemedText type="title">Theme Examples</ThemedText>
|
|
|
|
{/* Using themed components */}
|
|
<ThemedText type="subtitle">Themed Components</ThemedText>
|
|
<ThemedView style={styles.card}>
|
|
<ThemedText>This is a themed text</ThemedText>
|
|
<ThemedText type="defaultSemiBold">
|
|
This is bold themed text
|
|
</ThemedText>
|
|
</ThemedView>
|
|
|
|
{/* Using theme colors directly */}
|
|
<ThemedText type="subtitle">Direct Color Usage</ThemedText>
|
|
<View
|
|
style={[styles.card, { borderColor: colors.primary, borderWidth: 2 }]}
|
|
>
|
|
<Text style={{ color: colors.text, fontSize: 16 }}>
|
|
Using colors.text directly
|
|
</Text>
|
|
<Text
|
|
style={{ color: colors.primary, fontSize: 14, fontWeight: "600" }}
|
|
>
|
|
Primary color text
|
|
</Text>
|
|
</View>
|
|
|
|
{/* Using pre-styled components */}
|
|
<ThemedText type="subtitle">Pre-styled Components</ThemedText>
|
|
<View style={styles.card}>
|
|
<TouchableOpacity style={styles.primaryButton}>
|
|
<Text style={styles.primaryButtonText}>Primary Button</Text>
|
|
</TouchableOpacity>
|
|
|
|
<TouchableOpacity style={styles.secondaryButton}>
|
|
<Text style={styles.secondaryButtonText}>Secondary Button</Text>
|
|
</TouchableOpacity>
|
|
</View>
|
|
|
|
{/* Status containers */}
|
|
<ThemedText type="subtitle">Status Indicators</ThemedText>
|
|
<View style={styles.card}>
|
|
<View style={styles.successContainer}>
|
|
<Text style={{ color: colors.success, fontWeight: "600" }}>
|
|
Success Message
|
|
</Text>
|
|
</View>
|
|
|
|
<View style={styles.warningContainer}>
|
|
<Text style={{ color: colors.warning, fontWeight: "600" }}>
|
|
Warning Message
|
|
</Text>
|
|
</View>
|
|
|
|
<View style={styles.errorContainer}>
|
|
<Text style={{ color: colors.error, fontWeight: "600" }}>
|
|
Error Message
|
|
</Text>
|
|
</View>
|
|
</View>
|
|
|
|
{/* Using opacity colors */}
|
|
<ThemedText type="subtitle">Opacity Colors</ThemedText>
|
|
<View style={styles.card}>
|
|
<View
|
|
style={[
|
|
styles.surface,
|
|
{ backgroundColor: utils.getOpacityColor("primary", 0.1) },
|
|
]}
|
|
>
|
|
<Text style={{ color: colors.primary }}>
|
|
Primary with 10% opacity background
|
|
</Text>
|
|
</View>
|
|
|
|
<View
|
|
style={[
|
|
styles.surface,
|
|
{ backgroundColor: utils.getOpacityColor("error", 0.2) },
|
|
]}
|
|
>
|
|
<Text style={{ color: colors.error }}>
|
|
Error with 20% opacity background
|
|
</Text>
|
|
</View>
|
|
</View>
|
|
|
|
{/* Theme utilities */}
|
|
<ThemedText type="subtitle">Theme Utilities</ThemedText>
|
|
<View style={styles.card}>
|
|
<Text style={{ color: colors.text }}>
|
|
Is Dark Mode: {utils.isDark ? "Yes" : "No"}
|
|
</Text>
|
|
<Text style={{ color: colors.text }}>
|
|
Is Light Mode: {utils.isLight ? "Yes" : "No"}
|
|
</Text>
|
|
|
|
<TouchableOpacity
|
|
style={[styles.primaryButton, { marginTop: 10 }]}
|
|
onPress={utils.toggleTheme}
|
|
>
|
|
<Text style={styles.primaryButtonText}>
|
|
Toggle Theme (Light/Dark)
|
|
</Text>
|
|
</TouchableOpacity>
|
|
</View>
|
|
|
|
{/* Custom themed component example */}
|
|
<ThemedText type="subtitle">Custom Component</ThemedText>
|
|
<View
|
|
style={[
|
|
styles.card,
|
|
{
|
|
backgroundColor: customBackgroundColor,
|
|
borderColor: colors.border,
|
|
borderWidth: 1,
|
|
},
|
|
]}
|
|
>
|
|
<Text
|
|
style={{
|
|
color: customTextColor,
|
|
fontSize: 16,
|
|
textAlign: "center",
|
|
}}
|
|
>
|
|
Custom component using useThemeColor
|
|
</Text>
|
|
</View>
|
|
</ThemedView>
|
|
</ScrollView>
|
|
);
|
|
}
|