- PRDetailView: guard let current = selectedTab ?? .overview fails because
?? already unwraps to non-optional. Use let current = selectedTab ?? .overview.
- MarkdownText: var inCodeBlock inside ViewBuilder is not allowed. Precompute
lines with their code-block state as a computed property on a private struct,
then iterate via ForEach in the builder. Bump to 3.3.
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.