diff --git a/Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/OnboardingScreenshot.swift b/Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/OnboardingScreenshot.swift index f566c5c5b592..82b8c836c081 100644 --- a/Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/OnboardingScreenshot.swift +++ b/Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/OnboardingScreenshot.swift @@ -18,6 +18,7 @@ struct OnboardingScreenshot: View { let content: Content let accessibilityLabel: String + @Environment(\.colorScheme) private var colorScheme @Environment(\.locale) private var locale @State private var screenshot: UIImage? @@ -47,7 +48,8 @@ struct OnboardingScreenshot: View { screenshot = nil let loadedScreenshot = await Self.image( content: content, - language: language + language: language, + appearance: appearance ) guard !Task.isCancelled else { return } screenshot = loadedScreenshot @@ -58,16 +60,29 @@ struct OnboardingScreenshot: View { OnboardingScreenshotLanguage.resolve(locale: locale) } + private var appearance: OnboardingScreenshotAppearance { + OnboardingScreenshotAppearance.resolve(colorScheme: colorScheme) + } + private var resourceName: String { - Self.resourceName(content: content, language: language) + Self.resourceName( + content: content, + language: language, + appearance: appearance + ) } @MainActor static func image( content: Content, - language: OnboardingScreenshotLanguage + language: OnboardingScreenshotLanguage, + appearance: OnboardingScreenshotAppearance ) async -> UIImage { - let resourceName = resourceName(content: content, language: language) + let resourceName = resourceName( + content: content, + language: language, + appearance: appearance + ) let cacheKey = resourceName as NSString if let cachedImage = screenshotCache.object(forKey: cacheKey) { return cachedImage @@ -103,14 +118,23 @@ struct OnboardingScreenshot: View { @MainActor private static let screenshotCache: NSCache = { let cache = NSCache() cache.countLimit = Content.allCases.count + * OnboardingScreenshotLanguage.allCases.count + * OnboardingScreenshotAppearance.allCases.count return cache }() private static func resourceName( content: Content, - language: OnboardingScreenshotLanguage + language: OnboardingScreenshotLanguage, + appearance: OnboardingScreenshotAppearance ) -> String { - "Onboarding-\(content.rawValue)-\(language.rawValue)" + let baseName = "Onboarding-\(content.rawValue)-\(language.rawValue)" + switch appearance { + case .light: + return baseName + case .dark: + return "\(baseName)-dark" + } } } @@ -135,4 +159,13 @@ enum OnboardingScreenshotLanguage: String, CaseIterable, Equatable, Sendable { : .english } } + +enum OnboardingScreenshotAppearance: String, CaseIterable, Equatable, Sendable { + case light + case dark + + static func resolve(colorScheme: ColorScheme) -> Self { + colorScheme == .dark ? .dark : .light + } +} #endif diff --git a/Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/Resources/OnboardingScreenshots/Onboarding-notifications-en-dark.png b/Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/Resources/OnboardingScreenshots/Onboarding-notifications-en-dark.png new file mode 100644 index 000000000000..04f4110a9b92 Binary files /dev/null and b/Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/Resources/OnboardingScreenshots/Onboarding-notifications-en-dark.png differ diff --git a/Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/Resources/OnboardingScreenshots/Onboarding-notifications-en.png b/Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/Resources/OnboardingScreenshots/Onboarding-notifications-en.png index c0eb5d5dc355..2da17dd20f36 100644 Binary files a/Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/Resources/OnboardingScreenshots/Onboarding-notifications-en.png and b/Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/Resources/OnboardingScreenshots/Onboarding-notifications-en.png differ diff --git a/Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/Resources/OnboardingScreenshots/Onboarding-notifications-ja-dark.png b/Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/Resources/OnboardingScreenshots/Onboarding-notifications-ja-dark.png new file mode 100644 index 000000000000..3436b225f5d4 Binary files /dev/null and b/Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/Resources/OnboardingScreenshots/Onboarding-notifications-ja-dark.png differ diff --git a/Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/Resources/OnboardingScreenshots/Onboarding-notifications-ja.png b/Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/Resources/OnboardingScreenshots/Onboarding-notifications-ja.png index 980a51e77be4..3bcbfac2028e 100644 Binary files a/Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/Resources/OnboardingScreenshots/Onboarding-notifications-ja.png and b/Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/Resources/OnboardingScreenshots/Onboarding-notifications-ja.png differ diff --git a/Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/Resources/OnboardingScreenshots/Onboarding-workspaces-en-dark.png b/Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/Resources/OnboardingScreenshots/Onboarding-workspaces-en-dark.png new file mode 100644 index 000000000000..f4d6d146ff83 Binary files /dev/null and b/Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/Resources/OnboardingScreenshots/Onboarding-workspaces-en-dark.png differ diff --git a/Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/Resources/OnboardingScreenshots/Onboarding-workspaces-en.png b/Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/Resources/OnboardingScreenshots/Onboarding-workspaces-en.png index 11a8f9d37247..5564976c219c 100644 Binary files a/Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/Resources/OnboardingScreenshots/Onboarding-workspaces-en.png and b/Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/Resources/OnboardingScreenshots/Onboarding-workspaces-en.png differ diff --git a/Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/Resources/OnboardingScreenshots/Onboarding-workspaces-ja-dark.png b/Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/Resources/OnboardingScreenshots/Onboarding-workspaces-ja-dark.png new file mode 100644 index 000000000000..2a1f0a8720c9 Binary files /dev/null and b/Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/Resources/OnboardingScreenshots/Onboarding-workspaces-ja-dark.png differ diff --git a/Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/Resources/OnboardingScreenshots/Onboarding-workspaces-ja.png b/Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/Resources/OnboardingScreenshots/Onboarding-workspaces-ja.png index 69968f72a996..756f9b937302 100644 Binary files a/Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/Resources/OnboardingScreenshots/Onboarding-workspaces-ja.png and b/Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/Resources/OnboardingScreenshots/Onboarding-workspaces-ja.png differ diff --git a/Packages/iOS/CmuxMobileShellUI/Tests/CmuxMobileShellUITests/OnboardingSceneChromeTests.swift b/Packages/iOS/CmuxMobileShellUI/Tests/CmuxMobileShellUITests/OnboardingSceneChromeTests.swift index a88bb49c3ac0..1b6af4582660 100644 --- a/Packages/iOS/CmuxMobileShellUI/Tests/CmuxMobileShellUITests/OnboardingSceneChromeTests.swift +++ b/Packages/iOS/CmuxMobileShellUI/Tests/CmuxMobileShellUITests/OnboardingSceneChromeTests.swift @@ -1,6 +1,7 @@ #if os(iOS) @testable import CmuxMobileShellUI import Foundation +import SwiftUI import Testing import UIKit @@ -91,16 +92,24 @@ import UIKit @Test @MainActor func everyLocalizedOnboardingScreenshotLoads() async { for content in OnboardingScreenshot.Content.allCases { for language in OnboardingScreenshotLanguage.allCases { - let image = await OnboardingScreenshot.image( - content: content, - language: language - ) - #expect(image.size.width > 0) - #expect(image.size.height > 0) + for appearance in OnboardingScreenshotAppearance.allCases { + let image = await OnboardingScreenshot.image( + content: content, + language: language, + appearance: appearance + ) + #expect(image.size.width > 0) + #expect(image.size.height > 0) + } } } } + @Test func screenshotAppearanceMatchesTheSystemColorScheme() { + #expect(OnboardingScreenshotAppearance.resolve(colorScheme: .light) == .light) + #expect(OnboardingScreenshotAppearance.resolve(colorScheme: .dark) == .dark) + } + @Test @MainActor func onboardingCopyUsesNativeLineBalancing() { let label = OnboardingBalancedText.makeLabel() label.font = .preferredFont(forTextStyle: .body) diff --git a/Packages/iOS/CmuxMobileShellUI/Tests/CmuxMobileShellUITests/WorkspaceMacSelectionTests.swift b/Packages/iOS/CmuxMobileShellUI/Tests/CmuxMobileShellUITests/WorkspaceMacSelectionTests.swift index c68657dea1ed..9b2861f832b1 100644 --- a/Packages/iOS/CmuxMobileShellUI/Tests/CmuxMobileShellUITests/WorkspaceMacSelectionTests.swift +++ b/Packages/iOS/CmuxMobileShellUI/Tests/CmuxMobileShellUITests/WorkspaceMacSelectionTests.swift @@ -253,8 +253,8 @@ import Testing let pendingSwitchTask = view.handleMacTitlePickerSelection(.machine("mac-b")) await waitForSwitchStart() - #expect(view.macTitlePickerSelection.wrappedValue == .machine("mac-b")) - view.macTitlePickerSelection.wrappedValue = .all + #expect(view.currentMacTitlePickerSelection == .machine("mac-b")) + view.handleMacTitlePickerSelection(.all) await waitForCancelStart() #expect(requestedSwitches == ["mac-b"])