feat(apple): type-safe SF Symbols via SFSafeSymbols

Replaces every stringly-typed SF Symbol name with a compile-time-checked
SFSymbol case, mirroring the L10n accessor approach. A mistyped or
OS-unavailable symbol is now a build error instead of a silently blank
glyph at runtime.

Adds the SFSafeSymbols SPM package (project.yml) and migrates all call
sites: Image(systemName:)/Label(systemImage:) -> systemSymbol, and the
five symbol-carrying view properties (AppDestination.systemSymbol,
SettingsRow.icon, AboutPoint.symbol, MethodRow.icon, PolicyOption.icon)
flipped from String to SFSymbol end to end.
This commit is contained in:
2026-07-23 17:40:07 +02:00
parent ef42875ddb
commit 1563bf80d6
12 changed files with 74 additions and 59 deletions

View File

@@ -1,4 +1,5 @@
import SwiftUI
import SFSafeSymbols
import CoreImage.CIFilterBuiltins
/// Transfer details + drawer panels, ported from `feature/send/TransferDetails.kt`.
@@ -56,7 +57,7 @@ struct TransferDetailsView: View {
Button(role: .destructive) {
showStopConfirmation = true
} label: {
Label(String(localized: L10n.Send.stopSharing), systemImage: "stop.circle")
Label(String(localized: L10n.Send.stopSharing), systemSymbol: .stopCircle)
}
}
}
@@ -69,7 +70,7 @@ struct TransferDetailsView: View {
.toolbar {
ToolbarItem(placement: .primaryAction) {
Button(role: .destructive, action: model.requestDeleteTransfer) {
Image(systemName: "trash")
Image(systemSymbol: .trash)
}
}
}
@@ -115,7 +116,7 @@ private struct DetailDestination: View {
.font(.footnote)
.foregroundStyle(.secondary)
}
Image(systemName: "chevron.forward")
Image(systemSymbol: .chevronForward)
.font(.footnote.weight(.semibold)).foregroundStyle(.tertiary)
}
.contentShape(Rectangle())