import SwiftUI /// Tile für eigene Decks in der Decks-Liste. Nutzt `DeckCoverTile` als /// Basis (Fan-Stack-Visual + Card-Content). Footer: Karten-Count, /// Due-Capsule, Marketplace-Globe, Edit-Button. /// Tap auf die Tile triggert `onTap` (Study-Mode), Tap auf den Edit- /// Button triggert `onEdit` (Deck-Detail). struct DeckStackTile: View { let deck: CachedDeck let onTap: () -> Void let onEdit: () -> Void var body: some View { DeckCoverTile( title: deck.name, description: deck.deckDescription, category: deck.category, seed: deck.id, colorAccentHex: deck.color, isFeatured: false ) { footerContent } .contentShape(Rectangle()) .onTapGesture { onTap() } } private var footerContent: some View { HStack(spacing: 8) { Label("\(deck.cardCount)", systemImage: "rectangle.stack") .font(.caption2) .foregroundStyle(CardsTheme.mutedForeground) if deck.dueCount > 0 { Text("\(deck.dueCount) fällig") .font(.caption2.weight(.semibold)) .padding(.horizontal, 8) .padding(.vertical, 3) .background(CardsTheme.primary.opacity(0.15), in: Capsule()) .foregroundStyle(CardsTheme.primary) } if deck.isFromMarketplace { Image(systemName: "globe") .font(.caption2) .foregroundStyle(CardsTheme.mutedForeground) } Spacer() editButton } } private var editButton: some View { Button { onEdit() } label: { Image(systemName: "pencil") .font(.footnote.weight(.semibold)) .foregroundStyle(CardsTheme.mutedForeground) .frame(width: 30, height: 30) .background(CardsTheme.muted.opacity(0.7), in: Circle()) .overlay( Circle().stroke(CardsTheme.border, lineWidth: 1) ) } .buttonStyle(.plain) .accessibilityLabel("Deck bearbeiten") } } extension DeckCategory { var systemImageName: String { switch self { case .language: "character.book.closed" case .medicine: "cross.case" case .science: "atom" case .math: "function" case .history: "scroll" case .law: "scale.3d" case .technology: "cpu" case .arts: "paintbrush" case .music: "music.note" case .sport: "figure.run" case .other: "rectangle.stack" } } }