// // ScenicPromotionMediaStripView.swift // suixinkan // // Created by Codex on 2026/7/2. // import SwiftUI /// 宣传页素材横向选择器,支持左右切换与缩略图选中。 struct ScenicPromotionMediaStripView: View { let mediaItems: [ScenicPromotionMedia] let selectedMediaID: String? let emptyMode: ScenicPromotionMediaMode let onSelectMedia: (ScenicPromotionMedia) -> Void let onMoveMedia: (Int) -> Void var body: some View { HStack(spacing: 8) { Button { onMoveMedia(-1) } label: { Image(systemName: "chevron.left") .font(.system(size: 22, weight: .heavy)) .foregroundStyle(Color(hex: 0x326EAE)) .frame(width: 28, height: 100) } .buttonStyle(.plain) if mediaItems.isEmpty { ScenicPromotionMediaEmptyView(mode: emptyMode) } else { ScrollView(.horizontal, showsIndicators: false) { HStack(spacing: 10) { ForEach(mediaItems) { media in Button { onSelectMedia(media) } label: { ScenicPromotionMediaArtwork(media: media, compact: true, useHeroAsset: false) .frame(width: media.previewWidth, height: 66) .overlay(alignment: .bottomTrailing) { if let duration = media.duration { Text(duration) .font(.system(size: 11, weight: .bold)) .foregroundStyle(.white) .padding(.horizontal, 6) .padding(.vertical, 3) .background(.black.opacity(0.42), in: Capsule()) .padding(6) } } .overlay( RoundedRectangle(cornerRadius: 12) .stroke( selectedMediaID == media.id ? Color(hex: 0x0B79FF) : .white.opacity(0.75), lineWidth: selectedMediaID == media.id ? 3 : 1 ) ) } .buttonStyle(.plain) } } .padding(.vertical, 2) } } Button { onMoveMedia(1) } label: { Image(systemName: "chevron.right") .font(.system(size: 22, weight: .heavy)) .foregroundStyle(Color(hex: 0x326EAE)) .frame(width: 28, height: 100) } .buttonStyle(.plain) } .padding(10) .background(.white.opacity(0.72), in: RoundedRectangle(cornerRadius: 18)) .overlay( RoundedRectangle(cornerRadius: 18) .stroke(.white.opacity(0.85), lineWidth: 1) ) } } #if DEBUG #Preview("素材横向列表") { let board = ScenicPromotionPreviewSupport.sampleBoard ScenicPromotionMediaStripView( mediaItems: board.spots[0].videos, selectedMediaID: board.spots[0].videos[0].id, emptyMode: .video, onSelectMedia: { _ in }, onMoveMedia: { _ in } ) .padding(.horizontal, 20) } #endif