Key changes
iOS CSS Core Animation
Reanimated 4.4.0 introduces a new platform-backed CSS animation engine on iOS that runs animations
directly on Core Animation layers instead of going through the JS-driven update loop. It is hidden
behind the IOS_CSS_CORE_ANIMATION static feature flag.
- feat: Wire
CSSPlatformTransitionwith iOS platform implementation by @MatiPl01 in #9325 - chore: Hide platform animations behind a feature flag by @MatiPl01 in #9493
Animation Backend
A new Animation Backend has been integrated behind a feature flag, which will help greatly with the flow of updating the Shadow Tree in animations.
- Integrate Animation Backend behind a flag by @bartlomiejbloniarz in #9279
New useTimestamp hook
A new useTimestamp hook exposes the current frame timestamp as a Shared Value that updates every
frame with the time elapsed since the first frame, with an isActive flag to pause and resume updates.
- Adds useTimestamp hook by @ashfurrow in #9162
Precompiled headers on Android
Reanimated's native build on Android now uses precompiled headers (ReanimatedPCH.h), significantly
reducing C++ compile times for both fresh and incremental builds.
Other changes
- fix(Reanimated): Spring jitter by @piaskowyk in #9463
- feat: emit ESM package json by @tjzel in #9481
- Add support for
placeholderTextColorin synchronous props by @tomekzaw in #9409 - Add support for
shadowColorin synchronous props by @tomekzaw in #9411 - Add support for
shadowOffsetin synchronous props by @tomekzaw in #9412 - Add support for
outlineColor,outlineOffsetandoutlineWidthin synchronous props by @tomekzaw in #9417 - Add support for
borderBlockColor,borderBlockStartColorandborderBlockEndColorin synchronous props by @tomekzaw in #9418 - Unify synchronous props logic between platforms by @tomekzaw in #9381
- Preallocate and reuse synchronous props buffers on Android by @tomekzaw in #9425
- fix(Reanimated): laggy LA outside of Animation Backend by @tjzel in #9431
- feat:
CSSPlatformAnimationabstraction by @MatiPl01 in #9278 - feat:
CSSPlatformTransitionabstraction by @MatiPl01 in #9324 - chore: Rename
EXPERIMENTAL_PLATFORM_CSS_ANIMATIONStoIOS_CSS_CORE_ANIMATIONby @MatiPl01 in #9506 - fix(Reanimated): RCTModernEventEmmitter for older RN by @tjzel in #9181
- chore(Reanimated): post release 4.3.0 by @tjzel in #9182
- Add check for conflicting feature flags by @tomekzaw in #9174
- Store
ShadowNodeFamilyinstead ofShadowNodeinUpdatesRegistryby @tomekzaw in #9156 - Store
ShadowNodeFamily::Sharedinstead ofShadowNodeFamily *inPropsMapandChildrenMapby @tomekzaw in #9184 - Remove
useInterpolateConfigfunction andInterpolateConfigandColorSpacetypes by @tomekzaw in #9150 - Bump React Native to 0.85.0-rc.6 by @tomekzaw in #9193
- Update doNotStrip to keepDebugSymbols by @wisniewskij in #8636
- Migrated packages/react-native-reanimated java->kotlin by @tshmieldev in #9163
- removed JSCallInvokerResolver.kt by @tshmieldev in #9198
- chore: Bump RN to
0.85.0stable by @MatiPl01 in #9233 - fix: animation cancellation race condition by @Nodonisko in #9235
- fix: animation cancellation race condition missing code by @tjzel in #9242
- Change UI runtime slow animations invocation pattern by @tshmieldev in #9205
- chore: Remove no longer used
StaticPropsRegistrymethods and props by @MatiPl01 in #9226 - chore: Remove unused css code by @MatiPl01 in #9227
- fix: Incorrect CSS props reverting on CSS transition detach by @MatiPl01 in #9220
- feat: Strict TS types in LA
withInitialValuesmethod by @MatiPl01 in #9232 - fix: Freeze example crash and different timings by @MatiPl01 in #9247
- feat: Add support for separate transform props in LA initial values config by @MatiPl01 in #9237
- refactor: decouple raf and events by @tjzel in #9244
- feat(Reanimated): Export
NativeEventsManagerby @j-piasecki in #8655 - feat: adds
withTargetValuesmodifier to default layout animations by @PiotrWszolek in #8848 - chore(Reanimated): jest tests for useFrameCallback by @tjzel in #9255
- docs: Remove
withInitialValuesfor layout transitions by @MatiPl01 in #9258 - fix: Remove
withInitialValuesandwithTargetValuesfrom layout transitions by @MatiPl01 in #9259 - feat: Update initial value of shared value by @pranko17 in #8782
- chore(Reanimated): add lint step to disallow worklets includes by @tjzel in #9262
- docs: Add new types of initial values in layout animation configs by @MatiPl01 in #9257
- docs: Add
withTargetValuesto Layout Animations docs by @PiotrWszolek in #9168 - fix: Fix handling falsy values in jestUtils getCurrentStyle by @edkimmel in #7494
- fix: Unistyles flattening regression in
4.3.0by @MatiPl01 in #9284 - fix(Reanimated): not flushing updates without mapper runs by @tjzel in #9270
- fix(Reanimated): useScrollOffset on renderScrollComponent by @tjzel in #9286
- chore: Extract CSS loop to the separate OperationsLoop class by @MatiPl01 in #9285
- Chore(Reanimated): reanimatedmoduleproxy refactor by @tshmieldev in #9342
- fix(Reanimated): registries race conditions by @tjzel in #9323
- Remove checks for new arch enabled by @tomekzaw in #9311
- feat: Add short-circuit for
scheduleOnUIcalled from the UI thread on Android by @MatiPl01 in #9343 - feat: Add
LoopOperationinterface and operation-based scheduling primitives by @MatiPl01 in #9346 - docs: remove outdated "Debugging worklets" guide by @tomekzaw in #9355
- Use
REACT_NATIVE_VERSION_MINORprovided by React Native instead of custom definition by @tomekzaw in #8412 - fix: Attempt to fix
EXC_BAD_ACCESSinReanimatedModuleProxy::performOperationsduringAnimationFrameBatchinator::flushby @MatiPl01 in #9308 - Remove legacy CDP debugger setup via
HermesExecutorRuntimeAdapterby @tomekzaw in #9356 - chore(Reanimated): remove maybeRequestRender dead code by @tjzel in #9357
- Remove linking
ReactAndroid::hermestoolingprefab by @tomekzaw in #9360 - fix(Reanimated): remove unnecessary locks by @tjzel in #9361
- Remove unused
MessageQueueThreadby @tomekzaw in #9329 - Remove RuntimeInitialization.md by @tomekzaw in #9362
- docs: add versions for Expo SDK 55 and 56 by @tomekzaw in #9341
- Remove special handling of react-native-tvos in podspecs by @tomekzaw in #9365
- Remove JSC runtime support by @tomekzaw in #9364
- Extract synchronous props serialization and parsing logic to separate files by @tomekzaw in #9368
- Improve error handling in synchronous props logic on Android by @tomekzaw in #9379
- fix: ReJest beforeEach blocks by @tjzel in #9363
- Remove
_IS_FABRICvariable by @tomekzaw in #9375 - Add missing
@DoNotStripannotations by @tomekzaw in #9372 - chore: add include Matcher and cleanup runtime tests by @tjzel in #9384
- fix: Dedupe native keyframes registration across same-content rules by @MatiPl01 in #9389
- refactor: Divide CSS Transition settings form diffs by @wisniewskij in #9340
- Move
SynchronousPropsBufferSerializerinto#ifdef ANDROIDby @tomekzaw in #9395 - Refactor synchronous props commands definition and lookup by @tomekzaw in #9396
- fix: Conflict with global expo type overrides by @MatiPl01 in #9394
- Use
pushIntandpushDoublehelper functions in synchronous props serializer by @tomekzaw in #9397 - chore: Simplify
AnimatedStyletypes by @MatiPl01 in #9400 - fix: runtime tests wrongly mocking console on UI Runtime by @tjzel in #9405
- chore: fix runtime tests formatting by @tjzel in #9404
- fix: Opaque colors support in SVG CSS animations by @MatiPl01 in #9421
- fix(Reanimated): retain iOS module proxy explicitly by @bartlomiejbloniarz in #9414
- fix: runtime tests ANR when initializing describe blocks by @tjzel in #9413
- fix: CSS
animatedPropsin SVG not passed in initial render by @MatiPl01 in #9419 - fix:
animatedPropsshould take precedence over inline props by @MatiPl01 in #9422 - Replace
std::stofwithstd::stodin synchronous props logic by @tomekzaw in #9424 - Synchronous props handling cleanup by @tomekzaw in #9423
- fix: add mutex lock in
LayoutAnimationsManager::transferSharedConfigby @tomekzaw in #9429 - chore(Reanimated): remove onRender dead code by @tjzel in #9430
- docs: update supported synchronous props in "Feature flags" page by @tomekzaw in #9439
- Add
constexprin feature flag check in synchronous props buffer preallocation on Android by @tomekzaw in #9440 - Remove bridgeless check on iOS by @tomekzaw in #9459
- fix: forward ref through Animated.FlatList under React 19 by @elliottkember in #9466
- feat: OperationsLoop for simpler css animations and transitions updates by @MatiPl01 in #9248
- chore: Cleaner CSS animation/transition lifecycle by @MatiPl01 in #9487
- feat: Convert css easing configs to the intermediate config format instead of function by @MatiPl01 in #9273
- fix: Centralize the usage of locks, fix potential race conditions by @MatiPl01 in #9489
- feat: CSS
AnimationStyleInterpolatorFactoryallowing interpolated properties subset modification by @MatiPl01 in #9276 - feat:
CSSLoopAnimationabstraction for reanimated-loop updated CSS animation properties by @MatiPl01 in #9277 - feat:
CSSLoopTransitionabstraction for reanimated-loop updated CSS animation properties by @MatiPl01 in #9316 - chore:
CSSTransitionimplementation cleanup by @MatiPl01 in #9320 - chore: bump RN compatibility to 0.86 by @tjzel in #9496
- fix: Add missing locks by @MatiPl01 in #9495
- fix: runtime tests in release by @tjzel in #9500
- chore: Remove
EXPERIMENTAL_CSS_ANIMATIONS_FOR_SVG_COMPONENTSfeature flag by @MatiPl01 in #9501 - chore: Add missing EXPERIMENTAL_PLATFORM_CSS_ANIMATIONS flag in a few places by @MatiPl01 in #9502
- fix: Fix build issues after #9325 by @MatiPl01 in #9504
- fix: Stop CA animations from leaking onto recycled layers by @MatiPl01 in #9508
- fix: Convert CSS Core Animation
beginTimeto layer-local clock by @MatiPl01 in #9507 - chore: Reintroduce
EXPERIMENTAL_CSS_ANIMATIONS_FOR_SVG_COMPONENTSwith default true by @MatiPl01 in #9510 - docs: Add
IOS_CSS_CORE_ANIMATIONfeature flag to docs by @MatiPl01 in #9505 - release(Reanimated): 4.4.0 by @tjzel in #9514
New Contributors
- @PiotrWszolek made their first contribution in #8848
- @pranko17 made their first contribution in #8782
- @edkimmel made their first contribution in #7494
- @ashfurrow made their first contribution in #9162
- @elliottkember made their first contribution in #9466
Full Changelog: 4.3.1...4.4.0