fix marker rendering & modernize riding widgets for dark mode - 2026-04-11

This commit is contained in:
Hamza-Ayed
2026-04-11 01:14:09 +03:00
parent 3f03f25142
commit 454276d1e0
88 changed files with 50376 additions and 23310 deletions

View File

@@ -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))),
],
),
);

View File

@@ -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)),
),
),
],

View File

@@ -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),
),

View File

@@ -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),
),
],
),

View File

@@ -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);
}
}
}

View File

@@ -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]),

View File

@@ -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(

View File

@@ -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 {
),
);
}
}
}

View File

@@ -17,7 +17,6 @@ import '../navigation/navigation_view.dart';
// --- الدالة الرئيسية بالتصميم الجديد ---
GetBuilder<MapPassengerController> leftMainMenuIcons() {
Get.put(TextToSpeechController());
return GetBuilder<MapPassengerController>(
builder: (controller) => Positioned(
// تم تعديل الموضع ليتناسب مع التصميم الجديد

View File

@@ -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,

View File

@@ -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) {

View File

@@ -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),

View File

@@ -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),
)),

View File

@@ -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,
)

View File

@@ -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),
),
],

View File

@@ -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),
);
}

View File

@@ -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
},
),