import SwiftUI struct AudioVisualizer: View { let audioMeter: AudioMeter let color: Color let isActive: Bool private let barCount = 12 private let minHeight: CGFloat = 5 private let maxHeight: CGFloat = 32 private let barWidth: CGFloat = 3.5 private let barSpacing: CGFloat = 2.3 private let hardThreshold: Double = 0.3 private let sensitivityMultipliers: [Double] @State private var barHeights: [CGFloat] @State private var targetHeights: [CGFloat] init(audioMeter: AudioMeter, color: Color, isActive: Bool) { self.audioMeter = audioMeter self.color = color self.isActive = isActive self.sensitivityMultipliers = (0.. 0.5 { withAnimation( isDecaying ? .spring(response: 0.4, dampingFraction: 0.8) : .spring(response: 0.3, dampingFraction: 0.7) ) { barHeights[i] = targetHeights[i] } } } } private func resetBars() { withAnimation(.easeOut(duration: 0.15)) { barHeights = Array(repeating: minHeight, count: barCount) targetHeights = Array(repeating: minHeight, count: barCount) } } } struct StaticVisualizer: View { private let barCount = 12 private let barWidth: CGFloat = 3.5 private let staticHeight: CGFloat = 5.0 private let barSpacing: CGFloat = 2.3 let color: Color var body: some View { HStack(spacing: barSpacing) { ForEach(0..