Simple App to help @jaspermayone make it through COMP1050 with a professor who won't use version control.
1/*
2 *
3 * © 2026 Jasper Mayone <me@jaspermayone.com>
4 * Licensed under the O'Saasy License Agreement (https://osaasy.dev/")
5 *
6 * Icon Generator for ZipMerge - Run this to generate app icon
7 * Instructions:
8 * 1. Open this file in Xcode Playground or add to project temporarily
9 * 2. Run and screenshot the preview at different sizes
10 * 3. Use the screenshots for your app icon
11 *
12 */
13
14import SwiftUI
15
16struct AppIconView: View {
17 let size: CGFloat = 1024 // Standard app icon size
18
19 var body: some View {
20 ZStack {
21 // Background gradient
22 LinearGradient(
23 gradient: Gradient(colors: [
24 Color(red: 0.2, green: 0.5, blue: 0.9),
25 Color(red: 0.1, green: 0.3, blue: 0.7)
26 ]),
27 startPoint: .topLeading,
28 endPoint: .bottomTrailing
29 )
30
31 // Main icon content
32 VStack(spacing: size * 0.05) {
33 // Zip icon on top
34 Image(systemName: "doc.zipper")
35 .font(.system(size: size * 0.25, weight: .medium))
36 .foregroundColor(.white)
37 .shadow(color: .black.opacity(0.3), radius: size * 0.02)
38
39 // Merge arrows
40 HStack(spacing: size * 0.08) {
41 Image(systemName: "arrow.down.circle.fill")
42 .font(.system(size: size * 0.15, weight: .bold))
43 .foregroundColor(.white.opacity(0.9))
44
45 Image(systemName: "arrow.triangle.merge")
46 .font(.system(size: size * 0.15, weight: .bold))
47 .foregroundColor(Color(red: 1.0, green: 0.8, blue: 0.2))
48 .shadow(color: .black.opacity(0.3), radius: size * 0.01)
49 }
50
51 // Folder icon at bottom
52 Image(systemName: "folder.fill")
53 .font(.system(size: size * 0.2, weight: .medium))
54 .foregroundColor(.white.opacity(0.95))
55 .shadow(color: .black.opacity(0.3), radius: size * 0.02)
56 }
57 }
58 .frame(width: size, height: size)
59 .cornerRadius(size * 0.225) // Standard iOS icon corner radius
60 }
61}
62
63// Alternative simpler design
64struct AppIconViewSimple: View {
65 let size: CGFloat = 1024
66
67 var body: some View {
68 ZStack {
69 // Background
70 RoundedRectangle(cornerRadius: size * 0.225)
71 .fill(LinearGradient(
72 gradient: Gradient(colors: [
73 Color(red: 0.3, green: 0.6, blue: 1.0),
74 Color(red: 0.2, green: 0.4, blue: 0.8)
75 ]),
76 startPoint: .top,
77 endPoint: .bottom
78 ))
79
80 // Zipper merge symbol
81 VStack(spacing: size * 0.08) {
82 // Two zips merging
83 HStack(spacing: size * 0.06) {
84 Image(systemName: "doc.zipper")
85 .font(.system(size: size * 0.22, weight: .semibold))
86 .foregroundColor(.white.opacity(0.85))
87 .rotationEffect(.degrees(-15))
88
89 Image(systemName: "arrow.right")
90 .font(.system(size: size * 0.15, weight: .bold))
91 .foregroundColor(Color(red: 1.0, green: 0.9, blue: 0.3))
92
93 Image(systemName: "doc.zipper")
94 .font(.system(size: size * 0.22, weight: .semibold))
95 .foregroundColor(.white.opacity(0.85))
96 .rotationEffect(.degrees(15))
97 }
98
99 // Merge result
100 Image(systemName: "checkmark.circle.fill")
101 .font(.system(size: size * 0.18, weight: .bold))
102 .foregroundColor(Color(red: 0.3, green: 0.9, blue: 0.5))
103 .shadow(color: .black.opacity(0.3), radius: size * 0.02)
104 }
105 }
106 .frame(width: size, height: size)
107 }
108}
109
110// Preview for both designs
111struct IconPreview: View {
112 var body: some View {
113 VStack(spacing: 40) {
114 Text("Design 1: Zip to Folder Flow")
115 .font(.title)
116 AppIconView()
117 .frame(width: 512, height: 512)
118
119 Text("Design 2: Zip Merge Simple")
120 .font(.title)
121 AppIconViewSimple()
122 .frame(width: 512, height: 512)
123 }
124 .padding(50)
125 .background(Color(white: 0.9))
126 }
127}
128
129#Preview {
130 IconPreview()
131}