Real iPhone wallpaper + populated Favourites captures
- PreviewWallpaper image set: the actual iPhone wallpaper extracted from the iOS 26.3 sim runtime (ActionButtonSelector Display.ca, 1320x2870 native res, JPEG ~180 KB) — replaces the gradient backdrop in the widget mock - -seedFavourite <substring> launch hook: pins the first matching station for Unleaded via the normal keychain+app-group save path, so the Favourites tab can be captured populated (Ring Road Service Station, 129.9, 59.1 mi, TOP badge) - Re-captured 2-favourites (light), 6-favourites-dark, 9-widgets-dark, 10-widgets-light with real data - 95/95 tests green; Release IPA rebuilt + re-served
|
Before Width: | Height: | Size: 2.4 MiB After Width: | Height: | Size: 850 KiB |
|
Before Width: | Height: | Size: 181 KiB After Width: | Height: | Size: 306 KiB |
|
Before Width: | Height: | Size: 166 KiB After Width: | Height: | Size: 266 KiB |
|
Before Width: | Height: | Size: 2.4 MiB After Width: | Height: | Size: 851 KiB |
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "PreviewWallpaper.jpg",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "1x"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 177 KiB |
@@ -186,6 +186,16 @@ struct ContentView: View {
|
|||||||
// without touching the stored flag.
|
// without touching the stored flag.
|
||||||
let args = ProcessInfo.processInfo.arguments
|
let args = ProcessInfo.processInfo.arguments
|
||||||
showWidgetMock = args.contains("-widgets")
|
showWidgetMock = args.contains("-widgets")
|
||||||
|
// `-seedFavourite <substring>` pins the first matching station
|
||||||
|
// for Unleaded via the normal save path (keychain + app group)
|
||||||
|
// so screenshot captures can show a populated Favourites tab.
|
||||||
|
if let i = args.firstIndex(of: "-seedFavourite"), i + 1 < args.count {
|
||||||
|
let query = args[i + 1]
|
||||||
|
if let station = FuelStore.loadStations()
|
||||||
|
.first(where: { $0.name.localizedCaseInsensitiveContains(query) }) {
|
||||||
|
FuelStore.saveFavourites([FavouriteEntry(station: station, fuel: .e10)])
|
||||||
|
}
|
||||||
|
}
|
||||||
if let i = args.firstIndex(of: "-tab"), i + 1 < args.count {
|
if let i = args.firstIndex(of: "-tab"), i + 1 < args.count {
|
||||||
switch args[i + 1] {
|
switch args[i + 1] {
|
||||||
case "favourites": selectedTab = 1
|
case "favourites": selectedTab = 1
|
||||||
|
|||||||
@@ -6,11 +6,13 @@ import WidgetKit
|
|||||||
/// code the widget extension renders) at small + medium sizes. Used for App
|
/// code the widget extension renders) at small + medium sizes. Used for App
|
||||||
/// Store screenshot captures; not reachable from the UI.
|
/// Store screenshot captures; not reachable from the UI.
|
||||||
struct WidgetMockScreen: View {
|
struct WidgetMockScreen: View {
|
||||||
@Environment(\.colorScheme) private var colorScheme
|
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
ZStack {
|
ZStack {
|
||||||
wallpaper
|
// Real iPhone wallpaper (extracted from the iOS 26.3 sim runtime —
|
||||||
|
// ActionButtonSelector Display.ca asset, 1320×2870 native res).
|
||||||
|
Image("PreviewWallpaper")
|
||||||
|
.resizable()
|
||||||
|
.scaledToFill()
|
||||||
.ignoresSafeArea()
|
.ignoresSafeArea()
|
||||||
|
|
||||||
VStack(alignment: .leading, spacing: 26) {
|
VStack(alignment: .leading, spacing: 26) {
|
||||||
@@ -23,10 +25,12 @@ struct WidgetMockScreen: View {
|
|||||||
VStack(alignment: .leading, spacing: 3) {
|
VStack(alignment: .leading, spacing: 3) {
|
||||||
Text("FuelBoard")
|
Text("FuelBoard")
|
||||||
.font(.title2.bold())
|
.font(.title2.bold())
|
||||||
.foregroundStyle(.primary)
|
.foregroundStyle(.white)
|
||||||
|
.shadow(radius: 2, y: 1)
|
||||||
Text("Cheapest fuel near you")
|
Text("Cheapest fuel near you")
|
||||||
.font(.subheadline)
|
.font(.subheadline)
|
||||||
.foregroundStyle(.secondary)
|
.foregroundStyle(.white.opacity(0.9))
|
||||||
|
.shadow(radius: 2, y: 1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.padding(.top, 8)
|
.padding(.top, 8)
|
||||||
@@ -40,32 +44,6 @@ struct WidgetMockScreen: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// iOS-default-style wallpaper (dark navy → black in dark mode, soft
|
|
||||||
/// blue-grey in light), matching the system default look.
|
|
||||||
private var wallpaper: some View {
|
|
||||||
Group {
|
|
||||||
if colorScheme == .dark {
|
|
||||||
LinearGradient(
|
|
||||||
colors: [
|
|
||||||
Color(red: 0.09, green: 0.14, blue: 0.26),
|
|
||||||
Color(red: 0.05, green: 0.08, blue: 0.15),
|
|
||||||
Color(red: 0.02, green: 0.03, blue: 0.06)
|
|
||||||
],
|
|
||||||
startPoint: .topLeading, endPoint: .bottomTrailing
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
LinearGradient(
|
|
||||||
colors: [
|
|
||||||
Color(red: 0.72, green: 0.80, blue: 0.94),
|
|
||||||
Color(red: 0.85, green: 0.90, blue: 0.97),
|
|
||||||
Color(red: 0.94, green: 0.96, blue: 0.99)
|
|
||||||
],
|
|
||||||
startPoint: .topLeading, endPoint: .bottomTrailing
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private func widgetCard(_ family: WidgetFamily, label: String) -> some View {
|
private func widgetCard(_ family: WidgetFamily, label: String) -> some View {
|
||||||
// Real widget proportions: system small content is 158×158pt,
|
// Real widget proportions: system small content is 158×158pt,
|
||||||
// medium 338×158pt (card adds the 14pt padding each side).
|
// medium 338×158pt (card adds the 14pt padding each side).
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
1786807715.783432: Module build session file for module cache at Path(_str: "/Users/apt/workspace/fuelboard/build-pm/ModuleCache.noindex")
|
1786808620.023363: Module build session file for module cache at Path(_str: "/Users/apt/workspace/fuelboard/build-pm/ModuleCache.noindex")
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<plist version="1.0">
|
<plist version="1.0">
|
||||||
<dict>
|
<dict>
|
||||||
<key>LastAccessedDate</key>
|
<key>LastAccessedDate</key>
|
||||||
<date>2026-08-15T15:28:33Z</date>
|
<date>2026-08-15T15:43:37Z</date>
|
||||||
<key>WorkspacePath</key>
|
<key>WorkspacePath</key>
|
||||||
<string>/Users/apt/workspace/fuelboard/FuelBoard.xcodeproj</string>
|
<string>/Users/apt/workspace/fuelboard/FuelBoard.xcodeproj</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
|||||||