Restore vertical scroll + line-based markdown; swipe on bottom bar; bump to 3.3
Build iOS App / Build .ipa and publish source (push) Failing after 16s

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.
This commit is contained in:
Hermes committed 2026-08-14 09:43:39 +00:00
1 parent 221d23a6a3
commit dd0fc84238
3 files changed
+78 -30

No files matched your search

+24 -24
View File
@@ -103,32 +103,17 @@ struct PRDetailView: View {
VStack(spacing: 0) {
header(pr)
// Horizontal paging ScrollView — swipeable like a TabView, but
// without breaking NavigationLink inside the tabs (TabView's .page
// style swallows taps and interferes with nested navigation).
ScrollView(.horizontal, showsIndicators: false) {
HStack(spacing: 0) {
OverviewTab(pr: pr)
.id(DetailTab.overview)
.containerRelativeFrame(.horizontal)
ConversationTab(vm: vm)
.id(DetailTab.conversation)
.containerRelativeFrame(.horizontal)
FilesTab(vm: vm)
.id(DetailTab.files)
.containerRelativeFrame(.horizontal)
ChecksTab(vm: vm, onRerun: { showRerunConfirm = $0 })
.id(DetailTab.checks)
.containerRelativeFrame(.horizontal)
// Vertical scroll — has always rendered correctly (a horizontal
// ScrollView/TabView broke NavigationLink and mangled markdown).
ScrollView {
switch selectedTab {
case .overview: OverviewTab(pr: pr)
case .conversation: ConversationTab(vm: vm)
case .files: FilesTab(vm: vm)
case .checks: ChecksTab(vm: vm, onRerun: { showRerunConfirm = $0 })
case .none: OverviewTab(pr: pr)
}
.scrollTargetLayout()
}
.scrollTargetBehavior(.paging)
.scrollPosition(id: $selectedTab)
.ignoresSafeArea(edges: .bottom)
bottomTabBar
}
@@ -204,6 +189,21 @@ struct PRDetailView: View {
)
.padding(.horizontal, 20)
.padding(.bottom, 8)
// Swipe across the bar to change sections (iOS 26 feel). Taps on the
// individual tab buttons still work — simultaneous gesture.
.simultaneousGesture(
DragGesture(minimumDistance: 20)
.onEnded { value in
let tabs = DetailTab.allCases
guard let current = selectedTab ?? .overview,
let idx = tabs.firstIndex(of: current) else { return }
if value.translation.width < -40, idx < tabs.count - 1 {
withAnimation { selectedTab = tabs[idx + 1] }
} else if value.translation.width > 40, idx > 0 {
withAnimation { selectedTab = tabs[idx - 1] }
}
}
)
}
private var reviewMenu: some View {