From 311118f0faffa332e6643d375151801546846e60 Mon Sep 17 00:00:00 2001 From: FuelBoard Contributor Date: Wed, 14 Oct 2026 12:25:16 +0100 Subject: [PATCH 1/2] Add a DEBUG screen-marker hook so Simulator taps can be verified `-qaScreenMarker` paints the screen flat magenta, which lets a macOS capture locate the device-screen rectangle exactly and map simulator-screenshot pixels to click coordinates. `simctl` cannot drive taps and the project has no UI-test target, so this is the only way to test real touch behaviour on the sheet. Guarded by #if DEBUG, exactly like the existing -qaCopyPostcode hook. --- FuelBoard/FuelBoardApp.swift | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/FuelBoard/FuelBoardApp.swift b/FuelBoard/FuelBoardApp.swift index b71d702..04d36f5 100644 --- a/FuelBoard/FuelBoardApp.swift +++ b/FuelBoard/FuelBoardApp.swift @@ -21,7 +21,7 @@ struct FuelBoardApp: App { var body: some Scene { WindowGroup { - ContentView() + rootView .onOpenURL(perform: handleOpenURL) .onReceive(NotificationCenter.default.publisher(for: .fuelBoardWatchRefreshRequested)) { _ in WatchSyncManager.shared.pushSnapshot() @@ -32,6 +32,24 @@ struct FuelBoardApp: App { } } + /// QA hook (Debug builds only): `-qaScreenMarker` paints the whole screen a + /// flat magenta. A macOS capture of the Simulator window can then locate the + /// device-screen rectangle exactly, which yields a pixel-accurate mapping + /// from simulator screenshots to click coordinates. That is the only way to + /// drive REAL taps into the Simulator: `simctl` cannot, and this project has + /// no UI-test target. Everything else renders ContentView as normal. + @ViewBuilder private var rootView: some View { + #if DEBUG + if ProcessInfo.processInfo.arguments.contains("-qaScreenMarker") { + Color(red: 1, green: 0, blue: 1).ignoresSafeArea() + } else { + ContentView() + } + #else + ContentView() + #endif + } + #if DEBUG private func startQALiveActivity(fuel: FuelType) { let state = FuelBoardLiveActivityAttributes.ContentState( From 666d59c483eb876ed341ea50199121e0ffa018f0 Mon Sep 17 00:00:00 2001 From: FuelBoard Contributor Date: Wed, 14 Oct 2026 12:25:16 +0100 Subject: [PATCH 2/2] More info sheet: give each action button its own tap target Directions and Report issue both fired on any tap inside their row: with the default button style a List row has a single row-wide tap target, so tapping one button triggered the other's action too (tapping Report issue opened Apple Maps, and tapping Directions showed the report alert). `.buttonStyle(.borderless)` gives each button its own hit area over its half-row frame. Verified with real simulated taps on both buttons. --- FuelBoard/StationDetailView.swift | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/FuelBoard/StationDetailView.swift b/FuelBoard/StationDetailView.swift index 835c9f6..7a5e12f 100644 --- a/FuelBoard/StationDetailView.swift +++ b/FuelBoard/StationDetailView.swift @@ -138,6 +138,12 @@ struct StationDetailView: View { .frame(maxWidth: .infinity) } } + // REQUIRED: with the default button style a `List` row has ONE + // row-wide tap target, so two buttons in the same row BOTH fire + // on any tap inside the row (tapping Directions also showed the + // report-issue alert and vice versa). `.borderless` gives each + // button its own hit area — the half-row frame above. + .buttonStyle(.borderless) } Section { // The station name is NOT repeated here: the sheet header