diff --git a/NucleicRemote/NucleicRemote/Views/Composer.swift b/NucleicRemote/NucleicRemote/Views/Composer.swift index 0e8da3f..7bd501a 100644 --- a/NucleicRemote/NucleicRemote/Views/Composer.swift +++ b/NucleicRemote/NucleicRemote/Views/Composer.swift @@ -16,7 +16,6 @@ struct StartChatComposer: View { @State private var auto = false @State private var model: String? @State private var effort = MobileEfforts.fallback - @FocusState private var draftFocused: Bool // Advanced options (the Mac new-session sheet's base branch + worktree fields). @State private var showOptions = false @State private var baseBranch = "" @@ -86,15 +85,14 @@ struct StartChatComposer: View { .transition(.move(edge: .top).combined(with: .opacity)) } HStack(alignment: .bottom, spacing: 8) { - // Plain, borderless field over the glass — matching the open session's chat bar - // rather than a boxed form control. + // Plain, borderless field — matching the open session's chat bar rather than a + // boxed form control. TextField("Describe a task…", text: $draft, axis: .vertical) .textFieldStyle(.plain) .lineLimit(1...5) .padding(.vertical, 3) .orchestraGlow(active: MobileEfforts.isOrchestra(effort) && controlled) .keyboardDismissable() - .focused($draftFocused) Button { if let project = selected { let branch = baseBranch.trimmingCharacters(in: .whitespaces) @@ -115,9 +113,8 @@ struct StartChatComposer: View { Text("This device is view-only.").font(.caption2).foregroundStyle(.secondary) } } - .padding(.horizontal, 14) - .padding(.vertical, 12) - .glassSurface(cornerRadius: 26) + // No surface of its own — the controls sit directly on the sheet, which is already a + // distinct panel; a glass card here would just be a card-on-card. // Switching to a model with a lower effort cap can't leave an unsupported level selected. .onChange(of: model) { _, newModel in let levels = store.modelCatalog.offeredEfforts(forModel: newModel) diff --git a/NucleicRemote/NucleicRemote/Views/HomeView.swift b/NucleicRemote/NucleicRemote/Views/HomeView.swift index b9b4487..3d8444b 100644 --- a/NucleicRemote/NucleicRemote/Views/HomeView.swift +++ b/NucleicRemote/NucleicRemote/Views/HomeView.swift @@ -106,13 +106,14 @@ struct HomeView: View { .navigationBarTitleDisplayMode(.inline) .scrollDismissesKeyboard(.interactively) .refreshable { store.refreshSessions() } - // A floating "+" replaces the old inline start-chat card; opens the glass composer - // sheet. An iPad ⌘N (via focusNewChat) opens the same sheet. - .newChatAffordance(isPresented: $showNewChat) .onChange(of: focusNewChat.wrappedValue) { _, want in if want { showNewChat = true; focusNewChat.wrappedValue = false } } .safeAreaInset(edge: .bottom) { ConnectionChip().padding(.bottom, 8) } + // A floating "+" replaces the old inline start-chat card; opens the glass composer + // sheet. An iPad ⌘N (via focusNewChat) opens the same sheet. Applied after the chip + // inset so it anchors to the true bottom — matching the project page's tight spacing. + .newChatAffordance(isPresented: $showNewChat) } } diff --git a/NucleicRemote/NucleicRemote/Views/SessionsView.swift b/NucleicRemote/NucleicRemote/Views/SessionsView.swift index d6c9449..f7dbe04 100644 --- a/NucleicRemote/NucleicRemote/Views/SessionsView.swift +++ b/NucleicRemote/NucleicRemote/Views/SessionsView.swift @@ -85,11 +85,12 @@ struct SessionsView: View { } } } + .safeAreaInset(edge: .bottom) { ConnectionChip().padding(.bottom, 8) } // A floating "new chat" affordance in the lower-right, mirroring the Mac's per-project // "New chat" button. Picks a project + prompt in a glass sheet, then kicks off the chat. - // Applied before the chip inset so it floats clear above the connection chip. + // Applied after the chip inset so it anchors to the true bottom — the same low spacing + // above the tab bar the project page has, rather than floating high above the chip. .newChatAffordance(isPresented: $showNewChat) - .safeAreaInset(edge: .bottom) { ConnectionChip().padding(.bottom, 8) } } }