├── Finance.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── swiftpm │ │ └── Package.resolved └── xcuserdata │ └── mac.xcuserdatad │ ├── xcdebugger │ └── Breakpoints_v2.xcbkptlist │ └── xcschemes │ └── xcschememanagement.plist ├── Finance ├── Assets.xcassets │ ├── AccentColor.colorset │ │ └── Contents.json │ ├── AppIcon.appiconset │ │ └── Contents.json │ ├── Contents.json │ └── onBoarding.imageset │ │ ├── Contents.json │ │ └── undraw_Savings_dwkw.png ├── ContentView.swift ├── FinanceApp.swift ├── Info.plist ├── Preview Content │ └── Preview Assets.xcassets │ │ └── Contents.json └── View │ ├── Main.swift │ ├── OnBoarding.swift │ └── Shapes.swift ├── FinanceW ├── Assets.xcassets │ ├── AccentColor.colorset │ │ └── Contents.json │ ├── AppIcon.appiconset │ │ └── Contents.json │ ├── Contents.json │ ├── Image.imageset │ │ ├── 6794578_preview.png │ │ └── Contents.json │ └── WidgetBackground.colorset │ │ └── Contents.json ├── FinanceW.swift └── Info.plist └── README.md /Finance.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 52; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 046C6F3B24CCA30F009AF802 /* FinanceApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 046C6F3A24CCA30F009AF802 /* FinanceApp.swift */; }; 11 | 046C6F3D24CCA30F009AF802 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 046C6F3C24CCA30F009AF802 /* ContentView.swift */; }; 12 | 046C6F3F24CCA310009AF802 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 046C6F3E24CCA310009AF802 /* Assets.xcassets */; }; 13 | 046C6F4224CCA310009AF802 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 046C6F4124CCA310009AF802 /* Preview Assets.xcassets */; }; 14 | 046C6F4D24CCA38F009AF802 /* OnBoarding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 046C6F4C24CCA38F009AF802 /* OnBoarding.swift */; }; 15 | 046C6F4F24CCA579009AF802 /* Main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 046C6F4E24CCA579009AF802 /* Main.swift */; }; 16 | 0496177E24D084FF00EFE7B4 /* Progress-Bar in Frameworks */ = {isa = PBXBuildFile; productRef = 0496177D24D084FF00EFE7B4 /* Progress-Bar */; }; 17 | 04F003F924D1D8A500FA8E9B /* SwiftUICharts in Frameworks */ = {isa = PBXBuildFile; productRef = 04F003F824D1D8A500FA8E9B /* SwiftUICharts */; }; 18 | 04F003FB24D1E4C400FA8E9B /* Shapes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04F003FA24D1E4C400FA8E9B /* Shapes.swift */; }; 19 | 04F0040324D1E63600FA8E9B /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 04F0040224D1E63600FA8E9B /* WidgetKit.framework */; }; 20 | 04F0040524D1E63600FA8E9B /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 04F0040424D1E63600FA8E9B /* SwiftUI.framework */; }; 21 | 04F0040824D1E63600FA8E9B /* FinanceW.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04F0040724D1E63600FA8E9B /* FinanceW.swift */; }; 22 | 04F0040A24D1E63700FA8E9B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 04F0040924D1E63700FA8E9B /* Assets.xcassets */; }; 23 | 04F0040E24D1E63700FA8E9B /* FinanceWExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 04F0040024D1E63600FA8E9B /* FinanceWExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 24 | /* End PBXBuildFile section */ 25 | 26 | /* Begin PBXContainerItemProxy section */ 27 | 04F0040C24D1E63700FA8E9B /* PBXContainerItemProxy */ = { 28 | isa = PBXContainerItemProxy; 29 | containerPortal = 046C6F2F24CCA30F009AF802 /* Project object */; 30 | proxyType = 1; 31 | remoteGlobalIDString = 04F003FF24D1E63600FA8E9B; 32 | remoteInfo = FinanceWExtension; 33 | }; 34 | /* End PBXContainerItemProxy section */ 35 | 36 | /* Begin PBXCopyFilesBuildPhase section */ 37 | 04F0041224D1E63700FA8E9B /* Embed App Extensions */ = { 38 | isa = PBXCopyFilesBuildPhase; 39 | buildActionMask = 2147483647; 40 | dstPath = ""; 41 | dstSubfolderSpec = 13; 42 | files = ( 43 | 04F0040E24D1E63700FA8E9B /* FinanceWExtension.appex in Embed App Extensions */, 44 | ); 45 | name = "Embed App Extensions"; 46 | runOnlyForDeploymentPostprocessing = 0; 47 | }; 48 | /* End PBXCopyFilesBuildPhase section */ 49 | 50 | /* Begin PBXFileReference section */ 51 | 046C6F3724CCA30F009AF802 /* Finance.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Finance.app; sourceTree = BUILT_PRODUCTS_DIR; }; 52 | 046C6F3A24CCA30F009AF802 /* FinanceApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FinanceApp.swift; sourceTree = ""; }; 53 | 046C6F3C24CCA30F009AF802 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; 54 | 046C6F3E24CCA310009AF802 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 55 | 046C6F4124CCA310009AF802 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; 56 | 046C6F4324CCA310009AF802 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 57 | 046C6F4C24CCA38F009AF802 /* OnBoarding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnBoarding.swift; sourceTree = ""; }; 58 | 046C6F4E24CCA579009AF802 /* Main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Main.swift; sourceTree = ""; }; 59 | 04F003FA24D1E4C400FA8E9B /* Shapes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Shapes.swift; sourceTree = ""; }; 60 | 04F0040024D1E63600FA8E9B /* FinanceWExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = FinanceWExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; 61 | 04F0040224D1E63600FA8E9B /* WidgetKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WidgetKit.framework; path = System/Library/Frameworks/WidgetKit.framework; sourceTree = SDKROOT; }; 62 | 04F0040424D1E63600FA8E9B /* SwiftUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftUI.framework; path = System/Library/Frameworks/SwiftUI.framework; sourceTree = SDKROOT; }; 63 | 04F0040724D1E63600FA8E9B /* FinanceW.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FinanceW.swift; sourceTree = ""; }; 64 | 04F0040924D1E63700FA8E9B /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 65 | 04F0040B24D1E63700FA8E9B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 66 | /* End PBXFileReference section */ 67 | 68 | /* Begin PBXFrameworksBuildPhase section */ 69 | 046C6F3424CCA30F009AF802 /* Frameworks */ = { 70 | isa = PBXFrameworksBuildPhase; 71 | buildActionMask = 2147483647; 72 | files = ( 73 | 0496177E24D084FF00EFE7B4 /* Progress-Bar in Frameworks */, 74 | 04F003F924D1D8A500FA8E9B /* SwiftUICharts in Frameworks */, 75 | ); 76 | runOnlyForDeploymentPostprocessing = 0; 77 | }; 78 | 04F003FD24D1E63600FA8E9B /* Frameworks */ = { 79 | isa = PBXFrameworksBuildPhase; 80 | buildActionMask = 2147483647; 81 | files = ( 82 | 04F0040524D1E63600FA8E9B /* SwiftUI.framework in Frameworks */, 83 | 04F0040324D1E63600FA8E9B /* WidgetKit.framework in Frameworks */, 84 | ); 85 | runOnlyForDeploymentPostprocessing = 0; 86 | }; 87 | /* End PBXFrameworksBuildPhase section */ 88 | 89 | /* Begin PBXGroup section */ 90 | 046C6F2E24CCA30F009AF802 = { 91 | isa = PBXGroup; 92 | children = ( 93 | 046C6F3924CCA30F009AF802 /* Finance */, 94 | 04F0040624D1E63600FA8E9B /* FinanceW */, 95 | 04F0040124D1E63600FA8E9B /* Frameworks */, 96 | 046C6F3824CCA30F009AF802 /* Products */, 97 | ); 98 | sourceTree = ""; 99 | }; 100 | 046C6F3824CCA30F009AF802 /* Products */ = { 101 | isa = PBXGroup; 102 | children = ( 103 | 046C6F3724CCA30F009AF802 /* Finance.app */, 104 | 04F0040024D1E63600FA8E9B /* FinanceWExtension.appex */, 105 | ); 106 | name = Products; 107 | sourceTree = ""; 108 | }; 109 | 046C6F3924CCA30F009AF802 /* Finance */ = { 110 | isa = PBXGroup; 111 | children = ( 112 | 046C6F4B24CCA32E009AF802 /* Model */, 113 | 046C6F4924CCA321009AF802 /* View */, 114 | 046C6F3A24CCA30F009AF802 /* FinanceApp.swift */, 115 | 046C6F3C24CCA30F009AF802 /* ContentView.swift */, 116 | 046C6F3E24CCA310009AF802 /* Assets.xcassets */, 117 | 046C6F4324CCA310009AF802 /* Info.plist */, 118 | 046C6F4024CCA310009AF802 /* Preview Content */, 119 | ); 120 | path = Finance; 121 | sourceTree = ""; 122 | }; 123 | 046C6F4024CCA310009AF802 /* Preview Content */ = { 124 | isa = PBXGroup; 125 | children = ( 126 | 046C6F4124CCA310009AF802 /* Preview Assets.xcassets */, 127 | ); 128 | path = "Preview Content"; 129 | sourceTree = ""; 130 | }; 131 | 046C6F4924CCA321009AF802 /* View */ = { 132 | isa = PBXGroup; 133 | children = ( 134 | 046C6F4C24CCA38F009AF802 /* OnBoarding.swift */, 135 | 046C6F4E24CCA579009AF802 /* Main.swift */, 136 | 04F003FA24D1E4C400FA8E9B /* Shapes.swift */, 137 | ); 138 | path = View; 139 | sourceTree = ""; 140 | }; 141 | 046C6F4B24CCA32E009AF802 /* Model */ = { 142 | isa = PBXGroup; 143 | children = ( 144 | ); 145 | path = Model; 146 | sourceTree = ""; 147 | }; 148 | 04F0040124D1E63600FA8E9B /* Frameworks */ = { 149 | isa = PBXGroup; 150 | children = ( 151 | 04F0040224D1E63600FA8E9B /* WidgetKit.framework */, 152 | 04F0040424D1E63600FA8E9B /* SwiftUI.framework */, 153 | ); 154 | name = Frameworks; 155 | sourceTree = ""; 156 | }; 157 | 04F0040624D1E63600FA8E9B /* FinanceW */ = { 158 | isa = PBXGroup; 159 | children = ( 160 | 04F0040724D1E63600FA8E9B /* FinanceW.swift */, 161 | 04F0040924D1E63700FA8E9B /* Assets.xcassets */, 162 | 04F0040B24D1E63700FA8E9B /* Info.plist */, 163 | ); 164 | path = FinanceW; 165 | sourceTree = ""; 166 | }; 167 | /* End PBXGroup section */ 168 | 169 | /* Begin PBXNativeTarget section */ 170 | 046C6F3624CCA30F009AF802 /* Finance */ = { 171 | isa = PBXNativeTarget; 172 | buildConfigurationList = 046C6F4624CCA310009AF802 /* Build configuration list for PBXNativeTarget "Finance" */; 173 | buildPhases = ( 174 | 046C6F3324CCA30F009AF802 /* Sources */, 175 | 046C6F3424CCA30F009AF802 /* Frameworks */, 176 | 046C6F3524CCA30F009AF802 /* Resources */, 177 | 04F0041224D1E63700FA8E9B /* Embed App Extensions */, 178 | ); 179 | buildRules = ( 180 | ); 181 | dependencies = ( 182 | 04F0040D24D1E63700FA8E9B /* PBXTargetDependency */, 183 | ); 184 | name = Finance; 185 | packageProductDependencies = ( 186 | 0496177D24D084FF00EFE7B4 /* Progress-Bar */, 187 | 04F003F824D1D8A500FA8E9B /* SwiftUICharts */, 188 | ); 189 | productName = Finance; 190 | productReference = 046C6F3724CCA30F009AF802 /* Finance.app */; 191 | productType = "com.apple.product-type.application"; 192 | }; 193 | 04F003FF24D1E63600FA8E9B /* FinanceWExtension */ = { 194 | isa = PBXNativeTarget; 195 | buildConfigurationList = 04F0040F24D1E63700FA8E9B /* Build configuration list for PBXNativeTarget "FinanceWExtension" */; 196 | buildPhases = ( 197 | 04F003FC24D1E63600FA8E9B /* Sources */, 198 | 04F003FD24D1E63600FA8E9B /* Frameworks */, 199 | 04F003FE24D1E63600FA8E9B /* Resources */, 200 | ); 201 | buildRules = ( 202 | ); 203 | dependencies = ( 204 | ); 205 | name = FinanceWExtension; 206 | productName = FinanceWExtension; 207 | productReference = 04F0040024D1E63600FA8E9B /* FinanceWExtension.appex */; 208 | productType = "com.apple.product-type.app-extension"; 209 | }; 210 | /* End PBXNativeTarget section */ 211 | 212 | /* Begin PBXProject section */ 213 | 046C6F2F24CCA30F009AF802 /* Project object */ = { 214 | isa = PBXProject; 215 | attributes = { 216 | LastSwiftUpdateCheck = 1200; 217 | LastUpgradeCheck = 1200; 218 | TargetAttributes = { 219 | 046C6F3624CCA30F009AF802 = { 220 | CreatedOnToolsVersion = 12.0; 221 | }; 222 | 04F003FF24D1E63600FA8E9B = { 223 | CreatedOnToolsVersion = 12.0; 224 | }; 225 | }; 226 | }; 227 | buildConfigurationList = 046C6F3224CCA30F009AF802 /* Build configuration list for PBXProject "Finance" */; 228 | compatibilityVersion = "Xcode 9.3"; 229 | developmentRegion = en; 230 | hasScannedForEncodings = 0; 231 | knownRegions = ( 232 | en, 233 | Base, 234 | ); 235 | mainGroup = 046C6F2E24CCA30F009AF802; 236 | packageReferences = ( 237 | 0496177C24D084FF00EFE7B4 /* XCRemoteSwiftPackageReference "Progress-Bar-SwifttUI" */, 238 | 04F003F724D1D8A500FA8E9B /* XCRemoteSwiftPackageReference "ChartView" */, 239 | ); 240 | productRefGroup = 046C6F3824CCA30F009AF802 /* Products */; 241 | projectDirPath = ""; 242 | projectRoot = ""; 243 | targets = ( 244 | 046C6F3624CCA30F009AF802 /* Finance */, 245 | 04F003FF24D1E63600FA8E9B /* FinanceWExtension */, 246 | ); 247 | }; 248 | /* End PBXProject section */ 249 | 250 | /* Begin PBXResourcesBuildPhase section */ 251 | 046C6F3524CCA30F009AF802 /* Resources */ = { 252 | isa = PBXResourcesBuildPhase; 253 | buildActionMask = 2147483647; 254 | files = ( 255 | 046C6F4224CCA310009AF802 /* Preview Assets.xcassets in Resources */, 256 | 046C6F3F24CCA310009AF802 /* Assets.xcassets in Resources */, 257 | ); 258 | runOnlyForDeploymentPostprocessing = 0; 259 | }; 260 | 04F003FE24D1E63600FA8E9B /* Resources */ = { 261 | isa = PBXResourcesBuildPhase; 262 | buildActionMask = 2147483647; 263 | files = ( 264 | 04F0040A24D1E63700FA8E9B /* Assets.xcassets in Resources */, 265 | ); 266 | runOnlyForDeploymentPostprocessing = 0; 267 | }; 268 | /* End PBXResourcesBuildPhase section */ 269 | 270 | /* Begin PBXSourcesBuildPhase section */ 271 | 046C6F3324CCA30F009AF802 /* Sources */ = { 272 | isa = PBXSourcesBuildPhase; 273 | buildActionMask = 2147483647; 274 | files = ( 275 | 046C6F3D24CCA30F009AF802 /* ContentView.swift in Sources */, 276 | 046C6F4D24CCA38F009AF802 /* OnBoarding.swift in Sources */, 277 | 04F003FB24D1E4C400FA8E9B /* Shapes.swift in Sources */, 278 | 046C6F4F24CCA579009AF802 /* Main.swift in Sources */, 279 | 046C6F3B24CCA30F009AF802 /* FinanceApp.swift in Sources */, 280 | ); 281 | runOnlyForDeploymentPostprocessing = 0; 282 | }; 283 | 04F003FC24D1E63600FA8E9B /* Sources */ = { 284 | isa = PBXSourcesBuildPhase; 285 | buildActionMask = 2147483647; 286 | files = ( 287 | 04F0040824D1E63600FA8E9B /* FinanceW.swift in Sources */, 288 | ); 289 | runOnlyForDeploymentPostprocessing = 0; 290 | }; 291 | /* End PBXSourcesBuildPhase section */ 292 | 293 | /* Begin PBXTargetDependency section */ 294 | 04F0040D24D1E63700FA8E9B /* PBXTargetDependency */ = { 295 | isa = PBXTargetDependency; 296 | target = 04F003FF24D1E63600FA8E9B /* FinanceWExtension */; 297 | targetProxy = 04F0040C24D1E63700FA8E9B /* PBXContainerItemProxy */; 298 | }; 299 | /* End PBXTargetDependency section */ 300 | 301 | /* Begin XCBuildConfiguration section */ 302 | 046C6F4424CCA310009AF802 /* Debug */ = { 303 | isa = XCBuildConfiguration; 304 | buildSettings = { 305 | ALWAYS_SEARCH_USER_PATHS = NO; 306 | CLANG_ANALYZER_NONNULL = YES; 307 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 308 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 309 | CLANG_CXX_LIBRARY = "libc++"; 310 | CLANG_ENABLE_MODULES = YES; 311 | CLANG_ENABLE_OBJC_ARC = YES; 312 | CLANG_ENABLE_OBJC_WEAK = YES; 313 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 314 | CLANG_WARN_BOOL_CONVERSION = YES; 315 | CLANG_WARN_COMMA = YES; 316 | CLANG_WARN_CONSTANT_CONVERSION = YES; 317 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 318 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 319 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 320 | CLANG_WARN_EMPTY_BODY = YES; 321 | CLANG_WARN_ENUM_CONVERSION = YES; 322 | CLANG_WARN_INFINITE_RECURSION = YES; 323 | CLANG_WARN_INT_CONVERSION = YES; 324 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 325 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 326 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 327 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 328 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 329 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 330 | CLANG_WARN_STRICT_PROTOTYPES = YES; 331 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 332 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 333 | CLANG_WARN_UNREACHABLE_CODE = YES; 334 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 335 | COPY_PHASE_STRIP = NO; 336 | DEBUG_INFORMATION_FORMAT = dwarf; 337 | ENABLE_STRICT_OBJC_MSGSEND = YES; 338 | ENABLE_TESTABILITY = YES; 339 | GCC_C_LANGUAGE_STANDARD = gnu11; 340 | GCC_DYNAMIC_NO_PIC = NO; 341 | GCC_NO_COMMON_BLOCKS = YES; 342 | GCC_OPTIMIZATION_LEVEL = 0; 343 | GCC_PREPROCESSOR_DEFINITIONS = ( 344 | "DEBUG=1", 345 | "$(inherited)", 346 | ); 347 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 348 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 349 | GCC_WARN_UNDECLARED_SELECTOR = YES; 350 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 351 | GCC_WARN_UNUSED_FUNCTION = YES; 352 | GCC_WARN_UNUSED_VARIABLE = YES; 353 | IPHONEOS_DEPLOYMENT_TARGET = 14.0; 354 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 355 | MTL_FAST_MATH = YES; 356 | ONLY_ACTIVE_ARCH = YES; 357 | SDKROOT = iphoneos; 358 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 359 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 360 | }; 361 | name = Debug; 362 | }; 363 | 046C6F4524CCA310009AF802 /* Release */ = { 364 | isa = XCBuildConfiguration; 365 | buildSettings = { 366 | ALWAYS_SEARCH_USER_PATHS = NO; 367 | CLANG_ANALYZER_NONNULL = YES; 368 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 369 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 370 | CLANG_CXX_LIBRARY = "libc++"; 371 | CLANG_ENABLE_MODULES = YES; 372 | CLANG_ENABLE_OBJC_ARC = YES; 373 | CLANG_ENABLE_OBJC_WEAK = YES; 374 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 375 | CLANG_WARN_BOOL_CONVERSION = YES; 376 | CLANG_WARN_COMMA = YES; 377 | CLANG_WARN_CONSTANT_CONVERSION = YES; 378 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 379 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 380 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 381 | CLANG_WARN_EMPTY_BODY = YES; 382 | CLANG_WARN_ENUM_CONVERSION = YES; 383 | CLANG_WARN_INFINITE_RECURSION = YES; 384 | CLANG_WARN_INT_CONVERSION = YES; 385 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 386 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 387 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 388 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 389 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 390 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 391 | CLANG_WARN_STRICT_PROTOTYPES = YES; 392 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 393 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 394 | CLANG_WARN_UNREACHABLE_CODE = YES; 395 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 396 | COPY_PHASE_STRIP = NO; 397 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 398 | ENABLE_NS_ASSERTIONS = NO; 399 | ENABLE_STRICT_OBJC_MSGSEND = YES; 400 | GCC_C_LANGUAGE_STANDARD = gnu11; 401 | GCC_NO_COMMON_BLOCKS = YES; 402 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 403 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 404 | GCC_WARN_UNDECLARED_SELECTOR = YES; 405 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 406 | GCC_WARN_UNUSED_FUNCTION = YES; 407 | GCC_WARN_UNUSED_VARIABLE = YES; 408 | IPHONEOS_DEPLOYMENT_TARGET = 14.0; 409 | MTL_ENABLE_DEBUG_INFO = NO; 410 | MTL_FAST_MATH = YES; 411 | SDKROOT = iphoneos; 412 | SWIFT_COMPILATION_MODE = wholemodule; 413 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 414 | VALIDATE_PRODUCT = YES; 415 | }; 416 | name = Release; 417 | }; 418 | 046C6F4724CCA310009AF802 /* Debug */ = { 419 | isa = XCBuildConfiguration; 420 | buildSettings = { 421 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 422 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 423 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 424 | CODE_SIGN_STYLE = Automatic; 425 | DEVELOPMENT_ASSET_PATHS = "\"Finance/Preview Content\""; 426 | DEVELOPMENT_TEAM = 5G786Z6XBU; 427 | ENABLE_PREVIEWS = YES; 428 | INFOPLIST_FILE = Finance/Info.plist; 429 | IPHONEOS_DEPLOYMENT_TARGET = 14.0; 430 | LD_RUNPATH_SEARCH_PATHS = ( 431 | "$(inherited)", 432 | "@executable_path/Frameworks", 433 | ); 434 | PRODUCT_BUNDLE_IDENTIFIER = "Ameddah-Achraf.Finance"; 435 | PRODUCT_NAME = "$(TARGET_NAME)"; 436 | SWIFT_VERSION = 5.0; 437 | TARGETED_DEVICE_FAMILY = "1,2"; 438 | }; 439 | name = Debug; 440 | }; 441 | 046C6F4824CCA310009AF802 /* Release */ = { 442 | isa = XCBuildConfiguration; 443 | buildSettings = { 444 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 445 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 446 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 447 | CODE_SIGN_STYLE = Automatic; 448 | DEVELOPMENT_ASSET_PATHS = "\"Finance/Preview Content\""; 449 | DEVELOPMENT_TEAM = 5G786Z6XBU; 450 | ENABLE_PREVIEWS = YES; 451 | INFOPLIST_FILE = Finance/Info.plist; 452 | IPHONEOS_DEPLOYMENT_TARGET = 14.0; 453 | LD_RUNPATH_SEARCH_PATHS = ( 454 | "$(inherited)", 455 | "@executable_path/Frameworks", 456 | ); 457 | PRODUCT_BUNDLE_IDENTIFIER = "Ameddah-Achraf.Finance"; 458 | PRODUCT_NAME = "$(TARGET_NAME)"; 459 | SWIFT_VERSION = 5.0; 460 | TARGETED_DEVICE_FAMILY = "1,2"; 461 | }; 462 | name = Release; 463 | }; 464 | 04F0041024D1E63700FA8E9B /* Debug */ = { 465 | isa = XCBuildConfiguration; 466 | buildSettings = { 467 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 468 | ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; 469 | CODE_SIGN_STYLE = Automatic; 470 | DEVELOPMENT_TEAM = 5G786Z6XBU; 471 | INFOPLIST_FILE = FinanceW/Info.plist; 472 | LD_RUNPATH_SEARCH_PATHS = ( 473 | "$(inherited)", 474 | "@executable_path/Frameworks", 475 | "@executable_path/../../Frameworks", 476 | ); 477 | PRODUCT_BUNDLE_IDENTIFIER = "Ameddah-Achraf.Finance.FinanceW"; 478 | PRODUCT_NAME = "$(TARGET_NAME)"; 479 | SKIP_INSTALL = YES; 480 | SWIFT_VERSION = 5.0; 481 | TARGETED_DEVICE_FAMILY = "1,2"; 482 | }; 483 | name = Debug; 484 | }; 485 | 04F0041124D1E63700FA8E9B /* Release */ = { 486 | isa = XCBuildConfiguration; 487 | buildSettings = { 488 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 489 | ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; 490 | CODE_SIGN_STYLE = Automatic; 491 | DEVELOPMENT_TEAM = 5G786Z6XBU; 492 | INFOPLIST_FILE = FinanceW/Info.plist; 493 | LD_RUNPATH_SEARCH_PATHS = ( 494 | "$(inherited)", 495 | "@executable_path/Frameworks", 496 | "@executable_path/../../Frameworks", 497 | ); 498 | PRODUCT_BUNDLE_IDENTIFIER = "Ameddah-Achraf.Finance.FinanceW"; 499 | PRODUCT_NAME = "$(TARGET_NAME)"; 500 | SKIP_INSTALL = YES; 501 | SWIFT_VERSION = 5.0; 502 | TARGETED_DEVICE_FAMILY = "1,2"; 503 | }; 504 | name = Release; 505 | }; 506 | /* End XCBuildConfiguration section */ 507 | 508 | /* Begin XCConfigurationList section */ 509 | 046C6F3224CCA30F009AF802 /* Build configuration list for PBXProject "Finance" */ = { 510 | isa = XCConfigurationList; 511 | buildConfigurations = ( 512 | 046C6F4424CCA310009AF802 /* Debug */, 513 | 046C6F4524CCA310009AF802 /* Release */, 514 | ); 515 | defaultConfigurationIsVisible = 0; 516 | defaultConfigurationName = Release; 517 | }; 518 | 046C6F4624CCA310009AF802 /* Build configuration list for PBXNativeTarget "Finance" */ = { 519 | isa = XCConfigurationList; 520 | buildConfigurations = ( 521 | 046C6F4724CCA310009AF802 /* Debug */, 522 | 046C6F4824CCA310009AF802 /* Release */, 523 | ); 524 | defaultConfigurationIsVisible = 0; 525 | defaultConfigurationName = Release; 526 | }; 527 | 04F0040F24D1E63700FA8E9B /* Build configuration list for PBXNativeTarget "FinanceWExtension" */ = { 528 | isa = XCConfigurationList; 529 | buildConfigurations = ( 530 | 04F0041024D1E63700FA8E9B /* Debug */, 531 | 04F0041124D1E63700FA8E9B /* Release */, 532 | ); 533 | defaultConfigurationIsVisible = 0; 534 | defaultConfigurationName = Release; 535 | }; 536 | /* End XCConfigurationList section */ 537 | 538 | /* Begin XCRemoteSwiftPackageReference section */ 539 | 0496177C24D084FF00EFE7B4 /* XCRemoteSwiftPackageReference "Progress-Bar-SwifttUI" */ = { 540 | isa = XCRemoteSwiftPackageReference; 541 | repositoryURL = "https://github.com/AmeddahAchraf/Progress-Bar-SwifttUI"; 542 | requirement = { 543 | kind = upToNextMajorVersion; 544 | minimumVersion = 1.0.1; 545 | }; 546 | }; 547 | 04F003F724D1D8A500FA8E9B /* XCRemoteSwiftPackageReference "ChartView" */ = { 548 | isa = XCRemoteSwiftPackageReference; 549 | repositoryURL = "https://github.com/AppPear/ChartView.git"; 550 | requirement = { 551 | kind = upToNextMajorVersion; 552 | minimumVersion = "2.0.0-beta.1"; 553 | }; 554 | }; 555 | /* End XCRemoteSwiftPackageReference section */ 556 | 557 | /* Begin XCSwiftPackageProductDependency section */ 558 | 0496177D24D084FF00EFE7B4 /* Progress-Bar */ = { 559 | isa = XCSwiftPackageProductDependency; 560 | package = 0496177C24D084FF00EFE7B4 /* XCRemoteSwiftPackageReference "Progress-Bar-SwifttUI" */; 561 | productName = "Progress-Bar"; 562 | }; 563 | 04F003F824D1D8A500FA8E9B /* SwiftUICharts */ = { 564 | isa = XCSwiftPackageProductDependency; 565 | package = 04F003F724D1D8A500FA8E9B /* XCRemoteSwiftPackageReference "ChartView" */; 566 | productName = SwiftUICharts; 567 | }; 568 | /* End XCSwiftPackageProductDependency section */ 569 | }; 570 | rootObject = 046C6F2F24CCA30F009AF802 /* Project object */; 571 | } 572 | -------------------------------------------------------------------------------- /Finance.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Finance.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Finance.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved: -------------------------------------------------------------------------------- 1 | { 2 | "object": { 3 | "pins": [ 4 | { 5 | "package": "SwiftUICharts", 6 | "repositoryURL": "https://github.com/AppPear/ChartView.git", 7 | "state": { 8 | "branch": null, 9 | "revision": "3265d3e16b6480158b748095a227ea04c48f80ad", 10 | "version": "2.0.0-beta.1" 11 | } 12 | }, 13 | { 14 | "package": "Progress-Bar", 15 | "repositoryURL": "https://github.com/AmeddahAchraf/Progress-Bar-SwifttUI", 16 | "state": { 17 | "branch": null, 18 | "revision": "6d27716afe433d90fb495117ba8539f9618371d0", 19 | "version": "1.0.3" 20 | } 21 | } 22 | ] 23 | }, 24 | "version": 1 25 | } 26 | -------------------------------------------------------------------------------- /Finance.xcodeproj/xcuserdata/mac.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | -------------------------------------------------------------------------------- /Finance.xcodeproj/xcuserdata/mac.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Finance.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 0 11 | 12 | FinanceWExtension.xcscheme_^#shared#^_ 13 | 14 | orderHint 15 | 1 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /Finance/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 | -------------------------------------------------------------------------------- /Finance/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "scale" : "2x", 6 | "size" : "20x20" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "scale" : "3x", 11 | "size" : "20x20" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "scale" : "2x", 16 | "size" : "29x29" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "scale" : "3x", 21 | "size" : "29x29" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "scale" : "2x", 26 | "size" : "40x40" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "scale" : "3x", 31 | "size" : "40x40" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "scale" : "2x", 36 | "size" : "60x60" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "scale" : "3x", 41 | "size" : "60x60" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "scale" : "1x", 46 | "size" : "20x20" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "scale" : "2x", 51 | "size" : "20x20" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "scale" : "1x", 56 | "size" : "29x29" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "scale" : "2x", 61 | "size" : "29x29" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "scale" : "1x", 66 | "size" : "40x40" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "scale" : "2x", 71 | "size" : "40x40" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "scale" : "1x", 76 | "size" : "76x76" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "scale" : "2x", 81 | "size" : "76x76" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "scale" : "2x", 86 | "size" : "83.5x83.5" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "scale" : "1x", 91 | "size" : "1024x1024" 92 | } 93 | ], 94 | "info" : { 95 | "author" : "xcode", 96 | "version" : 1 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /Finance/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Finance/Assets.xcassets/onBoarding.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "undraw_Savings_dwkw.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 | -------------------------------------------------------------------------------- /Finance/Assets.xcassets/onBoarding.imageset/undraw_Savings_dwkw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AmeddahAchraf/Finance-Widget-App-SwiftUI/957e4f747b87af45fc5e9d6f0f83002c1fb80050/Finance/Assets.xcassets/onBoarding.imageset/undraw_Savings_dwkw.png -------------------------------------------------------------------------------- /Finance/ContentView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentView.swift 3 | // Finance 4 | // 5 | // Created by BqNqNNN on 7/25/20. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct ContentView: View { 11 | var body: some View { 12 | Main() 13 | } 14 | } 15 | 16 | struct ContentView_Previews: PreviewProvider { 17 | static var previews: some View { 18 | ContentView() 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Finance/FinanceApp.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FinanceApp.swift 3 | // Finance 4 | // 5 | // Created by BqNqNNN on 7/25/20. 6 | // 7 | 8 | import SwiftUI 9 | 10 | @main 11 | struct FinanceApp: App { 12 | var body: some Scene { 13 | WindowGroup { 14 | ContentView() 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Finance/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UIApplicationSceneManifest 24 | 25 | UIApplicationSupportsMultipleScenes 26 | 27 | 28 | UIApplicationSupportsIndirectInputEvents 29 | 30 | UILaunchScreen 31 | 32 | UIRequiredDeviceCapabilities 33 | 34 | armv7 35 | 36 | UISupportedInterfaceOrientations 37 | 38 | UIInterfaceOrientationPortrait 39 | UIInterfaceOrientationLandscapeLeft 40 | UIInterfaceOrientationLandscapeRight 41 | 42 | UISupportedInterfaceOrientations~ipad 43 | 44 | UIInterfaceOrientationPortrait 45 | UIInterfaceOrientationPortraitUpsideDown 46 | UIInterfaceOrientationLandscapeLeft 47 | UIInterfaceOrientationLandscapeRight 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /Finance/Preview Content/Preview Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Finance/View/Main.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Main.swift 3 | // Finance 4 | // 5 | // Created by BqNqNNN on 7/25/20. 6 | // 7 | 8 | import SwiftUI 9 | import SwiftUICharts 10 | import Progress_Bar 11 | 12 | extension Binding { 13 | func onChange(_ handler: @escaping (Value) -> Void) -> Binding { 14 | return Binding( 15 | get: { self.wrappedValue }, 16 | set: { selection in 17 | self.wrappedValue = selection 18 | handler(selection) 19 | }) 20 | } 21 | } 22 | 23 | 24 | struct Main: View { 25 | 26 | init() { 27 | UISegmentedControl.appearance().selectedSegmentTintColor = UIColor(Color(#colorLiteral(red: 0.2880256678, green: 0.1134614047, blue: 0.8102525685, alpha: 1))) 28 | UISegmentedControl.appearance().setTitleTextAttributes([.foregroundColor: UIColor.white, .font: UIFont.systemFont(ofSize: 13, weight: .bold)], for: .selected) 29 | UISegmentedControl.appearance().setTitleTextAttributes([.foregroundColor: UIColor.gray], for: .normal) 30 | 31 | } 32 | 33 | let mixedColorStyle = ChartStyle(backgroundColor: .white, foregroundColor: [ 34 | 35 | ColorGradient(.purple, .blue)]) 36 | 37 | 38 | @State var monthSelected = 3 39 | @State var incomeExpense = 1 40 | @State var progress :CGFloat = 0.75 41 | 42 | 43 | var body: some View { 44 | NavigationView { 45 | ZStack { 46 | Color(.black) 47 | .edgesIgnoringSafeArea(.all) 48 | VStack { 49 | HStack { 50 | Image(systemName: "chevron.left") 51 | .resizable() 52 | .foregroundColor(.white) 53 | .scaledToFit() 54 | .frame(width: 10) 55 | .opacity(0.8) 56 | .padding(.leading, 20) 57 | Spacer() 58 | Image(systemName: "text.justify") 59 | .resizable() 60 | .foregroundColor(.white) 61 | .scaledToFit() 62 | .frame(width: 25) 63 | .padding(.trailing, 20) 64 | }.padding(.top, -80) 65 | 66 | VStack{ 67 | Text("Total Balance") 68 | .font(.title) 69 | .bold() 70 | .foregroundColor(.gray) 71 | Text("$ 69,420") 72 | .font(.title) 73 | .fontWeight(.heavy) 74 | .foregroundColor(.white) 75 | } 76 | 77 | Picker(selection: $incomeExpense.onChange(colorChange), label: Text(""), content: { 78 | Text("Income").tag(1) 79 | Text("Expenses").tag(2) 80 | }).pickerStyle(SegmentedPickerStyle()) 81 | .padding(.trailing, 60) 82 | .padding(.leading, 60) 83 | .padding(.bottom, 60) 84 | 85 | 86 | CardView(showShadow: false) { 87 | ChartLabel("", type: .custom(size: 30, padding: EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0), color: .white)) 88 | .foregroundColor(.white) 89 | BarChart() 90 | } 91 | .data(getNumbers()) 92 | .chartStyle(mixedColorStyle) 93 | .padding(.leading, 10) 94 | 95 | //Months 96 | MonthView() 97 | Spacer() 98 | 99 | ZStack { 100 | LinearGradient(gradient: Gradient(colors: [Color(#colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1)), Color(#colorLiteral(red: 0.5399802801, green: 0.01270869007, blue: 0.9686274529, alpha: 1))]), startPoint: .top, endPoint: .bottom) 101 | .frame(width: UIScreen.main.bounds.width*0.8, height: 100, alignment: .center) 102 | .cornerRadius(15) 103 | .opacity(0.8) 104 | 105 | HStack { 106 | CircularProgress(percentage: progress, 107 | fontSize: 12, 108 | backgroundColor: Color(#colorLiteral(red: 1, green: 1, blue: 1, alpha: 0.1522367295)), 109 | fontColor : .white, 110 | borderColor1: Color(#colorLiteral(red: 1, green: 1, blue: 1, alpha: 0.5648009418)), 111 | borderColor2: LinearGradient(gradient: Gradient(colors: [.white,.white]),startPoint: .top,endPoint: .bottom), borderWidth: 10) 112 | 113 | .frame(width: 80) 114 | .padding(.trailing, 20) 115 | .animation(.easeIn) 116 | 117 | VStack(alignment: .leading){ 118 | Text("Your credit limit\n") 119 | .font(.system(size: 17)) 120 | .foregroundColor(Color(#colorLiteral(red: 0.8039215803, green: 0.8039215803, blue: 0.8039215803, alpha: 1))) 121 | Text("$12,750 of $52.000") 122 | .font(.system(size: 15)) 123 | .foregroundColor(Color(#colorLiteral(red: 1, green: 1, blue: 1, alpha: 1))) 124 | .bold() 125 | 126 | }.padding(.trailing, 20) 127 | 128 | Image(systemName: "arrow.right.circle.fill") 129 | .resizable() 130 | .foregroundColor(.white) 131 | .scaledToFit() 132 | .frame(width: 30) 133 | .opacity(0.8) 134 | 135 | } 136 | } 137 | Spacer() 138 | } 139 | } 140 | }.navigationBarHidden(true) 141 | } 142 | func colorChange(_ tag: Int) { 143 | self.progress = CGFloat(Int.random(in: 0..<100))/100 144 | } 145 | 146 | func getNumbers() -> [Double] { 147 | var data = Array() 148 | data = (0..<16).map { _ in .random(in: 9.0...100.0) } 149 | return data 150 | } 151 | } 152 | 153 | struct Main_Previews: PreviewProvider { 154 | static var previews: some View { 155 | Main() 156 | } 157 | } 158 | 159 | 160 | struct MonthView: View { 161 | var body: some View { 162 | HStack { 163 | Text("Jun") 164 | Spacer() 165 | Text("Jul") 166 | Spacer() 167 | Text("Aug").bold() 168 | Spacer() 169 | Text("Sep") 170 | Spacer() 171 | Text("Oct") 172 | } 173 | .foregroundColor(.white) 174 | .padding(.leading, 30) 175 | .padding(.trailing, 40) 176 | } 177 | } 178 | -------------------------------------------------------------------------------- /Finance/View/OnBoarding.swift: -------------------------------------------------------------------------------- 1 | // 2 | // OnBoarding.swift 3 | // Finance 4 | // 5 | // Created by BqNqNNN on 7/25/20. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct OnBoarding: View { 11 | var body: some View { 12 | 13 | NavigationView { 14 | VStack { 15 | Image("onBoarding") 16 | .resizable() 17 | .scaledToFit() 18 | .padding(.bottom, 30) 19 | 20 | Text("We Keep Track") 21 | .fontWeight(.bold) 22 | .font(.title) 23 | .font(.system(size: 38)) 24 | .bold() 25 | .padding(/*@START_MENU_TOKEN@*/.all/*@END_MENU_TOKEN@*/, 20) 26 | Text("Carrying out all financial in one simple place \n with the most secure way.") 27 | .multilineTextAlignment(.center) 28 | .padding(/*@START_MENU_TOKEN@*/.all/*@END_MENU_TOKEN@*/, /*@START_MENU_TOKEN@*/10/*@END_MENU_TOKEN@*/) 29 | 30 | 31 | NavigationLink( 32 | destination: Main().navigationBarBackButtonHidden(true).navigationBarHidden(true), 33 | label: { 34 | Text("Start") 35 | .font(.headline) 36 | .frame(width: 250, height: 40, alignment: .center) 37 | .foregroundColor(.white) 38 | .background(Color(#colorLiteral(red: 0.3647058904, green: 0.06666667014, blue: 0.9686274529, alpha: 1))) 39 | .cornerRadius(10) 40 | .padding(.top, 50) 41 | }) 42 | 43 | }.edgesIgnoringSafeArea(.all) 44 | .navigationBarItems(trailing: 45 | NavigationLink( 46 | destination: Main().navigationBarBackButtonHidden(true).navigationBarHidden(true), 47 | label: { 48 | Image(systemName: "arrow.right") 49 | .font(Font.system(.title3)) 50 | .foregroundColor(Color(#colorLiteral(red: 0.2196078449, green: 0.007843137719, blue: 0.8549019694, alpha: 1))) 51 | }) 52 | ) 53 | }.navigationBarHidden(true) 54 | } 55 | } 56 | 57 | struct OnBoarding_Previews: PreviewProvider { 58 | static var previews: some View { 59 | OnBoarding() 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /Finance/View/Shapes.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Shapes.swift 3 | // Finance 4 | // 5 | // Created by BqNqNNN on 7/29/20. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct LineChart: View { 11 | var body: some View { 12 | GeometryReader { g in 13 | let minX = g.frame(in : .local).minX 14 | let maxX = g.frame(in : .local).maxX 15 | let maxY = g.frame(in : .local).maxY 16 | let midX = g.frame(in : .local).midX 17 | let midY = g.frame(in : .local).midY 18 | 19 | 20 | Path { p in 21 | p.move(to: CGPoint(x: minX, y: maxY) ) 22 | 23 | p.addQuadCurve(to : CGPoint(x: midX/2, y: midY), 24 | control : CGPoint(x: midX/3, y: midY)) 25 | 26 | p.addCurve(to : CGPoint(x: midX, y: 3/2*midY), 27 | control1 : CGPoint(x: midX*0.8, y: midY), 28 | control2 : CGPoint(x: midX, y: midY*1.5)) 29 | 30 | p.addCurve(to : CGPoint(x: 3/2*midY, y: 1/2*midY), 31 | control1 : CGPoint(x: midY*1.3, y: midY*2), 32 | control2 : CGPoint(x: midY, y: midY*0.5)) 33 | 34 | p.addCurve(to :CGPoint(x: maxX, y: maxY), 35 | control1 : CGPoint(x: maxX, y: midY*0.6), 36 | control2 : CGPoint(x: maxX, y: maxY)) 37 | 38 | 39 | } 40 | .fill(LinearGradient( 41 | gradient: .init(colors: [Color(#colorLiteral(red: 0.3647058904, green: 0.06666667014, blue: 0.9686274529, alpha: 1)),Color(#colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)) ]), 42 | startPoint: .top, 43 | endPoint: .bottom)) 44 | Path { p in 45 | p.move(to: CGPoint(x: minX, y: maxY) ) 46 | 47 | p.addQuadCurve(to : CGPoint(x: midX/2, y: midY), 48 | control : CGPoint(x: midX/3, y: midY)) 49 | 50 | p.addCurve(to : CGPoint(x: midX, y: 3/2*midY), 51 | control1 : CGPoint(x: midX*0.8, y: midY), 52 | control2 : CGPoint(x: midX, y: midY*1.5)) 53 | 54 | p.addCurve(to : CGPoint(x: 3/2*midY, y: 1/2*midY), 55 | control1 : CGPoint(x: midY*1.3, y: midY*2), 56 | control2 : CGPoint(x: midY, y: midY*0.5)) 57 | 58 | p.addCurve(to :CGPoint(x: maxX, y: maxY), 59 | control1 : CGPoint(x: maxX, y: midY*0.6), 60 | control2 : CGPoint(x: maxX, y: maxY)) 61 | 62 | 63 | } 64 | .stroke(LinearGradient( 65 | gradient: .init(colors: [Color(#colorLiteral(red: 0.2196078449, green: 0.007843137719, blue: 0.8549019694, alpha: 1)),Color(#colorLiteral(red: 0.2196078449, green: 0.007843137719, blue: 0.8549019694, alpha: 0.04069456336)) ]), 66 | startPoint: .top, 67 | endPoint: .bottom), lineWidth: 2 ) 68 | 69 | 70 | } 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /FinanceW/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 | -------------------------------------------------------------------------------- /FinanceW/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "scale" : "2x", 6 | "size" : "20x20" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "scale" : "3x", 11 | "size" : "20x20" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "scale" : "2x", 16 | "size" : "29x29" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "scale" : "3x", 21 | "size" : "29x29" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "scale" : "2x", 26 | "size" : "40x40" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "scale" : "3x", 31 | "size" : "40x40" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "scale" : "2x", 36 | "size" : "60x60" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "scale" : "3x", 41 | "size" : "60x60" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "scale" : "1x", 46 | "size" : "20x20" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "scale" : "2x", 51 | "size" : "20x20" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "scale" : "1x", 56 | "size" : "29x29" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "scale" : "2x", 61 | "size" : "29x29" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "scale" : "1x", 66 | "size" : "40x40" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "scale" : "2x", 71 | "size" : "40x40" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "scale" : "1x", 76 | "size" : "76x76" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "scale" : "2x", 81 | "size" : "76x76" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "scale" : "2x", 86 | "size" : "83.5x83.5" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "scale" : "1x", 91 | "size" : "1024x1024" 92 | } 93 | ], 94 | "info" : { 95 | "author" : "xcode", 96 | "version" : 1 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /FinanceW/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /FinanceW/Assets.xcassets/Image.imageset/6794578_preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AmeddahAchraf/Finance-Widget-App-SwiftUI/957e4f747b87af45fc5e9d6f0f83002c1fb80050/FinanceW/Assets.xcassets/Image.imageset/6794578_preview.png -------------------------------------------------------------------------------- /FinanceW/Assets.xcassets/Image.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "6794578_preview.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 | -------------------------------------------------------------------------------- /FinanceW/Assets.xcassets/WidgetBackground.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /FinanceW/FinanceW.swift: -------------------------------------------------------------------------------- 1 | // 2 | // widget.swift 3 | // widget 4 | // 5 | // Created by BqNqNNN on 7/28/20. 6 | // 7 | 8 | import WidgetKit 9 | import SwiftUI 10 | 11 | 12 | struct PlaceholderView : View { 13 | var body: some View { 14 | Text("This is just a placeholed when the widget is loading") 15 | } 16 | } 17 | 18 | struct SimpleEntry: TimelineEntry { 19 | public let date = Date() 20 | public let text : String 21 | } 22 | 23 | struct Provider: TimelineProvider { 24 | public typealias Entry = SimpleEntry 25 | 26 | public func snapshot(with context: Context, completion: @escaping (SimpleEntry) -> ()) { 27 | var entry : SimpleEntry 28 | 29 | if context.isPreview { 30 | entry = SimpleEntry(text: "We in the preview screen") 31 | } else { 32 | entry = SimpleEntry(text: "we in the home screen") 33 | } 34 | completion(entry) 35 | } 36 | 37 | public func timeline(with context: Context, completion: @escaping (Timeline) -> ()) { 38 | var entries: [SimpleEntry] = [] 39 | 40 | // Generate a timeline consisting of five entries an hour apart, starting from the current date. 41 | let currentDate = Date() 42 | for hourOffset in 0 ..< 5 { 43 | _ = Calendar.current.date(byAdding: .hour, value: hourOffset, to: currentDate)! 44 | let entry = SimpleEntry(text: "Finance") 45 | entries.append(entry) 46 | } 47 | 48 | let timeline = Timeline(entries: entries, policy: .atEnd) 49 | completion(timeline) 50 | } 51 | } 52 | 53 | 54 | struct widgetEntryView : View { 55 | var entry: Provider.Entry 56 | var body: some View { 57 | ZStack { 58 | LinearGradient(gradient: Gradient(colors: [Color(#colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)), Color(#colorLiteral(red: 0.6693798304, green: 0.7854295373, blue: 0.9982592463, alpha: 0.1516481164))]), startPoint: .topTrailing, endPoint: .bottom) 59 | Group { 60 | ArcShape() 61 | .fill(LinearGradient(gradient: Gradient(colors: [Color(#colorLiteral(red: 0.5424916148, green: 0.7029080987, blue: 0.9997727275, alpha: 1)), Color(#colorLiteral(red: 0.6693798304, green: 0.7854295373, blue: 0.9982592463, alpha: 0.4648705051))]), startPoint: .topTrailing, endPoint: .bottom)) 62 | .offset(x: 70, y: 0) 63 | .frame(width: 200, height: 200, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/) 64 | .rotationEffect(.degrees(-15)) 65 | ArcShape() 66 | .fill(LinearGradient(gradient: Gradient(colors: [Color(#colorLiteral(red: 0.5424916148, green: 0.7029080987, blue: 0.9997727275, alpha: 1)), Color(#colorLiteral(red: 0.6693798304, green: 0.7854295373, blue: 0.9982592463, alpha: 0.4648705051))]), startPoint: .topTrailing, endPoint: .bottom)) 67 | .offset(x: 70, y: -10) 68 | .frame(width: 200, height: 200, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/) 69 | .rotationEffect(.degrees(-25)) 70 | } 71 | VStack { 72 | HStack{ 73 | Spacer() 74 | Image("Image") 75 | .resizable() 76 | .scaledToFill() 77 | .frame(width: 50, height: 50) 78 | .shadow(radius: 1) 79 | } 80 | HStack { 81 | VStack { 82 | Text("Balance") 83 | .font(.title) 84 | 85 | Text("$69,420") 86 | .font(.title) 87 | .bold() 88 | .padding(.leading, 20) 89 | Spacer() 90 | } 91 | Spacer() 92 | } 93 | HStack{ 94 | Text("****4269") 95 | .font(.caption) 96 | .foregroundColor(.gray) 97 | .padding(/*@START_MENU_TOKEN@*/.all/*@END_MENU_TOKEN@*/, /*@START_MENU_TOKEN@*/10/*@END_MENU_TOKEN@*/) 98 | Spacer() 99 | } 100 | } 101 | .padding(.all, 20) 102 | 103 | 104 | 105 | } 106 | } 107 | } 108 | 109 | 110 | @main 111 | struct widget: Widget { 112 | private let kind: String = "widget" 113 | 114 | public var body: some WidgetConfiguration { 115 | StaticConfiguration(kind: kind, provider: Provider(), placeholder: PlaceholderView()) { entry in 116 | widgetEntryView(entry: entry) 117 | } 118 | .configurationDisplayName("Finance") 119 | .description("Track your balance.") 120 | .supportedFamilies([.systemSmall,.systemMedium]) 121 | 122 | } 123 | } 124 | 125 | struct widget_Previews: PreviewProvider { 126 | static var previews: some View { 127 | widgetEntryView(entry: SimpleEntry(text: "Finance")) 128 | .previewContext(WidgetPreviewContext(family: .systemSmall)) 129 | } 130 | } 131 | 132 | struct Arc : Shape { 133 | var statAng: Angle 134 | var endAng: Angle 135 | var clock : Bool 136 | 137 | 138 | func path(in rect: CGRect) -> Path { 139 | 140 | 141 | var path = Path() 142 | 143 | let rotAdj = Angle.degrees(90) 144 | let startAdg = statAng - rotAdj 145 | let endAdg = endAng - rotAdj 146 | 147 | 148 | path.addArc(center: CGPoint(x: rect.midX, y: rect.midY), radius: rect.width/2, startAngle: startAdg, endAngle: endAdg, clockwise: clock) 149 | 150 | return path 151 | } 152 | } 153 | 154 | 155 | struct ArcShape : Shape { 156 | func path(in rect: CGRect) -> Path { 157 | 158 | let (x, y, width, height) = rect.centeredSquare.flatten() 159 | let lowerPoint = CGPoint(x: x + width / 2, y: (y + height )) 160 | 161 | let path = Path { p in 162 | p.move(to: lowerPoint) 163 | p.addCurve(to: CGPoint(x: rect.minX, y: rect.minY), 164 | control1: CGPoint(x: rect.minX, y: rect.maxY), 165 | control2: CGPoint(x: rect.maxX/2, y: rect.minY)) 166 | 167 | p.addLine(to: CGPoint(x: rect.maxX, y: rect.minY)) 168 | p.addLine(to: CGPoint(x: rect.maxX, y: rect.maxY)) 169 | } 170 | return path 171 | } 172 | } 173 | 174 | 175 | extension CGRect { 176 | var center: CGPoint { 177 | return CGPoint(x: self.midX, y: self.midY) 178 | } 179 | var centeredSquare: CGRect { 180 | let width = ceil(min(size.width, size.height)) 181 | let height = width 182 | 183 | let newOrigin = CGPoint(x: origin.x + (size.width - width) / 2, y: origin.y + (size.height - height) / 2) 184 | let newSize = CGSize(width: width, height: height) 185 | return CGRect(origin: newOrigin, size: newSize) 186 | } 187 | 188 | func flatten() -> (CGFloat, CGFloat, CGFloat, CGFloat) { 189 | return (origin.x, origin.y, size.width, size.height) 190 | } 191 | } 192 | -------------------------------------------------------------------------------- /FinanceW/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | FinanceW 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleVersion 22 | 1 23 | NSExtension 24 | 25 | NSExtensionPointIdentifier 26 | com.apple.widgetkit-extension 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Finance Widget SwiftUI 2 | 3 | iOS 14 Widget for Banking application built with swiftUI 4 | 5 | ## Preview 6 | ![](https://media.giphy.com/media/Mag1gpqydb2ERA7vCu/giphy.gif) 7 | 8 | ## 3rd Party package 9 | 10 | * [ProgressBar](https://github.com/AmeddahAchraf/Progress-Bar-SwifttUI) - Circular progress bar that supports animated text, built with SwiftUI. 11 | * [SwiftUICharts](https://github.com/AppPear/ChartView) - Swift package for displaying charts effortlessly. 12 | 13 | 14 | 15 | ## Built With 16 | 17 | * [SwfitUI](https://developer.apple.com/xcode/swiftui/) - To build user interfaces across all Apple platforms. 18 | * [Xcode12](https://developer.apple.com/documentation/xcode-release-notes/xcode-12-beta-release-notes) - Latest beta version. 19 | 20 | --------------------------------------------------------------------------------