diff --git a/ios/Runner.app.dSYM.zip b/ios/Runner.app.dSYM.zip
index af78702..02dec86 100644
Binary files a/ios/Runner.app.dSYM.zip and b/ios/Runner.app.dSYM.zip differ
diff --git a/ios/Runner.ipa b/ios/Runner.ipa
index 65f5cbe..bf9acd4 100644
Binary files a/ios/Runner.ipa and b/ios/Runner.ipa differ
diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj
index 24674c4..4cbc17d 100644
--- a/ios/Runner.xcodeproj/project.pbxproj
+++ b/ios/Runner.xcodeproj/project.pbxproj
@@ -489,7 +489,7 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
- CURRENT_PROJECT_VERSION = 47;
+ CURRENT_PROJECT_VERSION = 48;
DEVELOPMENT_TEAM = JND55328G8;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
@@ -511,7 +511,7 @@
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 47;
+ CURRENT_PROJECT_VERSION = 48;
DEVELOPMENT_TEAM = JND55328G8;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
@@ -530,7 +530,7 @@
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 47;
+ CURRENT_PROJECT_VERSION = 48;
DEVELOPMENT_TEAM = JND55328G8;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
@@ -547,7 +547,7 @@
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 47;
+ CURRENT_PROJECT_VERSION = 48;
DEVELOPMENT_TEAM = JND55328G8;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
@@ -679,7 +679,7 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
- CURRENT_PROJECT_VERSION = 47;
+ CURRENT_PROJECT_VERSION = 48;
DEVELOPMENT_TEAM = JND55328G8;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
@@ -702,7 +702,7 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
- CURRENT_PROJECT_VERSION = 47;
+ CURRENT_PROJECT_VERSION = 48;
DEVELOPMENT_TEAM = JND55328G8;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
index 1800a08..0a0d4cf 100644
--- a/ios/Runner/Info.plist
+++ b/ios/Runner/Info.plist
@@ -43,7 +43,7 @@
CFBundleSignature
????
CFBundleVersion
- 47
+ 48
LSRequiresIPhoneOS
NSBluetoothAlwaysUsageDescription
diff --git a/ios/fastlane/report.xml b/ios/fastlane/report.xml
index 5316700..2185de7 100644
--- a/ios/fastlane/report.xml
+++ b/ios/fastlane/report.xml
@@ -5,22 +5,22 @@
-
+
-
+
-
+
-
+
diff --git a/lib/screens/map_tab.dart b/lib/screens/map_tab.dart
index eb5121b..cb6b8e8 100644
--- a/lib/screens/map_tab.dart
+++ b/lib/screens/map_tab.dart
@@ -1852,10 +1852,10 @@ class _MapTabState extends State with AutomaticKeepAliveClientMixin {
points: contact.advertHistory
.map((advert) => advert.location)
.toList(),
- color: color,
- strokeWidth: 2.5, // Thinner than user trail
- borderColor: Colors.white.withValues(alpha: 0.3),
- borderStrokeWidth: 1.0,
+ color: color.withValues(alpha: 0.95), // More opaque for better visibility
+ strokeWidth: 4.5, // Thicker for better visibility on all map backgrounds
+ borderColor: Colors.white.withValues(alpha: 0.6), // Stronger border contrast
+ borderStrokeWidth: 2.0, // Wider border
// DASHED pattern to distinguish from solid user trail
pattern: StrokePattern.dashed(segments: [8, 4]),
);
diff --git a/lib/services/trail_color_service.dart b/lib/services/trail_color_service.dart
index e07ee70..0779dca 100644
--- a/lib/services/trail_color_service.dart
+++ b/lib/services/trail_color_service.dart
@@ -4,193 +4,183 @@ import '../models/contact.dart';
/// Service for assigning consistent colors to contact trails
/// Uses emoji-based semantic mapping with deterministic hash fallback
class TrailColorService {
- // 64-color palette optimized for visibility on maps
+ // 64-color pastel palette optimized for visibility on all map types
// Organized by hue families for better distribution
+ // Avoids red/orange/yellow spectrum to prevent confusion with fire markers
// Avoids pure blue (#2196F3) which is reserved for user trail
static final List _colorPalette = [
- // Reds (8)
- const Color(0xFFE53935),
- const Color(0xFFD32F2F),
- const Color(0xFFC62828),
- const Color(0xFFB71C1C),
- const Color(0xFFFF5252),
- const Color(0xFFFF1744),
- const Color(0xFFD50000),
- const Color(0xFFC51162),
+ // Pinks & Light Corals (8)
+ const Color(0xFFFFB6C1), // Light Pink
+ const Color(0xFFFF7F7F), // Coral
+ const Color(0xFFFFC0CB), // Pink
+ const Color(0xFFFFB3BA), // Pastel Pink
+ const Color(0xFFFF9AA2), // Light Coral
+ const Color(0xFFFFDAE9), // Pale Pink
+ const Color(0xFFFAA0B8), // Pastel Rose
+ const Color(0xFFFF8FA3), // Salmon Pink
- // Pinks (4)
- const Color(0xFFEC407A),
- const Color(0xFFE91E63),
- const Color(0xFFC2185B),
- const Color(0xFFAD1457),
+ // Purples & Plums (8)
+ const Color(0xFFE6E6FA), // Lavender
+ const Color(0xFFDDA0DD), // Plum
+ const Color(0xFFD8BFD8), // Thistle
+ const Color(0xFFDDA5E9), // Pastel Purple
+ const Color(0xFFE0BBE4), // Mauve
+ const Color(0xFFC5A3E0), // Light Purple
+ const Color(0xFFB19CD9), // Medium Lavender
+ const Color(0xFFAF9FCD), // Wisteria
- // Purples (8)
- const Color(0xFF9C27B0),
- const Color(0xFF8E24AA),
- const Color(0xFF7B1FA2),
- const Color(0xFF6A1B9A),
- const Color(0xFFAB47BC),
- const Color(0xFF9C27B0),
- const Color(0xFF8E24AA),
- const Color(0xFF7B1FA2),
+ // Blues & Sky (12)
+ const Color(0xFF87CEEB), // Sky Blue
+ const Color(0xFFB0E0E6), // Powder Blue
+ const Color(0xFFADD8E6), // Light Blue
+ const Color(0xFF87CEFA), // Light Sky Blue
+ const Color(0xFFB0C4DE), // Light Steel Blue
+ const Color(0xFF9BB8D3), // Pastel Blue
+ const Color(0xFF89CFF0), // Baby Blue
+ const Color(0xFFA2C8EC), // Columbia Blue
+ const Color(0xFF7FB3D5), // Pale Blue
+ const Color(0xFF6A9FB5), // Air Force Blue
+ const Color(0xFF8DB4D2), // Soft Blue
+ const Color(0xFF7BA5C9), // Light Denim
- // Deep Purples (4)
- const Color(0xFF673AB7),
- const Color(0xFF5E35B1),
- const Color(0xFF512DA8),
- const Color(0xFF4527A0),
+ // Cyans & Teals (8)
+ const Color(0xFF5F9EA0), // Cadet Blue
+ const Color(0xFF7FFFD4), // Aquamarine
+ const Color(0xFF98D8C8), // Mint
+ const Color(0xFF82E0D5), // Pale Cyan
+ const Color(0xFF8FD8D8), // Light Teal
+ const Color(0xFF81C0BB), // Cadet Teal
+ const Color(0xFF72B0A8), // Medium Teal
+ const Color(0xFF6FA09E), // Soft Teal
- // Indigos (4)
- const Color(0xFF3F51B5),
- const Color(0xFF3949AB),
- const Color(0xFF303F9F),
- const Color(0xFF283593),
+ // Greens & Mints (8)
+ const Color(0xFF90EE90), // Light Green
+ const Color(0xFF98D8B4), // Celadon
+ const Color(0xFFA8E4A0), // Granny Smith
+ const Color(0xFFB2E8B2), // Tea Green
+ const Color(0xFF9FD8AF), // Eton Blue
+ const Color(0xFF8FC49F), // Pastel Green
+ const Color(0xFF7EB693), // Cambridge Blue
+ const Color(0xFF73A685), // Russian Green
- // Blues (4) - Dark blues only, avoid user trail blue
- const Color(0xFF1E88E5),
- const Color(0xFF1976D2),
- const Color(0xFF1565C0),
- const Color(0xFF0D47A1),
+ // Beiges & Tans (12)
+ const Color(0xFFD2B48C), // Tan
+ const Color(0xFFDEB887), // Burlywood
+ const Color(0xFFE0D8B0), // Beige
+ const Color(0xFFFFDAB9), // Peach
+ const Color(0xFFFFE4B5), // Moccasin
+ const Color(0xFFFFF8DC), // Cornsilk
+ const Color(0xFFE8D5C4), // Champagne
+ const Color(0xFFD4C5B9), // Dust
+ const Color(0xFFC9B8A9), // Khaki
+ const Color(0xFFBCAA99), // Cashmere
+ const Color(0xFFB09B87), // Taupe
+ const Color(0xFFA58F7A), // Mocha
- // Cyans (4)
- const Color(0xFF00ACC1),
- const Color(0xFF0097A7),
- const Color(0xFF00838F),
- const Color(0xFF006064),
-
- // Teals (4)
- const Color(0xFF00897B),
- const Color(0xFF00796B),
- const Color(0xFF00695C),
- const Color(0xFF004D40),
-
- // Greens (8)
- const Color(0xFF43A047),
- const Color(0xFF388E3C),
- const Color(0xFF2E7D32),
- const Color(0xFF1B5E20),
- const Color(0xFF66BB6A),
- const Color(0xFF4CAF50),
- const Color(0xFF388E3C),
- const Color(0xFF2E7D32),
-
- // Limes (4)
- const Color(0xFF9E9D24),
- const Color(0xFF827717),
- const Color(0xFFC0CA33),
- const Color(0xFFAFB42B),
-
- // Ambers (4)
- const Color(0xFFFFA726),
- const Color(0xFFFF9800),
- const Color(0xFFFB8C00),
- const Color(0xFFF57C00),
-
- // Oranges (4)
- const Color(0xFFFF7043),
- const Color(0xFFFF5722),
- const Color(0xFFF4511E),
- const Color(0xFFE64A19),
-
- // Browns (4)
- const Color(0xFF6D4C41),
- const Color(0xFF5D4037),
- const Color(0xFF4E342E),
- const Color(0xFF3E2723),
+ // Grays & Silvers (8)
+ const Color(0xFFD3D3D3), // Light Gray
+ const Color(0xFFC0C0C0), // Silver
+ const Color(0xFFBCBCBC), // Bright Gray
+ const Color(0xFFB2B2B2), // Medium Gray
+ const Color(0xFFA9A9A9), // Dark Gray
+ const Color(0xFF9E9E9E), // Gray
+ const Color(0xFF8E8E8E), // Taupe Gray
+ const Color(0xFF7E7E7E), // Granite
];
// Emoji to color mapping for SAR roles
- // Uses semantic colors that match emergency service conventions
+ // Uses pastel semantic colors for high visibility on maps
+ // Avoids red/orange/yellow to prevent confusion with fire markers
static final Map _emojiColorMap = {
// Emergency Services - Firefighters
- '🚒': Color(0xFFD32F2F), // Fire engine → Red
- '🧑🚒': Color(0xFFD32F2F), // Firefighter → Red
- '👨🚒': Color(0xFFD32F2F), // Firefighter → Red
- '👩🚒': Color(0xFFD32F2F), // Firefighter → Red
- '🔥': Color(0xFFFF5722), // Fire → Orange-Red
+ '🚒': Color(0xFFFF7F7F), // Fire engine → Coral
+ '🧑🚒': Color(0xFFFF7F7F), // Firefighter → Coral
+ '👨🚒': Color(0xFFFF7F7F), // Firefighter → Coral
+ '👩🚒': Color(0xFFFF7F7F), // Firefighter → Coral
+ '🔥': Color(0xFFFFB6C1), // Fire → Light Pink
// Emergency Services - Medical
- '🚑': Color(0xFF43A047), // Ambulance → Green (medical cross)
- '👨⚕️': Color(0xFF43A047), // Health worker → Green
- '👩⚕️': Color(0xFF43A047), // Health worker → Green
- '🧑⚕️': Color(0xFF43A047), // Health worker → Green
- '⚕️': Color(0xFF43A047), // Medical symbol → Green
+ '🚑': Color(0xFF7FFFD4), // Ambulance → Mint (medical cross)
+ '👨⚕️': Color(0xFF7FFFD4), // Health worker → Mint
+ '👩⚕️': Color(0xFF7FFFD4), // Health worker → Mint
+ '🧑⚕️': Color(0xFF7FFFD4), // Health worker → Mint
+ '⚕️': Color(0xFF7FFFD4), // Medical symbol → Mint
// Emergency Services - Police
- '👮': Color(0xFF1976D2), // Police → Blue
- '👮♂️': Color(0xFF1976D2), // Police → Blue
- '👮♀️': Color(0xFF1976D2), // Police → Blue
- '🚔': Color(0xFF1976D2), // Police car → Blue
+ '👮': Color(0xFF87CEEB), // Police → Light Blue
+ '👮♂️': Color(0xFF87CEEB), // Police → Light Blue
+ '👮♀️': Color(0xFF87CEEB), // Police → Light Blue
+ '🚔': Color(0xFF87CEEB), // Police car → Light Blue
// Emergency Services - Aviation
- '🧑✈️': Color(0xFF1565C0), // Pilot → Dark Blue
- '👨✈️': Color(0xFF1565C0), // Pilot → Dark Blue
- '👩✈️': Color(0xFF1565C0), // Pilot → Dark Blue
- '🚁': Color(0xFF8E24AA), // Helicopter → Purple
+ '🧑✈️': Color(0xFFB0E0E6), // Pilot → Sky Blue
+ '👨✈️': Color(0xFFB0E0E6), // Pilot → Sky Blue
+ '👩✈️': Color(0xFFB0E0E6), // Pilot → Sky Blue
+ '🚁': Color(0xFFE6E6FA), // Helicopter → Lavender
// SAR Roles - Mountain/Alpine
- '🏔️': Color(0xFF6D4C41), // Mountain → Brown
- '⛰️': Color(0xFF6D4C41), // Mountain → Brown
- '🧗': Color(0xFF6D4C41), // Climber → Brown
- '🧗♂️': Color(0xFF6D4C41), // Climber → Brown
- '🧗♀️': Color(0xFF6D4C41), // Climber → Brown
- '🥾': Color(0xFF5D4037), // Hiking boot → Dark Brown
+ '🏔️': Color(0xFFD2B48C), // Mountain → Tan
+ '⛰️': Color(0xFFD2B48C), // Mountain → Tan
+ '🧗': Color(0xFFD2B48C), // Climber → Tan
+ '🧗♂️': Color(0xFFD2B48C), // Climber → Tan
+ '🧗♀️': Color(0xFFD2B48C), // Climber → Tan
+ '🥾': Color(0xFFDEB887), // Hiking boot → Burlywood
// SAR Roles - K9 Unit
- '🐕': Color(0xFFFFA726), // Dog → Orange
- '🐶': Color(0xFFFFA726), // Dog → Orange
- '🦮': Color(0xFFFFA726), // Service dog → Orange
+ '🐕': Color(0xFFFFDAB9), // Dog → Peach
+ '🐶': Color(0xFFFFDAB9), // Dog → Peach
+ '🦮': Color(0xFFFFDAB9), // Service dog → Peach
// SAR Roles - Water Rescue
- '🚤': Color(0xFF00ACC1), // Speedboat → Cyan
- '⛵': Color(0xFF00ACC1), // Sailboat → Cyan
- '🏊': Color(0xFF00897B), // Swimmer → Teal
- '🏊♂️': Color(0xFF00897B), // Swimmer → Teal
- '🏊♀️': Color(0xFF00897B), // Swimmer → Teal
+ '🚤': Color(0xFF87CEEB), // Speedboat → Sky Blue
+ '⛵': Color(0xFF87CEEB), // Sailboat → Sky Blue
+ '🏊': Color(0xFF5F9EA0), // Swimmer → Cadet Blue
+ '🏊♂️': Color(0xFF5F9EA0), // Swimmer → Cadet Blue
+ '🏊♀️': Color(0xFF5F9EA0), // Swimmer → Cadet Blue
// Team Roles - Leadership
- '🎯': Color(0xFFE64A19), // Target → Deep Orange (team leader)
- '⭐': Color(0xFFFDD835), // Star → Yellow (coordinator)
- '👑': Color(0xFFFDD835), // Crown → Yellow (leader)
+ '🎯': Color(0xFFFFB6C1), // Target → Light Pink (team leader)
+ '⭐': Color(0xFFFFE4B5), // Star → Moccasin (coordinator)
+ '👑': Color(0xFFFFE4B5), // Crown → Moccasin (leader)
// Team Roles - Communication
- '📡': Color(0xFF00897B), // Satellite → Teal (radio/comms)
- '📻': Color(0xFF00897B), // Radio → Teal
- '📞': Color(0xFF00897B), // Phone → Teal
+ '📡': Color(0xFF5F9EA0), // Satellite → Cadet Blue (radio/comms)
+ '📻': Color(0xFF5F9EA0), // Radio → Cadet Blue
+ '📞': Color(0xFF5F9EA0), // Phone → Cadet Blue
// Team Roles - Navigation
- '🗺️': Color(0xFF00ACC1), // Map → Cyan (navigator)
- '🧭': Color(0xFF00ACC1), // Compass → Cyan
- '📍': Color(0xFFE53935), // Pin → Red (location marker)
+ '🗺️': Color(0xFF87CEEB), // Map → Sky Blue (navigator)
+ '🧭': Color(0xFF87CEEB), // Compass → Sky Blue
+ '📍': Color(0xFFFF7F7F), // Pin → Coral (location marker)
// Team Roles - Documentation
- '📷': Color(0xFFAB47BC), // Camera → Light Purple
- '📹': Color(0xFFAB47BC), // Video camera → Light Purple
- '📝': Color(0xFF9E9D24), // Note → Lime (scribe)
+ '📷': Color(0xFFDDA0DD), // Camera → Plum
+ '📹': Color(0xFFDDA0DD), // Video camera → Plum
+ '📝': Color(0xFFE0E0A0), // Note → Khaki (scribe)
// Equipment
- '🔦': Color(0xFFFB8C00), // Flashlight → Amber
- '⚡': Color(0xFFFDD835), // Lightning → Yellow (power/energy)
- '🔋': Color(0xFF43A047), // Battery → Green
- '🎒': Color(0xFF5D4037), // Backpack → Brown
+ '🔦': Color(0xFFFFE4B5), // Flashlight → Moccasin
+ '⚡': Color(0xFFFFE4B5), // Lightning → Moccasin (power/energy)
+ '🔋': Color(0xFF7FFFD4), // Battery → Mint
+ '🎒': Color(0xFFDEB887), // Backpack → Burlywood
// Generic Person Icons
- '👤': Color(0xFF9E9E9E), // Silhouette → Gray
- '🧑': Color(0xFF9E9E9E), // Person → Gray
- '👨': Color(0xFF9E9E9E), // Man → Gray
- '👩': Color(0xFF9E9E9E), // Woman → Gray
- '👥': Color(0xFF757575), // People → Dark Gray
+ '👤': Color(0xFFD3D3D3), // Silhouette → Light Gray
+ '🧑': Color(0xFFD3D3D3), // Person → Light Gray
+ '👨': Color(0xFFD3D3D3), // Man → Light Gray
+ '👩': Color(0xFFD3D3D3), // Woman → Light Gray
+ '👥': Color(0xFFC0C0C0), // People → Silver
};
/// Get trail color for a contact
/// Priority: Emoji mapping > Name hash > Default
+ /// Returns fully opaque color - alpha transparency applied by caller
static Color getTrailColor(Contact contact) {
// 1. Try emoji-based color mapping
if (contact.roleEmoji != null) {
final emojiColor = _emojiColorMap[contact.roleEmoji];
if (emojiColor != null) {
- // Return with slight transparency for better map visibility
- return emojiColor.withValues(alpha: 0.75);
+ return emojiColor;
}
}
@@ -203,7 +193,7 @@ class TrailColorService {
final hash = _hashString(name);
final colorIndex = hash % _colorPalette.length; // 0-63
- return _colorPalette[colorIndex].withValues(alpha: 0.75);
+ return _colorPalette[colorIndex];
}
/// Simple string hash function (DJB2 algorithm)