diff --git a/app/(tabs)/_layout.tsx b/app/(tabs)/_layout.tsx index 97bb5fc..465f803 100644 --- a/app/(tabs)/_layout.tsx +++ b/app/(tabs)/_layout.tsx @@ -1,6 +1,72 @@ -import "@/global.css"; +import { tabs } from "@/constants/data"; +import clsx from "clsx"; import { Tabs } from "expo-router"; +import { Image, View } from "react-native"; +import { useSafeAreaInsets } from "react-native-safe-area-context"; -export default function RootLayout() { - return ; -} +import { COLORS, COMPONENTS } from "@/constants/theme"; + +const tabBar = COMPONENTS.tabBar; + +const TabIcon = ({ focused, icon }: TabIconProps) => { + return ( + + + + + + ); +}; + +const TabsLayout = () => { + const insets = useSafeAreaInsets(); + + return ( + + {tabs.map((item) => ( + ( + + ), + }} + /> + ))} + + + + ); +}; + +export default TabsLayout; diff --git a/app/(tabs)/index.tsx b/app/(tabs)/index.tsx index c7752ad..67e9bda 100644 --- a/app/(tabs)/index.tsx +++ b/app/(tabs)/index.tsx @@ -1,10 +1,14 @@ import "@/global.css"; import { Link } from "expo-router"; -import { Text, View } from "react-native"; +import { styled } from "nativewind"; +import { Text } from "react-native"; +import { SafeAreaView as RNSafeAreaView } from "react-native-safe-area-context"; + +const SafeAreaView = styled(RNSafeAreaView); export default function App() { return ( - + Welcome to Nativewind! @@ -23,11 +27,11 @@ export default function App() { {/* Subscription Examples */} Claude Max Subscription - + ); } diff --git a/app/(tabs)/insights.tsx b/app/(tabs)/insights.tsx index c003366..2e5d760 100644 --- a/app/(tabs)/insights.tsx +++ b/app/(tabs)/insights.tsx @@ -1,11 +1,15 @@ +import { styled } from "nativewind"; import React from "react"; -import { Text, View } from "react-native"; +import { Text } from "react-native"; +import { SafeAreaView as RNSafeAreaView } from "react-native-safe-area-context"; + +const SafeAreaView = styled(RNSafeAreaView); const Insights = () => { return ( - + Insights - + ); }; diff --git a/app/(tabs)/settings.tsx b/app/(tabs)/settings.tsx index 917f56e..80f616a 100644 --- a/app/(tabs)/settings.tsx +++ b/app/(tabs)/settings.tsx @@ -1,11 +1,15 @@ +import { styled } from "nativewind"; import React from "react"; -import { Text, View } from "react-native"; +import { Text } from "react-native"; +import { SafeAreaView as RNSafeAreaView } from "react-native-safe-area-context"; + +const SafeAreaView = styled(RNSafeAreaView); const Settings = () => { return ( - + Settings - + ); }; diff --git a/app/(tabs)/subscriptions.tsx b/app/(tabs)/subscriptions.tsx index 82b7c39..4c8e2a1 100644 --- a/app/(tabs)/subscriptions.tsx +++ b/app/(tabs)/subscriptions.tsx @@ -1,11 +1,15 @@ +import { styled } from "nativewind"; import React from "react"; -import { Text, View } from "react-native"; +import { Text } from "react-native"; +import { SafeAreaView as RNSafeAreaView } from "react-native-safe-area-context"; + +const SafeAreaView = styled(RNSafeAreaView); const Subscriptions = () => { return ( - + Subscriptions - + ); }; diff --git a/app/(tabs)/subscriptions/[id].tsx b/app/subscriptions/[id].tsx similarity index 100% rename from app/(tabs)/subscriptions/[id].tsx rename to app/subscriptions/[id].tsx diff --git a/assets/expo.icon/Assets/expo-symbol 2.svg b/assets/expo.icon/Assets/expo-symbol 2.svg new file mode 100644 index 0000000..51d3676 --- /dev/null +++ b/assets/expo.icon/Assets/expo-symbol 2.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/expo.icon/Assets/grid.png b/assets/expo.icon/Assets/grid.png new file mode 100644 index 0000000..eefea24 Binary files /dev/null and b/assets/expo.icon/Assets/grid.png differ diff --git a/assets/expo.icon/icon.json b/assets/expo.icon/icon.json new file mode 100644 index 0000000..7a2c33c --- /dev/null +++ b/assets/expo.icon/icon.json @@ -0,0 +1,40 @@ +{ + "fill" : { + "automatic-gradient" : "extended-srgb:0.00000,0.47843,1.00000,1.00000" + }, + "groups" : [ + { + "layers" : [ + { + "image-name" : "expo-symbol 2.svg", + "name" : "expo-symbol 2", + "position" : { + "scale" : 1, + "translation-in-points" : [ + 1.1008400065293245e-05, + -16.046875 + ] + } + }, + { + "image-name" : "grid.png", + "name" : "grid" + } + ], + "shadow" : { + "kind" : "neutral", + "opacity" : 0.5 + }, + "translucency" : { + "enabled" : true, + "value" : 0.5 + } + } + ], + "supported-platforms" : { + "circles" : [ + "watchOS" + ], + "squares" : "shared" + } +} \ No newline at end of file diff --git a/assets/fonts/PlusJakartaSans-Bold.ttf b/assets/fonts/PlusJakartaSans-Bold.ttf new file mode 100644 index 0000000..0ff3da5 Binary files /dev/null and b/assets/fonts/PlusJakartaSans-Bold.ttf differ diff --git a/assets/fonts/PlusJakartaSans-ExtraBold.ttf b/assets/fonts/PlusJakartaSans-ExtraBold.ttf new file mode 100644 index 0000000..d22fa69 Binary files /dev/null and b/assets/fonts/PlusJakartaSans-ExtraBold.ttf differ diff --git a/assets/fonts/PlusJakartaSans-Light.ttf b/assets/fonts/PlusJakartaSans-Light.ttf new file mode 100644 index 0000000..2faaa67 Binary files /dev/null and b/assets/fonts/PlusJakartaSans-Light.ttf differ diff --git a/assets/fonts/PlusJakartaSans-Medium.ttf b/assets/fonts/PlusJakartaSans-Medium.ttf new file mode 100644 index 0000000..f72e9c8 Binary files /dev/null and b/assets/fonts/PlusJakartaSans-Medium.ttf differ diff --git a/assets/fonts/PlusJakartaSans-Regular.ttf b/assets/fonts/PlusJakartaSans-Regular.ttf new file mode 100644 index 0000000..a68ad8d Binary files /dev/null and b/assets/fonts/PlusJakartaSans-Regular.ttf differ diff --git a/assets/fonts/PlusJakartaSans-SemiBold.ttf b/assets/fonts/PlusJakartaSans-SemiBold.ttf new file mode 100644 index 0000000..e675450 Binary files /dev/null and b/assets/fonts/PlusJakartaSans-SemiBold.ttf differ diff --git a/assets/icons/activity.png b/assets/icons/activity.png new file mode 100644 index 0000000..7d5ac44 Binary files /dev/null and b/assets/icons/activity.png differ diff --git a/assets/icons/add.png b/assets/icons/add.png new file mode 100644 index 0000000..b13baea Binary files /dev/null and b/assets/icons/add.png differ diff --git a/assets/icons/adobe.png b/assets/icons/adobe.png new file mode 100644 index 0000000..4e7dbac Binary files /dev/null and b/assets/icons/adobe.png differ diff --git a/assets/icons/back.png b/assets/icons/back.png new file mode 100644 index 0000000..01c9de4 Binary files /dev/null and b/assets/icons/back.png differ diff --git a/assets/icons/canva.png b/assets/icons/canva.png new file mode 100644 index 0000000..4062f0b Binary files /dev/null and b/assets/icons/canva.png differ diff --git a/assets/icons/claude.png b/assets/icons/claude.png new file mode 100644 index 0000000..f3a08b1 Binary files /dev/null and b/assets/icons/claude.png differ diff --git a/assets/icons/dropbox.png b/assets/icons/dropbox.png new file mode 100644 index 0000000..80623b7 Binary files /dev/null and b/assets/icons/dropbox.png differ diff --git a/assets/icons/figma.png b/assets/icons/figma.png new file mode 100644 index 0000000..7f74f8c Binary files /dev/null and b/assets/icons/figma.png differ diff --git a/assets/icons/github.png b/assets/icons/github.png new file mode 100644 index 0000000..9ab430e Binary files /dev/null and b/assets/icons/github.png differ diff --git a/assets/icons/home.png b/assets/icons/home.png new file mode 100644 index 0000000..e565dac Binary files /dev/null and b/assets/icons/home.png differ diff --git a/assets/icons/logo.png b/assets/icons/logo.png new file mode 100644 index 0000000..b6db5d5 Binary files /dev/null and b/assets/icons/logo.png differ diff --git a/assets/icons/medium.png b/assets/icons/medium.png new file mode 100644 index 0000000..b0915c6 Binary files /dev/null and b/assets/icons/medium.png differ diff --git a/assets/icons/menu.png b/assets/icons/menu.png new file mode 100644 index 0000000..bc7157c Binary files /dev/null and b/assets/icons/menu.png differ diff --git a/assets/icons/netflix.png b/assets/icons/netflix.png new file mode 100644 index 0000000..21504ea Binary files /dev/null and b/assets/icons/netflix.png differ diff --git a/assets/icons/notion.png b/assets/icons/notion.png new file mode 100644 index 0000000..b3c2195 Binary files /dev/null and b/assets/icons/notion.png differ diff --git a/assets/icons/openai.png b/assets/icons/openai.png new file mode 100644 index 0000000..d04446b Binary files /dev/null and b/assets/icons/openai.png differ diff --git a/assets/icons/plus.png b/assets/icons/plus.png new file mode 100644 index 0000000..b13baea Binary files /dev/null and b/assets/icons/plus.png differ diff --git a/assets/icons/setting.png b/assets/icons/setting.png new file mode 100644 index 0000000..bd7d6a2 Binary files /dev/null and b/assets/icons/setting.png differ diff --git a/assets/icons/spotify.png b/assets/icons/spotify.png new file mode 100644 index 0000000..0fa0215 Binary files /dev/null and b/assets/icons/spotify.png differ diff --git a/assets/icons/wallet.png b/assets/icons/wallet.png new file mode 100644 index 0000000..8e36172 Binary files /dev/null and b/assets/icons/wallet.png differ diff --git a/assets/images/avatar.png b/assets/images/avatar.png new file mode 100644 index 0000000..f841c71 Binary files /dev/null and b/assets/images/avatar.png differ diff --git a/assets/images/expo-badge-white.png b/assets/images/expo-badge-white.png new file mode 100644 index 0000000..2863067 Binary files /dev/null and b/assets/images/expo-badge-white.png differ diff --git a/assets/images/expo-badge.png b/assets/images/expo-badge.png new file mode 100644 index 0000000..5d5c5bb Binary files /dev/null and b/assets/images/expo-badge.png differ diff --git a/assets/images/expo-logo.png b/assets/images/expo-logo.png new file mode 100644 index 0000000..6b1642a Binary files /dev/null and b/assets/images/expo-logo.png differ diff --git a/assets/images/icon.png b/assets/images/icon.png index 7165a53..67c777a 100644 Binary files a/assets/images/icon.png and b/assets/images/icon.png differ diff --git a/assets/images/logo-glow.png b/assets/images/logo-glow.png new file mode 100644 index 0000000..edc99be Binary files /dev/null and b/assets/images/logo-glow.png differ diff --git a/assets/images/partial-react-logo.png b/assets/images/partial-react-logo.png deleted file mode 100644 index 66fd957..0000000 Binary files a/assets/images/partial-react-logo.png and /dev/null differ diff --git a/assets/images/splash-icon.png b/assets/images/splash-icon.png index 03d6f6b..6b1642a 100644 Binary files a/assets/images/splash-icon.png and b/assets/images/splash-icon.png differ diff --git a/assets/images/splash-pattern.png b/assets/images/splash-pattern.png new file mode 100644 index 0000000..03c846d Binary files /dev/null and b/assets/images/splash-pattern.png differ diff --git a/assets/images/tabIcons/explore.png b/assets/images/tabIcons/explore.png new file mode 100644 index 0000000..73d8258 Binary files /dev/null and b/assets/images/tabIcons/explore.png differ diff --git a/assets/images/tabIcons/explore@2x.png b/assets/images/tabIcons/explore@2x.png new file mode 100644 index 0000000..21b9bd2 Binary files /dev/null and b/assets/images/tabIcons/explore@2x.png differ diff --git a/assets/images/tabIcons/explore@3x.png b/assets/images/tabIcons/explore@3x.png new file mode 100644 index 0000000..422202d Binary files /dev/null and b/assets/images/tabIcons/explore@3x.png differ diff --git a/assets/images/tabIcons/home.png b/assets/images/tabIcons/home.png new file mode 100644 index 0000000..ad5699c Binary files /dev/null and b/assets/images/tabIcons/home.png differ diff --git a/assets/images/tabIcons/home@2x.png b/assets/images/tabIcons/home@2x.png new file mode 100644 index 0000000..22a1f2c Binary files /dev/null and b/assets/images/tabIcons/home@2x.png differ diff --git a/assets/images/tabIcons/home@3x.png b/assets/images/tabIcons/home@3x.png new file mode 100644 index 0000000..f5d1f9a Binary files /dev/null and b/assets/images/tabIcons/home@3x.png differ diff --git a/assets/images/tutorial-web.png b/assets/images/tutorial-web.png new file mode 100644 index 0000000..e4a8c58 Binary files /dev/null and b/assets/images/tutorial-web.png differ diff --git a/constants/data.ts b/constants/data.ts new file mode 100644 index 0000000..70fa413 --- /dev/null +++ b/constants/data.ts @@ -0,0 +1,8 @@ +import icons from "./icons"; + +export const tabs = [ + { name: "index", title: "Home", icon: icons.home }, + { name: "subscriptions", title: "Subscriptions", icon: icons.wallet }, + { name: "insights", title: "Insights", icon: icons.activity }, + { name: "settings", title: "Settings", icon: icons.setting }, +]; diff --git a/constants/icons.ts b/constants/icons.ts new file mode 100644 index 0000000..cfe9525 --- /dev/null +++ b/constants/icons.ts @@ -0,0 +1,66 @@ +import activity from "@/assets/icons/activity.png"; +import add from "@/assets/icons/add.png"; +import adobe from "@/assets/icons/adobe.png"; +import back from "@/assets/icons/back.png"; +import canva from "@/assets/icons/canva.png"; +import claude from "@/assets/icons/claude.png"; +import dropbox from "@/assets/icons/dropbox.png"; +import figma from "@/assets/icons/figma.png"; +import github from "@/assets/icons/github.png"; +import home from "@/assets/icons/home.png"; +import logo from "@/assets/icons/logo.png"; +import medium from "@/assets/icons/medium.png"; +import menu from "@/assets/icons/menu.png"; +import netflix from "@/assets/icons/netflix.png"; +import notion from "@/assets/icons/notion.png"; +import openai from "@/assets/icons/openai.png"; +import plus from "@/assets/icons/plus.png"; +import setting from "@/assets/icons/setting.png"; +import spotify from "@/assets/icons/spotify.png"; +import wallet from "@/assets/icons/wallet.png"; + +export { + activity, + add, + adobe, + back, + canva, + claude, + dropbox, + figma, + github, + home, + logo, + medium, + menu, + netflix, + notion, + openai, + plus, + setting, + spotify, + wallet +}; + +export default { + activity, + add, + adobe, + back, + canva, + claude, + dropbox, + figma, + github, + home, + logo, + medium, + menu, + netflix, + notion, + openai, + plus, + setting, + spotify, + wallet, +}; diff --git a/constants/theme.ts b/constants/theme.ts new file mode 100644 index 0000000..e9e804f --- /dev/null +++ b/constants/theme.ts @@ -0,0 +1,52 @@ + +export const COLORS = { + background: "#fff9e3", + foreground: "#081126", + card: "#fff8e7", + muted: "#f6eecf", + mutedForeground: "rgba(0, 0, 0, 0.6)", + primary: "#081126", + accent: "#ea7a53", + border: "rgba(0, 0, 0, 0.1)", + success: "#16a34a", + destructive: "#dc2626", + subscription: "#8fd1bd", +} as const; + +export const SPACING = { + 0: 0, + 1: 4, + 2: 8, + 3: 12, + 4: 16, + 5: 20, + 6: 24, + 7: 28, + 8: 32, + 9: 36, + 10: 40, + 11: 44, + 12: 48, + 14: 56, + 16: 64, + 18: 72, + 20: 80, + 24: 96, + 30: 120, +} as const; + +export const COMPONENTS = { + tabBar: { + height: SPACING[18], + horizontalInset: SPACING[5], + radius: SPACING[8], + iconFrame: SPACING[12], + itemPaddingVertical: SPACING[2], + }, +} as const; + +export const theme = { + colors: COLORS, + spacing: SPACING, + components: COMPONENTS, +} as const; diff --git a/image.d.ts b/image.d.ts new file mode 100644 index 0000000..bb75dcc --- /dev/null +++ b/image.d.ts @@ -0,0 +1,24 @@ +declare module "*.png" { + const value: any; + export default value; +} + +declare module "*.jpg" { + const value: any; + export default value; +} + +declare module "*.jpeg" { + const value: any; + export default value; +} + +declare module "*.gif" { + const value: any; + export default value; +} + +declare module "*.svg" { + const value: any; + export default value; +} diff --git a/package-lock.json b/package-lock.json index 5c4f4e5..fe31480 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "@react-navigation/bottom-tabs": "^7.4.0", "@react-navigation/elements": "^2.6.3", "@react-navigation/native": "^7.1.8", + "clsx": "^2.1.1", "expo": "~54.0.34", "expo-constants": "~18.0.13", "expo-font": "~14.0.11", @@ -5647,6 +5648,15 @@ "node": ">=0.8" } }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/color": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", diff --git a/package.json b/package.json index 8be0b84..54b450d 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "@react-navigation/bottom-tabs": "^7.4.0", "@react-navigation/elements": "^2.6.3", "@react-navigation/native": "^7.1.8", + "clsx": "^2.1.1", "expo": "~54.0.34", "expo-constants": "~18.0.13", "expo-font": "~14.0.11", diff --git a/type.d.ts b/type.d.ts new file mode 100644 index 0000000..58c2ad7 --- /dev/null +++ b/type.d.ts @@ -0,0 +1,8 @@ +import { ImageSourcePropType } from "react-native"; + +declare global { + interface TabIconProps { + focused: boolean; + icon: ImageSourcePropType; + } +}