import SwiftUI enum Theme { static let background = Color(hex: 0x0C0F12) static let surface = Color(hex: 0x1C2228) static let border = Color(hex: 0x323B43) static let buttonBlue = Color(hex: 0x2563EB) static let accent = Color(hex: 0x15B884) static let accentDeep = Color(hex: 0x077656) static let accentLight = Color(hex: 0x5EEAB6) static let selected = Color(hex: 0xE5F8F0) static let progressTrack = Color(hex: 0xE0E7EB) static let progressTrackDark = Color(hex: 0x373E46) static let lightBorder = Color(hex: 0xDAE2E8) static let overlay = Color(red: 9.0 / 255.0, green: 12.0 / 255.0, blue: 16.0 / 255.0, opacity: 0.7) static let textDark = Color(hex: 0x12181F) static let textMuted = Color(hex: 0x97A2AE) static let textSubtle = Color(hex: 0x58626C) static let textOverlay = Color(hex: 0xA3ACB6) static func formatTime(_ ms: Int64) -> String { if ms < 0 { return "--:--" } let totalSeconds = ms / 1000 let hours = Int(totalSeconds / 3600) let minutes = Int((totalSeconds % 3600) / 60) let seconds = Int(totalSeconds % 60) if hours > 0 { return String(format: "%d:%02d:%02d", hours, minutes, seconds) } return String(format: "%02d:%02d", minutes, seconds) } static func formatSpeed(_ speed: Float) -> String { var value = String(format: "%.2f", speed) while value.hasSuffix("0") { value.removeLast() } if value.hasSuffix(".") { value.removeLast() } return "\(value)x" } } extension Color { init(hex: UInt32) { self.init( .sRGB, red: Double((hex >> 16) & 0xFF) / 255.0, green: Double((hex >> 8) & 0xFF) / 255.0, blue: Double(hex & 0xFF) / 255.0, opacity: 1 ) } } extension PlayerController { /// 与安卓端 playbackStatus() 一致的播放状态文案。 func playbackStatusText(_ snapshot: PlaybackSnapshot) -> String { let state: String if snapshot.isPlaying { state = "播放中" } else if snapshot.state == .buffering { state = "缓冲中" } else if snapshot.state == .ended { state = "已结束" } else { state = "已暂停" } if let index = snapshot.sentenceIndex { return "\(state) · 第 \(index + 1) 句" } return state } }