krz/moonrise

Night-sky companion for iPhone, Apple Watch and Vision Pro: what's up tonight, the Moon, planets, launches and missions, and a Library of the solar system. SwiftUI app with a Cloudflare Workers backend. astronomy cloudflare-workers ios night-sky space swiftui visionos watchos

Commit 5a2ad3b532

5a2ad3b532064a634ad71638e0750b1357a17cea

parent: e9392d0a32

Unsigned

cmc <hello@cleberg.net> · 2026-10-19 05:40 UTC

Rockets to scale: no overlapping bases (!46)

The fins reach 0.35 × the body width past each side, so the widest rockets (SLS, N1, Saturn V, Starship) spilled past their 84 pt columns. Each column is now at least the silhouette's full width plus 14 pt.

Layout: unified · split

App/Sources/RocketLineup.swift +5 −3
@@ -70,20 +70,22 @@ struct RocketLineup: View {
70 let mine = r.id == highlight 70 let mine = r.id == highlight
71 let h = d.heightM! * scale 71 let h = d.heightM! * scale
72 let w = max((d.diameterM ?? 3) * scale, 4) 72 let w = max((d.diameterM ?? 3) * scale, 4)
73 // Fins reach 0.35 × width past each side, so wide rockets get a wider column.
74 let width = max(column, w * 1.7 + 14)
73 return VStack(spacing: 4) { 75 return VStack(spacing: 4) {
74 Text(String(format: "%.0f m", d.heightM!)).font(.caption2.monospacedDigit()).foregroundStyle(ink.opacity(0.7)) 76 Text(String(format: "%.0f m", d.heightM!)).font(.caption2.monospacedDigit()).foregroundStyle(ink.opacity(0.7))
75 .frame(height: top - 4) 77 .frame(height: top - 4)
76 RocketShape() 78 RocketShape()
77 .fill(mine ? accent : ink.opacity(0.75)) 79 .fill(mine ? accent : ink.opacity(0.75))
78 .frame(width: w, height: h) 80 .frame(width: w, height: h)
79 Rectangle().fill(ink.opacity(0.35)).frame(width: column, height: 0.5) 81 Rectangle().fill(ink.opacity(0.35)).frame(width: width, height: 0.5)
80 Text(r.title).font(.caption2.weight(mine ? .semibold : .regular)) 82 Text(r.title).font(.caption2.weight(mine ? .semibold : .regular))
81 .foregroundStyle(mine ? accent : ink.opacity(0.85)) 83 .foregroundStyle(mine ? accent : ink.opacity(0.85))
82 .multilineTextAlignment(.center) 84 .multilineTextAlignment(.center)
83 .lineLimit(2) 85 .lineLimit(2)
84 .frame(width: column - 6, height: bottom - 6, alignment: .top) 86 .frame(width: width - 6, height: bottom - 6, alignment: .top)
85 } 87 }
86 .frame(width: column) 88 .frame(width: width)
87 .contentShape(Rectangle()) 89 .contentShape(Rectangle())
88 .accessibilityElement(children: .ignore) 90 .accessibilityElement(children: .ignore)
89 .accessibilityLabel("\(r.title), \(Int(d.heightM!)) metres") 91 .accessibilityLabel("\(r.title), \(Int(d.heightM!)) metres")