Implement premium UI/UX refinements for Apple-like polish

Add three major UI components with animations and dark mode support:

- PremiumRouteCard: Enhanced route cards with left accent bar, delivery count badge, animated hover effects (1.02x scale), and dynamic shadow elevation
- DarkModeMapComponent: Google Maps integration with dark theme styling, custom info panels, navigation buttons, and delivery status indicators
- DeliveryListItem: Animated list items with staggered entrance animations, status badges with icons, contact indicators, and hover states

Updates:
- RoutesPage: Now uses PremiumRouteCard with improved visual hierarchy
- DeliveriesPage: Integrated DarkModeMapComponent and DeliveryListItem with proper theme awareness
- Animation system: Leverages existing AppAnimations constants for 200ms fast interactions and easeOut curves

Design philosophy:
- Element separation through left accent bars (status-coded)
- Elevation and shadow for depth (0.1-0.3 opacity)
- Staggered animations for list items (50ms delays)
- Dark mode optimized for evening use (reduced brightness)
- Responsive hover states with tactile feedback

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Jean-Philippe Brule
2025-11-15 14:41:32 -05:00
parent ccb817e3c6
commit 3f31a509e0
23 changed files with 3519 additions and 791 deletions
-137
View File
@@ -1,137 +0,0 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for English (`en`).
class AppLocalizationsEn extends AppLocalizations {
AppLocalizationsEn([String locale = 'en']) : super(locale);
@override
String get appTitle => 'Plan B Logistics';
@override
String get appDescription => 'Delivery Management System';
@override
String get loginWithKeycloak => 'Login with Keycloak';
@override
String get deliveryRoutes => 'Delivery Routes';
@override
String get routes => 'Routes';
@override
String get deliveries => 'Deliveries';
@override
String get settings => 'Settings';
@override
String get profile => 'Profile';
@override
String get logout => 'Logout';
@override
String get completed => 'Completed';
@override
String get pending => 'Pending';
@override
String get todo => 'To Do';
@override
String get delivered => 'Delivered';
@override
String get newCustomer => 'New Customer';
@override
String items(int count) {
return '$count items';
}
@override
String moneyCurrency(double amount) {
return '$amount MAD';
}
@override
String get call => 'Call';
@override
String get map => 'Map';
@override
String get more => 'More';
@override
String get markAsCompleted => 'Mark as Completed';
@override
String get markAsUncompleted => 'Mark as Uncompleted';
@override
String get uploadPhoto => 'Upload Photo';
@override
String get viewDetails => 'View Details';
@override
String get deliverySuccessful => 'Delivery marked as completed';
@override
String get deliveryFailed => 'Failed to mark delivery';
@override
String get noDeliveries => 'No deliveries';
@override
String get noRoutes => 'No routes available';
@override
String error(String message) {
return 'Error: $message';
}
@override
String get retry => 'Retry';
@override
String get authenticationRequired => 'Authentication required';
@override
String get phoneCall => 'Call customer';
@override
String get navigateToAddress => 'Show on map';
@override
String get language => 'Language';
@override
String get english => 'English';
@override
String get french => 'French';
@override
String get appVersion => 'App Version';
@override
String get about => 'About';
@override
String fullName(String firstName, String lastName) {
return '$firstName $lastName';
}
@override
String completedDeliveries(int completed, int total) {
return '$completed/$total completed';
}
}