Complete rewrite of Scry using TypeScript stack:
- Expo/React Native with Expo Router (file-based routing)
- Convex backend (serverless functions + real-time database)
- Adaptive camera system (expo-camera in Expo Go, Vision Camera in production)
- React Native Skia + fast-opencv for image processing
- GDPR-compliant auth setup with Zitadel OIDC (pending configuration)
Key features:
- Card recognition pipeline ported to TypeScript
- Perceptual hashing (192-bit color pHash)
- CLAHE preprocessing for lighting normalization
- Local SQLite cache with Convex sync
- Collection management with offline support
Removes all .NET/MAUI code (src/, test/, tools/).
💘 Generated with Crush
Assisted-by: Claude Opus 4.5 via Crush <crush@charm.land>
58 lines
1.6 KiB
TypeScript
58 lines
1.6 KiB
TypeScript
import React from "react";
|
|
import FontAwesome from "@expo/vector-icons/FontAwesome";
|
|
import { Tabs } from "expo-router";
|
|
import { useColorScheme } from "@/components/useColorScheme";
|
|
import Colors from "@/constants/Colors";
|
|
|
|
function TabBarIcon(props: {
|
|
name: React.ComponentProps<typeof FontAwesome>["name"];
|
|
color: string;
|
|
}) {
|
|
return <FontAwesome size={24} style={{ marginBottom: -3 }} {...props} />;
|
|
}
|
|
|
|
export default function TabLayout() {
|
|
const colorScheme = useColorScheme();
|
|
|
|
return (
|
|
<Tabs
|
|
screenOptions={{
|
|
tabBarActiveTintColor: Colors[colorScheme ?? "light"].tint,
|
|
tabBarInactiveTintColor: "#888",
|
|
tabBarStyle: {
|
|
backgroundColor: colorScheme === "dark" ? "#1a1a1a" : "#fff",
|
|
borderTopColor: colorScheme === "dark" ? "#333" : "#eee",
|
|
},
|
|
headerStyle: {
|
|
backgroundColor: colorScheme === "dark" ? "#1a1a1a" : "#fff",
|
|
},
|
|
headerTintColor: colorScheme === "dark" ? "#fff" : "#000",
|
|
}}
|
|
>
|
|
<Tabs.Screen
|
|
name="index"
|
|
options={{
|
|
title: "Collection",
|
|
tabBarIcon: ({ color }) => (
|
|
<TabBarIcon name="th-large" color={color} />
|
|
),
|
|
}}
|
|
/>
|
|
<Tabs.Screen
|
|
name="scan"
|
|
options={{
|
|
title: "Scan",
|
|
headerShown: false,
|
|
tabBarIcon: ({ color }) => <TabBarIcon name="camera" color={color} />,
|
|
}}
|
|
/>
|
|
<Tabs.Screen
|
|
name="settings"
|
|
options={{
|
|
title: "Settings",
|
|
tabBarIcon: ({ color }) => <TabBarIcon name="cog" color={color} />,
|
|
}}
|
|
/>
|
|
</Tabs>
|
|
);
|
|
}
|