Web and App Development
I build exceptional web and mobile apps that people love to use. No boring templates, just custom solutions.
Web Development
App Development
Fast Delivery
import React, { useMemo } from 'react';
import { SafeAreaView } from 'react-native-safe-area-context';
import { useRouter } from 'expo-router';
import { FlatList, StyleSheet, Text, TouchableOpacity, View } from 'react-native';
import { ThemedText } from '@/components/themed-text';
import { paintingThemes, PaintingThemeId } from '../constants/paintingThemes';
type ThemeItem = { id: PaintingThemeId; colors: readonly string[] };
export default function Index() {
const router = useRouter();
const data = useMemo<ThemeItem[]>(
() => Object.entries(paintingThemes).map(([id, colors]) => ({ id: id as PaintingThemeId, colors })),
[]
);
const renderItem = ({ item }: { item: ThemeItem }) => {
const isHoliday = item.id === 'halloween';
const card = (
<TouchableOpacity
onPress={() => {
router.push({ pathname: '/paint' as any, params: { theme: item.id } });
}}
style={[styles.card, isHoliday && styles.holidayCard]}
activeOpacity={0.9}
>
{isHoliday && (
<View style={styles.holidayBanner}>
<Text style={styles.holidayBannerText}>Limited Holiday Theme!</Text>
</View>
)}
<ThemedText style={styles.cardTitle}>{item.id}</ThemedText>
<View style={styles.swatchRow}>
{item.colors.map((c) => (
<View key={c} style={[styles.swatch, { backgroundColor: c }]} />
))}
</View>
</TouchableOpacity>
);
if (!isHoliday) {
return card;
}
return <View style={styles.holidayWrapper}>{card}</View>;
};
return (
<SafeAreaView style={styles.safeArea} edges={['top', 'bottom']}>
<View style={styles.container}>
<ThemedText type="title" style={[styles.title, styles.titleBold]}>Pawcasso</ThemedText>
<ThemedText style={styles.subtitle}>Tap a theme to start</ThemedText>
<FlatList
data={data}
keyExtractor={(item) => item.id}
renderItem={renderItem}
contentContainerStyle={styles.listContent}
/>
</View>
</SafeAreaView>
);
}
import React, { useMemo } from 'react';
import { SafeAreaView } from 'react-native-safe-area-context';
import { useRouter } from 'expo-router';
import { FlatList, StyleSheet, Text, TouchableOpacity, View } from 'react-native';
import { ThemedText } from '@/components/themed-text';
import { paintingThemes, PaintingThemeId } from '../constants/paintingThemes';
type ThemeItem = { id: PaintingThemeId; colors: readonly string[] };
export default function Index() {
const router = useRouter();
const data = useMemo<ThemeItem[]>(
() => Object.entries(paintingThemes).map(([id, colors]) => ({ id: id as PaintingThemeId, colors })),
[]
);
const renderItem = ({ item }: { item: ThemeItem }) => {
const isHoliday = item.id === 'halloween';
const card = (
<TouchableOpacity
onPress={() => {
router.push({ pathname: '/paint' as any, params: { theme: item.id } });
}}
style={[styles.card, isHoliday && styles.holidayCard]}
activeOpacity={0.9}
>
{isHoliday && (
<View style={styles.holidayBanner}>
<Text style={styles.holidayBannerText}>Limited Holiday Theme!</Text>
</View>
)}
<ThemedText style={styles.cardTitle}>{item.id}</ThemedText>
<View style={styles.swatchRow}>
{item.colors.map((c) => (
<View key={c} style={[styles.swatch, { backgroundColor: c }]} />
))}
</View>
</TouchableOpacity>
);
if (!isHoliday) {
return card;
}
return <View style={styles.holidayWrapper}>{card}</View>;
};
return (
<SafeAreaView style={styles.safeArea} edges={['top', 'bottom']}>
<View style={styles.container}>
<ThemedText type="title" style={[styles.title, styles.titleBold]}>Pawcasso</ThemedText>
<ThemedText style={styles.subtitle}>Tap a theme to start</ThemedText>
<FlatList
data={data}
keyExtractor={(item) => item.id}
renderItem={renderItem}
contentContainerStyle={styles.listContent}
/>
</View>
</SafeAreaView>
);
}
