fix marker rendering & modernize riding widgets for dark mode - 2026-04-11
This commit is contained in:
@@ -340,28 +340,31 @@ class ApplyOrderWidget extends StatelessWidget {
|
||||
width: double.infinity,
|
||||
padding: const EdgeInsets.symmetric(vertical: 2, horizontal: 8),
|
||||
decoration: BoxDecoration(
|
||||
color: const Color(0xFFF5F5F5),
|
||||
color: Get.isDarkMode ? Colors.grey[850] : const Color(0xFFF5F5F5),
|
||||
borderRadius: BorderRadius.circular(6),
|
||||
border: Border.all(color: Colors.grey.withOpacity(0.3)),
|
||||
border: Border.all(
|
||||
color: Get.isDarkMode
|
||||
? Colors.white10
|
||||
: Colors.grey.withOpacity(0.3)),
|
||||
),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(
|
||||
plateNumber,
|
||||
style: const TextStyle(
|
||||
style: TextStyle(
|
||||
fontFamily: 'RobotoMono',
|
||||
fontSize: 18, // تصغير الرقم
|
||||
fontSize: 18,
|
||||
fontWeight: FontWeight.w900,
|
||||
color: Colors.black87,
|
||||
color: AppColor.writeColor,
|
||||
letterSpacing: 1.5,
|
||||
),
|
||||
),
|
||||
const Text("SYR",
|
||||
Text("SYR",
|
||||
style: TextStyle(
|
||||
fontSize: 10,
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Colors.black54)),
|
||||
color: AppColor.writeColor.withOpacity(0.6))),
|
||||
],
|
||||
),
|
||||
);
|
||||
|
||||
@@ -35,9 +35,9 @@ class CancelRidePageWidget extends StatelessWidget {
|
||||
return Container(
|
||||
height: Get.height * 0.7, // ارتفاع مناسب
|
||||
padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 15),
|
||||
decoration: const BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.vertical(top: Radius.circular(25)),
|
||||
decoration: BoxDecoration(
|
||||
color: AppColor.secondaryColor,
|
||||
borderRadius: const BorderRadius.vertical(top: Radius.circular(25)),
|
||||
),
|
||||
child: GetBuilder<MapPassengerController>(
|
||||
builder: (controller) => Column(
|
||||
@@ -82,7 +82,7 @@ class CancelRidePageWidget extends StatelessWidget {
|
||||
: FontWeight.normal,
|
||||
color: isSelected
|
||||
? AppColor.primaryColor
|
||||
: Colors.black87,
|
||||
: AppColor.writeColor,
|
||||
fontSize: 15),
|
||||
),
|
||||
trailing: isSelected
|
||||
@@ -104,7 +104,9 @@ class CancelRidePageWidget extends StatelessWidget {
|
||||
decoration: InputDecoration(
|
||||
hintText: "Please write the reason...".tr,
|
||||
filled: true,
|
||||
fillColor: Colors.grey[100],
|
||||
fillColor: Get.isDarkMode
|
||||
? Colors.white.withOpacity(0.05)
|
||||
: Colors.grey[100],
|
||||
border: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
borderSide: BorderSide.none,
|
||||
@@ -149,7 +151,7 @@ class CancelRidePageWidget extends StatelessWidget {
|
||||
child: TextButton(
|
||||
onPressed: () => Get.back(),
|
||||
child: Text("Don't Cancel".tr,
|
||||
style: TextStyle(color: Colors.grey[600])),
|
||||
style: TextStyle(color: AppColor.grayColor)),
|
||||
),
|
||||
),
|
||||
],
|
||||
|
||||
@@ -60,7 +60,7 @@ List<CarType> carTypes = [
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
class CarDetailsTypeToChoose extends StatelessWidget {
|
||||
CarDetailsTypeToChoose({super.key});
|
||||
final textToSpeechController = Get.put(TextToSpeechController());
|
||||
final textToSpeechController = Get.find<TextToSpeechController>();
|
||||
|
||||
void _prepareCarTypes(MapPassengerController controller) {
|
||||
if (controller.distance > 23) {
|
||||
@@ -157,8 +157,7 @@ class CarDetailsTypeToChoose extends StatelessWidget {
|
||||
// ── Promo Code & Actions ─────────────────────────────
|
||||
_buildPromoButton(context, controller),
|
||||
|
||||
SizedBox(
|
||||
height: MediaQuery.of(context).padding.bottom + 10),
|
||||
SizedBox(height: MediaQuery.of(context).padding.bottom + 10),
|
||||
],
|
||||
),
|
||||
),
|
||||
@@ -199,11 +198,13 @@ class CarDetailsTypeToChoose extends StatelessWidget {
|
||||
child: Container(
|
||||
padding: const EdgeInsets.all(6),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.grey.shade100,
|
||||
color: Get.isDarkMode
|
||||
? Colors.white.withOpacity(0.08)
|
||||
: Colors.grey.shade100,
|
||||
shape: BoxShape.circle,
|
||||
),
|
||||
child: Icon(Icons.close_rounded,
|
||||
size: 18, color: Colors.grey.shade600),
|
||||
size: 18, color: AppColor.grayColor),
|
||||
),
|
||||
),
|
||||
],
|
||||
@@ -215,8 +216,7 @@ class CarDetailsTypeToChoose extends StatelessWidget {
|
||||
// Distance chip
|
||||
_buildStatChip(
|
||||
icon: Icons.route_rounded,
|
||||
value:
|
||||
'${controller.distance.toStringAsFixed(1)} ${'KM'.tr}',
|
||||
value: '${controller.distance.toStringAsFixed(1)} ${'KM'.tr}',
|
||||
color: AppColor.primaryColor,
|
||||
),
|
||||
const SizedBox(width: 8),
|
||||
@@ -313,11 +313,12 @@ class CarDetailsTypeToChoose extends StatelessWidget {
|
||||
],
|
||||
)
|
||||
: null,
|
||||
color: isSelected ? null : Colors.white,
|
||||
color: isSelected ? null : AppColor.secondaryColor,
|
||||
borderRadius: BorderRadius.circular(16),
|
||||
border: Border.all(
|
||||
color:
|
||||
isSelected ? AppColor.primaryColor : Colors.grey.shade200,
|
||||
color: isSelected
|
||||
? AppColor.primaryColor
|
||||
: AppColor.grayColor.withOpacity(0.2),
|
||||
width: isSelected ? 2.0 : 1.0,
|
||||
),
|
||||
boxShadow: [
|
||||
@@ -355,8 +356,7 @@ class CarDetailsTypeToChoose extends StatelessWidget {
|
||||
),
|
||||
],
|
||||
),
|
||||
child:
|
||||
const Icon(Icons.check, size: 11, color: Colors.white),
|
||||
child: const Icon(Icons.check, size: 11, color: Colors.white),
|
||||
),
|
||||
),
|
||||
|
||||
@@ -389,7 +389,7 @@ class CarDetailsTypeToChoose extends StatelessWidget {
|
||||
fontSize: 13,
|
||||
color: isSelected
|
||||
? AppColor.primaryColor
|
||||
: Colors.grey.shade800,
|
||||
: AppColor.writeColor,
|
||||
),
|
||||
maxLines: 1,
|
||||
),
|
||||
@@ -399,16 +399,17 @@ class CarDetailsTypeToChoose extends StatelessWidget {
|
||||
|
||||
// Price tag
|
||||
Container(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 8, vertical: 4),
|
||||
padding:
|
||||
const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
|
||||
decoration: BoxDecoration(
|
||||
color: isSelected
|
||||
? AppColor.primaryColor
|
||||
: Colors.grey.shade50,
|
||||
: AppColor.writeColor.withOpacity(0.05),
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
border: isSelected
|
||||
? null
|
||||
: Border.all(color: Colors.grey.shade200),
|
||||
: Border.all(
|
||||
color: AppColor.grayColor.withOpacity(0.2)),
|
||||
),
|
||||
child: FittedBox(
|
||||
child: Text(
|
||||
@@ -416,8 +417,9 @@ class CarDetailsTypeToChoose extends StatelessWidget {
|
||||
style: TextStyle(
|
||||
fontSize: 11,
|
||||
fontWeight: FontWeight.w700,
|
||||
color:
|
||||
isSelected ? Colors.white : Colors.grey.shade700,
|
||||
color: isSelected
|
||||
? Colors.white
|
||||
: AppColor.writeColor.withOpacity(0.8),
|
||||
),
|
||||
),
|
||||
),
|
||||
@@ -446,8 +448,7 @@ class CarDetailsTypeToChoose extends StatelessWidget {
|
||||
onTap: () => _showPromoCodeDialog(context, controller),
|
||||
borderRadius: BorderRadius.circular(14),
|
||||
child: Container(
|
||||
padding:
|
||||
const EdgeInsets.symmetric(vertical: 12, horizontal: 14),
|
||||
padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 14),
|
||||
decoration: BoxDecoration(
|
||||
gradient: LinearGradient(
|
||||
colors: [
|
||||
@@ -730,8 +731,8 @@ class CarDetailsTypeToChoose extends StatelessWidget {
|
||||
const SizedBox(height: 6),
|
||||
// Price badge in dialog
|
||||
Container(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 14, vertical: 6),
|
||||
padding:
|
||||
const EdgeInsets.symmetric(horizontal: 14, vertical: 6),
|
||||
decoration: BoxDecoration(
|
||||
gradient: LinearGradient(
|
||||
colors: [
|
||||
@@ -754,15 +755,20 @@ class CarDetailsTypeToChoose extends StatelessWidget {
|
||||
Container(
|
||||
padding: const EdgeInsets.all(14),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.grey.shade50,
|
||||
color: Get.isDarkMode
|
||||
? Colors.white.withOpacity(0.05)
|
||||
: Colors.grey.shade50,
|
||||
borderRadius: BorderRadius.circular(14),
|
||||
border: Border.all(color: Colors.grey.shade100),
|
||||
border: Border.all(
|
||||
color: Get.isDarkMode
|
||||
? Colors.white10
|
||||
: Colors.grey.shade100),
|
||||
),
|
||||
child: Text(
|
||||
_getCarDescription(mapPassengerController, carType),
|
||||
textAlign: TextAlign.center,
|
||||
style: AppStyle.subtitle.copyWith(
|
||||
color: Colors.grey.shade700,
|
||||
color: AppColor.writeColor.withOpacity(0.8),
|
||||
fontSize: 14,
|
||||
height: 1.5,
|
||||
),
|
||||
@@ -778,12 +784,12 @@ class CarDetailsTypeToChoose extends StatelessWidget {
|
||||
padding: const EdgeInsets.symmetric(vertical: 12),
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(14),
|
||||
side: BorderSide(color: Colors.grey.shade200),
|
||||
side: BorderSide(
|
||||
color: AppColor.grayColor.withOpacity(0.2)),
|
||||
),
|
||||
),
|
||||
child: Text('Back'.tr,
|
||||
style:
|
||||
TextStyle(color: Colors.grey.shade600)),
|
||||
style: TextStyle(color: AppColor.grayColor)),
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 12),
|
||||
@@ -810,11 +816,11 @@ class CarDetailsTypeToChoose extends StatelessWidget {
|
||||
child: Container(
|
||||
padding: const EdgeInsets.all(10),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
color: AppColor.secondaryColor,
|
||||
shape: BoxShape.circle,
|
||||
boxShadow: [
|
||||
BoxShadow(
|
||||
color: Colors.black.withAlpha(20),
|
||||
color: Colors.black.withAlpha(30),
|
||||
blurRadius: 15,
|
||||
offset: const Offset(0, 5),
|
||||
),
|
||||
|
||||
@@ -59,7 +59,7 @@ class CashConfirmPageShown extends StatelessWidget {
|
||||
// زر الإغلاق (كان معلقاً في الكود القديم، تم تفعيله هنا)
|
||||
IconButton(
|
||||
onPressed: () => controller.changeCashConfirmPageShown(),
|
||||
icon: const Icon(Icons.close, color: AppColor.writeColor),
|
||||
icon: Icon(Icons.close, color: AppColor.writeColor),
|
||||
),
|
||||
],
|
||||
),
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import 'package:Intaleq/print.dart';
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
@@ -131,7 +132,7 @@ class _SearchFieldState extends State<_SearchField> {
|
||||
hintText: widget.controller.hintTextDestinationPoint,
|
||||
hintStyle: AppStyle.subtitle.copyWith(color: Colors.grey[600]),
|
||||
prefixIcon:
|
||||
const Icon(Icons.search, color: AppColor.primaryColor),
|
||||
Icon(Icons.search, color: AppColor.primaryColor),
|
||||
// --- [إصلاح] تم استبدال Obx بشرط بسيط لأن `setState` يعيد بناء الواجهة الآن ---
|
||||
suffixIcon: widget
|
||||
.controller.placeDestinationController.text.isNotEmpty
|
||||
@@ -383,20 +384,20 @@ Widget _buildQuickActionButton({
|
||||
child: Container(
|
||||
padding: const EdgeInsets.all(8.0),
|
||||
decoration: BoxDecoration(
|
||||
color: AppColor.blueColor.withOpacity(0.1),
|
||||
color: AppColor.cyanBlue.withOpacity(0.1),
|
||||
borderRadius: BorderRadius.circular(8.0),
|
||||
border: Border.all(color: AppColor.blueColor.withOpacity(0.3)),
|
||||
border: Border.all(color: AppColor.cyanBlue.withOpacity(0.3)),
|
||||
),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Icon(icon, color: AppColor.blueColor),
|
||||
Icon(icon, color: AppColor.cyanBlue),
|
||||
const SizedBox(height: 4.0),
|
||||
Text(
|
||||
text,
|
||||
textAlign: TextAlign.center,
|
||||
style: AppStyle.title.copyWith(
|
||||
color: AppColor.blueColor, fontWeight: FontWeight.w500),
|
||||
color: AppColor.cyanBlue, fontWeight: FontWeight.w500),
|
||||
),
|
||||
],
|
||||
),
|
||||
@@ -451,7 +452,7 @@ void _handleQuickAction(
|
||||
controller.showBottomSheet1();
|
||||
} catch (e) {
|
||||
// Handle error if parsing fails
|
||||
print("Error handling quick action: $e");
|
||||
Log.print("Error handling quick action: $e");
|
||||
Toast.show(Get.context!, "Failed to get location".tr, AppColor.redColor);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -35,7 +35,7 @@ GetBuilder<MapPassengerController> formSearchPlacesStart() {
|
||||
hintStyle:
|
||||
AppStyle.subtitle.copyWith(color: Colors.grey[600]),
|
||||
prefixIcon:
|
||||
const Icon(Icons.search, color: AppColor.primaryColor),
|
||||
Icon(Icons.search, color: AppColor.primaryColor),
|
||||
suffixIcon: controller.placeStartController.text.isNotEmpty
|
||||
? IconButton(
|
||||
icon: Icon(Icons.clear, color: Colors.grey[400]),
|
||||
|
||||
@@ -17,7 +17,7 @@ GetBuilder<MapPassengerController> formSearchPlaces(int index) {
|
||||
padding: const EdgeInsets.all(16),
|
||||
child: Container(
|
||||
decoration:
|
||||
const BoxDecoration(color: AppColor.secondaryColor),
|
||||
BoxDecoration(color: AppColor.secondaryColor),
|
||||
child: TextField(
|
||||
decoration: InputDecoration(
|
||||
border: const OutlineInputBorder(
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
import 'package:Intaleq/print.dart';
|
||||
import 'dart:io';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:maplibre_gl/maplibre_gl.dart';
|
||||
import 'package:Intaleq/controller/home/points_for_rider_controller.dart';
|
||||
import 'package:Intaleq/services/offline_map_service.dart';
|
||||
|
||||
import '../../../constant/colors.dart';
|
||||
import '../../../constant/style.dart';
|
||||
@@ -30,7 +32,7 @@ class GoogleMapPassengerWidget extends StatelessWidget {
|
||||
attributionButtonMargins: null,
|
||||
onMapCreated: controller.onMapCreated,
|
||||
onStyleLoadedCallback: () => controller.onStyleLoaded(),
|
||||
styleString: "assets/style.json",
|
||||
styleString: Get.isDarkMode ? "assets/style_dark.json" : "assets/style.json",
|
||||
|
||||
// ✅ Performance: Smoother zoom limits for low-end devices
|
||||
minMaxZoomPreference: controller.lowPerf
|
||||
@@ -51,10 +53,14 @@ class GoogleMapPassengerWidget extends StatelessWidget {
|
||||
if (controller.mapController != null) {
|
||||
final position = controller.mapController!.cameraPosition;
|
||||
if (position != null) {
|
||||
print('✅ onCameraIdle targeted: ${position.target}');
|
||||
Log.print('✅ onCameraIdle targeted: ${position.target}');
|
||||
// 1. Always update current view target (for pickers)
|
||||
controller
|
||||
.updateCurrentLocationFromCamera(position.target);
|
||||
|
||||
// 2. Cache explicitly when panning around
|
||||
// Optional: Limit this to only cache smaller regions (1km) so it doesn't overload on fast panning
|
||||
OfflineMapService.instance.downloadRegion(position.target, radiusKm: 1.0);
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -80,9 +86,9 @@ class GoogleMapPassengerWidget extends StatelessWidget {
|
||||
colorText: AppColor.redColor,
|
||||
duration: const Duration(seconds: 5),
|
||||
backgroundColor: AppColor.secondaryColor,
|
||||
icon: const Icon(Icons.error, color: AppColor.redColor),
|
||||
icon: Icon(Icons.error, color: AppColor.redColor),
|
||||
titleText: Text('Error'.tr,
|
||||
style: const TextStyle(color: AppColor.redColor)),
|
||||
style: TextStyle(color: AppColor.redColor)),
|
||||
messageText: Text(
|
||||
'We Are Sorry That we dont have cars in your Location!'
|
||||
.tr,
|
||||
@@ -99,4 +105,4 @@ class GoogleMapPassengerWidget extends StatelessWidget {
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -17,7 +17,6 @@ import '../navigation/navigation_view.dart';
|
||||
|
||||
// --- الدالة الرئيسية بالتصميم الجديد ---
|
||||
GetBuilder<MapPassengerController> leftMainMenuIcons() {
|
||||
Get.put(TextToSpeechController());
|
||||
return GetBuilder<MapPassengerController>(
|
||||
builder: (controller) => Positioned(
|
||||
// تم تعديل الموضع ليتناسب مع التصميم الجديد
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import 'package:Intaleq/print.dart';
|
||||
import 'package:Intaleq/views/widgets/my_textField.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
@@ -148,7 +149,9 @@ class MainBottomMenuMap extends StatelessWidget {
|
||||
borderRadius: BorderRadius.circular(_D.radiusCard),
|
||||
boxShadow: _D.cardShadow,
|
||||
border: Border.all(
|
||||
color: Colors.white.withOpacity(0.65),
|
||||
color: Get.isDarkMode
|
||||
? Colors.white.withOpacity(0.15)
|
||||
: Colors.white.withOpacity(0.65),
|
||||
width: 1.2,
|
||||
),
|
||||
),
|
||||
@@ -216,123 +219,129 @@ class _CollapsedView extends StatelessWidget {
|
||||
const SizedBox(height: 16),
|
||||
|
||||
// ── Main interactive search card ─────────────────────────────────────
|
||||
Material(
|
||||
color: Colors.transparent,
|
||||
child: InkWell(
|
||||
onTap: controller.changeMainBottomMenuMap,
|
||||
borderRadius: BorderRadius.circular(_D.radiusInner),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 18, vertical: 8),
|
||||
child: Row(
|
||||
children: [
|
||||
// Animated search icon with glow
|
||||
AnimatedContainer(
|
||||
duration: _D.medium,
|
||||
width: 48,
|
||||
height: 48,
|
||||
decoration: BoxDecoration(
|
||||
gradient: _D.primaryGradient(),
|
||||
borderRadius: BorderRadius.circular(_D.radiusPill),
|
||||
boxShadow: _D.glowShadow(AppColor.primaryColor),
|
||||
Semantics(
|
||||
button: true,
|
||||
label: 'Open destination search'.tr,
|
||||
hint: 'Double tap to open search or enter destination'.tr,
|
||||
child: Material(
|
||||
color: Colors.transparent,
|
||||
child: InkWell(
|
||||
onTap: controller.changeMainBottomMenuMap,
|
||||
borderRadius: BorderRadius.circular(_D.radiusInner),
|
||||
child: Padding(
|
||||
padding:
|
||||
const EdgeInsets.symmetric(horizontal: 18, vertical: 8),
|
||||
child: Row(
|
||||
children: [
|
||||
// Animated search icon with glow
|
||||
AnimatedContainer(
|
||||
duration: _D.medium,
|
||||
width: 48,
|
||||
height: 48,
|
||||
decoration: BoxDecoration(
|
||||
gradient: _D.primaryGradient(),
|
||||
borderRadius: BorderRadius.circular(_D.radiusPill),
|
||||
boxShadow: _D.glowShadow(AppColor.primaryColor),
|
||||
),
|
||||
child: const Icon(
|
||||
Icons.search_rounded,
|
||||
color: Colors.white,
|
||||
size: 22,
|
||||
),
|
||||
),
|
||||
child: const Icon(
|
||||
Icons.search_rounded,
|
||||
color: Colors.white,
|
||||
size: 22,
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 16),
|
||||
const SizedBox(width: 16),
|
||||
|
||||
// Dynamic text content
|
||||
Expanded(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text.rich(
|
||||
TextSpan(
|
||||
children: [
|
||||
TextSpan(
|
||||
text: '${'Where to'.tr} ',
|
||||
style: AppStyle.title.copyWith(
|
||||
fontWeight: FontWeight.w600,
|
||||
fontSize: 16,
|
||||
color: Colors.grey.shade700,
|
||||
// Dynamic text content
|
||||
Expanded(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text.rich(
|
||||
TextSpan(
|
||||
children: [
|
||||
TextSpan(
|
||||
text: '${'Where to'.tr} ',
|
||||
style: AppStyle.title.copyWith(
|
||||
fontWeight: FontWeight.w600,
|
||||
fontSize: 16,
|
||||
color: Colors.grey.shade700,
|
||||
),
|
||||
),
|
||||
),
|
||||
TextSpan(
|
||||
text: firstName,
|
||||
style: AppStyle.title.copyWith(
|
||||
fontWeight: FontWeight.w800,
|
||||
fontSize: 16.5,
|
||||
color: AppColor.primaryColor,
|
||||
letterSpacing: -0.3,
|
||||
TextSpan(
|
||||
text: firstName,
|
||||
style: AppStyle.title.copyWith(
|
||||
fontWeight: FontWeight.w800,
|
||||
fontSize: 16.5,
|
||||
color: AppColor.primaryColor,
|
||||
letterSpacing: -0.3,
|
||||
),
|
||||
),
|
||||
),
|
||||
const TextSpan(text: '؟'),
|
||||
],
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 2),
|
||||
if (!controller.noCarString)
|
||||
AnimatedOpacity(
|
||||
duration: _D.fast,
|
||||
opacity: 1,
|
||||
child: Text(
|
||||
'Tap to search your destination'.tr,
|
||||
style: AppStyle.subtitle.copyWith(
|
||||
fontSize: 12,
|
||||
color: Colors.grey.shade500,
|
||||
fontWeight: FontWeight.w400,
|
||||
),
|
||||
const TextSpan(text: '؟'),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
// Elegant expand indicator
|
||||
Container(
|
||||
padding:
|
||||
const EdgeInsets.symmetric(horizontal: 14, vertical: 8),
|
||||
decoration: BoxDecoration(
|
||||
gradient: LinearGradient(
|
||||
colors: [
|
||||
AppColor.primaryColor.withOpacity(0.12),
|
||||
AppColor.primaryColor.withOpacity(0.06),
|
||||
const SizedBox(height: 2),
|
||||
if (!controller.noCarString)
|
||||
AnimatedOpacity(
|
||||
duration: _D.fast,
|
||||
opacity: 1,
|
||||
child: Text(
|
||||
'Tap to search your destination'.tr,
|
||||
style: AppStyle.subtitle.copyWith(
|
||||
fontSize: 12,
|
||||
color: Colors.grey.shade500,
|
||||
fontWeight: FontWeight.w400,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
borderRadius: BorderRadius.circular(_D.radiusPill),
|
||||
border: Border.all(
|
||||
color: AppColor.primaryColor.withOpacity(0.25),
|
||||
width: 1,
|
||||
),
|
||||
|
||||
// Elegant expand indicator
|
||||
Container(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 14, vertical: 8),
|
||||
decoration: BoxDecoration(
|
||||
gradient: LinearGradient(
|
||||
colors: [
|
||||
AppColor.primaryColor.withOpacity(0.12),
|
||||
AppColor.primaryColor.withOpacity(0.06),
|
||||
],
|
||||
),
|
||||
borderRadius: BorderRadius.circular(_D.radiusPill),
|
||||
border: Border.all(
|
||||
color: AppColor.primaryColor.withOpacity(0.25),
|
||||
width: 1,
|
||||
),
|
||||
),
|
||||
child: Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
AnimatedRotation(
|
||||
duration: _D.fast,
|
||||
turns: 0,
|
||||
child: Icon(
|
||||
Icons.keyboard_arrow_up_rounded,
|
||||
color: AppColor.primaryColor,
|
||||
size: 20,
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 4),
|
||||
Text(
|
||||
'Open'.tr,
|
||||
style: TextStyle(
|
||||
color: AppColor.primaryColor,
|
||||
fontSize: 12.5,
|
||||
fontWeight: FontWeight.w700,
|
||||
letterSpacing: 0.3,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
child: Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
AnimatedRotation(
|
||||
duration: _D.fast,
|
||||
turns: 0,
|
||||
child: Icon(
|
||||
Icons.keyboard_arrow_up_rounded,
|
||||
color: AppColor.primaryColor,
|
||||
size: 20,
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 4),
|
||||
Text(
|
||||
'Open'.tr,
|
||||
style: TextStyle(
|
||||
color: AppColor.primaryColor,
|
||||
fontSize: 12.5,
|
||||
fontWeight: FontWeight.w700,
|
||||
letterSpacing: 0.3,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
@@ -438,30 +447,34 @@ class _ExpandedView extends StatelessWidget {
|
||||
),
|
||||
const Spacer(),
|
||||
// Elegant close button
|
||||
Material(
|
||||
color: Colors.transparent,
|
||||
child: InkWell(
|
||||
onTap: controller.changeMainBottomMenuMap,
|
||||
borderRadius: BorderRadius.circular(_D.radiusPill),
|
||||
child: AnimatedContainer(
|
||||
duration: _D.fast,
|
||||
width: 38,
|
||||
height: 38,
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.grey.shade100,
|
||||
shape: BoxShape.circle,
|
||||
boxShadow: [
|
||||
BoxShadow(
|
||||
color: Colors.grey.shade200.withOpacity(0.5),
|
||||
blurRadius: 8,
|
||||
offset: const Offset(0, 2),
|
||||
),
|
||||
],
|
||||
),
|
||||
child: Icon(
|
||||
Icons.keyboard_arrow_down_rounded,
|
||||
size: 24,
|
||||
color: Colors.grey.shade600,
|
||||
Semantics(
|
||||
button: true,
|
||||
label: 'Close panel'.tr,
|
||||
child: Material(
|
||||
color: Colors.transparent,
|
||||
child: InkWell(
|
||||
onTap: controller.changeMainBottomMenuMap,
|
||||
borderRadius: BorderRadius.circular(_D.radiusPill),
|
||||
child: AnimatedContainer(
|
||||
duration: _D.fast,
|
||||
width: 38,
|
||||
height: 38,
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.grey.shade100,
|
||||
shape: BoxShape.circle,
|
||||
boxShadow: [
|
||||
BoxShadow(
|
||||
color: Colors.grey.shade200.withOpacity(0.5),
|
||||
blurRadius: 8,
|
||||
offset: const Offset(0, 2),
|
||||
),
|
||||
],
|
||||
),
|
||||
child: Icon(
|
||||
Icons.keyboard_arrow_down_rounded,
|
||||
size: 24,
|
||||
color: Colors.grey.shade600,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
@@ -586,6 +599,13 @@ class _ExpandedView extends StatelessWidget {
|
||||
),
|
||||
const SizedBox(width: 12),
|
||||
Expanded(
|
||||
child: Semantics(
|
||||
button: true,
|
||||
label: isSet
|
||||
? '${'Waypoint'.tr} $wpName'
|
||||
: '${'Stop'.tr} ${index + 1}',
|
||||
hint: 'Double tap to set or change this waypoint on the map'
|
||||
.tr,
|
||||
child: GestureDetector(
|
||||
onTap: () {
|
||||
controller.changeMainBottomMenuMap();
|
||||
@@ -607,52 +627,60 @@ class _ExpandedView extends StatelessWidget {
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
),
|
||||
),
|
||||
)),
|
||||
// Map button with hover effect simulation
|
||||
GestureDetector(
|
||||
onTap: () {
|
||||
controller.changeMainBottomMenuMap();
|
||||
controller.startPickingWaypointOnMap(index);
|
||||
},
|
||||
child: AnimatedContainer(
|
||||
duration: _D.fast,
|
||||
width: 34,
|
||||
height: 34,
|
||||
margin: const EdgeInsets.symmetric(horizontal: 4),
|
||||
decoration: BoxDecoration(
|
||||
color: accent.withOpacity(0.12),
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
border: Border.all(
|
||||
color: accent.withOpacity(0.25),
|
||||
width: 1,
|
||||
Semantics(
|
||||
button: true,
|
||||
label: 'Pick location on map'.tr,
|
||||
child: GestureDetector(
|
||||
onTap: () {
|
||||
controller.changeMainBottomMenuMap();
|
||||
controller.startPickingWaypointOnMap(index);
|
||||
},
|
||||
child: AnimatedContainer(
|
||||
duration: _D.fast,
|
||||
width: 34,
|
||||
height: 34,
|
||||
margin: const EdgeInsets.symmetric(horizontal: 4),
|
||||
decoration: BoxDecoration(
|
||||
color: accent.withOpacity(0.12),
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
border: Border.all(
|
||||
color: accent.withOpacity(0.25),
|
||||
width: 1,
|
||||
),
|
||||
),
|
||||
child: Icon(
|
||||
Icons.map_outlined,
|
||||
color: accent,
|
||||
size: 17,
|
||||
),
|
||||
),
|
||||
child: Icon(
|
||||
Icons.map_outlined,
|
||||
color: accent,
|
||||
size: 17,
|
||||
),
|
||||
),
|
||||
),
|
||||
// Remove button with subtle animation
|
||||
GestureDetector(
|
||||
onTap: () => controller.removeMenuWaypoint(index),
|
||||
child: AnimatedContainer(
|
||||
duration: _D.fast,
|
||||
width: 28,
|
||||
height: 28,
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.red.shade50,
|
||||
shape: BoxShape.circle,
|
||||
border: Border.all(
|
||||
color: Colors.red.shade100,
|
||||
width: 1,
|
||||
Semantics(
|
||||
button: true,
|
||||
label: 'Remove waypoint'.tr,
|
||||
child: GestureDetector(
|
||||
onTap: () => controller.removeMenuWaypoint(index),
|
||||
child: AnimatedContainer(
|
||||
duration: _D.fast,
|
||||
width: 28,
|
||||
height: 28,
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.red.shade50,
|
||||
shape: BoxShape.circle,
|
||||
border: Border.all(
|
||||
color: Colors.red.shade100,
|
||||
width: 1,
|
||||
),
|
||||
),
|
||||
child: Icon(
|
||||
Icons.close_rounded,
|
||||
color: Colors.red.shade400,
|
||||
size: 15,
|
||||
),
|
||||
),
|
||||
child: Icon(
|
||||
Icons.close_rounded,
|
||||
color: Colors.red.shade400,
|
||||
size: 15,
|
||||
),
|
||||
),
|
||||
),
|
||||
@@ -669,69 +697,73 @@ class _ExpandedView extends StatelessWidget {
|
||||
isDotDashed: true,
|
||||
showTopLine: true,
|
||||
showBottomLine: true,
|
||||
child: Material(
|
||||
color: Colors.transparent,
|
||||
child: InkWell(
|
||||
onTap: () => controller.addMenuWaypoint(),
|
||||
borderRadius: BorderRadius.circular(_D.radiusInner),
|
||||
child: AnimatedContainer(
|
||||
duration: _D.fast,
|
||||
padding:
|
||||
const EdgeInsets.symmetric(horizontal: 16, vertical: 12),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(_D.radiusInner),
|
||||
border: Border.all(
|
||||
color: Colors.orange.shade200,
|
||||
style: BorderStyle.solid,
|
||||
width: 1.5,
|
||||
),
|
||||
gradient: LinearGradient(
|
||||
colors: [
|
||||
Colors.orange.shade50.withOpacity(0.6),
|
||||
Colors.orange.shade50.withOpacity(0.3),
|
||||
],
|
||||
),
|
||||
),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Icon(
|
||||
Icons.add_location_alt_outlined,
|
||||
color: Colors.orange.shade500,
|
||||
size: 18,
|
||||
child: Semantics(
|
||||
button: true,
|
||||
label: 'Add a new waypoint stop'.tr,
|
||||
child: Material(
|
||||
color: Colors.transparent,
|
||||
child: InkWell(
|
||||
onTap: () => controller.addMenuWaypoint(),
|
||||
borderRadius: BorderRadius.circular(_D.radiusInner),
|
||||
child: AnimatedContainer(
|
||||
duration: _D.fast,
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 16, vertical: 12),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(_D.radiusInner),
|
||||
border: Border.all(
|
||||
color: Colors.orange.shade200,
|
||||
style: BorderStyle.solid,
|
||||
width: 1.5,
|
||||
),
|
||||
const SizedBox(width: 10),
|
||||
Text(
|
||||
'Add a Stop'.tr,
|
||||
style: TextStyle(
|
||||
color: Colors.orange.shade700,
|
||||
fontSize: 13.5,
|
||||
fontWeight: FontWeight.w600,
|
||||
letterSpacing: 0.2,
|
||||
),
|
||||
gradient: LinearGradient(
|
||||
colors: [
|
||||
Colors.orange.shade50.withOpacity(0.6),
|
||||
Colors.orange.shade50.withOpacity(0.3),
|
||||
],
|
||||
),
|
||||
const SizedBox(width: 10),
|
||||
Container(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 8, vertical: 3),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.orange.shade100,
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
border: Border.all(
|
||||
color: Colors.orange.shade200,
|
||||
width: 1,
|
||||
),
|
||||
),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Icon(
|
||||
Icons.add_location_alt_outlined,
|
||||
color: Colors.orange.shade500,
|
||||
size: 18,
|
||||
),
|
||||
child: Text(
|
||||
'+5 ${'min'.tr}',
|
||||
const SizedBox(width: 10),
|
||||
Text(
|
||||
'Add a Stop'.tr,
|
||||
style: TextStyle(
|
||||
color: Colors.orange.shade700,
|
||||
fontSize: 10.5,
|
||||
fontWeight: FontWeight.w700,
|
||||
fontSize: 13.5,
|
||||
fontWeight: FontWeight.w600,
|
||||
letterSpacing: 0.2,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
const SizedBox(width: 10),
|
||||
Container(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 8, vertical: 3),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.orange.shade100,
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
border: Border.all(
|
||||
color: Colors.orange.shade200,
|
||||
width: 1,
|
||||
),
|
||||
),
|
||||
child: Text(
|
||||
'+5 ${'min'.tr}',
|
||||
style: TextStyle(
|
||||
color: Colors.orange.shade700,
|
||||
fontSize: 10.5,
|
||||
fontWeight: FontWeight.w700,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
@@ -990,7 +1022,9 @@ class _MapPickerOverlay extends StatelessWidget {
|
||||
' ${controller.pickingWaypointIndex + 1}'.tr;
|
||||
}
|
||||
if (controller.passengerStartLocationFromMap) {
|
||||
return 'Move map to your pickup point'.tr;
|
||||
return controller.isAnotherOreder
|
||||
? 'Now set the pickup point for the other person'.tr
|
||||
: 'Move map to your pickup point'.tr;
|
||||
} else if (controller.startLocationFromMap) {
|
||||
return 'Move map to set start location'.tr;
|
||||
} else if (controller.workLocationFromMap) {
|
||||
@@ -1055,7 +1089,9 @@ class _MapPickerOverlay extends StatelessWidget {
|
||||
borderRadius: BorderRadius.circular(_D.radiusCard),
|
||||
boxShadow: _D.glowShadow(modeColor, intensity: 0.5),
|
||||
border: Border.all(
|
||||
color: Colors.white.withOpacity(0.35),
|
||||
color: Get.isDarkMode
|
||||
? Colors.white.withOpacity(0.15)
|
||||
: Colors.white.withOpacity(0.35),
|
||||
width: 1,
|
||||
),
|
||||
),
|
||||
@@ -1105,7 +1141,9 @@ class _MapPickerOverlay extends StatelessWidget {
|
||||
borderRadius: BorderRadius.circular(_D.radiusCard),
|
||||
boxShadow: _D.cardShadow,
|
||||
border: Border.all(
|
||||
color: Colors.white.withOpacity(0.7),
|
||||
color: Get.isDarkMode
|
||||
? Colors.white.withOpacity(0.1)
|
||||
: Colors.white.withOpacity(0.7),
|
||||
width: 1.3,
|
||||
),
|
||||
),
|
||||
@@ -1339,24 +1377,15 @@ class _MapPickerOverlay extends StatelessWidget {
|
||||
controller.newMyLocation.latitude,
|
||||
controller.newMyLocation.longitude,
|
||||
);
|
||||
print(
|
||||
Log.print(
|
||||
'🌐 MAP PICKER CENTER: ${currentCameraPosition.latitude}, ${currentCameraPosition.longitude}');
|
||||
print(
|
||||
Log.print(
|
||||
'✅ _onConfirmTap confirmed coordinates: ${currentCameraPosition.latitude}, ${currentCameraPosition.longitude}');
|
||||
|
||||
if (controller.isPickingWaypoint && controller.pickingWaypointIndex >= 0) {
|
||||
final int wpIndex = controller.pickingWaypointIndex;
|
||||
controller.setMenuWaypointFromMap(wpIndex, currentCameraPosition);
|
||||
Get.snackbar(
|
||||
'Stop ${wpIndex + 1} Set'.tr,
|
||||
'Waypoint has been set successfully'.tr,
|
||||
backgroundColor: Colors.orange.shade600,
|
||||
colorText: Colors.white,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
duration: const Duration(seconds: 2),
|
||||
margin: const EdgeInsets.all(12),
|
||||
borderRadius: 12,
|
||||
);
|
||||
mySnackbarSuccess('Waypoint has been set successfully'.tr);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1403,10 +1432,7 @@ class _MapPickerOverlay extends StatelessWidget {
|
||||
controller.workLocationFromMap = false;
|
||||
controller.isPickerShown = false;
|
||||
controller.update();
|
||||
Get.snackbar('Work Saved'.tr, '',
|
||||
backgroundColor: AppColor.greenColor,
|
||||
colorText: Colors.white,
|
||||
snackPosition: SnackPosition.BOTTOM);
|
||||
mySnackbarSuccess('Work Saved'.tr);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1418,10 +1444,7 @@ class _MapPickerOverlay extends StatelessWidget {
|
||||
controller.homeLocationFromMap = false;
|
||||
controller.isPickerShown = false;
|
||||
controller.update();
|
||||
Get.snackbar('Home Saved'.tr, '',
|
||||
backgroundColor: AppColor.greenColor,
|
||||
colorText: Colors.white,
|
||||
snackPosition: SnackPosition.BOTTOM);
|
||||
mySnackbarSuccess('Home Saved'.tr);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1432,6 +1455,7 @@ class _MapPickerOverlay extends StatelessWidget {
|
||||
controller.placesDestination = [];
|
||||
controller.placeDestinationController.clear();
|
||||
controller.passengerStartLocationFromMap = true;
|
||||
controller.isPickerShown = true; // ✅ Keep picker UI open for pickup selection
|
||||
controller.update();
|
||||
|
||||
try {
|
||||
@@ -1450,7 +1474,9 @@ class _MapPickerOverlay extends StatelessWidget {
|
||||
)),
|
||||
);
|
||||
}
|
||||
} catch (_) {}
|
||||
} catch (e) {
|
||||
Log.print("Error occurred: $e");
|
||||
}
|
||||
|
||||
Get.snackbar(
|
||||
'Destination Set'.tr,
|
||||
|
||||
@@ -22,14 +22,17 @@ import '../HomePage/share_app_page.dart';
|
||||
import '../setting_page.dart';
|
||||
import '../profile/passenger_profile_page.dart';
|
||||
|
||||
// ─── ألوان النظام ───────────────────────────────────────────────────────────
|
||||
const _kBg = Color(0xFF060B18);
|
||||
const _kBgSurface = Color(0xFF0D1525);
|
||||
const _kCyan = Color(0xFF00D4FF);
|
||||
// ─── ألوان النظام (Integrated with AppColor) ──────────────────────────────────
|
||||
Color get _kCyan => AppColor.cyanBlue;
|
||||
Color get _kBg =>
|
||||
Get.isDarkMode ? const Color(0xFF060B18) : AppColor.secondaryColor;
|
||||
Color get _kBgSurface => Get.isDarkMode
|
||||
? const Color(0xFF0D1525)
|
||||
: AppColor.secondaryColor.withOpacity(0.9);
|
||||
const _kAmber = Color(0xFFFFB700);
|
||||
const _kBorder = Color(0x1A00D4FF);
|
||||
const _kText = Colors.white;
|
||||
const _kTextMuted = Color(0xFF7A8FA8);
|
||||
Color get _kBorder => _kCyan.withOpacity(0.15);
|
||||
Color get _kText => AppColor.writeColor;
|
||||
Color get _kTextMuted => AppColor.grayColor;
|
||||
|
||||
class MapMenuWidget extends StatelessWidget {
|
||||
const MapMenuWidget({super.key});
|
||||
@@ -259,8 +262,7 @@ class MapMenuWidget extends StatelessWidget {
|
||||
border:
|
||||
Border.all(color: _kCyan.withOpacity(0.35), width: 1.5),
|
||||
),
|
||||
child:
|
||||
const Icon(Icons.person_rounded, color: _kCyan, size: 28),
|
||||
child: Icon(Icons.person_rounded, color: _kCyan, size: 28),
|
||||
),
|
||||
// نقطة الحضور
|
||||
Positioned(
|
||||
@@ -291,7 +293,7 @@ class MapMenuWidget extends StatelessWidget {
|
||||
children: [
|
||||
Text(
|
||||
box.read(BoxName.name) ?? 'Guest',
|
||||
style: const TextStyle(
|
||||
style: TextStyle(
|
||||
color: _kText,
|
||||
fontSize: 17,
|
||||
fontWeight: FontWeight.w700,
|
||||
@@ -305,13 +307,13 @@ class MapMenuWidget extends StatelessWidget {
|
||||
Container(
|
||||
width: 5,
|
||||
height: 5,
|
||||
decoration: const BoxDecoration(
|
||||
color: _kCyan, shape: BoxShape.circle),
|
||||
decoration:
|
||||
BoxDecoration(color: _kCyan, shape: BoxShape.circle),
|
||||
),
|
||||
const SizedBox(width: 6),
|
||||
Text(
|
||||
"Intaleq Passenger".tr,
|
||||
style: const TextStyle(
|
||||
style: TextStyle(
|
||||
color: _kTextMuted,
|
||||
fontSize: 12,
|
||||
letterSpacing: 0.4,
|
||||
@@ -426,7 +428,7 @@ class _QuickBtn extends StatelessWidget {
|
||||
const SizedBox(height: 6),
|
||||
Text(
|
||||
label,
|
||||
style: const TextStyle(
|
||||
style: TextStyle(
|
||||
color: _kTextMuted,
|
||||
fontSize: 11,
|
||||
letterSpacing: 0.4,
|
||||
@@ -518,7 +520,7 @@ class _MenuGridPainter extends CustomPainter {
|
||||
@override
|
||||
void paint(Canvas canvas, Size size) {
|
||||
final paint = Paint()
|
||||
..color = const Color(0xFF00D4FF).withOpacity(0.025)
|
||||
..color = AppColor.cyanBlue.withOpacity(0.04)
|
||||
..strokeWidth = 0.5;
|
||||
const spacing = 36.0;
|
||||
for (double y = 0; y < size.height; y += spacing) {
|
||||
|
||||
@@ -127,9 +127,9 @@ class MyCreditCardWidget extends StatelessWidget {
|
||||
builder: (controller) => Container(
|
||||
height: Get.height * .4,
|
||||
width: Get.width * .9,
|
||||
decoration: const BoxDecoration(
|
||||
decoration: BoxDecoration(
|
||||
color: AppColor.secondaryColor,
|
||||
borderRadius: BorderRadius.all(Radius.circular(15)),
|
||||
borderRadius: const BorderRadius.all(Radius.circular(15)),
|
||||
gradient: LinearGradient(colors: [
|
||||
AppColor.secondaryColor,
|
||||
// AppColor.blueColor,
|
||||
@@ -139,7 +139,7 @@ class MyCreditCardWidget extends StatelessWidget {
|
||||
// AppColor.redColor,
|
||||
// AppColor.yellowColor
|
||||
]),
|
||||
boxShadow: [
|
||||
boxShadow: const [
|
||||
BoxShadow(
|
||||
spreadRadius: 3,
|
||||
offset: Offset(3, 3),
|
||||
|
||||
@@ -25,15 +25,15 @@ class PickerAnimtionContainerFormPlaces extends StatelessWidget {
|
||||
child: AnimatedContainer(
|
||||
duration: const Duration(milliseconds: 300),
|
||||
height: controller.heightPickerContainer,
|
||||
decoration: const BoxDecoration(
|
||||
boxShadow: [
|
||||
decoration: BoxDecoration(
|
||||
boxShadow: const [
|
||||
BoxShadow(
|
||||
color: AppColor.accentColor, offset: Offset(2, 2)),
|
||||
BoxShadow(
|
||||
color: AppColor.accentColor, offset: Offset(-2, -2))
|
||||
],
|
||||
color: AppColor.secondaryColor,
|
||||
borderRadius: BorderRadius.only(
|
||||
borderRadius: const BorderRadius.only(
|
||||
topLeft: Radius.circular(15),
|
||||
topRight: Radius.circular(15),
|
||||
)),
|
||||
|
||||
@@ -132,7 +132,7 @@ class PointsPageForRider extends StatelessWidget {
|
||||
},
|
||||
)
|
||||
: IconButton(
|
||||
icon: const Icon(
|
||||
icon: Icon(
|
||||
Icons.close,
|
||||
color: AppColor.secondaryColor,
|
||||
),
|
||||
@@ -264,7 +264,7 @@ void showAddLocationDialog(BuildContext context, int index) {
|
||||
'Add Location'.tr,
|
||||
style: AppStyle.title,
|
||||
),
|
||||
const Icon(
|
||||
Icon(
|
||||
Icons.clear,
|
||||
color: AppColor.secondaryColor,
|
||||
)
|
||||
@@ -301,7 +301,7 @@ class AppBarPointsPageForRider extends StatelessWidget {
|
||||
Container(
|
||||
child: Row(
|
||||
children: [
|
||||
const CircleAvatar(
|
||||
CircleAvatar(
|
||||
backgroundColor: AppColor.primaryColor,
|
||||
maxRadius: 15,
|
||||
child: Icon(
|
||||
@@ -319,7 +319,7 @@ class AppBarPointsPageForRider extends StatelessWidget {
|
||||
],
|
||||
),
|
||||
),
|
||||
const Icon(
|
||||
Icon(
|
||||
Icons.clear,
|
||||
color: AppColor.secondaryColor,
|
||||
)
|
||||
|
||||
@@ -42,14 +42,16 @@ class RideBeginPassenger extends StatelessWidget {
|
||||
right: 0,
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
color: AppColor.secondaryColor,
|
||||
borderRadius: const BorderRadius.only(
|
||||
topLeft: Radius.circular(25),
|
||||
topRight: Radius.circular(25),
|
||||
),
|
||||
boxShadow: [
|
||||
BoxShadow(
|
||||
color: Colors.black.withOpacity(0.1),
|
||||
color: Get.isDarkMode
|
||||
? Colors.black.withOpacity(0.4)
|
||||
: Colors.black.withOpacity(0.1),
|
||||
blurRadius: 20,
|
||||
spreadRadius: 2,
|
||||
offset: const Offset(0, -3),
|
||||
@@ -67,7 +69,7 @@ class RideBeginPassenger extends StatelessWidget {
|
||||
width: 40,
|
||||
height: 4,
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.grey[300],
|
||||
color: AppColor.grayColor.withOpacity(0.3),
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
),
|
||||
),
|
||||
@@ -80,8 +82,10 @@ class RideBeginPassenger extends StatelessWidget {
|
||||
const SizedBox(height: 12),
|
||||
|
||||
// خط فاصل خفيف
|
||||
const Divider(
|
||||
height: 1, thickness: 0.5, color: Color(0xFFEEEEEE)),
|
||||
Divider(
|
||||
height: 1,
|
||||
thickness: 0.5,
|
||||
color: AppColor.grayColor.withOpacity(0.2)),
|
||||
|
||||
const SizedBox(height: 12),
|
||||
|
||||
@@ -129,10 +133,10 @@ class RideBeginPassenger extends StatelessWidget {
|
||||
Flexible(
|
||||
child: Text(
|
||||
controller.driverName,
|
||||
style: const TextStyle(
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.bold,
|
||||
fontSize: 15,
|
||||
color: Colors.black87,
|
||||
color: AppColor.writeColor,
|
||||
),
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
@@ -153,7 +157,7 @@ class RideBeginPassenger extends StatelessWidget {
|
||||
Flexible(
|
||||
child: Text(
|
||||
'${controller.model} • ',
|
||||
style: TextStyle(fontSize: 12, color: Colors.grey[700]),
|
||||
style: TextStyle(fontSize: 12, color: AppColor.grayColor),
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
@@ -162,8 +166,9 @@ class RideBeginPassenger extends StatelessWidget {
|
||||
padding:
|
||||
const EdgeInsets.symmetric(horizontal: 4, vertical: 1),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.grey[100],
|
||||
border: Border.all(color: Colors.black12),
|
||||
color: AppColor.writeColor.withOpacity(0.05),
|
||||
border: Border.all(
|
||||
color: AppColor.grayColor.withOpacity(0.2)),
|
||||
borderRadius: BorderRadius.circular(4),
|
||||
),
|
||||
child: Text(
|
||||
@@ -200,7 +205,7 @@ class RideBeginPassenger extends StatelessWidget {
|
||||
),
|
||||
),
|
||||
Text('SYP',
|
||||
style: TextStyle(fontSize: 9, color: Colors.grey[600])),
|
||||
style: TextStyle(fontSize: 9, color: AppColor.grayColor)),
|
||||
],
|
||||
),
|
||||
),
|
||||
@@ -287,8 +292,8 @@ class RideBeginPassenger extends StatelessWidget {
|
||||
_compactBtn(
|
||||
icon: Icons.info_outline_rounded,
|
||||
label: 'Report'.tr,
|
||||
color: Colors.grey[700]!,
|
||||
bgColor: Colors.grey[200]!,
|
||||
color: AppColor.grayColor,
|
||||
bgColor: AppColor.writeColor.withOpacity(0.1),
|
||||
onTap: () => Get.to(() => ComplaintPage()),
|
||||
),
|
||||
],
|
||||
@@ -322,7 +327,7 @@ class RideBeginPassenger extends StatelessWidget {
|
||||
label,
|
||||
style: TextStyle(
|
||||
fontSize: 10,
|
||||
color: Colors.grey[700],
|
||||
color: AppColor.grayColor,
|
||||
fontWeight: FontWeight.w500),
|
||||
),
|
||||
],
|
||||
|
||||
@@ -50,18 +50,20 @@ class RideFromStartApp extends StatelessWidget {
|
||||
bottom: 0, // ملتصق بالأسفل تماماً
|
||||
child: Container(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 15),
|
||||
decoration: const BoxDecoration(
|
||||
color: Colors.white, // خلفية بيضاء نظيفة
|
||||
decoration: BoxDecoration(
|
||||
color: AppColor.secondaryColor, // خلفية متفاعلة
|
||||
borderRadius: BorderRadius.only(
|
||||
topLeft: Radius.circular(25),
|
||||
topRight: Radius.circular(25),
|
||||
),
|
||||
boxShadow: [
|
||||
BoxShadow(
|
||||
color: Colors.black12,
|
||||
color: Get.isDarkMode
|
||||
? Colors.black.withOpacity(0.4)
|
||||
: Colors.black12,
|
||||
blurRadius: 15.0,
|
||||
spreadRadius: 5.0,
|
||||
offset: Offset(0, -5),
|
||||
offset: const Offset(0, -5),
|
||||
),
|
||||
],
|
||||
),
|
||||
@@ -76,7 +78,7 @@ class RideFromStartApp extends StatelessWidget {
|
||||
height: 4,
|
||||
margin: const EdgeInsets.only(bottom: 15),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.grey[300],
|
||||
color: AppColor.grayColor.withOpacity(0.3),
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
),
|
||||
),
|
||||
@@ -112,7 +114,7 @@ class RideFromStartApp extends StatelessWidget {
|
||||
style: AppStyle.title.copyWith(
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Colors.black87,
|
||||
color: AppColor.writeColor,
|
||||
),
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
@@ -129,12 +131,15 @@ class RideFromStartApp extends StatelessWidget {
|
||||
fontSize: 13, fontWeight: FontWeight.bold),
|
||||
),
|
||||
const SizedBox(width: 8),
|
||||
Container(width: 1, height: 12, color: Colors.grey),
|
||||
Container(
|
||||
width: 1,
|
||||
height: 12,
|
||||
color: AppColor.grayColor.withOpacity(0.3)),
|
||||
const SizedBox(width: 8),
|
||||
Text(
|
||||
"$carType - $carModel",
|
||||
style: AppStyle.title.copyWith(
|
||||
fontSize: 13, color: Colors.grey[600]),
|
||||
fontSize: 13, color: AppColor.grayColor),
|
||||
),
|
||||
],
|
||||
),
|
||||
@@ -266,22 +271,22 @@ class RideFromStartApp extends StatelessWidget {
|
||||
return Column(
|
||||
children: [
|
||||
Icon(icon,
|
||||
color: AppColor.secondaryColor,
|
||||
color: AppColor.primaryColor,
|
||||
size: 22), // افترضت أن السكندري لون داكن، أو استخدم Primary
|
||||
const SizedBox(height: 4),
|
||||
Text(
|
||||
value,
|
||||
style: const TextStyle(
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.w800,
|
||||
fontSize: 15,
|
||||
color: Colors.black87,
|
||||
color: AppColor.writeColor,
|
||||
),
|
||||
),
|
||||
Text(
|
||||
label,
|
||||
style: TextStyle(
|
||||
fontSize: 11,
|
||||
color: Colors.grey[600],
|
||||
color: AppColor.grayColor,
|
||||
),
|
||||
),
|
||||
],
|
||||
@@ -292,7 +297,7 @@ class RideFromStartApp extends StatelessWidget {
|
||||
return Container(
|
||||
height: 30,
|
||||
width: 1,
|
||||
color: Colors.grey[300],
|
||||
color: AppColor.grayColor.withOpacity(0.2),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -210,7 +210,7 @@ class CupertinoDriverListWidget extends StatelessWidget {
|
||||
Get.back();
|
||||
showDateTimePickerDialog(driver);
|
||||
}));
|
||||
print('${'Selected driver'.tr}: ${driver['NAME']}');
|
||||
Log.print('${'Selected driver'.tr}: ${driver['NAME']}');
|
||||
// Get.back(); // Close the dialog
|
||||
},
|
||||
),
|
||||
|
||||
Reference in New Issue
Block a user