diff --git a/Packages/VNCUI/Sources/VNCUI/Session/SessionView.swift b/Packages/VNCUI/Sources/VNCUI/Session/SessionView.swift index b61fa1b..f62f83c 100644 --- a/Packages/VNCUI/Sources/VNCUI/Session/SessionView.swift +++ b/Packages/VNCUI/Sources/VNCUI/Session/SessionView.swift @@ -66,6 +66,13 @@ public struct SessionView: View { overlayChrome(controller: controller) .transition(.opacity.combined(with: .move(edge: .top))) } + + // Persistent pull-tab so the chrome is always reachable + // (three-finger tap is the power-user shortcut). + VStack { + chromeToggleHandle + Spacer() + } } else { ProgressView("Preparing session…") .tint(.white) @@ -95,6 +102,24 @@ public struct SessionView: View { } } + private var chromeToggleHandle: some View { + Button { + withAnimation(.snappy(duration: 0.22)) { + chromeVisible.toggle() + } + } label: { + Image(systemName: chromeVisible ? "chevron.up" : "chevron.down") + .font(.caption.weight(.bold)) + .foregroundStyle(.white) + .frame(width: 44, height: 20) + .contentShape(Rectangle()) + } + .buttonStyle(.plain) + .glassSurface(in: Capsule()) + .accessibilityLabel(chromeVisible ? "Hide toolbar" : "Show toolbar") + .padding(.top, chromeVisible ? 4 : 2) + } + @ViewBuilder private func overlayChrome(controller: SessionController) -> some View { VStack(spacing: 8) {