Defer NavigationStack path updates until after the practice tab is active so SwiftUI does not trap in boundPathChange.
Co-authored-by: Cursor <cursoragent@cursor.com>
Keep full quizzes for 1984 and Spalovač mrtvol; other titles get catalog metadata stubs across Swift, GTK, and content.json.
Co-authored-by: Cursor <cursoragent@cursor.com>
CI stopped publishing when the iOS job outgrew the macos-14 Xcode, so
the builds branch froze; the iOS job now runs on macos-26 and publish
keeps the previous package for any platform that failed, with
VERSION-<platform> markers naming the commit each package came from.
APKs are signed with a committed sideload key instead of the runner's
random debug key, so Android accepts them as updates, and the version
code grows with every CI run. The updater explains the unknown-sources
step, keeps the Update button after errors and checks the download is
this app.
Co-authored-by: Cursor <cursoragent@cursor.com>
The build script now extracts content.json into derived data and copies
it into the app bundle, so no generated file is referenced from the
project or written into the repository. Signing is explicit: ad hoc for
the simulator, automatic with your own team for a device.
Co-authored-by: Cursor <cursoragent@cursor.com>
Android moves to Material 3 (navigation bar, app bars, list items,
bottom sheets, pager) with a real back stack. iOS hides the tab bar in
exercises so the bottom action is reachable, aligns content, and uses
system colours so themes and dark mode work. Both pick a readable
accent tint. Desktop keeps the VLSM table inside the window and gives
statistics the same header rhythm as other pages.
Co-authored-by: Cursor <cursoragent@cursor.com>