Detail sheet: reorder to title → route → photo
User asked for this order. Photo now slots between routeSection and LIVE STATE rather than living as a hero above the title. Used a -16 horizontal padding so the photo still goes full-bleed inside the otherwise-16pt-padded content stack. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -38,52 +38,54 @@ struct LiveFlightDetailSheet: View {
|
|||||||
var body: some View {
|
var body: some View {
|
||||||
NavigationStack {
|
NavigationStack {
|
||||||
ScrollView {
|
ScrollView {
|
||||||
VStack(alignment: .leading, spacing: 0) {
|
VStack(alignment: .leading, spacing: 16) {
|
||||||
|
header
|
||||||
|
|
||||||
|
// Depart → Arrival sits directly under the callsign
|
||||||
|
// header — it's the single most important thing the
|
||||||
|
// user opened the sheet to see.
|
||||||
|
routeSection
|
||||||
|
|
||||||
|
// Aircraft photo follows the route. Negative
|
||||||
|
// horizontal padding lets the photo break out of the
|
||||||
|
// 16pt content padding to be full-bleed edge-to-edge.
|
||||||
photoBanner
|
photoBanner
|
||||||
|
.padding(.horizontal, -16)
|
||||||
|
|
||||||
VStack(alignment: .leading, spacing: 16) {
|
if let photo = aircraftPhoto, let credit = photo.photographer {
|
||||||
header
|
photoCredit(name: credit, link: photo.detailLink)
|
||||||
|
}
|
||||||
|
|
||||||
// Depart → Arrival lives directly under the callsign
|
Divider()
|
||||||
// header — it's the single most important thing the
|
|
||||||
// user opened the sheet to see.
|
|
||||||
routeSection
|
|
||||||
|
|
||||||
Divider()
|
Text("LIVE STATE")
|
||||||
|
.font(FlightTheme.label())
|
||||||
|
.foregroundStyle(FlightTheme.textTertiary)
|
||||||
|
.tracking(1)
|
||||||
|
|
||||||
Text("LIVE STATE")
|
liveStateGrid
|
||||||
.font(FlightTheme.label())
|
|
||||||
.foregroundStyle(FlightTheme.textTertiary)
|
|
||||||
.tracking(1)
|
|
||||||
|
|
||||||
liveStateGrid
|
if recentFlights.count > 1 {
|
||||||
|
Text("RECENT FLIGHTS")
|
||||||
if recentFlights.count > 1 {
|
|
||||||
Text("RECENT FLIGHTS")
|
|
||||||
.font(FlightTheme.label())
|
|
||||||
.foregroundStyle(FlightTheme.textTertiary)
|
|
||||||
.tracking(1)
|
|
||||||
.padding(.top, 4)
|
|
||||||
|
|
||||||
ForEach(recentFlights.prefix(8), id: \.self) { flight in
|
|
||||||
recentFlightRow(flight)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Text("AIRCRAFT")
|
|
||||||
.font(FlightTheme.label())
|
.font(FlightTheme.label())
|
||||||
.foregroundStyle(FlightTheme.textTertiary)
|
.foregroundStyle(FlightTheme.textTertiary)
|
||||||
.tracking(1)
|
.tracking(1)
|
||||||
.padding(.top, 4)
|
.padding(.top, 4)
|
||||||
|
|
||||||
aircraftCard
|
ForEach(recentFlights.prefix(8), id: \.self) { flight in
|
||||||
|
recentFlightRow(flight)
|
||||||
if let photo = aircraftPhoto, let credit = photo.photographer {
|
|
||||||
photoCredit(name: credit, link: photo.detailLink)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.padding(16)
|
|
||||||
|
Text("AIRCRAFT")
|
||||||
|
.font(FlightTheme.label())
|
||||||
|
.foregroundStyle(FlightTheme.textTertiary)
|
||||||
|
.tracking(1)
|
||||||
|
.padding(.top, 4)
|
||||||
|
|
||||||
|
aircraftCard
|
||||||
}
|
}
|
||||||
|
.padding(16)
|
||||||
}
|
}
|
||||||
.background(FlightTheme.background.ignoresSafeArea())
|
.background(FlightTheme.background.ignoresSafeArea())
|
||||||
.toolbar {
|
.toolbar {
|
||||||
|
|||||||
Reference in New Issue
Block a user