From 191bb95417061a1a15bc367e202a8fab6c8e2c1a Mon Sep 17 00:00:00 2001 From: Kaede Akino Date: Sun, 30 Aug 2026 13:03:52 +0800 Subject: [PATCH] Fix Transfers list height --- Termind/Design/DesignTokens.swift | 5 +++++ Termind/Features/StatusBar/StatusBarView.swift | 13 ++++++++----- TermindTests/ListViewMigrationTests.swift | 8 ++++++++ 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/Termind/Design/DesignTokens.swift b/Termind/Design/DesignTokens.swift index eb039598..482bb0d1 100644 --- a/Termind/Design/DesignTokens.swift +++ b/Termind/Design/DesignTokens.swift @@ -262,7 +262,12 @@ nonisolated enum Metrics { enum TransferCenter { static let width: CGFloat = 360 + static let estimatedRowHeight: CGFloat = 92 static let maxListHeight: CGFloat = 420 + + static func listHeight(itemCount: Int) -> CGFloat { + min(maxListHeight, CGFloat(max(0, itemCount)) * estimatedRowHeight) + } } enum VaultContent { diff --git a/Termind/Features/StatusBar/StatusBarView.swift b/Termind/Features/StatusBar/StatusBarView.swift index 8686c4d2..f0b66b7b 100644 --- a/Termind/Features/StatusBar/StatusBarView.swift +++ b/Termind/Features/StatusBar/StatusBarView.swift @@ -497,7 +497,7 @@ private struct TransferCenterPopover: View { if item.id != transferItems.last?.id { Divider() } } } - .frame(maxHeight: Metrics.TransferCenter.maxListHeight) + .frame(height: Metrics.TransferCenter.listHeight(itemCount: transferItems.count)) } .frame(width: Metrics.TransferCenter.width) } @@ -583,12 +583,13 @@ private struct TransferCenterNativeList: NSViewRepresentable { func makeListView() -> NSViewType { let listView = NSViewType() listView.rowAnimator = ListBouncyAnimator(style: .regular) - listView.estimatedRowHeight = 92 + listView.estimatedRowHeight = Metrics.TransferCenter.estimatedRowHeight listView.rows { ListRow(HostingListRow.self) - .estimatedHeight(92) + .estimatedHeight(Metrics.TransferCenter.estimatedRowHeight) .height { [weak self] item, context in - self?.height(for: item, width: context.width) ?? 92 + self?.height(for: item, width: context.width) + ?? Metrics.TransferCenter.estimatedRowHeight } .configure { [weak self] row, item, _ in self?.configure(row, item: item) } } @@ -606,7 +607,9 @@ private struct TransferCenterNativeList: NSViewRepresentable { } private func height(for item: TransferCenterListItem, width: CGFloat) -> CGFloat { - guard width > 0, let root = content.rootView(for: item) else { return 92 } + guard width > 0, let root = content.rootView(for: item) else { + return Metrics.TransferCenter.estimatedRowHeight + } measurement.rootView = root return ceil(measurement.sizeThatFits(in: CGSize( width: width, height: .greatestFiniteMagnitude diff --git a/TermindTests/ListViewMigrationTests.swift b/TermindTests/ListViewMigrationTests.swift index 82591b56..54c33df2 100644 --- a/TermindTests/ListViewMigrationTests.swift +++ b/TermindTests/ListViewMigrationTests.swift @@ -120,6 +120,14 @@ struct ListViewMigrationTests { #expect(first.token != second.token) } + @Test + func transferCenterListHeightGrowsAndStopsAtItsScrollCap() { + #expect(Metrics.TransferCenter.listHeight(itemCount: 1) == 92) + #expect(Metrics.TransferCenter.listHeight(itemCount: 3) == 276) + #expect(Metrics.TransferCenter.listHeight(itemCount: 5) == 420) + #expect(Metrics.TransferCenter.listHeight(itemCount: 20) == 420) + } + @Test func settingsSelectionChangesContentWithoutChangingIdentity() { let normal = SettingsNavigationItem.section(.sftp, selected: false)