├── ImmersiveModal.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── xcuserdata │ └── zelynasillas.xcuserdatad │ └── xcschemes │ └── xcschememanagement.plist ├── ImmersiveModal ├── Assets.xcassets │ ├── AccentColor.colorset │ │ └── Contents.json │ ├── AppIcon.appiconset │ │ └── Contents.json │ ├── Backgrounds │ │ ├── Blob.imageset │ │ │ ├── Blob 1 Dark.pdf │ │ │ ├── Blob 1.pdf │ │ │ └── Contents.json │ │ ├── Contents.json │ │ └── Spline.imageset │ │ │ ├── Contents.json │ │ │ └── Spline.png │ ├── Colors │ │ ├── Background.colorset │ │ │ └── Contents.json │ │ ├── Contents.json │ │ └── Shadow.colorset │ │ │ └── Contents.json │ └── Contents.json ├── CloseButton.swift ├── ContentView.swift ├── ContentViewModel.swift ├── CoverLetterPartThree.swift ├── CoverLetterPartTwo.swift ├── CoverLetterView.swift ├── ImmersiveModalApp.swift ├── ModalView.swift ├── Preview Content │ └── Preview Assets.xcassets │ │ └── Contents.json └── ResumeView.swift └── README.md /ImmersiveModal.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 56; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | CE58209A2AABBEC900AEA973 /* ImmersiveModalApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE5820992AABBEC900AEA973 /* ImmersiveModalApp.swift */; }; 11 | CE58209C2AABBEC900AEA973 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE58209B2AABBEC900AEA973 /* ContentView.swift */; }; 12 | CE58209E2AABBED200AEA973 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = CE58209D2AABBED200AEA973 /* Assets.xcassets */; }; 13 | CE5820A12AABBED200AEA973 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = CE5820A02AABBED200AEA973 /* Preview Assets.xcassets */; }; 14 | CE5820A82AABBF0E00AEA973 /* ContentViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE5820A72AABBF0E00AEA973 /* ContentViewModel.swift */; }; 15 | CE5820AA2AABBF8300AEA973 /* ModalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE5820A92AABBF8300AEA973 /* ModalView.swift */; }; 16 | CE5820AC2AABC00700AEA973 /* ResumeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE5820AB2AABC00700AEA973 /* ResumeView.swift */; }; 17 | CE5820AE2AABC01400AEA973 /* CoverLetterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE5820AD2AABC01400AEA973 /* CoverLetterView.swift */; }; 18 | CE5820B02AABC01F00AEA973 /* CoverLetterPartTwo.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE5820AF2AABC01F00AEA973 /* CoverLetterPartTwo.swift */; }; 19 | CE5820B22AABC02900AEA973 /* CoverLetterPartThree.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE5820B12AABC02900AEA973 /* CoverLetterPartThree.swift */; }; 20 | CE5820B42AABC04500AEA973 /* CloseButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE5820B32AABC04500AEA973 /* CloseButton.swift */; }; 21 | /* End PBXBuildFile section */ 22 | 23 | /* Begin PBXFileReference section */ 24 | CE5820962AABBEC900AEA973 /* ImmersiveModal.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ImmersiveModal.app; sourceTree = BUILT_PRODUCTS_DIR; }; 25 | CE5820992AABBEC900AEA973 /* ImmersiveModalApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImmersiveModalApp.swift; sourceTree = ""; }; 26 | CE58209B2AABBEC900AEA973 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; 27 | CE58209D2AABBED200AEA973 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 28 | CE5820A02AABBED200AEA973 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; 29 | CE5820A72AABBF0E00AEA973 /* ContentViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentViewModel.swift; sourceTree = ""; }; 30 | CE5820A92AABBF8300AEA973 /* ModalView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModalView.swift; sourceTree = ""; }; 31 | CE5820AB2AABC00700AEA973 /* ResumeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResumeView.swift; sourceTree = ""; }; 32 | CE5820AD2AABC01400AEA973 /* CoverLetterView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoverLetterView.swift; sourceTree = ""; }; 33 | CE5820AF2AABC01F00AEA973 /* CoverLetterPartTwo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoverLetterPartTwo.swift; sourceTree = ""; }; 34 | CE5820B12AABC02900AEA973 /* CoverLetterPartThree.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoverLetterPartThree.swift; sourceTree = ""; }; 35 | CE5820B32AABC04500AEA973 /* CloseButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloseButton.swift; sourceTree = ""; }; 36 | /* End PBXFileReference section */ 37 | 38 | /* Begin PBXFrameworksBuildPhase section */ 39 | CE5820932AABBEC900AEA973 /* Frameworks */ = { 40 | isa = PBXFrameworksBuildPhase; 41 | buildActionMask = 2147483647; 42 | files = ( 43 | ); 44 | runOnlyForDeploymentPostprocessing = 0; 45 | }; 46 | /* End PBXFrameworksBuildPhase section */ 47 | 48 | /* Begin PBXGroup section */ 49 | CE58208D2AABBEC800AEA973 = { 50 | isa = PBXGroup; 51 | children = ( 52 | CE5820982AABBEC900AEA973 /* ImmersiveModal */, 53 | CE5820972AABBEC900AEA973 /* Products */, 54 | ); 55 | sourceTree = ""; 56 | }; 57 | CE5820972AABBEC900AEA973 /* Products */ = { 58 | isa = PBXGroup; 59 | children = ( 60 | CE5820962AABBEC900AEA973 /* ImmersiveModal.app */, 61 | ); 62 | name = Products; 63 | sourceTree = ""; 64 | }; 65 | CE5820982AABBEC900AEA973 /* ImmersiveModal */ = { 66 | isa = PBXGroup; 67 | children = ( 68 | CE5820992AABBEC900AEA973 /* ImmersiveModalApp.swift */, 69 | CE58209B2AABBEC900AEA973 /* ContentView.swift */, 70 | CE5820A92AABBF8300AEA973 /* ModalView.swift */, 71 | CE5820AB2AABC00700AEA973 /* ResumeView.swift */, 72 | CE5820AD2AABC01400AEA973 /* CoverLetterView.swift */, 73 | CE5820AF2AABC01F00AEA973 /* CoverLetterPartTwo.swift */, 74 | CE5820B12AABC02900AEA973 /* CoverLetterPartThree.swift */, 75 | CE5820A72AABBF0E00AEA973 /* ContentViewModel.swift */, 76 | CE5820B32AABC04500AEA973 /* CloseButton.swift */, 77 | CE58209D2AABBED200AEA973 /* Assets.xcassets */, 78 | CE58209F2AABBED200AEA973 /* Preview Content */, 79 | ); 80 | path = ImmersiveModal; 81 | sourceTree = ""; 82 | }; 83 | CE58209F2AABBED200AEA973 /* Preview Content */ = { 84 | isa = PBXGroup; 85 | children = ( 86 | CE5820A02AABBED200AEA973 /* Preview Assets.xcassets */, 87 | ); 88 | path = "Preview Content"; 89 | sourceTree = ""; 90 | }; 91 | /* End PBXGroup section */ 92 | 93 | /* Begin PBXNativeTarget section */ 94 | CE5820952AABBEC900AEA973 /* ImmersiveModal */ = { 95 | isa = PBXNativeTarget; 96 | buildConfigurationList = CE5820A42AABBED200AEA973 /* Build configuration list for PBXNativeTarget "ImmersiveModal" */; 97 | buildPhases = ( 98 | CE5820922AABBEC900AEA973 /* Sources */, 99 | CE5820932AABBEC900AEA973 /* Frameworks */, 100 | CE5820942AABBEC900AEA973 /* Resources */, 101 | ); 102 | buildRules = ( 103 | ); 104 | dependencies = ( 105 | ); 106 | name = ImmersiveModal; 107 | productName = ImmersiveModal; 108 | productReference = CE5820962AABBEC900AEA973 /* ImmersiveModal.app */; 109 | productType = "com.apple.product-type.application"; 110 | }; 111 | /* End PBXNativeTarget section */ 112 | 113 | /* Begin PBXProject section */ 114 | CE58208E2AABBEC800AEA973 /* Project object */ = { 115 | isa = PBXProject; 116 | attributes = { 117 | BuildIndependentTargetsInParallel = 1; 118 | LastSwiftUpdateCheck = 1500; 119 | LastUpgradeCheck = 1500; 120 | TargetAttributes = { 121 | CE5820952AABBEC900AEA973 = { 122 | CreatedOnToolsVersion = 15.0; 123 | }; 124 | }; 125 | }; 126 | buildConfigurationList = CE5820912AABBEC900AEA973 /* Build configuration list for PBXProject "ImmersiveModal" */; 127 | compatibilityVersion = "Xcode 14.0"; 128 | developmentRegion = en; 129 | hasScannedForEncodings = 0; 130 | knownRegions = ( 131 | en, 132 | Base, 133 | ); 134 | mainGroup = CE58208D2AABBEC800AEA973; 135 | productRefGroup = CE5820972AABBEC900AEA973 /* Products */; 136 | projectDirPath = ""; 137 | projectRoot = ""; 138 | targets = ( 139 | CE5820952AABBEC900AEA973 /* ImmersiveModal */, 140 | ); 141 | }; 142 | /* End PBXProject section */ 143 | 144 | /* Begin PBXResourcesBuildPhase section */ 145 | CE5820942AABBEC900AEA973 /* Resources */ = { 146 | isa = PBXResourcesBuildPhase; 147 | buildActionMask = 2147483647; 148 | files = ( 149 | CE5820A12AABBED200AEA973 /* Preview Assets.xcassets in Resources */, 150 | CE58209E2AABBED200AEA973 /* Assets.xcassets in Resources */, 151 | ); 152 | runOnlyForDeploymentPostprocessing = 0; 153 | }; 154 | /* End PBXResourcesBuildPhase section */ 155 | 156 | /* Begin PBXSourcesBuildPhase section */ 157 | CE5820922AABBEC900AEA973 /* Sources */ = { 158 | isa = PBXSourcesBuildPhase; 159 | buildActionMask = 2147483647; 160 | files = ( 161 | CE58209C2AABBEC900AEA973 /* ContentView.swift in Sources */, 162 | CE58209A2AABBEC900AEA973 /* ImmersiveModalApp.swift in Sources */, 163 | CE5820AA2AABBF8300AEA973 /* ModalView.swift in Sources */, 164 | CE5820B42AABC04500AEA973 /* CloseButton.swift in Sources */, 165 | CE5820B22AABC02900AEA973 /* CoverLetterPartThree.swift in Sources */, 166 | CE5820A82AABBF0E00AEA973 /* ContentViewModel.swift in Sources */, 167 | CE5820B02AABC01F00AEA973 /* CoverLetterPartTwo.swift in Sources */, 168 | CE5820AE2AABC01400AEA973 /* CoverLetterView.swift in Sources */, 169 | CE5820AC2AABC00700AEA973 /* ResumeView.swift in Sources */, 170 | ); 171 | runOnlyForDeploymentPostprocessing = 0; 172 | }; 173 | /* End PBXSourcesBuildPhase section */ 174 | 175 | /* Begin XCBuildConfiguration section */ 176 | CE5820A22AABBED200AEA973 /* Debug */ = { 177 | isa = XCBuildConfiguration; 178 | buildSettings = { 179 | ALWAYS_SEARCH_USER_PATHS = NO; 180 | ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; 181 | CLANG_ANALYZER_NONNULL = YES; 182 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 183 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; 184 | CLANG_ENABLE_MODULES = YES; 185 | CLANG_ENABLE_OBJC_ARC = YES; 186 | CLANG_ENABLE_OBJC_WEAK = YES; 187 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 188 | CLANG_WARN_BOOL_CONVERSION = YES; 189 | CLANG_WARN_COMMA = YES; 190 | CLANG_WARN_CONSTANT_CONVERSION = YES; 191 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 192 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 193 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 194 | CLANG_WARN_EMPTY_BODY = YES; 195 | CLANG_WARN_ENUM_CONVERSION = YES; 196 | CLANG_WARN_INFINITE_RECURSION = YES; 197 | CLANG_WARN_INT_CONVERSION = YES; 198 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 199 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 200 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 201 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 202 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 203 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 204 | CLANG_WARN_STRICT_PROTOTYPES = YES; 205 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 206 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 207 | CLANG_WARN_UNREACHABLE_CODE = YES; 208 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 209 | COPY_PHASE_STRIP = NO; 210 | DEBUG_INFORMATION_FORMAT = dwarf; 211 | ENABLE_STRICT_OBJC_MSGSEND = YES; 212 | ENABLE_TESTABILITY = YES; 213 | ENABLE_USER_SCRIPT_SANDBOXING = YES; 214 | GCC_C_LANGUAGE_STANDARD = gnu17; 215 | GCC_DYNAMIC_NO_PIC = NO; 216 | GCC_NO_COMMON_BLOCKS = YES; 217 | GCC_OPTIMIZATION_LEVEL = 0; 218 | GCC_PREPROCESSOR_DEFINITIONS = ( 219 | "DEBUG=1", 220 | "$(inherited)", 221 | ); 222 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 223 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 224 | GCC_WARN_UNDECLARED_SELECTOR = YES; 225 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 226 | GCC_WARN_UNUSED_FUNCTION = YES; 227 | GCC_WARN_UNUSED_VARIABLE = YES; 228 | IPHONEOS_DEPLOYMENT_TARGET = 17.0; 229 | LOCALIZATION_PREFERS_STRING_CATALOGS = YES; 230 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 231 | MTL_FAST_MATH = YES; 232 | ONLY_ACTIVE_ARCH = YES; 233 | SDKROOT = iphoneos; 234 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; 235 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 236 | }; 237 | name = Debug; 238 | }; 239 | CE5820A32AABBED200AEA973 /* Release */ = { 240 | isa = XCBuildConfiguration; 241 | buildSettings = { 242 | ALWAYS_SEARCH_USER_PATHS = NO; 243 | ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; 244 | CLANG_ANALYZER_NONNULL = YES; 245 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 246 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; 247 | CLANG_ENABLE_MODULES = YES; 248 | CLANG_ENABLE_OBJC_ARC = YES; 249 | CLANG_ENABLE_OBJC_WEAK = YES; 250 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 251 | CLANG_WARN_BOOL_CONVERSION = YES; 252 | CLANG_WARN_COMMA = YES; 253 | CLANG_WARN_CONSTANT_CONVERSION = YES; 254 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 255 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 256 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 257 | CLANG_WARN_EMPTY_BODY = YES; 258 | CLANG_WARN_ENUM_CONVERSION = YES; 259 | CLANG_WARN_INFINITE_RECURSION = YES; 260 | CLANG_WARN_INT_CONVERSION = YES; 261 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 262 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 263 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 264 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 265 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 266 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 267 | CLANG_WARN_STRICT_PROTOTYPES = YES; 268 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 269 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 270 | CLANG_WARN_UNREACHABLE_CODE = YES; 271 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 272 | COPY_PHASE_STRIP = NO; 273 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 274 | ENABLE_NS_ASSERTIONS = NO; 275 | ENABLE_STRICT_OBJC_MSGSEND = YES; 276 | ENABLE_USER_SCRIPT_SANDBOXING = YES; 277 | GCC_C_LANGUAGE_STANDARD = gnu17; 278 | GCC_NO_COMMON_BLOCKS = YES; 279 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 280 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 281 | GCC_WARN_UNDECLARED_SELECTOR = YES; 282 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 283 | GCC_WARN_UNUSED_FUNCTION = YES; 284 | GCC_WARN_UNUSED_VARIABLE = YES; 285 | IPHONEOS_DEPLOYMENT_TARGET = 17.0; 286 | LOCALIZATION_PREFERS_STRING_CATALOGS = YES; 287 | MTL_ENABLE_DEBUG_INFO = NO; 288 | MTL_FAST_MATH = YES; 289 | SDKROOT = iphoneos; 290 | SWIFT_COMPILATION_MODE = wholemodule; 291 | VALIDATE_PRODUCT = YES; 292 | }; 293 | name = Release; 294 | }; 295 | CE5820A52AABBED200AEA973 /* Debug */ = { 296 | isa = XCBuildConfiguration; 297 | buildSettings = { 298 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 299 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 300 | CODE_SIGN_STYLE = Automatic; 301 | CURRENT_PROJECT_VERSION = 1; 302 | DEVELOPMENT_ASSET_PATHS = "\"ImmersiveModal/Preview Content\""; 303 | DEVELOPMENT_TEAM = 8X2U77VR7B; 304 | ENABLE_PREVIEWS = YES; 305 | GENERATE_INFOPLIST_FILE = YES; 306 | INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; 307 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; 308 | INFOPLIST_KEY_UILaunchScreen_Generation = YES; 309 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 310 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 311 | LD_RUNPATH_SEARCH_PATHS = ( 312 | "$(inherited)", 313 | "@executable_path/Frameworks", 314 | ); 315 | MARKETING_VERSION = 1.0; 316 | PRODUCT_BUNDLE_IDENTIFIER = com.ZelynaSillas.ImmersiveModal; 317 | PRODUCT_NAME = "$(TARGET_NAME)"; 318 | SWIFT_EMIT_LOC_STRINGS = YES; 319 | SWIFT_VERSION = 5.0; 320 | TARGETED_DEVICE_FAMILY = "1,2"; 321 | }; 322 | name = Debug; 323 | }; 324 | CE5820A62AABBED200AEA973 /* Release */ = { 325 | isa = XCBuildConfiguration; 326 | buildSettings = { 327 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 328 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 329 | CODE_SIGN_STYLE = Automatic; 330 | CURRENT_PROJECT_VERSION = 1; 331 | DEVELOPMENT_ASSET_PATHS = "\"ImmersiveModal/Preview Content\""; 332 | DEVELOPMENT_TEAM = 8X2U77VR7B; 333 | ENABLE_PREVIEWS = YES; 334 | GENERATE_INFOPLIST_FILE = YES; 335 | INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; 336 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; 337 | INFOPLIST_KEY_UILaunchScreen_Generation = YES; 338 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 339 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 340 | LD_RUNPATH_SEARCH_PATHS = ( 341 | "$(inherited)", 342 | "@executable_path/Frameworks", 343 | ); 344 | MARKETING_VERSION = 1.0; 345 | PRODUCT_BUNDLE_IDENTIFIER = com.ZelynaSillas.ImmersiveModal; 346 | PRODUCT_NAME = "$(TARGET_NAME)"; 347 | SWIFT_EMIT_LOC_STRINGS = YES; 348 | SWIFT_VERSION = 5.0; 349 | TARGETED_DEVICE_FAMILY = "1,2"; 350 | }; 351 | name = Release; 352 | }; 353 | /* End XCBuildConfiguration section */ 354 | 355 | /* Begin XCConfigurationList section */ 356 | CE5820912AABBEC900AEA973 /* Build configuration list for PBXProject "ImmersiveModal" */ = { 357 | isa = XCConfigurationList; 358 | buildConfigurations = ( 359 | CE5820A22AABBED200AEA973 /* Debug */, 360 | CE5820A32AABBED200AEA973 /* Release */, 361 | ); 362 | defaultConfigurationIsVisible = 0; 363 | defaultConfigurationName = Release; 364 | }; 365 | CE5820A42AABBED200AEA973 /* Build configuration list for PBXNativeTarget "ImmersiveModal" */ = { 366 | isa = XCConfigurationList; 367 | buildConfigurations = ( 368 | CE5820A52AABBED200AEA973 /* Debug */, 369 | CE5820A62AABBED200AEA973 /* Release */, 370 | ); 371 | defaultConfigurationIsVisible = 0; 372 | defaultConfigurationName = Release; 373 | }; 374 | /* End XCConfigurationList section */ 375 | }; 376 | rootObject = CE58208E2AABBEC800AEA973 /* Project object */; 377 | } 378 | -------------------------------------------------------------------------------- /ImmersiveModal.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ImmersiveModal.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ImmersiveModal.xcodeproj/xcuserdata/zelynasillas.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | ImmersiveModal.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /ImmersiveModal/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /ImmersiveModal/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "platform" : "ios", 6 | "size" : "1024x1024" 7 | } 8 | ], 9 | "info" : { 10 | "author" : "xcode", 11 | "version" : 1 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /ImmersiveModal/Assets.xcassets/Backgrounds/Blob.imageset/Blob 1 Dark.pdf: -------------------------------------------------------------------------------- 1 | %PDF-1.7 2 | 3 | 1 0 obj 4 | << /Length 2 0 R 5 | /FunctionType 4 6 | /Domain [ 0.000000 1.000000 ] 7 | /Range [ 0.000000 1.000000 0.000000 1.000000 0.000000 1.000000 ] 8 | >> 9 | stream 10 | { 0.680000 exch 0.000000 exch 1.000000 exch dup 0.000000 gt { exch pop exch pop exch pop dup 0.000000 sub -0.617441 mul 0.680000 add exch dup 0.000000 sub 0.346745 mul 0.000000 add exch dup 0.000000 sub -0.117162 mul 1.000000 add exch } if dup 0.497884 gt { exch pop exch pop exch pop dup 0.497884 sub 1.249540 mul 0.372586 add exch dup 0.497884 sub 0.270245 mul 0.172639 add exch dup 0.497884 sub -0.104225 mul 0.941667 add exch } if dup 1.000000 gt { exch pop exch pop exch pop 1.000000 exch 0.308333 exch 0.889333 exch } if pop } 11 | endstream 12 | endobj 13 | 14 | 2 0 obj 15 | 533 16 | endobj 17 | 18 | 3 0 obj 19 | << /Length 4 0 R 20 | /FunctionType 4 21 | /Domain [ 0.000000 1.000000 ] 22 | /Range [ 0.000000 1.000000 0.000000 1.000000 0.000000 1.000000 ] 23 | >> 24 | stream 25 | { 0.354046 exch 0.111250 exch 0.741667 exch dup 0.000000 gt { exch pop exch pop exch pop dup 0.000000 sub -0.185418 mul 0.354046 add exch dup 0.000000 sub -0.032819 mul 0.111250 add exch dup 0.000000 sub -0.200490 mul 0.741667 add exch } if dup 1.000000 gt { exch pop exch pop exch pop 0.168627 exch 0.078431 exch 0.541176 exch } if pop } 26 | endstream 27 | endobj 28 | 29 | 4 0 obj 30 | 339 31 | endobj 32 | 33 | 5 0 obj 34 | << /BBox [ 0.000000 0.000000 738.000000 504.000000 ] 35 | /Resources << /ExtGState << /E1 << /ca 0.800000 >> >> 36 | /Pattern << /P2 << /Matrix [ -89.297676 541.385132 541.385132 89.297676 -481.977722 -133.584229 ] 37 | /Shading << /Coords [ 0.000000 0.000000 1.000000 0.000000 ] 38 | /Extend [ true true ] 39 | /Domain [ 0.000000 1.000000 ] 40 | /ShadingType 2 41 | /ColorSpace /DeviceRGB 42 | /Function 1 0 R 43 | >> 44 | /PatternType 2 45 | /Type /Pattern 46 | >> 47 | /P1 << /Matrix [ 298.970886 -350.692474 350.692474 298.970886 -285.305023 71.329773 ] 48 | /Shading << /Coords [ 0.000000 0.000000 1.000000 0.000000 ] 49 | /Extend [ true true ] 50 | /Domain [ 0.000000 1.000000 ] 51 | /ShadingType 2 52 | /ColorSpace /DeviceRGB 53 | /Function 3 0 R 54 | >> 55 | /PatternType 2 56 | /Type /Pattern 57 | >> 58 | >> 59 | >> 60 | /Subtype /Form 61 | /Length 6 0 R 62 | /Group << /Type /Group 63 | /S /Transparency 64 | >> 65 | /Type /XObject 66 | >> 67 | stream 68 | /DeviceRGB CS 69 | /DeviceRGB cs 70 | q 71 | 1.000000 0.000000 -0.000000 1.000000 0.000061 -44.392426 cm 72 | /Pattern cs 73 | /P1 scn 74 | 269.428467 138.087189 m 75 | 59.709106 37.050446 -66.856354 274.893402 37.016521 409.180908 c 76 | 81.218369 466.325256 141.662384 528.442871 233.870117 464.037445 c 77 | 309.190613 411.427429 347.637177 484.222870 411.657196 472.823273 c 78 | 466.548828 463.049133 518.117920 484.894348 580.558960 451.957031 c 79 | 643.000000 419.019714 735.000000 367.392426 707.000000 273.392426 c 80 | 679.000000 179.392426 680.257019 126.020905 587.459961 102.115662 c 81 | 476.617310 73.561737 422.856384 221.272125 269.428467 138.087189 c 82 | h 83 | f 84 | n 85 | Q 86 | q 87 | /E1 gs 88 | 1.000000 0.000000 -0.000000 -1.000000 52.000000 663.580322 cm 89 | /Pattern cs 90 | /P2 scn 91 | 419.097107 207.780243 m 92 | 126.230804 38.736938 -94.074966 361.207092 40.412846 546.306396 c 93 | 128.815689 667.977661 229.274109 701.694885 348.658661 612.919678 c 94 | 446.178711 540.403015 464.187622 638.877441 563.593811 630.728882 c 95 | 663.000000 622.580261 743.000000 382.580261 630.000000 330.580261 c 96 | 517.000000 278.580261 574.000000 297.190674 419.097107 207.780243 c 97 | h 98 | f 99 | n 100 | Q 101 | 102 | endstream 103 | endobj 104 | 105 | 6 0 obj 106 | 1074 107 | endobj 108 | 109 | 7 0 obj 110 | << /BBox [ 0.000000 0.000000 738.000000 504.000000 ] 111 | /Resources << >> 112 | /Subtype /Form 113 | /Length 8 0 R 114 | /Group << /Type /Group 115 | /S /Transparency 116 | >> 117 | /Type /XObject 118 | >> 119 | stream 120 | /DeviceRGB CS 121 | /DeviceRGB cs 122 | q 123 | 1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm 124 | 0.000000 0.000000 0.000000 scn 125 | 0.000000 504.000000 m 126 | 738.000000 504.000000 l 127 | 738.000000 0.000000 l 128 | 0.000000 0.000000 l 129 | 0.000000 504.000000 l 130 | h 131 | f 132 | n 133 | Q 134 | 135 | endstream 136 | endobj 137 | 138 | 8 0 obj 139 | 237 140 | endobj 141 | 142 | 9 0 obj 143 | << /XObject << /X1 5 0 R >> 144 | /ExtGState << /E1 << /SMask << /Type /Mask 145 | /G 7 0 R 146 | /S /Alpha 147 | >> 148 | /Type /ExtGState 149 | >> >> 150 | >> 151 | endobj 152 | 153 | 10 0 obj 154 | << /Length 11 0 R >> 155 | stream 156 | /DeviceRGB CS 157 | /DeviceRGB cs 158 | q 159 | /E1 gs 160 | /X1 Do 161 | Q 162 | 163 | endstream 164 | endobj 165 | 166 | 11 0 obj 167 | 46 168 | endobj 169 | 170 | 12 0 obj 171 | << /Annots [] 172 | /Type /Page 173 | /MediaBox [ 0.000000 0.000000 738.000000 504.000000 ] 174 | /Resources 9 0 R 175 | /Contents 10 0 R 176 | /Parent 13 0 R 177 | >> 178 | endobj 179 | 180 | 13 0 obj 181 | << /Kids [ 12 0 R ] 182 | /Count 1 183 | /Type /Pages 184 | >> 185 | endobj 186 | 187 | 14 0 obj 188 | << /Type /Catalog 189 | /Pages 13 0 R 190 | >> 191 | endobj 192 | 193 | xref 194 | 0 15 195 | 0000000000 65535 f 196 | 0000000010 00000 n 197 | 0000000727 00000 n 198 | 0000000749 00000 n 199 | 0000001272 00000 n 200 | 0000001294 00000 n 201 | 0000004235 00000 n 202 | 0000004258 00000 n 203 | 0000004745 00000 n 204 | 0000004767 00000 n 205 | 0000005065 00000 n 206 | 0000005169 00000 n 207 | 0000005191 00000 n 208 | 0000005369 00000 n 209 | 0000005445 00000 n 210 | trailer 211 | << /ID [ (some) (id) ] 212 | /Root 14 0 R 213 | /Size 15 214 | >> 215 | startxref 216 | 5506 217 | %%EOF -------------------------------------------------------------------------------- /ImmersiveModal/Assets.xcassets/Backgrounds/Blob.imageset/Blob 1.pdf: -------------------------------------------------------------------------------- 1 | %PDF-1.7 2 | 3 | 1 0 obj 4 | << /Length 2 0 R 5 | /FunctionType 4 6 | /Domain [ 0.000000 1.000000 ] 7 | /Range [ 0.000000 1.000000 0.000000 1.000000 0.000000 1.000000 ] 8 | >> 9 | stream 10 | { 0.294118 exch 0.721569 exch 0.976471 exch dup 0.000000 gt { exch pop exch pop exch pop dup 0.000000 sub 1.192122 mul 0.294118 add exch dup 0.000000 sub -0.409564 mul 0.721569 add exch dup 0.000000 sub -0.285232 mul 0.976471 add exch } if dup 0.536200 gt { exch pop exch pop exch pop dup 0.536200 sub 0.067642 mul 0.933333 add exch dup 0.536200 sub 0.591871 mul 0.501961 add exch dup 0.536200 sub 0.219838 mul 0.823529 add exch } if dup 1.000000 gt { exch pop exch pop exch pop 0.964706 exch 0.776471 exch 0.925490 exch } if pop } 11 | endstream 12 | endobj 13 | 14 | 2 0 obj 15 | 532 16 | endobj 17 | 18 | 3 0 obj 19 | << /Length 4 0 R 20 | /FunctionType 4 21 | /Domain [ 0.000000 1.000000 ] 22 | /Range [ 0.000000 1.000000 0.000000 1.000000 0.000000 1.000000 ] 23 | >> 24 | stream 25 | { 1.000000 exch 0.000000 exch 0.622857 exch dup 0.000000 gt { exch pop exch pop exch pop dup 0.000000 sub -0.020047 mul 1.000000 add exch dup 0.000000 sub 0.938222 mul 0.000000 add exch dup 0.000000 sub 0.024744 mul 0.622857 add exch } if dup 0.978070 gt { exch pop exch pop exch pop 0.980392 exch 0.917647 exch 0.647059 exch } if pop } 26 | endstream 27 | endobj 28 | 29 | 4 0 obj 30 | 337 31 | endobj 32 | 33 | 5 0 obj 34 | << /BBox [ 0.000000 0.000000 738.000000 504.000000 ] 35 | /Resources << /ExtGState << /E1 << /ca 0.500000 >> >> 36 | /Pattern << /P2 << /Matrix [ -89.297676 541.385132 541.385132 89.297676 -481.977722 -133.584259 ] 37 | /Shading << /Coords [ 0.000000 0.000000 1.000000 0.000000 ] 38 | /Extend [ true true ] 39 | /Domain [ 0.000000 1.000000 ] 40 | /ShadingType 2 41 | /ColorSpace /DeviceRGB 42 | /Function 1 0 R 43 | >> 44 | /PatternType 2 45 | /Type /Pattern 46 | >> 47 | /P1 << /Matrix [ 229.685791 -453.308228 809.726501 128.584808 -295.864685 436.983002 ] 48 | /Shading << /Coords [ 0.500000 0.500000 0.000000 0.500000 0.500000 0.500000 ] 49 | /Extend [ true true ] 50 | /Domain [ 0.000000 1.000000 ] 51 | /ShadingType 3 52 | /ColorSpace /DeviceRGB 53 | /Function 3 0 R 54 | >> 55 | /PatternType 2 56 | /Type /Pattern 57 | >> 58 | >> 59 | >> 60 | /Subtype /Form 61 | /Length 6 0 R 62 | /Group << /Type /Group 63 | /S /Transparency 64 | >> 65 | /Type /XObject 66 | >> 67 | stream 68 | /DeviceRGB CS 69 | /DeviceRGB cs 70 | q 71 | 1.000000 0.000000 -0.000000 1.000000 0.000061 -44.392426 cm 72 | /Pattern cs 73 | /P1 scn 74 | 269.428467 138.087189 m 75 | 59.709106 37.050446 -66.856354 274.893402 37.016521 409.180908 c 76 | 81.218369 466.325256 141.662384 528.442871 233.870117 464.037445 c 77 | 309.190613 411.427429 347.637177 484.222870 411.657196 472.823273 c 78 | 466.548828 463.049133 518.117920 484.894348 580.558960 451.957031 c 79 | 643.000000 419.019714 735.000000 367.392426 707.000000 273.392426 c 80 | 679.000000 179.392426 680.257019 126.020905 587.459961 102.115662 c 81 | 476.617310 73.561737 422.856384 221.272125 269.428467 138.087189 c 82 | h 83 | f 84 | n 85 | Q 86 | q 87 | /E1 gs 88 | 1.000000 0.000000 -0.000000 -1.000000 52.000000 663.580322 cm 89 | /Pattern cs 90 | /P2 scn 91 | 419.097107 207.780243 m 92 | 126.230804 38.736938 -94.074966 361.207092 40.412846 546.306396 c 93 | 128.815689 667.977661 229.274109 701.694885 348.658661 612.919678 c 94 | 446.178711 540.403015 464.187622 638.877441 563.593811 630.728882 c 95 | 663.000000 622.580261 743.000000 382.580261 630.000000 330.580261 c 96 | 517.000000 278.580261 574.000000 297.190674 419.097107 207.780243 c 97 | h 98 | f 99 | n 100 | Q 101 | 102 | endstream 103 | endobj 104 | 105 | 6 0 obj 106 | 1074 107 | endobj 108 | 109 | 7 0 obj 110 | << /BBox [ 0.000000 0.000000 738.000000 504.000000 ] 111 | /Resources << >> 112 | /Subtype /Form 113 | /Length 8 0 R 114 | /Group << /Type /Group 115 | /S /Transparency 116 | >> 117 | /Type /XObject 118 | >> 119 | stream 120 | /DeviceRGB CS 121 | /DeviceRGB cs 122 | q 123 | 1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm 124 | 0.000000 0.000000 0.000000 scn 125 | 0.000000 504.000000 m 126 | 738.000000 504.000000 l 127 | 738.000000 0.000000 l 128 | 0.000000 0.000000 l 129 | 0.000000 504.000000 l 130 | h 131 | f 132 | n 133 | Q 134 | 135 | endstream 136 | endobj 137 | 138 | 8 0 obj 139 | 237 140 | endobj 141 | 142 | 9 0 obj 143 | << /XObject << /X1 5 0 R >> 144 | /ExtGState << /E1 << /SMask << /Type /Mask 145 | /G 7 0 R 146 | /S /Alpha 147 | >> 148 | /Type /ExtGState 149 | >> >> 150 | >> 151 | endobj 152 | 153 | 10 0 obj 154 | << /Length 11 0 R >> 155 | stream 156 | /DeviceRGB CS 157 | /DeviceRGB cs 158 | q 159 | /E1 gs 160 | /X1 Do 161 | Q 162 | 163 | endstream 164 | endobj 165 | 166 | 11 0 obj 167 | 46 168 | endobj 169 | 170 | 12 0 obj 171 | << /Annots [] 172 | /Type /Page 173 | /MediaBox [ 0.000000 0.000000 738.000000 504.000000 ] 174 | /Resources 9 0 R 175 | /Contents 10 0 R 176 | /Parent 13 0 R 177 | >> 178 | endobj 179 | 180 | 13 0 obj 181 | << /Kids [ 12 0 R ] 182 | /Count 1 183 | /Type /Pages 184 | >> 185 | endobj 186 | 187 | 14 0 obj 188 | << /Type /Catalog 189 | /Pages 13 0 R 190 | >> 191 | endobj 192 | 193 | xref 194 | 0 15 195 | 0000000000 65535 f 196 | 0000000010 00000 n 197 | 0000000726 00000 n 198 | 0000000748 00000 n 199 | 0000001269 00000 n 200 | 0000001291 00000 n 201 | 0000004251 00000 n 202 | 0000004274 00000 n 203 | 0000004761 00000 n 204 | 0000004783 00000 n 205 | 0000005081 00000 n 206 | 0000005185 00000 n 207 | 0000005207 00000 n 208 | 0000005385 00000 n 209 | 0000005461 00000 n 210 | trailer 211 | << /ID [ (some) (id) ] 212 | /Root 14 0 R 213 | /Size 15 214 | >> 215 | startxref 216 | 5522 217 | %%EOF -------------------------------------------------------------------------------- /ImmersiveModal/Assets.xcassets/Backgrounds/Blob.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Blob 1.pdf", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "appearances" : [ 10 | { 11 | "appearance" : "luminosity", 12 | "value" : "dark" 13 | } 14 | ], 15 | "filename" : "Blob 1 Dark.pdf", 16 | "idiom" : "universal", 17 | "scale" : "1x" 18 | }, 19 | { 20 | "idiom" : "universal", 21 | "scale" : "2x" 22 | }, 23 | { 24 | "appearances" : [ 25 | { 26 | "appearance" : "luminosity", 27 | "value" : "dark" 28 | } 29 | ], 30 | "idiom" : "universal", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "idiom" : "universal", 35 | "scale" : "3x" 36 | }, 37 | { 38 | "appearances" : [ 39 | { 40 | "appearance" : "luminosity", 41 | "value" : "dark" 42 | } 43 | ], 44 | "idiom" : "universal", 45 | "scale" : "3x" 46 | } 47 | ], 48 | "info" : { 49 | "author" : "xcode", 50 | "version" : 1 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /ImmersiveModal/Assets.xcassets/Backgrounds/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /ImmersiveModal/Assets.xcassets/Backgrounds/Spline.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Spline.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /ImmersiveModal/Assets.xcassets/Backgrounds/Spline.imageset/Spline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZelynaFarrell/ImmersiveModal/3a126e21c4f32e60cb22f1bc45c80426f753abcf/ImmersiveModal/Assets.xcassets/Backgrounds/Spline.imageset/Spline.png -------------------------------------------------------------------------------- /ImmersiveModal/Assets.xcassets/Colors/Background.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xFF", 9 | "green" : "0xF6", 10 | "red" : "0xF2" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "0x4B", 27 | "green" : "0x25", 28 | "red" : "0x25" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /ImmersiveModal/Assets.xcassets/Colors/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /ImmersiveModal/Assets.xcassets/Colors/Shadow.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x7C", 9 | "green" : "0x2A", 10 | "red" : "0x45" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "0x00", 27 | "green" : "0x00", 28 | "red" : "0x00" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /ImmersiveModal/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /ImmersiveModal/CloseButton.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CloseButton.swift 3 | // ImmersiveModal 4 | // 5 | // Created by Zelyna Sillas on 9/8/23. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct CloseButton: View { 11 | var body: some View { 12 | Image(systemName: "xmark") 13 | .font(.system(size: 15, weight: .bold)) 14 | .foregroundColor(.secondary) 15 | .padding(6) 16 | .background(.ultraThinMaterial, in: Circle()) 17 | } 18 | } 19 | 20 | #Preview { 21 | CloseButton() 22 | } 23 | 24 | -------------------------------------------------------------------------------- /ImmersiveModal/ContentView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentView.swift 3 | // ImmersiveModal 4 | // 5 | // Created by Zelyna Sillas on 9/8/23. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct ContentView: View { 11 | @EnvironmentObject var vm: ContentViewModel 12 | 13 | var body: some View { 14 | ZStack { 15 | Color(.background) 16 | 17 | if vm.showModal { 18 | ModalView() 19 | } 20 | 21 | VStack(alignment: .trailing) { 22 | Spacer() 23 | .frame(height: 80) 24 | 25 | Button { 26 | vm.showModal = true 27 | } label: { 28 | Image(systemName: "doc.on.doc") 29 | .font(.system(size: 20, weight: .bold)) 30 | .frame(width: 36, height: 36) 31 | .padding(5) 32 | .foregroundColor(.gray) 33 | .background(.ultraThinMaterial) 34 | .cornerRadius(18) 35 | } 36 | .padding(.trailing, 20) 37 | .offset(y: vm.showModal ? -300 : 0) 38 | 39 | 40 | Spacer() 41 | HStack { 42 | Spacer() 43 | .frame(maxWidth: .infinity) 44 | 45 | Toggle(isOn: $vm.isInDarkMode.animation(.easeInOut)) { 46 | Text("Toggle").bold() 47 | } 48 | .opacity(0.6) 49 | .padding(.bottom, 30) 50 | .offset(y: vm.showModal ? 100 : 0) 51 | 52 | Spacer() 53 | .frame(maxWidth: .infinity) 54 | 55 | } 56 | } 57 | 58 | } 59 | .preferredColorScheme(vm.isInDarkMode ? .dark : .light) 60 | .ignoresSafeArea() 61 | } 62 | } 63 | 64 | #Preview { 65 | ContentView() 66 | .environmentObject(ContentViewModel()) 67 | } 68 | -------------------------------------------------------------------------------- /ImmersiveModal/ContentViewModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentViewModel.swift 3 | // ImmersiveModal 4 | // 5 | // Created by Zelyna Sillas on 9/8/23. 6 | // 7 | 8 | import SwiftUI 9 | 10 | enum Modal: String { 11 | case resume 12 | case coverLetter 13 | case coverLetterPartTwo 14 | case coverLetterPartThree 15 | } 16 | 17 | class ContentViewModel: ObservableObject { 18 | @Published var isInDarkMode: Bool = true 19 | @Published var selectedModal: Modal = .resume 20 | @Published var showModal = false 21 | @Published var appear = false 22 | @Published var appearBackground = false 23 | @Published var contentAppear = [false, false, false, false, false, false, false] 24 | 25 | func dismissModal() { 26 | withAnimation { 27 | appear = false 28 | appearBackground = false 29 | } 30 | DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { [self] in 31 | withAnimation(.spring(response: 0.5, dampingFraction: 0.7)) { 32 | showModal = false 33 | contentAppear = Array(repeating: false, count: 7) 34 | selectedModal = .resume 35 | } 36 | } 37 | } 38 | 39 | func animateView() { 40 | withAnimation(.timingCurve(0.2, 0.8, 0.2, 1, duration: 0.8).delay(0.2)) { 41 | contentAppear[0] = true 42 | } 43 | withAnimation(.timingCurve(0.2, 0.8, 0.2, 1, duration: 0.8).delay(0.4)) { 44 | contentAppear[1] = true 45 | } 46 | withAnimation(.timingCurve(0.2, 0.8, 0.2, 1, duration: 0.8).delay(0.6)) { 47 | contentAppear[2] = true 48 | } 49 | withAnimation(.timingCurve(0.2, 0.8, 0.2, 1, duration: 0.8).delay(0.8)) { 50 | contentAppear[3] = true 51 | } 52 | withAnimation(.timingCurve(0.2, 0.8, 0.2, 1, duration: 0.8).delay(1.0)) { 53 | contentAppear[4] = true 54 | } 55 | withAnimation(.timingCurve(0.2, 0.8, 0.2, 1, duration: 0.8).delay(1.2)) { 56 | contentAppear[5] = true 57 | } 58 | withAnimation(.timingCurve(0.2, 0.8, 0.2, 1, duration: 0.8).delay(1.4)) { 59 | contentAppear[6] = true 60 | } 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /ImmersiveModal/CoverLetterPartThree.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CoverLetterPartThree.swift 3 | // ImmersiveModal 4 | // 5 | // Created by Zelyna Sillas on 9/8/23. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct CoverLetterPartThree: View { 11 | @EnvironmentObject var vm: ContentViewModel 12 | 13 | var body: some View { 14 | VStack(alignment: .leading, spacing: 20) { 15 | Text("CoverLetter") 16 | .font(.largeTitle).bold() 17 | .blendMode(.overlay) 18 | .slideFadeIn(show: vm.contentAppear[0], offset: 30) 19 | 20 | 21 | partThree 22 | .font(.subheadline) 23 | .foregroundColor(.primary.opacity(0.7)) 24 | 25 | Divider() 26 | 27 | Text("Want more formal content? **resume**") 28 | .font(.footnote) 29 | .foregroundColor(.primary.opacity(0.7)) 30 | .accentColor(.primary.opacity(0.7)) 31 | .onTapGesture { 32 | vm.contentAppear = Array(repeating: false, count: 7) 33 | 34 | DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { 35 | withAnimation(.easeInOut(duration: 0.8)) { 36 | vm.selectedModal = .resume 37 | } 38 | } 39 | } 40 | } 41 | .padding(20) 42 | .padding(.vertical, 20) 43 | .background(.ultraThinMaterial) 44 | .cornerRadius(30) 45 | .background( 46 | VStack { 47 | Circle().fill(vm.isInDarkMode ? .blue : .purple).frame(width: 88, height: 88) 48 | .scaleEffect(vm.contentAppear[0] ? 1 : 0.1) 49 | } 50 | .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading) 51 | ) 52 | .modifier(OutlineModifier(cornerRadius: 30)) 53 | .onAppear { vm.animateView() } 54 | .frame(height: 760) 55 | } 56 | 57 | var partThree: some View { 58 | VStack(alignment: .leading, spacing: 25) { 59 | Text(""" 60 | My aim is to craft impactful, cutting-edge, and visually stunning work that seamlessly aligns with your company's ethos, all the while consistently expanding my knowledge, refining my skills, and deepening my expertise. 61 | """) 62 | .padding(.top, 30) 63 | .slideFadeIn(show: vm.contentAppear[1], offset: 25) 64 | 65 | Text(""" 66 | I eagerly anticipate the opportunity to discuss how I can contribute to your team. 67 | In the meantime, check out my GitHub that I made just for you. 68 | """).slideFadeIn(show: vm.contentAppear[2], offset: 25) 69 | 70 | Text(""" 71 | With Sincere Anticipation, 72 | Zelyna Farrell 73 | """).slideFadeIn(show: vm.contentAppear[3], offset: 25) 74 | 75 | VStack(alignment: .leading, spacing: 2) { 76 | Text(verbatim: "https://github.com/ZelynaFarrell") 77 | Text(verbatim: "https://www.linkedin.com/in/zelynafarrell/") 78 | Text(verbatim: "zelynafarrell@gmail.com") 79 | } 80 | .foregroundColor(.secondary) 81 | .slideFadeIn(show: vm.contentAppear[4], offset: 25) 82 | 83 | Spacer() 84 | .frame(height: 75) 85 | } 86 | } 87 | } 88 | 89 | 90 | #Preview { 91 | CoverLetterPartThree() 92 | .environmentObject(ContentViewModel()) 93 | } 94 | -------------------------------------------------------------------------------- /ImmersiveModal/CoverLetterPartTwo.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CoverLetterPartTwo.swift 3 | // ImmersiveModal 4 | // 5 | // Created by Zelyna Sillas on 9/8/23. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct CoverLetterPartTwo: View { 11 | @EnvironmentObject var vm: ContentViewModel 12 | 13 | var body: some View { 14 | VStack(alignment: .leading, spacing: 20) { 15 | Text("CoverLetter") 16 | .font(.largeTitle).bold() 17 | .blendMode(.overlay) 18 | .slideFadeIn(show: vm.contentAppear[0], offset: 30) 19 | 20 | partTwo 21 | .font(.subheadline) 22 | .foregroundColor(.primary.opacity(0.7)) 23 | 24 | Divider() 25 | 26 | Text("Want more formal content? **resume**") 27 | .font(.footnote) 28 | .foregroundColor(.primary.opacity(0.7)) 29 | .accentColor(.primary.opacity(0.7)) 30 | .onTapGesture { 31 | vm.contentAppear = Array(repeating: false, count: 7) 32 | 33 | DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { 34 | withAnimation(.easeInOut(duration: 0.8)) { 35 | vm.selectedModal = .resume 36 | } 37 | } 38 | } 39 | } 40 | .padding(15) 41 | .padding(.vertical, 10) 42 | .background(.ultraThinMaterial) 43 | .cornerRadius(30) 44 | .background( 45 | VStack { 46 | Circle().fill(vm.isInDarkMode ? .blue : .purple).frame(width: 88, height: 88) 47 | .scaleEffect(vm.contentAppear[0] ? 1 : 0.1) 48 | } 49 | .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading) 50 | ) 51 | .modifier(OutlineModifier(cornerRadius: 30)) 52 | .onAppear { vm.animateView() } 53 | .frame(height: 760) 54 | } 55 | 56 | 57 | 58 | var partTwo: some View { 59 | VStack(alignment: .leading, spacing: 20) { 60 | 61 | Text(""" 62 | yes, my credentials are substantial, but it's my determination and passion to continued learning that sets me apart. \nYou’d like an example? I’m glad you asked… \nI dove headfirst into all things iOS development, completely self-taught, during a global pandemic, all while embracing the many challenges of nurturing a newborn. 63 | """) 64 | .padding(.top, 20) 65 | .slideFadeIn(show: vm.contentAppear[1], offset: 25) 66 | 67 | Text(""" 68 | Yes, you read that right—midnight coding sessions intertwined with soothing lullabies. It's a symphony of time management or a ballet of sleep-deprived multitasking artistry, depending on your perspective. If that isn't an embodiment of sheer determination, I don’t know what is. It’s also that very quality that grants me a distinctive vantage point, setting me apart from the other applicants for this role. 69 | """).slideFadeIn(show: vm.contentAppear[2], offset: 25) 70 | 71 | VStack(alignment: .leading) { 72 | Text(""" 73 | Congratulations, you made it to the final paragraph. As Google wisely suggests, this is where I drive my point home. \nSo, here it is: 74 | """).slideFadeIn(show: vm.contentAppear[3], offset: 25) 75 | 76 | Button { 77 | vm.contentAppear = Array(repeating: false, count: 7) 78 | 79 | DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { 80 | withAnimation(.easeInOut(duration: 0.8)) { 81 | vm.selectedModal = .coverLetterPartThree 82 | } 83 | } 84 | } label: { 85 | Image(systemName: "arrow.right.circle") 86 | .font(.title3) 87 | .frame(maxWidth: .infinity, alignment: .bottomTrailing) 88 | } 89 | .slideFadeIn(show: vm.contentAppear[4], offset: 25) 90 | } 91 | } 92 | } 93 | } 94 | 95 | #Preview { 96 | CoverLetterPartTwo() 97 | .environmentObject(ContentViewModel()) 98 | } 99 | -------------------------------------------------------------------------------- /ImmersiveModal/CoverLetterView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CoverLetterView.swift 3 | // ImmersiveModal 4 | // 5 | // Created by Zelyna Sillas on 9/8/23. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct CoverLetterView: View { 11 | @EnvironmentObject var vm: ContentViewModel 12 | 13 | var body: some View { 14 | VStack(alignment: .leading, spacing: 20) { 15 | Text("CoverLetter") 16 | .font(.largeTitle).bold() 17 | .blendMode(.overlay) 18 | .slideFadeIn(show: vm.contentAppear[0], offset: 30) 19 | 20 | partOne 21 | .font(.subheadline) 22 | .foregroundColor(.primary.opacity(0.7)) 23 | 24 | Divider() 25 | 26 | Text("Want more formal content? **resume**") 27 | .font(.footnote) 28 | .foregroundColor(.primary.opacity(0.7)) 29 | .accentColor(.primary.opacity(0.7)) 30 | .onTapGesture { 31 | vm.contentAppear = Array(repeating: false, count: 7) 32 | 33 | DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { 34 | withAnimation(.easeInOut(duration: 0.8)) { 35 | vm.selectedModal = .resume 36 | } 37 | } 38 | } 39 | } 40 | .padding(15) 41 | .padding(.vertical, 10) 42 | .background(.ultraThinMaterial) 43 | .cornerRadius(30) 44 | .background( 45 | VStack { 46 | Circle().fill(vm.isInDarkMode ? .blue : .purple).frame(width: 88, height: 88) 47 | .scaleEffect(vm.contentAppear[0] ? 1 : 0.1) 48 | } 49 | .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading) 50 | ) 51 | .modifier(OutlineModifier(cornerRadius: 30)) 52 | .onAppear { vm.animateView() } 53 | .frame(height: 760) 54 | } 55 | var partOne: some View { 56 | VStack(alignment: .leading, spacing: 20) { 57 | Text("Dear Hiring Manager,") 58 | .slideFadeIn(show: vm.contentAppear[1], offset: 25) 59 | 60 | Text(""" 61 | My name is Zelyna, and I am very interested in the open iOS Developer role. 62 | 63 | Rather than reformatting my resume into paragraph form, I've opted for a different approach. At this point in the traditional cover letter process, Google tells me I should showcase my achievements as a way to introduce myself. While I could certainly do that by discussing my experience growing and leading successful teams across various US brands, spanning both business and creative realms, I'll assume you've already dissected my resume like it's a final exam. 64 | """).slideFadeIn(show: vm.contentAppear[2], offset: 25) 65 | 66 | Text(""" 67 | Here is the second paragraph, it should be filled with why I want to join your company. Then I’m told I should drive my point home in the final paragraph by reiterating what I’ve already said but with slightly different wording. Since I am not the only one to apply for this position, I will spare you the repetitiveness. 68 | """).slideFadeIn(show: vm.contentAppear[3], offset: 25) 69 | 70 | HStack { 71 | Text("You should want to hire me. Here’s why...") 72 | .slideFadeIn(show: vm.contentAppear[3], offset: 25) 73 | 74 | Spacer() 75 | 76 | Button { 77 | vm.contentAppear = Array(repeating: false, count: 7) 78 | 79 | DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { 80 | withAnimation(.easeInOut(duration: 0.8)) { 81 | vm.selectedModal = .coverLetterPartTwo 82 | } 83 | } 84 | } label: { 85 | Image(systemName: "arrow.right.circle") 86 | .font(.title3) 87 | } 88 | .slideFadeIn(show: vm.contentAppear[4], offset: 25) 89 | } 90 | } 91 | } 92 | } 93 | 94 | #Preview { 95 | CoverLetterView() 96 | .environmentObject(ContentViewModel()) 97 | } 98 | -------------------------------------------------------------------------------- /ImmersiveModal/ImmersiveModalApp.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ImmersiveModalApp.swift 3 | // ImmersiveModal 4 | // 5 | // Created by Zelyna Sillas on 9/8/23. 6 | // 7 | 8 | import SwiftUI 9 | 10 | @main 11 | struct ImmersiveModalApp: App { 12 | var body: some Scene { 13 | WindowGroup { 14 | ContentView() 15 | .environmentObject(ContentViewModel()) 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /ImmersiveModal/ModalView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ModalView.swift 3 | // ImmersiveModal 4 | // 5 | // Created by Zelyna Sillas on 9/8/23. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct ModalView: View { 11 | @EnvironmentObject var vm: ContentViewModel 12 | @Environment(\.dismiss) var dismiss 13 | @State var viewState = CGSize.zero 14 | 15 | var drag: some Gesture { 16 | DragGesture() 17 | .onChanged { value in 18 | viewState = value.translation 19 | } 20 | .onEnded { value in 21 | if value.translation.height > 300 { 22 | vm.dismissModal() 23 | } else { 24 | withAnimation(.spring(response: 0.5, dampingFraction: 0.6)) { 25 | viewState = .zero 26 | } 27 | } 28 | } 29 | } 30 | 31 | var body: some View { 32 | ZStack { 33 | Rectangle() 34 | .fill(.ultraThinMaterial) 35 | .opacity(vm.appear ? 1 : 0) 36 | .ignoresSafeArea() 37 | 38 | GeometryReader { proxy in 39 | Group { 40 | switch vm.selectedModal { 41 | case .resume: 42 | ResumeView() 43 | case .coverLetter: 44 | CoverLetterView() 45 | case .coverLetterPartTwo: 46 | CoverLetterPartTwo() 47 | case .coverLetterPartThree: 48 | CoverLetterPartThree() 49 | } 50 | } 51 | .rotationEffect(.degrees(viewState.width / 40)) 52 | .rotation3DEffect(.degrees(viewState.height / 20), axis: (x: 1, y: 0, z: 0), perspective: 1) 53 | .shadow(color: Color(.shadow).opacity(0.2), radius: 30, x: 0, y: 30) 54 | .padding(.horizontal, 10) 55 | .offset(x: viewState.width, y: viewState.height) 56 | .gesture(drag) 57 | .frame(maxHeight: .infinity, alignment: .center) 58 | .offset(y: vm.appear ? 0 : proxy.size.height) 59 | .background( 60 | Image(.blob) 61 | .offset(x: 170, y: -90) 62 | .opacity(vm.appearBackground ? 1 : 0) 63 | .offset(y: vm.appearBackground ? -10 : 0) 64 | .blur(radius: vm.appearBackground ? 0 : 40) 65 | .hueRotation(.degrees(viewState.width / 5)) 66 | ) 67 | .background( 68 | Image(.spline) 69 | .blur(radius: 30) 70 | .offset(x: 100, y: 100) 71 | .hueRotation(.degrees(viewState.width / 2)) 72 | ) 73 | .animation(.easeInOut(duration: 0.4), value: vm.selectedModal) 74 | } 75 | 76 | Button { 77 | vm.dismissModal() 78 | } label: { 79 | CloseButton() 80 | } 81 | .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topTrailing) 82 | .padding(.trailing) 83 | .offset(y: vm.appear ? 20 : -100) 84 | } 85 | .onAppear { 86 | withAnimation(.spring()) { 87 | vm.appear = true 88 | } 89 | withAnimation(.easeOut(duration: 2)) { 90 | vm.appearBackground = true 91 | } 92 | } 93 | } 94 | } 95 | 96 | #Preview { 97 | ModalView() 98 | .environmentObject(ContentViewModel()) 99 | } 100 | -------------------------------------------------------------------------------- /ImmersiveModal/Preview Content/Preview Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /ImmersiveModal/ResumeView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ResumeView.swift 3 | // ImmersiveModal 4 | // 5 | // Created by Zelyna Sillas on 9/8/23. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct ResumeView: View { 11 | @EnvironmentObject var vm: ContentViewModel 12 | 13 | var body: some View { 14 | VStack(alignment: .leading) { 15 | Text("Resume") 16 | .font(.largeTitle).bold() 17 | .blendMode(.overlay) 18 | .padding(.bottom) 19 | .slideFadeIn(show: vm.contentAppear[0], offset: 30) 20 | 21 | Text("Snowdays Foundation | 2015 - 2023") 22 | .font(.headline) 23 | .foregroundColor(.primary.opacity(0.8)) 24 | .padding(.bottom, 1) 25 | .slideFadeIn(show: vm.contentAppear[1], offset: 20) 26 | VStack(alignment: .leading, spacing: 5) { 27 | Text("**•** Senior Director of Public Relations") 28 | Text("**•** Senior Director of Program Development") 29 | Text("**•** Board Member") 30 | } 31 | .font(.subheadline) 32 | .foregroundColor(.primary.opacity(0.7)) 33 | .padding(.bottom, 10) 34 | .slideFadeIn(show: vm.contentAppear[1], offset: 15) 35 | 36 | 37 | Text("Nike | 2018 - 2021") 38 | .font(.headline) 39 | .foregroundColor(.primary.opacity(0.8)) 40 | .padding(.bottom, 1) 41 | .slideFadeIn(show: vm.contentAppear[2], offset: 20) 42 | VStack(alignment: .leading, spacing: 5) { 43 | Text("**•** Project Manager and Marketing Strategist") 44 | Text("**•** Logistics, Communications, and Operations Lead") 45 | Text("**•** Photo Studio Stylist Lead") 46 | } 47 | .font(.subheadline) 48 | .foregroundColor(.primary.opacity(0.7)) 49 | .padding(.bottom, 10) 50 | .slideFadeIn(show: vm.contentAppear[2], offset: 15) 51 | 52 | 53 | Text("Anthropologie | 2017 - 2018") 54 | .font(.headline) 55 | .foregroundColor(.primary.opacity(0.8)) 56 | .padding(.bottom, 1) 57 | .slideFadeIn(show: vm.contentAppear[3], offset: 20) 58 | VStack(alignment: .leading, spacing: 5) { 59 | Text("**•** Apparel Manager") 60 | Text("**•** Visual Merchandising Team Lead") 61 | } 62 | .font(.subheadline) 63 | .foregroundColor(.primary.opacity(0.7)) 64 | .padding(.bottom, 10) 65 | .slideFadeIn(show: vm.contentAppear[3], offset: 15) 66 | 67 | Text("Dr.Martens | 2017 - 2018") 68 | .font(.headline) 69 | .foregroundColor(.primary.opacity(0.8)) 70 | .slideFadeIn(show: vm.contentAppear[4], offset: 20) 71 | Text("**•** Assistant Store Manager") 72 | .font(.subheadline) 73 | .foregroundColor(.primary.opacity(0.7)) 74 | .padding(.bottom, 10) 75 | .slideFadeIn(show: vm.contentAppear[4], offset: 15) 76 | 77 | Text("AllSaints | 2016 - 2017") 78 | .font(.headline) 79 | .foregroundColor(.primary.opacity(0.8)) 80 | .slideFadeIn(show: vm.contentAppear[5], offset: 20) 81 | Text("**•** Brand Stylist") 82 | .font(.subheadline) 83 | .foregroundColor(.primary.opacity(0.7)) 84 | .padding(.bottom, 10) 85 | .slideFadeIn(show: vm.contentAppear[5], offset: 15) 86 | 87 | Text("Urban Outfitters | 2012 - 2016") 88 | .font(.headline) 89 | .foregroundColor(.primary.opacity(0.8)) 90 | .padding(.bottom, 1) 91 | .slideFadeIn(show: vm.contentAppear[6], offset: 20) 92 | VStack(alignment: .leading, spacing: 5) { 93 | Text("**•** Visual Merchandising Team Lead") 94 | Text("**•** Stylist Program Director") 95 | } 96 | .font(.subheadline) 97 | .foregroundColor(.primary.opacity(0.7)) 98 | .padding(.bottom, 10) 99 | .slideFadeIn(show: vm.contentAppear[6], offset: 15) 100 | 101 | 102 | Divider() 103 | .padding(.bottom, 8) 104 | 105 | Text("Want more formal content? **Cover Letter**") 106 | .font(.footnote) 107 | .foregroundColor(.primary.opacity(0.7)) 108 | .accentColor(.primary.opacity(0.7)) 109 | .onTapGesture { 110 | vm.contentAppear = Array(repeating: false, count: 7) 111 | 112 | DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { 113 | withAnimation(.easeInOut(duration: 0.8)) { 114 | vm.selectedModal = .coverLetter 115 | } 116 | } 117 | } 118 | } 119 | .padding(20) 120 | .padding(.vertical, 10) 121 | .background(.ultraThinMaterial) 122 | .cornerRadius(30) 123 | .background( 124 | VStack { 125 | Circle().fill(vm.isInDarkMode ? .blue : .purple).frame(width: 88, height: 88) 126 | .offset(x: 0, y: 0) 127 | .scaleEffect(vm.contentAppear[0] ? 1 : 0.1) 128 | } 129 | .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading) 130 | ) 131 | .modifier(OutlineModifier(cornerRadius: 30)) 132 | .onAppear { vm.animateView() } 133 | .frame(height: 770) 134 | } 135 | 136 | 137 | } 138 | 139 | #Preview { 140 | ResumeView() 141 | .environmentObject(ContentViewModel()) 142 | } 143 | 144 | 145 | struct SlideFadeIn: ViewModifier { 146 | var show: Bool 147 | var offset: Double 148 | 149 | func body(content: Content) -> some View { 150 | content 151 | .opacity(show ? 1 : 0) 152 | .offset(y: show ? 0 : offset) 153 | } 154 | } 155 | extension View { 156 | func slideFadeIn(show: Bool, offset: Double = 10) -> some View { 157 | self.modifier(SlideFadeIn(show: show, offset: offset)) 158 | } 159 | } 160 | 161 | 162 | struct OutlineModifier: ViewModifier { 163 | @Environment(\.colorScheme) var colorScheme 164 | var cornerRadius: CGFloat = 20 165 | 166 | func body(content: Content) -> some View { 167 | content.overlay( 168 | RoundedRectangle(cornerRadius: cornerRadius) 169 | .stroke( 170 | .linearGradient( 171 | colors: [ 172 | .white.opacity(colorScheme == .dark ? 0.1 : 0.3), 173 | .black.opacity(0.1)], 174 | startPoint: .topLeading, 175 | endPoint: .bottomTrailing) 176 | ) 177 | ) 178 | } 179 | } 180 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | #

Immersive Modal Experience with Custom Animations

2 | 3 | 4 | ####

This mini project showcases a captivating and dynamic modal view with custom animations, incorporating interactive drag and hue effects for an engaging user experience in both light and dark mode. 5 |

6 | 7 |
8 | 9 | ## **Features** 10 | - **Custom Animation Effects:** Utilizes SwiftUI animations for an engaging user experience. 11 | - **Hue and Drag Effects:** Incorporates dynamic color adjustments and drag gestures. 12 | - **Modal Views:** Presents different views (Resume, Cover Letter, etc.) within a modal interface. 13 | - **Dismissal Gesture:** Allows users to dismiss the modal view with a swipe gesture. 14 | - **Close Button:** Provides an option to close the modal view. 15 | - **Light and Dark Mode:** Toggle between light and dark mode to allow users to view the content and hues in different color palettes. 16 | 17 | 18 |
19 | 20 | ### **Videos and Demos** 21 | 22 | | Resume | Cover Letter | 23 | |:---------------:|:----------------:| 24 | ||| 25 | 26 | 27 |
28 | 29 | | Light | Dark | 30 | |:---------------:|:----------------:| 31 | ||| 32 | 33 |
34 | 35 | ### **How It Works** 36 | - The ModalView struct is at the heart of the project, utilizing SwiftUI to create a dynamic modal interface. 37 | - It employs an EnvironmentObject to manage the application's environment, including appearance states. 38 | - The DragGesture allows users to interact with the modal by dragging it, while custom animations respond to the gestures. 39 | - Different modal views (e.g., Resume, Cover Letter) are presented within the GeometryReader, each with its own unique appearance and content. 40 | - Shadows, rotations, and hue adjustments are applied to the views to create engaging visual effects. 41 | - A dismiss gesture is implemented, allowing users to close the modal with a swipe. 42 | - The project encourages further customization, enabling developers to integrate the ModalView into their own applications. 43 | - The ContentView exemplifies how to incorporate the ModalView within an app, passing the necessary environment object. 44 | 45 | By combining SwiftUI's powerful animation capabilities with gesture recognition, the project provides an immersive user experience within a modal context. Developers can leverage this structure to create interactive, visually engaging interfaces for their applications. 46 | 47 |
48 | 49 | ### **How to Use** 50 | 1. Clone the repository. 51 | 2. Open the project in Xcode. 52 | --------------------------------------------------------------------------------