import SwiftUI struct KlondikeBoardView: View { @Bindable var viewModel: GameViewModel let layout: CardLayout let theme: GameTheme let cardFaceStyle: CardFaceStyle let cardBackDesign: CardBackDesign var body: some View { VStack(spacing: layout.horizontalPadding) { HStack(spacing: layout.horizontalPadding) { stockView wasteView // Empty gap at column 2 position Color.clear .frame(width: layout.cardWidth, height: layout.cardHeight) ForEach(0.. some View { let topCard = viewModel.state.foundations[index].last return CardView(card: topCard, cardFaceStyle: cardFaceStyle, cardBackDesign: cardBackDesign, size: layout.cardSize()) .dropTarget(.foundation(index)) .accessibilityLabel(topCard != nil ? Text("Foundation \(index + 1), \(topCard!.rank.displayName) of \(topCard!.suit.displayName)") : Text("Foundation \(index + 1), empty")) } private var wasteDragGesture: some Gesture { LongPressGesture(minimumDuration: 0.15) .sequenced(before: DragGesture(coordinateSpace: .named("board"))) .onChanged { value in if case .second(true, let drag?) = value { if viewModel.draggedCards.isEmpty, let card = viewModel.state.waste.last { viewModel.beginDrag(cards: [card], from: .waste) } viewModel.dragPosition = drag.location } } .onEnded { value in if case .second(true, let drag?) = value { viewModel.endDrag(at: drag.location) } else { viewModel.cancelDrag() } } } }