55 lines
1.7 KiB
Swift
55 lines
1.7 KiB
Swift
// SPDX-FileCopyrightText: 2026 Kaede Akino
|
|
// SPDX-License-Identifier: GPL-3.0-only
|
|
|
|
import SwiftUI
|
|
|
|
/// The same system artwork in a host row and a workspace's Live Activity link.
|
|
public struct HostSystemIcon: View {
|
|
public enum Style {
|
|
case standard
|
|
case desktopCard
|
|
}
|
|
|
|
private let artwork: HostIconArtwork
|
|
private let size: CGFloat
|
|
private let showsBackground: Bool
|
|
private let style: Style
|
|
|
|
public init(
|
|
asset: String?, systemImageName: String? = nil, size: CGFloat = 32,
|
|
showsBackground: Bool = true, style: Style = .standard
|
|
) {
|
|
self.init(
|
|
artwork: asset.map(HostIconArtwork.asset)
|
|
?? .systemImage(systemImageName ?? HostGeneralIcon.server.systemImageName),
|
|
size: size, showsBackground: showsBackground, style: style)
|
|
}
|
|
|
|
public init(
|
|
artwork: HostIconArtwork, size: CGFloat = 32, showsBackground: Bool = true, style: Style = .standard
|
|
) {
|
|
self.artwork = artwork
|
|
self.size = size
|
|
self.showsBackground = showsBackground
|
|
self.style = style
|
|
}
|
|
|
|
public var body: some View {
|
|
Group {
|
|
if artwork.systemImageName != nil, style == .desktopCard {
|
|
artwork.image.font(.system(size: 14, weight: .medium))
|
|
} else {
|
|
artwork.image.resizable().scaledToFit()
|
|
}
|
|
}
|
|
.foregroundStyle(.tint)
|
|
.padding(showsBackground ? (style == .desktopCard ? 7 : size * 0.2) : 0)
|
|
.frame(width: size, height: size)
|
|
.background(
|
|
.tint.opacity(showsBackground ? 0.16 : 0),
|
|
in: RoundedRectangle(cornerRadius: style == .desktopCard ? 6 : size * 0.25)
|
|
)
|
|
.accessibilityHidden(true)
|
|
}
|
|
}
|