From 608e04fde014fd0bb8aff3bc2e41aa65f670a9b7 Mon Sep 17 00:00:00 2001 From: Andrew Blakeslee Moore Date: Sun, 5 Jul 2026 22:46:46 -0700 Subject: [PATCH 1/3] release(ios/canary): v0.2.0 (build 14) --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 9e37c72..c02e036 100644 --- a/VERSION +++ b/VERSION @@ -10,4 +10,4 @@ # NUCLEIC_MARKETING_VERSION semantic version -> CFBundleShortVersionString # NUCLEIC_BUILD_NUMBER monotonic build -> CFBundleVersion (always +1 per release) NUCLEIC_MARKETING_VERSION=0.2.0 -NUCLEIC_BUILD_NUMBER=13 +NUCLEIC_BUILD_NUMBER=14 From 2663ca747b2e9b640fed3dbeb22066ee13db71ab Mon Sep 17 00:00:00 2001 From: Andrew Blakeslee Moore Date: Sun, 5 Jul 2026 22:58:42 -0700 Subject: [PATCH 2/3] fixing ios thing --- NucleicRemote/NucleicRemote.xcodeproj/project.pbxproj | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/NucleicRemote/NucleicRemote.xcodeproj/project.pbxproj b/NucleicRemote/NucleicRemote.xcodeproj/project.pbxproj index c6c10e9..db9ea3e 100644 --- a/NucleicRemote/NucleicRemote.xcodeproj/project.pbxproj +++ b/NucleicRemote/NucleicRemote.xcodeproj/project.pbxproj @@ -8,8 +8,8 @@ /* Begin PBXBuildFile section */ BF00000000000000000001 /* NucleicProtocol in Frameworks */ = {isa = PBXBuildFile; productRef = PD00000000000000000001 /* NucleicProtocol */; }; - BF00000000000000000003 /* NucleicTailnet in Frameworks */ = {isa = PBXBuildFile; productRef = PD00000000000000000002 /* NucleicTailnet */; }; BF00000000000000000002 /* NucleicRemoteWidgets.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = FR00000000000000000002 /* NucleicRemoteWidgets.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + BF00000000000000000003 /* NucleicTailnet in Frameworks */ = {isa = PBXBuildFile; productRef = PD00000000000000000002 /* NucleicTailnet */; }; E7D43FF12FF0806800BF2407 /* app-logo-file.icon in Resources */ = {isa = PBXBuildFile; fileRef = E7D43FF02FF0806800BF2407 /* app-logo-file.icon */; }; E7D43FF12FF0806800BF2408 /* app-logo-canary.icon in Resources */ = {isa = PBXBuildFile; fileRef = E7D43FF02FF0806800BF2408 /* app-logo-canary.icon */; }; E7D43FF12FF0806800BF2409 /* app-logo-beta.icon in Resources */ = {isa = PBXBuildFile; fileRef = E7D43FF02FF0806800BF2409 /* app-logo-beta.icon */; }; @@ -331,8 +331,6 @@ CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = L7UDTQ6F5W; ENABLE_PREVIEWS = YES; - // The "Stamp git commit into Info.plist" phase shells out to git and rewrites the - // built Info.plist, both of which script sandboxing would block. ENABLE_USER_SCRIPT_SANDBOXING = NO; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = NucleicRemote/Info.plist; @@ -343,8 +341,6 @@ INFOPLIST_KEY_UILaunchScreen_Generation = YES; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - INFOPLIST_KEY_CFBundleDisplayName = "Nucleic$(NUCLEIC_NAME_SUFFIX)"; - NUCLEIC_NAME_SUFFIX = ""; IPHONEOS_DEPLOYMENT_TARGET = 18.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -378,8 +374,6 @@ CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = L7UDTQ6F5W; ENABLE_PREVIEWS = YES; - // The "Stamp git commit into Info.plist" phase shells out to git and rewrites the - // built Info.plist, both of which script sandboxing would block. ENABLE_USER_SCRIPT_SANDBOXING = NO; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = NucleicRemote/Info.plist; @@ -390,8 +384,6 @@ INFOPLIST_KEY_UILaunchScreen_Generation = YES; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - INFOPLIST_KEY_CFBundleDisplayName = "Nucleic$(NUCLEIC_NAME_SUFFIX)"; - NUCLEIC_NAME_SUFFIX = ""; IPHONEOS_DEPLOYMENT_TARGET = 18.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", From 33ea7688c4f978d8494922a5394744f4aabed17c Mon Sep 17 00:00:00 2001 From: Andrew Blakeslee Moore Date: Sun, 5 Jul 2026 23:17:23 -0700 Subject: [PATCH 3/3] nvrsion: Add: Remove Home Header padding and fix archive button vertical alignment in SessionsView. Nucleic-Promote: 1 Co-authored-by: Nucleic --- .../NucleicRemote/Views/HomeView.swift | 5 +++ .../NucleicRemote/Views/SessionsView.swift | 40 ++++++++++++++----- 2 files changed, 35 insertions(+), 10 deletions(-) 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 }