From 8cf462e1bc7396d00b462c717576c7593b55eca5 Mon Sep 17 00:00:00 2001 From: Charlie Gleason Date: Thu, 12 Mar 2026 11:43:39 -0700 Subject: [PATCH 01/10] Fix color picking accuracy by storing colors in sRGB Picked colors were off by 1-3 values per channel because colors were stored in the display's ICC profile color space, causing lossy conversions. Now colors are always stored in sRGB and only converted to the user's preferred color space at display/copy time. Fixes #187 Co-Authored-By: Claude Opus 4.6 --- Pika/Services/Eyedroppers.swift | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/Pika/Services/Eyedroppers.swift b/Pika/Services/Eyedroppers.swift index 15cec4b4..90ba2e8b 100644 --- a/Pika/Services/Eyedroppers.swift +++ b/Pika/Services/Eyedroppers.swift @@ -78,14 +78,10 @@ class Eyedropper: ObservableObject { init(type: Types, color: NSColor) { self.type = type - self.color = color + self.color = color.usingColorSpace(.sRGB) ?? color // Load colors closestVector = ClosestVector(colorNames.map { $0.color.toRGB8BitArray() }) - - Defaults.observe(.colorSpace) { change in - self.color = self.color.usingColorSpace(change.newValue)! - }.tieToLifetime(of: self) } func getClosestColor() -> String { @@ -98,7 +94,7 @@ class Eyedropper: ObservableObject { self.set(previousColor) } - color = selectedColor.usingColorSpace(Defaults[.colorSpace])! + color = selectedColor.usingColorSpace(.sRGB)! } @objc func colorDidChange(sender: AnyObject) { @@ -108,7 +104,7 @@ class Eyedropper: ObservableObject { self.set(previousColor) } - color = picker.color.usingColorSpace(Defaults[.colorSpace])! + color = picker.color.usingColorSpace(.sRGB)! } } @@ -139,14 +135,16 @@ class Eyedropper: ObservableObject { sampler.show { selectedColor in if let selectedColor = selectedColor { + let normalizedColor = selectedColor.usingColorSpace(.sRGB)! + if Defaults[.showColorOverlay] { - let colorText = selectedColor.toFormat( + let colorText = normalizedColor.toFormat( format: Defaults[.colorFormat], style: Defaults[.copyFormat] ) let cursorPosition = NSEvent.mouseLocation self.overlayWindow.show( colorText: colorText, - pickedColor: selectedColor, + pickedColor: normalizedColor, nearCursor: cursorPosition, duration: Defaults[.colorOverlayDuration] ) From 46d89edb578a5af690bbb173f59693dfc7cc277a Mon Sep 17 00:00:00 2001 From: Charlie Gleason Date: Thu, 12 Mar 2026 14:40:47 -0700 Subject: [PATCH 02/10] Address PR review feedback - Replace force-unwraps with safe unwraps and fallbacks in set(), colorDidChange(), and start() - Fix closestVector and toRGB8BitArray to use sRGB consistently so closest color name lookup stays stable across color space changes - Pass normalizedColor to set() in start() to avoid double conversion - Add tests for sRGB normalization stability and round-trip accuracy Co-Authored-By: Claude Opus 4.6 --- Pika/Extensions/NSColor+RGB.swift | 4 ++-- Pika/Services/ClosestVector.swift | 3 +-- Pika/Services/Eyedroppers.swift | 10 ++++++---- PikaTests/NSColorHexTests.swift | 25 +++++++++++++++++++++++++ 4 files changed, 34 insertions(+), 8 deletions(-) diff --git a/Pika/Extensions/NSColor+RGB.swift b/Pika/Extensions/NSColor+RGB.swift index 7ce88d76..7412d681 100644 --- a/Pika/Extensions/NSColor+RGB.swift +++ b/Pika/Extensions/NSColor+RGB.swift @@ -37,8 +37,8 @@ extension NSColor { } } - func toRGB8BitArray() -> [Int] { - let RGB = toRGBAComponents() + func toRGB8BitArray(in colorSpace: NSColorSpace = .sRGB) -> [Int] { + let RGB = toRGBAComponents(in: colorSpace) let red = Int(round(RGB.r * 255)) let green = Int(round(RGB.g * 255)) let blue = Int(round(RGB.b * 255)) diff --git a/Pika/Services/ClosestVector.swift b/Pika/Services/ClosestVector.swift index 1504c674..b10394f6 100644 --- a/Pika/Services/ClosestVector.swift +++ b/Pika/Services/ClosestVector.swift @@ -1,6 +1,5 @@ import AppKit import Cocoa -import Defaults public class ClosestVector { public var list: [[Int]] @@ -16,7 +15,7 @@ public class ClosestVector { } public func compare(_ val: NSColor) -> (Int) { - let color = val.usingColorSpace(Defaults[.colorSpace])! + guard let color = val.usingColorSpace(.sRGB) else { return 0 } let colorArr = [Int(color.redComponent * 255), Int(color.greenComponent * 255), Int(color.blueComponent * 255)] var minDistance = Int.max diff --git a/Pika/Services/Eyedroppers.swift b/Pika/Services/Eyedroppers.swift index 90ba2e8b..0fd7d8c1 100644 --- a/Pika/Services/Eyedroppers.swift +++ b/Pika/Services/Eyedroppers.swift @@ -94,17 +94,19 @@ class Eyedropper: ObservableObject { self.set(previousColor) } - color = selectedColor.usingColorSpace(.sRGB)! + color = selectedColor.usingColorSpace(.sRGB) ?? selectedColor } @objc func colorDidChange(sender: AnyObject) { if let picker = sender as? NSColorPanel { + guard let srgbColor = picker.color.usingColorSpace(.sRGB) else { return } + let previousColor = color undoManager?.registerUndo(withTarget: self) { _ in self.set(previousColor) } - color = picker.color.usingColorSpace(.sRGB)! + color = srgbColor } } @@ -135,7 +137,7 @@ class Eyedropper: ObservableObject { sampler.show { selectedColor in if let selectedColor = selectedColor { - let normalizedColor = selectedColor.usingColorSpace(.sRGB)! + let normalizedColor = selectedColor.usingColorSpace(.sRGB) ?? selectedColor if Defaults[.showColorOverlay] { let colorText = normalizedColor.toFormat( @@ -150,7 +152,7 @@ class Eyedropper: ObservableObject { ) } - self.set(selectedColor) + self.set(normalizedColor) if Defaults[.copyColorOnPick] { NSApp.sendAction(self.type.copySelector, to: nil, from: nil) diff --git a/PikaTests/NSColorHexTests.swift b/PikaTests/NSColorHexTests.swift index e202f0dd..c426fe46 100644 --- a/PikaTests/NSColorHexTests.swift +++ b/PikaTests/NSColorHexTests.swift @@ -96,4 +96,29 @@ final class NSColorHexTests: XCTestCase { let color = NSColor(hex: original).usingColorSpace(.sRGB)! XCTAssertEqual(color.toHexString(style: .css), original) } + + // MARK: - sRGB normalization stability + + func test_displayP3Color_normalizedToSRGB_producesStableHex() { + // A Display P3 color should produce the same hex regardless of the + // user's color space preference, when normalized to sRGB first. + let p3Color = NSColor(colorSpace: .displayP3, components: [0.055, 0.094, 0.161, 1.0], count: 4) + let srgbColor = p3Color.usingColorSpace(.sRGB)! + + Defaults[.colorSpace] = .displayP3 + let hexInP3 = srgbColor.toHexString() + + Defaults[.colorSpace] = .sRGB + let hexInSRGB = srgbColor.toHexString() + + XCTAssertEqual(hexInP3, hexInSRGB, "Hex should be stable across color space preferences when stored in sRGB") + } + + func test_sRGB_roundTrip_noChannelDrift() { + // Verify that converting to sRGB and back to hex doesn't introduce + // the 1-3 channel drift reported in issue #187. + let original = "#0e1829" + let color = NSColor(hex: original).usingColorSpace(.sRGB)! + XCTAssertEqual(color.toHexString(style: .css), original) + } } From f888db69ce827ecbf3724c0a04e8a4466cdd332c Mon Sep 17 00:00:00 2001 From: Charlie Gleason Date: Thu, 12 Mar 2026 14:45:41 -0700 Subject: [PATCH 03/10] Fix failing test for sRGB normalization stability MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The test incorrectly expected toHexString() to produce the same output regardless of color space preference. Since toHexString() converts to the user's preferred color space for display, changing the preference changes the output — that's correct behavior. Updated the test to verify the actual invariant: a P3 color normalized to sRGB round-trips through RGBA components without channel drift. Co-Authored-By: Claude Opus 4.6 --- PikaTests/NSColorHexTests.swift | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/PikaTests/NSColorHexTests.swift b/PikaTests/NSColorHexTests.swift index c426fe46..2b9613d0 100644 --- a/PikaTests/NSColorHexTests.swift +++ b/PikaTests/NSColorHexTests.swift @@ -99,19 +99,19 @@ final class NSColorHexTests: XCTestCase { // MARK: - sRGB normalization stability - func test_displayP3Color_normalizedToSRGB_producesStableHex() { - // A Display P3 color should produce the same hex regardless of the - // user's color space preference, when normalized to sRGB first. + func test_displayP3Color_normalizedToSRGB_roundTripsExactly() { + // A Display P3 color normalized to sRGB should produce the same hex + // when read back in sRGB, proving the storage path introduces no drift. let p3Color = NSColor(colorSpace: .displayP3, components: [0.055, 0.094, 0.161, 1.0], count: 4) let srgbColor = p3Color.usingColorSpace(.sRGB)! - Defaults[.colorSpace] = .displayP3 - let hexInP3 = srgbColor.toHexString() + // Read hex in sRGB (the storage color space) + let hex = srgbColor.toRGBAComponents(in: .sRGB) + let reconstructed = NSColor(srgbRed: hex.r, green: hex.g, blue: hex.b, alpha: hex.a) + let originalHex = srgbColor.toHex() + let roundTrippedHex = reconstructed.toHex() - Defaults[.colorSpace] = .sRGB - let hexInSRGB = srgbColor.toHexString() - - XCTAssertEqual(hexInP3, hexInSRGB, "Hex should be stable across color space preferences when stored in sRGB") + XCTAssertEqual(originalHex, roundTrippedHex, "P3 color normalized to sRGB should round-trip without channel drift") } func test_sRGB_roundTrip_noChannelDrift() { From a5e32ad81711e0e014228d77d77b0a48cb8e8347 Mon Sep 17 00:00:00 2001 From: Charlie Gleason Date: Thu, 12 Mar 2026 15:46:21 -0700 Subject: [PATCH 04/10] Bump version to 1.4.1-beta2 (build 69) --- Pika.xcodeproj/project.pbxproj | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Pika.xcodeproj/project.pbxproj b/Pika.xcodeproj/project.pbxproj index 6005e2c4..636957bb 100644 --- a/Pika.xcodeproj/project.pbxproj +++ b/Pika.xcodeproj/project.pbxproj @@ -1159,7 +1159,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 68; + CURRENT_PROJECT_VERSION = 69; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_ASSET_PATHS = "\"Pika/Preview Content\""; DEVELOPMENT_TEAM = TGHU37N6EX; @@ -1173,7 +1173,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 14.0; - MARKETING_VERSION = 1.4.1-beta1; + MARKETING_VERSION = 1.4.1-beta2; PRODUCT_BUNDLE_IDENTIFIER = com.superhighfives.Pika; PRODUCT_NAME = Pika; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG TARGET_SPARKLE"; @@ -1191,7 +1191,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 68; + CURRENT_PROJECT_VERSION = 69; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_ASSET_PATHS = "\"Pika/Preview Content\""; DEVELOPMENT_TEAM = TGHU37N6EX; @@ -1205,7 +1205,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 14.0; - MARKETING_VERSION = 1.4.1-beta1; + MARKETING_VERSION = 1.4.1-beta2; PRODUCT_BUNDLE_IDENTIFIER = com.superhighfives.Pika; PRODUCT_NAME = Pika; SWIFT_ACTIVE_COMPILATION_CONDITIONS = TARGET_SPARKLE; @@ -1238,7 +1238,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 14.0; - MARKETING_VERSION = 1.4.1-beta1; + MARKETING_VERSION = 1.4.1-beta2; PRODUCT_BUNDLE_IDENTIFIER = com.superhighfives.Pika; PRODUCT_NAME = Pika; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG TARGET_MAS"; @@ -1271,7 +1271,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 14.0; - MARKETING_VERSION = 1.4.1-beta1; + MARKETING_VERSION = 1.4.1-beta2; PRODUCT_BUNDLE_IDENTIFIER = com.superhighfives.Pika; PRODUCT_NAME = Pika; SWIFT_ACTIVE_COMPILATION_CONDITIONS = TARGET_MAS; From 800cb2e325f2be652f3edf10421d9f2cf93afc5f Mon Sep 17 00:00:00 2001 From: Charlie Gleason Date: Fri, 13 Mar 2026 19:35:09 -0700 Subject: [PATCH 05/10] Reactively update color values when color space preference changes EyedropperButton observed colorFormat and copyFormat but not colorSpace, so toFormat() (which reads Defaults[.colorSpace] internally) would not trigger a re-render when the user changed the color space in preferences. Adding @Default(.colorSpace) makes SwiftUI invalidate the view on change. Co-Authored-By: Claude Sonnet 4.6 --- Pika/Views/EyedropperButton.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Pika/Views/EyedropperButton.swift b/Pika/Views/EyedropperButton.swift index ef870a2c..be0f28c1 100644 --- a/Pika/Views/EyedropperButton.swift +++ b/Pika/Views/EyedropperButton.swift @@ -5,6 +5,7 @@ struct EyedropperButton: View { @ObservedObject var eyedropper: Eyedropper @Default(.colorFormat) var colorFormat @Default(.copyFormat) var copyFormat + @Default(.colorSpace) var colorSpace @Default(.hideColorNames) var hideColorNames @State var hoverVisible: Bool = false From 3109a307c8ac449113abb664e2fc1bad6c0e5813 Mon Sep 17 00:00:00 2001 From: Charlie Gleason Date: Fri, 13 Mar 2026 19:37:10 -0700 Subject: [PATCH 06/10] Fix color space reactivity using State + Defaults publisher NSSecureCodingKey is not compatible with @Default property wrapper. Use @State seeded from Defaults[.colorSpace] and onReceive with Defaults.publisher to update it when the preference changes, which triggers SwiftUI to re-render the color format text. Co-Authored-By: Claude Sonnet 4.6 --- Pika/Views/EyedropperButton.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Pika/Views/EyedropperButton.swift b/Pika/Views/EyedropperButton.swift index be0f28c1..df9631c9 100644 --- a/Pika/Views/EyedropperButton.swift +++ b/Pika/Views/EyedropperButton.swift @@ -5,10 +5,10 @@ struct EyedropperButton: View { @ObservedObject var eyedropper: Eyedropper @Default(.colorFormat) var colorFormat @Default(.copyFormat) var copyFormat - @Default(.colorSpace) var colorSpace @Default(.hideColorNames) var hideColorNames @State var hoverVisible: Bool = false + @State private var colorSpace = Defaults[.colorSpace] @State private var hoverTask: Task? @State private var childHovered: Bool = false @@ -90,6 +90,7 @@ struct EyedropperButton: View { .padding(.all, 8.0) .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .bottomTrailing) } + .onReceive(Defaults.publisher(.colorSpace)) { colorSpace = $0 } .onHover { hover in if hover { hoverTask?.cancel() From 3af63498a7721a971f308cc2cfb9a7c1c404782c Mon Sep 17 00:00:00 2001 From: Charlie Gleason Date: Fri, 13 Mar 2026 19:37:41 -0700 Subject: [PATCH 07/10] Fix: extract newValue from Defaults publisher change event Co-Authored-By: Claude Sonnet 4.6 --- Pika/Views/EyedropperButton.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Pika/Views/EyedropperButton.swift b/Pika/Views/EyedropperButton.swift index df9631c9..1fcaddfe 100644 --- a/Pika/Views/EyedropperButton.swift +++ b/Pika/Views/EyedropperButton.swift @@ -90,7 +90,7 @@ struct EyedropperButton: View { .padding(.all, 8.0) .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .bottomTrailing) } - .onReceive(Defaults.publisher(.colorSpace)) { colorSpace = $0 } + .onReceive(Defaults.publisher(.colorSpace)) { colorSpace = $0.newValue } .onHover { hover in if hover { hoverTask?.cancel() From f416ce62fa11018deca38bf66d58df0815c4f24d Mon Sep 17 00:00:00 2001 From: Charlie Gleason Date: Fri, 13 Mar 2026 19:40:42 -0700 Subject: [PATCH 08/10] Fix color space reactivity: observe UserDefaults and read colorSpace in body Defaults.publisher doesn't emit for NSSecureCodingKey, and the colorSpace state was never read in the body so SwiftUI had no reason to re-render. Switch to UserDefaults.didChangeNotification (which reliably fires) and explicitly convert the color via usingColorSpace(colorSpace) before formatting, so the state is actually read during render. Co-Authored-By: Claude Sonnet 4.6 --- Pika/Views/EyedropperButton.swift | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Pika/Views/EyedropperButton.swift b/Pika/Views/EyedropperButton.swift index 1fcaddfe..ed056a5c 100644 --- a/Pika/Views/EyedropperButton.swift +++ b/Pika/Views/EyedropperButton.swift @@ -25,7 +25,7 @@ struct EyedropperButton: View { .foregroundColor(eyedropper.color.getUIColor().opacity(0.75)) VStack(alignment: .leading, spacing: 6.0) { - Text(eyedropper.color.toFormat(format: colorFormat, style: copyFormat)) + Text((eyedropper.color.usingColorSpace(colorSpace) ?? eyedropper.color).toFormat(format: colorFormat, style: copyFormat)) .foregroundColor(eyedropper.color.getUIColor()) .font(.system(size: 18, weight: .regular)) .padding(.trailing, 32.0) @@ -90,7 +90,9 @@ struct EyedropperButton: View { .padding(.all, 8.0) .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .bottomTrailing) } - .onReceive(Defaults.publisher(.colorSpace)) { colorSpace = $0.newValue } + .onReceive(NotificationCenter.default.publisher(for: UserDefaults.didChangeNotification)) { _ in + colorSpace = Defaults[.colorSpace] + } .onHover { hover in if hover { hoverTask?.cancel() From 35a090f6f14088b933efa56c02c43c4a220d30fa Mon Sep 17 00:00:00 2001 From: Charlie Gleason Date: Fri, 13 Mar 2026 23:18:16 -0700 Subject: [PATCH 09/10] Bump version to 1.4.1-beta3 (build 70) --- Pika.xcodeproj/project.pbxproj | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Pika.xcodeproj/project.pbxproj b/Pika.xcodeproj/project.pbxproj index 636957bb..c409c861 100644 --- a/Pika.xcodeproj/project.pbxproj +++ b/Pika.xcodeproj/project.pbxproj @@ -1173,7 +1173,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 14.0; - MARKETING_VERSION = 1.4.1-beta2; + MARKETING_VERSION = 1.4.1-beta3; PRODUCT_BUNDLE_IDENTIFIER = com.superhighfives.Pika; PRODUCT_NAME = Pika; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG TARGET_SPARKLE"; @@ -1205,7 +1205,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 14.0; - MARKETING_VERSION = 1.4.1-beta2; + MARKETING_VERSION = 1.4.1-beta3; PRODUCT_BUNDLE_IDENTIFIER = com.superhighfives.Pika; PRODUCT_NAME = Pika; SWIFT_ACTIVE_COMPILATION_CONDITIONS = TARGET_SPARKLE; @@ -1224,7 +1224,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 67; + CURRENT_PROJECT_VERSION = 70; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_ASSET_PATHS = "\"Pika/Preview Content\""; DEVELOPMENT_TEAM = TGHU37N6EX; @@ -1238,7 +1238,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 14.0; - MARKETING_VERSION = 1.4.1-beta2; + MARKETING_VERSION = 1.4.1-beta3; PRODUCT_BUNDLE_IDENTIFIER = com.superhighfives.Pika; PRODUCT_NAME = Pika; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG TARGET_MAS"; @@ -1257,7 +1257,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 67; + CURRENT_PROJECT_VERSION = 70; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_ASSET_PATHS = "\"Pika/Preview Content\""; DEVELOPMENT_TEAM = TGHU37N6EX; @@ -1271,7 +1271,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 14.0; - MARKETING_VERSION = 1.4.1-beta2; + MARKETING_VERSION = 1.4.1-beta3; PRODUCT_BUNDLE_IDENTIFIER = com.superhighfives.Pika; PRODUCT_NAME = Pika; SWIFT_ACTIVE_COMPILATION_CONDITIONS = TARGET_MAS; From ed03a6176278b2046edf63585af08efb0143e8d2 Mon Sep 17 00:00:00 2001 From: Charlie Gleason Date: Fri, 13 Mar 2026 23:25:25 -0700 Subject: [PATCH 10/10] Fix: correct Sparkle/MAS build number targets (Sparkle=70, MAS=67) --- Pika.xcodeproj/project.pbxproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Pika.xcodeproj/project.pbxproj b/Pika.xcodeproj/project.pbxproj index c409c861..e8f4f41c 100644 --- a/Pika.xcodeproj/project.pbxproj +++ b/Pika.xcodeproj/project.pbxproj @@ -1159,7 +1159,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 69; + CURRENT_PROJECT_VERSION = 70; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_ASSET_PATHS = "\"Pika/Preview Content\""; DEVELOPMENT_TEAM = TGHU37N6EX; @@ -1191,7 +1191,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 69; + CURRENT_PROJECT_VERSION = 70; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_ASSET_PATHS = "\"Pika/Preview Content\""; DEVELOPMENT_TEAM = TGHU37N6EX; @@ -1224,7 +1224,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 70; + CURRENT_PROJECT_VERSION = 67; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_ASSET_PATHS = "\"Pika/Preview Content\""; DEVELOPMENT_TEAM = TGHU37N6EX; @@ -1257,7 +1257,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 70; + CURRENT_PROJECT_VERSION = 67; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_ASSET_PATHS = "\"Pika/Preview Content\""; DEVELOPMENT_TEAM = TGHU37N6EX;