diff --git a/Loop.xcodeproj/project.pbxproj b/Loop.xcodeproj/project.pbxproj index ac603608..31490796 100644 --- a/Loop.xcodeproj/project.pbxproj +++ b/Loop.xcodeproj/project.pbxproj @@ -12,6 +12,7 @@ 4C6B93E72C1DCF6E00AFF832 /* TheLoopTimes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6B93E12C1DCF6E00AFF832 /* TheLoopTimes.swift */; }; 4C6B93E82C1DCF6E00AFF832 /* Updater.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6B93E22C1DCF6E00AFF832 /* Updater.swift */; }; 4C6B93E92C1DCF6E00AFF832 /* UpdateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6B93E32C1DCF6E00AFF832 /* UpdateView.swift */; }; + 4CE3CE6F2C2BE1AE007A4DBA /* Luminare in Frameworks */ = {isa = PBXBuildFile; productRef = 4CE3CE6E2C2BE1AE007A4DBA /* Luminare */; }; A80397D22A93287C006D2796 /* MenuBarExtraAccess in Frameworks */ = {isa = PBXBuildFile; productRef = A80397D12A93287C006D2796 /* MenuBarExtraAccess */; settings = {ATTRIBUTES = (Required, ); }; }; A80397D42A932993006D2796 /* MenuBarIconView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A80397D32A932993006D2796 /* MenuBarIconView.swift */; }; A8055EC22AFEDE0B00459D13 /* Keycorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8055EC12AFEDE0B00459D13 /* Keycorder.swift */; }; @@ -23,7 +24,6 @@ A81B98182BDC854F005FD78C /* AboutConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81B98172BDC854F005FD78C /* AboutConfiguration.swift */; }; A81D8D0A2C068B8700188E12 /* LuminarePreviewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81D8D092C068B8700188E12 /* LuminarePreviewView.swift */; }; A81D8D0C2C06950000188E12 /* LuminareManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81D8D0B2C06950000188E12 /* LuminareManager.swift */; }; - A81E19422C1FCC7A00C02606 /* Luminare in Frameworks */ = {isa = PBXBuildFile; productRef = A81E19412C1FCC7A00C02606 /* Luminare */; }; A82521EE29E235AC00139654 /* PermissionsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A82521ED29E235AC00139654 /* PermissionsManager.swift */; }; A82740982AB00FCE00B9BDC5 /* Color+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = A82740972AB00FCE00B9BDC5 /* Color+Extensions.swift */; }; A827409A2AB0208500B9BDC5 /* TriggerKeycorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = A82740992AB0208500B9BDC5 /* TriggerKeycorder.swift */; }; @@ -52,7 +52,6 @@ A864F4682AA660CD00579738 /* WindowDragManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A864F4672AA660CD00579738 /* WindowDragManager.swift */; }; A86949862A8F2BB70051AAAF /* CGKeyCode+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = A86949852A8F2BB60051AAAF /* CGKeyCode+Extensions.swift */; }; A869C1A12B38C6E600AD1A84 /* StageManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A869C1A02B38C6E600AD1A84 /* StageManager.swift */; }; - A86A75102C253BBC004AA154 /* Luminare in Frameworks */ = {isa = PBXBuildFile; productRef = A86A750F2C253BBC004AA154 /* Luminare */; }; A86B97AD2AB79E2500099D7F /* ShakeEffect.swift in Sources */ = {isa = PBXBuildFile; fileRef = A86B97AC2AB79E2500099D7F /* ShakeEffect.swift */; }; A86CB7332A3D22E7006A78F2 /* WindowEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = A86CB7322A3D22E7006A78F2 /* WindowEngine.swift */; }; A87376F62AA288EB001890F4 /* Window.swift in Sources */ = {isa = PBXBuildFile; fileRef = A87376F52AA288EB001890F4 /* Window.swift */; }; @@ -70,8 +69,6 @@ A8A1C51E2BD3705A00515A14 /* PaddingConfigurationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8A1C51D2BD3705A00515A14 /* PaddingConfigurationView.swift */; }; A8A1C5212BD4863B00515A14 /* KeybindingsConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8A1C5202BD4863B00515A14 /* KeybindingsConfiguration.swift */; }; A8A2ABE72A3FB0370067B5A9 /* KeybindMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8A2ABE62A3FB0370067B5A9 /* KeybindMonitor.swift */; }; - A8A2D28E2C1F7DAC002E4E0E /* Luminare in Frameworks */ = {isa = PBXBuildFile; productRef = A8A2D28D2C1F7DAC002E4E0E /* Luminare */; }; - A8A2D2912C1F7DFB002E4E0E /* Luminare in Frameworks */ = {isa = PBXBuildFile; productRef = A8A2D2902C1F7DFB002E4E0E /* Luminare */; }; A8A583B82BE5A117005F4CB2 /* CycleActionConfigurationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8A583B72BE5A117005F4CB2 /* CycleActionConfigurationView.swift */; }; A8A583BA2BE5A8D8005F4CB2 /* KeybindingItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8A583B92BE5A8D8005F4CB2 /* KeybindingItem.swift */; }; A8B5E1632B43726C00044D30 /* CustomWindowActionAnchor.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8B5E1622B43726C00044D30 /* CustomWindowActionAnchor.swift */; }; @@ -193,12 +190,9 @@ buildActionMask = 2147483647; files = ( A8DCC97B2980D5F500D41065 /* Defaults in Frameworks */, - A81E19422C1FCC7A00C02606 /* Luminare in Frameworks */, - A8A2D28E2C1F7DAC002E4E0E /* Luminare in Frameworks */, + 4CE3CE6F2C2BE1AE007A4DBA /* Luminare in Frameworks */, A883642F298B7288005D6C19 /* ServiceManagement.framework in Frameworks */, - A8A2D2912C1F7DFB002E4E0E /* Luminare in Frameworks */, A80397D22A93287C006D2796 /* MenuBarExtraAccess in Frameworks */, - A86A75102C253BBC004AA154 /* Luminare in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -473,6 +467,7 @@ isa = PBXNativeTarget; buildConfigurationList = A8E59C44297F5E9B0064D4BA /* Build configuration list for PBXNativeTarget "Loop" */; buildPhases = ( + 4C80AE1E2C29C515006E83A3 /* Run SwiftFormat */, A8E59C31297F5E9A0064D4BA /* Sources */, A8E59C32297F5E9A0064D4BA /* Frameworks */, A8E59C33297F5E9A0064D4BA /* Resources */, @@ -485,10 +480,7 @@ packageProductDependencies = ( A8DCC97A2980D5F500D41065 /* Defaults */, A80397D12A93287C006D2796 /* MenuBarExtraAccess */, - A8A2D28D2C1F7DAC002E4E0E /* Luminare */, - A8A2D2902C1F7DFB002E4E0E /* Luminare */, - A81E19412C1FCC7A00C02606 /* Luminare */, - A86A750F2C253BBC004AA154 /* Luminare */, + 4CE3CE6E2C2BE1AE007A4DBA /* Luminare */, ); productName = WindowManager; productReference = A8E59C35297F5E9A0064D4BA /* Loop.app */; @@ -527,7 +519,7 @@ packageReferences = ( A8DCC9792980D5F500D41065 /* XCRemoteSwiftPackageReference "Defaults" */, A80397D02A93287C006D2796 /* XCRemoteSwiftPackageReference "MenuBarExtraAccess" */, - A86A750E2C253BBC004AA154 /* XCRemoteSwiftPackageReference "Luminare" */, + 4CE3CE6D2C2BE1AE007A4DBA /* XCRemoteSwiftPackageReference "Luminare" */, ); productRefGroup = A8E59C36297F5E9A0064D4BA /* Products */; projectDirPath = ""; @@ -552,6 +544,28 @@ }; /* End PBXResourcesBuildPhase section */ +/* Begin PBXShellScriptBuildPhase section */ + 4C80AE1E2C29C515006E83A3 /* Run SwiftFormat */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = "Run SwiftFormat"; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# Default Homebrew installation path on Intel-based Macs\nHOMEBREW_INTEL_PATH=\"/usr/local/bin/swiftformat\"\n\n# Default Homebrew installation path on Apple Silicon Macs\nHOMEBREW_ARM_PATH=\"/opt/homebrew/bin/swiftformat\"\n\n# Determine the architecture of the machine (arm64 or x86_64)\nARCH=$(uname -m)\n\n# Set the Homebrew path based on the architecture\nif [ \"$ARCH\" = \"arm64\" ]; then\n SWIFTFORMAT_PATH=\"$HOMEBREW_ARM_PATH\"\nelse\n SWIFTFORMAT_PATH=\"$HOMEBREW_INTEL_PATH\"\nfi\n\n# Check if SwiftFormat is installed via Homebrew\nif [ -x \"$SWIFTFORMAT_PATH\" ]; then\n \"$SWIFTFORMAT_PATH\" .\nelse\n echo \"warning: SwiftFormat not installed via Homebrew or not found in expected paths\"\nfi\n"; + }; +/* End PBXShellScriptBuildPhase section */ + /* Begin PBXSourcesBuildPhase section */ A8E59C31297F5E9A0064D4BA /* Sources */ = { isa = PBXSourcesBuildPhase; @@ -869,20 +883,20 @@ /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ - A80397D02A93287C006D2796 /* XCRemoteSwiftPackageReference "MenuBarExtraAccess" */ = { + 4CE3CE6D2C2BE1AE007A4DBA /* XCRemoteSwiftPackageReference "Luminare" */ = { isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/orchetect/MenuBarExtraAccess"; + repositoryURL = "https://github.com/MrKai77/Luminare"; requirement = { - kind = upToNextMajorVersion; - minimumVersion = 1.0.5; + branch = main; + kind = branch; }; }; - A86A750E2C253BBC004AA154 /* XCRemoteSwiftPackageReference "Luminare" */ = { + A80397D02A93287C006D2796 /* XCRemoteSwiftPackageReference "MenuBarExtraAccess" */ = { isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/MrKai77/Luminare"; + repositoryURL = "https://github.com/orchetect/MenuBarExtraAccess"; requirement = { - branch = main; - kind = branch; + kind = upToNextMajorVersion; + minimumVersion = 1.0.5; }; }; A8DCC9792980D5F500D41065 /* XCRemoteSwiftPackageReference "Defaults" */ = { @@ -896,27 +910,15 @@ /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ - A80397D12A93287C006D2796 /* MenuBarExtraAccess */ = { - isa = XCSwiftPackageProductDependency; - package = A80397D02A93287C006D2796 /* XCRemoteSwiftPackageReference "MenuBarExtraAccess" */; - productName = MenuBarExtraAccess; - }; - A81E19412C1FCC7A00C02606 /* Luminare */ = { + 4CE3CE6E2C2BE1AE007A4DBA /* Luminare */ = { isa = XCSwiftPackageProductDependency; + package = 4CE3CE6D2C2BE1AE007A4DBA /* XCRemoteSwiftPackageReference "Luminare" */; productName = Luminare; }; - A86A750F2C253BBC004AA154 /* Luminare */ = { - isa = XCSwiftPackageProductDependency; - package = A86A750E2C253BBC004AA154 /* XCRemoteSwiftPackageReference "Luminare" */; - productName = Luminare; - }; - A8A2D28D2C1F7DAC002E4E0E /* Luminare */ = { - isa = XCSwiftPackageProductDependency; - productName = Luminare; - }; - A8A2D2902C1F7DFB002E4E0E /* Luminare */ = { + A80397D12A93287C006D2796 /* MenuBarExtraAccess */ = { isa = XCSwiftPackageProductDependency; - productName = Luminare; + package = A80397D02A93287C006D2796 /* XCRemoteSwiftPackageReference "MenuBarExtraAccess" */; + productName = MenuBarExtraAccess; }; A8DCC97A2980D5F500D41065 /* Defaults */ = { isa = XCSwiftPackageProductDependency; diff --git a/Loop.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Loop.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index a694f2c8..2125dd0c 100644 --- a/Loop.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Loop.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "b9fdecd7398c3745a20923fcfba00e4142c0596ea2ae1f3fc8bc9a77b8ff1cfd", + "originHash" : "ba90caa0334ddead74b48b4627f5d0fc2eea11792add988bf20b15aa3ac03eb3", "pins" : [ { "identity" : "defaults", diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Black.appiconset/Black-1024.png b/Loop/Assets.xcassets/App Icons/AppIcon-Black.appiconset/Black-1024.png index ae648313..d3404a93 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Black.appiconset/Black-1024.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Black.appiconset/Black-1024.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Black.appiconset/Black-128.png b/Loop/Assets.xcassets/App Icons/AppIcon-Black.appiconset/Black-128.png index 76dbf4a2..7aaa6500 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Black.appiconset/Black-128.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Black.appiconset/Black-128.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Black.appiconset/Black-16.png b/Loop/Assets.xcassets/App Icons/AppIcon-Black.appiconset/Black-16.png index 391a500a..5a168ca6 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Black.appiconset/Black-16.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Black.appiconset/Black-16.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Black.appiconset/Black-256.png b/Loop/Assets.xcassets/App Icons/AppIcon-Black.appiconset/Black-256.png index f4558423..1ef10211 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Black.appiconset/Black-256.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Black.appiconset/Black-256.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Black.appiconset/Black-32.png b/Loop/Assets.xcassets/App Icons/AppIcon-Black.appiconset/Black-32.png index d87aeabd..061a0bf8 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Black.appiconset/Black-32.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Black.appiconset/Black-32.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Black.appiconset/Black-512.png b/Loop/Assets.xcassets/App Icons/AppIcon-Black.appiconset/Black-512.png index d1ffdc44..e6fc6bdf 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Black.appiconset/Black-512.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Black.appiconset/Black-512.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Black.appiconset/Black-64.png b/Loop/Assets.xcassets/App Icons/AppIcon-Black.appiconset/Black-64.png index f033143c..79198238 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Black.appiconset/Black-64.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Black.appiconset/Black-64.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Classic.appiconset/Classic-1024.png b/Loop/Assets.xcassets/App Icons/AppIcon-Classic.appiconset/Classic-1024.png index a525128b..d85d89cc 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Classic.appiconset/Classic-1024.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Classic.appiconset/Classic-1024.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Classic.appiconset/Classic-128.png b/Loop/Assets.xcassets/App Icons/AppIcon-Classic.appiconset/Classic-128.png index d78c1f52..b23a6227 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Classic.appiconset/Classic-128.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Classic.appiconset/Classic-128.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Classic.appiconset/Classic-16.png b/Loop/Assets.xcassets/App Icons/AppIcon-Classic.appiconset/Classic-16.png index 7964bb46..b0d214cd 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Classic.appiconset/Classic-16.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Classic.appiconset/Classic-16.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Classic.appiconset/Classic-256.png b/Loop/Assets.xcassets/App Icons/AppIcon-Classic.appiconset/Classic-256.png index 32bf7b39..fb311375 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Classic.appiconset/Classic-256.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Classic.appiconset/Classic-256.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Classic.appiconset/Classic-32.png b/Loop/Assets.xcassets/App Icons/AppIcon-Classic.appiconset/Classic-32.png index f01ecf77..8bf80213 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Classic.appiconset/Classic-32.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Classic.appiconset/Classic-32.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Classic.appiconset/Classic-512.png b/Loop/Assets.xcassets/App Icons/AppIcon-Classic.appiconset/Classic-512.png index 7d8627f9..68eb71c1 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Classic.appiconset/Classic-512.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Classic.appiconset/Classic-512.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Classic.appiconset/Classic-64.png b/Loop/Assets.xcassets/App Icons/AppIcon-Classic.appiconset/Classic-64.png index b230e9b0..2b182c96 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Classic.appiconset/Classic-64.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Classic.appiconset/Classic-64.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Holo.appiconset/Holo-1024.png b/Loop/Assets.xcassets/App Icons/AppIcon-Holo.appiconset/Holo-1024.png index 3f990916..ee38d020 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Holo.appiconset/Holo-1024.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Holo.appiconset/Holo-1024.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Holo.appiconset/Holo-128.png b/Loop/Assets.xcassets/App Icons/AppIcon-Holo.appiconset/Holo-128.png index efb90193..1aa5ed6b 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Holo.appiconset/Holo-128.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Holo.appiconset/Holo-128.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Holo.appiconset/Holo-16.png b/Loop/Assets.xcassets/App Icons/AppIcon-Holo.appiconset/Holo-16.png index 7cb55618..176e1a85 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Holo.appiconset/Holo-16.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Holo.appiconset/Holo-16.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Holo.appiconset/Holo-256.png b/Loop/Assets.xcassets/App Icons/AppIcon-Holo.appiconset/Holo-256.png index 37eb642e..423236f9 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Holo.appiconset/Holo-256.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Holo.appiconset/Holo-256.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Holo.appiconset/Holo-32.png b/Loop/Assets.xcassets/App Icons/AppIcon-Holo.appiconset/Holo-32.png index 21ec3527..49722a24 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Holo.appiconset/Holo-32.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Holo.appiconset/Holo-32.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Holo.appiconset/Holo-512.png b/Loop/Assets.xcassets/App Icons/AppIcon-Holo.appiconset/Holo-512.png index fc7d1b1e..bb010da1 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Holo.appiconset/Holo-512.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Holo.appiconset/Holo-512.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Holo.appiconset/Holo-64.png b/Loop/Assets.xcassets/App Icons/AppIcon-Holo.appiconset/Holo-64.png index f97b4266..e2492874 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Holo.appiconset/Holo-64.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Holo.appiconset/Holo-64.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Keycap.appiconset/Keycap-1024.png b/Loop/Assets.xcassets/App Icons/AppIcon-Keycap.appiconset/Keycap-1024.png index da904e5b..6da51f02 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Keycap.appiconset/Keycap-1024.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Keycap.appiconset/Keycap-1024.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Keycap.appiconset/Keycap-128.png b/Loop/Assets.xcassets/App Icons/AppIcon-Keycap.appiconset/Keycap-128.png index 74ab01af..7501dd77 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Keycap.appiconset/Keycap-128.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Keycap.appiconset/Keycap-128.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Keycap.appiconset/Keycap-16.png b/Loop/Assets.xcassets/App Icons/AppIcon-Keycap.appiconset/Keycap-16.png index 1100dace..15352d58 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Keycap.appiconset/Keycap-16.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Keycap.appiconset/Keycap-16.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Keycap.appiconset/Keycap-256.png b/Loop/Assets.xcassets/App Icons/AppIcon-Keycap.appiconset/Keycap-256.png index 7e57bb97..231f4b34 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Keycap.appiconset/Keycap-256.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Keycap.appiconset/Keycap-256.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Keycap.appiconset/Keycap-32.png b/Loop/Assets.xcassets/App Icons/AppIcon-Keycap.appiconset/Keycap-32.png index 8166b806..29c80d34 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Keycap.appiconset/Keycap-32.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Keycap.appiconset/Keycap-32.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Keycap.appiconset/Keycap-512.png b/Loop/Assets.xcassets/App Icons/AppIcon-Keycap.appiconset/Keycap-512.png index a067fb9c..7419fe10 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Keycap.appiconset/Keycap-512.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Keycap.appiconset/Keycap-512.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Keycap.appiconset/Keycap-64.png b/Loop/Assets.xcassets/App Icons/AppIcon-Keycap.appiconset/Keycap-64.png index d1808425..5fb5eb68 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Keycap.appiconset/Keycap-64.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Keycap.appiconset/Keycap-64.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Loop Master.appiconset/Master-1024.png b/Loop/Assets.xcassets/App Icons/AppIcon-Loop Master.appiconset/Master-1024.png index 7c1d0209..03a6e359 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Loop Master.appiconset/Master-1024.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Loop Master.appiconset/Master-1024.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Loop Master.appiconset/Master-128.png b/Loop/Assets.xcassets/App Icons/AppIcon-Loop Master.appiconset/Master-128.png index e47998d6..2a7b8adc 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Loop Master.appiconset/Master-128.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Loop Master.appiconset/Master-128.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Loop Master.appiconset/Master-16.png b/Loop/Assets.xcassets/App Icons/AppIcon-Loop Master.appiconset/Master-16.png index eef2aeb5..fcc0160d 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Loop Master.appiconset/Master-16.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Loop Master.appiconset/Master-16.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Loop Master.appiconset/Master-256.png b/Loop/Assets.xcassets/App Icons/AppIcon-Loop Master.appiconset/Master-256.png index c69a9d5a..7ee6a636 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Loop Master.appiconset/Master-256.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Loop Master.appiconset/Master-256.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Loop Master.appiconset/Master-32.png b/Loop/Assets.xcassets/App Icons/AppIcon-Loop Master.appiconset/Master-32.png index c128ec21..69952754 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Loop Master.appiconset/Master-32.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Loop Master.appiconset/Master-32.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Loop Master.appiconset/Master-512.png b/Loop/Assets.xcassets/App Icons/AppIcon-Loop Master.appiconset/Master-512.png index 600922e9..f816a023 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Loop Master.appiconset/Master-512.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Loop Master.appiconset/Master-512.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Loop Master.appiconset/Master-64.png b/Loop/Assets.xcassets/App Icons/AppIcon-Loop Master.appiconset/Master-64.png index 711fcaa1..6ae9bfec 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Loop Master.appiconset/Master-64.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Loop Master.appiconset/Master-64.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Meta Loop.appiconset/Meta Loop-1024.png b/Loop/Assets.xcassets/App Icons/AppIcon-Meta Loop.appiconset/Meta Loop-1024.png index e5222432..0bf4120b 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Meta Loop.appiconset/Meta Loop-1024.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Meta Loop.appiconset/Meta Loop-1024.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Meta Loop.appiconset/Meta Loop-128.png b/Loop/Assets.xcassets/App Icons/AppIcon-Meta Loop.appiconset/Meta Loop-128.png index dece2e9f..cf6bac5a 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Meta Loop.appiconset/Meta Loop-128.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Meta Loop.appiconset/Meta Loop-128.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Meta Loop.appiconset/Meta Loop-16.png b/Loop/Assets.xcassets/App Icons/AppIcon-Meta Loop.appiconset/Meta Loop-16.png index cc545d5a..3add1249 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Meta Loop.appiconset/Meta Loop-16.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Meta Loop.appiconset/Meta Loop-16.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Meta Loop.appiconset/Meta Loop-256.png b/Loop/Assets.xcassets/App Icons/AppIcon-Meta Loop.appiconset/Meta Loop-256.png index c6c7ba4a..83cb1590 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Meta Loop.appiconset/Meta Loop-256.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Meta Loop.appiconset/Meta Loop-256.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Meta Loop.appiconset/Meta Loop-32.png b/Loop/Assets.xcassets/App Icons/AppIcon-Meta Loop.appiconset/Meta Loop-32.png index eeaef94f..339c2a83 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Meta Loop.appiconset/Meta Loop-32.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Meta Loop.appiconset/Meta Loop-32.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Meta Loop.appiconset/Meta Loop-512.png b/Loop/Assets.xcassets/App Icons/AppIcon-Meta Loop.appiconset/Meta Loop-512.png index 9cfd38a9..3b35b8e3 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Meta Loop.appiconset/Meta Loop-512.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Meta Loop.appiconset/Meta Loop-512.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Meta Loop.appiconset/Meta Loop-64.png b/Loop/Assets.xcassets/App Icons/AppIcon-Meta Loop.appiconset/Meta Loop-64.png index 26a53e4c..a2a46b30 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Meta Loop.appiconset/Meta Loop-64.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Meta Loop.appiconset/Meta Loop-64.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Rose Pine.appiconset/Rose Pine-1024.png b/Loop/Assets.xcassets/App Icons/AppIcon-Rose Pine.appiconset/Rose Pine-1024.png index c0c85e7d..15378ad3 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Rose Pine.appiconset/Rose Pine-1024.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Rose Pine.appiconset/Rose Pine-1024.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Rose Pine.appiconset/Rose Pine-128.png b/Loop/Assets.xcassets/App Icons/AppIcon-Rose Pine.appiconset/Rose Pine-128.png index da82606a..3f4114b9 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Rose Pine.appiconset/Rose Pine-128.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Rose Pine.appiconset/Rose Pine-128.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Rose Pine.appiconset/Rose Pine-16.png b/Loop/Assets.xcassets/App Icons/AppIcon-Rose Pine.appiconset/Rose Pine-16.png index e0f60743..750a9d8d 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Rose Pine.appiconset/Rose Pine-16.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Rose Pine.appiconset/Rose Pine-16.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Rose Pine.appiconset/Rose Pine-256.png b/Loop/Assets.xcassets/App Icons/AppIcon-Rose Pine.appiconset/Rose Pine-256.png index 6ba14338..72f4e0b2 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Rose Pine.appiconset/Rose Pine-256.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Rose Pine.appiconset/Rose Pine-256.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Rose Pine.appiconset/Rose Pine-32.png b/Loop/Assets.xcassets/App Icons/AppIcon-Rose Pine.appiconset/Rose Pine-32.png index 98fafc8b..1080506a 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Rose Pine.appiconset/Rose Pine-32.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Rose Pine.appiconset/Rose Pine-32.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Rose Pine.appiconset/Rose Pine-512.png b/Loop/Assets.xcassets/App Icons/AppIcon-Rose Pine.appiconset/Rose Pine-512.png index fb1fae8c..0a686c40 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Rose Pine.appiconset/Rose Pine-512.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Rose Pine.appiconset/Rose Pine-512.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-Rose Pine.appiconset/Rose Pine-64.png b/Loop/Assets.xcassets/App Icons/AppIcon-Rose Pine.appiconset/Rose Pine-64.png index 76a5f9cb..57c39529 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-Rose Pine.appiconset/Rose Pine-64.png and b/Loop/Assets.xcassets/App Icons/AppIcon-Rose Pine.appiconset/Rose Pine-64.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-White.appiconset/White-1024.png b/Loop/Assets.xcassets/App Icons/AppIcon-White.appiconset/White-1024.png index 693458d0..14528735 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-White.appiconset/White-1024.png and b/Loop/Assets.xcassets/App Icons/AppIcon-White.appiconset/White-1024.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-White.appiconset/White-128.png b/Loop/Assets.xcassets/App Icons/AppIcon-White.appiconset/White-128.png index 8387cca3..5a7cc8af 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-White.appiconset/White-128.png and b/Loop/Assets.xcassets/App Icons/AppIcon-White.appiconset/White-128.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-White.appiconset/White-16.png b/Loop/Assets.xcassets/App Icons/AppIcon-White.appiconset/White-16.png index 8035f5d2..7f8b7dd2 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-White.appiconset/White-16.png and b/Loop/Assets.xcassets/App Icons/AppIcon-White.appiconset/White-16.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-White.appiconset/White-256.png b/Loop/Assets.xcassets/App Icons/AppIcon-White.appiconset/White-256.png index 32739ec0..6ba18de2 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-White.appiconset/White-256.png and b/Loop/Assets.xcassets/App Icons/AppIcon-White.appiconset/White-256.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-White.appiconset/White-32.png b/Loop/Assets.xcassets/App Icons/AppIcon-White.appiconset/White-32.png index e9bbf9da..7c9521a5 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-White.appiconset/White-32.png and b/Loop/Assets.xcassets/App Icons/AppIcon-White.appiconset/White-32.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-White.appiconset/White-512.png b/Loop/Assets.xcassets/App Icons/AppIcon-White.appiconset/White-512.png index b37a872b..22ad592a 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-White.appiconset/White-512.png and b/Loop/Assets.xcassets/App Icons/AppIcon-White.appiconset/White-512.png differ diff --git a/Loop/Assets.xcassets/App Icons/AppIcon-White.appiconset/White-64.png b/Loop/Assets.xcassets/App Icons/AppIcon-White.appiconset/White-64.png index d7ca8eca..2c1db9e3 100644 Binary files a/Loop/Assets.xcassets/App Icons/AppIcon-White.appiconset/White-64.png and b/Loop/Assets.xcassets/App Icons/AppIcon-White.appiconset/White-64.png differ diff --git a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Black Hole.appiconset/Black Hole-1024.png b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Black Hole.appiconset/Black Hole-1024.png index 48e6044d..10ede8eb 100644 Binary files a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Black Hole.appiconset/Black Hole-1024.png and b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Black Hole.appiconset/Black Hole-1024.png differ diff --git a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Black Hole.appiconset/Black Hole-128.png b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Black Hole.appiconset/Black Hole-128.png index ddc06fe1..a7a3256d 100644 Binary files a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Black Hole.appiconset/Black Hole-128.png and b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Black Hole.appiconset/Black Hole-128.png differ diff --git a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Black Hole.appiconset/Black Hole-16.png b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Black Hole.appiconset/Black Hole-16.png index a1735609..f63cacc6 100644 Binary files a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Black Hole.appiconset/Black Hole-16.png and b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Black Hole.appiconset/Black Hole-16.png differ diff --git a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Black Hole.appiconset/Black Hole-256.png b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Black Hole.appiconset/Black Hole-256.png index 18552a2c..cbb38409 100644 Binary files a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Black Hole.appiconset/Black Hole-256.png and b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Black Hole.appiconset/Black Hole-256.png differ diff --git a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Black Hole.appiconset/Black Hole-32.png b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Black Hole.appiconset/Black Hole-32.png index 4a62920f..014056bf 100644 Binary files a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Black Hole.appiconset/Black Hole-32.png and b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Black Hole.appiconset/Black Hole-32.png differ diff --git a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Black Hole.appiconset/Black Hole-512.png b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Black Hole.appiconset/Black Hole-512.png index 509765f1..980a0211 100644 Binary files a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Black Hole.appiconset/Black Hole-512.png and b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Black Hole.appiconset/Black Hole-512.png differ diff --git a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Black Hole.appiconset/Black Hole-64.png b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Black Hole.appiconset/Black Hole-64.png index 618d2967..3e00ce08 100644 Binary files a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Black Hole.appiconset/Black Hole-64.png and b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Black Hole.appiconset/Black Hole-64.png differ diff --git a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Neon.appiconset/Neon-1024.png b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Neon.appiconset/Neon-1024.png index af9523cd..34391b06 100644 Binary files a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Neon.appiconset/Neon-1024.png and b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Neon.appiconset/Neon-1024.png differ diff --git a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Neon.appiconset/Neon-128.png b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Neon.appiconset/Neon-128.png index 16473259..a53cad8c 100644 Binary files a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Neon.appiconset/Neon-128.png and b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Neon.appiconset/Neon-128.png differ diff --git a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Neon.appiconset/Neon-16.png b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Neon.appiconset/Neon-16.png index 78ac3f87..87ddafa9 100644 Binary files a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Neon.appiconset/Neon-16.png and b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Neon.appiconset/Neon-16.png differ diff --git a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Neon.appiconset/Neon-256.png b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Neon.appiconset/Neon-256.png index 29ca8c86..892d1df9 100644 Binary files a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Neon.appiconset/Neon-256.png and b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Neon.appiconset/Neon-256.png differ diff --git a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Neon.appiconset/Neon-32.png b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Neon.appiconset/Neon-32.png index 38834f4e..157dd7d7 100644 Binary files a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Neon.appiconset/Neon-32.png and b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Neon.appiconset/Neon-32.png differ diff --git a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Neon.appiconset/Neon-512.png b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Neon.appiconset/Neon-512.png index 8f5822c6..aabe79d1 100644 Binary files a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Neon.appiconset/Neon-512.png and b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Neon.appiconset/Neon-512.png differ diff --git a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Neon.appiconset/Neon-64.png b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Neon.appiconset/Neon-64.png index a597b13c..5f55daec 100644 Binary files a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Neon.appiconset/Neon-64.png and b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Neon.appiconset/Neon-64.png differ diff --git a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Simon.appiconset/Simon-1024.png b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Simon.appiconset/Simon-1024.png index 34c71a8b..79166abe 100644 Binary files a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Simon.appiconset/Simon-1024.png and b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Simon.appiconset/Simon-1024.png differ diff --git a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Simon.appiconset/Simon-128.png b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Simon.appiconset/Simon-128.png index 902ad50e..e35a2941 100644 Binary files a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Simon.appiconset/Simon-128.png and b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Simon.appiconset/Simon-128.png differ diff --git a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Simon.appiconset/Simon-16.png b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Simon.appiconset/Simon-16.png index 7c784005..a55763bc 100644 Binary files a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Simon.appiconset/Simon-16.png and b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Simon.appiconset/Simon-16.png differ diff --git a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Simon.appiconset/Simon-256.png b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Simon.appiconset/Simon-256.png index 0968aa1a..4321a31c 100644 Binary files a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Simon.appiconset/Simon-256.png and b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Simon.appiconset/Simon-256.png differ diff --git a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Simon.appiconset/Simon-32.png b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Simon.appiconset/Simon-32.png index a75a5140..e2664cba 100644 Binary files a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Simon.appiconset/Simon-32.png and b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Simon.appiconset/Simon-32.png differ diff --git a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Simon.appiconset/Simon-512.png b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Simon.appiconset/Simon-512.png index 87768933..5681797b 100644 Binary files a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Simon.appiconset/Simon-512.png and b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Simon.appiconset/Simon-512.png differ diff --git a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Simon.appiconset/Simon-64.png b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Simon.appiconset/Simon-64.png index aba044b4..43c21273 100644 Binary files a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Simon.appiconset/Simon-64.png and b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Simon.appiconset/Simon-64.png differ diff --git a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Synthwave Sunset.appiconset/Synthwave Sunset-1024.png b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Synthwave Sunset.appiconset/Synthwave Sunset-1024.png index 8f74ffe1..6860f6ee 100644 Binary files a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Synthwave Sunset.appiconset/Synthwave Sunset-1024.png and b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Synthwave Sunset.appiconset/Synthwave Sunset-1024.png differ diff --git a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Synthwave Sunset.appiconset/Synthwave Sunset-128.png b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Synthwave Sunset.appiconset/Synthwave Sunset-128.png index 12608cd0..065ba6a4 100644 Binary files a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Synthwave Sunset.appiconset/Synthwave Sunset-128.png and b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Synthwave Sunset.appiconset/Synthwave Sunset-128.png differ diff --git a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Synthwave Sunset.appiconset/Synthwave Sunset-16.png b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Synthwave Sunset.appiconset/Synthwave Sunset-16.png index a0c66780..b9868f0b 100644 Binary files a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Synthwave Sunset.appiconset/Synthwave Sunset-16.png and b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Synthwave Sunset.appiconset/Synthwave Sunset-16.png differ diff --git a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Synthwave Sunset.appiconset/Synthwave Sunset-256.png b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Synthwave Sunset.appiconset/Synthwave Sunset-256.png index 91bb6f2a..35955f16 100644 Binary files a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Synthwave Sunset.appiconset/Synthwave Sunset-256.png and b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Synthwave Sunset.appiconset/Synthwave Sunset-256.png differ diff --git a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Synthwave Sunset.appiconset/Synthwave Sunset-32.png b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Synthwave Sunset.appiconset/Synthwave Sunset-32.png index b45fd750..c1091162 100644 Binary files a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Synthwave Sunset.appiconset/Synthwave Sunset-32.png and b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Synthwave Sunset.appiconset/Synthwave Sunset-32.png differ diff --git a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Synthwave Sunset.appiconset/Synthwave Sunset-512.png b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Synthwave Sunset.appiconset/Synthwave Sunset-512.png index 0fae44a8..b6a4574d 100644 Binary files a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Synthwave Sunset.appiconset/Synthwave Sunset-512.png and b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Synthwave Sunset.appiconset/Synthwave Sunset-512.png differ diff --git a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Synthwave Sunset.appiconset/Synthwave Sunset-64.png b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Synthwave Sunset.appiconset/Synthwave Sunset-64.png index 64681577..17c8c13e 100644 Binary files a/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Synthwave Sunset.appiconset/Synthwave Sunset-64.png and b/Loop/Assets.xcassets/App Icons/Greg Lassale/AppIcon-Synthwave Sunset.appiconset/Synthwave Sunset-64.png differ diff --git a/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Developer.appiconset/Developer-1024.png b/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Developer.appiconset/Developer-1024.png index 03d52ff8..aebe40fb 100644 Binary files a/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Developer.appiconset/Developer-1024.png and b/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Developer.appiconset/Developer-1024.png differ diff --git a/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Developer.appiconset/Developer-128.png b/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Developer.appiconset/Developer-128.png index 733005c0..2a44955b 100644 Binary files a/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Developer.appiconset/Developer-128.png and b/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Developer.appiconset/Developer-128.png differ diff --git a/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Developer.appiconset/Developer-16.png b/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Developer.appiconset/Developer-16.png index 10410285..83264803 100644 Binary files a/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Developer.appiconset/Developer-16.png and b/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Developer.appiconset/Developer-16.png differ diff --git a/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Developer.appiconset/Developer-256.png b/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Developer.appiconset/Developer-256.png index 3eb37490..dacec9c2 100644 Binary files a/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Developer.appiconset/Developer-256.png and b/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Developer.appiconset/Developer-256.png differ diff --git a/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Developer.appiconset/Developer-32.png b/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Developer.appiconset/Developer-32.png index 14f16cc9..a0f11753 100644 Binary files a/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Developer.appiconset/Developer-32.png and b/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Developer.appiconset/Developer-32.png differ diff --git a/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Developer.appiconset/Developer-512.png b/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Developer.appiconset/Developer-512.png index 7aaca8aa..803880eb 100644 Binary files a/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Developer.appiconset/Developer-512.png and b/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Developer.appiconset/Developer-512.png differ diff --git a/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Developer.appiconset/Developer-64.png b/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Developer.appiconset/Developer-64.png index 3a823948..befa591f 100644 Binary files a/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Developer.appiconset/Developer-64.png and b/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Developer.appiconset/Developer-64.png differ diff --git a/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Summer.appiconset/Summer-1024.png b/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Summer.appiconset/Summer-1024.png index f69d21e9..abdf8102 100644 Binary files a/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Summer.appiconset/Summer-1024.png and b/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Summer.appiconset/Summer-1024.png differ diff --git a/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Summer.appiconset/Summer-128.png b/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Summer.appiconset/Summer-128.png index 47db3b4b..fae572ed 100644 Binary files a/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Summer.appiconset/Summer-128.png and b/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Summer.appiconset/Summer-128.png differ diff --git a/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Summer.appiconset/Summer-16.png b/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Summer.appiconset/Summer-16.png index 65ee1f22..dcb39ea9 100644 Binary files a/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Summer.appiconset/Summer-16.png and b/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Summer.appiconset/Summer-16.png differ diff --git a/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Summer.appiconset/Summer-256.png b/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Summer.appiconset/Summer-256.png index d9823617..cd3c0813 100644 Binary files a/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Summer.appiconset/Summer-256.png and b/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Summer.appiconset/Summer-256.png differ diff --git a/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Summer.appiconset/Summer-32.png b/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Summer.appiconset/Summer-32.png index 9d8820c2..835eb912 100644 Binary files a/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Summer.appiconset/Summer-32.png and b/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Summer.appiconset/Summer-32.png differ diff --git a/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Summer.appiconset/Summer-512.png b/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Summer.appiconset/Summer-512.png index 445b2cad..7ada6b68 100644 Binary files a/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Summer.appiconset/Summer-512.png and b/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Summer.appiconset/Summer-512.png differ diff --git a/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Summer.appiconset/Summer-64.png b/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Summer.appiconset/Summer-64.png index 40ac030a..fdf08bf8 100644 Binary files a/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Summer.appiconset/Summer-64.png and b/Loop/Assets.xcassets/App Icons/JSDev/AppIcon-Summer.appiconset/Summer-64.png differ diff --git a/Loop/Assets.xcassets/Credits/github.imageset/GitHub-Mark-ea2971cee799.png b/Loop/Assets.xcassets/Credits/github.imageset/GitHub-Mark-ea2971cee799.png index a3833d0b..0af71a77 100644 Binary files a/Loop/Assets.xcassets/Credits/github.imageset/GitHub-Mark-ea2971cee799.png and b/Loop/Assets.xcassets/Credits/github.imageset/GitHub-Mark-ea2971cee799.png differ diff --git a/Loop/Assets.xcassets/Credits/greglassale.imageset/eNO2LxOQ_200x200.jpg b/Loop/Assets.xcassets/Credits/greglassale.imageset/eNO2LxOQ_200x200.jpg index 7b1b32d9..0a1cd992 100644 Binary files a/Loop/Assets.xcassets/Credits/greglassale.imageset/eNO2LxOQ_200x200.jpg and b/Loop/Assets.xcassets/Credits/greglassale.imageset/eNO2LxOQ_200x200.jpg differ diff --git a/Loop/Assets.xcassets/Credits/jace.imageset/U5MArPgZ_200x200.jpg b/Loop/Assets.xcassets/Credits/jace.imageset/U5MArPgZ_200x200.jpg index 7cfe2d15..f0e46c99 100644 Binary files a/Loop/Assets.xcassets/Credits/jace.imageset/U5MArPgZ_200x200.jpg and b/Loop/Assets.xcassets/Credits/jace.imageset/U5MArPgZ_200x200.jpg differ diff --git a/Loop/Assets.xcassets/Credits/jsdev.imageset/80474621.png b/Loop/Assets.xcassets/Credits/jsdev.imageset/80474621.png index b3b92b2d..d18d4ce3 100644 Binary files a/Loop/Assets.xcassets/Credits/jsdev.imageset/80474621.png and b/Loop/Assets.xcassets/Credits/jsdev.imageset/80474621.png differ diff --git a/Loop/Assets.xcassets/Credits/kai.imageset/68963405.png b/Loop/Assets.xcassets/Credits/kai.imageset/68963405.png index 971f6d6d..f7f4b6a6 100644 Binary files a/Loop/Assets.xcassets/Credits/kai.imageset/68963405.png and b/Loop/Assets.xcassets/Credits/kai.imageset/68963405.png differ diff --git a/Loop/Assets.xcassets/Credits/kami.imageset/103985728.jpeg b/Loop/Assets.xcassets/Credits/kami.imageset/103985728.jpeg index f9f443ee..4ef3a2e4 100644 Binary files a/Loop/Assets.xcassets/Credits/kami.imageset/103985728.jpeg and b/Loop/Assets.xcassets/Credits/kami.imageset/103985728.jpeg differ diff --git a/Loop/Assets.xcassets/Window Actions/custom.macwindow.trianglebadge.exclamationmark.symbolset/custom.macwindow.trianglebadge.exclamationmark.svg b/Loop/Assets.xcassets/Window Actions/custom.macwindow.trianglebadge.exclamationmark.symbolset/custom.macwindow.trianglebadge.exclamationmark.svg index a619c463..d059d1fb 100644 --- a/Loop/Assets.xcassets/Window Actions/custom.macwindow.trianglebadge.exclamationmark.symbolset/custom.macwindow.trianglebadge.exclamationmark.svg +++ b/Loop/Assets.xcassets/Window Actions/custom.macwindow.trianglebadge.exclamationmark.symbolset/custom.macwindow.trianglebadge.exclamationmark.svg @@ -1,139 +1 @@ - - - - - - - - - - Weight/Scale Variations - Ultralight - Thin - Light - Regular - Medium - Semibold - Bold - Heavy - Black - - - - - - - - - - - Design Variations - Symbols are supported in up to nine weights and three scales. - For optimal layout with text and other symbols, vertically align - symbols with the adjacent text. - - - - - - Margins - Leading and trailing margins on the left and right side of each symbol - can be adjusted by modifying the x-location of the margin guidelines. - Modifications are automatically applied proportionally to all - scales and weights. - - - - Exporting - Symbols should be outlined when exporting to ensure the - design is preserved when submitting to Xcode. - Template v.4.0 - Requires Xcode 14 or greater - Generated from - Typeset at 100.0 points - Small - Medium - Large - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Weight/Scale VariationsUltralightThinLightRegularMediumSemiboldBoldHeavyBlackDesign VariationsSymbols are supported in up to nine weights and three scales.For optimal layout with text and other symbols, vertically alignsymbols with the adjacent text.MarginsLeading and trailing margins on the left and right side of each symbolcan be adjusted by modifying the x-location of the margin guidelines.Modifications are automatically applied proportionally to allscales and weights.ExportingSymbols should be outlined when exporting to ensure thedesign is preserved when submitting to Xcode.Template v.4.0Requires Xcode 14 or greaterGenerated fromTypeset at 100.0 pointsSmallMediumLarge \ No newline at end of file diff --git a/Loop/Assets.xcassets/Window Actions/custom.rectangle.slash.symbolset/custom.rectangle.slash.svg b/Loop/Assets.xcassets/Window Actions/custom.rectangle.slash.symbolset/custom.rectangle.slash.svg index bed8d71f..b4745b41 100644 --- a/Loop/Assets.xcassets/Window Actions/custom.rectangle.slash.symbolset/custom.rectangle.slash.svg +++ b/Loop/Assets.xcassets/Window Actions/custom.rectangle.slash.symbolset/custom.rectangle.slash.svg @@ -1,114 +1 @@ - - - - - - - - - - Weight/Scale Variations - Ultralight - Thin - Light - Regular - Medium - Semibold - Bold - Heavy - Black - - - - - - - - - - - Design Variations - Symbols are supported in up to nine weights and three scales. - For optimal layout with text and other symbols, vertically align - symbols with the adjacent text. - - - - - - Margins - Leading and trailing margins on the left and right side of each symbol - can be adjusted by modifying the x-location of the margin guidelines. - Modifications are automatically applied proportionally to all - scales and weights. - - - - Exporting - Symbols should be outlined when exporting to ensure the - design is preserved when submitting to Xcode. - Template v.4.0 - Requires Xcode 14 or greater - Generated from - Typeset at 100.0 points - Small - Medium - Large - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Weight/Scale VariationsUltralightThinLightRegularMediumSemiboldBoldHeavyBlackDesign VariationsSymbols are supported in up to nine weights and three scales.For optimal layout with text and other symbols, vertically alignsymbols with the adjacent text.MarginsLeading and trailing margins on the left and right side of each symbolcan be adjusted by modifying the x-location of the margin guidelines.Modifications are automatically applied proportionally to allscales and weights.ExportingSymbols should be outlined when exporting to ensure thedesign is preserved when submitting to Xcode.Template v.4.0Requires Xcode 14 or greaterGenerated fromTypeset at 100.0 pointsSmallMediumLarge \ No newline at end of file diff --git a/Loop/Assets.xcassets/empty.imageset/empty.png b/Loop/Assets.xcassets/empty.imageset/empty.png index 34d50284..942387fc 100644 Binary files a/Loop/Assets.xcassets/empty.imageset/empty.png and b/Loop/Assets.xcassets/empty.imageset/empty.png differ diff --git a/Loop/Assets.xcassets/menubarIcon.imageset/menubarIconx2.png b/Loop/Assets.xcassets/menubarIcon.imageset/menubarIconx2.png index 59c20f9f..9cdec6f7 100644 Binary files a/Loop/Assets.xcassets/menubarIcon.imageset/menubarIconx2.png and b/Loop/Assets.xcassets/menubarIcon.imageset/menubarIconx2.png differ diff --git a/Loop/Assets.xcassets/menubarIcon.imageset/menubarIconx3.png b/Loop/Assets.xcassets/menubarIcon.imageset/menubarIconx3.png index f84dc88c..f179b5fe 100644 Binary files a/Loop/Assets.xcassets/menubarIcon.imageset/menubarIconx3.png and b/Loop/Assets.xcassets/menubarIcon.imageset/menubarIconx3.png differ diff --git a/Loop/Extensions/Bundle+Extensions.swift b/Loop/Extensions/Bundle+Extensions.swift index de6d069b..21d5a8a2 100644 --- a/Loop/Extensions/Bundle+Extensions.swift +++ b/Loop/Extensions/Bundle+Extensions.swift @@ -10,30 +10,30 @@ import Foundation // Returns the current build number extension Bundle { var appName: String { - getInfo("CFBundleName") + getInfo("CFBundleName") ?? "⚠️" } var displayName: String { - getInfo("CFBundleDisplayName") + getInfo("CFBundleDisplayName") ?? "⚠️" } var bundleID: String { - getInfo("CFBundleIdentifier") + getInfo("CFBundleIdentifier") ?? "⚠️" } var copyright: String { - getInfo("NSHumanReadableCopyright") + getInfo("NSHumanReadableCopyright") ?? "⚠️" } - var appBuild: String { - getInfo("CFBundleVersion") + var appBuild: Int? { + Int(getInfo("CFBundleVersion") ?? "") } - var appVersion: String { + var appVersion: String? { getInfo("CFBundleShortVersionString") } - func getInfo(_ str: String) -> String { - infoDictionary?[str] as? String ?? "" + func getInfo(_ str: String) -> String? { + infoDictionary?[str] as? String } } diff --git a/Loop/Localizable.xcstrings b/Loop/Localizable.xcstrings index 2961ca4e..abd80135 100644 --- a/Loop/Localizable.xcstrings +++ b/Loop/Localizable.xcstrings @@ -161,6 +161,16 @@ } } }, + "%@ (%lld)" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "%1$@ (%2$lld)" + } + } + } + }, "%@ %@" : { "localizations" : { "en" : { @@ -326,6 +336,15 @@ } } } + }, + "99 problems, updates ain't one." : { + + }, + "A penny for your... lack of updates." : { + + }, + "A watched pot never... updates." : { + }, "About" : { "localizations" : { @@ -620,6 +639,15 @@ } } } + }, + "All systems are a-go!" : { + + }, + "All work and no... no updates..." : { + + }, + "An apple a day keeps the... updates away." : { + }, "Animate window resize" : { "localizations" : { @@ -700,6 +728,9 @@ } } } + }, + "Beggars can't be... updaters." : { + }, "Behavior" : { "localizations" : { @@ -1947,6 +1978,9 @@ } } } + }, + "Engage! ...in the current version, it's the latest." : { + }, "Excluded Apps" : { "localizations" : { @@ -2507,6 +2541,15 @@ } } } + }, + "I swear it was here somewhere... one sec" : { + + }, + "I... uhh... one sec I lost it" : { + + }, + "I'm giving it all she's got, Captain! No updates!" : { + }, "Icon" : { "localizations" : { @@ -3426,6 +3469,9 @@ } } } + }, + "In a galaxy far, far away... still no updates!" : { + }, "Include development versions" : { "localizations" : { @@ -3626,6 +3672,9 @@ } } } + }, + "Just a small town app, same old version" : { + }, "Keybindings" : { "localizations" : { @@ -3867,6 +3916,9 @@ } } } + }, + "Loop is in its prime!" : { + }, "May the Force be with you... next time!" : { "localizations" : { @@ -3947,6 +3999,9 @@ } } } + }, + "Money can't buy... updates." : { + }, "More" : { "localizations" : { @@ -4027,6 +4082,9 @@ } } } + }, + "New version? Sorry, we're too attached to this one." : { + }, "No excluded applications" : { "localizations" : { @@ -4147,6 +4205,9 @@ } } } + }, + "No updates in Ba Sing Se" : { + }, "No updates yet!" : { "localizations" : { @@ -4187,6 +4248,12 @@ } } } + }, + "No updates, Mr. Anderson" : { + + }, + "No updates? Great Scott!" : { + }, "None" : { "localizations" : { @@ -4354,6 +4421,9 @@ } } } + }, + "One does not simply update Loop." : { + }, "Options" : { "localizations" : { @@ -4394,6 +4464,9 @@ } } } + }, + "Our app is on a digital diet. No new bytes allowed." : { + }, "Padding" : { "localizations" : { @@ -5314,6 +5387,9 @@ } } } + }, + "Riding at warp speed, no updates in sight!" : { + }, "Right" : { "localizations" : { @@ -6121,6 +6197,9 @@ } } } + }, + "Sweet dreams are made of... no updates" : { + }, "System" : { "localizations" : { @@ -6321,6 +6400,12 @@ } } } + }, + "The odds are ever in your favor, no updates today!" : { + + }, + "The update fairy skipped us this week." : { + }, "Theming" : { "localizations" : { @@ -6401,6 +6486,9 @@ } } } + }, + "This app is more up to date than my diary entries!" : { + }, "This feature is still under development." : { "localizations" : { @@ -6641,6 +6729,9 @@ } } } + }, + "Updates? In this economy?" : { + }, "Use coordinates" : { "localizations" : { @@ -6843,6 +6934,7 @@ } }, "Version %@ (%@)" : { + "extractionState" : "stale", "localizations" : { "en" : { "stringUnit" : { @@ -6888,6 +6980,16 @@ } } }, + "Version %@ (%lld)" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Version %1$@ (%2$lld)" + } + } + } + }, "Vertical Thirds" : { "localizations" : { "en-GB" : { @@ -6927,6 +7029,12 @@ } } } + }, + "We’ll be back. With updates... later" : { + + }, + "We've misplaced the 'Update' button. Oops!" : { + }, "Width" : { "localizations" : { @@ -9329,6 +9437,9 @@ } } } + }, + "Winter is coming. Updates aren't yet." : { + }, "X" : { "localizations" : { @@ -9489,6 +9600,12 @@ } } } + }, + "You're cruising on the latest tech!" : { + + }, + "You're in the clear, no updates in the atmosphere!" : { + }, "You're up to date :)" : { "localizations" : { @@ -9689,6 +9806,9 @@ } } } + }, + "Your Loop is loopier than ever, no updates found!" : { + } }, "version" : "1.0" diff --git a/Loop/LoopApp.swift b/Loop/LoopApp.swift index 6187d628..1edea01e 100644 --- a/Loop/LoopApp.swift +++ b/Loop/LoopApp.swift @@ -18,7 +18,7 @@ struct LoopApp: App { var body: some Scene { MenuBarExtra(Bundle.main.appName, image: "empty", isInserted: Binding.constant(!hideMenuBarIcon)) { #if DEBUG - MenuBarHeaderText("DEV BUILD: \(Bundle.main.appVersion) (\(Bundle.main.appBuild))") + MenuBarHeaderText("DEV BUILD: \(Bundle.main.appVersion ?? "Unknown") (\(Bundle.main.appBuild ?? 0))") #endif Button { diff --git a/Loop/Luminare/Loop/AboutConfiguration.swift b/Loop/Luminare/Loop/AboutConfiguration.swift index 4e46fcb7..9ce5d8d8 100644 --- a/Loop/Luminare/Loop/AboutConfiguration.swift +++ b/Loop/Luminare/Loop/AboutConfiguration.swift @@ -12,15 +12,10 @@ import SwiftUI class AboutConfigurationModel: ObservableObject { let currentIcon = Defaults[.currentIcon] // no need for didSet since it won't change here + private var shuffledTexts: [LocalizedStringKey] = [] // Store the shuffled texts @Published var isHoveringOverVersionCopier = false - @Published var includeDevelopmentVersions = Defaults[.includeDevelopmentVersions] { - didSet { - Defaults[.includeDevelopmentVersions] = includeDevelopmentVersions - } - } - @Published var updateButtonTitle: LocalizedStringKey = "Check for updates…" let credits: [CreditItem] = [ @@ -62,25 +57,68 @@ class AboutConfigurationModel: ObservableObject { ) ] - let upToDateText: [LocalizedStringKey] = [ - "You're up to date :)", - "No updates yet!", - "You've already got the best Loop!", - "Check back next time!", + // A max of 28 W's can fit in here :) + var upToDateText: [LocalizedStringKey] = [ + "Engage! ...in the current version, it's the latest.", + "This app is more up to date than my diary entries!", + "You're in the clear, no updates in the atmosphere!", + "The odds are ever in your favor, no updates today!", + "Our app is on a digital diet. No new bytes allowed.", + "New version? Sorry, we're too attached to this one.", + "Your Loop is loopier than ever, no updates found!", + "I'm giving it all she's got, Captain! No updates!", + "In a galaxy far, far away... still no updates!", + "You've got the precious, no updates needed!", + "Riding at warp speed, no updates in sight!", "This is not the update you're looking for!", - "Stay sharp, more intel coming soon!", + "We've misplaced the 'Update' button. Oops!", + "I swear it was here somewhere... one sec", + "An apple a day keeps the... updates away.", "May the Force be with you... next time!", "The Force is strong with this version!", + "Just a small town app, same old version", + "Winter is coming. Updates aren't yet.", + "Sweet dreams are made of... no updates", + "The update fairy skipped us this week.", + "Stay sharp, more intel coming soon!", + "You're cruising on the latest tech!", + "We’ll be back. With updates... later", + "A penny for your... lack of updates.", + "You've already got the best Loop!", + "One does not simply update Loop.", + "All work and no... no updates...", + "A watched pot never... updates.", + "99 problems, updates ain't one.", + "I... uhh... one sec I lost it", "You’ve leveled up to the max!", - "You've got the precious, no updates needed!", - "No new intel, Commander." + "Beggars can't be... updaters.", + "Money can't buy... updates.", + "No new intel, Commander.", + "No updates? Great Scott!", + "No updates, Mr. Anderson", + "No updates in Ba Sing Se", + "Updates? In this economy?", + "Check back next time!", + "Loop is in its prime!", + "All systems are a-go!", + "You're up to date :)", + "No updates yet!" ] + func getNextUpToDateText() -> LocalizedStringKey { + // If shuffledTexts is empty, fill it with a shuffled version of upToDateText + if shuffledTexts.isEmpty { + shuffledTexts = upToDateText.shuffled() + } + // Pop the last element to ensure it's not repeated until all have been shown + return shuffledTexts.popLast() ?? "Check for updates…" // Fallback string + } + func copyVersionToClipboard() { let pasteboard = NSPasteboard.general pasteboard.clearContents() pasteboard.setString( - "Version \(Bundle.main.appVersion) (\(Bundle.main.appBuild))", + "Version \(Bundle.main.appVersion ?? "Unknown") (\(Bundle.main.appBuild ?? 0))", forType: NSPasteboard.PasteboardType.string ) } @@ -127,7 +165,7 @@ struct AboutConfigurationView: View { Text( model.isHoveringOverVersionCopier - ? "Version \(Bundle.main.appVersion) (\(Bundle.main.appBuild))" + ? "Version \(Bundle.main.appVersion ?? "Unknown") (\(Bundle.main.appBuild ?? 0))" : "You've looped \(timesLooped) times!" ) .contentTransition(.numericText(countsDown: !model.isHoveringOverVersionCopier)) @@ -153,10 +191,12 @@ struct AboutConfigurationView: View { await updater.fetchLatestInfo() if updater.updateState == .available { - updater.showUpdateWindow() + await updater.showUpdateWindow() } else { - model.updateButtonTitle = model.upToDateText.randomElement()! + // Use getNextUpToDateText to get the next text + model.updateButtonTitle = model.getNextUpToDateText() + // Reset the title after 2 seconds let currentTitle = model.updateButtonTitle DispatchQueue.main.asyncAfter(deadline: .now() + 2) { if model.updateButtonTitle == currentTitle { @@ -171,9 +211,8 @@ struct AboutConfigurationView: View { .animation(.smooth(duration: 0.25), value: model.updateButtonTitle) } - // I do not have the code for you to automatically check, it is hardcoded though... -// LuminareToggle("Automatically check for updates", isOn: $updater.automaticallyChecksForUpdates) - LuminareToggle("Include development versions", isOn: $model.includeDevelopmentVersions) + // LuminareToggle("Automatically check for updates", isOn: $updater.automaticallyChecksForUpdates) + LuminareToggle("Include development versions", isOn: $updater.includeDevelopmentVersions) } LuminareSection { diff --git a/Loop/Updater/UpdateView.swift b/Loop/Updater/UpdateView.swift index 7bb1f84e..bd610378 100644 --- a/Loop/Updater/UpdateView.swift +++ b/Loop/Updater/UpdateView.swift @@ -137,29 +137,27 @@ struct UpdateView: View { func versionChangeView() -> some View { ZStack { - if colorScheme == .dark { - HStack { - Text(Bundle.main.appVersion) - Image(systemName: "arrow.right") - Text(updater.availableReleases.first?.tagName ?? "Unknown") - } - .foregroundStyle(.primary.opacity(0.7)) - .blendMode(.overlay) - } else { - HStack { - Text(Bundle.main.appVersion) - Image(systemName: "arrow.right") - Text(updater.availableReleases.first?.tagName ?? "Unknown") - } + versionChangeText() .foregroundStyle(.primary.opacity(0.7)) .blendMode(.overlay) - HStack { - Text(Bundle.main.appVersion) - Image(systemName: "arrow.right") - Text(updater.availableReleases.first?.tagName ?? "Unknown") - } - .blendMode(.overlay) + if colorScheme == .light { + versionChangeText() + .blendMode(.overlay) + } + } + } + + func versionChangeText() -> some View { + HStack { + if updater.targetRelease?.prerelease ?? true { + Text("\(Bundle.main.appVersion ?? "Unknown") (\(Bundle.main.appBuild ?? 0))") + Image(systemName: "arrow.right") + Text("\(updater.targetRelease?.tagName ?? "Unknown") (\(updater.targetRelease?.buildNumber ?? 0))") + } else { + Text(Bundle.main.appVersion ?? "Unknown") + Image(systemName: "arrow.right") + Text(updater.targetRelease?.tagName ?? "Unknown") } } } @@ -167,8 +165,10 @@ struct UpdateView: View { func changelogView() -> some View { ScrollView { LazyVStack { - ForEach(updater.changelog, id: \.title) { item in - ChangelogSectionView(item: item) + ForEach($updater.changelog, id: \.title) { item in + if !item.body.isEmpty { + ChangelogSectionView(item: item) + } } } .padding(.top, 10) @@ -178,7 +178,7 @@ struct UpdateView: View { } struct ChangelogSectionView: View { - let item: (title: String, body: [String]) + @Binding var item: (title: String, body: [Updater.ChangelogNote]) @State var isExpanded = false var body: some View { @@ -206,17 +206,38 @@ struct ChangelogSectionView: View { .buttonStyle(.plain) if isExpanded { - ForEach(item.body, id: \.self) { line in - let emoji = line.prefix(1) - let note = line - .suffix(line.count - 1) - .trimmingCharacters(in: .whitespacesAndNewlines) + ForEach($item.body, id: \.id) { line in + let note = line.wrappedValue HStack(spacing: 8) { - Text(emoji) - Text(LocalizedStringKey(note)) + Text(note.emoji) + Text(LocalizedStringKey(note.text)) .lineSpacing(1.1) + Spacer(minLength: 0) + + HStack(spacing: 0) { + if let user = note.user { + let text = "@\(user)" + Link(text, destination: URL(string: "https://github.com/\(user)")!) + .frame(width: 105, alignment: .trailing) + } + + if note.user != nil, note.user != nil { + let text = "•" // Prevents unnecessary localization entries + Text(text) + .padding(.horizontal, 4) + } + + if let reference = note.reference { + let text = "#\(reference)" + Link(text, destination: URL(string: "https://github.com/MrKai77/Loop/issues/\(reference)")!) + .frame(width: 35, alignment: .trailing) + } + } + .foregroundStyle(.secondary) + .buttonStyle(.plain) + .fixedSize() } .padding(.horizontal, 8) .padding(.vertical, 4) diff --git a/Loop/Updater/Updater.swift b/Loop/Updater/Updater.swift index b52e8c2a..01c7cc29 100755 --- a/Loop/Updater/Updater.swift +++ b/Loop/Updater/Updater.swift @@ -6,15 +6,25 @@ // import Combine +import Defaults import Luminare import SwiftUI class Updater: ObservableObject { - @Published var availableReleases = [Release]() + @Published var targetRelease: Release? @Published var progressBar: Double = 0 @Published var updateState: UpdateAvailability = .notChecked - @Published var changelog: [(title: String, body: [String])] = .init() + @Published var changelog: [(title: String, body: [ChangelogNote])] = .init() + + struct ChangelogNote: Identifiable { + var id: UUID = .init() + + var emoji: String + var text: String + var user: String? + var reference: Int? + } enum UpdateAvailability { case notChecked @@ -25,13 +35,27 @@ class Updater: ObservableObject { private var windowController: NSWindowController? private var updateCheckCancellable: AnyCancellable? + @Published var includeDevelopmentVersions: Bool = Defaults[.includeDevelopmentVersions] { + didSet { + Defaults[.includeDevelopmentVersions] = includeDevelopmentVersions + + // When the value changes, trigger a new update check + Task { + await fetchLatestInfo() + } + } + } + init() { self.updateCheckCancellable = Timer.publish(every: 21600, on: .main, in: .common) .autoconnect() .sink { _ in Task { await self.fetchLatestInfo() - self.showUpdateWindow() + + if self.updateState == .available { + await self.showUpdateWindow() + } } } } @@ -44,28 +68,76 @@ class Updater: ObservableObject { } // Pulls the latest release information from GitHub and updates the app state accordingly. - // Make sure to run checkForUpdate() after this if needed. func fetchLatestInfo() async { - guard let url = URL(string: "https://api.github.com/repos/MrKai77/Loop/releases/latest") else { return } + await MainActor.run { + targetRelease = nil + updateState = .notChecked + progressBar = 0 + } + + let urlString = includeDevelopmentVersions ? + "https://api.github.com/repos/MrKai77/Loop/releases" : // Developmental branch + "https://api.github.com/repos/MrKai77/Loop/releases/latest" // Stable branch + + guard let url = URL(string: urlString) else { + NSLog("Invalid URL: \(urlString)") + return + } do { let (data, _) = try await URLSession.shared.data(from: url) - let response = try JSONDecoder().decode(Release.self, from: data) - availableReleases = [response] + // Process data immediately after fetching, reducing the number of async suspension points. + try await processFetchedData(data) + } catch { + NSLog("Error fetching release info: \(error.localizedDescription)") + } + } - if let latestRelease = availableReleases.first { - let currentVersion = Bundle.main.appVersion + private func processFetchedData(_ data: Data) async throws { + let decoder = JSONDecoder() + if includeDevelopmentVersions { + // This would need to parse a list of releases + let releases = try decoder.decode([Release].self, from: data) - if latestRelease.tagName.compare(currentVersion, options: .numeric) == .orderedDescending { - updateState = .available - processChangelog(response.body) - } else { - updateState = .unavailable - } + if let latestPreRelease = releases.compactMap({ $0.prerelease ? $0 : nil }).first { + try await processRelease(latestPreRelease) + } + } else { + // This would need to parse a single release + let release = try decoder.decode(Release.self, from: data) + try await processRelease(release) + } + } + + private func processRelease(_ release: Release) async throws { + let currentVersion = Bundle.main.appVersion?.filter(\.isASCII).trimmingCharacters(in: .whitespaces) ?? "0.0.0" + + await MainActor.run { + var release = release + + if release.prerelease, + let versionDetails = release.extractVersionFromTitle() { + release.tagName = versionDetails.preRelease + release.buildNumber = versionDetails.buildNumber + } + + var isUpdateAvailable = release.tagName.compare(currentVersion, options: .numeric) == .orderedDescending + + // If the development version is chosen, compare the build number + if !isUpdateAvailable, + includeDevelopmentVersions, + let versionBuild = release.buildNumber, + let currentBuild = Bundle.main.appBuild { + isUpdateAvailable = versionBuild > currentBuild + } + + updateState = isUpdateAvailable ? .available : .unavailable + + if isUpdateAvailable { + targetRelease = release + processChangelog(release.body) } - } catch { - NSLog("Error: \(error.localizedDescription)") } } @@ -89,25 +161,46 @@ class Updater: ObservableObject { } } else { - guard line.hasPrefix("- ") else { continue } + guard + line.hasPrefix("- "), + let index = changelog.firstIndex(where: { $0.title == currentSection }) + else { + continue + } - // Format list items - let line = line + let line = String(line) .replacingOccurrences(of: "- ", with: "") // Remove bullet point + .trimmingCharacters(in: .whitespaces) + + var user: String? + if let regex = try? NSRegularExpression(pattern: #"\(@(.*)\)"#), + let match = regex.firstMatch(in: line, range: NSRange(line.startIndex..., in: line)) { + user = Range(match.range(at: 1), in: line).flatMap { String(line[$0]) } + } + + var reference: Int? + if let regex = try? NSRegularExpression(pattern: #"#(\d+) "#), + let match = regex.firstMatch(in: line, range: NSRange(line.startIndex..., in: line)) { + reference = Int(Range(match.range(at: 1), in: line).flatMap { String(line[$0]) } ?? "") + } + + let emoji = String(line.prefix(1)) + + let text = line + .suffix(line.count - 1) .replacingOccurrences(of: #"#\d+ "#, with: "", options: .regularExpression) // Remove issue number .replacingOccurrences(of: #"\(@.*\)"#, with: "", options: .regularExpression) // Remove author .trimmingCharacters(in: .whitespacesAndNewlines) - if let index = changelog.firstIndex(where: { $0.title == currentSection }) { - changelog[index].body.append(line) - } + changelog[index].body.append(.init(emoji: emoji, text: text, user: user, reference: reference)) } } } - // Checks if the fetched release is newer than the current version and updates the app state. - func showUpdateWindow() { - if updateState == .available { + func showUpdateWindow() async { + guard updateState == .available else { return } + + await MainActor.run { if windowController?.window == nil { windowController = .init(window: LuminareTrafficLightedWindow { UpdateView() }) } @@ -116,10 +209,10 @@ class Updater: ObservableObject { } } - // Downloads the update from GitHub and prepares it for installation. + // Downloads the update from GitHub and installs it func installUpdate() async { guard - let latestRelease = availableReleases.first, + let latestRelease = targetRelease, let asset = latestRelease.assets.first else { DispatchQueue.main.async { @@ -201,23 +294,44 @@ class Updater: ObservableObject { // Release model to parse GitHub API response for releases. struct Release: Codable { - let id: Int - let tagName: String - let body: String - let assets: [Release.Asset] + var id: Int + var tagName: String + var name: String + var body: String + var assets: [Asset] + var prerelease: Bool + + var buildNumber: Int? enum CodingKeys: String, CodingKey { - case id, body, assets - case tagName = "tag_name" // Maps JSON key "tag_name" to the property `tagName`. + case id, tagName = "tag_name", name, body, assets, prerelease } struct Asset: Codable { - let name: String - let browserDownloadURL: String + var name: String + var browserDownloadURL: String enum CodingKeys: String, CodingKey { case name - case browserDownloadURL = "browser_download_url" // Maps JSON key "browser_download_url" to the property `browserDownloadURL`. + case browserDownloadURL = "browser_download_url" + } + } +} + +// Extension to Release to extract version details from the title +extension Release { + func extractVersionFromTitle() -> (preRelease: String, buildNumber: Int)? { + let pattern = #"🧪 (.*?) \((\d+)\)"# + guard + let regex = try? NSRegularExpression(pattern: pattern), + let match = regex.firstMatch(in: name, range: NSRange(name.startIndex..., in: name)) + else { + return nil } + + let preRelease = Range(match.range(at: 1), in: name).flatMap { String(self.name[$0]) } ?? "0.0.0" + let buildNumber = Int(Range(match.range(at: 2), in: name).flatMap { self.name[$0] } ?? "") ?? 0 + + return (preRelease, buildNumber) } } diff --git a/assets/sparkle/export_options.plist b/assets/sparkle/export_options.plist deleted file mode 100644 index c99041f4..00000000 --- a/assets/sparkle/export_options.plist +++ /dev/null @@ -1,14 +0,0 @@ - - - - - method - mac-application - signingCertificate - Mac App Distribution - signingStyle - automatic - teamID - com.MrKai77 - - \ No newline at end of file