diff --git a/pedi-foods/Android/app/src/main/res/drawable/login_dark.png b/pedi-foods/Android/app/src/main/res/drawable/login_dark.png new file mode 100644 index 0000000..bf637d4 Binary files /dev/null and b/pedi-foods/Android/app/src/main/res/drawable/login_dark.png differ diff --git a/pedi-foods/Android/app/src/main/res/drawable/login_light.png b/pedi-foods/Android/app/src/main/res/drawable/login_light.png new file mode 100644 index 0000000..e7c5b09 Binary files /dev/null and b/pedi-foods/Android/app/src/main/res/drawable/login_light.png differ diff --git a/pedi-foods/Android/app/src/main/res/drawable/pedifoods.png b/pedi-foods/Android/app/src/main/res/drawable/pedifoods.png new file mode 100644 index 0000000..a94a4ff Binary files /dev/null and b/pedi-foods/Android/app/src/main/res/drawable/pedifoods.png differ diff --git a/pedi-foods/Android/app/src/main/res/drawable/pedifoods_dark.png b/pedi-foods/Android/app/src/main/res/drawable/pedifoods_dark.png new file mode 100644 index 0000000..a94a4ff Binary files /dev/null and b/pedi-foods/Android/app/src/main/res/drawable/pedifoods_dark.png differ diff --git a/pedi-foods/Android/app/src/main/res/drawable/pin_image_app.png b/pedi-foods/Android/app/src/main/res/drawable/pin_image_app.png new file mode 100644 index 0000000..7ed510e Binary files /dev/null and b/pedi-foods/Android/app/src/main/res/drawable/pin_image_app.png differ diff --git a/pedi-foods/Android/app/src/main/res/drawable/pin_image_app_dark.png b/pedi-foods/Android/app/src/main/res/drawable/pin_image_app_dark.png new file mode 100644 index 0000000..450d7bc Binary files /dev/null and b/pedi-foods/Android/app/src/main/res/drawable/pin_image_app_dark.png differ diff --git a/pedi-foods/Android/app/src/main/res/drawable/placeholder_product.png b/pedi-foods/Android/app/src/main/res/drawable/placeholder_product.png new file mode 100644 index 0000000..889fa6c Binary files /dev/null and b/pedi-foods/Android/app/src/main/res/drawable/placeholder_product.png differ diff --git a/pedi-foods/Android/app/src/main/res/drawable/tracking_canceled.png b/pedi-foods/Android/app/src/main/res/drawable/tracking_canceled.png new file mode 100644 index 0000000..6b0acbc Binary files /dev/null and b/pedi-foods/Android/app/src/main/res/drawable/tracking_canceled.png differ diff --git a/pedi-foods/Android/app/src/main/res/drawable/tracking_completed.png b/pedi-foods/Android/app/src/main/res/drawable/tracking_completed.png new file mode 100644 index 0000000..fee3d7f Binary files /dev/null and b/pedi-foods/Android/app/src/main/res/drawable/tracking_completed.png differ diff --git a/pedi-foods/Android/app/src/main/res/drawable/tracking_delivering.png b/pedi-foods/Android/app/src/main/res/drawable/tracking_delivering.png new file mode 100644 index 0000000..2d996ae Binary files /dev/null and b/pedi-foods/Android/app/src/main/res/drawable/tracking_delivering.png differ diff --git a/pedi-foods/Android/app/src/main/res/drawable/tracking_pending.png b/pedi-foods/Android/app/src/main/res/drawable/tracking_pending.png new file mode 100644 index 0000000..a4a9344 Binary files /dev/null and b/pedi-foods/Android/app/src/main/res/drawable/tracking_pending.png differ diff --git a/pedi-foods/Android/app/src/main/res/drawable/tracking_preparing.png b/pedi-foods/Android/app/src/main/res/drawable/tracking_preparing.png new file mode 100644 index 0000000..23fc9a7 Binary files /dev/null and b/pedi-foods/Android/app/src/main/res/drawable/tracking_preparing.png differ diff --git a/pedi-foods/Android/app/src/main/res/drawable/tracking_ready.png b/pedi-foods/Android/app/src/main/res/drawable/tracking_ready.png new file mode 100644 index 0000000..fe2f0f2 Binary files /dev/null and b/pedi-foods/Android/app/src/main/res/drawable/tracking_ready.png differ diff --git a/pedi-foods/Sources/PediFoods/Components/StoreCard.swift b/pedi-foods/Sources/PediFoods/Components/StoreCard.swift index c439344..d5c2e85 100644 --- a/pedi-foods/Sources/PediFoods/Components/StoreCard.swift +++ b/pedi-foods/Sources/PediFoods/Components/StoreCard.swift @@ -96,12 +96,18 @@ struct FeaturedStoreCard: View { private var storeIconPlaceholder: some View { ZStack { #if os(Android) - Image("placeholder-product", bundle: .module) - .resizable() - .scaledToFill() - .opacity(0.7) - .frame(maxWidth: .infinity, maxHeight: .infinity) - .clipped() + AsyncImage(url: Bundle.module.url(forResource: "placeholder-product", withExtension: "png")) { phase in + if let image = phase.image { + image + .resizable() + } else { + Color.clear + } + } + .scaledToFill() + .opacity(0.7) + .frame(maxWidth: .infinity, maxHeight: .infinity) + .clipped() #else Image("placeholder-product") .resizable() diff --git a/pedi-foods/Sources/PediFoods/DesignSystem/DesignSystem.swift b/pedi-foods/Sources/PediFoods/DesignSystem/DesignSystem.swift index fd90ec8..0d0f26c 100644 --- a/pedi-foods/Sources/PediFoods/DesignSystem/DesignSystem.swift +++ b/pedi-foods/Sources/PediFoods/DesignSystem/DesignSystem.swift @@ -7,7 +7,8 @@ import AppKit // MARK: - Colors -enum AppColors { +struct AppColors { + private init() {} // Brandbook 2026 (Pedi Foods) // Primary now follows the "FOODS" dark green tone from the logo. static let primary = Color(.sRGB, red: 52/255.0, green: 93/255.0, blue: 84/255.0, opacity: 1.0) @@ -26,7 +27,8 @@ enum AppColors { static let textMuted = Color(.sRGB, red: 102/255.0, green: 112/255.0, blue: 133/255.0, opacity: 1.0) } -enum AppDarkColors { +struct AppDarkColors { + private init() {} static let background = Color(.sRGB, red: 31/255.0, green: 45/255.0, blue: 64/255.0, opacity: 1.0) static let surface = Color.white.opacity(0.08) static let textPrimary = Color.white @@ -38,7 +40,8 @@ enum AppDarkColors { // MARK: - Typography -enum AppTypography { +struct AppTypography { + private init() {} // Brandbook typography: Nexa (fallback: system font) static let fontFamily = "Nexa-Regular" @@ -75,7 +78,8 @@ enum AppTypography { // MARK: - Layout -enum AppLayout { +struct AppLayout { + private init() {} static let radiusMD: CGFloat = 12 static let radiusLG: CGFloat = 16 static let radiusXL: CGFloat = 24 @@ -92,7 +96,8 @@ struct ShadowSpec { let y: CGFloat } -enum AppShadow { +struct AppShadow { + private init() {} static let soft = ShadowSpec(color: Color.black.opacity(0.08), radius: 20, y: 6) static let glow = ShadowSpec(color: AppColors.tertiary.opacity(0.2), radius: 24, y: 8) } diff --git a/pedi-foods/Sources/PediFoods/Views/Auth/LoginEmailView.swift b/pedi-foods/Sources/PediFoods/Views/Auth/LoginEmailView.swift index 787699b..40e96dc 100644 --- a/pedi-foods/Sources/PediFoods/Views/Auth/LoginEmailView.swift +++ b/pedi-foods/Sources/PediFoods/Views/Auth/LoginEmailView.swift @@ -15,8 +15,14 @@ struct LoginEmailView: View { @ViewBuilder private var logoImage: some View { #if os(Android) - SwiftUI.Image("pedifoods", bundle: .module) - .resizable() + AsyncImage(url: Bundle.module.url(forResource: "pedifoods", withExtension: "png")) { phase in + if let image = phase.image { + image + .resizable() + } else { + Color.clear + } + } #else SwiftUI.Image("pedifoods") .resizable() diff --git a/pedi-foods/Sources/PediFoods/Views/Auth/LoginView.swift b/pedi-foods/Sources/PediFoods/Views/Auth/LoginView.swift index cf87135..acfed33 100644 --- a/pedi-foods/Sources/PediFoods/Views/Auth/LoginView.swift +++ b/pedi-foods/Sources/PediFoods/Views/Auth/LoginView.swift @@ -16,8 +16,14 @@ struct LoginView: View { @ViewBuilder private var logoImage: some View { #if os(Android) - SwiftUI.Image("pedifoods", bundle: .module) - .resizable() + AsyncImage(url: Bundle.module.url(forResource: "pedifoods", withExtension: "png")) { phase in + if let image = phase.image { + image + .resizable() + } else { + Color.clear + } + } #else SwiftUI.Image("pedifoods") .resizable() @@ -26,8 +32,14 @@ struct LoginView: View { @ViewBuilder private var pinHeroImage: some View { #if os(Android) - SwiftUI.Image(colorScheme == .dark ? "pin_image_app_dark" : "pin_image_app", bundle: .module) - .resizable() + AsyncImage(url: Bundle.module.url(forResource: colorScheme == .dark ? "pin_image_app_dark" : "pin_image_app", withExtension: "png")) { phase in + if let image = phase.image { + image + .resizable() + } else { + Color.clear + } + } #else SwiftUI.Image("pin_image_app") .resizable() diff --git a/pedi-foods/Sources/PediFoods/Views/Auth/OtpView.swift b/pedi-foods/Sources/PediFoods/Views/Auth/OtpView.swift index 08ccd07..fc44543 100644 --- a/pedi-foods/Sources/PediFoods/Views/Auth/OtpView.swift +++ b/pedi-foods/Sources/PediFoods/Views/Auth/OtpView.swift @@ -26,11 +26,17 @@ struct OtpView: View { ScrollView { VStack(spacing: 0) { #if os(Android) - SwiftUI.Image("pedifoods", bundle: .module) - .resizable() - .scaledToFit() - .frame(width: 74, height: 74) - .padding(.top, 140) + AsyncImage(url: Bundle.module.url(forResource: "pedifoods", withExtension: "png")) { phase in + if let image = phase.image { + image + .resizable() + } else { + Color.clear + } + } + .scaledToFit() + .frame(width: 74, height: 74) + .padding(.top, 140) #else SwiftUI.Image("pedifoods") .resizable() diff --git a/pedi-foods/Sources/PediFoods/Views/Auth/RegistrationView.swift b/pedi-foods/Sources/PediFoods/Views/Auth/RegistrationView.swift index 405cca1..6057c16 100644 --- a/pedi-foods/Sources/PediFoods/Views/Auth/RegistrationView.swift +++ b/pedi-foods/Sources/PediFoods/Views/Auth/RegistrationView.swift @@ -19,8 +19,14 @@ struct RegistrationView: View { @ViewBuilder private var logoImage: some View { #if os(Android) - SwiftUI.Image("pedifoods", bundle: .module) - .resizable() + AsyncImage(url: Bundle.module.url(forResource: "pedifoods", withExtension: "png")) { phase in + if let image = phase.image { + image + .resizable() + } else { + Color.clear + } + } #else SwiftUI.Image("pedifoods") .resizable() diff --git a/pedi-foods/Sources/PediFoods/Views/Launch/LaunchSplashView.swift b/pedi-foods/Sources/PediFoods/Views/Launch/LaunchSplashView.swift index 7e10f16..6a6bc29 100644 --- a/pedi-foods/Sources/PediFoods/Views/Launch/LaunchSplashView.swift +++ b/pedi-foods/Sources/PediFoods/Views/Launch/LaunchSplashView.swift @@ -37,8 +37,14 @@ struct LaunchSplashView: View { @ViewBuilder var splashLogo: some View { #if os(Android) - SwiftUI.Image("pedifoods", bundle: .module) - .resizable() + AsyncImage(url: Bundle.module.url(forResource: "pedifoods", withExtension: "png")) { phase in + if let image = phase.image { + image + .resizable() + } else { + Color.clear + } + } #else SwiftUI.Image("pedifoods") .resizable() diff --git a/pedi-foods/Sources/PediFoods/Views/Main/AddAddressFormView.swift b/pedi-foods/Sources/PediFoods/Views/Main/AddAddressFormView.swift index 94c955b..90a360c 100644 --- a/pedi-foods/Sources/PediFoods/Views/Main/AddAddressFormView.swift +++ b/pedi-foods/Sources/PediFoods/Views/Main/AddAddressFormView.swift @@ -33,8 +33,14 @@ struct AddAddressFormView: View { @ViewBuilder private var logoImage: some View { #if os(Android) - SwiftUI.Image("pedifoods", bundle: .module) - .resizable() + AsyncImage(url: Bundle.module.url(forResource: "pedifoods", withExtension: "png")) { phase in + if let image = phase.image { + image + .resizable() + } else { + Color.clear + } + } #else SwiftUI.Image("pedifoods") .resizable() diff --git a/pedi-foods/Sources/PediFoods/Views/Main/OrderTrackingView.swift b/pedi-foods/Sources/PediFoods/Views/Main/OrderTrackingView.swift index 5fae271..326646d 100644 --- a/pedi-foods/Sources/PediFoods/Views/Main/OrderTrackingView.swift +++ b/pedi-foods/Sources/PediFoods/Views/Main/OrderTrackingView.swift @@ -223,10 +223,16 @@ struct OrderTrackingView: View { Group { if hasTrackingImage { #if os(Android) - Image(trackingImageName, bundle: .module) - .renderingMode(.original) - .resizable() - .scaledToFit() + AsyncImage(url: Bundle.module.url(forResource: trackingImageName, withExtension: "png")) { phase in + if let image = phase.image { + image + .renderingMode(.original) + .resizable() + } else { + Color.clear + } + } + .scaledToFit() #else Image(trackingImageName) .renderingMode(.original) @@ -235,10 +241,16 @@ struct OrderTrackingView: View { #endif } else if hasPlaceholderProductImage { #if os(Android) - Image("placeholder-product", bundle: .module) - .renderingMode(.original) - .resizable() - .scaledToFit() + AsyncImage(url: Bundle.module.url(forResource: "placeholder-product", withExtension: "png")) { phase in + if let image = phase.image { + image + .renderingMode(.original) + .resizable() + } else { + Color.clear + } + } + .scaledToFit() #else Image("placeholder-product") .renderingMode(.original) diff --git a/pedi-foods/Vendor/skip-fuse-ui b/pedi-foods/Vendor/skip-fuse-ui new file mode 160000 index 0000000..9025fb5 --- /dev/null +++ b/pedi-foods/Vendor/skip-fuse-ui @@ -0,0 +1 @@ +Subproject commit 9025fb50e2f65d75ffa2ec39aca2b76b09c19de1 diff --git a/pedi-foods/Vendor/skip-ui b/pedi-foods/Vendor/skip-ui new file mode 160000 index 0000000..9d584e7 --- /dev/null +++ b/pedi-foods/Vendor/skip-ui @@ -0,0 +1 @@ +Subproject commit 9d584e70965af90c77938b8dc08190df75bdfb08