AboutView.swift (3112B)
1 import SwiftUI 2 3 struct AboutView: View { 4 private var appVersion: String { 5 Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "Unknown" 6 } 7 8 private var buildNumber: String { 9 Bundle.main.infoDictionary?["CFBundleVersion"] as? String ?? "Unknown" 10 } 11 12 var body: some View { 13 List { 14 Section { 15 VStack(spacing: 8) { 16 Image("AboutIcon") 17 .resizable() 18 .scaledToFit() 19 .frame(width: 100, height: 100) 20 .clipShape(RoundedRectangle(cornerRadius: 22)) 21 22 Text("Crossmate") 23 .font(.title2) 24 .fontWeight(.bold) 25 26 Text("Version \(appVersion) (\(buildNumber))") 27 .font(.subheadline) 28 .foregroundStyle(.secondary) 29 .padding(.bottom, 20) 30 31 VStack(spacing: 4) { 32 Text("Programming") 33 .font(.caption) 34 .textCase(.uppercase) 35 .tracking(0.8) 36 .foregroundStyle(.secondary) 37 Text("Claude Code and OpenAI Codex") 38 .font(.subheadline) 39 .foregroundStyle(.primary) 40 } 41 .padding(.bottom, 8) 42 43 VStack(spacing: 4) { 44 Text("Direction") 45 .font(.caption) 46 .textCase(.uppercase) 47 .tracking(0.8) 48 .foregroundStyle(.secondary) 49 Text("Michael Camilleri") 50 .font(.subheadline) 51 .foregroundStyle(.primary) 52 } 53 } 54 .frame(maxWidth: .infinity) 55 .padding(.bottom, 4) 56 .listRowBackground(Color.clear) 57 .listRowSeparator(.hidden) 58 } 59 60 Section { 61 Link(destination: URL(string: "https://apps.inqk.net/crossmate")!) { 62 Label("Website", systemImage: "globe") 63 } 64 Link(destination: URL(string: "https://code.inqk.net/crossmate")!) { 65 Label("Source Code", systemImage: "chevron.left.forwardslash.chevron.right") 66 } 67 } 68 69 Section { 70 Text("Thank you to my wife, daughter and sons for their love and inspiration.") 71 .font(.subheadline) 72 .foregroundStyle(.secondary) 73 .multilineTextAlignment(.center) 74 .frame(maxWidth: .infinity) 75 .listRowBackground(Color.clear) 76 .listRowSeparator(.hidden) 77 } 78 } 79 .contentMargins(.top, 0, for: .scrollContent) 80 .navigationTitle("About") 81 .navigationBarTitleDisplayMode(.inline) 82 } 83 }