Trey T 5c1d7871c6 Flight detail: bearing-aware icons + auto type lookup
Icons:
- Route card's central airplane and the two map markers now rotate
  by the actual dep→arr compass bearing instead of a hardcoded -45°.
  DAL→SAN (westbound) shows planes pointing left; LAS→DAL (eastbound)
  points right; DAL→HOU (south) points down. New
  HistoryDetailView.bearing(from:to:) computes great-circle bearing;
  rotation is (bearing - 45) since SF's airplane glyph naturally
  sits at ~45°.
- Replaced the FlightRouteMap's `Marker(systemImage:)` for departure
  and arrival with custom `Annotation` views (routeMarker helper)
  that wrap an SF airplane.departure/arrival glyph in a tinted
  circle and rotate the icon by the same bearing.

Aircraft data lookup:
- HistoryDetailView now auto-enriches the missing aircraftType on
  .task via the same two-step chain the bulk Aircraft Stats button
  uses: route-explorer first, FlightAware activity-log fallback,
  normalized through AircraftDatabase.normalizedICAO before saving.
- Aircraft card's Type cell now shows the friendly name when
  available — "B738 · Boeing 737-800" instead of just "B738".
- When neither registration nor icao24 is set (typical for CSV-
  imported historical flights), the card shows an honest one-line
  caption explaining why tail / first-flight / ICAO24 are blank
  and what populates them.

Honest about what we can't get:
- Tested OpenSky /flights/departure (anonymous tier blocks
  historical, 403 "You cannot access historical flights"),
  FlightAware /history/<date>/<time>Z/... (needs exact UTC
  scheduled departure time we don't have for CSV rows), JetPhotos
  and Planespotters flight search (Cloudflare-gated). For
  historical Southwest flights from a PNR-style CSV, the most we
  can pull for free is the typical aircraft type for that flight
  number from FlightAware's activity log — which we now do
  automatically when the detail view appears.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-31 13:13:50 -05:00
2026-04-08 15:01:07 -05:00
2026-04-08 15:01:07 -05:00
S
Description
No description provided
9.7 MiB
Languages
Swift 57.9%
HTML 33.9%
JavaScript 4.5%
Python 3.5%
Shell 0.2%