Fix tvOS legacy import rows acting as a single Remove button

On tvOS a Form row is one focusable unit, so the legacy account/source
cards - header, credential fields, and both buttons stacked in a single
row - focused as a whole and every click fired the first button (Remove),
making credentials and Import unreachable.

- Split the tvOS rows into individually focusable rows (info header,
  fields, Import, Remove), keeping the card layout on iOS/macOS
- Wrap the tvOS entry points in TVSidebarDetailContainer and drop the
  tvOS navigationTitle that rendered as a ghost behind the form
- Present the review screen from the first-launch alert as a
  fullScreenCover on tvOS: sheets render as a small transparent card
  that cannot fit the sidebar layout (Menu button dismisses the cover)
- Dim disabled TVSettingsButtonStyle buttons
- Widen the row icon frame for tvOS glyph sizes and skip the caption
  when it would repeat the host shown as the title
This commit is contained in:
Arkadiusz Fal
2026-07-19 19:23:36 +02:00
parent 9c97036684
commit 283c2cb9cb
4 changed files with 136 additions and 35 deletions

View File

@@ -184,6 +184,22 @@ struct YatteeApp: App {
.appEnvironment(appEnvironment)
}
#endif
#if os(tvOS)
// tvOS sheets render as a small centered card that cannot fit
// the sidebar-detail layout use a full screen cover instead.
.fullScreenCover(isPresented: $showingLegacyAccountsImport) {
NavigationStack {
TVSidebarDetailContainer(
systemImage: "person.badge.key",
title: String(localized: "migration.accounts.title")
) {
LegacyAccountsImportView()
}
.appEnvironment(appEnvironment)
}
.background(Color.black.ignoresSafeArea())
}
#else
.sheet(isPresented: $showingLegacyAccountsImport) {
NavigationStack {
LegacyAccountsImportView()
@@ -193,6 +209,7 @@ struct YatteeApp: App {
.frame(minWidth: 560, minHeight: 560)
#endif
}
#endif
#if os(iOS)
.sheet(isPresented: $showingSettings) {
SettingsView()