ListlessiOS/Views/AboutView.swift (3128B)
1import SwiftUI
2
3struct 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}