Simple App to help @jaspermayone make it through COMP1050 with a professor who won't use version control.
at main 131 lines 4.6 kB view raw
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}