AboutView.swift (3128B)
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("Listless") 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/listless")!) { 62 Label("Website", systemImage: "globe") 63 } 64 Link(destination: URL(string: "https://github.com/pyrmont/listless")!) { 65 Label("Source Code", systemImage: "chevron.left.forwardslash.chevron.right") 66 } 67 } 68 69 Section { 70 Text( 71 "Thank you to my wife, daughter and sons for their love and inspiration." 72 ) 73 .font(.subheadline) 74 .foregroundStyle(.secondary) 75 .multilineTextAlignment(.center) 76 .frame(maxWidth: .infinity) 77 .listRowBackground(Color.clear) 78 .listRowSeparator(.hidden) 79 } 80 } 81 .contentMargins(.top, 0, for: .scrollContent) 82 .navigationTitle("About") 83 .navigationBarTitleDisplayMode(.inline) 84 } 85 }