1import SwiftUI
2
3struct ContentView: View {
4 @StateObject private var engine = AudioEngine()
5 @StateObject private var settings = Settings()
6 @Environment(\.colorScheme) private var scheme
7
8 var body: some View {
9 let palette = Palette.make(scheme)
10 VStack(spacing: 0) {
11 TopBar(engine: engine, settings: settings)
12 ZStack {
13 PitchGraphView(engine: engine, settings: settings, palette: palette)
14 if engine.permission == .denied {
15 PermissionOverlay()
16 }
17 }
18 }
19 .background(palette.background)
20 .onAppear { engine.start() }
21 }
22}
23
24struct PermissionOverlay: View {
25 var body: some View {
26 VStack(spacing: 10) {
27 Image(systemName: "mic.slash.fill")
28 .font(.system(size: 34))
29 .foregroundColor(.secondary)
30 Text("Microphone access needed")
31 .font(.system(size: 15, weight: .semibold))
32 Text("Enable it in System Settings ▸ Privacy & Security ▸ Microphone,\nthen relaunch Clover Pitch.")
33 .font(.system(size: 12))
34 .multilineTextAlignment(.center)
35 .foregroundColor(.secondary)
36 }
37 .padding(28)
38 .frame(maxWidth: .infinity, maxHeight: .infinity)
39 .background(Color(nsColor: .windowBackgroundColor).opacity(0.9))
40 }
41}