Releases: OpenSwiftUIProject/OpenSwiftUI
Releases Β· OpenSwiftUIProject/OpenSwiftUI
0.12.0
Highlights
- Add Xcode 26 SDK support
- Add EnvManager support in Package.swift
- Add Group/RepeatAnimation/View.alignmentGuide API support
- Fixed various miscellaneous bug
What's Changed
- Fix macOS default LabeledContentStyle UI test case by @Kyle-Ye in #608
- Fix Toggle size issue by @Kyle-Ye in #610
- Add HiddenModifier support by @Kyle-Ye in #612
- Add LabelsHiddenModifier by @Kyle-Ye in #613
- Fix UITest case crash for LabelsHiddenModifierUITests by @Kyle-Ye in #614
- Add initial Text API support by @Kyle-Ye in #619
- Fix Linux CI failure by @Kyle-Ye in #620
- Add EnvManager support by @Kyle-Ye in #622
- [Bugfix] Remove werror by @Kyle-Ye in #623
- Add Text.LineStyle by @Kyle-Ye in #621
- Fix DynamicViewList.Item memory leak by @Kyle-Ye in #627
- Add CI collection support by @Kyle-Ye in #629
- Add AnimationTest support by @Kyle-Ye in #628
- Add missing Animation UITests cases by @Kyle-Ye in #630
- Fix active item count when DynamicLayoutMap has non-unary items by @jcmosc in #625
- Add RepeatAnimation support by @Kyle-Ye in #633
- Add View.alignmentGuide by @Dark-Existed in #618
- Share ContentView in targets by @Kyle-Ye in #635
- Add initial Xcode 26 SDK support by @Kyle-Ye in #634
- Fix missing defaultAnimation in AnimatableAttributeHelper by @pookjw in #636
- Add Group API support by @Kyle-Ye in #637
- Optimize agents related prompt file by @Kyle-Ye in #639
- Fix ObjectCache LRU implementation by @pookjw in #631
New Contributors
Full Changelog: 0.11.0...0.12.0
0.11.0
Milestone
New API support
- ForEach
- PositionLayout
- LabeledContent
- Transition system
import OpenSwiftUI
struct ContentView: View {
@State private var opacities = [0, 0.5, 1.0]
var body: some View {
VStack(spacing: 0) {
ForEach(opacities, id: \.self) { opacity in
Color.red.opacity(opacity)
}
}.onAppear {
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
withAnimation(.spring) {
opacities.insert(0.25, at: 1)
opacities.insert(0.75, at: 3)
}
}
}
}
}
Bug Fix
- Fixed various miscellaneous issues
What's Changed
- Fix: Improve memory management in DynamicPropertyBuffer item transfer by @Kyle-Ye in #551
- Fix: Move -Wwarning flag to conditional compilation to avoid Xcode conflict by @Kyle-Ye in #552
- Add integration guide for OpenSwiftUI by @Kyle-Ye in #553
- Refactor build-documentation.sh to use native docc preview command by @Kyle-Ye in #554
- Fix: Use git commit --amend when FORCE_PUSH=true to prevent commit accumulation by @Kyle-Ye in #555
- Implement PlatformView features and ViewRendererHost improvements by @Kyle-Ye in #557
- Add LabeledContent support by @Kyle-Ye in #560
- Fix PropertyList infinity loop for LabeledContent demo by @Kyle-Ye in #561
- Implement ArchivedAnimation by @Kyle-Ye in #562
- Update TransitionTraitKey by @Kyle-Ye in #563
- Implement makeDynamicView by @Kyle-Ye in #564
- Add ModifiedViewList implementation by @Kyle-Ye in #565
- Add DynamicContainer support by @Kyle-Ye in #566
- Fix DynamicContainer indexMap update issue by @Kyle-Ye in #568
- Update IDView implementation by @Kyle-Ye in #570
- Add View.transition API support by @Kyle-Ye in #571
- Implement Opacity Effect by @Kyle-Ye in #572
- Update DisplayListPrinter to add Color and Effect support by @Kyle-Ye in #574
- Fix flaky test failure of UIKitEnvironmentTests by @Kyle-Ye in #575
- Enhance ZIndex implementation with availability annotations and improved tests by @Kyle-Ye in #576
- Fix RandomAccessCollection + lowerBound API by @Kyle-Ye in #579
- Fix DynamicLayoutMap index issue by @Kyle-Ye in #580
- Fix ViewAlias Body Accessor crash by @Kyle-Ye in #582
- Add View.tag API support by @Kyle-Ye in #584
- Fix makeDebuggableView's changedDebugProperties by @pookjw in #586
- Add ForEach support by @Kyle-Ye in #588
- Add documentation for ForEach internal API by @Kyle-Ye in #590
- Update missing part of ViewList + Extension by @Kyle-Ye in #591
- Add PositionLayout by @Dark-Existed in #507
- Update AvailabilityVersions from 143.7 to 151-patch by @Kyle-Ye in #592
- Optimize Logging implementation by @Kyle-Ye in #597
- Update VariadicView_Children by @Kyle-Ye in #598
- Fix duplicated attachIndirectOutputs logic in ViewOutputs by @Kyle-Ye in #600
- Update ViewList.View by @Kyle-Ye in #601
- Add SpacingLayout support by @Kyle-Ye in #602
- Add LabelGroup support by @Kyle-Ye in #603
- Add ForegroundColor API by @Kyle-Ye in #604
- Add LabeledContent support by @Kyle-Ye in #605
- Update StyleContext API by @Kyle-Ye in #606
- Fix DynamicViewContainer.Value match logic by @Kyle-Ye in #607
Full Changelog: 0.10.0...0.11.0
0.10.0
Milestone
- Add StateObject/ObservedObject/EnvironmentObject support.
- Update DynamicProperty/State/Binding implementation
- Migrate documentation from SPI to GH pages.
import OpenObservation
import OpenSwiftUI
@Observable
private class Model {
var showRed = false
}
struct ContentView: View {
@State private var model = Model()
var body: some View {
Subview()
.environment(model)
}
}
struct Subview: View {
@Environment(Model.self) private var model
var body: some View {
Color(model.showRed ? .red : .blue)
}
}What's Changed
- Add cross-platform debugger detection implementation by @Kyle-Ye in #509
- Add ignoreSafeArea support by @Kyle-Ye in #510
- Add AccessibilityEnvironment by @Kyle-Ye in #513
- Add test cases to track safeAreaPadding and GeometryReader safe area issues by @Kyle-Ye in #512
- Add unknown placeholder for CoreSystem by @Kyle-Ye in #514
- Add ViewStyle API support by @Kyle-Ye in #515
- [Feature] Add init Toggle support by @Kyle-Ye in #516
- Add Entry macro support by @Kyle-Ye in #520
- Add ObservedObject implementation by @Kyle-Ye in #521
- Add ObservedObjectCompatibilityTests by @Kyle-Ye in #522
- Update version information by @Kyle-Ye in #523
- Update DynamicProperty implementation to 6.5.4 by @Kyle-Ye in #524
- Add StateObject implementation by @Kyle-Ye in #525
- Fix macOS CI by @Kyle-Ye in #528
- Add EnvironmentObject support by @Kyle-Ye in #529
- Add EnvironmentKeyWritingModifier implementation by @Kyle-Ye in #530
- Add Observable Environment API by @Kyle-Ye in #531
- Fix example project build issue for linking Testing framework by @Kyle-Ye in #532
- Fix EnvironmentKeyTransformModifier implementation by @Kyle-Ye in #533
- Add Bindable implementation by @Kyle-Ye in #534
- Update DynamicPropertyBuffer implementation by @Kyle-Ye in #535
- Add tracing support for DynamicPropertyBuffer by @Kyle-Ye in #536
- Update State implementation by @Kyle-Ye in #537
- Fix nested State update issue by @Kyle-Ye in #538
- Migrate to shared workflows from organization repository by @Kyle-Ye in #539
- Add OPENSWIFTUI_ENABLE_PRIVATE_IMPORTS by @Kyle-Ye in #540
- Add Swift-DocC documentation hosting on GitHub Pages by @Kyle-Ye in #541
- Configure self-hosted documentation in SPI manifest by @Kyle-Ye in #542
- Add PR triage workflow by @Kyle-Ye in #543
- Fix PR triage workflow by @Kyle-Ye in #545
- Update Binding and Location implementation by @Kyle-Ye in #544
- Add workflow_dispatch with number support by @Kyle-Ye in #546
- Update CodableProxy by @Kyle-Ye in #547
- Optimize Model part documentation by @Kyle-Ye in #548
- Fix pr-triage workflow issue by @Kyle-Ye in #549
- Fix: Add 'package' as valid minimum access level for documentation by @Kyle-Ye in #550
Full Changelog: 0.9.0...0.10.0
0.9.0
Milestone
- visionOS build support
- Timeline API support
import OpenSwiftUI
struct ContentView: View {
var body: some View {
TimelineView(.animation) { context in
let time = context.date.timeIntervalSince1970
ZStack {
Color(hue: (sin(time * 0.5) + 1) / 2, saturation: 0.8, brightness: 0.9)
Color(hue: (cos(time * 2) + 1) / 2, saturation: 1.0, brightness: 1.0)
.frame(width: 100 + sin(time * 3) * 20, height: 100 + sin(time * 3) * 20)
}
}
}
}Simulator.Screen.Recording.-.iPhone.16.Pro.-.2025-09-15.at.02.10.03.mp4
2025-09-15.02.15.11.mov
What's Changed
- Add visionOS support by @Kyle-Ye in #499
- Add Timeline and Animation functionality by @Kyle-Ye in #500
- Add usage of _ViewInputs.textAlwaysOnProvider by @Kyle-Ye in #501
- [Bug Fix] Fix macOS animation and visionOS build issue by @Kyle-Ye in #506
Full Changelog: 0.8.0...0.9.0
0.8.0
Milestone
- OpenObservation macro support
- macOS Animation support via CVDisplayLink
- RenderEffect support
- Transition API support
import OpenObservation
import OpenSwiftUI
@Observable
private class Model {
var showRed = false
}
struct ObservationExample: View {
@State private var model = Model()
private var showRed: Bool {
get { model.showRed }
nonmutating set { model.showRed = newValue }
}
var body: some View {
VStack {
Color(platformColor: showRed ? .red : .blue)
.frame(width: showRed ? 200 : 400, height: showRed ? 200 : 400)
}
.animation(.spring, value: showRed)
.onAppear {
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
showRed.toggle()
}
}
}
}screnshot.mov
What's Changed
- Fix UnitPoint.animatableData by @Dark-Existed in #479
- [NFC] Migrate CoreGraphicsShims to OpenCoreGraphics repo by @Kyle-Ye in #481
- Update OpenGraph and OpenBox to OpenAttributeGraph and OpenRenderBox by @Kyle-Ye in #483
- [NFC] Update OpenCoreGraphics to fix CGSize.debugDescription issue by @Kyle-Ye in #482
- Add Claude Code GitHub Workflow by @Kyle-Ye in #484
- Add Claude.md by @Kyle-Ye in #485
- Add Observation support to OpenSwiftUI by @Kyle-Ye in #486
- Update documentation links for OpenObservation and OpenCombine by @Kyle-Ye in #487
- Update CLAUDE.md for GitBulter workflow compatibility by @Kyle-Ye in #489
- Add Observation support by @Kyle-Ye in #490
- Mics fix for EmptyView and TupleView by @Kyle-Ye in #491
- Add RenderEffect support by @Kyle-Ye in #492
- Implement EnvironmentalModifier by @Kyle-Ye in #493
- Update signpost message by @Kyle-Ye in #495
- Add VariableBlurEffect by @Kyle-Ye in #494
- Add Transition API by @Kyle-Ye in #496
- macOS Animation Support by @Mx-Iris in #497
- [NFC] Enable animation completion test for macOS by @Kyle-Ye in #498
Full Changelog: 0.7.3...0.8.0
0.7.3
Milestone
- Add RotationEffect & Rotation3DEffect support
- Add TransactionModifier support
- Add GeometryReader support
What's Changed
- Update README about environment management by @Kyle-Ye in #465
- Fix ViewRendererHost.updateTransform by @Kyle-Ye in #468
- Add RotationEffect and Rotation3DEffect by @Kyle-Ye in #469
- Add Transaction modifier by @Kyle-Ye in #470
- Add ScrapeableContent API by @Kyle-Ye in #471
- Add missing Layout API implementation by @Kyle-Ye in #472
- Add GeometryReader support by @Kyle-Ye in #475
Full Changelog: 0.7.2...0.7.3
0.7.2
Milestone
- Add SpringAnimation support
- Add basic PlatformViewControllerRepresentable and PlatformViewRepresentable support
- Add Font support
What's Changed
- Add SpringAnimation by @Kyle-Ye in #441
- Remove self-hosted on matrix by @Kyle-Ye in #444
- Add PlatformViewRepresentable support by @Kyle-Ye in #447
- [Optimize] Update OG dependency by @Kyle-Ye in #448
- Update SPI build issue by @Kyle-Ye in #450
- Add CAFrameRateRangeUtilTests by @Kyle-Ye in #451
- Fix CI test case by @Kyle-Ye in #453
- Fix NSHostingView dealloc issue by @Mx-Iris in #455
- Add ViewControllerRepresentable support by @Kyle-Ye in #452
- Add Font support by @Kyle-Ye in #456
- Fix SPI build by @Kyle-Ye in #457
- Add VelocityTrackingAnimation by @Kyle-Ye in #458
- Add combineAnimation support by @Kyle-Ye in #460
- Fix BezierAnimation fraction issue by @Kyle-Ye in #463
- Fix Animation issue when rotate screen by @Kyle-Ye in #464
Full Changelog: 0.7.1...0.7.2
0.7.1
Milestone
- Add TaskModifier support
- A few bug fixes and stability improvements
What's Changed
- [Bugfix] Fix FrameLayout maxFrame API by @Kyle-Ye in #419
- Add automaticPadding API support by @Kyle-Ye in #422
- Add InsetViewModifier by @Kyle-Ye in #424
- Fix run all test targets for compatibility tests on iOS by @Kyle-Ye in #426
- Add sizeThatFits for UIHostingView by @Kyle-Ye in #425
- Fix compatibility alignment issue by @Kyle-Ye in #429
- Update Package.swift by @Kyle-Ye in #430
- Remove workaroundIssue87 by @Kyle-Ye in #431
- Fix ViewGraph.instantiateOutputs issue by @Kyle-Ye in #432
- [Feature] Add TaskModifier support by @Kyle-Ye in #433
- [NFC] Update OpenSwiftUICompatibilityTests by @Kyle-Ye in #434
- [NFC] Bump SymbolLocator version by @Kyle-Ye in #435
- Fix threadTransactionData implementation by @Kyle-Ye in #436
- Add AnimationCompletion API by @Kyle-Ye in #437
- [NFC] Optimize OpenSwiftUICompatibilityTests by @Kyle-Ye in #438
- Fix UIWindow dealloc issue by @Kyle-Ye in #439
- Update PlatformViewRepresentableLayoutOptions by @Kyle-Ye in #440
Full Changelog: 0.7.0...0.7.1
0.7.0
Milestone:
- Add async render support 1
- Add Animation support for iOS platform.
- Add onChange modifier API support
import OpenSwiftUI
struct ContentView: View {
@State private var showRed = false
var body: some View {
VStack {
Color(platformColor: showRed ? .red : .blue)
.frame(width: showRed ? 200 : 400, height: showRed ? 200 : 400)
}
.animation(.easeInOut(duration: 2), value: showRed)
.onAppear {
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
showRed.toggle()
}
}
}
}Simulator.Screen.Recording.-.iPhone.16.Pro.-.2025-07-20.at.03.03.42.mp4
import OpenSwiftUI
import Foundation
private struct ElasticEaseInEaseOutAnimation: CustomAnimation {
let duration: TimeInterval
func animate<V>(value: V, time: TimeInterval, context: inout AnimationContext<V>) -> V? where V: VectorArithmetic {
if time > duration { return nil }
let p = time / duration
let s = sin((20 * p - 11.125) * ((2 * Double.pi) / 4.5))
if p < 0.5 {
return value.scaled(by: -(pow(2, 20 * p - 10) * s) / 2)
} else {
return value.scaled(by: (pow(2, -20 * p + 10) * s) / 2 + 1)
}
}
}
extension Animation {
static var elasticEaseInEaseOut: Animation { elasticEaseInEaseOut(duration: 0.35) }
static func elasticEaseInEaseOut(duration: TimeInterval) -> Animation {
Animation(ElasticEaseInEaseOutAnimation(duration: duration))
}
}
struct ContentView: View {
@State private var isActive = false
var body: some View {
VStack(alignment: isActive ? .trailing : .leading) {
Color.red
.frame(width: 100.0, height: 100.0)
Color.blue
.frame(width: 300.0, height: 100.0)
}
.animation(.elasticEaseInEaseOut(duration: 2.0), value: isActive)
.onAppear {
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
isActive.toggle()
}
}
}
}Simulator.Screen.Recording.-.iPhone.16.Pro.-.2025-07-21.at.02.24.54.mp4
What's Changed
- Update OpenGraph dependency for comparison API by @Kyle-Ye in #383
- Update GraphValue by @Kyle-Ye in #384
- Add EquatableView by @Kyle-Ye in #385
- Add equatable macro dependency and demo by @Kyle-Ye in #386
- Update AnimatableAttribute implementation by @Kyle-Ye in #387
- Add Animation support by @Kyle-Ye in #388
- Add test case for Animation and UnitCurve by @Kyle-Ye in #389
- Add AnimationModifier by @Kyle-Ye in #391
- Add VariableFrameDuration support by @Kyle-Ye in #390
- Update ColorView to use Animatable by @Kyle-Ye in #392
- Optimize UnitCurve inverse implementation by @Kyle-Ye in #393
- Update RootTransform by @Kyle-Ye in #394
- [NFC] Update Event folder structure by @Kyle-Ye in #395
- Add UITraitBridgedEnvironmentKey support by @Kyle-Ye in #396
- Fix typo in
needsRenderproperty by @Kyle-Ye in #398 - Update EnvironmentAdditions by @Kyle-Ye in #397
- Update DisplayLink and UIHostingView by @Kyle-Ye in #399
- Update ViewRendererHost by @Kyle-Ye in #400
- [Bugfix] Fix UIHostingView update issue by @Kyle-Ye in #402
- [Bugfix] Fix NextUpdate.interval issue by @Kyle-Ye in #403
- Fix OPENSWIFTUI_SAFE_WRAPPER_IMP for class method by @Kyle-Ye in #404
- [Example] Add ColorAnimationExample by @Kyle-Ye in #405
- Add AsyncRenderer support by @Kyle-Ye in #407
- Fix CI iOS 18.0 render crash issue by @Kyle-Ye in #409
- Fix UIWindowScene dealloc issue on async render by @Kyle-Ye in #408
- Add rotate screen support for UIHostingView by @Kyle-Ye in #410
- [Infra] Add Stack3 support by @Kyle-Ye in #411
- Add cycle detection for updates and values by @Kyle-Ye in #412
- Update EmptyView by @Kyle-Ye in #414
- Add onChange modifier support by @Kyle-Ye in #413
- [NFC] Remove
OPENSWIFTUI_SUPPRESS_DEPRECATED_WARNINGSflag by @Kyle-Ye in #415 - Add withAnimation API by @Kyle-Ye in #416
Full Changelog: 0.6.0...0.7.0
-
Via SwiftUI's Render. Currently only align with iOS 18.5 and macOS 15.5 Runtime. β©
0.6.0
Milestone:
- Add HVStack, Padding and Spacer support
- Add offset and GeometryEffect support
import OpenSwiftUI
struct ContentView: View {
var body: some View {
VStack {
HStack {
Color.red.frame(width: 40, height: 40)
Spacer()
Color.blue.frame(width: 40, height: 40)
}
Spacer()
Color.blue
.frame(width: 80, height: 60)
.background(Color.red.offset(x: -20, y: -15))
.overlay(Color.green.offset(x: 20, y: 15))
Spacer()
HStack(spacing: 40) {
Color.green.frame(width: 40, height: 40)
Color.yellow.frame(width: 40, height: 40)
}
}
.frame(width: 200, height: 200)
.background(Color.gray.opacity(0.3))
}
}
What's Changed
- Update prompt by @Kyle-Ye in #366
- Update Logging API by @Kyle-Ye in #365
- Add initial HVStack layout support by @Kyle-Ye in #367
- Add spacing support for HVStack by @Kyle-Ye in #368
- Add insertion sort extension to BidirectionalCollection by @Kyle-Ye in #371
- [Bugfix] Fix isIdentityUnaryLayout not take effect for staticCount 1 layout by @Kyle-Ye in #372
- Fix StackLayout's sizeChildrenGenerallyWithConcreteMajorProposal implementation by @Kyle-Ye in #369
- Add padding support by @Kyle-Ye in #373
- Update ViewSystem for CALayer by @Kyle-Ye in #374
- Add GestureDebug.ChildrenBox and implement GesturePhase.descriptionWithoutValue by @Kyle-Ye in #375
- Optimize Benchmark summary output by @Kyle-Ye in #376
- Update diff tool to use odiff by @Kyle-Ye in #378
- Add Spacer support by @Kyle-Ye in #380
- Add RendererEffect support by @Kyle-Ye in #379
- Add remove global actor isolation by @Kyle-Ye in #381
- Fix typo in setRootTestView method by @Kyle-Ye in #382
Full Changelog: 0.5.0...0.6.0