crossmate

A collaborative crossword app for iOS
Log | Files | Refs | LICENSE

AboutView.swift (3601B)


      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("Testing")
     45                             .font(.caption)
     46                             .textCase(.uppercase)
     47                             .tracking(0.8)
     48                             .foregroundStyle(.secondary)
     49                         Text("Eugenia Samuel")
     50                             .font(.subheadline)
     51                             .foregroundStyle(.primary)
     52                     }
     53                     .padding(.bottom, 8)
     54 
     55                     VStack(spacing: 4) {
     56                         Text("Direction")
     57                             .font(.caption)
     58                             .textCase(.uppercase)
     59                             .tracking(0.8)
     60                             .foregroundStyle(.secondary)
     61                         Text("Michael Camilleri")
     62                             .font(.subheadline)
     63                             .foregroundStyle(.primary)
     64                     }
     65                 }
     66                 .frame(maxWidth: .infinity)
     67                 .padding(.bottom, 4)
     68                 .listRowBackground(Color.clear)
     69                 .listRowSeparator(.hidden)
     70             }
     71 
     72             Section {
     73                 Link(destination: URL(string: "https://apps.inqk.net/crossmate")!) {
     74                     Label("Website", systemImage: "globe")
     75                 }
     76                 Link(destination: URL(string: "https://code.inqk.net/crossmate")!) {
     77                     Label("Source Code", systemImage: "chevron.left.forwardslash.chevron.right")
     78                 }
     79             }
     80 
     81             Section {
     82                 Text("Thank you to my wife, daughter and sons for their love and inspiration.")
     83                     .font(.subheadline)
     84                     .foregroundStyle(.secondary)
     85                     .multilineTextAlignment(.center)
     86                     .frame(maxWidth: .infinity)
     87                     .listRowBackground(Color.clear)
     88                     .listRowSeparator(.hidden)
     89             }
     90         }
     91         .contentMargins(.top, 0, for: .scrollContent)
     92         .navigationTitle("About")
     93         .navigationBarTitleDisplayMode(.inline)
     94     }
     95 }