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 @@
-
-
-
-
+
\ 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 @@
-
-
-
-
+
\ 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