feat: implement splash and onboarding flows, update app assets, and add project design documentation

This commit is contained in:
Hamza-Ayed
2026-07-24 04:15:07 +03:00
parent 9f7bc31408
commit 213b459912
208 changed files with 23801 additions and 1066 deletions
+53 -1
View File
@@ -172,6 +172,58 @@
"distance": {"type": "String"}
}
},
"edit": "تعديل",
"resendIn": "إعادة إرسال خلال {seconds}ث",
"@resendIn": {
"placeholders": {
"seconds": {"type": "int"}
}
},
"resendCode": "إعادة إرسال الرمز",
"nameTitle": "ما اسمك؟",
"nameSubtitle": "ساعدنا في تخصيص تجربتك",
"nameHint": "اسمك",
"firstNameHint": "الاسم الأول",
"lastNameHint": "اسم العائلة",
"nameButton": "متابعة",
"reconnect": "جارٍ إعادة الاتصال...",
"tripExpired": "انتهت صلاحية الرحلة"
"tripExpired": "انتهت صلاحية الرحلة",
"loginTitle": "مرحباً بك في Tripz",
"phoneLoginSubtitle": "أدخل رقم هاتفك لتسجيل الدخول",
"sendOtpButton": "إرسال رمز التحقق",
"nameEntryTitle": "ما اسمك؟",
"homeTitle": "الرئيسية",
"destinationTitle": "الوجهة",
"routeTitle": "المسار",
"whereToHint": "إلى أين تريد الذهاب؟",
"currentLocation": "الموقع الحالي",
"savedPlaces": "الأماكن المحفوظة",
"home": "المنزل",
"work": "العمل",
"pickFromMap": "اختيار من الخريطة",
"searchHint": "ابحث عن مكان...",
"noResultsFound": "لا توجد نتائج",
"connecting": "جارٍ الاتصال...",
"tripSummary": "ملخص الرحلة",
"totalDistance": "المسافة الإجمالية",
"estimatedTime": "الوقت المقدر",
"totalFare": "الأجرة الإجمالية",
"chooseRide": "اختر نوع الرحلة",
"promoCode": "كود الترويج",
"errorTitle": "حدث خطأ",
"errorSubtitle": "يرجى المحاولة مرة أخرى",
"emptyTitle": "لا توجد بيانات",
"emptySubtitle": "لم يتم العثور على محتوى حالياً",
"signIn": "تسجيل الدخول",
"confirmPhoneNumber": "تأكيد رقم الهاتف",
"driverRatingValue": "التقييم",
"missingDataError": "بيانات مفقودة",
"onboardingTitle1": "اطلب بلمسة واحدة",
"onboardingSubtitle1": "أدخل وجهتك واحصل على سائق في ثوانٍ",
"onboardingTitle2": "تتبع رحلتك مباشرة",
"onboardingSubtitle2": "شاهد سائقك وهو يقترب في الوقت الفعلي",
"onboardingTitle3": "ادفع كما يناسبك",
"onboardingSubtitle3": "اختر الدفع نقدًا أو بالبطاقة أو عبر المحفظة",
"getStarted": "ابدأ الآن",
"skip": "تخطي"
}
+53 -1
View File
@@ -172,6 +172,58 @@
"distance": {"type": "String"}
}
},
"edit": "Edit",
"resendIn": "Resend in {seconds}s",
"@resendIn": {
"placeholders": {
"seconds": {"type": "int"}
}
},
"resendCode": "Resend code",
"nameTitle": "What's your name?",
"nameSubtitle": "Help us personalize your experience",
"nameHint": "Your name",
"firstNameHint": "First name",
"lastNameHint": "Last name",
"nameButton": "Continue",
"reconnect": "Reconnecting...",
"tripExpired": "Trip expired"
"tripExpired": "Trip expired",
"loginTitle": "Welcome to Tripz",
"phoneLoginSubtitle": "Enter your phone number to log in",
"sendOtpButton": "Send OTP",
"nameEntryTitle": "What's your name?",
"homeTitle": "Home",
"destinationTitle": "Destination",
"routeTitle": "Route",
"whereToHint": "Where are you going?",
"currentLocation": "Current location",
"savedPlaces": "Saved places",
"home": "Home",
"work": "Work",
"pickFromMap": "Pick from map",
"searchHint": "Search for a place...",
"noResultsFound": "No results found",
"connecting": "Connecting...",
"tripSummary": "Trip summary",
"totalDistance": "Total distance",
"estimatedTime": "Estimated time",
"totalFare": "Total fare",
"chooseRide": "Choose a ride",
"promoCode": "Promo code",
"errorTitle": "Something went wrong",
"errorSubtitle": "Please try again",
"emptyTitle": "No data",
"emptySubtitle": "No content found yet",
"signIn": "Sign in",
"confirmPhoneNumber": "Confirm phone number",
"driverRatingValue": "Rating",
"missingDataError": "Missing data",
"onboardingTitle1": "Order with one tap",
"onboardingSubtitle1": "Enter your destination and get a driver in seconds",
"onboardingTitle2": "Track your trip live",
"onboardingSubtitle2": "Watch your driver approach in real-time",
"onboardingTitle3": "Pay your way",
"onboardingSubtitle3": "Choose to pay cash, card, or wallet",
"getStarted": "Get started",
"skip": "Skip"
}
@@ -812,6 +812,60 @@ abstract class AppLocalizations {
/// **'مسافة الرحلة: {distance}'**
String tripDistance(String distance);
/// No description provided for @edit.
///
/// In ar, this message translates to:
/// **'تعديل'**
String get edit;
/// No description provided for @resendIn.
///
/// In ar, this message translates to:
/// **'إعادة إرسال خلال {seconds}ث'**
String resendIn(int seconds);
/// No description provided for @resendCode.
///
/// In ar, this message translates to:
/// **'إعادة إرسال الرمز'**
String get resendCode;
/// No description provided for @nameTitle.
///
/// In ar, this message translates to:
/// **'ما اسمك؟'**
String get nameTitle;
/// No description provided for @nameSubtitle.
///
/// In ar, this message translates to:
/// **'ساعدنا في تخصيص تجربتك'**
String get nameSubtitle;
/// No description provided for @nameHint.
///
/// In ar, this message translates to:
/// **'اسمك'**
String get nameHint;
/// No description provided for @firstNameHint.
///
/// In ar, this message translates to:
/// **'الاسم الأول'**
String get firstNameHint;
/// No description provided for @lastNameHint.
///
/// In ar, this message translates to:
/// **'اسم العائلة'**
String get lastNameHint;
/// No description provided for @nameButton.
///
/// In ar, this message translates to:
/// **'متابعة'**
String get nameButton;
/// No description provided for @reconnect.
///
/// In ar, this message translates to:
@@ -823,6 +877,234 @@ abstract class AppLocalizations {
/// In ar, this message translates to:
/// **'انتهت صلاحية الرحلة'**
String get tripExpired;
/// No description provided for @loginTitle.
///
/// In ar, this message translates to:
/// **'مرحباً بك في Tripz'**
String get loginTitle;
/// No description provided for @phoneLoginSubtitle.
///
/// In ar, this message translates to:
/// **'أدخل رقم هاتفك لتسجيل الدخول'**
String get phoneLoginSubtitle;
/// No description provided for @sendOtpButton.
///
/// In ar, this message translates to:
/// **'إرسال رمز التحقق'**
String get sendOtpButton;
/// No description provided for @nameEntryTitle.
///
/// In ar, this message translates to:
/// **'ما اسمك؟'**
String get nameEntryTitle;
/// No description provided for @homeTitle.
///
/// In ar, this message translates to:
/// **'الرئيسية'**
String get homeTitle;
/// No description provided for @destinationTitle.
///
/// In ar, this message translates to:
/// **'الوجهة'**
String get destinationTitle;
/// No description provided for @routeTitle.
///
/// In ar, this message translates to:
/// **'المسار'**
String get routeTitle;
/// No description provided for @whereToHint.
///
/// In ar, this message translates to:
/// **'إلى أين تريد الذهاب؟'**
String get whereToHint;
/// No description provided for @currentLocation.
///
/// In ar, this message translates to:
/// **'الموقع الحالي'**
String get currentLocation;
/// No description provided for @savedPlaces.
///
/// In ar, this message translates to:
/// **'الأماكن المحفوظة'**
String get savedPlaces;
/// No description provided for @home.
///
/// In ar, this message translates to:
/// **'المنزل'**
String get home;
/// No description provided for @work.
///
/// In ar, this message translates to:
/// **'العمل'**
String get work;
/// No description provided for @pickFromMap.
///
/// In ar, this message translates to:
/// **'اختيار من الخريطة'**
String get pickFromMap;
/// No description provided for @searchHint.
///
/// In ar, this message translates to:
/// **'ابحث عن مكان...'**
String get searchHint;
/// No description provided for @noResultsFound.
///
/// In ar, this message translates to:
/// **'لا توجد نتائج'**
String get noResultsFound;
/// No description provided for @connecting.
///
/// In ar, this message translates to:
/// **'جارٍ الاتصال...'**
String get connecting;
/// No description provided for @tripSummary.
///
/// In ar, this message translates to:
/// **'ملخص الرحلة'**
String get tripSummary;
/// No description provided for @totalDistance.
///
/// In ar, this message translates to:
/// **'المسافة الإجمالية'**
String get totalDistance;
/// No description provided for @estimatedTime.
///
/// In ar, this message translates to:
/// **'الوقت المقدر'**
String get estimatedTime;
/// No description provided for @totalFare.
///
/// In ar, this message translates to:
/// **'الأجرة الإجمالية'**
String get totalFare;
/// No description provided for @chooseRide.
///
/// In ar, this message translates to:
/// **'اختر نوع الرحلة'**
String get chooseRide;
/// No description provided for @promoCode.
///
/// In ar, this message translates to:
/// **'كود الترويج'**
String get promoCode;
/// No description provided for @errorTitle.
///
/// In ar, this message translates to:
/// **'حدث خطأ'**
String get errorTitle;
/// No description provided for @errorSubtitle.
///
/// In ar, this message translates to:
/// **'يرجى المحاولة مرة أخرى'**
String get errorSubtitle;
/// No description provided for @emptyTitle.
///
/// In ar, this message translates to:
/// **'لا توجد بيانات'**
String get emptyTitle;
/// No description provided for @emptySubtitle.
///
/// In ar, this message translates to:
/// **'لم يتم العثور على محتوى حالياً'**
String get emptySubtitle;
/// No description provided for @signIn.
///
/// In ar, this message translates to:
/// **'تسجيل الدخول'**
String get signIn;
/// No description provided for @confirmPhoneNumber.
///
/// In ar, this message translates to:
/// **'تأكيد رقم الهاتف'**
String get confirmPhoneNumber;
/// No description provided for @driverRatingValue.
///
/// In ar, this message translates to:
/// **'التقييم'**
String get driverRatingValue;
/// No description provided for @missingDataError.
///
/// In ar, this message translates to:
/// **'بيانات مفقودة'**
String get missingDataError;
/// No description provided for @onboardingTitle1.
///
/// In ar, this message translates to:
/// **'اطلب بلمسة واحدة'**
String get onboardingTitle1;
/// No description provided for @onboardingSubtitle1.
///
/// In ar, this message translates to:
/// **'أدخل وجهتك واحصل على سائق في ثوانٍ'**
String get onboardingSubtitle1;
/// No description provided for @onboardingTitle2.
///
/// In ar, this message translates to:
/// **'تتبع رحلتك مباشرة'**
String get onboardingTitle2;
/// No description provided for @onboardingSubtitle2.
///
/// In ar, this message translates to:
/// **'شاهد سائقك وهو يقترب في الوقت الفعلي'**
String get onboardingSubtitle2;
/// No description provided for @onboardingTitle3.
///
/// In ar, this message translates to:
/// **'ادفع كما يناسبك'**
String get onboardingTitle3;
/// No description provided for @onboardingSubtitle3.
///
/// In ar, this message translates to:
/// **'اختر الدفع نقدًا أو بالبطاقة أو عبر المحفظة'**
String get onboardingSubtitle3;
/// No description provided for @getStarted.
///
/// In ar, this message translates to:
/// **'ابدأ الآن'**
String get getStarted;
/// No description provided for @skip.
///
/// In ar, this message translates to:
/// **'تخطي'**
String get skip;
}
class _AppLocalizationsDelegate
@@ -385,9 +385,153 @@ class AppLocalizationsAr extends AppLocalizations {
return 'مسافة الرحلة: $distance';
}
@override
String get edit => 'تعديل';
@override
String resendIn(int seconds) {
return 'إعادة إرسال خلال $secondsث';
}
@override
String get resendCode => 'إعادة إرسال الرمز';
@override
String get nameTitle => 'ما اسمك؟';
@override
String get nameSubtitle => 'ساعدنا في تخصيص تجربتك';
@override
String get nameHint => 'اسمك';
@override
String get firstNameHint => 'الاسم الأول';
@override
String get lastNameHint => 'اسم العائلة';
@override
String get nameButton => 'متابعة';
@override
String get reconnect => 'جارٍ إعادة الاتصال...';
@override
String get tripExpired => 'انتهت صلاحية الرحلة';
@override
String get loginTitle => 'مرحباً بك في Tripz';
@override
String get phoneLoginSubtitle => 'أدخل رقم هاتفك لتسجيل الدخول';
@override
String get sendOtpButton => 'إرسال رمز التحقق';
@override
String get nameEntryTitle => 'ما اسمك؟';
@override
String get homeTitle => 'الرئيسية';
@override
String get destinationTitle => 'الوجهة';
@override
String get routeTitle => 'المسار';
@override
String get whereToHint => 'إلى أين تريد الذهاب؟';
@override
String get currentLocation => 'الموقع الحالي';
@override
String get savedPlaces => 'الأماكن المحفوظة';
@override
String get home => 'المنزل';
@override
String get work => 'العمل';
@override
String get pickFromMap => 'اختيار من الخريطة';
@override
String get searchHint => 'ابحث عن مكان...';
@override
String get noResultsFound => 'لا توجد نتائج';
@override
String get connecting => 'جارٍ الاتصال...';
@override
String get tripSummary => 'ملخص الرحلة';
@override
String get totalDistance => 'المسافة الإجمالية';
@override
String get estimatedTime => 'الوقت المقدر';
@override
String get totalFare => 'الأجرة الإجمالية';
@override
String get chooseRide => 'اختر نوع الرحلة';
@override
String get promoCode => 'كود الترويج';
@override
String get errorTitle => 'حدث خطأ';
@override
String get errorSubtitle => 'يرجى المحاولة مرة أخرى';
@override
String get emptyTitle => 'لا توجد بيانات';
@override
String get emptySubtitle => 'لم يتم العثور على محتوى حالياً';
@override
String get signIn => 'تسجيل الدخول';
@override
String get confirmPhoneNumber => 'تأكيد رقم الهاتف';
@override
String get driverRatingValue => 'التقييم';
@override
String get missingDataError => 'بيانات مفقودة';
@override
String get onboardingTitle1 => 'اطلب بلمسة واحدة';
@override
String get onboardingSubtitle1 => 'أدخل وجهتك واحصل على سائق في ثوانٍ';
@override
String get onboardingTitle2 => 'تتبع رحلتك مباشرة';
@override
String get onboardingSubtitle2 => 'شاهد سائقك وهو يقترب في الوقت الفعلي';
@override
String get onboardingTitle3 => 'ادفع كما يناسبك';
@override
String get onboardingSubtitle3 =>
'اختر الدفع نقدًا أو بالبطاقة أو عبر المحفظة';
@override
String get getStarted => 'ابدأ الآن';
@override
String get skip => 'تخطي';
}
@@ -386,9 +386,153 @@ class AppLocalizationsEn extends AppLocalizations {
return 'Trip distance: $distance';
}
@override
String get edit => 'Edit';
@override
String resendIn(int seconds) {
return 'Resend in ${seconds}s';
}
@override
String get resendCode => 'Resend code';
@override
String get nameTitle => 'What\'s your name?';
@override
String get nameSubtitle => 'Help us personalize your experience';
@override
String get nameHint => 'Your name';
@override
String get firstNameHint => 'First name';
@override
String get lastNameHint => 'Last name';
@override
String get nameButton => 'Continue';
@override
String get reconnect => 'Reconnecting...';
@override
String get tripExpired => 'Trip expired';
@override
String get loginTitle => 'Welcome to Tripz';
@override
String get phoneLoginSubtitle => 'Enter your phone number to log in';
@override
String get sendOtpButton => 'Send OTP';
@override
String get nameEntryTitle => 'What\'s your name?';
@override
String get homeTitle => 'Home';
@override
String get destinationTitle => 'Destination';
@override
String get routeTitle => 'Route';
@override
String get whereToHint => 'Where are you going?';
@override
String get currentLocation => 'Current location';
@override
String get savedPlaces => 'Saved places';
@override
String get home => 'Home';
@override
String get work => 'Work';
@override
String get pickFromMap => 'Pick from map';
@override
String get searchHint => 'Search for a place...';
@override
String get noResultsFound => 'No results found';
@override
String get connecting => 'Connecting...';
@override
String get tripSummary => 'Trip summary';
@override
String get totalDistance => 'Total distance';
@override
String get estimatedTime => 'Estimated time';
@override
String get totalFare => 'Total fare';
@override
String get chooseRide => 'Choose a ride';
@override
String get promoCode => 'Promo code';
@override
String get errorTitle => 'Something went wrong';
@override
String get errorSubtitle => 'Please try again';
@override
String get emptyTitle => 'No data';
@override
String get emptySubtitle => 'No content found yet';
@override
String get signIn => 'Sign in';
@override
String get confirmPhoneNumber => 'Confirm phone number';
@override
String get driverRatingValue => 'Rating';
@override
String get missingDataError => 'Missing data';
@override
String get onboardingTitle1 => 'Order with one tap';
@override
String get onboardingSubtitle1 =>
'Enter your destination and get a driver in seconds';
@override
String get onboardingTitle2 => 'Track your trip live';
@override
String get onboardingSubtitle2 => 'Watch your driver approach in real-time';
@override
String get onboardingTitle3 => 'Pay your way';
@override
String get onboardingSubtitle3 => 'Choose to pay cash, card, or wallet';
@override
String get getStarted => 'Get started';
@override
String get skip => 'Skip';
}