Commit Graph

7 Commits

Author SHA1 Message Date
rzen 541aa3d52c Show full playoff bracket, mark series results, harden API decoding
Playoffs:
- List every round played so far (Round 1 → current) instead of only the
  current round, on both macOS menu and iPhone
- Strike through the eliminated team's tricode in a finished series and drop
  the now-redundant "(Final … wins)" tag on completed earlier rounds
- Refetch the bracket when a finished game implies more completed games than
  the cached bracket records, so the series score and round no longer get
  stuck on stale data after cold launch or the NHL bracket endpoint's lag

API robustness:
- Tolerate optional gameCenterLink/startTimeUTC on TBD playoff matchups so the
  scoreboard decode no longer aborts
- Reject API state regressions via a monotonic FUT→…→OFF progression rank so a
  brief glitch can't downgrade a finished game back to "-:-"
2026-05-30 08:21:28 -04:00
rzen 8df88e10d6 Tighten game score format to "2:3" / "-:-"
Drop the spaces around the colon. Score field is still monospaced so
the home logo lines up across rows; the tighter format reads more
like a hockey score and frees up some horizontal slack on narrow
widths.
2026-04-25 15:32:29 -04:00
rzen e06abd491f Use fully monospaced score field and tone series score down to secondary
Switch the score Text from .monospacedDigit() to .monospaced() so the
dash in the "- : -" pre-game placeholder takes the same character cell
as a digit — home logos now line up across upcoming and finished games.

Series scores keep the dash (it reads as series progress, not a goal
total) but match game scores in secondary color so they sit visually
behind the tricodes.
2026-04-25 15:30:17 -04:00
rzen 52ebfc1a6b Use colon score format and placeholder for upcoming game rows
Game rows now render scores as "2 : 3" (with spaces) in secondary
color so they read as data, not as part of the team-name run.
Pre-game rows show "- : -" in the same slot so tricode columns line
up regardless of whether the game has started — only two-digit scores
push the layout, which doesn't happen in NHL play.
2026-04-25 15:26:25 -04:00
rzen f6785321f4 Enlarge logos, tricodes, and inline scores on iPhone rows
Game and series rows now lead with a 40pt logo + title3-monospaced
tricode + bold inline score + tricode + logo, so the matchup fills
the row's vertical space and reads at a glance. For future games the
score is replaced by an "@" separator. Right-side metadata (game number,
status, kickoff time) stays at subheadline/caption2 so it's secondary.

Tricodes and scores get .lineLimit(1).fixedSize() to keep everything
on one line on tighter widths.
2026-04-25 15:19:14 -04:00
rzen 506bea04cc Add team logos and monospaced tricodes to iPhone game/series rows
New TeamLogo view loads bundled TeamLogos/{abbrev}.png with a UIImage
cache so scrolling doesn't repeatedly re-decode. GameRow and SeriesRow
now render [logo] TRI @ [logo] TRI with tricodes in a monospaced font
so columns line up regardless of which letters are present. SF Symbol
fallback when an abbrev has no bundled logo (e.g. "TBD" for unfilled
playoff slots).
2026-04-25 15:14:20 -04:00
rzen aaffa3771c Add iPhone target with shared data layer and persistent cache
Two-target restructure: shared sources (models, services, settings,
extensions, team logos) move into Shared/, consumed by both the
existing macOS menu bar app and a new iOS app. MainService no longer
imports AppKit — platform code attaches via a MainServiceObserver
protocol (MacObserverAdapter wires back to MenuManager / StatusItemManager
/ NotificationManager).

iPhone app is a single SwiftUI page mirroring the macOS menu (playoff
round + yesterday/today/tomorrow), with a gear-icon settings sheet
(display option + IndieAbout for license/changelog). Persistent JSON
snapshot in Application Support paints last-known data on cold launch;
"Updated …" header escalates secondary → orange (>5min) → red (>30min)
so staleness is visually unmistakable. Foreground polling, scenePhase
refresh, and pull-to-refresh; no notifications on iOS in v1.
2026-04-25 06:34:36 -04:00