Releases: OpenSwiftUIProject/OpenSwiftUI
Releases · OpenSwiftUIProject/OpenSwiftUI
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
0.4.0
Milestone:
- Add ZStack
- Add overlay and background support
- Add Color opacity support
- Add layoutPriority support
- Fix broken SPI documentation link
import OpenSwiftUI
struct ContentView: View {
var body: some View {
ZStack(alignment: .leading) {
Color.red
.opacity(0.5)
.frame(width: 200, height: 200)
}
.overlay(alignment: .topLeading) {
Color.green.opacity(0.5)
.frame(width: 100, height: 100)
}
.background(alignment: .bottomTrailing) {
Color.blue.opacity(0.5)
.frame(width: 100, height: 100)
}
}
}
What's Changed
- Add ConcatenatedCollection by @Kyle-Ye in #323
- Add InlineArray implementation by @Kyle-Ye in #324
- Update _GraphInputs implementation by @Kyle-Ye in #325
- Add HVStack and ZStack interface by @Kyle-Ye in #326
- Update dependency to fix doc build issue by @Kyle-Ye in #327
- Fix SPI documentation build issue by @Kyle-Ye in #328
- Update ViewList by @Kyle-Ye in #329
- Update TupleView by @Kyle-Ye in #330
- Add _ViewListOutputs.concat support by @Kyle-Ye in #331
- Update NSHostingView by @Mx-Iris in #333
- Add ZStack support by @Kyle-Ye in #332
- Fix SafeAreaInsetsModifier by @Kyle-Ye in #334
- Add Color opacity support by @Kyle-Ye in #335
- Add background and overlay support by @Kyle-Ye in #336
- Add layoutPriority support by @Kyle-Ye in #337
Full Changelog: 0.3.0...0.4.0
0.3.0
Milestone:
- Add frame layout support for OpenSwiftUI
- Add macOS render support
import OpenSwiftUI
struct ContentView: View {
var body: some View {
Color.red
.frame(width: 200, height: 200)
}
}
What's Changed
- Add OptionalView implementation by @Kyle-Ye in #284
- Update Private API for CoreAnimation by @Kyle-Ye in #286
- Add AsyncImage implementation by @Kyle-Ye in #285
- Update StaticIf implementation by @Kyle-Ye in #287
- Update Time implementation by @Kyle-Ye in #288
- Update ViewAlias by @Kyle-Ye in #289
- Add OPENSWIFTUI_BUILD_FOR_DARWIN_PLATFORM support by @Kyle-Ye in #290
- Add PlacementContext implementation by @Kyle-Ye in #292
- Optimize code format by @Kyle-Ye in #293
- Update SafeAreaInsets API by @Kyle-Ye in #294
- Update Transaction implementation by @Kyle-Ye in #295
- Update RootGeometry by @Kyle-Ye in #296
- Update documentation for ProposedSize by @Kyle-Ye in #297
- Update ViewGeometry documentation by @Kyle-Ye in #298
- Add initial rendering support for NSHostingView by @Mx-Iris in #291
- Add UnaryLayout and LayoutProxy by @Kyle-Ye in #299
- Add LLM prompt file by @Kyle-Ye in #303
- Update ViewInputs API by @Kyle-Ye in #302
- Add ArchivedViewInput by @Kyle-Ye in #304
- Update AlignmentGuide by @Kyle-Ye in #305
- Add Direction by @Kyle-Ye in #306
- Add _AlignmentLayout by @Kyle-Ye in #307
- Update Layout API by @Kyle-Ye in #308
- Update Animatable API and implementation by @Kyle-Ye in #309
- Update CachedEnvironment by @Kyle-Ye in #310
- Update UnaryLayout by @Kyle-Ye in #311
- Add View.frame support by @Kyle-Ye in #312
- Fix CachedEnvironment attribute cache issue by @Kyle-Ye in #313
- Add UI test target by @Kyle-Ye in #314
- Add FlexFrameLayout support by @Kyle-Ye in #315
- Update HostingView and add UI test workflow by @Kyle-Ye in #316
- Update README by @Kyle-Ye in #317
- Add AvailabilityMacro support by @Kyle-Ye in #318
- Add NamedColor support by @Kyle-Ye in #319
- Add NSColor colorProvider support by @Kyle-Ye in #320
- Add PlatformHostingControllerHelper to add NSHostingController test support by @Kyle-Ye in #321
- Fix SPI documentation issue by @Kyle-Ye in #322
Full Changelog: 0.2.0...0.3.0