crossmate

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

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 }