From cbc34e1c8af7cc9b524b408f109939d9180ebe97 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sat, 13 Dec 2025 10:48:25 +0000 Subject: [PATCH] fix(ui): show bonjour masters inline --- .../Sources/Clawdis/GeneralSettings.swift | 8 +-- .../Sources/Clawdis/MasterDiscoveryMenu.swift | 50 +++++++++++++++++++ apps/macos/Sources/Clawdis/Onboarding.swift | 6 ++- 3 files changed, 59 insertions(+), 5 deletions(-) diff --git a/apps/macos/Sources/Clawdis/GeneralSettings.swift b/apps/macos/Sources/Clawdis/GeneralSettings.swift index 92821bfef..4a21e7435 100644 --- a/apps/macos/Sources/Clawdis/GeneralSettings.swift +++ b/apps/macos/Sources/Clawdis/GeneralSettings.swift @@ -125,9 +125,6 @@ struct GeneralSettings: View { TextField("user@host[:22]", text: self.$state.remoteTarget) .textFieldStyle(.roundedBorder) .frame(maxWidth: .infinity) - MasterDiscoveryMenu(discovery: self.masterDiscovery) { master in - self.applyDiscoveredMaster(master) - } Button { Task { await self.testRemote() } } label: { @@ -142,6 +139,11 @@ struct GeneralSettings: View { .trimmingCharacters(in: .whitespacesAndNewlines).isEmpty) } + MasterDiscoveryInlineList(discovery: self.masterDiscovery) { master in + self.applyDiscoveredMaster(master) + } + .padding(.leading, 58) + self.remoteStatusView .padding(.leading, 58) diff --git a/apps/macos/Sources/Clawdis/MasterDiscoveryMenu.swift b/apps/macos/Sources/Clawdis/MasterDiscoveryMenu.swift index 990abf21b..9a9b35c56 100644 --- a/apps/macos/Sources/Clawdis/MasterDiscoveryMenu.swift +++ b/apps/macos/Sources/Clawdis/MasterDiscoveryMenu.swift @@ -1,5 +1,55 @@ import SwiftUI +struct MasterDiscoveryInlineList: View { + @ObservedObject var discovery: MasterDiscoveryModel + var onSelect: (MasterDiscoveryModel.DiscoveredMaster) -> Void + + var body: some View { + VStack(alignment: .leading, spacing: 6) { + HStack(spacing: 6) { + Image(systemName: "dot.radiowaves.left.and.right") + .foregroundStyle(.secondary) + Text(self.discovery.statusText) + .font(.caption) + .foregroundStyle(.secondary) + Spacer() + } + + if self.discovery.masters.isEmpty { + Text("No masters found yet.") + .font(.caption) + .foregroundStyle(.secondary) + } else { + VStack(alignment: .leading, spacing: 6) { + ForEach(self.discovery.masters.prefix(6)) { master in + Button { + self.onSelect(master) + } label: { + HStack(spacing: 8) { + Text(master.displayName) + .lineLimit(1) + Spacer() + if let host = master.tailnetDns ?? master.lanHost { + Text(host) + .font(.caption2) + .foregroundStyle(.secondary) + .lineLimit(1) + } + } + } + .buttonStyle(.plain) + } + } + .padding(10) + .background( + RoundedRectangle(cornerRadius: 10, style: .continuous) + .fill(Color(NSColor.controlBackgroundColor))) + } + } + .help("Discover Clawdis masters on your LAN") + } +} + struct MasterDiscoveryMenu: View { @ObservedObject var discovery: MasterDiscoveryModel var onSelect: (MasterDiscoveryModel.DiscoveredMaster) -> Void diff --git a/apps/macos/Sources/Clawdis/Onboarding.swift b/apps/macos/Sources/Clawdis/Onboarding.swift index f1d147524..03d9570cf 100644 --- a/apps/macos/Sources/Clawdis/Onboarding.swift +++ b/apps/macos/Sources/Clawdis/Onboarding.swift @@ -154,13 +154,14 @@ struct OnboardingView: View { if self.state.connectionMode == .remote { VStack(alignment: .leading, spacing: 8) { LabeledContent("SSH target") { - HStack(spacing: 8) { + VStack(alignment: .leading, spacing: 8) { TextField("user@host[:22]", text: self.$state.remoteTarget) .textFieldStyle(.roundedBorder) .frame(width: 300) - MasterDiscoveryMenu(discovery: self.masterDiscovery) { master in + MasterDiscoveryInlineList(discovery: self.masterDiscovery) { master in self.applyDiscoveredMaster(master) } + .frame(width: 360) } } @@ -487,6 +488,7 @@ struct OnboardingView: View { .buttonStyle(.borderedProminent) } .padding(.horizontal, 20) + .padding(.bottom, 12) .frame(height: 60) }