macOS: stabilize context menu card layout

This commit is contained in:
Peter Steinberger
2025-12-13 03:52:09 +00:00
parent 772b5fdf0f
commit 36ff508fec
2 changed files with 24 additions and 13 deletions

View File

@@ -6,7 +6,10 @@ struct ContextMenuCardView: View {
private let rows: [SessionRow] private let rows: [SessionRow]
private let statusText: String? private let statusText: String?
private let isLoading: Bool private let isLoading: Bool
private let padding: CGFloat = 10 private let paddingTop: CGFloat = 6
private let paddingBottom: CGFloat = 6
private let paddingTrailing: CGFloat = 16
private let paddingLeading: CGFloat = 22
private let barHeight: CGFloat = 3 private let barHeight: CGFloat = 3
init( init(
@@ -20,7 +23,7 @@ struct ContextMenuCardView: View {
} }
var body: some View { var body: some View {
VStack(alignment: .leading, spacing: 8) { VStack(alignment: .leading, spacing: 6) {
HStack(alignment: .firstTextBaseline) { HStack(alignment: .firstTextBaseline) {
Text("Context") Text("Context")
.font(.caption.weight(.semibold)) .font(.caption.weight(.semibold))
@@ -53,7 +56,10 @@ struct ContextMenuCardView: View {
} }
} }
} }
.padding(self.padding) .padding(.top, self.paddingTop)
.padding(.bottom, self.paddingBottom)
.padding(.leading, self.paddingLeading)
.padding(.trailing, self.paddingTrailing)
.frame(minWidth: 300, maxWidth: .infinity, alignment: .leading) .frame(minWidth: 300, maxWidth: .infinity, alignment: .leading)
.transaction { txn in txn.animation = nil } .transaction { txn in txn.animation = nil }
} }

View File

@@ -70,8 +70,9 @@ final class MenuContextCardInjector: NSObject, NSMenuDelegate {
self.adoptMenuWidthIfAvailable(for: menu, hosting: hosting) self.adoptMenuWidthIfAvailable(for: menu, hosting: hosting)
} }
if initialIsLoading {
self.loadTask = Task { [weak hosting] in self.loadTask = Task { [weak hosting] in
await self.refreshCache(force: initialIsLoading) await self.refreshCache(force: true)
guard let hosting else { return } guard let hosting else { return }
let view = self.cachedView() let view = self.cachedView()
await MainActor.run { await MainActor.run {
@@ -82,6 +83,10 @@ final class MenuContextCardInjector: NSObject, NSMenuDelegate {
hosting.frame.size.height = size.height hosting.frame.size.height = size.height
} }
} }
} else {
// Keep the menu stable while it's open; refresh in the background for next open.
self.loadTask = Task { await self.refreshCache(force: false) }
}
} }
func menuDidClose(_ menu: NSMenu) { func menuDidClose(_ menu: NSMenu) {