Releases: OpenSwiftUIProject/OpenSwiftUI
Releases Β· OpenSwiftUIProject/OpenSwiftUI
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
0.5.0
Milestone
- Benchmark API (See BenchmarkApp.swift for more detail)
- Gesture basic infra support
What's Changed
- [CI] Fix CI UITest failure for iOS simulator by @Kyle-Ye in #341
- Add FixedSizeLayout support by @Kyle-Ye in #339
- Add AspectRatioLayout support by @Kyle-Ye in #338
- Update OpenSwiftUICompatibilityTests folder structure by @Kyle-Ye in #342
- Update Benchmark API by @Kyle-Ye in #343
- Update CustomView by @Kyle-Ye in #344
- Update Benchmark and Test API by @Kyle-Ye in #345
- Add BenchmarkApp example for TestApp API by @Kyle-Ye in #347
- Update Example code by @Kyle-Ye in #348
- Implement makePreferenceTransformer API by @Kyle-Ye in #346
- Add initial Gesture infra support by @Kyle-Ye in #350
- Add StandardLibraryAdditions by @Kyle-Ye in #351
- Add ResponderNode by @Kyle-Ye in #352
- Add more Gesture implementation by @Kyle-Ye in #353
- Update PreferenceKey to 6.5.4 by @Kyle-Ye in #354
- Add SimultaneousGesture by @Kyle-Ye in #355
- Add exclusive gesture implementation by @Kyle-Ye in #356
- Add ResettableGestureRule implementation by @Kyle-Ye in #358
- Add OpenGraphAdditions interface by @Kyle-Ye in #357
- Update _GestureOutputs implementation by @Kyle-Ye in #359
- Updated GestureInputs by @Kyle-Ye in #360
- Add AnyGesture implementation by @Kyle-Ye in #361
- Add Enabled environment key and disabled modifier by @Kyle-Ye in #362
- Update GestureViewModifier by @Kyle-Ye in #363
- Update Logging API by @Kyle-Ye in #364
Full Changelog: 0.4.0...0.5.0