├── Pokemon Card.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── xcuserdata │ └── vinoth.xcuserdatad │ └── xcschemes │ └── xcschememanagement.plist ├── Pokemon Card ├── Assets.xcassets │ ├── AccentColor.colorset │ │ └── Contents.json │ ├── AppIcon.appiconset │ │ └── Contents.json │ ├── Contents.json │ ├── cardbg.imageset │ │ ├── Contents.json │ │ └── cardbg.png │ ├── charizard.imageset │ │ ├── Contents.json │ │ └── charizard.png │ └── glow.imageset │ │ ├── Contents.json │ │ └── glow.png ├── ContentView.swift ├── Pokemon_CardApp.swift └── Preview Content │ └── Preview Assets.xcassets │ └── Contents.json ├── Pokemon CardTests └── Pokemon_CardTests.swift ├── Pokemon CardUITests ├── Pokemon_CardUITests.swift └── Pokemon_CardUITestsLaunchTests.swift └── README.md /Pokemon Card.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 56; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 18E6F73C2B6599D1004FB42B /* Pokemon_CardApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18E6F73B2B6599D1004FB42B /* Pokemon_CardApp.swift */; }; 11 | 18E6F73E2B6599D1004FB42B /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18E6F73D2B6599D1004FB42B /* ContentView.swift */; }; 12 | 18E6F7402B6599D3004FB42B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 18E6F73F2B6599D3004FB42B /* Assets.xcassets */; }; 13 | 18E6F7432B6599D3004FB42B /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 18E6F7422B6599D3004FB42B /* Preview Assets.xcassets */; }; 14 | 18E6F74D2B6599D3004FB42B /* Pokemon_CardTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18E6F74C2B6599D3004FB42B /* Pokemon_CardTests.swift */; }; 15 | 18E6F7572B6599D3004FB42B /* Pokemon_CardUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18E6F7562B6599D3004FB42B /* Pokemon_CardUITests.swift */; }; 16 | 18E6F7592B6599D3004FB42B /* Pokemon_CardUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18E6F7582B6599D3004FB42B /* Pokemon_CardUITestsLaunchTests.swift */; }; 17 | /* End PBXBuildFile section */ 18 | 19 | /* Begin PBXContainerItemProxy section */ 20 | 18E6F7492B6599D3004FB42B /* PBXContainerItemProxy */ = { 21 | isa = PBXContainerItemProxy; 22 | containerPortal = 18E6F7302B6599D1004FB42B /* Project object */; 23 | proxyType = 1; 24 | remoteGlobalIDString = 18E6F7372B6599D1004FB42B; 25 | remoteInfo = "Pokemon Card"; 26 | }; 27 | 18E6F7532B6599D3004FB42B /* PBXContainerItemProxy */ = { 28 | isa = PBXContainerItemProxy; 29 | containerPortal = 18E6F7302B6599D1004FB42B /* Project object */; 30 | proxyType = 1; 31 | remoteGlobalIDString = 18E6F7372B6599D1004FB42B; 32 | remoteInfo = "Pokemon Card"; 33 | }; 34 | /* End PBXContainerItemProxy section */ 35 | 36 | /* Begin PBXFileReference section */ 37 | 18E6F7382B6599D1004FB42B /* Pokemon Card.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Pokemon Card.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 38 | 18E6F73B2B6599D1004FB42B /* Pokemon_CardApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Pokemon_CardApp.swift; sourceTree = ""; }; 39 | 18E6F73D2B6599D1004FB42B /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; 40 | 18E6F73F2B6599D3004FB42B /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 41 | 18E6F7422B6599D3004FB42B /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; 42 | 18E6F7482B6599D3004FB42B /* Pokemon CardTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Pokemon CardTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 43 | 18E6F74C2B6599D3004FB42B /* Pokemon_CardTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Pokemon_CardTests.swift; sourceTree = ""; }; 44 | 18E6F7522B6599D3004FB42B /* Pokemon CardUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Pokemon CardUITests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 45 | 18E6F7562B6599D3004FB42B /* Pokemon_CardUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Pokemon_CardUITests.swift; sourceTree = ""; }; 46 | 18E6F7582B6599D3004FB42B /* Pokemon_CardUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Pokemon_CardUITestsLaunchTests.swift; sourceTree = ""; }; 47 | /* End PBXFileReference section */ 48 | 49 | /* Begin PBXFrameworksBuildPhase section */ 50 | 18E6F7352B6599D1004FB42B /* Frameworks */ = { 51 | isa = PBXFrameworksBuildPhase; 52 | buildActionMask = 2147483647; 53 | files = ( 54 | ); 55 | runOnlyForDeploymentPostprocessing = 0; 56 | }; 57 | 18E6F7452B6599D3004FB42B /* Frameworks */ = { 58 | isa = PBXFrameworksBuildPhase; 59 | buildActionMask = 2147483647; 60 | files = ( 61 | ); 62 | runOnlyForDeploymentPostprocessing = 0; 63 | }; 64 | 18E6F74F2B6599D3004FB42B /* Frameworks */ = { 65 | isa = PBXFrameworksBuildPhase; 66 | buildActionMask = 2147483647; 67 | files = ( 68 | ); 69 | runOnlyForDeploymentPostprocessing = 0; 70 | }; 71 | /* End PBXFrameworksBuildPhase section */ 72 | 73 | /* Begin PBXGroup section */ 74 | 18E6F72F2B6599D1004FB42B = { 75 | isa = PBXGroup; 76 | children = ( 77 | 18E6F73A2B6599D1004FB42B /* Pokemon Card */, 78 | 18E6F74B2B6599D3004FB42B /* Pokemon CardTests */, 79 | 18E6F7552B6599D3004FB42B /* Pokemon CardUITests */, 80 | 18E6F7392B6599D1004FB42B /* Products */, 81 | ); 82 | sourceTree = ""; 83 | }; 84 | 18E6F7392B6599D1004FB42B /* Products */ = { 85 | isa = PBXGroup; 86 | children = ( 87 | 18E6F7382B6599D1004FB42B /* Pokemon Card.app */, 88 | 18E6F7482B6599D3004FB42B /* Pokemon CardTests.xctest */, 89 | 18E6F7522B6599D3004FB42B /* Pokemon CardUITests.xctest */, 90 | ); 91 | name = Products; 92 | sourceTree = ""; 93 | }; 94 | 18E6F73A2B6599D1004FB42B /* Pokemon Card */ = { 95 | isa = PBXGroup; 96 | children = ( 97 | 18E6F73B2B6599D1004FB42B /* Pokemon_CardApp.swift */, 98 | 18E6F73D2B6599D1004FB42B /* ContentView.swift */, 99 | 18E6F73F2B6599D3004FB42B /* Assets.xcassets */, 100 | 18E6F7412B6599D3004FB42B /* Preview Content */, 101 | ); 102 | path = "Pokemon Card"; 103 | sourceTree = ""; 104 | }; 105 | 18E6F7412B6599D3004FB42B /* Preview Content */ = { 106 | isa = PBXGroup; 107 | children = ( 108 | 18E6F7422B6599D3004FB42B /* Preview Assets.xcassets */, 109 | ); 110 | path = "Preview Content"; 111 | sourceTree = ""; 112 | }; 113 | 18E6F74B2B6599D3004FB42B /* Pokemon CardTests */ = { 114 | isa = PBXGroup; 115 | children = ( 116 | 18E6F74C2B6599D3004FB42B /* Pokemon_CardTests.swift */, 117 | ); 118 | path = "Pokemon CardTests"; 119 | sourceTree = ""; 120 | }; 121 | 18E6F7552B6599D3004FB42B /* Pokemon CardUITests */ = { 122 | isa = PBXGroup; 123 | children = ( 124 | 18E6F7562B6599D3004FB42B /* Pokemon_CardUITests.swift */, 125 | 18E6F7582B6599D3004FB42B /* Pokemon_CardUITestsLaunchTests.swift */, 126 | ); 127 | path = "Pokemon CardUITests"; 128 | sourceTree = ""; 129 | }; 130 | /* End PBXGroup section */ 131 | 132 | /* Begin PBXNativeTarget section */ 133 | 18E6F7372B6599D1004FB42B /* Pokemon Card */ = { 134 | isa = PBXNativeTarget; 135 | buildConfigurationList = 18E6F75C2B6599D3004FB42B /* Build configuration list for PBXNativeTarget "Pokemon Card" */; 136 | buildPhases = ( 137 | 18E6F7342B6599D1004FB42B /* Sources */, 138 | 18E6F7352B6599D1004FB42B /* Frameworks */, 139 | 18E6F7362B6599D1004FB42B /* Resources */, 140 | ); 141 | buildRules = ( 142 | ); 143 | dependencies = ( 144 | ); 145 | name = "Pokemon Card"; 146 | productName = "Pokemon Card"; 147 | productReference = 18E6F7382B6599D1004FB42B /* Pokemon Card.app */; 148 | productType = "com.apple.product-type.application"; 149 | }; 150 | 18E6F7472B6599D3004FB42B /* Pokemon CardTests */ = { 151 | isa = PBXNativeTarget; 152 | buildConfigurationList = 18E6F75F2B6599D3004FB42B /* Build configuration list for PBXNativeTarget "Pokemon CardTests" */; 153 | buildPhases = ( 154 | 18E6F7442B6599D3004FB42B /* Sources */, 155 | 18E6F7452B6599D3004FB42B /* Frameworks */, 156 | 18E6F7462B6599D3004FB42B /* Resources */, 157 | ); 158 | buildRules = ( 159 | ); 160 | dependencies = ( 161 | 18E6F74A2B6599D3004FB42B /* PBXTargetDependency */, 162 | ); 163 | name = "Pokemon CardTests"; 164 | productName = "Pokemon CardTests"; 165 | productReference = 18E6F7482B6599D3004FB42B /* Pokemon CardTests.xctest */; 166 | productType = "com.apple.product-type.bundle.unit-test"; 167 | }; 168 | 18E6F7512B6599D3004FB42B /* Pokemon CardUITests */ = { 169 | isa = PBXNativeTarget; 170 | buildConfigurationList = 18E6F7622B6599D3004FB42B /* Build configuration list for PBXNativeTarget "Pokemon CardUITests" */; 171 | buildPhases = ( 172 | 18E6F74E2B6599D3004FB42B /* Sources */, 173 | 18E6F74F2B6599D3004FB42B /* Frameworks */, 174 | 18E6F7502B6599D3004FB42B /* Resources */, 175 | ); 176 | buildRules = ( 177 | ); 178 | dependencies = ( 179 | 18E6F7542B6599D3004FB42B /* PBXTargetDependency */, 180 | ); 181 | name = "Pokemon CardUITests"; 182 | productName = "Pokemon CardUITests"; 183 | productReference = 18E6F7522B6599D3004FB42B /* Pokemon CardUITests.xctest */; 184 | productType = "com.apple.product-type.bundle.ui-testing"; 185 | }; 186 | /* End PBXNativeTarget section */ 187 | 188 | /* Begin PBXProject section */ 189 | 18E6F7302B6599D1004FB42B /* Project object */ = { 190 | isa = PBXProject; 191 | attributes = { 192 | BuildIndependentTargetsInParallel = 1; 193 | LastSwiftUpdateCheck = 1520; 194 | LastUpgradeCheck = 1520; 195 | TargetAttributes = { 196 | 18E6F7372B6599D1004FB42B = { 197 | CreatedOnToolsVersion = 15.2; 198 | }; 199 | 18E6F7472B6599D3004FB42B = { 200 | CreatedOnToolsVersion = 15.2; 201 | TestTargetID = 18E6F7372B6599D1004FB42B; 202 | }; 203 | 18E6F7512B6599D3004FB42B = { 204 | CreatedOnToolsVersion = 15.2; 205 | TestTargetID = 18E6F7372B6599D1004FB42B; 206 | }; 207 | }; 208 | }; 209 | buildConfigurationList = 18E6F7332B6599D1004FB42B /* Build configuration list for PBXProject "Pokemon Card" */; 210 | compatibilityVersion = "Xcode 14.0"; 211 | developmentRegion = en; 212 | hasScannedForEncodings = 0; 213 | knownRegions = ( 214 | en, 215 | Base, 216 | ); 217 | mainGroup = 18E6F72F2B6599D1004FB42B; 218 | productRefGroup = 18E6F7392B6599D1004FB42B /* Products */; 219 | projectDirPath = ""; 220 | projectRoot = ""; 221 | targets = ( 222 | 18E6F7372B6599D1004FB42B /* Pokemon Card */, 223 | 18E6F7472B6599D3004FB42B /* Pokemon CardTests */, 224 | 18E6F7512B6599D3004FB42B /* Pokemon CardUITests */, 225 | ); 226 | }; 227 | /* End PBXProject section */ 228 | 229 | /* Begin PBXResourcesBuildPhase section */ 230 | 18E6F7362B6599D1004FB42B /* Resources */ = { 231 | isa = PBXResourcesBuildPhase; 232 | buildActionMask = 2147483647; 233 | files = ( 234 | 18E6F7432B6599D3004FB42B /* Preview Assets.xcassets in Resources */, 235 | 18E6F7402B6599D3004FB42B /* Assets.xcassets in Resources */, 236 | ); 237 | runOnlyForDeploymentPostprocessing = 0; 238 | }; 239 | 18E6F7462B6599D3004FB42B /* Resources */ = { 240 | isa = PBXResourcesBuildPhase; 241 | buildActionMask = 2147483647; 242 | files = ( 243 | ); 244 | runOnlyForDeploymentPostprocessing = 0; 245 | }; 246 | 18E6F7502B6599D3004FB42B /* Resources */ = { 247 | isa = PBXResourcesBuildPhase; 248 | buildActionMask = 2147483647; 249 | files = ( 250 | ); 251 | runOnlyForDeploymentPostprocessing = 0; 252 | }; 253 | /* End PBXResourcesBuildPhase section */ 254 | 255 | /* Begin PBXSourcesBuildPhase section */ 256 | 18E6F7342B6599D1004FB42B /* Sources */ = { 257 | isa = PBXSourcesBuildPhase; 258 | buildActionMask = 2147483647; 259 | files = ( 260 | 18E6F73E2B6599D1004FB42B /* ContentView.swift in Sources */, 261 | 18E6F73C2B6599D1004FB42B /* Pokemon_CardApp.swift in Sources */, 262 | ); 263 | runOnlyForDeploymentPostprocessing = 0; 264 | }; 265 | 18E6F7442B6599D3004FB42B /* Sources */ = { 266 | isa = PBXSourcesBuildPhase; 267 | buildActionMask = 2147483647; 268 | files = ( 269 | 18E6F74D2B6599D3004FB42B /* Pokemon_CardTests.swift in Sources */, 270 | ); 271 | runOnlyForDeploymentPostprocessing = 0; 272 | }; 273 | 18E6F74E2B6599D3004FB42B /* Sources */ = { 274 | isa = PBXSourcesBuildPhase; 275 | buildActionMask = 2147483647; 276 | files = ( 277 | 18E6F7592B6599D3004FB42B /* Pokemon_CardUITestsLaunchTests.swift in Sources */, 278 | 18E6F7572B6599D3004FB42B /* Pokemon_CardUITests.swift in Sources */, 279 | ); 280 | runOnlyForDeploymentPostprocessing = 0; 281 | }; 282 | /* End PBXSourcesBuildPhase section */ 283 | 284 | /* Begin PBXTargetDependency section */ 285 | 18E6F74A2B6599D3004FB42B /* PBXTargetDependency */ = { 286 | isa = PBXTargetDependency; 287 | target = 18E6F7372B6599D1004FB42B /* Pokemon Card */; 288 | targetProxy = 18E6F7492B6599D3004FB42B /* PBXContainerItemProxy */; 289 | }; 290 | 18E6F7542B6599D3004FB42B /* PBXTargetDependency */ = { 291 | isa = PBXTargetDependency; 292 | target = 18E6F7372B6599D1004FB42B /* Pokemon Card */; 293 | targetProxy = 18E6F7532B6599D3004FB42B /* PBXContainerItemProxy */; 294 | }; 295 | /* End PBXTargetDependency section */ 296 | 297 | /* Begin XCBuildConfiguration section */ 298 | 18E6F75A2B6599D3004FB42B /* Debug */ = { 299 | isa = XCBuildConfiguration; 300 | buildSettings = { 301 | ALWAYS_SEARCH_USER_PATHS = NO; 302 | ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; 303 | CLANG_ANALYZER_NONNULL = YES; 304 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 305 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; 306 | CLANG_ENABLE_MODULES = YES; 307 | CLANG_ENABLE_OBJC_ARC = YES; 308 | CLANG_ENABLE_OBJC_WEAK = YES; 309 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 310 | CLANG_WARN_BOOL_CONVERSION = YES; 311 | CLANG_WARN_COMMA = YES; 312 | CLANG_WARN_CONSTANT_CONVERSION = YES; 313 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 314 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 315 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 316 | CLANG_WARN_EMPTY_BODY = YES; 317 | CLANG_WARN_ENUM_CONVERSION = YES; 318 | CLANG_WARN_INFINITE_RECURSION = YES; 319 | CLANG_WARN_INT_CONVERSION = YES; 320 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 321 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 322 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 323 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 324 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 325 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 326 | CLANG_WARN_STRICT_PROTOTYPES = YES; 327 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 328 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 329 | CLANG_WARN_UNREACHABLE_CODE = YES; 330 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 331 | COPY_PHASE_STRIP = NO; 332 | DEBUG_INFORMATION_FORMAT = dwarf; 333 | ENABLE_STRICT_OBJC_MSGSEND = YES; 334 | ENABLE_TESTABILITY = YES; 335 | ENABLE_USER_SCRIPT_SANDBOXING = YES; 336 | GCC_C_LANGUAGE_STANDARD = gnu17; 337 | GCC_DYNAMIC_NO_PIC = NO; 338 | GCC_NO_COMMON_BLOCKS = YES; 339 | GCC_OPTIMIZATION_LEVEL = 0; 340 | GCC_PREPROCESSOR_DEFINITIONS = ( 341 | "DEBUG=1", 342 | "$(inherited)", 343 | ); 344 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 345 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 346 | GCC_WARN_UNDECLARED_SELECTOR = YES; 347 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 348 | GCC_WARN_UNUSED_FUNCTION = YES; 349 | GCC_WARN_UNUSED_VARIABLE = YES; 350 | IPHONEOS_DEPLOYMENT_TARGET = 17.2; 351 | LOCALIZATION_PREFERS_STRING_CATALOGS = YES; 352 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 353 | MTL_FAST_MATH = YES; 354 | ONLY_ACTIVE_ARCH = YES; 355 | SDKROOT = iphoneos; 356 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; 357 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 358 | }; 359 | name = Debug; 360 | }; 361 | 18E6F75B2B6599D3004FB42B /* Release */ = { 362 | isa = XCBuildConfiguration; 363 | buildSettings = { 364 | ALWAYS_SEARCH_USER_PATHS = NO; 365 | ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; 366 | CLANG_ANALYZER_NONNULL = YES; 367 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 368 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; 369 | CLANG_ENABLE_MODULES = YES; 370 | CLANG_ENABLE_OBJC_ARC = YES; 371 | CLANG_ENABLE_OBJC_WEAK = YES; 372 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 373 | CLANG_WARN_BOOL_CONVERSION = YES; 374 | CLANG_WARN_COMMA = YES; 375 | CLANG_WARN_CONSTANT_CONVERSION = YES; 376 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 377 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 378 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 379 | CLANG_WARN_EMPTY_BODY = YES; 380 | CLANG_WARN_ENUM_CONVERSION = YES; 381 | CLANG_WARN_INFINITE_RECURSION = YES; 382 | CLANG_WARN_INT_CONVERSION = YES; 383 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 384 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 385 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 386 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 387 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 388 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 389 | CLANG_WARN_STRICT_PROTOTYPES = YES; 390 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 391 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 392 | CLANG_WARN_UNREACHABLE_CODE = YES; 393 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 394 | COPY_PHASE_STRIP = NO; 395 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 396 | ENABLE_NS_ASSERTIONS = NO; 397 | ENABLE_STRICT_OBJC_MSGSEND = YES; 398 | ENABLE_USER_SCRIPT_SANDBOXING = YES; 399 | GCC_C_LANGUAGE_STANDARD = gnu17; 400 | GCC_NO_COMMON_BLOCKS = YES; 401 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 402 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 403 | GCC_WARN_UNDECLARED_SELECTOR = YES; 404 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 405 | GCC_WARN_UNUSED_FUNCTION = YES; 406 | GCC_WARN_UNUSED_VARIABLE = YES; 407 | IPHONEOS_DEPLOYMENT_TARGET = 17.2; 408 | LOCALIZATION_PREFERS_STRING_CATALOGS = YES; 409 | MTL_ENABLE_DEBUG_INFO = NO; 410 | MTL_FAST_MATH = YES; 411 | SDKROOT = iphoneos; 412 | SWIFT_COMPILATION_MODE = wholemodule; 413 | VALIDATE_PRODUCT = YES; 414 | }; 415 | name = Release; 416 | }; 417 | 18E6F75D2B6599D3004FB42B /* Debug */ = { 418 | isa = XCBuildConfiguration; 419 | buildSettings = { 420 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 421 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 422 | CODE_SIGN_STYLE = Automatic; 423 | CURRENT_PROJECT_VERSION = 1; 424 | DEVELOPMENT_ASSET_PATHS = "\"Pokemon Card/Preview Content\""; 425 | DEVELOPMENT_TEAM = 5NV8N7BRAH; 426 | ENABLE_PREVIEWS = YES; 427 | GENERATE_INFOPLIST_FILE = YES; 428 | INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; 429 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; 430 | INFOPLIST_KEY_UILaunchScreen_Generation = YES; 431 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 432 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 433 | LD_RUNPATH_SEARCH_PATHS = ( 434 | "$(inherited)", 435 | "@executable_path/Frameworks", 436 | ); 437 | MARKETING_VERSION = 1.0; 438 | PRODUCT_BUNDLE_IDENTIFIER = "Me.Pokemon-Card"; 439 | PRODUCT_NAME = "$(TARGET_NAME)"; 440 | SWIFT_EMIT_LOC_STRINGS = YES; 441 | SWIFT_VERSION = 5.0; 442 | TARGETED_DEVICE_FAMILY = "1,2"; 443 | }; 444 | name = Debug; 445 | }; 446 | 18E6F75E2B6599D3004FB42B /* Release */ = { 447 | isa = XCBuildConfiguration; 448 | buildSettings = { 449 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 450 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 451 | CODE_SIGN_STYLE = Automatic; 452 | CURRENT_PROJECT_VERSION = 1; 453 | DEVELOPMENT_ASSET_PATHS = "\"Pokemon Card/Preview Content\""; 454 | DEVELOPMENT_TEAM = 5NV8N7BRAH; 455 | ENABLE_PREVIEWS = YES; 456 | GENERATE_INFOPLIST_FILE = YES; 457 | INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; 458 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; 459 | INFOPLIST_KEY_UILaunchScreen_Generation = YES; 460 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 461 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 462 | LD_RUNPATH_SEARCH_PATHS = ( 463 | "$(inherited)", 464 | "@executable_path/Frameworks", 465 | ); 466 | MARKETING_VERSION = 1.0; 467 | PRODUCT_BUNDLE_IDENTIFIER = "Me.Pokemon-Card"; 468 | PRODUCT_NAME = "$(TARGET_NAME)"; 469 | SWIFT_EMIT_LOC_STRINGS = YES; 470 | SWIFT_VERSION = 5.0; 471 | TARGETED_DEVICE_FAMILY = "1,2"; 472 | }; 473 | name = Release; 474 | }; 475 | 18E6F7602B6599D3004FB42B /* Debug */ = { 476 | isa = XCBuildConfiguration; 477 | buildSettings = { 478 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 479 | BUNDLE_LOADER = "$(TEST_HOST)"; 480 | CODE_SIGN_STYLE = Automatic; 481 | CURRENT_PROJECT_VERSION = 1; 482 | GENERATE_INFOPLIST_FILE = YES; 483 | IPHONEOS_DEPLOYMENT_TARGET = 17.2; 484 | MARKETING_VERSION = 1.0; 485 | PRODUCT_BUNDLE_IDENTIFIER = "Me.Pokemon-CardTests"; 486 | PRODUCT_NAME = "$(TARGET_NAME)"; 487 | SWIFT_EMIT_LOC_STRINGS = NO; 488 | SWIFT_VERSION = 5.0; 489 | TARGETED_DEVICE_FAMILY = "1,2"; 490 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Pokemon Card.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Pokemon Card"; 491 | }; 492 | name = Debug; 493 | }; 494 | 18E6F7612B6599D3004FB42B /* Release */ = { 495 | isa = XCBuildConfiguration; 496 | buildSettings = { 497 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 498 | BUNDLE_LOADER = "$(TEST_HOST)"; 499 | CODE_SIGN_STYLE = Automatic; 500 | CURRENT_PROJECT_VERSION = 1; 501 | GENERATE_INFOPLIST_FILE = YES; 502 | IPHONEOS_DEPLOYMENT_TARGET = 17.2; 503 | MARKETING_VERSION = 1.0; 504 | PRODUCT_BUNDLE_IDENTIFIER = "Me.Pokemon-CardTests"; 505 | PRODUCT_NAME = "$(TARGET_NAME)"; 506 | SWIFT_EMIT_LOC_STRINGS = NO; 507 | SWIFT_VERSION = 5.0; 508 | TARGETED_DEVICE_FAMILY = "1,2"; 509 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Pokemon Card.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Pokemon Card"; 510 | }; 511 | name = Release; 512 | }; 513 | 18E6F7632B6599D3004FB42B /* Debug */ = { 514 | isa = XCBuildConfiguration; 515 | buildSettings = { 516 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 517 | CODE_SIGN_STYLE = Automatic; 518 | CURRENT_PROJECT_VERSION = 1; 519 | GENERATE_INFOPLIST_FILE = YES; 520 | MARKETING_VERSION = 1.0; 521 | PRODUCT_BUNDLE_IDENTIFIER = "Me.Pokemon-CardUITests"; 522 | PRODUCT_NAME = "$(TARGET_NAME)"; 523 | SWIFT_EMIT_LOC_STRINGS = NO; 524 | SWIFT_VERSION = 5.0; 525 | TARGETED_DEVICE_FAMILY = "1,2"; 526 | TEST_TARGET_NAME = "Pokemon Card"; 527 | }; 528 | name = Debug; 529 | }; 530 | 18E6F7642B6599D3004FB42B /* Release */ = { 531 | isa = XCBuildConfiguration; 532 | buildSettings = { 533 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 534 | CODE_SIGN_STYLE = Automatic; 535 | CURRENT_PROJECT_VERSION = 1; 536 | GENERATE_INFOPLIST_FILE = YES; 537 | MARKETING_VERSION = 1.0; 538 | PRODUCT_BUNDLE_IDENTIFIER = "Me.Pokemon-CardUITests"; 539 | PRODUCT_NAME = "$(TARGET_NAME)"; 540 | SWIFT_EMIT_LOC_STRINGS = NO; 541 | SWIFT_VERSION = 5.0; 542 | TARGETED_DEVICE_FAMILY = "1,2"; 543 | TEST_TARGET_NAME = "Pokemon Card"; 544 | }; 545 | name = Release; 546 | }; 547 | /* End XCBuildConfiguration section */ 548 | 549 | /* Begin XCConfigurationList section */ 550 | 18E6F7332B6599D1004FB42B /* Build configuration list for PBXProject "Pokemon Card" */ = { 551 | isa = XCConfigurationList; 552 | buildConfigurations = ( 553 | 18E6F75A2B6599D3004FB42B /* Debug */, 554 | 18E6F75B2B6599D3004FB42B /* Release */, 555 | ); 556 | defaultConfigurationIsVisible = 0; 557 | defaultConfigurationName = Release; 558 | }; 559 | 18E6F75C2B6599D3004FB42B /* Build configuration list for PBXNativeTarget "Pokemon Card" */ = { 560 | isa = XCConfigurationList; 561 | buildConfigurations = ( 562 | 18E6F75D2B6599D3004FB42B /* Debug */, 563 | 18E6F75E2B6599D3004FB42B /* Release */, 564 | ); 565 | defaultConfigurationIsVisible = 0; 566 | defaultConfigurationName = Release; 567 | }; 568 | 18E6F75F2B6599D3004FB42B /* Build configuration list for PBXNativeTarget "Pokemon CardTests" */ = { 569 | isa = XCConfigurationList; 570 | buildConfigurations = ( 571 | 18E6F7602B6599D3004FB42B /* Debug */, 572 | 18E6F7612B6599D3004FB42B /* Release */, 573 | ); 574 | defaultConfigurationIsVisible = 0; 575 | defaultConfigurationName = Release; 576 | }; 577 | 18E6F7622B6599D3004FB42B /* Build configuration list for PBXNativeTarget "Pokemon CardUITests" */ = { 578 | isa = XCConfigurationList; 579 | buildConfigurations = ( 580 | 18E6F7632B6599D3004FB42B /* Debug */, 581 | 18E6F7642B6599D3004FB42B /* Release */, 582 | ); 583 | defaultConfigurationIsVisible = 0; 584 | defaultConfigurationName = Release; 585 | }; 586 | /* End XCConfigurationList section */ 587 | }; 588 | rootObject = 18E6F7302B6599D1004FB42B /* Project object */; 589 | } 590 | -------------------------------------------------------------------------------- /Pokemon Card.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Pokemon Card.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Pokemon Card.xcodeproj/xcuserdata/vinoth.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Pokemon Card.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /Pokemon Card/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 | -------------------------------------------------------------------------------- /Pokemon Card/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 | -------------------------------------------------------------------------------- /Pokemon Card/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Pokemon Card/Assets.xcassets/cardbg.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "cardbg.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 | -------------------------------------------------------------------------------- /Pokemon Card/Assets.xcassets/cardbg.imageset/cardbg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/helvetiica/PokemonCard/ff64edb719b3d0bee8d437e6f543f0f26db1a8a0/Pokemon Card/Assets.xcassets/cardbg.imageset/cardbg.png -------------------------------------------------------------------------------- /Pokemon Card/Assets.xcassets/charizard.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "charizard.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 | -------------------------------------------------------------------------------- /Pokemon Card/Assets.xcassets/charizard.imageset/charizard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/helvetiica/PokemonCard/ff64edb719b3d0bee8d437e6f543f0f26db1a8a0/Pokemon Card/Assets.xcassets/charizard.imageset/charizard.png -------------------------------------------------------------------------------- /Pokemon Card/Assets.xcassets/glow.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "glow.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 | -------------------------------------------------------------------------------- /Pokemon Card/Assets.xcassets/glow.imageset/glow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/helvetiica/PokemonCard/ff64edb719b3d0bee8d437e6f543f0f26db1a8a0/Pokemon Card/Assets.xcassets/glow.imageset/glow.png -------------------------------------------------------------------------------- /Pokemon Card/ContentView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentView.swift 3 | // Pokemon Card 4 | // 5 | // Created by Vinoth Ragunathan on 2024-01-27. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct ContentView: View { 11 | @State var ValueTranslation : CGSize = .zero 12 | @State var isDragging = false 13 | var body: some View { 14 | ZStack{ 15 | Image("cardbg").resizable().scaledToFill() 16 | .frame(width: 316, height: 417) 17 | .overlay( 18 | Rectangle() 19 | .frame(width: 300, height: 50) 20 | // Remove .colorInvert() if it displays the 'shine' in dark shade on device 21 | .colorInvert() 22 | .blur(radius: 50) 23 | .offset(x: -ValueTranslation.width / 1.5, y: -ValueTranslation.height / 1.5) 24 | 25 | ) 26 | .clipped() 27 | Image("charizard").resizable().scaledToFill() 28 | .offset(x: 20, y: -70) 29 | .frame(width: 160, height: 160) 30 | .offset(x: ValueTranslation.width / 30, y: ValueTranslation.height / 30) 31 | 32 | } 33 | 34 | .frame(width: 1000, height: 1000) 35 | .background(.black) 36 | 37 | .rotation3DEffect( 38 | .degrees(isDragging ? 10 : 0), 39 | axis: (x: -ValueTranslation.height, y: ValueTranslation.width, z: 0.0) 40 | ) 41 | .gesture(DragGesture() 42 | .onChanged({ value in 43 | withAnimation { 44 | ValueTranslation = value.translation 45 | isDragging = true 46 | } 47 | }) 48 | .onEnded({ vaule in 49 | withAnimation { 50 | ValueTranslation = .zero 51 | isDragging = false 52 | } 53 | }) 54 | ) 55 | } 56 | } 57 | 58 | #Preview { 59 | ContentView() 60 | } 61 | -------------------------------------------------------------------------------- /Pokemon Card/Pokemon_CardApp.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Pokemon_CardApp.swift 3 | // Pokemon Card 4 | // 5 | // Created by Vinoth Ragunathan on 2024-01-27. 6 | // 7 | 8 | import SwiftUI 9 | 10 | @main 11 | struct Pokemon_CardApp: App { 12 | var body: some Scene { 13 | WindowGroup { 14 | ContentView() 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Pokemon Card/Preview Content/Preview Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Pokemon CardTests/Pokemon_CardTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Pokemon_CardTests.swift 3 | // Pokemon CardTests 4 | // 5 | // Created by Vinoth Ragunathan on 2024-01-27. 6 | // 7 | 8 | import XCTest 9 | @testable import Pokemon_Card 10 | 11 | final class Pokemon_CardTests: XCTestCase { 12 | 13 | override func setUpWithError() throws { 14 | // Put setup code here. This method is called before the invocation of each test method in the class. 15 | } 16 | 17 | override func tearDownWithError() throws { 18 | // Put teardown code here. This method is called after the invocation of each test method in the class. 19 | } 20 | 21 | func testExample() throws { 22 | // This is an example of a functional test case. 23 | // Use XCTAssert and related functions to verify your tests produce the correct results. 24 | // Any test you write for XCTest can be annotated as throws and async. 25 | // Mark your test throws to produce an unexpected failure when your test encounters an uncaught error. 26 | // Mark your test async to allow awaiting for asynchronous code to complete. Check the results with assertions afterwards. 27 | } 28 | 29 | func testPerformanceExample() throws { 30 | // This is an example of a performance test case. 31 | self.measure { 32 | // Put the code you want to measure the time of here. 33 | } 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /Pokemon CardUITests/Pokemon_CardUITests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Pokemon_CardUITests.swift 3 | // Pokemon CardUITests 4 | // 5 | // Created by Vinoth Ragunathan on 2024-01-27. 6 | // 7 | 8 | import XCTest 9 | 10 | final class Pokemon_CardUITests: XCTestCase { 11 | 12 | override func setUpWithError() throws { 13 | // Put setup code here. This method is called before the invocation of each test method in the class. 14 | 15 | // In UI tests it is usually best to stop immediately when a failure occurs. 16 | continueAfterFailure = false 17 | 18 | // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. 19 | } 20 | 21 | override func tearDownWithError() throws { 22 | // Put teardown code here. This method is called after the invocation of each test method in the class. 23 | } 24 | 25 | func testExample() throws { 26 | // UI tests must launch the application that they test. 27 | let app = XCUIApplication() 28 | app.launch() 29 | 30 | // Use XCTAssert and related functions to verify your tests produce the correct results. 31 | } 32 | 33 | func testLaunchPerformance() throws { 34 | if #available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 7.0, *) { 35 | // This measures how long it takes to launch your application. 36 | measure(metrics: [XCTApplicationLaunchMetric()]) { 37 | XCUIApplication().launch() 38 | } 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /Pokemon CardUITests/Pokemon_CardUITestsLaunchTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Pokemon_CardUITestsLaunchTests.swift 3 | // Pokemon CardUITests 4 | // 5 | // Created by Vinoth Ragunathan on 2024-01-27. 6 | // 7 | 8 | import XCTest 9 | 10 | final class Pokemon_CardUITestsLaunchTests: XCTestCase { 11 | 12 | override class var runsForEachTargetApplicationUIConfiguration: Bool { 13 | true 14 | } 15 | 16 | override func setUpWithError() throws { 17 | continueAfterFailure = false 18 | } 19 | 20 | func testLaunch() throws { 21 | let app = XCUIApplication() 22 | app.launch() 23 | 24 | // Insert steps here to perform after app launch but before taking a screenshot, 25 | // such as logging into a test account or navigating somewhere in the app 26 | 27 | let attachment = XCTAttachment(screenshot: app.screenshot()) 28 | attachment.name = "Launch Screen" 29 | attachment.lifetime = .keepAlways 30 | add(attachment) 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 3D Pokemon Card using SwiftUI 2 | 3 | A fun little project to demonstrate the implementation of a parallax effect on one of my favorite Pokemon cards using SwiftUI 💖 4 | 5 | ## Features 6 | 7 | - Parallax Effect: Utilizes SwiftUI animations to create a parallax effect on the Charizard card. 8 | - Modular Design: The code is organized in a modular and reusable manner, making it easy to integrate the parallax effect into other SwiftUI projects. 9 | - Customizable: Easily customize the Pokemon card by updating the content and images _(cardbg.png & charizard.png)_ with your favorite Pokemon. 10 | 11 | https://github.com/helvetiica/PokemonCard/assets/25916443/d00bbb56-d031-4cae-bfc1-dc26ca4ffdf4 12 | 13 | 14 | 15 | --------------------------------------------------------------------------------