diff --git a/README.md b/README.md index 419bfa06..151d8d7d 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ A performant interactive bottom sheet with fully configurable options 🚀 - Support [pull to refresh](https://gorhom.dev/react-native-bottom-sheet/pull-to-refresh) for scrollables. - Support `FlatList`, `SectionList`, `ScrollView` & `View` scrolling interactions, [read more](https://gorhom.dev/react-native-bottom-sheet/scrollables). - Support `React Navigation` Integration, [read more](https://gorhom.dev/react-native-bottom-sheet/react-navigation-integration). -- Compatible with `Reanimated` v1-3. +- Compatible with `Reanimated` v1-4. - Compatible with `Expo`. - Accessibility support. - Written in `TypeScript`. @@ -34,13 +34,23 @@ Check out [the documentation website](https://gorhom.dev/react-native-bottom-she This library been written in 3 versions of `Reanimated`, and kept all implementation in separate branches: +- **`v6`** | [branch](https://github.com/gorhom/react-native-bottom-sheet/tree/master) | [changelog](https://github.com/gorhom/react-native-bottom-sheet/blob/master/CHANGELOG.md) : written with `Reanimated v4` & `Gesture Handler v2`. + - **`v5`** | [branch](https://github.com/gorhom/react-native-bottom-sheet/tree/master) | [changelog](https://github.com/gorhom/react-native-bottom-sheet/blob/master/CHANGELOG.md) : written with `Reanimated v3` & `Gesture Handler v2`. - `v4` (not maintained) | [branch](https://github.com/gorhom/react-native-bottom-sheet/tree/v4) | [changelog](https://github.com/gorhom/react-native-bottom-sheet/blob/v4/CHANGELOG.md) : written with `Reanimated v2`. - `v2` (not maintained) | [branch](https://github.com/gorhom/react-native-bottom-sheet/tree/v2) | [changelog](https://github.com/gorhom/react-native-bottom-sheet/blob/v2/CHANGELOG.md) : written with `Reanimated v1` & compatible with `Reanimated v2`. -> I highly recommend to use `v5` which provides more stability with all latest features. +> I highly recommend to use `v6` which provides more stability with all latest features. + +### React Native Reanimated 4 Support + +Starting from v5.1.8, this library supports `react-native-reanimated` v4. When using Reanimated 4: + +- **New Architecture is required** - Reanimated 4 only supports the New Architecture +- **`react-native-worklets` dependency is required** - Install it alongside `react-native-reanimated` +- The babel plugin has been updated to use `react-native-worklets/plugin` ## Author diff --git a/babel.config.js b/babel.config.js index 983e075d..75f5ccc7 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,4 +1,4 @@ module.exports = { presets: ['module:metro-react-native-babel-preset'], - plugins: ['react-native-reanimated/plugin'], + plugins: ['react-native-worklets/plugin'], }; diff --git a/package.json b/package.json index 91b16166..bf4b5215 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@gorhom/bottom-sheet", - "version": "5.2.10", + "version": "6.0.0-alpha.0", "description": "A performant interactive bottom sheet with fully configurable options 🚀", "main": "lib/commonjs/index", "module": "lib/module/index", @@ -61,6 +61,7 @@ "react-native-builder-bob": "^0.30.3", "react-native-gesture-handler": "~2.20.2", "react-native-reanimated": "~3.19.1", + "react-native-worklets": ">=0.5.1", "release-it": "^19.0.4", "typescript": "^5.8.3" }, @@ -70,7 +71,8 @@ "react": "*", "react-native": "*", "react-native-gesture-handler": ">=2.16.1", - "react-native-reanimated": ">=3.16.0 || >=4.0.0-" + "react-native-reanimated": ">=3.16.0 || >=4.0.0", + "react-native-worklets": ">=0.5.1" }, "peerDependenciesMeta": { "@types/react-native": { diff --git a/src/components/bottomSheet/BottomSheet.tsx b/src/components/bottomSheet/BottomSheet.tsx index 4fc7fe86..d257b87b 100644 --- a/src/components/bottomSheet/BottomSheet.tsx +++ b/src/components/bottomSheet/BottomSheet.tsx @@ -9,13 +9,11 @@ import React, { } from 'react'; import { Platform, StyleSheet } from 'react-native'; import { State } from 'react-native-gesture-handler'; -import Animated, { +import { cancelAnimation, Extrapolation, interpolate, ReduceMotion, - runOnJS, - runOnUI, useAnimatedReaction, useDerivedValue, useReducedMotion, @@ -23,6 +21,7 @@ import Animated, { type WithSpringConfig, type WithTimingConfig, } from 'react-native-reanimated'; +import { scheduleOnRN, scheduleOnUI } from 'react-native-worklets'; import { ANIMATION_SOURCE, ANIMATION_STATUS, @@ -85,9 +84,8 @@ import { } from './constants'; import type { AnimateToPositionType, BottomSheetProps } from './types'; -Animated.addWhitelistedUIProps({ - decelerationRate: true, -}); +// NOTE: addWhitelistedUIProps was removed in Reanimated 4 +// and decelerationRate is now handled by default. type BottomSheet = BottomSheetMethods; @@ -538,7 +536,7 @@ const BottomSheetComponent = forwardRef( const { nextIndex, nextPosition } = animatedAnimationState.get(); if (__DEV__) { - runOnJS(print)({ + scheduleOnRN(print, { component: 'BottomSheet', method: 'animateToPositionCompleted', params: { @@ -555,11 +553,11 @@ const BottomSheetComponent = forwardRef( // callbacks if (nextIndex !== animatedCurrentIndex.get()) { - runOnJS(handleOnChange)(nextIndex, nextPosition); + scheduleOnRN(handleOnChange, nextIndex, nextPosition); } if (nextIndex === -1) { - runOnJS(handleOnClose)(); + scheduleOnRN(handleOnClose); } animatedCurrentIndex.set(nextIndex); @@ -593,7 +591,7 @@ const BottomSheetComponent = forwardRef( ) { 'worklet'; if (__DEV__) { - runOnJS(print)({ + scheduleOnRN(print, { component: 'BottomSheet', method: 'animateToPosition', params: { @@ -684,7 +682,7 @@ const BottomSheetComponent = forwardRef( /** * fire `onAnimate` callback */ - runOnJS(handleOnAnimate)(index, position); + scheduleOnRN(handleOnAnimate, index, position); /** * start animation @@ -740,7 +738,7 @@ const BottomSheetComponent = forwardRef( } if (__DEV__) { - runOnJS(print)({ + scheduleOnRN(print, { component: 'BottomSheet', method: 'setToPosition', params: { @@ -1140,8 +1138,7 @@ const BottomSheetComponent = forwardRef( */ isInTemporaryPosition.value = false; - runOnUI(animateToPosition)( - targetPosition, + scheduleOnUI(animateToPosition, targetPosition, ANIMATION_SOURCE.USER, 0, animationConfigs @@ -1189,8 +1186,7 @@ const BottomSheetComponent = forwardRef( */ isInTemporaryPosition.value = true; - runOnUI(animateToPosition)( - targetPosition, + scheduleOnUI(animateToPosition, targetPosition, ANIMATION_SOURCE.USER, 0, animationConfigs @@ -1243,8 +1239,7 @@ const BottomSheetComponent = forwardRef( */ isInTemporaryPosition.value = false; - runOnUI(animateToPosition)( - targetPosition, + scheduleOnUI(animateToPosition, targetPosition, ANIMATION_SOURCE.USER, 0, animationConfigs @@ -1303,8 +1298,7 @@ const BottomSheetComponent = forwardRef( }; }); - runOnUI(animateToPosition)( - targetPosition, + scheduleOnUI(animateToPosition, targetPosition, ANIMATION_SOURCE.USER, 0, animationConfigs @@ -1358,8 +1352,7 @@ const BottomSheetComponent = forwardRef( */ isInTemporaryPosition.value = false; - runOnUI(animateToPosition)( - targetPosition, + scheduleOnUI(animateToPosition, targetPosition, ANIMATION_SOURCE.USER, 0, animationConfigs @@ -1413,8 +1406,7 @@ const BottomSheetComponent = forwardRef( */ isInTemporaryPosition.value = false; - runOnUI(animateToPosition)( - targetPosition, + scheduleOnUI(animateToPosition, targetPosition, ANIMATION_SOURCE.USER, 0, animationConfigs @@ -1601,7 +1593,7 @@ const BottomSheetComponent = forwardRef( } if (__DEV__) { - runOnJS(print)({ + scheduleOnRN(print, { component: 'BottomSheet', method: 'useAnimatedReaction::OnSnapPointChange', category: 'effect', @@ -1669,7 +1661,7 @@ const BottomSheetComponent = forwardRef( : Math.abs(height - containerOffset.bottom); if (__DEV__) { - runOnJS(print)({ + scheduleOnRN(print, { component: 'BottomSheet', method: 'useAnimatedReaction::OnKeyboardStateChange', category: 'effect', diff --git a/src/components/bottomSheetBackdrop/BottomSheetBackdrop.tsx b/src/components/bottomSheetBackdrop/BottomSheetBackdrop.tsx index a0345b01..2d01c111 100644 --- a/src/components/bottomSheetBackdrop/BottomSheetBackdrop.tsx +++ b/src/components/bottomSheetBackdrop/BottomSheetBackdrop.tsx @@ -11,10 +11,10 @@ import { Gesture, GestureDetector } from 'react-native-gesture-handler'; import Animated, { Extrapolation, interpolate, - runOnJS, useAnimatedReaction, useAnimatedStyle, } from 'react-native-reanimated'; +import { scheduleOnRN } from 'react-native-worklets'; import { useBottomSheet } from '../../hooks'; import { DEFAULT_ACCESSIBILITY_HINT, @@ -89,7 +89,7 @@ const BottomSheetBackdropComponent = ({ //#region tap gesture const tapHandler = useMemo(() => { const gesture = Gesture.Tap().onEnd(() => { - runOnJS(handleOnPress)(); + scheduleOnRN(handleOnPress); }); return gesture; }, [handleOnPress]); @@ -125,7 +125,7 @@ const BottomSheetBackdropComponent = ({ if (shouldDisableTouchability === previous) { return; } - runOnJS(handleContainerTouchability)(shouldDisableTouchability); + scheduleOnRN(handleContainerTouchability, shouldDisableTouchability); }, [disappearsOnIndex] ); diff --git a/src/components/bottomSheetDraggableView/BottomSheetDraggableView.tsx b/src/components/bottomSheetDraggableView/BottomSheetDraggableView.tsx index 923e4301..d5bd4dd7 100644 --- a/src/components/bottomSheetDraggableView/BottomSheetDraggableView.tsx +++ b/src/components/bottomSheetDraggableView/BottomSheetDraggableView.tsx @@ -58,7 +58,6 @@ const BottomSheetDraggableViewComponent = ({ let gesture = Gesture.Pan() .enabled(enableContentPanningGesture) .shouldCancelWhenOutside(false) - .runOnJS(false) .onStart(contentPanGestureHandler.handleOnStart) .onChange(contentPanGestureHandler.handleOnChange) .onEnd(contentPanGestureHandler.handleOnEnd) diff --git a/src/components/bottomSheetHandle/BottomSheetHandleContainer.tsx b/src/components/bottomSheetHandle/BottomSheetHandleContainer.tsx index 02238437..4f481e70 100644 --- a/src/components/bottomSheetHandle/BottomSheetHandleContainer.tsx +++ b/src/components/bottomSheetHandle/BottomSheetHandleContainer.tsx @@ -60,7 +60,6 @@ function BottomSheetHandleContainerComponent({ let gesture = Gesture.Pan() .enabled(enableHandlePanningGesture) .shouldCancelWhenOutside(false) - .runOnJS(false) .onStart(handlePanGestureHandler.handleOnStart) .onChange(handlePanGestureHandler.handleOnChange) .onEnd(handlePanGestureHandler.handleOnEnd) diff --git a/src/hooks/useAnimatedKeyboard.ts b/src/hooks/useAnimatedKeyboard.ts index 24cdee04..278f17ae 100644 --- a/src/hooks/useAnimatedKeyboard.ts +++ b/src/hooks/useAnimatedKeyboard.ts @@ -7,10 +7,10 @@ import { Platform, } from 'react-native'; import { - runOnUI, useAnimatedReaction, useSharedValue, } from 'react-native-reanimated'; +import { scheduleOnUI } from 'react-native-worklets'; import { KEYBOARD_STATUS, SCREEN_HEIGHT } from '../constants'; import type { KeyboardState } from '../types'; @@ -107,7 +107,8 @@ export const useAnimatedKeyboard = () => { //#region effects useEffect(() => { const handleOnKeyboardShow = (event: KeyboardEvent) => { - runOnUI(handleKeyboardEvent)( + scheduleOnUI( + handleKeyboardEvent, KEYBOARD_STATUS.SHOWN, event.endCoordinates.height, event.duration, @@ -118,7 +119,8 @@ export const useAnimatedKeyboard = () => { ); }; const handleOnKeyboardHide = (event: KeyboardEvent) => { - runOnUI(handleKeyboardEvent)( + scheduleOnUI( + handleKeyboardEvent, KEYBOARD_STATUS.HIDDEN, event.endCoordinates.height, event.duration, diff --git a/src/hooks/useBottomSheetContentContainerStyle.ts b/src/hooks/useBottomSheetContentContainerStyle.ts index 6c0bffe1..57ff95e7 100644 --- a/src/hooks/useBottomSheetContentContainerStyle.ts +++ b/src/hooks/useBottomSheetContentContainerStyle.ts @@ -5,7 +5,8 @@ import { type ViewProps, type ViewStyle, } from 'react-native'; -import { runOnJS, useAnimatedReaction } from 'react-native-reanimated'; +import { useAnimatedReaction } from 'react-native-reanimated'; +import { scheduleOnRN } from 'react-native-worklets'; import { useBottomSheetInternal } from './useBottomSheetInternal'; export function useBottomSheetContentContainerStyle( @@ -63,7 +64,7 @@ export function useBottomSheetContentContainerStyle( if (!enableFooterMarginAdjustment) { return; } - runOnJS(setFooterHeight)(result); + scheduleOnRN(setFooterHeight, result); if (Platform.OS === 'web') { /** diff --git a/src/hooks/useGestureEventsHandlersDefault.tsx b/src/hooks/useGestureEventsHandlersDefault.tsx index be5994e9..eddd971e 100644 --- a/src/hooks/useGestureEventsHandlersDefault.tsx +++ b/src/hooks/useGestureEventsHandlersDefault.tsx @@ -1,6 +1,7 @@ import { useCallback } from 'react'; import { Keyboard, Platform } from 'react-native'; -import { runOnJS, useSharedValue } from 'react-native-reanimated'; +import { scheduleOnRN } from 'react-native-worklets'; +import { useSharedValue } from 'react-native-reanimated'; import { ANIMATION_SOURCE, GESTURE_SOURCE, @@ -75,7 +76,7 @@ export const useGestureEventsHandlersDefault: GestureEventsHandlersHookType = initialKeyboardStatus === KEYBOARD_STATUS.SHOWN ) { initialKeyboardStatus = KEYBOARD_STATUS.HIDDEN; - runOnJS(dismissKeyboard)(); + scheduleOnRN(dismissKeyboard); } // store current animated position @@ -355,7 +356,7 @@ export const useGestureEventsHandlersDefault: GestureEventsHandlersHookType = animatedKeyboardState.get().heightWithinContainer ) ) { - runOnJS(dismissKeyboard)(); + scheduleOnRN(dismissKeyboard); } } diff --git a/src/hooks/useGestureEventsHandlersDefault.web.tsx b/src/hooks/useGestureEventsHandlersDefault.web.tsx index 53cf7d7c..122528e8 100644 --- a/src/hooks/useGestureEventsHandlersDefault.web.tsx +++ b/src/hooks/useGestureEventsHandlersDefault.web.tsx @@ -1,6 +1,7 @@ import { useCallback } from 'react'; import { Keyboard, Platform } from 'react-native'; -import { runOnJS, useSharedValue } from 'react-native-reanimated'; +import { scheduleOnRN } from 'react-native-worklets'; +import { useSharedValue } from 'react-native-reanimated'; import { ANIMATION_SOURCE, GESTURE_SOURCE, @@ -27,7 +28,7 @@ const INITIAL_CONTEXT: GestureEventContextType = { isScrollablePositionLocked: false, }; -const dismissKeyboardOnJs = runOnJS(Keyboard.dismiss); +const dismissKeyboardOnJs = () => scheduleOnRN(Keyboard.dismiss); // biome-ignore lint: to be addressed! const resetContext = (context: any) => { diff --git a/src/hooks/useScrollHandler.ts b/src/hooks/useScrollHandler.ts index a7910834..fdcb9133 100644 --- a/src/hooks/useScrollHandler.ts +++ b/src/hooks/useScrollHandler.ts @@ -1,9 +1,9 @@ import { - runOnJS, useAnimatedRef, useAnimatedScrollHandler, useSharedValue, } from 'react-native-reanimated'; +import { scheduleOnRN } from 'react-native-worklets'; import type { Scrollable, ScrollableEvent } from '../types'; import { workletNoop as noop } from '../utilities'; import { useScrollEventsHandlersDefault } from './useScrollEventsHandlersDefault'; @@ -36,21 +36,21 @@ export const useScrollHandler = ( handleOnScroll(event, context); if (onScroll) { - runOnJS(onScroll)({ nativeEvent: event }); + scheduleOnRN(onScroll, { nativeEvent: event }); } }, onBeginDrag: (event, context) => { handleOnBeginDrag(event, context); if (onScrollBeginDrag) { - runOnJS(onScrollBeginDrag)({ nativeEvent: event }); + scheduleOnRN(onScrollBeginDrag, { nativeEvent: event }); } }, onEndDrag: (event, context) => { handleOnEndDrag(event, context); if (onScrollEndDrag) { - runOnJS(onScrollEndDrag)({ nativeEvent: event }); + scheduleOnRN(onScrollEndDrag, { nativeEvent: event }); } }, onMomentumBegin: handleOnMomentumBegin, diff --git a/yarn.lock b/yarn.lock index 4e46af7d..3d7e94c4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -19,11 +19,25 @@ js-tokens "^4.0.0" picocolors "^1.1.1" +"@babel/code-frame@^7.28.6", "@babel/code-frame@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.0.tgz#7cd7a59f15b3cc0dcd803038f7792712a7d0b15c" + integrity sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw== + dependencies: + "@babel/helper-validator-identifier" "^7.28.5" + js-tokens "^4.0.0" + picocolors "^1.1.1" + "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.27.2", "@babel/compat-data@^7.27.7", "@babel/compat-data@^7.28.0": version "7.28.0" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.28.0.tgz#9fc6fd58c2a6a15243cd13983224968392070790" integrity sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw== +"@babel/compat-data@^7.28.6": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.29.0.tgz#00d03e8c0ac24dd9be942c5370990cbe1f17d88d" + integrity sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg== + "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.20.0", "@babel/core@^7.25.2": version "7.28.3" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.28.3.tgz#aceddde69c5d1def69b839d09efa3e3ff59c97cb" @@ -56,6 +70,17 @@ "@jridgewell/trace-mapping" "^0.3.28" jsesc "^3.0.2" +"@babel/generator@^7.29.0": + version "7.29.1" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.29.1.tgz#d09876290111abbb00ef962a7b83a5307fba0d50" + integrity sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw== + dependencies: + "@babel/parser" "^7.29.0" + "@babel/types" "^7.29.0" + "@jridgewell/gen-mapping" "^0.3.12" + "@jridgewell/trace-mapping" "^0.3.28" + jsesc "^3.0.2" + "@babel/helper-annotate-as-pure@^7.27.1", "@babel/helper-annotate-as-pure@^7.27.3": version "7.27.3" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz#f31fd86b915fc4daf1f3ac6976c59be7084ed9c5" @@ -74,6 +99,17 @@ lru-cache "^5.1.1" semver "^6.3.1" +"@babel/helper-compilation-targets@^7.28.6": + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz#32c4a3f41f12ed1532179b108a4d746e105c2b25" + integrity sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA== + dependencies: + "@babel/compat-data" "^7.28.6" + "@babel/helper-validator-option" "^7.27.1" + browserslist "^4.24.0" + lru-cache "^5.1.1" + semver "^6.3.1" + "@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.27.1", "@babel/helper-create-class-features-plugin@^7.28.3": version "7.28.3" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz#3e747434ea007910c320c4d39a6b46f20f371d46" @@ -87,6 +123,19 @@ "@babel/traverse" "^7.28.3" semver "^6.3.1" +"@babel/helper-create-class-features-plugin@^7.28.6": + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz#611ff5482da9ef0db6291bcd24303400bca170fb" + integrity sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow== + dependencies: + "@babel/helper-annotate-as-pure" "^7.27.3" + "@babel/helper-member-expression-to-functions" "^7.28.5" + "@babel/helper-optimise-call-expression" "^7.27.1" + "@babel/helper-replace-supers" "^7.28.6" + "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" + "@babel/traverse" "^7.28.6" + semver "^6.3.1" + "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz#05b0882d97ba1d4d03519e4bce615d70afa18c53" @@ -127,6 +176,14 @@ "@babel/traverse" "^7.27.1" "@babel/types" "^7.27.1" +"@babel/helper-member-expression-to-functions@^7.28.5": + version "7.28.5" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz#f3e07a10be37ed7a63461c63e6929575945a6150" + integrity sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg== + dependencies: + "@babel/traverse" "^7.28.5" + "@babel/types" "^7.28.5" + "@babel/helper-module-imports@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz#7ef769a323e2655e126673bb6d2d6913bbead204" @@ -156,6 +213,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz#ddb2f876534ff8013e6c2b299bf4d39b3c51d44c" integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== +"@babel/helper-plugin-utils@^7.28.6": + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz#6f13ea251b68c8532e985fd532f28741a8af9ac8" + integrity sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug== + "@babel/helper-remap-async-to-generator@^7.18.9", "@babel/helper-remap-async-to-generator@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz#4601d5c7ce2eb2aea58328d43725523fcd362ce6" @@ -174,6 +236,15 @@ "@babel/helper-optimise-call-expression" "^7.27.1" "@babel/traverse" "^7.27.1" +"@babel/helper-replace-supers@^7.28.6": + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz#94aa9a1d7423a00aead3f204f78834ce7d53fe44" + integrity sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.28.5" + "@babel/helper-optimise-call-expression" "^7.27.1" + "@babel/traverse" "^7.28.6" + "@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz#62bb91b3abba8c7f1fec0252d9dbea11b3ee7a56" @@ -192,6 +263,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8" integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== +"@babel/helper-validator-identifier@^7.28.5": + version "7.28.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz#010b6938fab7cb7df74aa2bbc06aa503b8fe5fb4" + integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== + "@babel/helper-validator-option@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f" @@ -221,6 +297,13 @@ dependencies: "@babel/types" "^7.28.2" +"@babel/parser@^7.28.6", "@babel/parser@^7.29.0": + version "7.29.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.2.tgz#58bd50b9a7951d134988a1ae177a35ef9a703ba1" + integrity sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA== + dependencies: + "@babel/types" "^7.29.0" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz#61dd8a8e61f7eb568268d1b5f129da3eee364bf9" @@ -481,6 +564,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.27.1" +"@babel/plugin-syntax-typescript@^7.28.6": + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz#c7b2ddf1d0a811145b1de800d1abd146af92e3a2" + integrity sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A== + dependencies: + "@babel/helper-plugin-utils" "^7.28.6" + "@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" @@ -556,6 +646,18 @@ "@babel/helper-replace-supers" "^7.27.1" "@babel/traverse" "^7.28.3" +"@babel/plugin-transform-classes@^7.28.4": + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz#8f6fb79ba3703978e701ce2a97e373aae7dda4b7" + integrity sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q== + dependencies: + "@babel/helper-annotate-as-pure" "^7.27.3" + "@babel/helper-compilation-targets" "^7.28.6" + "@babel/helper-globals" "^7.28.0" + "@babel/helper-plugin-utils" "^7.28.6" + "@babel/helper-replace-supers" "^7.28.6" + "@babel/traverse" "^7.28.6" + "@babel/plugin-transform-computed-properties@^7.0.0", "@babel/plugin-transform-computed-properties@^7.24.7", "@babel/plugin-transform-computed-properties@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz#81662e78bf5e734a97982c2b7f0a793288ef3caa" @@ -940,6 +1042,17 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" "@babel/plugin-syntax-typescript" "^7.27.1" +"@babel/plugin-transform-typescript@^7.28.5": + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz#1e93d96da8adbefdfdade1d4956f73afa201a158" + integrity sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.27.3" + "@babel/helper-create-class-features-plugin" "^7.28.6" + "@babel/helper-plugin-utils" "^7.28.6" + "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" + "@babel/plugin-syntax-typescript" "^7.28.6" + "@babel/plugin-transform-unicode-escapes@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz#3e3143f8438aef842de28816ece58780190cf806" @@ -1088,6 +1201,17 @@ "@babel/plugin-transform-modules-commonjs" "^7.27.1" "@babel/plugin-transform-typescript" "^7.27.1" +"@babel/preset-typescript@^7.27.1": + version "7.28.5" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz#540359efa3028236958466342967522fd8f2a60c" + integrity sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-validator-option" "^7.27.1" + "@babel/plugin-syntax-jsx" "^7.27.1" + "@babel/plugin-transform-modules-commonjs" "^7.27.1" + "@babel/plugin-transform-typescript" "^7.28.5" + "@babel/register@^7.13.16": version "7.28.3" resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.28.3.tgz#abd8a3753480c799bdaf9c9092d6745d16e052c2" @@ -1113,6 +1237,15 @@ "@babel/parser" "^7.27.2" "@babel/types" "^7.27.1" +"@babel/template@^7.28.6": + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.28.6.tgz#0e7e56ecedb78aeef66ce7972b082fce76a23e57" + integrity sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ== + dependencies: + "@babel/code-frame" "^7.28.6" + "@babel/parser" "^7.28.6" + "@babel/types" "^7.28.6" + "@babel/traverse--for-generate-function-map@npm:@babel/traverse@^7.25.3": version "7.28.3" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.3.tgz#6911a10795d2cce43ec6a28cffc440cca2593434" @@ -1139,6 +1272,19 @@ "@babel/types" "^7.28.2" debug "^4.3.1" +"@babel/traverse@^7.28.5", "@babel/traverse@^7.28.6": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.29.0.tgz#f323d05001440253eead3c9c858adbe00b90310a" + integrity sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA== + dependencies: + "@babel/code-frame" "^7.29.0" + "@babel/generator" "^7.29.0" + "@babel/helper-globals" "^7.28.0" + "@babel/parser" "^7.29.0" + "@babel/template" "^7.28.6" + "@babel/types" "^7.29.0" + debug "^4.3.1" + "@babel/types@^7.0.0", "@babel/types@^7.20.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.25.2", "@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.28.2", "@babel/types@^7.3.3", "@babel/types@^7.4.4": version "7.28.2" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.2.tgz#da9db0856a9a88e0a13b019881d7513588cf712b" @@ -1147,6 +1293,14 @@ "@babel/helper-string-parser" "^7.27.1" "@babel/helper-validator-identifier" "^7.27.1" +"@babel/types@^7.28.5", "@babel/types@^7.28.6", "@babel/types@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.0.tgz#9f5b1e838c446e72cf3cd4b918152b8c605e37c7" + integrity sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A== + dependencies: + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.28.5" + "@biomejs/biome@2.4.10": version "2.4.10" resolved "https://registry.yarnpkg.com/@biomejs/biome/-/biome-2.4.10.tgz#daa52be56f027d16ca6fe36e313fd6b405b5d0f4" @@ -6074,6 +6228,23 @@ react-native-reanimated@~3.19.1: invariant "^2.2.4" react-native-is-edge-to-edge "1.1.7" +react-native-worklets@>=0.5.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/react-native-worklets/-/react-native-worklets-0.8.1.tgz#bc7744eea950dc1ebdea6429f55aada2422d9862" + integrity sha512-oWP/lStsAHU6oYCaWDXrda/wOHVdhusQJz1e6x9gPnXdFf4ndNDAOtWCmk2zGrAnlapfyA3rM6PCQq94mPg9cw== + dependencies: + "@babel/plugin-transform-arrow-functions" "^7.27.1" + "@babel/plugin-transform-class-properties" "^7.27.1" + "@babel/plugin-transform-classes" "^7.28.4" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.27.1" + "@babel/plugin-transform-optional-chaining" "^7.27.1" + "@babel/plugin-transform-shorthand-properties" "^7.27.1" + "@babel/plugin-transform-template-literals" "^7.27.1" + "@babel/plugin-transform-unicode-regex" "^7.27.1" + "@babel/preset-typescript" "^7.27.1" + convert-source-map "^2.0.0" + semver "^7.7.3" + react-native@*: version "0.81.0" resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.81.0.tgz#ebb645f3fb2fc2ffb222d2f294ca4e81e6568f15" @@ -6485,6 +6656,11 @@ semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== +semver@^7.7.3: + version "7.7.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.4.tgz#28464e36060e991fa7a11d0279d2d3f3b57a7e8a" + integrity sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA== + send@0.19.0: version "0.19.0" resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8"