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

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