This change adds proper singular/plural labels for minutes and hours in the lateness display, fixes green status text contrast for dark mode, and updates the README to credit the Amtrak.js models used as a base.
- Added a StationStatus "presence" property to TrainStatusRow and display it as a new (unnamed) TableColumn in ContentView (using presence.rawValue).
- Populated presence from leg?.status.
- Bumped app version to 0.2.103 in Bundler.toml and add a 0.2.103 entry to changelog noting the new column.
- Added localTime(timeZone:) and updateTime(timeZone:) to AmtrakDateFormatting to format the current time for a given timezone.
- In ContentView, make AmtrakDateFormatting is now a shared property with localTimeZone being used at the bottom to show "It is <time> at <station> station".
- trainStatus now saves the station name and timezone (avoiding repeated formatter instantiation) and isOnTime uses the shared formatter.
Updated the app bundle identifier and version for the 0.2.101 release, refreshed the README link to SwiftCrossUI, and added a changelog documenting the rewrite and previous release history.
These changes ensure displayed times respect the station's timezone. Something I mistakenly overlooked when creating this.
Luckily, my screenshot with Ashland isn't affected by this change.
Admittedly, I don't know. Haven't checked how low Swift can go in a hot minute.
Just gonna assume Swift targets the latest and greatest version of Windows because Microsoft says so.
Green status rows used white text, which was difficult to read against the green background. This change selects a contrasting text color based on the status color so green rows use black text and other statuses keep white text for better legibility in the status table.
- Introduced TrainLateness enum to represent on-time, early, late (with minutes), and unknown states, including description text, color, and formatting logic.
- Replaced TrainStatusRow.status String with TrainLateness and update ContentView to render a colored status pill and to return TrainLateness from isOnTime.
- Convert AmtrakDateFormatting API from static to instance properties/methods and added parsedDate(from:) to return Date.
- Update time(from:) and date(from:) to instance methods. Improve isOnTime logic to compute actual vs scheduled differences (minutes/hours) and report early/late/on-time.
- Updated ContentView to create an AmtrakDateFormatting instance and use the new API. Remove the Train.serviceDate extension.
- This update adds ISO date/time helpers for Amtrak timestamps, refactors the train table to show arrival time, status, and track details, and tracks the current station context in the UI.
- It also hardens station status decoding with a safe fallback to Unknown and simplifies the row model to match the new display.
Added richer station metadata and status handling to match the Amtrak API payload. This commit introduces new station fields for name, timezone, schedule/actual timings, platform, and status, along with extra train row properties for origin and arrival/departure details used by the UI.
- Went with the popular Virtual Railfan ones first.
- Moved the error message to its own dedicated space so it doesn't pop up out of nowhere
- Fixed a few typos
- Replace the placeholder window content with ContentView and implement a basic station lookup UI.
- Added a station code TextField, Refresh button that triggers an async load, loading indicator, and error message display. Introduces a Table for TrainStatusRow with columns for number, route, on-time and platform.
- Started plumbing for row population (work in progress).
- Also tweaked window title and fixes station comment (Ashland).
- Updated package.json with project metadata and moves dependencies to devDependencies.
- Adds .editorconfig for consistent code style
- Updated VSCode and .NET project settings for improved development workflow.
- Now possible to click links that launch the browser from the backend
- Version scheme change to account for different methods with desktop applications
- All functionality has been modularized to their new respective components (I love Blazor)
- Minor versions are now in the triple digits, patches are in the double digits
Now that each button is based on one component that contains the necessary functionality, instead of the previous mess, there is a slight performance increase