From 66b6213c76116850a583e2c757cf8e7d360b15c6 Mon Sep 17 00:00:00 2001 From: Kyle Date: Sun, 15 Mar 2026 00:09:17 +0800 Subject: [PATCH 01/10] Update resolvedTraitCollection implementation --- .../Shims/UIKit/UIUserInterfaceVibrancy.h | 20 +++++++ .../Data/Environment/UIKitEnvironment.swift | 52 +++++++++++++++++-- .../Graphic/UIKit/UIKitConversions.swift | 4 ++ 3 files changed, 73 insertions(+), 3 deletions(-) create mode 100644 Sources/COpenSwiftUI/Shims/UIKit/UIUserInterfaceVibrancy.h diff --git a/Sources/COpenSwiftUI/Shims/UIKit/UIUserInterfaceVibrancy.h b/Sources/COpenSwiftUI/Shims/UIKit/UIUserInterfaceVibrancy.h new file mode 100644 index 000000000..7753eea8e --- /dev/null +++ b/Sources/COpenSwiftUI/Shims/UIKit/UIUserInterfaceVibrancy.h @@ -0,0 +1,20 @@ +// +// UIUserInterfaceVibrancy.h +// COpenSwiftUI + +#include "OpenSwiftUIBase.h" + +#if __has_include() & !__has_include() + +#import + +NS_HEADER_AUDIT_BEGIN(nullability, sendability) + +typedef NS_ENUM(NSInteger, _UIUserInterfaceVibrancy) { + _UIUserInterfaceVibrancy_0, + _UIUserInterfaceVibrancy_1, +}; + +NS_HEADER_AUDIT_END(nullability, sendability) + +#endif diff --git a/Sources/OpenSwiftUI/Data/Environment/UIKitEnvironment.swift b/Sources/OpenSwiftUI/Data/Environment/UIKitEnvironment.swift index db19d87ba..0ac2339a5 100644 --- a/Sources/OpenSwiftUI/Data/Environment/UIKitEnvironment.swift +++ b/Sources/OpenSwiftUI/Data/Environment/UIKitEnvironment.swift @@ -7,7 +7,8 @@ // ID: 005A2BB2D44F4D559B7E508DC5B95FFB (SwiftUI) #if canImport(UIKit) - +import COpenSwiftUI +@_spi(Private) package import OpenSwiftUICore package import UIKit @@ -58,8 +59,44 @@ extension UITraitCollection { if displayScale != mutableTraits.displayScale { mutableTraits.displayScale = displayScale } - // TODO - _openSwiftUIUnimplementedWarning() + let sizeCategory = UIContentSizeCategory(dynamicTypeSize: environment.dynamicTypeSize) + if sizeCategory != mutableTraits.preferredContentSizeCategory { + mutableTraits.preferredContentSizeCategory = sizeCategory + } + let userInterfaceStyle = UIUserInterfaceStyle(environment.colorScheme) + if userInterfaceStyle != mutableTraits.userInterfaceStyle { + mutableTraits.userInterfaceStyle = userInterfaceStyle + } + let displayGamut = UIDisplayGamut(rawValue: environment.displayGamut.rawValue)! + if displayGamut != mutableTraits.displayGamut { + mutableTraits.displayGamut = displayGamut + } + if _SemanticFeature_v5.isEnabled, environment.backgroundMaterial != nil { + if mutableTraits._vibrancy == ._1 || mutableTraits._vibrancy == ._0 { + mutableTraits._vibrancy = ._1 + } + } + let accessibilityContrast = UIAccessibilityContrast(environment._colorSchemeContrast) + if accessibilityContrast != mutableTraits.accessibilityContrast { + mutableTraits.accessibilityContrast = accessibilityContrast + } + let horizontalSizeClass = UIUserInterfaceSizeClass(environment.horizontalSizeClass) + if horizontalSizeClass != mutableTraits.horizontalSizeClass { + mutableTraits.horizontalSizeClass = horizontalSizeClass + } + let verticalSizeClass = UIUserInterfaceSizeClass(environment.verticalSizeClass) + if verticalSizeClass != mutableTraits.verticalSizeClass { + mutableTraits.verticalSizeClass = verticalSizeClass + } + if !forImageAssetsOnly { + let userInterfaceLevel = UIUserInterfaceLevel(rawValue: environment.backgroundInfo.layer)! + if userInterfaceLevel != mutableTraits.userInterfaceLevel { + mutableTraits.userInterfaceLevel = userInterfaceLevel + } + } + // TypesettingConfigurationKey.write(to: &mutableTraits, value: environment.typesettingConfiguration) + let activeAppearance = UIUserInterfaceActiveAppearance(rawValue: environment.appearsActive ? 1 : 0)! + mutableTraits.activeAppearance = activeAppearance } } @@ -132,6 +169,15 @@ extension UITraitCollection { ) -> UITraitCollection } +extension UIMutableTraits { + var _vibrancy: _UIUserInterfaceVibrancy { + @_silgen_name("$s5UIKit15UIMutableTraitsPAAE9_vibrancySo24_UIUserInterfaceVibrancyVvg") + get + @_silgen_name("$s5UIKit15UIMutableTraitsPAAE9_vibrancySo24_UIUserInterfaceVibrancyVvs") + set + } +} + struct InheritedTraitCollectionKey: EnvironmentKey { static var defaultValue: UITraitCollection? { nil } } diff --git a/Sources/OpenSwiftUI/Integration/Graphic/UIKit/UIKitConversions.swift b/Sources/OpenSwiftUI/Integration/Graphic/UIKit/UIKitConversions.swift index 362963841..23c3b1ac6 100644 --- a/Sources/OpenSwiftUI/Integration/Graphic/UIKit/UIKitConversions.swift +++ b/Sources/OpenSwiftUI/Integration/Graphic/UIKit/UIKitConversions.swift @@ -299,6 +299,10 @@ extension UIContentSizeCategory { @available(macOS, unavailable) @available(watchOS, unavailable) public init(_ dynamicTypeSize: DynamicTypeSize?) { + self.init(dynamicTypeSize: dynamicTypeSize) + } + + package init(dynamicTypeSize: DynamicTypeSize?) { switch dynamicTypeSize { case .xSmall: self = .extraSmall case .small: self = .small From 6f1290bbb2ec93281d734b18af09216e7272b4b8 Mon Sep 17 00:00:00 2001 From: Kyle Date: Sun, 15 Mar 2026 00:16:06 +0800 Subject: [PATCH 02/10] Update TypesettingConfigurationKey --- .../Data/Environment/UIKitEnvironment.swift | 2 +- .../View/Image/UIImageConversions.swift | 2 +- .../TypesettingConfiguration.swift | 33 +++++++++++++++++++ .../TypesettingConfiguration.swift | 4 ++- 4 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 Sources/OpenSwiftUI/View/Text/Typesetting/TypesettingConfiguration.swift diff --git a/Sources/OpenSwiftUI/Data/Environment/UIKitEnvironment.swift b/Sources/OpenSwiftUI/Data/Environment/UIKitEnvironment.swift index 0ac2339a5..850f5bde4 100644 --- a/Sources/OpenSwiftUI/Data/Environment/UIKitEnvironment.swift +++ b/Sources/OpenSwiftUI/Data/Environment/UIKitEnvironment.swift @@ -94,7 +94,7 @@ extension UITraitCollection { mutableTraits.userInterfaceLevel = userInterfaceLevel } } - // TypesettingConfigurationKey.write(to: &mutableTraits, value: environment.typesettingConfiguration) + TypesettingConfigurationKey.write(to: &mutableTraits, value: environment.typesettingConfiguration) let activeAppearance = UIUserInterfaceActiveAppearance(rawValue: environment.appearsActive ? 1 : 0)! mutableTraits.activeAppearance = activeAppearance } diff --git a/Sources/OpenSwiftUI/View/Image/UIImageConversions.swift b/Sources/OpenSwiftUI/View/Image/UIImageConversions.swift index cd75cac10..d2e1ddc6e 100644 --- a/Sources/OpenSwiftUI/View/Image/UIImageConversions.swift +++ b/Sources/OpenSwiftUI/View/Image/UIImageConversions.swift @@ -132,7 +132,7 @@ extension GraphicsImage { case .privateSystem: return UIImage(_systemName: name) @unknown default: - _openSwiftUIUnimplementedFailure() + _openSwiftUIUnreachableCode() } } } diff --git a/Sources/OpenSwiftUI/View/Text/Typesetting/TypesettingConfiguration.swift b/Sources/OpenSwiftUI/View/Text/Typesetting/TypesettingConfiguration.swift new file mode 100644 index 000000000..983307390 --- /dev/null +++ b/Sources/OpenSwiftUI/View/Text/Typesetting/TypesettingConfiguration.swift @@ -0,0 +1,33 @@ +// +// TypesettingConfiguration.swift +// OpenSwiftUI +// +// Audited for 6.5.4 +// Status: Complete + +#if canImport(UIKit) +package import UIKit + +// MARK: - TypesettingConfigurationKey + UITraitBridgedEnvironmentKey + +extension TypesettingConfigurationKey: UITraitBridgedEnvironmentKey { + package static func read(from traitCollection: UITraitCollection) -> TypesettingConfiguration { + if let language = traitCollection.typesettingLanguage { + TypesettingConfiguration(language: .explicit(language)) + } else { + TypesettingConfiguration(language: .automatic) + } + } + + package static func write(to mutableTraits: inout any UIMutableTraits, value: TypesettingConfiguration) { + switch value.language.storage { + case .explicit(let language, _): + mutableTraits.typesettingLanguage = language + case .automatic, .contentAware: + mutableTraits.typesettingLanguage = nil + @unknown default: + _openSwiftUIUnreachableCode() + } + } +} +#endif diff --git a/Sources/OpenSwiftUICore/View/Text/Typesetting/TypesettingConfiguration.swift b/Sources/OpenSwiftUICore/View/Text/Typesetting/TypesettingConfiguration.swift index 30e818169..3d7cf0fcc 100644 --- a/Sources/OpenSwiftUICore/View/Text/Typesetting/TypesettingConfiguration.swift +++ b/Sources/OpenSwiftUICore/View/Text/Typesetting/TypesettingConfiguration.swift @@ -21,7 +21,9 @@ package struct TypesettingConfiguration: Equatable { } } -package struct TypesettingConfigurationKey: EnvironmentKey { +// MARK: - TypesettingConfigurationKey + +package struct TypesettingConfigurationKey: BridgedEnvironmentKey { package static let defaultValue: TypesettingConfiguration = .init() } From c7af71a44a471196f134e1ae0c220bb248c4e844 Mon Sep 17 00:00:00 2001 From: Kyle Date: Sun, 15 Mar 2026 12:04:30 +0800 Subject: [PATCH 03/10] Update resolvedEnviornment --- .../Shims/UIKit/UIBacklightLuminance.h | 20 +++++++++ .../Shims/UIKit/UITraitCollection+Private.h | 34 +++++++++++++++ .../Shims/UIKit/UITraitCollection+Private.m | 42 +++++++++++++++++++ .../Shims/UIKit/UIUserInterfaceVibrancy.h | 5 ++- .../Timeline/DateSequenceTimeline.swift | 10 ++++- .../Data/Environment/UIKitEnvironment.swift | 37 ++++++++++++++-- .../Graphic/UIKit/UIKitConversions.swift | 4 ++ 7 files changed, 145 insertions(+), 7 deletions(-) create mode 100644 Sources/COpenSwiftUI/Shims/UIKit/UIBacklightLuminance.h create mode 100644 Sources/COpenSwiftUI/Shims/UIKit/UITraitCollection+Private.h create mode 100644 Sources/COpenSwiftUI/Shims/UIKit/UITraitCollection+Private.m diff --git a/Sources/COpenSwiftUI/Shims/UIKit/UIBacklightLuminance.h b/Sources/COpenSwiftUI/Shims/UIKit/UIBacklightLuminance.h new file mode 100644 index 000000000..65f2a3f82 --- /dev/null +++ b/Sources/COpenSwiftUI/Shims/UIKit/UIBacklightLuminance.h @@ -0,0 +1,20 @@ +// +// UIBacklightLuminance.h +// COpenSwiftUI + +#include "OpenSwiftUIBase.h" + +#if __has_include() & !__has_include() + +#import + +NS_HEADER_AUDIT_BEGIN(nullability, sendability) + +typedef NS_ENUM(NSInteger, _UIBacklightLuminance) { + _UIBacklightLuminanceNormal = 0, + _UIBacklightLuminanceReduced = 1, +}; + +NS_HEADER_AUDIT_END(nullability, sendability) + +#endif diff --git a/Sources/COpenSwiftUI/Shims/UIKit/UITraitCollection+Private.h b/Sources/COpenSwiftUI/Shims/UIKit/UITraitCollection+Private.h new file mode 100644 index 000000000..792f034c5 --- /dev/null +++ b/Sources/COpenSwiftUI/Shims/UIKit/UITraitCollection+Private.h @@ -0,0 +1,34 @@ +// +// UITraitCollection+Private.h +// COpenSwiftUI +// +// Status: Complete + +#ifndef UITraitCollection_Private_h +#define UITraitCollection_Private_h + +#include "OpenSwiftUIBase.h" + +#if __has_include() + +#import +#include "Shims/UIKit/UIUserInterfaceVibrancy.h" +#include "Shims/UIKit/UIBacklightLuminance.h" + +NS_HEADER_AUDIT_BEGIN(nullability, sendability) + +@interface UITraitCollection (OpenSwiftUI_Private) + +@property (nonatomic, readonly) UITraitCollection *_traitCollectionByRemovingEnvironmentWrapper_openswiftui_safe_wrapper OPENSWIFTUI_SWIFT_NAME(_traitCollectionByRemovingEnvironmentWrapper); +@property (nonatomic, readonly) _UIBacklightLuminance _backlightLuminance_openswiftui_safe_wrapper OPENSWIFTUI_SWIFT_NAME(_backlightLuminance); +@property (nonatomic, readonly) NSInteger _userInterfaceRenderingMode_openswiftui_safe_wrapper OPENSWIFTUI_SWIFT_NAME(_userInterfaceRenderingMode); +@property (nonatomic, readonly) CGFloat _displayCornerRadius_openswiftui_safe_wrapper OPENSWIFTUI_SWIFT_NAME(_displayCornerRadius); +@property (nonatomic, readonly) _UIUserInterfaceVibrancy _vibrancy_openswiftui_safe_wrapper OPENSWIFTUI_SWIFT_NAME(_vibrancy); + +@end + +NS_HEADER_AUDIT_END(nullability, sendability) + +#endif /* __has_include() */ + +#endif /* UITraitCollection_Private_h */ diff --git a/Sources/COpenSwiftUI/Shims/UIKit/UITraitCollection+Private.m b/Sources/COpenSwiftUI/Shims/UIKit/UITraitCollection+Private.m new file mode 100644 index 000000000..5520ba0a2 --- /dev/null +++ b/Sources/COpenSwiftUI/Shims/UIKit/UITraitCollection+Private.m @@ -0,0 +1,42 @@ +// +// UITraitCollection+Private.m +// COpenSwiftUI +// +// Status: Complete + +#import "UITraitCollection+Private.h" +#import "Shims/OpenSwiftUIShims.h" + +#if __has_include() +#import + +@implementation UITraitCollection (OpenSwiftUI_Private) + +- (UITraitCollection *)_traitCollectionByRemovingEnvironmentWrapper_openswiftui_safe_wrapper { + OPENSWIFTUI_SAFE_WRAPPER_IMP(UITraitCollection *, @"_traitCollectionByRemovingEnvironmentWrapper", self); + return func(self, selector); +} + +- (_UIBacklightLuminance)_backlightLuminance_openswiftui_safe_wrapper { + OPENSWIFTUI_SAFE_WRAPPER_IMP(_UIBacklightLuminance, @"_backlightLuminance", _UIBacklightLuminanceNormal); + return func(self, selector); +} + +- (NSInteger)_userInterfaceRenderingMode_openswiftui_safe_wrapper { + OPENSWIFTUI_SAFE_WRAPPER_IMP(NSInteger, @"_userInterfaceRenderingMode", 0); + return func(self, selector); +} + +- (CGFloat)_displayCornerRadius_openswiftui_safe_wrapper { + OPENSWIFTUI_SAFE_WRAPPER_IMP(CGFloat, @"_displayCornerRadius", 0.0); + return func(self, selector); +} + +- (_UIUserInterfaceVibrancy)_vibrancy_openswiftui_safe_wrapper { + OPENSWIFTUI_SAFE_WRAPPER_IMP(_UIUserInterfaceVibrancy, @"_vibrancy", _UIUserInterfaceVibrancyUnspecified); + return func(self, selector); +} + +@end + +#endif /* __has_include() */ diff --git a/Sources/COpenSwiftUI/Shims/UIKit/UIUserInterfaceVibrancy.h b/Sources/COpenSwiftUI/Shims/UIKit/UIUserInterfaceVibrancy.h index 7753eea8e..8572d5afb 100644 --- a/Sources/COpenSwiftUI/Shims/UIKit/UIUserInterfaceVibrancy.h +++ b/Sources/COpenSwiftUI/Shims/UIKit/UIUserInterfaceVibrancy.h @@ -11,8 +11,9 @@ NS_HEADER_AUDIT_BEGIN(nullability, sendability) typedef NS_ENUM(NSInteger, _UIUserInterfaceVibrancy) { - _UIUserInterfaceVibrancy_0, - _UIUserInterfaceVibrancy_1, + _UIUserInterfaceVibrancyUnspecified = -1, + _UIUserInterfaceVibrancyNone = 0, + _UIUserInterfaceVibrancyVibrant = 1, }; NS_HEADER_AUDIT_END(nullability, sendability) diff --git a/Sources/OpenSwiftUI/Animation/Timeline/DateSequenceTimeline.swift b/Sources/OpenSwiftUI/Animation/Timeline/DateSequenceTimeline.swift index a11742052..8b8f9ab26 100644 --- a/Sources/OpenSwiftUI/Animation/Timeline/DateSequenceTimeline.swift +++ b/Sources/OpenSwiftUI/Animation/Timeline/DateSequenceTimeline.swift @@ -138,13 +138,21 @@ private struct UpdateFidelityKey: EnvironmentKey { static var defaultValue: BLSUpdateFidelity = .seconds } +extension EnvironmentValues { + @inline(__always) + var updateFidelity: BLSUpdateFidelity { + get { self[UpdateFidelityKey.self] } + set { self[UpdateFidelityKey.self] = newValue } + } +} + extension CachedEnvironment.ID { static let updateFidelity: CachedEnvironment.ID = .init() } extension _GraphInputs { var updateFidelity: Attribute { - mapEnvironment(id: .updateFidelity) { $0[UpdateFidelityKey.self] } + mapEnvironment(id: .updateFidelity) { $0.updateFidelity } } } diff --git a/Sources/OpenSwiftUI/Data/Environment/UIKitEnvironment.swift b/Sources/OpenSwiftUI/Data/Environment/UIKitEnvironment.swift index 850f5bde4..8a40f12ea 100644 --- a/Sources/OpenSwiftUI/Data/Environment/UIKitEnvironment.swift +++ b/Sources/OpenSwiftUI/Data/Environment/UIKitEnvironment.swift @@ -8,6 +8,7 @@ #if canImport(UIKit) import COpenSwiftUI +@_spi(ClarityBoard) @_spi(Private) package import OpenSwiftUICore package import UIKit @@ -72,8 +73,8 @@ extension UITraitCollection { mutableTraits.displayGamut = displayGamut } if _SemanticFeature_v5.isEnabled, environment.backgroundMaterial != nil { - if mutableTraits._vibrancy == ._1 || mutableTraits._vibrancy == ._0 { - mutableTraits._vibrancy = ._1 + if mutableTraits._vibrancy == .vibrant || mutableTraits._vibrancy == .none { + mutableTraits._vibrancy = .vibrant } } let accessibilityContrast = UIAccessibilityContrast(environment._colorSchemeContrast) @@ -114,9 +115,30 @@ extension UITraitCollection { } func resolvedEnvironment(base environment: EnvironmentValues) -> EnvironmentValues { - // TODO + var result = environment + if !result.bridgedEnvironmentKeys.isEmpty { + result.bridgedEnvironmentKeys = [] + } + result.inheritedTraitCollection = _traitCollectionByRemovingEnvironmentWrapper + if let layoutDirection = LayoutDirection(layoutDirection) { + result.layoutDirection = layoutDirection + } + if let dynamicTypeSize = DynamicTypeSize(uiSizeCategory: preferredContentSizeCategory) { + result.dynamicTypeSize = dynamicTypeSize + } + if let legibilityWeight = LegibilityWeight(legibilityWeight) { + result.legibilityWeight = legibilityWeight + } + if let gamut = DisplayGamut(rawValue: displayGamut.rawValue) { + result.displayGamut = gamut + } + let backlightLuminance = _backlightLuminance + result.isLuminanceReduced = backlightLuminance == .reduced + if backlightLuminance == .reduced { + result.redactionReasons.insert(.privacy) + } _openSwiftUIUnimplementedWarning() - return environment + return result } var viewPhase: ViewPhase { @@ -182,4 +204,11 @@ struct InheritedTraitCollectionKey: EnvironmentKey { static var defaultValue: UITraitCollection? { nil } } +extension EnvironmentValues { + var inheritedTraitCollection: UITraitCollection? { + get { self[InheritedTraitCollectionKey.self] } + set { self[InheritedTraitCollectionKey.self] = newValue } + } +} + #endif diff --git a/Sources/OpenSwiftUI/Integration/Graphic/UIKit/UIKitConversions.swift b/Sources/OpenSwiftUI/Integration/Graphic/UIKit/UIKitConversions.swift index 23c3b1ac6..60a27aea7 100644 --- a/Sources/OpenSwiftUI/Integration/Graphic/UIKit/UIKitConversions.swift +++ b/Sources/OpenSwiftUI/Integration/Graphic/UIKit/UIKitConversions.swift @@ -252,6 +252,10 @@ extension DynamicTypeSize { /// Create a Dynamic Type size from its `UIContentSizeCategory` equivalent. public init?(_ uiSizeCategory: UIContentSizeCategory) { + self.init(uiSizeCategory: uiSizeCategory) + } + + package init?(uiSizeCategory: UIContentSizeCategory) { switch uiSizeCategory { case .extraSmall: self = .xSmall case .small: self = .small From 35b1c7c630f8622f6c2d3289721144fa7b46dce2 Mon Sep 17 00:00:00 2001 From: Kyle Date: Sun, 15 Mar 2026 12:08:10 +0800 Subject: [PATCH 04/10] Add updateFidelity API --- .../COpenSwiftUI/Shims/UIKit/UITraitCollection+Private.h | 7 +++++++ .../COpenSwiftUI/Shims/UIKit/UITraitCollection+Private.m | 7 +++++++ .../OpenSwiftUI/Data/Environment/UIKitEnvironment.swift | 3 +++ 3 files changed, 17 insertions(+) diff --git a/Sources/COpenSwiftUI/Shims/UIKit/UITraitCollection+Private.h b/Sources/COpenSwiftUI/Shims/UIKit/UITraitCollection+Private.h index 792f034c5..803330691 100644 --- a/Sources/COpenSwiftUI/Shims/UIKit/UITraitCollection+Private.h +++ b/Sources/COpenSwiftUI/Shims/UIKit/UITraitCollection+Private.h @@ -14,6 +14,9 @@ #import #include "Shims/UIKit/UIUserInterfaceVibrancy.h" #include "Shims/UIKit/UIBacklightLuminance.h" +#if OPENSWIFTUI_LINK_BACKLIGHTSERVICES +#import +#endif NS_HEADER_AUDIT_BEGIN(nullability, sendability) @@ -25,6 +28,10 @@ NS_HEADER_AUDIT_BEGIN(nullability, sendability) @property (nonatomic, readonly) CGFloat _displayCornerRadius_openswiftui_safe_wrapper OPENSWIFTUI_SWIFT_NAME(_displayCornerRadius); @property (nonatomic, readonly) _UIUserInterfaceVibrancy _vibrancy_openswiftui_safe_wrapper OPENSWIFTUI_SWIFT_NAME(_vibrancy); +#if OPENSWIFTUI_LINK_BACKLIGHTSERVICES +@property (nonatomic, readonly) BLSUpdateFidelity _updateFidelity_openswiftui_safe_wrapper OPENSWIFTUI_SWIFT_NAME(_updateFidelity); +#endif + @end NS_HEADER_AUDIT_END(nullability, sendability) diff --git a/Sources/COpenSwiftUI/Shims/UIKit/UITraitCollection+Private.m b/Sources/COpenSwiftUI/Shims/UIKit/UITraitCollection+Private.m index 5520ba0a2..11b234616 100644 --- a/Sources/COpenSwiftUI/Shims/UIKit/UITraitCollection+Private.m +++ b/Sources/COpenSwiftUI/Shims/UIKit/UITraitCollection+Private.m @@ -37,6 +37,13 @@ - (_UIUserInterfaceVibrancy)_vibrancy_openswiftui_safe_wrapper { return func(self, selector); } +#if OPENSWIFTUI_LINK_BACKLIGHTSERVICES +- (BLSUpdateFidelity)_updateFidelity_openswiftui_safe_wrapper { + OPENSWIFTUI_SAFE_WRAPPER_IMP(BLSUpdateFidelity, @"_updateFidelity", BLSUpdateFidelityUnspecified); + return func(self, selector); +} +#endif + @end #endif /* __has_include() */ diff --git a/Sources/OpenSwiftUI/Data/Environment/UIKitEnvironment.swift b/Sources/OpenSwiftUI/Data/Environment/UIKitEnvironment.swift index 8a40f12ea..660b56a2c 100644 --- a/Sources/OpenSwiftUI/Data/Environment/UIKitEnvironment.swift +++ b/Sources/OpenSwiftUI/Data/Environment/UIKitEnvironment.swift @@ -137,6 +137,9 @@ extension UITraitCollection { if backlightLuminance == .reduced { result.redactionReasons.insert(.privacy) } + #if OPENSWIFTUI_LINK_BACKLIGHTSERVICES + result.updateFidelity = _updateFidelity + #endif _openSwiftUIUnimplementedWarning() return result } From e848c45988acbd77a43bd81c36da03d8028f47f6 Mon Sep 17 00:00:00 2001 From: Kyle Date: Sun, 15 Mar 2026 12:10:53 +0800 Subject: [PATCH 05/10] Update _colorSchemeContrast --- Sources/OpenSwiftUI/Data/Environment/UIKitEnvironment.swift | 3 +++ Sources/OpenSwiftUICore/Graphic/Color/ColorScheme.swift | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Sources/OpenSwiftUI/Data/Environment/UIKitEnvironment.swift b/Sources/OpenSwiftUI/Data/Environment/UIKitEnvironment.swift index 660b56a2c..6844f467c 100644 --- a/Sources/OpenSwiftUI/Data/Environment/UIKitEnvironment.swift +++ b/Sources/OpenSwiftUI/Data/Environment/UIKitEnvironment.swift @@ -140,6 +140,9 @@ extension UITraitCollection { #if OPENSWIFTUI_LINK_BACKLIGHTSERVICES result.updateFidelity = _updateFidelity #endif + if let colorSchemeContrast = ColorSchemeContrast(accessibilityContrast) { + result._colorSchemeContrast = colorSchemeContrast + } _openSwiftUIUnimplementedWarning() return result } diff --git a/Sources/OpenSwiftUICore/Graphic/Color/ColorScheme.swift b/Sources/OpenSwiftUICore/Graphic/Color/ColorScheme.swift index 95b470dde..720a2dd7c 100644 --- a/Sources/OpenSwiftUICore/Graphic/Color/ColorScheme.swift +++ b/Sources/OpenSwiftUICore/Graphic/Color/ColorScheme.swift @@ -169,7 +169,8 @@ extension EnvironmentValues { public var colorSchemeContrast: ColorSchemeContrast { self[ColorSchemeContrastKey.self] } - + + /// The contrast associated with the color scheme of this environment. public var _colorSchemeContrast: ColorSchemeContrast { get { self[ColorSchemeContrastKey.self] } set { self[ColorSchemeContrastKey.self] = newValue } From f7093e8501c93192ed82eba13c121abceb1e5ae4 Mon Sep 17 00:00:00 2001 From: Kyle Date: Sun, 15 Mar 2026 12:27:13 +0800 Subject: [PATCH 06/10] Add effectiveColorScheme --- .../OpenSwiftUI/Data/Environment/UIKitEnvironment.swift | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Sources/OpenSwiftUI/Data/Environment/UIKitEnvironment.swift b/Sources/OpenSwiftUI/Data/Environment/UIKitEnvironment.swift index 6844f467c..f137fd1d9 100644 --- a/Sources/OpenSwiftUI/Data/Environment/UIKitEnvironment.swift +++ b/Sources/OpenSwiftUI/Data/Environment/UIKitEnvironment.swift @@ -143,6 +143,7 @@ extension UITraitCollection { if let colorSchemeContrast = ColorSchemeContrast(accessibilityContrast) { result._colorSchemeContrast = colorSchemeContrast } + result.colorScheme = effectiveColorScheme _openSwiftUIUnimplementedWarning() return result } @@ -155,6 +156,14 @@ extension UITraitCollection { .init() } } + + var effectiveColorScheme: ColorScheme { + switch userInterfaceStyle { + case .light: .light + case .dark: .dark + default: .light + } + } } @objc(OpenSwiftUIEnvironmentWrapper) From 5aea9293f8c80dbd31fb730e35f0508cf0eff38d Mon Sep 17 00:00:00 2001 From: Kyle Date: Sun, 15 Mar 2026 13:15:34 +0800 Subject: [PATCH 07/10] Update displayCornerRadius --- .../COpenSwiftUI/Shims/UIKit/UITraitCollection+Private.h | 5 ++++- .../COpenSwiftUI/Shims/UIKit/UITraitCollection+Private.m | 4 ++-- .../OpenSwiftUI/Data/Environment/UIKitEnvironment.swift | 8 ++++++++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/Sources/COpenSwiftUI/Shims/UIKit/UITraitCollection+Private.h b/Sources/COpenSwiftUI/Shims/UIKit/UITraitCollection+Private.h index 803330691..8d69a9225 100644 --- a/Sources/COpenSwiftUI/Shims/UIKit/UITraitCollection+Private.h +++ b/Sources/COpenSwiftUI/Shims/UIKit/UITraitCollection+Private.h @@ -25,7 +25,7 @@ NS_HEADER_AUDIT_BEGIN(nullability, sendability) @property (nonatomic, readonly) UITraitCollection *_traitCollectionByRemovingEnvironmentWrapper_openswiftui_safe_wrapper OPENSWIFTUI_SWIFT_NAME(_traitCollectionByRemovingEnvironmentWrapper); @property (nonatomic, readonly) _UIBacklightLuminance _backlightLuminance_openswiftui_safe_wrapper OPENSWIFTUI_SWIFT_NAME(_backlightLuminance); @property (nonatomic, readonly) NSInteger _userInterfaceRenderingMode_openswiftui_safe_wrapper OPENSWIFTUI_SWIFT_NAME(_userInterfaceRenderingMode); -@property (nonatomic, readonly) CGFloat _displayCornerRadius_openswiftui_safe_wrapper OPENSWIFTUI_SWIFT_NAME(_displayCornerRadius); +@property (nonatomic, readonly) CGFloat displayCornerRadius_openswiftui_safe_wrapper OPENSWIFTUI_SWIFT_NAME(displayCornerRadius); @property (nonatomic, readonly) _UIUserInterfaceVibrancy _vibrancy_openswiftui_safe_wrapper OPENSWIFTUI_SWIFT_NAME(_vibrancy); #if OPENSWIFTUI_LINK_BACKLIGHTSERVICES @@ -34,6 +34,9 @@ NS_HEADER_AUDIT_BEGIN(nullability, sendability) @end +OPENSWIFTUI_EXPORT +const CGFloat _UITraitCollectionDisplayCornerRadiusUnspecified; + NS_HEADER_AUDIT_END(nullability, sendability) #endif /* __has_include() */ diff --git a/Sources/COpenSwiftUI/Shims/UIKit/UITraitCollection+Private.m b/Sources/COpenSwiftUI/Shims/UIKit/UITraitCollection+Private.m index 11b234616..4bd20d2ac 100644 --- a/Sources/COpenSwiftUI/Shims/UIKit/UITraitCollection+Private.m +++ b/Sources/COpenSwiftUI/Shims/UIKit/UITraitCollection+Private.m @@ -27,8 +27,8 @@ - (NSInteger)_userInterfaceRenderingMode_openswiftui_safe_wrapper { return func(self, selector); } -- (CGFloat)_displayCornerRadius_openswiftui_safe_wrapper { - OPENSWIFTUI_SAFE_WRAPPER_IMP(CGFloat, @"_displayCornerRadius", 0.0); +- (CGFloat)displayCornerRadius_openswiftui_safe_wrapper { + OPENSWIFTUI_SAFE_WRAPPER_IMP(CGFloat, @"displayCornerRadius", 0.0); return func(self, selector); } diff --git a/Sources/OpenSwiftUI/Data/Environment/UIKitEnvironment.swift b/Sources/OpenSwiftUI/Data/Environment/UIKitEnvironment.swift index f137fd1d9..29dbb946d 100644 --- a/Sources/OpenSwiftUI/Data/Environment/UIKitEnvironment.swift +++ b/Sources/OpenSwiftUI/Data/Environment/UIKitEnvironment.swift @@ -144,6 +144,14 @@ extension UITraitCollection { result._colorSchemeContrast = colorSchemeContrast } result.colorScheme = effectiveColorScheme + result.displayScale = displayScale + result.horizontalSizeClass = UserInterfaceSizeClass(horizontalSizeClass) + result.verticalSizeClass = UserInterfaceSizeClass(verticalSizeClass) + result.backgroundInfo.layer = userInterfaceLevel.rawValue + let displayCornerRadius = displayCornerRadius + if displayCornerRadius != _UITraitCollectionDisplayCornerRadiusUnspecified { + result.displayCornerRadius = displayCornerRadius + } _openSwiftUIUnimplementedWarning() return result } From 6fa8da1fbbce134464d8dbc0ddaee2dc3e793010 Mon Sep 17 00:00:00 2001 From: Kyle Date: Sun, 15 Mar 2026 13:19:30 +0800 Subject: [PATCH 08/10] Update Material --- .../OpenSwiftUI/Data/Environment/UIKitEnvironment.swift | 9 +++++++++ Sources/OpenSwiftUICore/Shape/ShapeStyle/Material.swift | 4 +++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/Sources/OpenSwiftUI/Data/Environment/UIKitEnvironment.swift b/Sources/OpenSwiftUI/Data/Environment/UIKitEnvironment.swift index 29dbb946d..34868bab5 100644 --- a/Sources/OpenSwiftUI/Data/Environment/UIKitEnvironment.swift +++ b/Sources/OpenSwiftUI/Data/Environment/UIKitEnvironment.swift @@ -152,6 +152,15 @@ extension UITraitCollection { if displayCornerRadius != _UITraitCollectionDisplayCornerRadiusUnspecified { result.displayCornerRadius = displayCornerRadius } + if _userInterfaceRenderingMode == 2 { + result.backgroundMaterial = .thick + result.vibrantColorStyle = SystemVibrantColorStyle.self + } + if _vibrancy == .vibrant, + _SemanticFeature_v5.isEnabled, + result.backgroundMaterial == nil { + result.backgroundMaterial = .thick + } _openSwiftUIUnimplementedWarning() return result } diff --git a/Sources/OpenSwiftUICore/Shape/ShapeStyle/Material.swift b/Sources/OpenSwiftUICore/Shape/ShapeStyle/Material.swift index 877e566be..5192db656 100644 --- a/Sources/OpenSwiftUICore/Shape/ShapeStyle/Material.swift +++ b/Sources/OpenSwiftUICore/Shape/ShapeStyle/Material.swift @@ -187,7 +187,9 @@ public struct Material: Sendable { extension Material: ShapeStyle { // FIXME - static let regular = Material(id: .regular) + package static let regular = Material(id: .regular) + + package static let thick = Material(id: .thick) } package struct ForegroundMaterialStyle: ShapeStyle, PrimitiveShapeStyle { From 5f82988a173992f6fbddcc0af9016e542969b8b0 Mon Sep 17 00:00:00 2001 From: Kyle Date: Sun, 15 Mar 2026 13:51:00 +0800 Subject: [PATCH 09/10] Update Package.resolved --- .../project.xcworkspace/xcshareddata/swiftpm/Package.resolved | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Example/Example.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Example/Example.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index e227c65b8..22b8ef97e 100644 --- a/Example/Example.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Example/Example.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "34ec164994f4a7193f54a6829aeb133fff6d99ebe00bfbf67e2ac554c7ea9724", + "originHash" : "c7e770eca4f57decd049cfbd48df537df88fad4eb98858a526f2bf297292e5be", "pins" : [ { "identity" : "equatable", From f88b9514582fc021866bb7bae450fd12b2e24a77 Mon Sep 17 00:00:00 2001 From: Kyle Date: Sun, 15 Mar 2026 14:42:05 +0800 Subject: [PATCH 10/10] Fix header issue --- Sources/COpenSwiftUI/Shims/UIKit/UIBacklightLuminance.h | 2 +- Sources/COpenSwiftUI/Shims/UIKit/UIUserInterfaceVibrancy.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/COpenSwiftUI/Shims/UIKit/UIBacklightLuminance.h b/Sources/COpenSwiftUI/Shims/UIKit/UIBacklightLuminance.h index 65f2a3f82..799416db1 100644 --- a/Sources/COpenSwiftUI/Shims/UIKit/UIBacklightLuminance.h +++ b/Sources/COpenSwiftUI/Shims/UIKit/UIBacklightLuminance.h @@ -4,7 +4,7 @@ #include "OpenSwiftUIBase.h" -#if __has_include() & !__has_include() +#if __has_include() && !__has_include() #import diff --git a/Sources/COpenSwiftUI/Shims/UIKit/UIUserInterfaceVibrancy.h b/Sources/COpenSwiftUI/Shims/UIKit/UIUserInterfaceVibrancy.h index 8572d5afb..1927a78c2 100644 --- a/Sources/COpenSwiftUI/Shims/UIKit/UIUserInterfaceVibrancy.h +++ b/Sources/COpenSwiftUI/Shims/UIKit/UIUserInterfaceVibrancy.h @@ -4,7 +4,7 @@ #include "OpenSwiftUIBase.h" -#if __has_include() & !__has_include() +#if __has_include() && !__has_include() #import