The horizontal paging ScrollView squished the markdown text and the TabView
broke navigation. Revert to the plain vertical ScrollView + switch (always
rendered correctly). Swipe-to-change now lives on the bottom tab bar itself
(simultaneous DragGesture), so tapping tabs still works. Rewrite MarkdownText
line-based: each source line renders on its own line (AttributedString
collapses single newlines into spaces), with heading/bullet/code handling.
Bump to 3.3.
scrollPosition(id:) requires Binding<some Hashable?>, but selectedTab was a
non-optional DetailTab — the build failed with 'generic parameter some
Hashable could not be inferred'. Make selectedTab optional (DetailTab? =
.overview); bottom-bar == comparisons still work via optional promotion.
The TabView with .page style broke NavigationLink inside tabs (the page
gesture swallows taps) and centered content. Replace with a horizontal paging
ScrollView using containerRelativeFrame and scrollTargetBehavior(.paging):
same swipe-to-change behavior, no gesture conflicts, diff view works again.
Bump to 3.2.
- MergeSheet: show a spinner in the toolbar while the merge is confirming/
rejecting, lock Cancel and interactive dismissal during the request, and
prevent double-taps.
- PR detail: replace the ScrollView-switch with a page-style TabView so you
can swipe left/right to change sections (iOS 26 style); bottom bar taps
still select. Make DetailTab Hashable. Bump to 3.1.
On a successful merge, show a brief full-screen green checkmark animation
('Merged'), then automatically pop the PR detail view back to the landing
page. MergeSheet now calls an onSuccess callback; PRDetailView shows the
overlay and dismisses after ~1.2s. Bump to 3.0.
- Approve: rapid taps fired multiple submitReview calls that each appended a
review, stacking duplicate entries. Add a busy guard (skip while one is in
flight) and dedupe reviews per user so the latest replaces earlier ones;
disable the review menu while submitting.
- Bottom bar: replace the full-width bar with a floating frosted-glass pill
inset from the edges (like SideStore), with a highlighted capsule behind
the active tab. Bump to 2.9.
- Bottom tab bar: replace the floating capsule (which had space below it and
was too thin) with a full-width frosted-glass bar at the standard iOS tab
bar height, sitting flush above the home indicator — matching Apple Music.
- Landing page title: use .large navigation title so 'Pull Requests' aligns at
the top like Apple Music's 'Inicio', instead of the inline title.
- Bump to 2.5.
- Bottom tab bar: reduce vertical padding (8→4), icon size (20→18), and
bottom inset (8→4) so it matches Apple's standard compact tab bar height
(Apple Music etc.) instead of a tall bar.
- Remove the manual reload button from the loaded PR toolbar — the detail
view auto-loads on appearance, so it was redundant clutter. The reload
button is kept only on the error/retry state. Bump to 2.4.
- Merge button: use the proper SF Symbol 'arrow.triangle.merge' instead of
the download icon 'arrow.down.circle'.
- Add a Settings toggle 'Delete branch after merge'. When on, the merge call
passes delete_branch_after_merge=true and the head branch is deleted after
a successful merge (best-effort).
- PR detail bottom tab bar: floating capsule style (regularMaterial + shadow)
like the latest iOS tab bars, instead of a full-width bar.
- Bump to 2.0.
- Remove the Commits tab (not useful).
- Move the section switcher to a bottom tab bar with icons (Overview /
Conversation / Files / Checks) instead of a top segmented control.
- Move Review (menu) and Merge into the navigation toolbar, removing the
bottom action bar.
- Add an Overview tab that renders the PR body as markdown via SwiftUI's
built-in AttributedString(markdown:) (no third-party dependency).
- Bump to 1.9.
Multi-repo PR inbox, review (approve/request changes/comment), merge with
gating toggle, read-only diff viewer, and Gitea Actions check status with
one-tap re-run. Ships unsigned via the iMac runner to the SideStore source.