diff --git a/NucleicRemote/NucleicRemote/Views/HomeView.swift b/NucleicRemote/NucleicRemote/Views/HomeView.swift index f43f954..1c79eee 100644 --- a/NucleicRemote/NucleicRemote/Views/HomeView.swift +++ b/NucleicRemote/NucleicRemote/Views/HomeView.swift @@ -99,6 +99,11 @@ struct HomeView: View { QuickTodos() } .padding() + // The greeting stands in for the page's large title (same 34pt bold font), so + // reserve the large-title band above it. Without the system `.navigationTitle`, + // the bar collapses and the greeting would otherwise ride ~52pt higher than the + // large titles on the other tabs (Sessions/Projects/Settings). + .padding(.top, 52) // Cap + center the dashboard on a wide iPad so it reads like the Mac home rather // than a stretched phone; a no-op at phone width. .readableColumn() diff --git a/NucleicRemote/NucleicRemote/Views/SessionsView.swift b/NucleicRemote/NucleicRemote/Views/SessionsView.swift index 172578c..71d0d9e 100644 --- a/NucleicRemote/NucleicRemote/Views/SessionsView.swift +++ b/NucleicRemote/NucleicRemote/Views/SessionsView.swift @@ -79,7 +79,12 @@ struct SessionsView: View { .compactTabBarInset() } } - .navigationTitle("Sessions") + // The title is rendered as content (`sessionsHeader`) rather than a system + // `.navigationTitle`, so the archive toggle can sit on the same row, centered with it + // (a system toolbar item can only ride in the compact bar, floating above a large + // title). The empty inline bar keeps the top band matching the Home dashboard. + .navigationBarTitleDisplayMode(.inline) + .safeAreaInset(edge: .top, spacing: 0) { sessionsHeader } .navigationDestination(for: SessionID.self) { id in SessionDetailView(sessionID: id) } @@ -102,18 +107,33 @@ struct SessionsView: View { .onChange(of: path) { _, newPath in store.compactDetailPresented = !newPath.isEmpty } - .toolbar { - ToolbarItem(placement: .topBarTrailing) { - Button { - showArchived.toggle() - } label: { - Image(systemName: showArchived ? "archivebox.fill" : "archivebox") - } - } - } } } + /// The page's large title as content, so the archive toggle can share its row (vertically + /// centered with the title) instead of floating in the compact bar above it. Mirrors the Home + /// dashboard's greeting header — same large-title font and top band — for a consistent look. + private var sessionsHeader: some View { + HStack { + Text("Sessions").font(.largeTitle.bold()) + Spacer() + Button { + showArchived.toggle() + } label: { + Image(systemName: showArchived ? "archivebox.fill" : "archivebox") + .font(.title3) + } + .foregroundStyle(Palette.accent) + .accessibilityLabel(showArchived ? "Hide archived sessions" : "Show archived sessions") + } + .padding(.horizontal) + .padding(.top, 52) + .padding(.bottom, 8) + .frame(maxWidth: .infinity) + // Cover the list rows that scroll up behind the pinned header. + .background(Color(.systemGroupedBackground)) + } + /// Push the session a notification tap asked for, then clear the request. private func consumeRoute() { guard let route = store.pendingRoute else { return }