diff --git a/package-lock.json b/package-lock.json index eda90c6..bfb6fa4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "0.1.0", "dependencies": { "@babel/plugin-proposal-export-namespace-from": "^7.18.9", + "@expo-google-fonts/exo-2": "^0.4.2", "@expo-google-fonts/inter": "^0.2.3", "@expo/vector-icons": "^14.1.0", "@kolking/react-native-avatar": "^2.1.4", @@ -28,6 +29,7 @@ "expo-dev-client": "~5.2.4", "expo-font": "~13.3.2", "expo-haptics": "~14.1.4", + "expo-linear-gradient": "^15.0.7", "expo-linking": "~7.1.7", "expo-localization": "~16.1.6", "expo-router": "~5.1.6", @@ -1845,6 +1847,12 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@expo-google-fonts/exo-2": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@expo-google-fonts/exo-2/-/exo-2-0.4.2.tgz", + "integrity": "sha512-NHl98DsSHurvtGhOKeMAJsnaN+gVj+FMrlwVdAgiID1RfAKELhw0JojznSJ5cR91bIhiSkcrUMLjYieDQe7RAQ==", + "license": "MIT AND OFL-1.1" + }, "node_modules/@expo-google-fonts/inter": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/@expo-google-fonts/inter/-/inter-0.2.3.tgz", @@ -8769,6 +8777,17 @@ "react": "*" } }, + "node_modules/expo-linear-gradient": { + "version": "15.0.7", + "resolved": "https://registry.npmjs.org/expo-linear-gradient/-/expo-linear-gradient-15.0.7.tgz", + "integrity": "sha512-yF+y+9Shpr/OQFfy/wglB/0bykFMbwHBTuMRa5Of/r2P1wbkcacx8rg0JsUWkXH/rn2i2iWdubyqlxSJa3ggZA==", + "license": "MIT", + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, "node_modules/expo-linking": { "version": "7.1.7", "resolved": "https://registry.npmjs.org/expo-linking/-/expo-linking-7.1.7.tgz", diff --git a/package.json b/package.json index 3d2e0e0..dfd397e 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "private": true, "dependencies": { "@babel/plugin-proposal-export-namespace-from": "^7.18.9", + "@expo-google-fonts/exo-2": "^0.4.2", "@expo-google-fonts/inter": "^0.2.3", "@expo/vector-icons": "^14.1.0", "@kolking/react-native-avatar": "^2.1.4", @@ -24,6 +25,7 @@ "expo-dev-client": "~5.2.4", "expo-font": "~13.3.2", "expo-haptics": "~14.1.4", + "expo-linear-gradient": "^15.0.7", "expo-linking": "~7.1.7", "expo-localization": "~16.1.6", "expo-router": "~5.1.6", diff --git a/src/app/_layout.tsx b/src/app/_layout.tsx index 1b41efb..1f67632 100644 --- a/src/app/_layout.tsx +++ b/src/app/_layout.tsx @@ -8,8 +8,7 @@ import React, { useEffect, useState } from 'react' import { I18nextProvider } from 'react-i18next' import { Provider } from 'react-redux' import { MaintenanceScreen, LoadingScreen, AppUpdatePopup } from '@/components' -// eslint-disable-next-line camelcase -import { useFonts, Inter_400Regular } from '@expo-google-fonts/inter' +import { useCustomFonts } from '@/hooks' import RootContainer from '@/components/RootContainer' import { SafeAreaProvider } from 'react-native-safe-area-context' import * as Sentry from '@sentry/react-native' @@ -72,10 +71,7 @@ const RootLayout = () => { // Specify the type of the state to be either null or an EnhancedStore instance const [reduxStore, setReduxStore] = useState | null>(null) - let [fontsLoaded] = useFonts({ - // eslint-disable-next-line camelcase - Inter: Inter_400Regular, - }) + const { fontsLoaded } = useCustomFonts() useEffect(() => { initStore().then((store) => { diff --git a/src/app/welcome/_layout.tsx b/src/app/welcome/_layout.tsx index 0f75567..0e60918 100644 --- a/src/app/welcome/_layout.tsx +++ b/src/app/welcome/_layout.tsx @@ -1,4 +1,5 @@ -import RootImageBackground from '@/components/RootImageBackground' + +import WelcomeRootImageBackground from '@/components/welcome/WelcomRootImageBackground' import { useAuth } from '@/hooks' import { Redirect, Slot } from 'expo-router' import React from 'react' @@ -18,11 +19,11 @@ export const WelcomeLayout = () => { } return ( - + - + ) } diff --git a/src/app/welcome/index.tsx b/src/app/welcome/index.tsx index 36f5f2c..1e8ece5 100644 --- a/src/app/welcome/index.tsx +++ b/src/app/welcome/index.tsx @@ -1,19 +1,22 @@ -import { LogoIcon, LogoTextIcon } from '@/components/svg' +import { LogoIcon } from '@/components/svg' import ActionButtons from '@/components/ActionButtons' import StyledText from '@/components/StyledText' -import TermsAndPrivacy from '@/components/TermsAndPrivacy' +import { ENButton, WelcomeFeatureRow, WelcomeFooter } from '@/components' import { useDirection, useGuest, useScreenInfo } from '@/hooks' import { RootState } from '@/store' import { createGeneralThemedStyles } from '@/utils' import React from 'react' import { useTranslation } from 'react-i18next' -import { Pressable, View } from 'react-native' +import { View, Text } from 'react-native' +import { useSafeAreaInsets } from 'react-native-safe-area-context' import { useSelector } from 'react-redux' import { useRouter } from 'expo-router' +import { LinearGradient } from 'expo-linear-gradient' const Welcome: React.FC = () => { const router = useRouter() const { t } = useTranslation() + const insets = useSafeAreaInsets() const { guestLoading, handleGuestLogin } = useGuest() const { isRTL } = useDirection() @@ -21,80 +24,151 @@ const Welcome: React.FC = () => { const theme = useSelector((state: RootState) => state.theme.theme) const generalStyle = createGeneralThemedStyles(theme, isRTL, isSmallScreen, width) + return ( - - - - - - + + + + + + + + - - - {t('greeting')} + + + {t('welcomeHeadingSmall', { defaultValue: t('greeting') })} - - {t('ansariChat')} + + {t('welcomeHeadingMain', { defaultValue: t('ansariChat') })} - {!isSmallScreen && } - - - - - {t('getStarted')} - - router.push('/login')} - > - {t('login')} - - router.push('/register')} - > - {t('register')} - - + - - {guestLoading ? t('login:submitting') : t('login:guestLogin')} - - + + {t('welcomeBlurb', { + defaultValue: + 'Built by Muslims, trained with care - designed to guide with sources, not guesses.', + })} + + + + + + + + + + + + + + router.push('/register')} + isSubmitting={false} + buttonStyle={{ + marginBottom: 12, + borderRadius: 16, + width: '100%', + paddingVertical: 20, + backgroundColor: theme.darkGreenColor, + alignItems: 'center', + }} + buttonTextStyle={{ + fontSize: 20, + color: theme.whiteColor, + }} + /> + router.push('/login')} + isSubmitting={false} + buttonStyle={{ + ...generalStyle.buttonSecondary, + marginBottom: 12, + borderRadius: 16, + width: '100%', + paddingVertical: 20, + backgroundColor: 'rgba(22,160,133, 0.4)', + alignItems: 'center', + borderWidth: 0, + + }} + buttonTextStyle={{ + color: theme.blackColor, + fontSize: 20, + }} + /> + - - - - + + ) } diff --git a/src/assets/images/welcome-background.png b/src/assets/images/welcome-background.png new file mode 100644 index 0000000..de1f982 Binary files /dev/null and b/src/assets/images/welcome-background.png differ diff --git a/src/components/buttons/ENButton.tsx b/src/components/buttons/ENButton.tsx index 03dd099..f6248e9 100644 --- a/src/components/buttons/ENButton.tsx +++ b/src/components/buttons/ENButton.tsx @@ -2,7 +2,7 @@ import { useDirection, useScreenInfo } from '@/hooks' import { RootState } from '@/store' import { createGeneralThemedStyles } from '@/utils' import React, { useState } from 'react' -import { Pressable, Text, ViewStyle } from 'react-native' +import { Pressable, Text, TextStyle, ViewStyle } from 'react-native' import { useSelector } from 'react-redux' interface Props { @@ -12,8 +12,8 @@ interface Props { isSubmitting?: boolean buttonStyle?: ViewStyle buttonHoverStyle?: ViewStyle - buttonTextStyle?: ViewStyle - buttonHoverTextStyle?: ViewStyle + buttonTextStyle?: TextStyle + buttonHoverTextStyle?: TextStyle } const ENButton: React.FC = ({ diff --git a/src/components/index.ts b/src/components/index.ts index 582621e..07f428b 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -13,3 +13,6 @@ export { default as MessageBubble } from './chat/MessageBubble' export { default as PromptCard } from './prompts/PromptCard' export { default as PromptList } from './prompts/PromptList' export { default as ENButton } from './buttons/ENButton' +export { default as WelcomeFeatureRow } from './welcome/WelcomeFeatureRow' +export { default as WelcomeFooter } from './welcome/WelcomeFooter' +export { default as WelcomeRootImageBackground } from './welcome/WelcomRootImageBackground' \ No newline at end of file diff --git a/src/components/welcome/WelcomRootImageBackground.tsx b/src/components/welcome/WelcomRootImageBackground.tsx new file mode 100644 index 0000000..2081ece --- /dev/null +++ b/src/components/welcome/WelcomRootImageBackground.tsx @@ -0,0 +1,17 @@ +import React from 'react' +import { ImageBackground } from 'react-native' + +interface WelcomeRootImageBackgroundProps { + children: React.ReactNode + className?: string +} + +const WelcomeRootImageBackground: React.FC = ({ children, className }) => { + return ( + + {children} + + ) +} + +export default WelcomeRootImageBackground diff --git a/src/components/welcome/WelcomeFeatureRow.tsx b/src/components/welcome/WelcomeFeatureRow.tsx new file mode 100644 index 0000000..cf86652 --- /dev/null +++ b/src/components/welcome/WelcomeFeatureRow.tsx @@ -0,0 +1,90 @@ +import React from 'react' +import { View, Text } from 'react-native' +import { LogoRoundIcon } from '@/components/svg' +import { useDirection } from '@/hooks' +import { Ionicons } from '@expo/vector-icons' +import { RootState } from '@/store' +import { useSelector } from 'react-redux' + +type IconName = 'information' | 'chat' | 'check' | 'logo' + +type WelcomeFeatureRowProps = { + iconName: IconName + text: string +} + +const WelcomeFeatureRow: React.FC = ({ iconName, text }) => { + const { isRTL } = useDirection() + const theme = useSelector((state: RootState) => state.theme.theme) + // Define which text should be bold for each icon + const boldTextMap = { + information: 'Get Source-Based', + chat: 'Save your chats', + check: 'Quick and easy', + logo: null // null means bold the entire text + } + + const getIcon = (name: IconName) => { + const iconProps = { + width: 20, + height: 20, + fill: theme.darkGreenColor + } + + switch (name) { + case 'information': + return + case 'chat': + return + case 'check': + return + case 'logo': + return + default: + return null + } + } + + const renderText = () => { + const baseStyle = { + textAlign: isRTL ? 'right' as const : 'left' as const + } + const boldStyle = { + fontWeight: 'bold' as const, + textAlign: isRTL ? 'right' as const : 'left' as const + } + const boldText = boldTextMap[iconName] + + // If logo icon, bold entire text + if (boldText === null) { + return {text} + } + + // If text contains the bold part, split and style + if (boldText && text.includes(boldText)) { + const parts = text.split(boldText) + return ( + + {parts[0]} + {boldText} + {parts[1]} + + ) + } + // Fallback: return normal text + return {text} + } + + return ( + + + {getIcon(iconName)} + + + {renderText()} + + + ) +} + +export default WelcomeFeatureRow diff --git a/src/components/welcome/WelcomeFooter.tsx b/src/components/welcome/WelcomeFooter.tsx new file mode 100644 index 0000000..1bac1b9 --- /dev/null +++ b/src/components/welcome/WelcomeFooter.tsx @@ -0,0 +1,45 @@ +import StyledText from '@/components/StyledText' +import { RootState } from '@/store' +import getEnv from '@/utils/getEnv' +import React from 'react' +import { useTranslation } from 'react-i18next' +import { Linking, Pressable, View } from 'react-native' +import { useSelector } from 'react-redux' + +const WelcomeFooter: React.FC = () => { + const { t } = useTranslation() + const theme = useSelector((state: RootState) => state.theme.theme) + const handleUrlPress = (url: string) => { + if (typeof window !== 'undefined' && 'open' in window) { + window.open(url, '_blank') + } else { + Linking.openURL(url) + } + } + + return ( + + + handleUrlPress(getEnv('TERMS_URL'))} + > + + {t('termOfUse')} + + + | + handleUrlPress(getEnv('PRIVACY_URL'))} + > + + {t('privacyPolicy')} + + + + + ) +} + +export default WelcomeFooter diff --git a/src/hooks/index.ts b/src/hooks/index.ts index 0827dc7..4453798 100644 --- a/src/hooks/index.ts +++ b/src/hooks/index.ts @@ -1,5 +1,6 @@ export * from './chat' export { useAuth } from './useAuth' +export { useCustomFonts } from './useCustomFonts' export { useDirection } from './useDirection' export { useGuest } from './useGuest' export { useLogout } from './useLogout' diff --git a/src/hooks/useCustomFonts.ts b/src/hooks/useCustomFonts.ts new file mode 100644 index 0000000..ce1577e --- /dev/null +++ b/src/hooks/useCustomFonts.ts @@ -0,0 +1,27 @@ +import { useFonts } from 'expo-font' +import { Inter_400Regular } from '@expo-google-fonts/inter' +import { Exo2_400Regular, Exo2_600SemiBold, Exo2_700Bold, Exo2_700Bold_Italic } from '@expo-google-fonts/exo-2' + +type CustomFonts = { + [fontName: string]: string | number +} + +export const useCustomFonts = () => { + const customFonts: CustomFonts = { + // Google Fonts + Inter: Inter_400Regular, + Exo2: Exo2_400Regular, + 'Exo2-SemiBold': Exo2_600SemiBold, + 'Exo2-Bold': Exo2_700Bold, + 'Exo2-Bold-Italic': Exo2_700Bold_Italic, + } + + const [fontsLoaded, fontError] = useFonts(customFonts) + + return { + fontsLoaded, + fontError, + } +} + +export default useCustomFonts diff --git a/src/i18n/locales/ar/common.json b/src/i18n/locales/ar/common.json index ea8f3f4..4835595 100644 --- a/src/i18n/locales/ar/common.json +++ b/src/i18n/locales/ar/common.json @@ -72,5 +72,15 @@ "updateRequiredDescription": "مطلوب إصدار جديد لمواصلة استخدام أنصاري. يرجى التحديث الآن.", "updateAvailableDescription": "يتوفر إصدار جديد من أنصاري مع ميزات وتحسينات جديدة.", "updateNow": "التحديث الآن", - "updateLater": "لاحقاً" + "updateLater": "لاحقاً", + "welcomeHeadingSmall": "السلام عليكم", + "welcomeHeadingMain": "مرحبًا بك في أنصاري", + "welcomeBlurb": "مبني بأيدي المسلمين ومدرب بعناية – يهدف إلى الإرشاد بالمصادر، لا بالتخمينات.", + "welcomeFeatureSourceBased": "احصل على إرشاد مبني على المصادر في أي وقت", + "welcomeFeatureSaveChats": "احفظ محادثاتك وتابع من حيث توقفت.", + "welcomeFeatureQuickEasy": "تسجيل سريع وسهل", + "welcomeFeatureJoinToday": "انضم إلى أنصاري اليوم!", + "createAccount": "إنشاء حساب", + "logInCta": "تسجيل الدخول", + "continueAsGuestLimited": "المتابعة كضيف (وصول محدود)" } diff --git a/src/i18n/locales/bs/common.json b/src/i18n/locales/bs/common.json index d0ee56c..1de2071 100644 --- a/src/i18n/locales/bs/common.json +++ b/src/i18n/locales/bs/common.json @@ -72,5 +72,15 @@ "updateRequiredDescription": "Nova verzija je potrebna za nastavak korištenja Ansari Chata. Molimo vas da ažurirate odmah.", "updateAvailableDescription": "Nova verzija Ansari Chata je dostupna s novim funkcijama i poboljšanjima.", "updateNow": "Ažuriraj sada", - "updateLater": "Kasnije" + "updateLater": "Kasnije", + "welcomeHeadingSmall": "ESSALAMU ALEJKUM", + "welcomeHeadingMain": "DOBRODOŠLI U ANSARI", + "welcomeBlurb": "Napravljen od muslimana, obučen s pažnjom – vođen izvorima, ne nagađanjima.", + "welcomeFeatureSourceBased": "Vodič zasnovan na izvorima u bilo koje vrijeme", + "welcomeFeatureSaveChats": "Sačuvajte razgovore i nastavite gdje ste stali.", + "welcomeFeatureQuickEasy": "Brza i jednostavna registracija", + "welcomeFeatureJoinToday": "Pridružite se Ansariju danas!", + "createAccount": "Kreiraj račun", + "logInCta": "Prijava", + "continueAsGuestLimited": "Nastavi kao gost (ograničen pristup)" } diff --git a/src/i18n/locales/en/common.json b/src/i18n/locales/en/common.json index de27e40..df9e648 100644 --- a/src/i18n/locales/en/common.json +++ b/src/i18n/locales/en/common.json @@ -72,5 +72,15 @@ "updateRequiredDescription": "A new version is required to continue using Ansari Chat. Please update now.", "updateAvailableDescription": "A new version of Ansari Chat is available with new features and improvements.", "updateNow": "Update Now", - "updateLater": "Later" + "updateLater": "Later", + "welcomeHeadingSmall": "ASSALAAMU ALAIKUM", + "welcomeHeadingMain": "WELCOME TO ANSARI", + "welcomeBlurb": "Built by Muslims, trained with care - designed to guide with sources, not guesses.", + "welcomeFeatureSourceBased": "Get Source-Based Guidance Anytime", + "welcomeFeatureSaveChats": "Save your chats and pick up where you left off.", + "welcomeFeatureQuickEasy": "Quick and easy registration", + "welcomeFeatureJoinToday": "Join Ansari today!", + "createAccount": "Create an account", + "logInCta": "Log-in", + "continueAsGuestLimited": "Continue as guest (limited access)" } diff --git a/src/i18n/locales/fr/common.json b/src/i18n/locales/fr/common.json index dd94f1f..b9c5b9c 100644 --- a/src/i18n/locales/fr/common.json +++ b/src/i18n/locales/fr/common.json @@ -72,5 +72,15 @@ "updateRequiredDescription": "Une nouvelle version est nécessaire pour continuer à utiliser Ansari Chat. Veuillez mettre à jour maintenant.", "updateAvailableDescription": "Une nouvelle version d'Ansari Chat est disponible avec de nouvelles fonctionnalités et améliorations.", "updateNow": "Mettre à jour maintenant", - "updateLater": "Plus tard" + "updateLater": "Plus tard", + "welcomeHeadingSmall": "ASSALAMU ALAIKUM", + "welcomeHeadingMain": "BIENVENUE CHEZ ANSARI", + "welcomeBlurb": "Conçu par des musulmans, entraîné avec soin – guidé par les sources, pas par les suppositions.", + "welcomeFeatureSourceBased": "Des conseils fondés sur les sources à tout moment", + "welcomeFeatureSaveChats": "Enregistrez vos discussions et reprenez où vous vous êtes arrêté.", + "welcomeFeatureQuickEasy": "Inscription simple et rapide", + "welcomeFeatureJoinToday": "Rejoignez Ansari dès aujourd’hui !", + "createAccount": "Créer un compte", + "logInCta": "Se connecter", + "continueAsGuestLimited": "Continuer en tant qu’invité (accès limité)" } diff --git a/src/i18n/locales/id/common.json b/src/i18n/locales/id/common.json index 002408c..6c14911 100644 --- a/src/i18n/locales/id/common.json +++ b/src/i18n/locales/id/common.json @@ -74,5 +74,15 @@ "updateRequiredDescription": "Versi baru diperlukan untuk melanjutkan menggunakan Ansari Chat. Silakan perbarui sekarang.", "updateAvailableDescription": "Versi baru Ansari Chat tersedia dengan fitur dan peningkatan baru.", "updateNow": "Perbarui Sekarang", - "updateLater": "Nanti" + "updateLater": "Nanti", + "welcomeHeadingSmall": "ASSALAMU ALAIKUM", + "welcomeHeadingMain": "SELAMAT DATANG DI ANSARI", + "welcomeBlurb": "Dibangun oleh Muslim, dilatih dengan hati-hati – dirancang untuk membimbing dengan sumber, bukan tebakan.", + "welcomeFeatureSourceBased": "Bimbingan berbasis sumber kapan saja", + "welcomeFeatureSaveChats": "Simpan obrolan Anda dan lanjutkan dari tempat terakhir.", + "welcomeFeatureQuickEasy": "Pendaftaran cepat dan mudah", + "welcomeFeatureJoinToday": "Bergabunglah dengan Ansari hari ini!", + "createAccount": "Buat akun", + "logInCta": "Masuk", + "continueAsGuestLimited": "Lanjut sebagai tamu (akses terbatas)" } diff --git a/src/i18n/locales/tml/common.json b/src/i18n/locales/tml/common.json index b749f24..f53c240 100644 --- a/src/i18n/locales/tml/common.json +++ b/src/i18n/locales/tml/common.json @@ -72,5 +72,15 @@ "updateRequiredDescription": "அன்சாரி சாட்டைத் தொடர்ந்து பயன்படுத்த புதிய பதிப்பு தேவை. இப்போது புதுப்பிக்கவும்.", "updateAvailableDescription": "புதிய அம்சங்கள் மற்றும் மேம்பாடுகளுடன் அன்சாரி சாட்டின் புதிய பதிப்பு கிடைக்கிறது.", "updateNow": "இப்போது புதுப்பி", - "updateLater": "பிறகு" + "updateLater": "பிறகு", + "welcomeHeadingSmall": "அஸ்ஸலாமு அலைக்கும்", + "welcomeHeadingMain": "அன்சாரிக்கு வரவேற்கிறோம்", + "welcomeBlurb": "முஸ்லிம்களால் உருவாக்கப்பட்டது, கவனமாக பயிற்சியளிக்கப்பட்டது — ஊகத்தால் அல்ல, ஆதாரத்தால் வழிகாட்டுகிறது.", + "welcomeFeatureSourceBased": "எப்போதும் ஆதார அடிப்படையிலான வழிகாட்டுதல்", + "welcomeFeatureSaveChats": "உங்கள் உரையாடல்களை சேமித்து, விடுத்த இடத்தில் இருந்து தொடரவும்.", + "welcomeFeatureQuickEasy": "விரைவான மற்றும் எளிய பதிவு", + "welcomeFeatureJoinToday": "இன்று அன்சாரியில் சேருங்கள்!", + "createAccount": "கணக்கை உருவாக்கவும்", + "logInCta": "உள்நுழை", + "continueAsGuestLimited": "விருந்தினராக தொடரவும் (குறுக்கப்பட்ட அணுகல்)" } \ No newline at end of file diff --git a/src/i18n/locales/tur/common.json b/src/i18n/locales/tur/common.json index 492355f..4f93bb7 100644 --- a/src/i18n/locales/tur/common.json +++ b/src/i18n/locales/tur/common.json @@ -72,5 +72,15 @@ "updateRequiredDescription": "Ansari Chat'i kullanmaya devam etmek için yeni bir sürüm gerekiyor. Lütfen şimdi güncelleyin.", "updateAvailableDescription": "Yeni özellikler ve iyileştirmelerle Ansari Chat'in yeni bir sürümü mevcut.", "updateNow": "Şimdi Güncelle", - "updateLater": "Daha Sonra" + "updateLater": "Daha Sonra", + "welcomeHeadingSmall": "ESSALAMU ALEYKUM", + "welcomeHeadingMain": "ANSARI'YE HOŞ GELDİNİZ", + "welcomeBlurb": "Müslümanlar tarafından yapıldı, özenle eğitildi – tahminlerle değil, kaynaklarla rehberlik eder.", + "welcomeFeatureSourceBased": "Her zaman kaynak temelli rehberlik", + "welcomeFeatureSaveChats": "Sohbetlerinizi kaydedin ve kaldığınız yerden devam edin.", + "welcomeFeatureQuickEasy": "Hızlı ve kolay kayıt", + "welcomeFeatureJoinToday": "Bugün Ansari'ye katılın!", + "createAccount": "Hesap oluştur", + "logInCta": "Giriş yap", + "continueAsGuestLimited": "Misafir olarak devam et (sınırlı erişim)" } diff --git a/src/i18n/locales/ur/common.json b/src/i18n/locales/ur/common.json index 2260629..9d923f4 100644 --- a/src/i18n/locales/ur/common.json +++ b/src/i18n/locales/ur/common.json @@ -72,5 +72,15 @@ "updateRequiredDescription": "انصاری چیٹ کو استعمال کرنے کے لیے نیا ورژن درکار ہے۔ براہ کرم ابھی اپڈیٹ کریں۔", "updateAvailableDescription": "نئی خصوصیات اور بہتریوں کے ساتھ انصاری چیٹ کا نیا ورژن دستیاب ہے۔", "updateNow": "ابھی اپڈیٹ کریں", - "updateLater": "بعد میں" + "updateLater": "بعد میں", + "welcomeHeadingSmall": "السلام علیکم", + "welcomeHeadingMain": "انصاری میں خوش آمدید", + "welcomeBlurb": "مسلمانوں کے ذریعے تیار، پوری توجہ سے تربیت یافتہ — اندازوں سے نہیں، حوالہ جات سے رہنمائی۔", + "welcomeFeatureSourceBased": "کسی بھی وقت حوالہ جاتی رہنمائی حاصل کریں", + "welcomeFeatureSaveChats": "اپنی چیٹس محفوظ کریں اور وہیں سے جاری رکھیں جہاں چھوڑا تھا۔", + "welcomeFeatureQuickEasy": "تیز اور آسان رجسٹریشن", + "welcomeFeatureJoinToday": "آج ہی انصاری میں شامل ہوں!", + "createAccount": "اکاؤنٹ بنائیں", + "logInCta": "لاگ اِن", + "continueAsGuestLimited": "مہمان کے طور پر جاری رکھیں (محدود رسائی)" } diff --git a/src/utils/theme.ts b/src/utils/theme.ts index bc2cc01..3b099ae 100644 --- a/src/utils/theme.ts +++ b/src/utils/theme.ts @@ -28,6 +28,10 @@ export interface Theme { backgroundColorSecondary: string scrollColor: string yellowColor: string + darkGreenColor: string + greyColor: string + blackColor: string + whiteColor: string } // Define the light theme object @@ -58,6 +62,10 @@ export const lightTheme: Theme = { backgroundColorSecondary: '#1D1D1D66', scrollColor: '#D9D9E3CC', yellowColor: '#F29B00', + darkGreenColor: "#097468", + greyColor: "#666666", + blackColor: "#000000", + whiteColor: "#FFFFFF", } // Define the dark theme object @@ -88,6 +96,10 @@ export const darkTheme: Theme = { sendIconColor: '#302E2D', scrollColor: '#D9D9E3CC', yellowColor: '#F29B00', + darkGreenColor: "#097468", + greyColor: "#666666", + blackColor: "#000000", + whiteColor: "#FFFFFF", } export const getThemeStyle = (colorSchema: ColorSchemeName, property: string) => { diff --git a/tailwind.config.js b/tailwind.config.js index e1b1073..7c684ac 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -18,7 +18,10 @@ module.exports = { black: '#020202', }, fontFamily: { - roboto: ['Roboto'], + exo2: ['Exo2'], + 'exo2-semibold': ['Exo2-SemiBold'], + 'exo2-bold': ['Exo2-Bold'], + 'exo2-bold-italic': ['Exo2-Bold-Italic'], }, width: { 116: '460px',