diff --git a/App.tsx b/App.tsx index 919bdfc..5676491 100644 --- a/App.tsx +++ b/App.tsx @@ -1,36 +1,39 @@ - import React, { useEffect } from 'react'; import { StyleSheet, useColorScheme } from 'react-native'; import { SafeAreaProvider } from 'react-native-safe-area-context'; import { PaperProvider } from 'react-native-paper'; import AppNavigator from './src/navigation/AppNavigator'; import notifee from '@notifee/react-native'; -import { backgroundHandler, foregroundListener, requestPermission, setupFirebaseHandlers, setupNotificationPressHandlers, tokenRefreshHandler } from './src/utils/firebase/firebaseServices'; + +import { + backgroundHandler, + foregroundListener, + requestPermission, + setupFirebaseHandlers, + setupNotificationPressHandlers, + tokenRefreshHandler, +} from './src/utils/firebase/firebaseServices'; + + +import { dark, light } from './src/theme/theme'; +import { ThemeProvider} from './src/theme/ThemeProvider'; function App() { - const isDarkMode = useColorScheme() === 'dark'; - + useEffect(() => { - // 🔹 Ask for permission requestPermission(); - - // 🔹 Handle background + quit state backgroundHandler(); - setupFirebaseHandlers() - setupNotificationPressHandlers() + setupFirebaseHandlers(); + setupNotificationPressHandlers(); - // 🔹 Listen for foreground messages const unsubscribe = foregroundListener(); - - // 🔹 Listen for token refresh const unsubscribeRefresh = tokenRefreshHandler(); - // 🔹 Create default notification channel (Android) notifee.createChannel({ id: 'default', name: 'Default Channel', - importance: 4, // HIGH + importance: 4, }); return () => { @@ -39,19 +42,23 @@ function App() { }; }, []); + + return ( - - - + + + + + ); } +export default App; + const styles = StyleSheet.create({ container: { flex: 1, }, }); - -export default App; diff --git a/android/app/src/main/assets/fonts/Nunito-Black.ttf b/android/app/src/main/assets/fonts/Nunito-Black.ttf new file mode 100644 index 0000000..99491f8 Binary files /dev/null and b/android/app/src/main/assets/fonts/Nunito-Black.ttf differ diff --git a/android/app/src/main/assets/fonts/Nunito-BlackItalic.ttf b/android/app/src/main/assets/fonts/Nunito-BlackItalic.ttf new file mode 100644 index 0000000..6004938 Binary files /dev/null and b/android/app/src/main/assets/fonts/Nunito-BlackItalic.ttf differ diff --git a/android/app/src/main/assets/fonts/Nunito-Bold.ttf b/android/app/src/main/assets/fonts/Nunito-Bold.ttf new file mode 100644 index 0000000..6909689 Binary files /dev/null and b/android/app/src/main/assets/fonts/Nunito-Bold.ttf differ diff --git a/android/app/src/main/assets/fonts/Nunito-BoldItalic.ttf b/android/app/src/main/assets/fonts/Nunito-BoldItalic.ttf new file mode 100644 index 0000000..2479c36 Binary files /dev/null and b/android/app/src/main/assets/fonts/Nunito-BoldItalic.ttf differ diff --git a/android/app/src/main/assets/fonts/Nunito-ExtraBold.ttf b/android/app/src/main/assets/fonts/Nunito-ExtraBold.ttf new file mode 100644 index 0000000..6f4ccde Binary files /dev/null and b/android/app/src/main/assets/fonts/Nunito-ExtraBold.ttf differ diff --git a/android/app/src/main/assets/fonts/Nunito-ExtraBoldItalic.ttf b/android/app/src/main/assets/fonts/Nunito-ExtraBoldItalic.ttf new file mode 100644 index 0000000..a82e6a2 Binary files /dev/null and b/android/app/src/main/assets/fonts/Nunito-ExtraBoldItalic.ttf differ diff --git a/android/app/src/main/assets/fonts/Nunito-ExtraLight.ttf b/android/app/src/main/assets/fonts/Nunito-ExtraLight.ttf new file mode 100644 index 0000000..96711f9 Binary files /dev/null and b/android/app/src/main/assets/fonts/Nunito-ExtraLight.ttf differ diff --git a/android/app/src/main/assets/fonts/Nunito-ExtraLightItalic.ttf b/android/app/src/main/assets/fonts/Nunito-ExtraLightItalic.ttf new file mode 100644 index 0000000..ff043a4 Binary files /dev/null and b/android/app/src/main/assets/fonts/Nunito-ExtraLightItalic.ttf differ diff --git a/android/app/src/main/assets/fonts/Nunito-Italic.ttf b/android/app/src/main/assets/fonts/Nunito-Italic.ttf new file mode 100644 index 0000000..97fd169 Binary files /dev/null and b/android/app/src/main/assets/fonts/Nunito-Italic.ttf differ diff --git a/android/app/src/main/assets/fonts/Nunito-Light.ttf b/android/app/src/main/assets/fonts/Nunito-Light.ttf new file mode 100644 index 0000000..fb050fc Binary files /dev/null and b/android/app/src/main/assets/fonts/Nunito-Light.ttf differ diff --git a/android/app/src/main/assets/fonts/Nunito-LightItalic.ttf b/android/app/src/main/assets/fonts/Nunito-LightItalic.ttf new file mode 100644 index 0000000..0914950 Binary files /dev/null and b/android/app/src/main/assets/fonts/Nunito-LightItalic.ttf differ diff --git a/android/app/src/main/assets/fonts/Nunito-Medium.ttf b/android/app/src/main/assets/fonts/Nunito-Medium.ttf new file mode 100644 index 0000000..a6993eb Binary files /dev/null and b/android/app/src/main/assets/fonts/Nunito-Medium.ttf differ diff --git a/android/app/src/main/assets/fonts/Nunito-MediumItalic.ttf b/android/app/src/main/assets/fonts/Nunito-MediumItalic.ttf new file mode 100644 index 0000000..1913632 Binary files /dev/null and b/android/app/src/main/assets/fonts/Nunito-MediumItalic.ttf differ diff --git a/android/app/src/main/assets/fonts/Nunito-Regular.ttf b/android/app/src/main/assets/fonts/Nunito-Regular.ttf new file mode 100644 index 0000000..be80c3f Binary files /dev/null and b/android/app/src/main/assets/fonts/Nunito-Regular.ttf differ diff --git a/android/app/src/main/assets/fonts/Nunito-SemiBold.ttf b/android/app/src/main/assets/fonts/Nunito-SemiBold.ttf new file mode 100644 index 0000000..06f29ea Binary files /dev/null and b/android/app/src/main/assets/fonts/Nunito-SemiBold.ttf differ diff --git a/android/app/src/main/assets/fonts/Nunito-SemiBoldItalic.ttf b/android/app/src/main/assets/fonts/Nunito-SemiBoldItalic.ttf new file mode 100644 index 0000000..5af8133 Binary files /dev/null and b/android/app/src/main/assets/fonts/Nunito-SemiBoldItalic.ttf differ diff --git a/android/link-assets-manifest.json b/android/link-assets-manifest.json new file mode 100644 index 0000000..cbba354 --- /dev/null +++ b/android/link-assets-manifest.json @@ -0,0 +1,69 @@ +{ + "migIndex": 1, + "data": [ + { + "path": "src/assets/fonts/Nunito-Black.ttf", + "sha1": "bede9c89e905ae0b91404768e1167e3e5d3c9c8e" + }, + { + "path": "src/assets/fonts/Nunito-BlackItalic.ttf", + "sha1": "5b27538c43c1afcd5b4a8547854522a805f4c302" + }, + { + "path": "src/assets/fonts/Nunito-Bold.ttf", + "sha1": "e50cf9134308e37008cbd39da1dc637aef022641" + }, + { + "path": "src/assets/fonts/Nunito-BoldItalic.ttf", + "sha1": "5ab6843366253b2e8009cf3384e6d275004ad5f3" + }, + { + "path": "src/assets/fonts/Nunito-ExtraBold.ttf", + "sha1": "37ba2b2e9e7dd74a67b8b994a1aebe333af7fc39" + }, + { + "path": "src/assets/fonts/Nunito-ExtraBoldItalic.ttf", + "sha1": "fab683da6e0b9ff687a6ca683f96127e84919b24" + }, + { + "path": "src/assets/fonts/Nunito-ExtraLight.ttf", + "sha1": "5473261207bdc8a16cf78d26e598becddeb8155e" + }, + { + "path": "src/assets/fonts/Nunito-ExtraLightItalic.ttf", + "sha1": "fd4b64a944d4353f216df49c028cde717161dd24" + }, + { + "path": "src/assets/fonts/Nunito-Italic.ttf", + "sha1": "0c994f04c2bb328d87069d32e7422b559c05d5a7" + }, + { + "path": "src/assets/fonts/Nunito-Light.ttf", + "sha1": "e69e3dfdaf5baaa6fc6db1dd031ed18e1dca38f3" + }, + { + "path": "src/assets/fonts/Nunito-LightItalic.ttf", + "sha1": "6855c33fb876932b819dc445eeb4ae3267c4ef7d" + }, + { + "path": "src/assets/fonts/Nunito-Medium.ttf", + "sha1": "75324fedc01df018cdf436bb5beba504bd82af0d" + }, + { + "path": "src/assets/fonts/Nunito-MediumItalic.ttf", + "sha1": "e582f36e0b5d13c9e3ac827bd879593dec1a06d0" + }, + { + "path": "src/assets/fonts/Nunito-Regular.ttf", + "sha1": "929ddc840610489715952aaa10af50e9c1a6a4a6" + }, + { + "path": "src/assets/fonts/Nunito-SemiBold.ttf", + "sha1": "c4a5281a3e088e1d2604635d4d09a1583d036db6" + }, + { + "path": "src/assets/fonts/Nunito-SemiBoldItalic.ttf", + "sha1": "96d4f551a905d9dd509fec0ae085f35666d8f797" + } + ] +} diff --git a/ios/CircleCollect.xcodeproj/project.pbxproj b/ios/CircleCollect.xcodeproj/project.pbxproj index 22f8603..0dccd01 100644 --- a/ios/CircleCollect.xcodeproj/project.pbxproj +++ b/ios/CircleCollect.xcodeproj/project.pbxproj @@ -11,6 +11,22 @@ 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 761780ED2CA45674006654EE /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 761780EC2CA45674006654EE /* AppDelegate.swift */; }; 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; }; + 77E955B03ACA476189F41279 /* Nunito-Black.ttf in Resources */ = {isa = PBXBuildFile; fileRef = CD6281C4A8224BDC9C99061C /* Nunito-Black.ttf */; }; + 69272C3CFEEF44F4BB88C9BB /* Nunito-BlackItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 8B63FD1EEF264E8E9FF335EC /* Nunito-BlackItalic.ttf */; }; + 84A9D5DED8094CB4A153268F /* Nunito-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = AEAB2A7CD23248A9A542D0CA /* Nunito-Bold.ttf */; }; + D67F05517BE4422F808A5EB3 /* Nunito-BoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 4C5A03C0427D4F17A5988F0F /* Nunito-BoldItalic.ttf */; }; + E007418A1C2740F79785A324 /* Nunito-ExtraBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 60736DFE1D9549AEB020EE49 /* Nunito-ExtraBold.ttf */; }; + CA97D53F7B8349D19F07E434 /* Nunito-ExtraBoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = D41A02AA33B74B74A5EA8D28 /* Nunito-ExtraBoldItalic.ttf */; }; + FC3942C6BF94431DAF7D34CA /* Nunito-ExtraLight.ttf in Resources */ = {isa = PBXBuildFile; fileRef = C2154C491E214E5B87CE0D6E /* Nunito-ExtraLight.ttf */; }; + BF72BEDD2BEF41D5A740F6DB /* Nunito-ExtraLightItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1BB241E150DC4271B6DB8035 /* Nunito-ExtraLightItalic.ttf */; }; + C755B258B1CE4C7D9F669459 /* Nunito-Italic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 5E80FD17FB314B54B4070AE7 /* Nunito-Italic.ttf */; }; + 4432DD78D2D8420098273374 /* Nunito-Light.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 8654D08FDB97420F9054EC82 /* Nunito-Light.ttf */; }; + 7E3B3883C3FA414C9770A859 /* Nunito-LightItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 50F514E360C2402797F5FB3B /* Nunito-LightItalic.ttf */; }; + 4B27568F87CA45C18D781B4E /* Nunito-Medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 13508BA55A1D4761A085FB3C /* Nunito-Medium.ttf */; }; + 0E89A7DC000347CCB92D18FA /* Nunito-MediumItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 5744AD8D40A949D6B7F3C816 /* Nunito-MediumItalic.ttf */; }; + 609A14F1490B46E9966AD947 /* Nunito-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = FAD14762400E476AA7B1075D /* Nunito-Regular.ttf */; }; + 430150A883E743E9A59596D5 /* Nunito-SemiBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 499363DC0EDB4DA4A3B87FA4 /* Nunito-SemiBold.ttf */; }; + E3AC45B155004DE6BD7233A4 /* Nunito-SemiBoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 62F0D71A41214365A475156B /* Nunito-SemiBoldItalic.ttf */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -24,6 +40,22 @@ 761780EC2CA45674006654EE /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = CircleCollect/AppDelegate.swift; sourceTree = ""; }; 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = CircleCollect/LaunchScreen.storyboard; sourceTree = ""; }; ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; + CD6281C4A8224BDC9C99061C /* Nunito-Black.ttf */ = {isa = PBXFileReference; name = "Nunito-Black.ttf"; path = "../src/assets/fonts/Nunito-Black.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + 8B63FD1EEF264E8E9FF335EC /* Nunito-BlackItalic.ttf */ = {isa = PBXFileReference; name = "Nunito-BlackItalic.ttf"; path = "../src/assets/fonts/Nunito-BlackItalic.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + AEAB2A7CD23248A9A542D0CA /* Nunito-Bold.ttf */ = {isa = PBXFileReference; name = "Nunito-Bold.ttf"; path = "../src/assets/fonts/Nunito-Bold.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + 4C5A03C0427D4F17A5988F0F /* Nunito-BoldItalic.ttf */ = {isa = PBXFileReference; name = "Nunito-BoldItalic.ttf"; path = "../src/assets/fonts/Nunito-BoldItalic.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + 60736DFE1D9549AEB020EE49 /* Nunito-ExtraBold.ttf */ = {isa = PBXFileReference; name = "Nunito-ExtraBold.ttf"; path = "../src/assets/fonts/Nunito-ExtraBold.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + D41A02AA33B74B74A5EA8D28 /* Nunito-ExtraBoldItalic.ttf */ = {isa = PBXFileReference; name = "Nunito-ExtraBoldItalic.ttf"; path = "../src/assets/fonts/Nunito-ExtraBoldItalic.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + C2154C491E214E5B87CE0D6E /* Nunito-ExtraLight.ttf */ = {isa = PBXFileReference; name = "Nunito-ExtraLight.ttf"; path = "../src/assets/fonts/Nunito-ExtraLight.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + 1BB241E150DC4271B6DB8035 /* Nunito-ExtraLightItalic.ttf */ = {isa = PBXFileReference; name = "Nunito-ExtraLightItalic.ttf"; path = "../src/assets/fonts/Nunito-ExtraLightItalic.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + 5E80FD17FB314B54B4070AE7 /* Nunito-Italic.ttf */ = {isa = PBXFileReference; name = "Nunito-Italic.ttf"; path = "../src/assets/fonts/Nunito-Italic.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + 8654D08FDB97420F9054EC82 /* Nunito-Light.ttf */ = {isa = PBXFileReference; name = "Nunito-Light.ttf"; path = "../src/assets/fonts/Nunito-Light.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + 50F514E360C2402797F5FB3B /* Nunito-LightItalic.ttf */ = {isa = PBXFileReference; name = "Nunito-LightItalic.ttf"; path = "../src/assets/fonts/Nunito-LightItalic.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + 13508BA55A1D4761A085FB3C /* Nunito-Medium.ttf */ = {isa = PBXFileReference; name = "Nunito-Medium.ttf"; path = "../src/assets/fonts/Nunito-Medium.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + 5744AD8D40A949D6B7F3C816 /* Nunito-MediumItalic.ttf */ = {isa = PBXFileReference; name = "Nunito-MediumItalic.ttf"; path = "../src/assets/fonts/Nunito-MediumItalic.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + FAD14762400E476AA7B1075D /* Nunito-Regular.ttf */ = {isa = PBXFileReference; name = "Nunito-Regular.ttf"; path = "../src/assets/fonts/Nunito-Regular.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + 499363DC0EDB4DA4A3B87FA4 /* Nunito-SemiBold.ttf */ = {isa = PBXFileReference; name = "Nunito-SemiBold.ttf"; path = "../src/assets/fonts/Nunito-SemiBold.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + 62F0D71A41214365A475156B /* Nunito-SemiBoldItalic.ttf */ = {isa = PBXFileReference; name = "Nunito-SemiBoldItalic.ttf"; path = "../src/assets/fonts/Nunito-SemiBoldItalic.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -74,6 +106,7 @@ 83CBBA001A601CBA00E9B192 /* Products */, 2D16E6871FA4F8E400B85C8A /* Frameworks */, BBD78D7AC51CEA395F1C20DB /* Pods */, + 20F28563BF834255BD7383AF /* Resources */, ); indentWidth = 2; sourceTree = ""; @@ -97,6 +130,30 @@ path = Pods; sourceTree = ""; }; + 20F28563BF834255BD7383AF /* Resources */ = { + isa = "PBXGroup"; + children = ( + CD6281C4A8224BDC9C99061C /* Nunito-Black.ttf */, + 8B63FD1EEF264E8E9FF335EC /* Nunito-BlackItalic.ttf */, + AEAB2A7CD23248A9A542D0CA /* Nunito-Bold.ttf */, + 4C5A03C0427D4F17A5988F0F /* Nunito-BoldItalic.ttf */, + 60736DFE1D9549AEB020EE49 /* Nunito-ExtraBold.ttf */, + D41A02AA33B74B74A5EA8D28 /* Nunito-ExtraBoldItalic.ttf */, + C2154C491E214E5B87CE0D6E /* Nunito-ExtraLight.ttf */, + 1BB241E150DC4271B6DB8035 /* Nunito-ExtraLightItalic.ttf */, + 5E80FD17FB314B54B4070AE7 /* Nunito-Italic.ttf */, + 8654D08FDB97420F9054EC82 /* Nunito-Light.ttf */, + 50F514E360C2402797F5FB3B /* Nunito-LightItalic.ttf */, + 13508BA55A1D4761A085FB3C /* Nunito-Medium.ttf */, + 5744AD8D40A949D6B7F3C816 /* Nunito-MediumItalic.ttf */, + FAD14762400E476AA7B1075D /* Nunito-Regular.ttf */, + 499363DC0EDB4DA4A3B87FA4 /* Nunito-SemiBold.ttf */, + 62F0D71A41214365A475156B /* Nunito-SemiBoldItalic.ttf */, + ); + name = Resources; + sourceTree = ""; + path = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -159,6 +216,22 @@ files = ( 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */, 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, + 77E955B03ACA476189F41279 /* Nunito-Black.ttf in Resources */, + 69272C3CFEEF44F4BB88C9BB /* Nunito-BlackItalic.ttf in Resources */, + 84A9D5DED8094CB4A153268F /* Nunito-Bold.ttf in Resources */, + D67F05517BE4422F808A5EB3 /* Nunito-BoldItalic.ttf in Resources */, + E007418A1C2740F79785A324 /* Nunito-ExtraBold.ttf in Resources */, + CA97D53F7B8349D19F07E434 /* Nunito-ExtraBoldItalic.ttf in Resources */, + FC3942C6BF94431DAF7D34CA /* Nunito-ExtraLight.ttf in Resources */, + BF72BEDD2BEF41D5A740F6DB /* Nunito-ExtraLightItalic.ttf in Resources */, + C755B258B1CE4C7D9F669459 /* Nunito-Italic.ttf in Resources */, + 4432DD78D2D8420098273374 /* Nunito-Light.ttf in Resources */, + 7E3B3883C3FA414C9770A859 /* Nunito-LightItalic.ttf in Resources */, + 4B27568F87CA45C18D781B4E /* Nunito-Medium.ttf in Resources */, + 0E89A7DC000347CCB92D18FA /* Nunito-MediumItalic.ttf in Resources */, + 609A14F1490B46E9966AD947 /* Nunito-Regular.ttf in Resources */, + 430150A883E743E9A59596D5 /* Nunito-SemiBold.ttf in Resources */, + E3AC45B155004DE6BD7233A4 /* Nunito-SemiBoldItalic.ttf in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/ios/CircleCollect/Info.plist b/ios/CircleCollect/Info.plist index afab307..fb4e9c5 100644 --- a/ios/CircleCollect/Info.plist +++ b/ios/CircleCollect/Info.plist @@ -26,14 +26,13 @@ NSAppTransportSecurity - NSAllowsArbitraryLoads NSAllowsLocalNetworking NSLocationWhenInUseUsageDescription - + UILaunchStoryboardName LaunchScreen UIRequiredDeviceCapabilities @@ -48,5 +47,24 @@ UIViewControllerBasedStatusBarAppearance + UIAppFonts + + Nunito-Black.ttf + Nunito-BlackItalic.ttf + Nunito-Bold.ttf + Nunito-BoldItalic.ttf + Nunito-ExtraBold.ttf + Nunito-ExtraBoldItalic.ttf + Nunito-ExtraLight.ttf + Nunito-ExtraLightItalic.ttf + Nunito-Italic.ttf + Nunito-Light.ttf + Nunito-LightItalic.ttf + Nunito-Medium.ttf + Nunito-MediumItalic.ttf + Nunito-Regular.ttf + Nunito-SemiBold.ttf + Nunito-SemiBoldItalic.ttf + diff --git a/ios/link-assets-manifest.json b/ios/link-assets-manifest.json new file mode 100644 index 0000000..cbba354 --- /dev/null +++ b/ios/link-assets-manifest.json @@ -0,0 +1,69 @@ +{ + "migIndex": 1, + "data": [ + { + "path": "src/assets/fonts/Nunito-Black.ttf", + "sha1": "bede9c89e905ae0b91404768e1167e3e5d3c9c8e" + }, + { + "path": "src/assets/fonts/Nunito-BlackItalic.ttf", + "sha1": "5b27538c43c1afcd5b4a8547854522a805f4c302" + }, + { + "path": "src/assets/fonts/Nunito-Bold.ttf", + "sha1": "e50cf9134308e37008cbd39da1dc637aef022641" + }, + { + "path": "src/assets/fonts/Nunito-BoldItalic.ttf", + "sha1": "5ab6843366253b2e8009cf3384e6d275004ad5f3" + }, + { + "path": "src/assets/fonts/Nunito-ExtraBold.ttf", + "sha1": "37ba2b2e9e7dd74a67b8b994a1aebe333af7fc39" + }, + { + "path": "src/assets/fonts/Nunito-ExtraBoldItalic.ttf", + "sha1": "fab683da6e0b9ff687a6ca683f96127e84919b24" + }, + { + "path": "src/assets/fonts/Nunito-ExtraLight.ttf", + "sha1": "5473261207bdc8a16cf78d26e598becddeb8155e" + }, + { + "path": "src/assets/fonts/Nunito-ExtraLightItalic.ttf", + "sha1": "fd4b64a944d4353f216df49c028cde717161dd24" + }, + { + "path": "src/assets/fonts/Nunito-Italic.ttf", + "sha1": "0c994f04c2bb328d87069d32e7422b559c05d5a7" + }, + { + "path": "src/assets/fonts/Nunito-Light.ttf", + "sha1": "e69e3dfdaf5baaa6fc6db1dd031ed18e1dca38f3" + }, + { + "path": "src/assets/fonts/Nunito-LightItalic.ttf", + "sha1": "6855c33fb876932b819dc445eeb4ae3267c4ef7d" + }, + { + "path": "src/assets/fonts/Nunito-Medium.ttf", + "sha1": "75324fedc01df018cdf436bb5beba504bd82af0d" + }, + { + "path": "src/assets/fonts/Nunito-MediumItalic.ttf", + "sha1": "e582f36e0b5d13c9e3ac827bd879593dec1a06d0" + }, + { + "path": "src/assets/fonts/Nunito-Regular.ttf", + "sha1": "929ddc840610489715952aaa10af50e9c1a6a4a6" + }, + { + "path": "src/assets/fonts/Nunito-SemiBold.ttf", + "sha1": "c4a5281a3e088e1d2604635d4d09a1583d036db6" + }, + { + "path": "src/assets/fonts/Nunito-SemiBoldItalic.ttf", + "sha1": "96d4f551a905d9dd509fec0ae085f35666d8f797" + } + ] +} diff --git a/package-lock.json b/package-lock.json index 3cfd9f7..0a11ef5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,6 +47,7 @@ "react-native-responsive-dimensions": "^3.1.1", "react-native-safe-area-context": "^5.6.1", "react-native-screens": "^4.16.0", + "react-native-size-matters": "^0.0.3", "react-native-svg": "^15.13.0", "react-native-vector-icons": "^10.3.0", "react-native-walkthrough-tooltip": "^1.6.0", @@ -2813,7 +2814,9 @@ } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", "license": "MIT", "dependencies": { "argparse": "^1.0.7", @@ -7145,6 +7148,20 @@ "version": "1.0.0", "license": "ISC" }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.2", "license": "MIT", @@ -8737,7 +8754,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.1.0", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -9628,13 +9647,16 @@ } }, "node_modules/npm": { - "version": "11.6.1", + "version": "11.6.4", + "resolved": "https://registry.npmjs.org/npm/-/npm-11.6.4.tgz", + "integrity": "sha512-ERjKtGoFpQrua/9bG0+h3xiv/4nVdGViCjUYA1AmlV24fFvfnSB7B7dIfZnySQ1FDLd0ZVrWPsLLp78dCtJdRQ==", "bundleDependencies": [ "@isaacs/string-locale-compare", "@npmcli/arborist", "@npmcli/config", "@npmcli/fs", "@npmcli/map-workspaces", + "@npmcli/metavuln-calculator", "@npmcli/package-json", "@npmcli/promise-spawn", "@npmcli/redact", @@ -9672,7 +9694,6 @@ "ms", "node-gyp", "nopt", - "normalize-package-data", "npm-audit-report", "npm-install-checks", "npm-package-arg", @@ -9707,71 +9728,71 @@ ], "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^9.1.5", - "@npmcli/config": "^10.4.1", - "@npmcli/fs": "^4.0.0", - "@npmcli/map-workspaces": "^5.0.0", - "@npmcli/package-json": "^7.0.1", - "@npmcli/promise-spawn": "^8.0.3", - "@npmcli/redact": "^3.2.2", - "@npmcli/run-script": "^10.0.0", + "@npmcli/arborist": "^9.1.8", + "@npmcli/config": "^10.4.4", + "@npmcli/fs": "^5.0.0", + "@npmcli/map-workspaces": "^5.0.3", + "@npmcli/metavuln-calculator": "^9.0.3", + "@npmcli/package-json": "^7.0.4", + "@npmcli/promise-spawn": "^9.0.1", + "@npmcli/redact": "^4.0.0", + "@npmcli/run-script": "^10.0.3", "@sigstore/tuf": "^4.0.0", - "abbrev": "^3.0.1", + "abbrev": "^4.0.0", "archy": "~1.0.0", - "cacache": "^20.0.1", + "cacache": "^20.0.3", "chalk": "^5.6.2", - "ci-info": "^4.3.0", + "ci-info": "^4.3.1", "cli-columns": "^4.0.0", "fastest-levenshtein": "^1.0.16", "fs-minipass": "^3.0.3", - "glob": "^11.0.3", + "glob": "^13.0.0", "graceful-fs": "^4.2.11", - "hosted-git-info": "^9.0.0", - "ini": "^5.0.0", - "init-package-json": "^8.2.2", - "is-cidr": "^6.0.0", - "json-parse-even-better-errors": "^4.0.0", - "libnpmaccess": "^10.0.2", - "libnpmdiff": "^8.0.8", - "libnpmexec": "^10.1.7", - "libnpmfund": "^7.0.8", + "hosted-git-info": "^9.0.2", + "ini": "^6.0.0", + "init-package-json": "^8.2.4", + "is-cidr": "^6.0.1", + "json-parse-even-better-errors": "^5.0.0", + "libnpmaccess": "^10.0.3", + "libnpmdiff": "^8.0.11", + "libnpmexec": "^10.1.10", + "libnpmfund": "^7.0.11", "libnpmorg": "^8.0.1", - "libnpmpack": "^9.0.8", - "libnpmpublish": "^11.1.1", + "libnpmpack": "^9.0.11", + "libnpmpublish": "^11.1.3", "libnpmsearch": "^9.0.1", "libnpmteam": "^8.0.2", - "libnpmversion": "^8.0.2", - "make-fetch-happen": "^15.0.2", - "minimatch": "^10.0.3", + "libnpmversion": "^8.0.3", + "make-fetch-happen": "^15.0.3", + "minimatch": "^10.1.1", "minipass": "^7.1.1", "minipass-pipeline": "^1.2.4", "ms": "^2.1.2", - "node-gyp": "^11.4.2", - "nopt": "^8.1.0", - "normalize-package-data": "^8.0.0", - "npm-audit-report": "^6.0.0", - "npm-install-checks": "^7.1.2", - "npm-package-arg": "^13.0.0", - "npm-pick-manifest": "^11.0.1", - "npm-profile": "^12.0.0", - "npm-registry-fetch": "^19.0.0", - "npm-user-validate": "^3.0.0", - "p-map": "^7.0.3", - "pacote": "^21.0.3", - "parse-conflict-json": "^4.0.0", - "proc-log": "^5.0.0", + "node-gyp": "^12.1.0", + "nopt": "^9.0.0", + "npm-audit-report": "^7.0.0", + "npm-install-checks": "^8.0.0", + "npm-package-arg": "^13.0.2", + "npm-pick-manifest": "^11.0.3", + "npm-profile": "^12.0.1", + "npm-registry-fetch": "^19.1.1", + "npm-user-validate": "^4.0.0", + "p-map": "^7.0.4", + "pacote": "^21.0.4", + "parse-conflict-json": "^5.0.1", + "proc-log": "^6.1.0", "qrcode-terminal": "^0.12.0", - "read": "^4.1.0", - "semver": "^7.7.2", + "read": "^5.0.1", + "semver": "^7.7.3", "spdx-expression-parse": "^4.0.0", - "ssri": "^12.0.0", + "ssri": "^13.0.0", "supports-color": "^10.2.2", - "tar": "^7.5.1", + "tar": "^7.5.2", "text-table": "~0.2.0", "tiny-relative-date": "^2.0.2", "treeverse": "^3.0.0", - "validate-npm-package-name": "^6.0.2", - "which": "^5.0.0" + "validate-npm-package-name": "^7.0.0", + "which": "^6.0.0" }, "bin": { "npm": "bin/npm-cli.js", @@ -9811,68 +9832,6 @@ "node": "20 || >=22" } }, - "node_modules/npm/node_modules/@isaacs/cliui": { - "version": "8.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.2.2", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/npm/node_modules/@isaacs/fs-minipass": { "version": "4.0.1", "inBundle": true, @@ -9905,41 +9864,41 @@ } }, "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "9.1.5", + "version": "9.1.8", "inBundle": true, "license": "ISC", "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/fs": "^4.0.0", - "@npmcli/installed-package-contents": "^3.0.0", + "@npmcli/fs": "^5.0.0", + "@npmcli/installed-package-contents": "^4.0.0", "@npmcli/map-workspaces": "^5.0.0", "@npmcli/metavuln-calculator": "^9.0.2", - "@npmcli/name-from-folder": "^3.0.0", - "@npmcli/node-gyp": "^4.0.0", + "@npmcli/name-from-folder": "^4.0.0", + "@npmcli/node-gyp": "^5.0.0", "@npmcli/package-json": "^7.0.0", - "@npmcli/query": "^4.0.0", - "@npmcli/redact": "^3.0.0", + "@npmcli/query": "^5.0.0", + "@npmcli/redact": "^4.0.0", "@npmcli/run-script": "^10.0.0", - "bin-links": "^5.0.0", + "bin-links": "^6.0.0", "cacache": "^20.0.1", "common-ancestor-path": "^1.0.1", "hosted-git-info": "^9.0.0", "json-stringify-nice": "^1.1.4", "lru-cache": "^11.2.1", "minimatch": "^10.0.3", - "nopt": "^8.0.0", - "npm-install-checks": "^7.1.0", + "nopt": "^9.0.0", + "npm-install-checks": "^8.0.0", "npm-package-arg": "^13.0.0", "npm-pick-manifest": "^11.0.1", "npm-registry-fetch": "^19.0.0", "pacote": "^21.0.2", - "parse-conflict-json": "^4.0.0", - "proc-log": "^5.0.0", - "proggy": "^3.0.0", + "parse-conflict-json": "^5.0.1", + "proc-log": "^6.0.0", + "proggy": "^4.0.0", "promise-all-reject-late": "^1.0.0", "promise-call-limit": "^3.0.1", "semver": "^7.3.7", - "ssri": "^12.0.0", + "ssri": "^13.0.0", "treeverse": "^3.0.0", "walk-up-path": "^4.0.0" }, @@ -9951,16 +9910,16 @@ } }, "node_modules/npm/node_modules/@npmcli/config": { - "version": "10.4.1", + "version": "10.4.4", "inBundle": true, "license": "ISC", "dependencies": { "@npmcli/map-workspaces": "^5.0.0", "@npmcli/package-json": "^7.0.0", "ci-info": "^4.0.0", - "ini": "^5.0.0", - "nopt": "^8.1.0", - "proc-log": "^5.0.0", + "ini": "^6.0.0", + "nopt": "^9.0.0", + "proc-log": "^6.0.0", "semver": "^7.3.5", "walk-up-path": "^4.0.0" }, @@ -9969,57 +9928,57 @@ } }, "node_modules/npm/node_modules/@npmcli/fs": { - "version": "4.0.0", + "version": "5.0.0", "inBundle": true, "license": "ISC", "dependencies": { "semver": "^7.3.5" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/@npmcli/git": { - "version": "7.0.0", + "version": "7.0.1", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/promise-spawn": "^8.0.0", - "ini": "^5.0.0", + "@npmcli/promise-spawn": "^9.0.0", + "ini": "^6.0.0", "lru-cache": "^11.2.1", "npm-pick-manifest": "^11.0.1", - "proc-log": "^5.0.0", + "proc-log": "^6.0.0", "promise-retry": "^2.0.1", "semver": "^7.3.5", - "which": "^5.0.0" + "which": "^6.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/@npmcli/installed-package-contents": { - "version": "3.0.0", + "version": "4.0.0", "inBundle": true, "license": "ISC", "dependencies": { - "npm-bundled": "^4.0.0", - "npm-normalize-package-bin": "^4.0.0" + "npm-bundled": "^5.0.0", + "npm-normalize-package-bin": "^5.0.0" }, "bin": { "installed-package-contents": "bin/index.js" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/@npmcli/map-workspaces": { - "version": "5.0.0", + "version": "5.0.3", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/name-from-folder": "^3.0.0", + "@npmcli/name-from-folder": "^4.0.0", "@npmcli/package-json": "^7.0.0", - "glob": "^11.0.3", + "glob": "^13.0.0", "minimatch": "^10.0.3" }, "engines": { @@ -10027,14 +9986,14 @@ } }, "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { - "version": "9.0.2", + "version": "9.0.3", "inBundle": true, "license": "ISC", "dependencies": { "cacache": "^20.0.0", - "json-parse-even-better-errors": "^4.0.0", + "json-parse-even-better-errors": "^5.0.0", "pacote": "^21.0.0", - "proc-log": "^5.0.0", + "proc-log": "^6.0.0", "semver": "^7.3.5" }, "engines": { @@ -10042,31 +10001,31 @@ } }, "node_modules/npm/node_modules/@npmcli/name-from-folder": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/@npmcli/node-gyp": { "version": "4.0.0", "inBundle": true, "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/node-gyp": { + "version": "5.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/@npmcli/package-json": { - "version": "7.0.1", + "version": "7.0.4", "inBundle": true, "license": "ISC", "dependencies": { "@npmcli/git": "^7.0.0", - "glob": "^11.0.3", + "glob": "^13.0.0", "hosted-git-info": "^9.0.0", - "json-parse-even-better-errors": "^4.0.0", - "proc-log": "^5.0.0", + "json-parse-even-better-errors": "^5.0.0", + "proc-log": "^6.0.0", "semver": "^7.5.3", "validate-npm-package-license": "^3.0.4" }, @@ -10075,58 +10034,49 @@ } }, "node_modules/npm/node_modules/@npmcli/promise-spawn": { - "version": "8.0.3", + "version": "9.0.1", "inBundle": true, "license": "ISC", "dependencies": { - "which": "^5.0.0" + "which": "^6.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/@npmcli/query": { - "version": "4.0.1", + "version": "5.0.0", "inBundle": true, "license": "ISC", "dependencies": { "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/@npmcli/redact": { - "version": "3.2.2", + "version": "4.0.0", "inBundle": true, "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/@npmcli/run-script": { - "version": "10.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/node-gyp": "^4.0.0", - "@npmcli/package-json": "^7.0.0", - "@npmcli/promise-spawn": "^8.0.0", - "node-gyp": "^11.0.0", - "proc-log": "^5.0.0", - "which": "^5.0.0" - }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/@pkgjs/parseargs": { - "version": "0.11.0", + "node_modules/npm/node_modules/@npmcli/run-script": { + "version": "10.0.3", "inBundle": true, - "license": "MIT", - "optional": true, + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^5.0.0", + "@npmcli/package-json": "^7.0.0", + "@npmcli/promise-spawn": "^9.0.0", + "node-gyp": "^12.1.0", + "proc-log": "^6.0.0", + "which": "^6.0.0" + }, "engines": { - "node": ">=14" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/@sigstore/bundle": { @@ -10157,14 +10107,14 @@ } }, "node_modules/npm/node_modules/@sigstore/sign": { - "version": "4.0.0", + "version": "4.0.1", "inBundle": true, "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^4.0.0", "@sigstore/core": "^3.0.0", "@sigstore/protobuf-specs": "^0.5.0", - "make-fetch-happen": "^15.0.0", + "make-fetch-happen": "^15.0.2", "proc-log": "^5.0.0", "promise-retry": "^2.0.1" }, @@ -10172,6 +10122,14 @@ "node": "^20.17.0 || >=22.9.0" } }, + "node_modules/npm/node_modules/@sigstore/sign/node_modules/proc-log": { + "version": "5.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, "node_modules/npm/node_modules/@sigstore/tuf": { "version": "4.0.0", "inBundle": true, @@ -10232,11 +10190,11 @@ } }, "node_modules/npm/node_modules/abbrev": { - "version": "3.0.1", + "version": "4.0.0", "inBundle": true, "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/agent-base": { @@ -10255,17 +10213,6 @@ "node": ">=8" } }, - "node_modules/npm/node_modules/ansi-styles": { - "version": "6.2.3", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/npm/node_modules/aproba": { "version": "2.1.0", "inBundle": true, @@ -10282,18 +10229,18 @@ "license": "MIT" }, "node_modules/npm/node_modules/bin-links": { - "version": "5.0.0", + "version": "6.0.0", "inBundle": true, "license": "ISC", "dependencies": { - "cmd-shim": "^7.0.0", - "npm-normalize-package-bin": "^4.0.0", - "proc-log": "^5.0.0", - "read-cmd-shim": "^5.0.0", - "write-file-atomic": "^6.0.0" + "cmd-shim": "^8.0.0", + "npm-normalize-package-bin": "^5.0.0", + "proc-log": "^6.0.0", + "read-cmd-shim": "^6.0.0", + "write-file-atomic": "^7.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/binary-extensions": { @@ -10316,21 +10263,21 @@ } }, "node_modules/npm/node_modules/cacache": { - "version": "20.0.1", + "version": "20.0.3", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/fs": "^4.0.0", + "@npmcli/fs": "^5.0.0", "fs-minipass": "^3.0.0", - "glob": "^11.0.3", + "glob": "^13.0.0", "lru-cache": "^11.1.0", "minipass": "^7.0.3", "minipass-collect": "^2.0.1", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^7.0.2", - "ssri": "^12.0.0", - "unique-filename": "^4.0.0" + "ssri": "^13.0.0", + "unique-filename": "^5.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" @@ -10356,7 +10303,7 @@ } }, "node_modules/npm/node_modules/ci-info": { - "version": "4.3.0", + "version": "4.3.1", "funding": [ { "type": "github", @@ -10370,11 +10317,11 @@ } }, "node_modules/npm/node_modules/cidr-regex": { - "version": "5.0.0", + "version": "5.0.1", "inBundle": true, "license": "BSD-2-Clause", "dependencies": { - "ip-regex": "^5.0.0" + "ip-regex": "5.0.0" }, "engines": { "node": ">=20" @@ -10393,66 +10340,18 @@ } }, "node_modules/npm/node_modules/cmd-shim": { - "version": "7.0.0", + "version": "8.0.0", "inBundle": true, "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/color-convert": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/npm/node_modules/color-name": { - "version": "1.1.4", - "inBundle": true, - "license": "MIT" - }, "node_modules/npm/node_modules/common-ancestor-path": { "version": "1.0.1", "inBundle": true, "license": "ISC" }, - "node_modules/npm/node_modules/cross-spawn": { - "version": "7.0.6", - "inBundle": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/cross-spawn/node_modules/isexe": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/npm/node_modules/cssesc": { "version": "3.0.0", "inBundle": true, @@ -10488,11 +10387,6 @@ "node": ">=0.3.1" } }, - "node_modules/npm/node_modules/eastasianwidth": { - "version": "0.2.0", - "inBundle": true, - "license": "MIT" - }, "node_modules/npm/node_modules/emoji-regex": { "version": "8.0.0", "inBundle": true, @@ -10521,7 +10415,7 @@ "license": "MIT" }, "node_modules/npm/node_modules/exponential-backoff": { - "version": "3.1.2", + "version": "3.1.3", "inBundle": true, "license": "Apache-2.0" }, @@ -10533,21 +10427,6 @@ "node": ">= 4.9.1" } }, - "node_modules/npm/node_modules/foreground-child": { - "version": "3.3.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/npm/node_modules/fs-minipass": { "version": "3.0.3", "inBundle": true, @@ -10560,20 +10439,14 @@ } }, "node_modules/npm/node_modules/glob": { - "version": "11.0.3", + "version": "13.0.0", "inBundle": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "foreground-child": "^3.3.1", - "jackspeak": "^4.1.1", - "minimatch": "^10.0.3", + "minimatch": "^10.1.1", "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", "path-scurry": "^2.0.0" }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, "engines": { "node": "20 || >=22" }, @@ -10587,7 +10460,7 @@ "license": "ISC" }, "node_modules/npm/node_modules/hosted-git-info": { - "version": "9.0.0", + "version": "9.0.2", "inBundle": true, "license": "ISC", "dependencies": { @@ -10658,25 +10531,25 @@ } }, "node_modules/npm/node_modules/ini": { - "version": "5.0.0", + "version": "6.0.0", "inBundle": true, "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/init-package-json": { - "version": "8.2.2", + "version": "8.2.4", "inBundle": true, "license": "ISC", "dependencies": { "@npmcli/package-json": "^7.0.0", "npm-package-arg": "^13.0.0", - "promzard": "^2.0.0", - "read": "^4.0.0", + "promzard": "^3.0.1", + "read": "^5.0.1", "semver": "^7.7.2", "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^6.0.2" + "validate-npm-package-name": "^7.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" @@ -10702,11 +10575,11 @@ } }, "node_modules/npm/node_modules/is-cidr": { - "version": "6.0.0", + "version": "6.0.1", "inBundle": true, "license": "BSD-2-Clause", "dependencies": { - "cidr-regex": "^5.0.0" + "cidr-regex": "5.0.1" }, "engines": { "node": ">=20" @@ -10728,26 +10601,12 @@ "node": ">=16" } }, - "node_modules/npm/node_modules/jackspeak": { - "version": "4.1.1", - "inBundle": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/npm/node_modules/json-parse-even-better-errors": { - "version": "4.0.0", + "version": "5.0.0", "inBundle": true, "license": "MIT", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/json-stringify-nice": { @@ -10777,7 +10636,7 @@ "license": "MIT" }, "node_modules/npm/node_modules/libnpmaccess": { - "version": "10.0.2", + "version": "10.0.3", "inBundle": true, "license": "ISC", "dependencies": { @@ -10789,12 +10648,12 @@ } }, "node_modules/npm/node_modules/libnpmdiff": { - "version": "8.0.8", + "version": "8.0.11", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^9.1.5", - "@npmcli/installed-package-contents": "^3.0.0", + "@npmcli/arborist": "^9.1.8", + "@npmcli/installed-package-contents": "^4.0.0", "binary-extensions": "^3.0.0", "diff": "^8.0.2", "minimatch": "^10.0.3", @@ -10807,19 +10666,19 @@ } }, "node_modules/npm/node_modules/libnpmexec": { - "version": "10.1.7", + "version": "10.1.10", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^9.1.5", + "@npmcli/arborist": "^9.1.8", "@npmcli/package-json": "^7.0.0", "@npmcli/run-script": "^10.0.0", "ci-info": "^4.0.0", "npm-package-arg": "^13.0.0", "pacote": "^21.0.2", - "proc-log": "^5.0.0", + "proc-log": "^6.0.0", "promise-retry": "^2.0.1", - "read": "^4.0.0", + "read": "^5.0.1", "semver": "^7.3.7", "signal-exit": "^4.1.0", "walk-up-path": "^4.0.0" @@ -10829,11 +10688,11 @@ } }, "node_modules/npm/node_modules/libnpmfund": { - "version": "7.0.8", + "version": "7.0.11", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^9.1.5" + "@npmcli/arborist": "^9.1.8" }, "engines": { "node": "^20.17.0 || >=22.9.0" @@ -10852,11 +10711,11 @@ } }, "node_modules/npm/node_modules/libnpmpack": { - "version": "9.0.8", + "version": "9.0.11", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^9.1.5", + "@npmcli/arborist": "^9.1.8", "@npmcli/run-script": "^10.0.0", "npm-package-arg": "^13.0.0", "pacote": "^21.0.2" @@ -10866,7 +10725,7 @@ } }, "node_modules/npm/node_modules/libnpmpublish": { - "version": "11.1.1", + "version": "11.1.3", "inBundle": true, "license": "ISC", "dependencies": { @@ -10874,10 +10733,10 @@ "ci-info": "^4.0.0", "npm-package-arg": "^13.0.0", "npm-registry-fetch": "^19.0.0", - "proc-log": "^5.0.0", + "proc-log": "^6.0.0", "semver": "^7.3.7", "sigstore": "^4.0.0", - "ssri": "^12.0.0" + "ssri": "^13.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" @@ -10907,14 +10766,14 @@ } }, "node_modules/npm/node_modules/libnpmversion": { - "version": "8.0.2", + "version": "8.0.3", "inBundle": true, "license": "ISC", "dependencies": { "@npmcli/git": "^7.0.0", "@npmcli/run-script": "^10.0.0", - "json-parse-even-better-errors": "^4.0.0", - "proc-log": "^5.0.0", + "json-parse-even-better-errors": "^5.0.0", + "proc-log": "^6.0.0", "semver": "^7.3.7" }, "engines": { @@ -10922,7 +10781,7 @@ } }, "node_modules/npm/node_modules/lru-cache": { - "version": "11.2.1", + "version": "11.2.2", "inBundle": true, "license": "ISC", "engines": { @@ -10930,7 +10789,7 @@ } }, "node_modules/npm/node_modules/make-fetch-happen": { - "version": "15.0.2", + "version": "15.0.3", "inBundle": true, "license": "ISC", "dependencies": { @@ -10938,22 +10797,22 @@ "cacache": "^20.0.1", "http-cache-semantics": "^4.1.1", "minipass": "^7.0.2", - "minipass-fetch": "^4.0.0", + "minipass-fetch": "^5.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^1.0.0", - "proc-log": "^5.0.0", + "proc-log": "^6.0.0", "promise-retry": "^2.0.1", - "ssri": "^12.0.0" + "ssri": "^13.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/minimatch": { - "version": "10.0.3", + "version": "10.1.1", "inBundle": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/brace-expansion": "^5.0.0" }, @@ -10984,7 +10843,7 @@ } }, "node_modules/npm/node_modules/minipass-fetch": { - "version": "4.0.1", + "version": "5.0.0", "inBundle": true, "license": "MIT", "dependencies": { @@ -10993,7 +10852,7 @@ "minizlib": "^3.0.1" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" }, "optionalDependencies": { "encoding": "^0.1.13" @@ -11082,11 +10941,11 @@ "license": "MIT" }, "node_modules/npm/node_modules/mute-stream": { - "version": "2.0.0", + "version": "3.0.0", "inBundle": true, "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/negotiator": { @@ -11098,250 +10957,113 @@ } }, "node_modules/npm/node_modules/node-gyp": { - "version": "11.4.2", + "version": "12.1.0", "inBundle": true, "license": "MIT", "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^14.0.3", - "nopt": "^8.0.0", - "proc-log": "^5.0.0", + "make-fetch-happen": "^15.0.0", + "nopt": "^9.0.0", + "proc-log": "^6.0.0", "semver": "^7.3.5", - "tar": "^7.4.3", + "tar": "^7.5.2", "tinyglobby": "^0.2.12", - "which": "^5.0.0" + "which": "^6.0.0" }, "bin": { "node-gyp": "bin/node-gyp.js" }, "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/@npmcli/agent": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "agent-base": "^7.1.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.1", - "lru-cache": "^10.0.1", - "socks-proxy-agent": "^8.0.3" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/cacache": { - "version": "19.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^4.0.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^10.0.1", - "minipass": "^7.0.3", - "minipass-collect": "^2.0.1", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^7.0.2", - "ssri": "^12.0.0", - "tar": "^7.4.3", - "unique-filename": "^4.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/glob": { - "version": "10.4.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/jackspeak": { - "version": "3.4.3", - "inBundle": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/lru-cache": { - "version": "10.4.3", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/node-gyp/node_modules/make-fetch-happen": { - "version": "14.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/agent": "^3.0.0", - "cacache": "^19.0.1", - "http-cache-semantics": "^4.1.1", - "minipass": "^7.0.2", - "minipass-fetch": "^4.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^1.0.0", - "proc-log": "^5.0.0", - "promise-retry": "^2.0.1", - "ssri": "^12.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/minimatch": { - "version": "9.0.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/path-scurry": { - "version": "1.11.1", - "inBundle": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/nopt": { - "version": "8.1.0", + "version": "9.0.0", "inBundle": true, "license": "ISC", "dependencies": { - "abbrev": "^3.0.0" + "abbrev": "^4.0.0" }, "bin": { "nopt": "bin/nopt.js" }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/normalize-package-data": { - "version": "8.0.0", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^9.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/npm-audit-report": { - "version": "6.0.0", + "version": "7.0.0", "inBundle": true, "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/npm-bundled": { - "version": "4.0.0", + "version": "5.0.0", "inBundle": true, "license": "ISC", "dependencies": { - "npm-normalize-package-bin": "^4.0.0" + "npm-normalize-package-bin": "^5.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/npm-install-checks": { - "version": "7.1.2", + "version": "8.0.0", "inBundle": true, "license": "BSD-2-Clause", "dependencies": { "semver": "^7.1.1" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/npm-normalize-package-bin": { - "version": "4.0.0", + "version": "5.0.0", "inBundle": true, "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/npm-package-arg": { - "version": "13.0.0", + "version": "13.0.2", "inBundle": true, "license": "ISC", "dependencies": { "hosted-git-info": "^9.0.0", - "proc-log": "^5.0.0", + "proc-log": "^6.0.0", "semver": "^7.3.5", - "validate-npm-package-name": "^6.0.0" + "validate-npm-package-name": "^7.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/npm-packlist": { - "version": "10.0.1", + "version": "10.0.3", "inBundle": true, "license": "ISC", "dependencies": { - "ignore-walk": "^8.0.0" + "ignore-walk": "^8.0.0", + "proc-log": "^6.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/npm-pick-manifest": { - "version": "11.0.1", + "version": "11.0.3", "inBundle": true, "license": "ISC", "dependencies": { - "npm-install-checks": "^7.1.0", - "npm-normalize-package-bin": "^4.0.0", + "npm-install-checks": "^8.0.0", + "npm-normalize-package-bin": "^5.0.0", "npm-package-arg": "^13.0.0", "semver": "^7.3.5" }, @@ -11350,45 +11072,45 @@ } }, "node_modules/npm/node_modules/npm-profile": { - "version": "12.0.0", + "version": "12.0.1", "inBundle": true, "license": "ISC", "dependencies": { "npm-registry-fetch": "^19.0.0", - "proc-log": "^5.0.0" + "proc-log": "^6.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/npm-registry-fetch": { - "version": "19.0.0", + "version": "19.1.1", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/redact": "^3.0.0", + "@npmcli/redact": "^4.0.0", "jsonparse": "^1.3.1", "make-fetch-happen": "^15.0.0", "minipass": "^7.0.2", - "minipass-fetch": "^4.0.0", + "minipass-fetch": "^5.0.0", "minizlib": "^3.0.1", "npm-package-arg": "^13.0.0", - "proc-log": "^5.0.0" + "proc-log": "^6.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/npm-user-validate": { - "version": "3.0.0", + "version": "4.0.0", "inBundle": true, "license": "BSD-2-Clause", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/p-map": { - "version": "7.0.3", + "version": "7.0.4", "inBundle": true, "license": "MIT", "engines": { @@ -11398,20 +11120,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/package-json-from-dist": { - "version": "1.0.1", - "inBundle": true, - "license": "BlueOak-1.0.0" - }, "node_modules/npm/node_modules/pacote": { - "version": "21.0.3", + "version": "21.0.4", "inBundle": true, "license": "ISC", "dependencies": { "@npmcli/git": "^7.0.0", - "@npmcli/installed-package-contents": "^3.0.0", + "@npmcli/installed-package-contents": "^4.0.0", "@npmcli/package-json": "^7.0.0", - "@npmcli/promise-spawn": "^8.0.0", + "@npmcli/promise-spawn": "^9.0.0", "@npmcli/run-script": "^10.0.0", "cacache": "^20.0.0", "fs-minipass": "^3.0.0", @@ -11420,10 +11137,10 @@ "npm-packlist": "^10.0.1", "npm-pick-manifest": "^11.0.1", "npm-registry-fetch": "^19.0.0", - "proc-log": "^5.0.0", + "proc-log": "^6.0.0", "promise-retry": "^2.0.1", "sigstore": "^4.0.0", - "ssri": "^12.0.0", + "ssri": "^13.0.0", "tar": "^7.4.3" }, "bin": { @@ -11434,24 +11151,16 @@ } }, "node_modules/npm/node_modules/parse-conflict-json": { - "version": "4.0.0", + "version": "5.0.1", "inBundle": true, "license": "ISC", "dependencies": { - "json-parse-even-better-errors": "^4.0.0", + "json-parse-even-better-errors": "^5.0.0", "just-diff": "^6.0.0", "just-diff-apply": "^5.2.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/path-key": { - "version": "3.1.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/path-scurry": { @@ -11482,19 +11191,19 @@ } }, "node_modules/npm/node_modules/proc-log": { - "version": "5.0.0", + "version": "6.1.0", "inBundle": true, "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/proggy": { - "version": "3.0.0", + "version": "4.0.0", "inBundle": true, "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/promise-all-reject-late": { @@ -11526,14 +11235,14 @@ } }, "node_modules/npm/node_modules/promzard": { - "version": "2.0.0", + "version": "3.0.1", "inBundle": true, "license": "ISC", "dependencies": { - "read": "^4.0.0" + "read": "^5.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/qrcode-terminal": { @@ -11544,22 +11253,22 @@ } }, "node_modules/npm/node_modules/read": { - "version": "4.1.0", + "version": "5.0.1", "inBundle": true, "license": "ISC", "dependencies": { - "mute-stream": "^2.0.0" + "mute-stream": "^3.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/read-cmd-shim": { - "version": "5.0.0", + "version": "6.0.0", "inBundle": true, "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/retry": { @@ -11577,7 +11286,7 @@ "optional": true }, "node_modules/npm/node_modules/semver": { - "version": "7.7.2", + "version": "7.7.3", "inBundle": true, "license": "ISC", "bin": { @@ -11587,25 +11296,6 @@ "node": ">=10" } }, - "node_modules/npm/node_modules/shebang-command": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/shebang-regex": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/npm/node_modules/signal-exit": { "version": "4.1.0", "inBundle": true, @@ -11706,14 +11396,14 @@ "license": "CC0-1.0" }, "node_modules/npm/node_modules/ssri": { - "version": "12.0.0", + "version": "13.0.0", "inBundle": true, "license": "ISC", "dependencies": { "minipass": "^7.0.3" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/string-width": { @@ -11729,20 +11419,6 @@ "node": ">=8" } }, - "node_modules/npm/node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/npm/node_modules/strip-ansi": { "version": "6.0.1", "inBundle": true, @@ -11754,18 +11430,6 @@ "node": ">=8" } }, - "node_modules/npm/node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/npm/node_modules/supports-color": { "version": "10.2.2", "inBundle": true, @@ -11778,9 +11442,9 @@ } }, "node_modules/npm/node_modules/tar": { - "version": "7.5.1", + "version": "7.5.2", "inBundle": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -11874,25 +11538,25 @@ } }, "node_modules/npm/node_modules/unique-filename": { - "version": "4.0.0", + "version": "5.0.0", "inBundle": true, "license": "ISC", "dependencies": { - "unique-slug": "^5.0.0" + "unique-slug": "^6.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/unique-slug": { - "version": "5.0.0", + "version": "6.0.0", "inBundle": true, "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/util-deprecate": { @@ -11919,11 +11583,11 @@ } }, "node_modules/npm/node_modules/validate-npm-package-name": { - "version": "6.0.2", + "version": "7.0.0", "inBundle": true, "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/walk-up-path": { @@ -11935,7 +11599,7 @@ } }, "node_modules/npm/node_modules/which": { - "version": "5.0.0", + "version": "6.0.0", "inBundle": true, "license": "ISC", "dependencies": { @@ -11945,104 +11609,11 @@ "node-which": "bin/which.js" }, "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/wrap-ansi": { - "version": "8.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/npm/node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.2.2", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "9.2.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/wrap-ansi/node_modules/string-width": { - "version": "5.1.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/write-file-atomic": { - "version": "6.0.0", + "version": "7.0.0", "inBundle": true, "license": "ISC", "dependencies": { @@ -12050,7 +11621,7 @@ "signal-exit": "^4.0.1" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/yallist": { @@ -12888,6 +12459,15 @@ "version": "1.1.3", "license": "MIT" }, + "node_modules/react-native-elements/node_modules/react-native-size-matters": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/react-native-size-matters/-/react-native-size-matters-0.3.1.tgz", + "integrity": "sha512-mKOfBLIBFBcs9br1rlZDvxD5+mAl8Gfr5CounwJtxI6Z82rGrMO+Kgl9EIg3RMVf3G855a85YVqHJL2f5EDRlw==", + "license": "MIT", + "peerDependencies": { + "react-native": "*" + } + }, "node_modules/react-native-fast-confetti": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/react-native-fast-confetti/-/react-native-fast-confetti-1.1.1.tgz", @@ -13081,8 +12661,10 @@ } }, "node_modules/react-native-size-matters": { - "version": "0.3.1", - "license": "MIT", + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/react-native-size-matters/-/react-native-size-matters-0.0.3.tgz", + "integrity": "sha512-BdB4SrUicQiSN49X0V6oBZVdicsaaZ7vV4K03T5ZzWWlL7jcPf4JENrkJ4/2A9ljCI6vtAdp+YLkuEbe1eLM+g==", + "license": "ISC", "peerDependencies": { "react-native": "*" } @@ -14432,7 +14014,7 @@ }, "node_modules/typescript": { "version": "5.9.2", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", diff --git a/package.json b/package.json index 419bedc..e69be6f 100644 --- a/package.json +++ b/package.json @@ -49,6 +49,7 @@ "react-native-responsive-dimensions": "^3.1.1", "react-native-safe-area-context": "^5.6.1", "react-native-screens": "^4.16.0", + "react-native-size-matters": "^0.0.3", "react-native-svg": "^15.13.0", "react-native-vector-icons": "^10.3.0", "react-native-walkthrough-tooltip": "^1.6.0", diff --git a/react-native.config.js b/react-native.config.js new file mode 100644 index 0000000..8906a57 --- /dev/null +++ b/react-native.config.js @@ -0,0 +1,7 @@ +module.exports = { + project: { + ios: {}, + android: {}, + }, + assets: ['./src/assets/fonts/'], // Path to your fonts +}; diff --git a/src/assets/fonts/Nunito-Black.ttf b/src/assets/fonts/Nunito-Black.ttf new file mode 100644 index 0000000..99491f8 Binary files /dev/null and b/src/assets/fonts/Nunito-Black.ttf differ diff --git a/src/assets/fonts/Nunito-BlackItalic.ttf b/src/assets/fonts/Nunito-BlackItalic.ttf new file mode 100644 index 0000000..6004938 Binary files /dev/null and b/src/assets/fonts/Nunito-BlackItalic.ttf differ diff --git a/src/assets/fonts/Nunito-Bold.ttf b/src/assets/fonts/Nunito-Bold.ttf new file mode 100644 index 0000000..6909689 Binary files /dev/null and b/src/assets/fonts/Nunito-Bold.ttf differ diff --git a/src/assets/fonts/Nunito-BoldItalic.ttf b/src/assets/fonts/Nunito-BoldItalic.ttf new file mode 100644 index 0000000..2479c36 Binary files /dev/null and b/src/assets/fonts/Nunito-BoldItalic.ttf differ diff --git a/src/assets/fonts/Nunito-ExtraBold.ttf b/src/assets/fonts/Nunito-ExtraBold.ttf new file mode 100644 index 0000000..6f4ccde Binary files /dev/null and b/src/assets/fonts/Nunito-ExtraBold.ttf differ diff --git a/src/assets/fonts/Nunito-ExtraBoldItalic.ttf b/src/assets/fonts/Nunito-ExtraBoldItalic.ttf new file mode 100644 index 0000000..a82e6a2 Binary files /dev/null and b/src/assets/fonts/Nunito-ExtraBoldItalic.ttf differ diff --git a/src/assets/fonts/Nunito-ExtraLight.ttf b/src/assets/fonts/Nunito-ExtraLight.ttf new file mode 100644 index 0000000..96711f9 Binary files /dev/null and b/src/assets/fonts/Nunito-ExtraLight.ttf differ diff --git a/src/assets/fonts/Nunito-ExtraLightItalic.ttf b/src/assets/fonts/Nunito-ExtraLightItalic.ttf new file mode 100644 index 0000000..ff043a4 Binary files /dev/null and b/src/assets/fonts/Nunito-ExtraLightItalic.ttf differ diff --git a/src/assets/fonts/Nunito-Italic.ttf b/src/assets/fonts/Nunito-Italic.ttf new file mode 100644 index 0000000..97fd169 Binary files /dev/null and b/src/assets/fonts/Nunito-Italic.ttf differ diff --git a/src/assets/fonts/Nunito-Light.ttf b/src/assets/fonts/Nunito-Light.ttf new file mode 100644 index 0000000..fb050fc Binary files /dev/null and b/src/assets/fonts/Nunito-Light.ttf differ diff --git a/src/assets/fonts/Nunito-LightItalic.ttf b/src/assets/fonts/Nunito-LightItalic.ttf new file mode 100644 index 0000000..0914950 Binary files /dev/null and b/src/assets/fonts/Nunito-LightItalic.ttf differ diff --git a/src/assets/fonts/Nunito-Medium.ttf b/src/assets/fonts/Nunito-Medium.ttf new file mode 100644 index 0000000..a6993eb Binary files /dev/null and b/src/assets/fonts/Nunito-Medium.ttf differ diff --git a/src/assets/fonts/Nunito-MediumItalic.ttf b/src/assets/fonts/Nunito-MediumItalic.ttf new file mode 100644 index 0000000..1913632 Binary files /dev/null and b/src/assets/fonts/Nunito-MediumItalic.ttf differ diff --git a/src/assets/fonts/Nunito-Regular.ttf b/src/assets/fonts/Nunito-Regular.ttf new file mode 100644 index 0000000..be80c3f Binary files /dev/null and b/src/assets/fonts/Nunito-Regular.ttf differ diff --git a/src/assets/fonts/Nunito-SemiBold.ttf b/src/assets/fonts/Nunito-SemiBold.ttf new file mode 100644 index 0000000..06f29ea Binary files /dev/null and b/src/assets/fonts/Nunito-SemiBold.ttf differ diff --git a/src/assets/fonts/Nunito-SemiBoldItalic.ttf b/src/assets/fonts/Nunito-SemiBoldItalic.ttf new file mode 100644 index 0000000..5af8133 Binary files /dev/null and b/src/assets/fonts/Nunito-SemiBoldItalic.ttf differ diff --git a/src/components/CostomAlart.tsx b/src/components/CostomAlart.tsx index 3d8f2c1..4dbc7c2 100644 --- a/src/components/CostomAlart.tsx +++ b/src/components/CostomAlart.tsx @@ -11,6 +11,8 @@ import { BlurView } from "@react-native-community/blur"; import { Ionicons } from "@react-native-vector-icons/ionicons"; import colors from "./colors"; import { responsiveFontSize } from "react-native-responsive-dimensions"; +import { useTheme } from "../theme/ThemeProvider"; +import FontsFamily from "../constents/FontsFamily"; export interface AlertButton { text: string; @@ -29,7 +31,6 @@ export interface CustomAlertProps { onClose?: () => void; } -const BORDER_WIDTH = 6; const RADIUS = 24; const CustomAlert: React.FC = ({ @@ -40,6 +41,8 @@ const CustomAlert: React.FC = ({ alertType = 'info', onClose, }) => { + const { theme } = useTheme(); + const getIcon = () => { switch (alertType) { case 'error': @@ -47,7 +50,7 @@ const CustomAlert: React.FC = ({ case 'success': return { name: "checkmark-circle", color: colors.success }; default: - return { name: "information-circle", color: colors.primary }; + return { name: "information-circle", color: theme.colors.primary }; } }; const icon = getIcon(); @@ -64,34 +67,30 @@ const CustomAlert: React.FC = ({ const getButtonStyle = (styleType: string | undefined) => { switch (styleType) { case "primary": - return [styles.button, styles.primaryButton]; + return [styles.primaryButton,{ backgroundColor: theme.colors.textPrimary }]; case "secondary": - return [styles.button, styles.secondaryButton]; + return [styles.primaryButton,{ backgroundColor: theme.colors.textPrimary }]; case "outline": - return [styles.button, styles.outlineButton]; + return [styles.primaryButton,{ backgroundColor: theme.colors.textPrimary }]; case "destructive": - return [styles.button, styles.destructiveButton]; + return [styles.primaryButton,{ backgroundColor: theme.colors.textPrimary }]; case "cancel": - return [styles.button, styles.cancelButton]; + return [styles.primaryButton,{ backgroundColor: theme.colors.textPrimary }]; default: - return [styles.button, styles.defaultButton]; + return [styles.primaryButton,{ backgroundColor: theme.colors.textPrimary }]; } }; const getButtonTextStyle = (styleType: string | undefined) => { switch (styleType) { - case "primary": - return [styles.buttonText, styles.primaryButtonText]; - case "secondary": - return [styles.buttonText, styles.secondaryButtonText]; case "outline": - return [styles.buttonText, styles.outlineButtonText]; - case "destructive": - return [styles.buttonText, styles.destructiveButtonText]; + return { color: theme.colors.reverseText }; case "cancel": - return [styles.buttonText, styles.cancelButtonText]; + return { color: colors.error }; + case "secondary": + return { color: theme.colors.reverseText }; default: - return [styles.buttonText, styles.defaultButtonText]; + return { color: theme.colors.reverseText }; } }; @@ -103,35 +102,49 @@ const CustomAlert: React.FC = ({ onRequestClose={handleRequestClose} > + {/* Background Overlay */} {Platform.OS === 'ios' ? ( - + ) : ( - + )} - - + {/* Alert Box */} + + - {/* smaller icon for vertical compression */} + - {title} - {message} + + {title} + {message} + {buttons.length > 0 && ( {buttons.map((button, index) => ( {button.text} @@ -153,112 +166,83 @@ const styles = StyleSheet.create({ alignItems: "center", }, absolute: { - position: 'absolute', - top: 0, - left: 0, - bottom: 0, - right: 0, + ...StyleSheet.absoluteFillObject, }, box: { - paddingHorizontal: 2, // reduce horizontal padding - padding: BORDER_WIDTH + 2, // reduce overall padding - borderRadius: RADIUS + BORDER_WIDTH, - width: '90%', - maxWidth: 400, - alignSelf: 'center', - margin: 10, // reduce margin for vertical compression - backgroundColor: colors.pastelPink, - position: 'relative', - overflow: 'hidden', - }, - faintOverlay: { - ...StyleSheet.absoluteFillObject, - backgroundColor: "rgba(255,255,255,0.77)", - zIndex: 1, + width: '85%', + maxWidth: 340, borderRadius: RADIUS, + alignSelf: 'center', + overflow: 'hidden', + shadowColor: "#000", + shadowOffset: { width: 0, height: 10 }, + shadowOpacity: 0.25, + shadowRadius: 10, + elevation: 10, }, contentContainer: { - zIndex: 2, - padding: 12, // reduce container padding + padding: 20, alignItems: "center", }, iconContainer: { - marginBottom: 8, // reduce vertical space below icon + marginBottom: 12, }, alertTitle: { - fontSize: responsiveFontSize(1.8), // smaller font size - fontWeight: "bold", - color: colors.textDark, - marginBottom: 4, // less space below title + fontSize: responsiveFontSize(2), + fontFamily: FontsFamily.nunitoExtraBold, + marginBottom: 8, textAlign: "center", + }, alertMessage: { - fontSize: responsiveFontSize(1.4), // smaller font size - color: colors.textLight, + fontFamily: FontsFamily.nunitoRegular, + fontSize: responsiveFontSize(1.6), textAlign: "center", - marginBottom: 12, // tighter spacing - lineHeight: 18, // reduced line height + marginBottom: 20, + lineHeight: 20, }, buttonContainer: { flexDirection: "row", justifyContent: 'flex-end', width: "100%", - gap: 8, // reduce gap between buttons + gap: 10, + flexWrap: 'wrap', // Allow wrapping if many buttons }, button: { - paddingVertical: 8, // less vertical padding - paddingHorizontal: 16, // less horizontal padding - borderRadius: 16, + paddingVertical: 10, + paddingHorizontal: 20, + borderRadius: 12, justifyContent: 'center', alignItems: 'center', - minWidth: 72, // slightly smaller minimum width - borderWidth: 0, + minWidth: 80, }, - // === BUTTON STYLE VARIANTS === + buttonText: { + fontSize: responsiveFontSize(1.6), + fontFamily: FontsFamily.nunitoBold, + }, + + // === BUTTON STYLES === defaultButton: { - backgroundColor: colors.pastelPink, - }, - destructiveButton: { - backgroundColor: colors.error, + backgroundColor: colors.pastelPink, // Or theme.colors.primary }, primaryButton: { backgroundColor: colors.primary, }, secondaryButton: { - backgroundColor: colors.pastelBlue, + backgroundColor: '#E0E0E0', // Neutral gray + }, + destructiveButton: { + backgroundColor: colors.error, }, outlineButton: { - borderColor: colors.primary, - borderWidth: 2, - backgroundColor: "transparent", + borderWidth: 1.5, + borderColor: colors.primary, // Will be overridden by theme in render if needed + backgroundColor: 'transparent', }, cancelButton: { - borderColor: colors.error, borderWidth: 1, - backgroundColor: "transparent", - }, - // === BUTTON TEXT COLOR VARIANTS === - buttonText: { - fontSize: responsiveFontSize(1.4), // smaller text - fontWeight: "700", - }, - defaultButtonText: { - color: colors.white, - }, - destructiveButtonText: { - color: colors.white, - }, - primaryButtonText: { - color: colors.white, - }, - secondaryButtonText: { - color: colors.textDark, - }, - outlineButtonText: { - color: colors.primary, - }, - cancelButtonText: { - color: colors.error, + borderColor: colors.error, + backgroundColor: 'transparent', }, }); diff --git a/src/components/common/AnimatedCard.tsx b/src/components/common/AnimatedCard.tsx index 0278f1b..5243710 100644 --- a/src/components/common/AnimatedCard.tsx +++ b/src/components/common/AnimatedCard.tsx @@ -1,9 +1,11 @@ -import React, { useRef } from "react"; +import React, { use, useRef } from "react"; import { View, Text, StyleSheet, Animated, TouchableWithoutFeedback } from "react-native"; import LinearGradient from "react-native-linear-gradient"; import { Ionicons } from "@react-native-vector-icons/ionicons"; import colors from "../colors"; import { responsiveFontSize } from "react-native-responsive-dimensions"; +import { useTheme } from "../../theme/ThemeProvider"; +import FontsFamily from "../../constents/FontsFamily"; type CardProps = { title: string; @@ -23,7 +25,7 @@ const AnimatedCard: React.FC = ({ backTwo = colors.pastelPink, }) => { const scale = useRef(new Animated.Value(1)).current; - + const{ theme } = useTheme() const handlePress = () => { Animated.sequence([ Animated.spring(scale, { toValue: 0.95, useNativeDriver: true }), @@ -33,11 +35,11 @@ const AnimatedCard: React.FC = ({ return ( - - - {title} - {subtitle && {subtitle}} - + + + {title} + {subtitle && {subtitle}} + ); @@ -58,8 +60,8 @@ const styles = StyleSheet.create({ alignItems: "center", }, icon: { marginBottom: 10 }, - title: { fontSize: responsiveFontSize(1.8), fontWeight: "bold", color: "#fff" }, - subtitle: { fontSize: responsiveFontSize(1.3), color: "#fff", opacity: 0.9 }, + title: { fontSize: responsiveFontSize(2.2), fontFamily: FontsFamily.nunitoExtraBold, color: "#fff" }, + subtitle: { fontSize: responsiveFontSize(1.5), fontFamily: FontsFamily.nunitoRegular, opacity: 0.9 }, }); export default AnimatedCard; diff --git a/src/constents/FontsFamily.tsx b/src/constents/FontsFamily.tsx new file mode 100644 index 0000000..0594667 --- /dev/null +++ b/src/constents/FontsFamily.tsx @@ -0,0 +1,29 @@ +const FontsFamily = { + nunitoLight: 'Nunito-Light', + + nunitoBlack: 'Nunito-Black', + nunitoBlackItalic: 'Nunito-BlackItalic', + + nunitoBold: 'Nunito-Bold', + nunitoBoldItalic: 'Nunito-BoldItalic', + + nunitoExtraBold: 'Nunito-ExtraBold', + nunitoExtraBoldItalic: 'Nunito-ExtraBoldItalic', + + nunitoExtraLight: 'Nunito-ExtraLight', + nunitoExtraLightItalic: 'Nunito-ExtraLightItalic', + + nunitoItalic: 'Nunito-Italic', + + nunitoLightItalic: 'Nunito-LightItalic', + + nunitoMedium: 'Nunito-Medium', + nunitoMediumItalic: 'Nunito-MediumItalic', + + nunitoRegular: 'Nunito-Regular', + + nunitoSemiBold: 'Nunito-SemiBold', + nunitoSemiBoldItalic: 'Nunito-SemiBoldItalic', +}; + +export default FontsFamily; diff --git a/src/navigation/BottomTabs.tsx b/src/navigation/BottomTabs.tsx index 051e829..8f4e9e5 100644 --- a/src/navigation/BottomTabs.tsx +++ b/src/navigation/BottomTabs.tsx @@ -1,6 +1,15 @@ -import React from "react"; -import { BottomTabNavigationProp, createBottomTabNavigator } from "@react-navigation/bottom-tabs"; -import { View, Text, StyleSheet, Platform, AccessibilityInfo } from "react-native"; +import React, { useState, useEffect } from "react"; +import { + BottomTabNavigationProp, + createBottomTabNavigator, +} from "@react-navigation/bottom-tabs"; +import { + View, + Text, + StyleSheet, + Platform, + AccessibilityInfo, +} from "react-native"; import { Ionicons, IoniconsIconName } from "@react-native-vector-icons/ionicons"; import GroupScreen from "../screens/GroupScreen"; import Profile from "../screens/profile/Profile"; @@ -8,8 +17,12 @@ import Home from "../screens/home/Home"; import colors from "../components/colors"; import Setting from "../screens/setting/Setting"; import ManagementScreen from "../screens/management/ManagementScreen"; -import { responsiveFontSize, responsiveHeight } from "react-native-responsive-dimensions"; - +import { + responsiveFontSize, + responsiveHeight, +} from "react-native-responsive-dimensions"; +import { useTheme } from "../theme/ThemeProvider"; +import { useSafeAreaInsets } from "react-native-safe-area-context"; const TAB_CONFIG = { activeColor: "#000", @@ -19,60 +32,72 @@ const TAB_CONFIG = { iconSize: 28, }; -// Background (tab highlight) colors const activeTabColors: { [key: string]: string } = { - Home: colors.pastelPink, // Soft pink - Profile: colors.pastelBlue, // Light sky blue - Group: colors.pastelGreen, // Gentle mint green - Management: colors.pastelOrange, // Warm pastel yellow + Home: colors.pastelPink, + Profile: colors.pastelBlue, + Group: colors.pastelGreen, + Management: colors.pastelOrange, }; -// Icon/Text colors on active tabs const activeIconColors: { [key: string]: string } = { Home: "#333", Profile: "#333", Group: "#333", Management: "#333", -} - +}; export type RootTabParamList = { Home: undefined; Profile: undefined; Group: undefined; - Management: { actionTab?: "My Groups" | "Joined Groups" | "Requests" | "Your Requests" }; + Management: { + actionTab?: "My Groups" | "Joined Groups" | "Requests" | "Your Requests"; + }; }; -// Define the navigation prop type for screens within the tab navigator + export type TabNavigationProp = BottomTabNavigationProp; const Tab = createBottomTabNavigator(); const BottomTabs: React.FC = () => { + const { theme } = useTheme(); + const insets = useSafeAreaInsets(); - const [isReduceMotionEnabled, setIsReduceMotionEnabled] = React.useState(false); - const [isScreenReaderEnabled, setIsScreenReaderEnabled] = React.useState(false); + const [isReduceMotionEnabled, setIsReduceMotionEnabled] = + useState(false); + const [isScreenReaderEnabled, setIsScreenReaderEnabled] = + useState(false); - React.useEffect(() => { - // Check for accessibility settings + useEffect(() => { AccessibilityInfo.isScreenReaderEnabled().then(setIsScreenReaderEnabled); AccessibilityInfo.isReduceMotionEnabled().then(setIsReduceMotionEnabled); const screenReaderSubscription = AccessibilityInfo.addEventListener( - 'screenReaderChanged', + "screenReaderChanged", setIsScreenReaderEnabled ); return () => screenReaderSubscription.remove(); }, []); - - - // console.log("isReduceMotionEnabled : ", isReduceMotionEnabled) - // console.log("isScreenReaderEnabled : ", isScreenReaderEnabled) return ( ({ headerShown: false, - tabBarStyle: [styles.tabBar, {marginVertical:isReduceMotionEnabled ? responsiveHeight(0.5) : responsiveHeight(3.5) || isScreenReaderEnabled ? responsiveHeight(0.5) : responsiveHeight(3.5)}], + tabBarStyle: [ + [styles.tabBar,{ backgroundColor: theme.colors.reverseBackground }], + { + bottom: insets.bottom + 10 + }, + ], + + // Make each tab item occupy the full bar height and center its content + tabBarItemStyle: { + height: "100%", + justifyContent: "center", + alignItems: "center", + padding: 0, + margin: 0, + }, tabBarLabel: ({ focused, color }) => !focused ? ( @@ -82,32 +107,33 @@ const BottomTabs: React.FC = () => { tabBarIcon: ({ focused }) => { let iconName: IoniconsIconName = "home-outline"; - // Determine icon based on route - if (route.name === "Home") iconName = focused ? "home" : "home-outline"; - else if (route.name === "Profile") iconName = focused ? "person" : "person-outline"; - else if (route.name === "Management") iconName = focused ? "settings" : "settings-outline"; - else if (route.name === "Group") iconName = focused ? "people" : "people-outline"; + if (route.name === "Home") + iconName = focused ? "home" : "home-outline"; + else if (route.name === "Profile") + iconName = focused ? "person" : "person-outline"; + else if (route.name === "Management") + iconName = focused ? "settings" : "settings-outline"; + else if (route.name === "Group") + iconName = focused ? "people" : "people-outline"; - // 3. Get the active background color and icon color from the maps - const activeBackgroundColor = activeTabColors[route.name]; + const activeBackgroundColor = theme.colors.background; const activeIconColor = activeIconColors[route.name]; return ( - (route.name === "Management"{}:null) + /> ); }, @@ -119,7 +145,7 @@ const BottomTabs: React.FC = () => { ); -} +}; const styles = StyleSheet.create({ screen: { @@ -135,19 +161,16 @@ const styles = StyleSheet.create({ }, tabBar: { position: "absolute", - bottom: 20, left: 20, right: 20, height: TAB_CONFIG.height, - // backgroundColor: TAB_CONFIG.backgroundColor, borderRadius: 20, shadowColor: "#000", shadowOpacity: 0.1, shadowOffset: { width: 0, height: 5 }, shadowRadius: 8, elevation: 10, - paddingBottom: Platform.OS === "ios" ? 25 : 10, - paddingTop: 10, + paddingTop: 0, marginHorizontal: 10, }, label: { @@ -155,19 +178,18 @@ const styles = StyleSheet.create({ fontSize: responsiveFontSize(1.2), }, iconContainer: { + width: 60, + height: 50, justifyContent: "center", alignItems: "center", - width: 80, // Reduced size for a sleeker look - height: 60, // Reduced size - marginTop: 10, borderRadius: 15, }, activeIconContainer: { - // The default active style, background color is now applied dynamically elevation: 2, - shadowColor: '#000', + shadowColor: "#000", shadowOpacity: 0.1, shadowRadius: 5, }, }); -export default BottomTabs \ No newline at end of file + +export default BottomTabs; diff --git a/src/screens/LoginScreen.tsx b/src/screens/LoginScreen.tsx index 806bd56..e0a618e 100644 --- a/src/screens/LoginScreen.tsx +++ b/src/screens/LoginScreen.tsx @@ -19,17 +19,27 @@ import type { StackNavigationProp } from '@react-navigation/stack'; import { RootStackParamList } from '../navigation/AppNavigator'; import LinearGradient from 'react-native-linear-gradient'; import Ionicons from '@react-native-vector-icons/ionicons'; -import MaterialRipple from 'react-native-material-ripple'; +import MaterialRipple from 'react-native-material-ripple'; import CustomAlert from '../components/CostomAlart'; import colors from '../components/colors'; -import { responsiveFontSize } from 'react-native-responsive-dimensions'; +import { + responsiveHeight, + responsiveWidth, + responsiveFontSize +} from "react-native-responsive-dimensions"; +import { useTheme } from '../theme/ThemeProvider'; +import FontsFamily from '../constents/FontsFamily'; + + const { width } = Dimensions.get('window'); const BLOCK_SIZE = width / 3; + // Note: You will need to install react-native-material-ripple // npm install react-native-material-ripple + export default function LoginScreen() { const navigation = useNavigation>(); const [mobile, setMobile] = useState(''); @@ -42,9 +52,12 @@ export default function LoginScreen() { alertType: 'info' as 'info' | 'success' | 'error', }); + const fade = useRef(new Animated.Value(0)).current; const slide = useRef(new Animated.Value(30)).current; const ctaScale = useRef(new Animated.Value(1)).current; + const { theme } = useTheme(); + useEffect(() => { Animated.parallel([ @@ -53,6 +66,7 @@ export default function LoginScreen() { ]).start(); }, []); + const showAlert = ( title: string, message: string, @@ -62,10 +76,12 @@ export default function LoginScreen() { setAlertInfo({ visible: true, title, message, buttons, alertType }); }; + const hideAlert = () => { setAlertInfo({ ...alertInfo, visible: false }); }; + const handleContinue = async () => { if (mobile.length === 10) { setLoading(true); @@ -87,58 +103,64 @@ export default function LoginScreen() { } }; + const colorsBlocks = [ - colors.pastelPink, - colors.pastelBlue, - colors.pastelGreen, - colors.pastelOrange, - colors.pastelBlue, - colors.pastelPink, - colors.pastelGreen, - colors.pastelOrange, - colors.pastelPink, + theme.colors.logincard, + theme.colors.logincard1, + theme.colors.logincard1, + theme.colors.logincard, + theme.colors.logincard, + theme.colors.logincard1, + theme.colors.logincard1, + theme.colors.logincard, + theme.colors.logincard, ]; - return ( - - - {/* Funky grid blocks background (Unchanged) */} - - {colorsBlocks.map((bgColor, index) => ( - - ))} - + return ( + + + + + {/* Funky grid blocks background (Unchanged) */} + + {colorsBlocks.map((bgColor, index) => ( + + + ))} + + - + - CircleCollect - Welcome Back! - + CircleCollect + Welcome Back! + Let's get you signed in to your community. - - - + + + + - + + - + {loading ? ( - + ) : ( - Continue - + Continue + )} - + Your privacy is our priority. Your information is always secure. @@ -180,6 +198,7 @@ export default function LoginScreen() { + >([]); const route = useRoute(); @@ -133,17 +136,17 @@ export default function OtpVerificationScreen() { await getFcmToken(res.data?.data?.userId); let hasActionRun = false; - const successAction = () => { - if (hasActionRun) return; - hasActionRun = true; - hideAlert(); - navigation.dispatch( - CommonActions.reset({ - index: 0, - routes: [{ name: 'Home' }], - }) - ); -}; + const successAction = () => { + if (hasActionRun) return; + hasActionRun = true; + hideAlert(); + navigation.dispatch( + CommonActions.reset({ + index: 0, + routes: [{ name: 'Home' }], + }) + ); + }; triggerAlert( 'Success!', @@ -238,56 +241,64 @@ export default function OtpVerificationScreen() { } }; - const colorsBlocks = [ - colors.pastelPink, - colors.pastelBlue, - colors.pastelGreen, - colors.pastelOrange, - colors.pastelBlue, - colors.pastelPink, - colors.pastelGreen, - colors.pastelOrange, - colors.pastelPink, + const colorsBlocks = [ + theme.colors.logincard, + theme.colors.logincard1, + theme.colors.logincard1, + theme.colors.logincard, + theme.colors.logincard, + theme.colors.logincard1, + theme.colors.logincard1, + theme.colors.logincard, + theme.colors.logincard, ]; return ( - - + + {colorsBlocks.map((bgColor, index) => ( - - ))} + + ))} - - + - Verify Your Code - We’ve sent a 6-digit verification code to +91 {mobile}. + Verify Your Code + We’ve sent a 6-digit verification code to +91 {mobile}. - + {Array.from({ length: CELL_COUNT }).map((_, i) => ( { inputs.current[i] = r; }} - style={[styles.cell, code[i] ? styles.cellFilled : null]} + // UPDATED CELL STYLE + style={[ + styles.cell, + code[i] ? styles.cellFilled : null, + { + backgroundColor: theme.colors.optCard, + color: theme.colors.reverseText, + } + ]} + keyboardType="number-pad" maxLength={i === 0 ? CELL_COUNT : 1} value={code[i]} onChangeText={(t) => (i === 0 ? handleFirstCellChange(t) : updateIndex(i, t))} onKeyPress={(e) => handleKeyPress(i, e)} - placeholder="•" + placeholder="*" placeholderTextColor="#BDBDBD" textContentType="oneTimeCode" /> @@ -300,16 +311,16 @@ export default function OtpVerificationScreen() { onPressIn={() => Animated.spring(ctaScale, { toValue: 0.97, useNativeDriver: true }).start()} onPressOut={() => Animated.spring(ctaScale, { toValue: 1, useNativeDriver: true }).start()} onPress={() => onSubmit(code.join(""), mobile)} - style={styles.button} + style={[styles.button, { backgroundColor: theme.colors.background }]} > - Verify & Continue + Verify & Continue {timer > 0 ? ( - Resend code in 00:{timer.toString().padStart(2, "0")} + Resend code in 00:{timer.toString().padStart(2, "0")} ) : ( - + {isResending ? "Resending..." : "Resend Code"} @@ -335,16 +346,15 @@ const styles = StyleSheet.create({ borderRadius: 16, }, elevatedBlock: { - shadowColor: '#000', - shadowOffset: { width: 0, height: 5 }, - shadowOpacity: 0.15, - shadowRadius: 10, - elevation: 7, + shadowColor: '#ffffffff', + shadowOffset: { width: 1, height: 5 }, + shadowOpacity: 1, + shadowRadius: 15, + elevation: 10, }, keyboardAvoidingContainer: { flex: 1, justifyContent: 'center' }, contentPanel: { marginHorizontal: 24, - backgroundColor: 'rgba(255, 255, 255, 0.95)', borderRadius: 32, padding: 28, shadowColor: '#000', @@ -354,13 +364,33 @@ const styles = StyleSheet.create({ elevation: 12, }, topSection: { alignItems: 'center', marginBottom: 24 }, - title: { fontSize: 28, fontWeight: "bold", color: colors.textDark, textAlign: 'center', marginBottom: 12 }, - subtitle: { fontSize: 16, color: colors.textLight, textAlign: 'center', marginBottom: 32, lineHeight: 24, maxWidth: 300 }, - otpRow: { flexDirection: "row", justifyContent: "space-between", width: '100%', paddingHorizontal: 10 }, - cell: { width: 48, height: 56, borderRadius: 12, borderWidth: 1.5, borderColor: colors.inputBorder, backgroundColor: colors.white, textAlign: "center", fontSize: 22, fontWeight: '700', color: colors.textDark, shadowColor: "#000", shadowOffset: { width: 0, height: 2 }, shadowOpacity: 0.08, shadowRadius: 8, elevation: 3 }, - cellFilled: { borderColor: colors.primary, backgroundColor: '#F7F2FF' }, + title: { fontSize: 28, color: colors.textDark, textAlign: 'center', marginBottom: 12 ,fontFamily: FontsFamily.nunitoExtraBold}, + subtitle: { fontSize: 16, color: colors.textLight, textAlign: 'center', marginBottom: 32, lineHeight: 24, maxWidth: 300 ,fontFamily: FontsFamily.nunitoMedium}, + + otpRow: { + flexDirection: "row", + justifyContent: "space-between", + width: '100%', + paddingHorizontal: 0, // Removed padding to use full width + }, + + // FIX: Updated Cell Styling for clean smooth radius + cell: { + width: 45, + height: 52, + borderRadius: 14, // Smoother radius + textAlign: "center", + fontSize: 20, + fontWeight: "600", + elevation: 0, // Removed elevation for flat look (or keep if you want shadow) + overflow: 'hidden', + }, + cellFilled: { + // Optional: Add specific style when filled if needed, handled inline above + }, + bottomSection: { paddingBottom: Platform.OS === "ios" ? 20 : 10, paddingTop: 10 }, - button: { backgroundColor: colors.pastelPink, paddingVertical: 18, borderRadius: 30, alignItems: "center", justifyContent: "center", shadowColor: colors.primary, shadowOffset: { width: 0, height: 8 }, shadowOpacity: 0.3, shadowRadius: 15, elevation: 8 ,borderWidth:2, borderColor:colors.pastelPink}, - buttonText: { color: colors.white, fontWeight: "700", fontSize: 16 }, - footerText: { textAlign: "center", color: colors.textLight, fontSize: 14, marginTop: 20 }, + button: { backgroundColor: colors.pastelPink, paddingVertical: 18, borderRadius: 30, alignItems: "center", justifyContent: "center",}, + buttonText: { color: colors.white, fontSize: 16, fontFamily: FontsFamily.nunitoBold }, + footerText: { textAlign: "center", fontFamily: FontsFamily.nunitoBold, fontSize: 14, marginTop: 20 }, }); diff --git a/src/screens/home/Home.tsx b/src/screens/home/Home.tsx index f508743..35964a9 100644 --- a/src/screens/home/Home.tsx +++ b/src/screens/home/Home.tsx @@ -10,6 +10,7 @@ import { ListRenderItem, Alert, RefreshControl, + StatusBar, } from "react-native"; import AppView from "../../components/AppView"; import colors from "../../components/colors"; @@ -23,6 +24,10 @@ import AnimatedCard from "../../components/common/AnimatedCard"; import { Ionicons } from "@react-native-vector-icons/ionicons"; import { apiCall } from "../../utils/ApiHelper"; import CustomAlert, { CustomAlertProps } from "../../components/CostomAlart"; +import { useTheme } from "../../theme/ThemeProvider"; +import FontsFamily from "../../constents/FontsFamily"; +import { responsiveFontSize, responsiveHeight } from "react-native-responsive-dimensions"; +import { useSafeAreaInsets } from "react-native-safe-area-context"; if (Platform.OS === "android" && UIManager.setLayoutAnimationEnabledExperimental) { UIManager.setLayoutAnimationEnabledExperimental(true); @@ -80,6 +85,8 @@ const Home: React.FC = () => { const [userDashboard, setUserDashboard] = useState(null); const [refreshing, setRefreshing] = useState(false); const [statusData, setStatusData] = useState(null); + const insets = useSafeAreaInsets(); + const {theme} = useTheme(); const getDashboardData = async () => { try { const result = (await apiCall(DASHBOARD_URL, "GET")) as any; @@ -186,7 +193,8 @@ const Home: React.FC = () => { }; return ( - + + { ListHeaderComponent={ <> - - - Hello, {user.firstName || apiUser?.firstName || "User"} + + + Hello, + {user.firstName || apiUser?.firstName || "User"} - navigation.navigate("Notification" as never)}> + navigation.navigate("Notification" as never)} style={{ marginTop: responsiveHeight(2) ,}}> {unreadCount > 0 && ( {unreadCount} )} - + @@ -217,7 +226,7 @@ const Home: React.FC = () => { /> - Quick Actions + Quick Actions @@ -243,7 +252,7 @@ const Home: React.FC = () => { onClose={() => setAlertVisible(false)} /> )} - + ); }; @@ -252,7 +261,6 @@ export default Home; const styles = StyleSheet.create({ container: { flex: 1, - backgroundColor: colors.white, }, header: { flexDirection: "row", @@ -262,8 +270,8 @@ const styles = StyleSheet.create({ paddingTop: 24, paddingBottom: 16, }, - greeting: { fontSize: 22, color: colors.textDark }, - sectionTitle: { fontSize: 20, fontWeight: "600", color: colors.textDark, flex: 1 }, + greeting: { fontSize: 22,fontFamily: FontsFamily.nunitoLight }, + sectionTitle: { fontSize: 20, fontWeight: "600", color: colors.textDark, flex: 1 ,fontFamily: FontsFamily.nunitoSemiBold}, actionHeader: { flexDirection: "row", justifyContent: "space-between", diff --git a/src/screens/home/UserProfileStatus.tsx b/src/screens/home/UserProfileStatus.tsx index 2c00a05..797a80d 100644 --- a/src/screens/home/UserProfileStatus.tsx +++ b/src/screens/home/UserProfileStatus.tsx @@ -21,6 +21,8 @@ import { responsiveWidth, responsiveFontSize } from "react-native-responsive-dimensions"; +import { useTheme } from "../../theme/ThemeProvider"; +import FontsFamily from "../../constents/FontsFamily"; type StatusData = { role?: string; @@ -73,7 +75,7 @@ const UserProfileStatus: React.FC = ({ const [showPayDialog, setShowPayDialog] = useState(false); const [selectedGroupIds, setSelectedGroupIds] = useState([]); const [submitting, setSubmitting] = useState(false); - + const {theme} = useTheme(); // console.log("user me : ", userDashboard) // Preselect all due groups at mount and on change useEffect(() => { @@ -92,12 +94,12 @@ const UserProfileStatus: React.FC = ({ // Top grid info items const infoItems = useMemo( () => [ - { icon: , label: "Role", value: statusData?.role || "-" }, - { icon: , label: "Active Groups", value: userDashboard?.activeStatusMyGroupCount?.toString() || "0" }, - { icon: , label: "Joined Groups", value: userDashboard?.myJoinedGroups?.length?.toString() || "0" }, - { icon: , label: "My Groups", value: userDashboard?.myCreatedGroups?.length?.toString() || "0" }, - { icon: , label: "Total Due", value: `₹${userDashboard?.multiplePayAmount || 0}` }, - { icon: , label: "Completed", value: userDashboard?.completeStatusMyGroupCount?.toString() || "0" }, + { icon: , label: "Role", value: statusData?.role || "-" }, + { icon: , label: "Active Groups", value: userDashboard?.activeStatusMyGroupCount?.toString() || "0" }, + { icon: , label: "Joined Groups", value: userDashboard?.myJoinedGroups?.length?.toString() || "0" }, + { icon: , label: "My Groups", value: userDashboard?.myCreatedGroups?.length?.toString() || "0" }, + { icon: , label: "Total Due", value: `₹${userDashboard?.multiplePayAmount || 0}` }, + { icon: , label: "Completed", value: userDashboard?.completeStatusMyGroupCount?.toString() || "0" }, ], [userDashboard, statusData] ); @@ -153,18 +155,18 @@ const UserProfileStatus: React.FC = ({ // Bottom bar const renderDueBar = () => ( - - - Total Due: ₹{totalDue} + + + Total Due: ₹{totalDue} setShowPayDialog(true)} disabled={dueGroups.length === 0} activeOpacity={0.8} > - - Pay All + + Pay All ); @@ -173,17 +175,14 @@ const UserProfileStatus: React.FC = ({ const renderPayDialog = () => ( setShowPayDialog(false)}> - - - Select Groups to Pay + + Select Groups to Pay setShowPayDialog(false)}> - + = ({ {dueGroups.map((group) => ( handleToggleGroup(group.groupId)} activeOpacity={0.85} > - {group.groupName} - + {group.groupName} + ₹{group.baseAmount} {group.lateFee > 0 ? ` (Late: ₹${group.lateFee})` : ""} - ₹{group.totalDue} + {/* ₹{group.totalDue} */} ))} - - Total: ₹{totalDueSelected} + + Total : ₹{totalDueSelected} {submitting ? ( - + ) : ( <> - - Pay Selected + + Pay Selected )} - + ); return ( - - - Profile Overview + + Profile Overview - - - + + + {statusData?.profileStatus ? "Verified" : "Pending"} @@ -265,16 +267,16 @@ const UserProfileStatus: React.FC = ({ {infoItems.map((item, idx) => ( - + - + {item.icon} - + {item.label} - + {item.value} @@ -296,16 +298,16 @@ const UserProfileStatus: React.FC = ({ )} - - Total Paid Amount {userDashboard?.totalPaidAmountMonth} - {/* Total Paid Amount {userDashboard?.totalPaidAmountMonth} */} + + Total Paid Amount + {userDashboard?.totalPaidAmountMonth} {renderDueBar()} - + {renderPayDialog()} @@ -377,8 +379,8 @@ const styles = StyleSheet.create({ marginRight: 8 }, header: { - fontSize: responsiveWidth(3.5), - fontWeight: "700", + fontSize: responsiveWidth(4.5), + fontFamily: FontsFamily.nunitoBold, color: "#fff" }, statusBadge: { @@ -411,14 +413,11 @@ const styles = StyleSheet.create({ gap: 10 }, infoCard: { - backgroundColor: 'rgba(255,255,255,0.15)', - borderRadius: 14, padding: 12, - borderWidth: 1, - borderColor: 'rgba(255,255,255,0.2)', flex: 1, minWidth: '45%', marginBottom: 8, + borderRadius:12 }, infoCardOne: { backgroundColor: 'rgba(255,255,255,0.15)', @@ -436,25 +435,22 @@ const styles = StyleSheet.create({ marginBottom: 6 }, iconContainer: { - width: 28, - height: 28, - backgroundColor: '#fff', - borderRadius: 8, + width: responsiveWidth(8), + height: responsiveHeight(3.5), + borderRadius: responsiveWidth(2), justifyContent: 'center', alignItems: 'center', marginRight: 8, }, infoLabel: { - color: "rgba(255,255,255,0.9)", - fontSize: responsiveWidth(2), - fontWeight: '500', + fontSize: responsiveWidth(3), + fontFamily: FontsFamily.nunitoSemiBold, flexShrink: 1, }, infoValue: { - fontWeight: "700", - fontSize: responsiveWidth(2.5), + fontFamily: FontsFamily.nunitoBold, + fontSize: responsiveWidth(3), textAlign: 'left', - color: "#fff" }, profileSection: { width: 90, @@ -498,16 +494,13 @@ const styles = StyleSheet.create({ alignItems: "center", padding: 16, borderTopWidth: 1, - borderColor: "rgba(255,255,255,0.15)", - backgroundColor: "rgba(0,0,0,0.15)", }, dueBarText: { - color: "#fff", - fontSize: responsiveWidth(2.5), - fontWeight: "600" +fontFamily: FontsFamily.nunitoExtraBold, + fontSize: responsiveWidth(4), + }, payAllButton: { - backgroundColor: "#ffffffff", flexDirection: "row", alignItems: "center", paddingHorizontal: 16, @@ -516,8 +509,7 @@ const styles = StyleSheet.create({ gap: 6, }, payAllButtonText: { - color: "#000000ff", - fontWeight: "bold", + fontFamily: FontsFamily.nunitoBold, fontSize: responsiveWidth(2.5) }, payModalOverlay: { @@ -527,7 +519,7 @@ const styles = StyleSheet.create({ alignItems: "center", }, payModalBox: { - width: "92%", + width: "90%", borderRadius: 24, overflow: "hidden", alignItems: "center", @@ -547,9 +539,10 @@ const styles = StyleSheet.create({ borderColor: "rgba(255,255,255,0.1)", }, payDialogTitle: { - color: "#000000ff", - fontSize: responsiveWidth(1.8), - fontWeight: "700" + + fontSize: responsiveWidth(4), + fontFamily: FontsFamily.nunitoBold, + }, payGroupOption: { flexDirection: "row", @@ -557,24 +550,20 @@ const styles = StyleSheet.create({ gap: 16, paddingVertical: 12, paddingHorizontal: 14, - borderColor: colors.primary, - borderWidth: 1, borderRadius: 12, marginBottom: 8, }, payOptionSelected: { - backgroundColor: "rgba(166, 49, 255, 0.2)", - borderColor: colors.primary, + borderWidth: 1, }, payGroupName: { - color: "#000000ff", - fontWeight: "700", - fontSize: responsiveWidth(2.5) + fontFamily: FontsFamily.nunitoSemiBold, + fontSize: responsiveWidth(3) }, payDueText: { - color: "rgba(0, 0, 0, 0.8)", - fontSize: responsiveWidth(1.3), + fontSize: responsiveWidth(3), + fontFamily: FontsFamily.nunitoRegular, marginTop: 2 }, payAmount: { @@ -591,26 +580,23 @@ const styles = StyleSheet.create({ paddingHorizontal: 18, }, payDialogTotal: { - color: "#000000ff", - fontWeight: "600", - fontSize: responsiveWidth(1.7) +fontFamily: FontsFamily.nunitoBold, + fontSize: responsiveWidth(3.5) }, payConfirmButton: { flexDirection: "row", alignItems: "center", - backgroundColor: colors.primary, - paddingVertical: 12, - paddingHorizontal: 24, - borderRadius: 20, + paddingVertical: 8, + paddingHorizontal: 18, + borderRadius: 12, elevation: 4, - borderColor: colors.primary, - borderWidth: 1, + gap: 8, }, payButtonText: { color: "#ffffffff", fontWeight: "bold", - fontSize: responsiveWidth(2.5) + fontSize: responsiveWidth(3), }, modalOverlay: { flex: 1, diff --git a/src/screens/management/ManagementScreen.tsx b/src/screens/management/ManagementScreen.tsx index be3661d..8ea888a 100644 --- a/src/screens/management/ManagementScreen.tsx +++ b/src/screens/management/ManagementScreen.tsx @@ -1,4 +1,4 @@ -// src/screens/ManagementScreen.tsx + // src/screens/ManagementScreen.tsx import React, { useState, useCallback, FC, useEffect } from "react"; import { View, diff --git a/src/theme/ThemeProvider.tsx b/src/theme/ThemeProvider.tsx new file mode 100644 index 0000000..a1f0cbc --- /dev/null +++ b/src/theme/ThemeProvider.tsx @@ -0,0 +1,61 @@ +// ThemeProvider.tsx + +import React, { createContext, useContext, useEffect, useState } from 'react'; +import { Appearance } from 'react-native'; +import AsyncStorage from '@react-native-async-storage/async-storage'; +import { Theme, ThemeMode, light, dark } from './theme'; + +interface ThemeContextProps { + theme: Theme; + mode: ThemeMode; + setThemeMode: (mode: ThemeMode | 'system') => void; +} + +const ThemeContext = createContext(null); + +export const ThemeProvider = ({ children }: { children: React.ReactNode }) => { + const [mode, setMode] = useState('system'); + const [theme, setTheme] = useState(light); + + // Load saved theme mode + useEffect(() => { + (async () => { + const stored = await AsyncStorage.getItem('app_theme'); + if (stored) setMode(stored as ThemeMode | 'system'); + })(); + }, []); + + // Detect system theme + apply user choice + useEffect(() => { + const applyTheme = () => { + const system = Appearance.getColorScheme() === 'dark' ? 'dark' : 'light'; + const finalMode = mode === 'system' ? system : mode; + + setTheme(finalMode === 'dark' ? dark : light); + }; + + applyTheme(); + + const listener = Appearance.addChangeListener(applyTheme); + return () => listener.remove(); + }, [mode]); + + // Update & save theme mode + const setThemeMode = async (newMode: ThemeMode | 'system') => { + setMode(newMode); + await AsyncStorage.setItem('app_theme', newMode); + }; + + return ( + + {children} + + ); +}; + +// Custom hook +export const useTheme = () => { + const context = useContext(ThemeContext); + if (!context) throw new Error("useTheme must be used inside ThemeProvider"); + return context; +}; diff --git a/src/theme/theme.ts b/src/theme/theme.ts new file mode 100644 index 0000000..920eb06 --- /dev/null +++ b/src/theme/theme.ts @@ -0,0 +1,75 @@ +export type ThemeMode = 'light' | 'dark'; + +export interface ThemeColors { + primary: string; + secondary: string; + background: string; + card: string; + textPrimary: string; + textSecondary: string; + success: string; + border: string; + logincard?: string; + logincard1?: string; + reverseBackground: string; + reverseText?: string; + optCard?: string; + gray?: string; + black?: string; + white?: string; + red?: string; + green?: string; +} + +export interface Theme { + mode: ThemeMode; + colors: ThemeColors; +} + +export const light: Theme = { + mode: 'light', + colors: { + primary: '#F4721E', + secondary: '#FF9A62', + reverseBackground: '#000000', + background: '#FFFFFF', + card: '#F3F4F6', + textPrimary: '#000000', + reverseText: '#FFFFFF', + textSecondary: '#666666', + success: '#008e02', + border: '#E5E7EB', + logincard: '#e0e0e0', + logincard1: '#66666eb3', + optCard: '#66666eb3', + gray:'#e0e0e0ff', + black:'#000000', + white:'#FFFFFF', + red:'#FF0000', + green:'#00C853' + }, +}; + +export const dark: Theme = { + mode: 'dark', + colors: { + primary: '#F4721E', + secondary: '#FF9A62', + reverseBackground: '#FFFFFF', + background: '#000000', // Fixed: Dark mode = Black bg + card: '#111214', + textPrimary: '#FFFFFF', + textSecondary: '#A1A1A1', + reverseText: '#000000', + success: '#00C853', + border: '#222427', + logincard: '#000000', + logincard1: '#8d8d8f', + optCard: '#e0e0e0', + gray:'#66666eb3', + black:'#000000', + white:'#FFFFFF', + red:'#FF0000', + green:'#00C853' + }, +};