react-native-unistyles 3.5.3 → 3.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (283) hide show
  1. package/README.md +3 -0
  2. package/cxx/converters/BackgroundImageConverter.cpp +198 -11
  3. package/cxx/converters/BackgroundImageConverter.h +1 -0
  4. package/cxx/core/HostUnistyle.cpp +6 -0
  5. package/cxx/hybridObjects/HybridShadowRegistry.cpp +5 -0
  6. package/cxx/parser/Parser.cpp +29 -7
  7. package/ios/NativePlatform+ios.swift +22 -11
  8. package/ios/NativePlatformListener+ios.swift +9 -0
  9. package/lib/commonjs/components/native/deep/ActivityIndicator.js +19 -0
  10. package/lib/commonjs/components/native/deep/ActivityIndicator.js.map +1 -0
  11. package/lib/commonjs/components/native/deep/Animated.js +19 -0
  12. package/lib/commonjs/components/native/deep/Animated.js.map +1 -0
  13. package/lib/commonjs/components/native/deep/FlatList.js +19 -0
  14. package/lib/commonjs/components/native/deep/FlatList.js.map +1 -0
  15. package/lib/commonjs/components/native/deep/Image.js +19 -0
  16. package/lib/commonjs/components/native/deep/Image.js.map +1 -0
  17. package/lib/commonjs/components/native/deep/ImageBackground.js +19 -0
  18. package/lib/commonjs/components/native/deep/ImageBackground.js.map +1 -0
  19. package/lib/commonjs/components/native/deep/KeyboardAvoidingView.js +19 -0
  20. package/lib/commonjs/components/native/deep/KeyboardAvoidingView.js.map +1 -0
  21. package/lib/commonjs/components/native/deep/Pressable.js +19 -0
  22. package/lib/commonjs/components/native/deep/Pressable.js.map +1 -0
  23. package/lib/commonjs/components/native/deep/RefreshControl.js +19 -0
  24. package/lib/commonjs/components/native/deep/RefreshControl.js.map +1 -0
  25. package/lib/commonjs/components/native/deep/SafeAreaView.js +19 -0
  26. package/lib/commonjs/components/native/deep/SafeAreaView.js.map +1 -0
  27. package/lib/commonjs/components/native/deep/ScrollView.js +19 -0
  28. package/lib/commonjs/components/native/deep/ScrollView.js.map +1 -0
  29. package/lib/commonjs/components/native/deep/SectionList.js +19 -0
  30. package/lib/commonjs/components/native/deep/SectionList.js.map +1 -0
  31. package/lib/commonjs/components/native/deep/Switch.js +19 -0
  32. package/lib/commonjs/components/native/deep/Switch.js.map +1 -0
  33. package/lib/commonjs/components/native/deep/Text.js +19 -0
  34. package/lib/commonjs/components/native/deep/Text.js.map +1 -0
  35. package/lib/commonjs/components/native/deep/TextInput.js +19 -0
  36. package/lib/commonjs/components/native/deep/TextInput.js.map +1 -0
  37. package/lib/commonjs/components/native/deep/TextNativeComponent.js +28 -0
  38. package/lib/commonjs/components/native/deep/TextNativeComponent.js.map +1 -0
  39. package/lib/commonjs/components/native/deep/TouchableHighlight.js +19 -0
  40. package/lib/commonjs/components/native/deep/TouchableHighlight.js.map +1 -0
  41. package/lib/commonjs/components/native/deep/TouchableOpacity.js +19 -0
  42. package/lib/commonjs/components/native/deep/TouchableOpacity.js.map +1 -0
  43. package/lib/commonjs/components/native/deep/View.js +19 -0
  44. package/lib/commonjs/components/native/deep/View.js.map +1 -0
  45. package/lib/commonjs/components/native/deep/ViewNativeComponent.js +26 -0
  46. package/lib/commonjs/components/native/deep/ViewNativeComponent.js.map +1 -0
  47. package/lib/commonjs/components/native/deep/VirtualizedList.js +19 -0
  48. package/lib/commonjs/components/native/deep/VirtualizedList.js.map +1 -0
  49. package/lib/commonjs/components/native/index.js +43 -0
  50. package/lib/commonjs/components/native/index.js.map +1 -0
  51. package/lib/commonjs/core/createUnistylesActivityIndicator.js +13 -3
  52. package/lib/commonjs/core/createUnistylesActivityIndicator.js.map +1 -1
  53. package/lib/commonjs/core/createUnistylesElement.native.js +6 -0
  54. package/lib/commonjs/core/createUnistylesElement.native.js.map +1 -1
  55. package/lib/commonjs/core/createUnistylesImageBackground.js +20 -17
  56. package/lib/commonjs/core/createUnistylesImageBackground.js.map +1 -1
  57. package/lib/commonjs/core/createUnistylesTouchableHighlight.js +6 -0
  58. package/lib/commonjs/core/createUnistylesTouchableHighlight.js.map +1 -1
  59. package/lib/commonjs/core/getClassname.js +15 -0
  60. package/lib/commonjs/core/getClassname.js.map +1 -1
  61. package/lib/commonjs/core/hasUnistyles.js +26 -0
  62. package/lib/commonjs/core/hasUnistyles.js.map +1 -0
  63. package/lib/commonjs/specs/ShadowRegistry/index.js +57 -74
  64. package/lib/commonjs/specs/ShadowRegistry/index.js.map +1 -1
  65. package/lib/commonjs/specs/ShadowRegistry/styleSource.js +65 -0
  66. package/lib/commonjs/specs/ShadowRegistry/styleSource.js.map +1 -0
  67. package/lib/commonjs/unifiber/src/adapters/reanimated.js +157 -0
  68. package/lib/commonjs/unifiber/src/adapters/reanimated.js.map +1 -0
  69. package/lib/commonjs/unifiber/src/adapters/registry.js +67 -0
  70. package/lib/commonjs/unifiber/src/adapters/registry.js.map +1 -0
  71. package/lib/commonjs/unifiber/src/diagnostics.js +59 -0
  72. package/lib/commonjs/unifiber/src/diagnostics.js.map +1 -0
  73. package/lib/commonjs/unifiber/src/fiber.js +199 -0
  74. package/lib/commonjs/unifiber/src/fiber.js.map +1 -0
  75. package/lib/commonjs/unifiber/src/host.js +214 -0
  76. package/lib/commonjs/unifiber/src/host.js.map +1 -0
  77. package/lib/commonjs/unifiber/src/index.js +38 -0
  78. package/lib/commonjs/unifiber/src/index.js.map +1 -0
  79. package/lib/commonjs/web/utils/unistyle.js +11 -3
  80. package/lib/commonjs/web/utils/unistyle.js.map +1 -1
  81. package/lib/module/components/native/deep/ActivityIndicator.js +5 -0
  82. package/lib/module/components/native/deep/ActivityIndicator.js.map +1 -0
  83. package/lib/module/components/native/deep/Animated.js +5 -0
  84. package/lib/module/components/native/deep/Animated.js.map +1 -0
  85. package/lib/module/components/native/deep/FlatList.js +5 -0
  86. package/lib/module/components/native/deep/FlatList.js.map +1 -0
  87. package/lib/module/components/native/deep/Image.js +5 -0
  88. package/lib/module/components/native/deep/Image.js.map +1 -0
  89. package/lib/module/components/native/deep/ImageBackground.js +5 -0
  90. package/lib/module/components/native/deep/ImageBackground.js.map +1 -0
  91. package/lib/module/components/native/deep/KeyboardAvoidingView.js +5 -0
  92. package/lib/module/components/native/deep/KeyboardAvoidingView.js.map +1 -0
  93. package/lib/module/components/native/deep/Pressable.js +5 -0
  94. package/lib/module/components/native/deep/Pressable.js.map +1 -0
  95. package/lib/module/components/native/deep/RefreshControl.js +5 -0
  96. package/lib/module/components/native/deep/RefreshControl.js.map +1 -0
  97. package/lib/module/components/native/deep/SafeAreaView.js +5 -0
  98. package/lib/module/components/native/deep/SafeAreaView.js.map +1 -0
  99. package/lib/module/components/native/deep/ScrollView.js +5 -0
  100. package/lib/module/components/native/deep/ScrollView.js.map +1 -0
  101. package/lib/module/components/native/deep/SectionList.js +5 -0
  102. package/lib/module/components/native/deep/SectionList.js.map +1 -0
  103. package/lib/module/components/native/deep/Switch.js +5 -0
  104. package/lib/module/components/native/deep/Switch.js.map +1 -0
  105. package/lib/module/components/native/deep/Text.js +5 -0
  106. package/lib/module/components/native/deep/Text.js.map +1 -0
  107. package/lib/module/components/native/deep/TextInput.js +5 -0
  108. package/lib/module/components/native/deep/TextInput.js.map +1 -0
  109. package/lib/module/components/native/deep/TextNativeComponent.js +8 -0
  110. package/lib/module/components/native/deep/TextNativeComponent.js.map +1 -0
  111. package/lib/module/components/native/deep/TouchableHighlight.js +5 -0
  112. package/lib/module/components/native/deep/TouchableHighlight.js.map +1 -0
  113. package/lib/module/components/native/deep/TouchableOpacity.js +5 -0
  114. package/lib/module/components/native/deep/TouchableOpacity.js.map +1 -0
  115. package/lib/module/components/native/deep/View.js +5 -0
  116. package/lib/module/components/native/deep/View.js.map +1 -0
  117. package/lib/module/components/native/deep/ViewNativeComponent.js +8 -0
  118. package/lib/module/components/native/deep/ViewNativeComponent.js.map +1 -0
  119. package/lib/module/components/native/deep/VirtualizedList.js +5 -0
  120. package/lib/module/components/native/deep/VirtualizedList.js.map +1 -0
  121. package/lib/module/components/native/index.js +43 -0
  122. package/lib/module/components/native/index.js.map +1 -0
  123. package/lib/module/core/createUnistylesActivityIndicator.js +13 -3
  124. package/lib/module/core/createUnistylesActivityIndicator.js.map +1 -1
  125. package/lib/module/core/createUnistylesElement.native.js +6 -0
  126. package/lib/module/core/createUnistylesElement.native.js.map +1 -1
  127. package/lib/module/core/createUnistylesImageBackground.js +20 -17
  128. package/lib/module/core/createUnistylesImageBackground.js.map +1 -1
  129. package/lib/module/core/createUnistylesTouchableHighlight.js +6 -0
  130. package/lib/module/core/createUnistylesTouchableHighlight.js.map +1 -1
  131. package/lib/module/core/getClassname.js +16 -1
  132. package/lib/module/core/getClassname.js.map +1 -1
  133. package/lib/module/core/hasUnistyles.js +21 -0
  134. package/lib/module/core/hasUnistyles.js.map +1 -0
  135. package/lib/module/specs/ShadowRegistry/index.js +57 -74
  136. package/lib/module/specs/ShadowRegistry/index.js.map +1 -1
  137. package/lib/module/specs/ShadowRegistry/styleSource.js +60 -0
  138. package/lib/module/specs/ShadowRegistry/styleSource.js.map +1 -0
  139. package/lib/module/unifiber/src/adapters/reanimated.js +152 -0
  140. package/lib/module/unifiber/src/adapters/reanimated.js.map +1 -0
  141. package/lib/module/unifiber/src/adapters/registry.js +62 -0
  142. package/lib/module/unifiber/src/adapters/registry.js.map +1 -0
  143. package/lib/module/unifiber/src/diagnostics.js +52 -0
  144. package/lib/module/unifiber/src/diagnostics.js.map +1 -0
  145. package/lib/module/unifiber/src/fiber.js +183 -0
  146. package/lib/module/unifiber/src/fiber.js.map +1 -0
  147. package/lib/module/unifiber/src/host.js +191 -0
  148. package/lib/module/unifiber/src/host.js.map +1 -0
  149. package/lib/module/unifiber/src/index.js +33 -0
  150. package/lib/module/unifiber/src/index.js.map +1 -0
  151. package/lib/module/web/utils/unistyle.js +11 -3
  152. package/lib/module/web/utils/unistyle.js.map +1 -1
  153. package/lib/typescript/src/components/native/deep/ActivityIndicator.d.ts +2 -0
  154. package/lib/typescript/src/components/native/deep/ActivityIndicator.d.ts.map +1 -0
  155. package/lib/typescript/src/components/native/deep/Animated.d.ts +2 -0
  156. package/lib/typescript/src/components/native/deep/Animated.d.ts.map +1 -0
  157. package/lib/typescript/src/components/native/deep/FlatList.d.ts +2 -0
  158. package/lib/typescript/src/components/native/deep/FlatList.d.ts.map +1 -0
  159. package/lib/typescript/src/components/native/deep/Image.d.ts +2 -0
  160. package/lib/typescript/src/components/native/deep/Image.d.ts.map +1 -0
  161. package/lib/typescript/src/components/native/deep/ImageBackground.d.ts +2 -0
  162. package/lib/typescript/src/components/native/deep/ImageBackground.d.ts.map +1 -0
  163. package/lib/typescript/src/components/native/deep/KeyboardAvoidingView.d.ts +2 -0
  164. package/lib/typescript/src/components/native/deep/KeyboardAvoidingView.d.ts.map +1 -0
  165. package/lib/typescript/src/components/native/deep/Pressable.d.ts +2 -0
  166. package/lib/typescript/src/components/native/deep/Pressable.d.ts.map +1 -0
  167. package/lib/typescript/src/components/native/deep/RefreshControl.d.ts +2 -0
  168. package/lib/typescript/src/components/native/deep/RefreshControl.d.ts.map +1 -0
  169. package/lib/typescript/src/components/native/deep/SafeAreaView.d.ts +2 -0
  170. package/lib/typescript/src/components/native/deep/SafeAreaView.d.ts.map +1 -0
  171. package/lib/typescript/src/components/native/deep/ScrollView.d.ts +2 -0
  172. package/lib/typescript/src/components/native/deep/ScrollView.d.ts.map +1 -0
  173. package/lib/typescript/src/components/native/deep/SectionList.d.ts +2 -0
  174. package/lib/typescript/src/components/native/deep/SectionList.d.ts.map +1 -0
  175. package/lib/typescript/src/components/native/deep/Switch.d.ts +2 -0
  176. package/lib/typescript/src/components/native/deep/Switch.d.ts.map +1 -0
  177. package/lib/typescript/src/components/native/deep/Text.d.ts +2 -0
  178. package/lib/typescript/src/components/native/deep/Text.d.ts.map +1 -0
  179. package/lib/typescript/src/components/native/deep/TextInput.d.ts +2 -0
  180. package/lib/typescript/src/components/native/deep/TextInput.d.ts.map +1 -0
  181. package/lib/typescript/src/components/native/deep/TextNativeComponent.d.ts +3 -0
  182. package/lib/typescript/src/components/native/deep/TextNativeComponent.d.ts.map +1 -0
  183. package/lib/typescript/src/components/native/deep/TouchableHighlight.d.ts +2 -0
  184. package/lib/typescript/src/components/native/deep/TouchableHighlight.d.ts.map +1 -0
  185. package/lib/typescript/src/components/native/deep/TouchableOpacity.d.ts +2 -0
  186. package/lib/typescript/src/components/native/deep/TouchableOpacity.d.ts.map +1 -0
  187. package/lib/typescript/src/components/native/deep/View.d.ts +2 -0
  188. package/lib/typescript/src/components/native/deep/View.d.ts.map +1 -0
  189. package/lib/typescript/src/components/native/deep/ViewNativeComponent.d.ts +3 -0
  190. package/lib/typescript/src/components/native/deep/ViewNativeComponent.d.ts.map +1 -0
  191. package/lib/typescript/src/components/native/deep/VirtualizedList.d.ts +2 -0
  192. package/lib/typescript/src/components/native/deep/VirtualizedList.d.ts.map +1 -0
  193. package/lib/typescript/src/components/native/index.d.ts +4 -0
  194. package/lib/typescript/src/components/native/index.d.ts.map +1 -0
  195. package/lib/typescript/src/components/scopeChildren.d.ts +1 -1
  196. package/lib/typescript/src/core/createUnistylesActivityIndicator.d.ts.map +1 -1
  197. package/lib/typescript/src/core/createUnistylesElement.native.d.ts.map +1 -1
  198. package/lib/typescript/src/core/createUnistylesImageBackground.d.ts.map +1 -1
  199. package/lib/typescript/src/core/createUnistylesTouchableHighlight.d.ts.map +1 -1
  200. package/lib/typescript/src/core/getClassname.d.ts.map +1 -1
  201. package/lib/typescript/src/core/hasUnistyles.d.ts +2 -0
  202. package/lib/typescript/src/core/hasUnistyles.d.ts.map +1 -0
  203. package/lib/typescript/src/specs/ShadowRegistry/index.d.ts.map +1 -1
  204. package/lib/typescript/src/specs/ShadowRegistry/styleSource.d.ts +11 -0
  205. package/lib/typescript/src/specs/ShadowRegistry/styleSource.d.ts.map +1 -0
  206. package/lib/typescript/src/specs/ShadowRegistry/types.d.ts +4 -41
  207. package/lib/typescript/src/specs/ShadowRegistry/types.d.ts.map +1 -1
  208. package/lib/typescript/src/unifiber/src/adapters/reanimated.d.ts +17 -0
  209. package/lib/typescript/src/unifiber/src/adapters/reanimated.d.ts.map +1 -0
  210. package/lib/typescript/src/unifiber/src/adapters/registry.d.ts +23 -0
  211. package/lib/typescript/src/unifiber/src/adapters/registry.d.ts.map +1 -0
  212. package/lib/typescript/src/unifiber/src/diagnostics.d.ts +10 -0
  213. package/lib/typescript/src/unifiber/src/diagnostics.d.ts.map +1 -0
  214. package/lib/typescript/src/unifiber/src/fiber.d.ts +48 -0
  215. package/lib/typescript/src/unifiber/src/fiber.d.ts.map +1 -0
  216. package/lib/typescript/src/unifiber/src/host.d.ts +32 -0
  217. package/lib/typescript/src/unifiber/src/host.d.ts.map +1 -0
  218. package/lib/typescript/src/unifiber/src/index.d.ts +49 -0
  219. package/lib/typescript/src/unifiber/src/index.d.ts.map +1 -0
  220. package/lib/typescript/src/web/utils/unistyle.d.ts.map +1 -1
  221. package/metro/babel-transformer.js +1040 -0
  222. package/metro/index.d.ts +31 -0
  223. package/metro/index.js +170 -0
  224. package/package.json +26 -8
  225. package/plugin/index.d.ts +7 -0
  226. package/plugin/index.js +36 -16
  227. package/src/components/native/deep/ActivityIndicator.ts +2 -0
  228. package/src/components/native/deep/Animated.ts +2 -0
  229. package/src/components/native/deep/FlatList.ts +2 -0
  230. package/src/components/native/deep/Image.ts +2 -0
  231. package/src/components/native/deep/ImageBackground.ts +2 -0
  232. package/src/components/native/deep/KeyboardAvoidingView.ts +2 -0
  233. package/src/components/native/deep/Pressable.ts +2 -0
  234. package/src/components/native/deep/RefreshControl.ts +2 -0
  235. package/src/components/native/deep/SafeAreaView.ts +2 -0
  236. package/src/components/native/deep/ScrollView.ts +2 -0
  237. package/src/components/native/deep/SectionList.ts +2 -0
  238. package/src/components/native/deep/Switch.ts +2 -0
  239. package/src/components/native/deep/Text.ts +2 -0
  240. package/src/components/native/deep/TextInput.ts +2 -0
  241. package/src/components/native/deep/TextNativeComponent.ts +5 -0
  242. package/src/components/native/deep/TouchableHighlight.ts +2 -0
  243. package/src/components/native/deep/TouchableOpacity.ts +2 -0
  244. package/src/components/native/deep/View.ts +2 -0
  245. package/src/components/native/deep/ViewNativeComponent.ts +5 -0
  246. package/src/components/native/deep/VirtualizedList.ts +2 -0
  247. package/src/components/native/index.ts +41 -0
  248. package/src/core/createUnistylesActivityIndicator.tsx +11 -4
  249. package/src/core/createUnistylesElement.native.tsx +5 -0
  250. package/src/core/createUnistylesImageBackground.tsx +27 -23
  251. package/src/core/createUnistylesTouchableHighlight.tsx +5 -0
  252. package/src/core/getClassname.ts +10 -1
  253. package/src/core/hasUnistyles.ts +20 -0
  254. package/src/specs/ShadowRegistry/index.ts +50 -102
  255. package/src/specs/ShadowRegistry/styleSource.ts +78 -0
  256. package/src/specs/ShadowRegistry/types.ts +3 -43
  257. package/src/unifiber/LICENSE +21 -0
  258. package/src/unifiber/README.md +92 -0
  259. package/src/unifiber/src/adapters/reanimated.ts +204 -0
  260. package/src/unifiber/src/adapters/registry.ts +102 -0
  261. package/src/unifiber/src/diagnostics.ts +55 -0
  262. package/src/unifiber/src/fiber.ts +262 -0
  263. package/src/unifiber/src/host.ts +236 -0
  264. package/src/unifiber/src/index.ts +43 -0
  265. package/src/web/utils/unistyle.ts +12 -3
  266. package/lib/typescript/src/__tests__/mocks.spec.d.ts +0 -2
  267. package/lib/typescript/src/__tests__/mocks.spec.d.ts.map +0 -1
  268. package/lib/typescript/src/__tests__/passForwardRef.spec.d.ts +0 -2
  269. package/lib/typescript/src/__tests__/passForwardRef.spec.d.ts.map +0 -1
  270. package/lib/typescript/src/__tests__/scoped-theme.spec.d.ts +0 -2
  271. package/lib/typescript/src/__tests__/scoped-theme.spec.d.ts.map +0 -1
  272. package/lib/typescript/src/__tests__/shadow-registry.spec.d.ts +0 -2
  273. package/lib/typescript/src/__tests__/shadow-registry.spec.d.ts.map +0 -1
  274. package/lib/typescript/src/__tests__/web-child-selector.spec.d.ts +0 -2
  275. package/lib/typescript/src/__tests__/web-child-selector.spec.d.ts.map +0 -1
  276. package/lib/typescript/src/__tests__/web-listener.spec.d.ts +0 -2
  277. package/lib/typescript/src/__tests__/web-listener.spec.d.ts.map +0 -1
  278. package/lib/typescript/src/__tests__/web-pointer-events.spec.d.ts +0 -2
  279. package/lib/typescript/src/__tests__/web-pointer-events.spec.d.ts.map +0 -1
  280. package/lib/typescript/src/__tests__/web-runtime.spec.d.ts +0 -2
  281. package/lib/typescript/src/__tests__/web-runtime.spec.d.ts.map +0 -1
  282. package/lib/typescript/src/__tests__/withUnistyles.spec.d.ts +0 -2
  283. package/lib/typescript/src/__tests__/withUnistyles.spec.d.ts.map +0 -1
@@ -5,6 +5,7 @@ import React, { useContext } from 'react'
5
5
  import { ScopedThemeContext } from '../components/ScopedThemeContext'
6
6
  import { UnistylesShadowRegistry } from '../specs'
7
7
  import { copyComponentProperties } from '../utils'
8
+ import { hasUnistyles } from './hasUnistyles'
8
9
  import { passForwardedRef } from './passForwardRef'
9
10
  import { maybeWarnAboutMultipleUnistyles } from './warn'
10
11
 
@@ -17,32 +18,35 @@ export const createUnistylesImageBackground = (Component: typeof ImageBackground
17
18
  // @ts-ignore we don't know the type of the component
18
19
  maybeWarnAboutMultipleUnistyles(props.imageStyle, 'ImageBackground')
19
20
 
21
+ const linkRef = (ref: ImageBackground | null) => {
22
+ return passForwardedRef(
23
+ ref,
24
+ forwardedRef,
25
+ () => {
26
+ // @ts-expect-error - this is hidden from TS
27
+ UnistylesShadowRegistry.add(ref, props.style, scope)
28
+ },
29
+ () => {
30
+ // @ts-expect-error - this is hidden from TS
31
+ UnistylesShadowRegistry.remove(ref)
32
+ },
33
+ )
34
+ }
35
+ const linkImageRef = (ref: unknown) => {
36
+ // @ts-expect-error web types are not compatible with RN styles
37
+ UnistylesShadowRegistry.add(ref, props.imageStyle, scope)
38
+
39
+ return () => {
40
+ // @ts-ignore this is hidden from TS
41
+ UnistylesShadowRegistry.remove(ref)
42
+ }
43
+ }
44
+
20
45
  return (
21
46
  <Component
22
47
  {...props}
23
- ref={(ref) => {
24
- return passForwardedRef(
25
- ref,
26
- forwardedRef,
27
- () => {
28
- // @ts-expect-error - this is hidden from TS
29
- UnistylesShadowRegistry.add(ref, props.style, scope)
30
- },
31
- () => {
32
- // @ts-expect-error - this is hidden from TS
33
- UnistylesShadowRegistry.remove(ref)
34
- },
35
- )
36
- }}
37
- imageRef={(ref) => {
38
- // @ts-expect-error web types are not compatible with RN styles
39
- UnistylesShadowRegistry.add(ref, props.imageStyle, scope)
40
-
41
- return () => {
42
- // @ts-ignore this is hidden from TS
43
- UnistylesShadowRegistry.remove(ref)
44
- }
45
- }}
48
+ ref={hasUnistyles(props.style) ? linkRef : forwardedRef}
49
+ imageRef={hasUnistyles(props.imageStyle) ? linkImageRef : props.imageRef}
46
50
  />
47
51
  )
48
52
  })
@@ -5,6 +5,7 @@ import React, { useCallback, useContext, useLayoutEffect, useRef, useState } fro
5
5
  import { ScopedThemeContext } from '../components/ScopedThemeContext'
6
6
  import { UnistylesShadowRegistry } from '../specs'
7
7
  import { copyComponentProperties } from '../utils'
8
+ import { hasUnistyles } from './hasUnistyles'
8
9
  import { passForwardedRef } from './passForwardRef'
9
10
  import { maybeWarnAboutMultipleUnistyles } from './warn'
10
11
 
@@ -49,6 +50,10 @@ export const createUnistylesTouchableHighlight = (Component: typeof TouchableHig
49
50
  [props, scope],
50
51
  )
51
52
 
53
+ if (!hasUnistyles(props.style)) {
54
+ return <Component {...props} />
55
+ }
56
+
52
57
  return (
53
58
  <Component
54
59
  {...props}
@@ -1,7 +1,7 @@
1
1
  import type { UnistylesValues } from '../types'
2
2
 
3
3
  import * as unistyles from '../web/services'
4
- import { checkForAnimated } from '../web/utils'
4
+ import { checkForAnimated, isGeneratedUnistyle } from '../web/utils'
5
5
 
6
6
  export const getClassName = (unistyle: UnistylesValues | undefined | Array<UnistylesValues>, forChild?: boolean) => {
7
7
  if (!unistyle) {
@@ -11,6 +11,15 @@ export const getClassName = (unistyle: UnistylesValues | undefined | Array<Unist
11
11
  const flattenedStyles = Array.isArray(unistyle) ? unistyle.flat(Number.POSITIVE_INFINITY) : [unistyle]
12
12
  const animatedStyles = flattenedStyles.filter(checkForAnimated)
13
13
  const regularStyles = flattenedStyles.filter((style) => !checkForAnimated(style))
14
+ const [firstStyle, ...otherStyles] = regularStyles
15
+
16
+ // Already processed by an outer Unistyles component, e.g. createUnistylesElement(Animated.View),
17
+ // styles added after it (like Reanimated's initial animated values) stay inline
18
+ if (firstStyle && isGeneratedUnistyle(firstStyle) && firstStyle.hash) {
19
+ const { hash, injectedClassName } = firstStyle
20
+
21
+ return [{ $$css: true, hash, injectedClassName }, otherStyles.concat(animatedStyles)] as const
22
+ }
14
23
 
15
24
  const { hash, injectedClassName } = unistyles.services.shadowRegistry.addStyles(regularStyles, forChild)
16
25
 
@@ -0,0 +1,20 @@
1
+ // whether a style prop (also nested arrays) holds a unistyle, the only styles Unistyles updates
2
+ // a view without one renders like a React Native view, it never links
3
+ export const hasUnistyles = (style: unknown): boolean => {
4
+ if (Array.isArray(style)) {
5
+ return style.some(hasUnistyles)
6
+ }
7
+
8
+ if (!style || typeof style !== 'object') {
9
+ return false
10
+ }
11
+
12
+ // own keys only, like the registry. A unistyle starts with its `unistyles_` key, so it exits early
13
+ for (const key in style) {
14
+ if (key.startsWith('unistyles_') && Object.prototype.hasOwnProperty.call(style, key)) {
15
+ return true
16
+ }
17
+ }
18
+
19
+ return false
20
+ }
@@ -2,10 +2,13 @@ import { NitroModules } from 'react-native-nitro-modules'
2
2
 
3
3
  import type { Scope } from '../../components/ScopedThemeContext'
4
4
  import type { VerifyReport } from '../../diagnostics/types'
5
+ import type { Host } from '../../unifiber/src'
5
6
  import type { UnistylesShadowRegistry as UnistylesShadowRegistrySpec } from './ShadowRegistry.nitro'
6
7
  import type { ShadowNode, Unistyle, ViewHandle } from './types'
7
8
 
9
+ import { Fiber, Reanimated } from '../../unifiber/src'
8
10
  import { StyleSheet } from '../StyleSheet'
11
+ import { createUnistylesStyleSource } from './styleSource'
9
12
 
10
13
  interface ShadowRegistry extends UnistylesShadowRegistrySpec {
11
14
  // Babel API
@@ -25,121 +28,56 @@ interface ShadowRegistry extends UnistylesShadowRegistrySpec {
25
28
 
26
29
  const HybridShadowRegistry = NitroModules.createHybridObject<ShadowRegistry>('UnistylesShadowRegistry')
27
30
 
28
- const HOST_COMPONENT_TAG = 5
29
- const SUSPENSE_TAG = 13
30
- const OFFSCREEN_TAG = 22
31
+ const { collectVisibleAncestors, getHostFor, getHostForInstanceHandle, getShadowNode, getShadowNodes, isHidden } = Fiber
31
32
 
32
- const isInsideSuspendedBoundary = (fiber: any): boolean => {
33
- let current = fiber?.return
33
+ const { source: styleSource, bumpEpoch } = createUnistylesStyleSource({
34
+ get: () => HybridShadowRegistry.getScopedTheme(),
35
+ set: (name) => HybridShadowRegistry.setScopedTheme(name),
36
+ })
37
+ const owners = Fiber.createOwnerRegistry(styleSource, [Reanimated.cssAdapter], (reason) => {
38
+ console.warn(`Unistyles: ${reason}. CSS transitions won't follow theme changes.`)
39
+ })
34
40
 
35
- while (current) {
36
- if ((current.tag === SUSPENSE_TAG || current.tag === OFFSCREEN_TAG) && current.memoizedState !== null) {
37
- return true
38
- }
39
-
40
- current = current.return
41
- }
41
+ // A component can point at another native view by the time its ref is cleaned up, eg. FlatList on Android remounts
42
+ // its native ScrollView when `horizontal` changes, so remove unlinks the view it was linked with
43
+ // The host points at its current node, while a stored node would keep its first revision (and children) alive
44
+ // Native views always resolve to their own host, so they skip it
45
+ const linkedHosts = new WeakMap<object, Host>()
42
46
 
43
- return false
44
- }
47
+ const committedHosts: Array<Host | undefined> = []
48
+ let refreshNodes: Array<ShadowNode> = []
45
49
 
46
- const findFiberForHandle = (handle: ViewHandle) => {
47
- return (
48
- handle?.__internalInstanceHandle ??
49
- handle?.getScrollResponder?.()?.getNativeScrollRef?.()?.__internalInstanceHandle ??
50
- handle?.getNativeScrollRef?.()?.__internalInstanceHandle ??
51
- handle?._viewRef?.__internalInstanceHandle ??
52
- handle?.viewRef?.current?.__internalInstanceHandle ??
53
- handle?._nativeRef?.__internalInstanceHandle
54
- )
55
- }
56
-
57
- const findShadowNodeForHandle = (handle: ViewHandle) => {
58
- const node =
59
- handle?.__internalInstanceHandle?.stateNode?.node ??
60
- handle?.getScrollResponder?.()?.getNativeScrollRef?.()?.__internalInstanceHandle?.stateNode?.node ??
61
- handle?.getNativeScrollRef?.()?.__internalInstanceHandle?.stateNode?.node ??
62
- handle?._viewRef?.__internalInstanceHandle?.stateNode?.node ??
63
- handle?.viewRef?.current?.__internalInstanceHandle?.stateNode?.node ??
64
- handle?._nativeRef?.__internalInstanceHandle?.stateNode?.node
65
-
66
- // @ts-ignore we don't know the type of handle
67
- if (!node && handle?.props?.horizontal && handle?.constructor?.name === 'FlatList') {
68
- throw new Error(
69
- 'Unistyles: detected an unsupported FlatList with the horizontal prop. This will cause crashes on Android due to a bug in React Native core. Read more: https://github.com/facebook/react-native/issues/51601',
70
- )
71
- }
72
-
73
- return node
50
+ const collectShadowNodes = (host: Host) => {
51
+ getShadowNodes(host, refreshNodes)
74
52
  }
75
53
 
76
54
  // React re-attaches an untouched subtree through its root's node and only follows clones made on the JS thread.
77
55
  // Once a node was cloned elsewhere (state updates, Reanimated), React would commit a subtree from before a Unistyles
78
56
  // update, so after a Unistyles commit the committed nodes and their host ancestors must point at the committed tree
79
57
  const refreshReactNodes = () => {
80
- const fibers = HybridShadowRegistry.takeCommittedInstanceHandles()
58
+ bumpEpoch()
59
+
60
+ const handles = HybridShadowRegistry.takeCommittedInstanceHandles()
81
61
 
82
- if (fibers.length === 0) {
62
+ if (handles.length === 0) {
83
63
  return
84
64
  }
85
65
 
86
- const nodes: Array<ShadowNode> = []
87
- const refreshedTags = new Set<number>()
88
- const hostFibers: Array<any> = []
89
-
90
- for (const fiber of fibers) {
91
- // collected, unmounted since
92
- if (!fiber) {
93
- continue
66
+ try {
67
+ for (let i = 0; i < handles.length; i++) {
68
+ committedHosts[i] = getHostForInstanceHandle(handles[i])
94
69
  }
95
70
 
96
- let isHidden = false
97
-
98
- hostFibers.length = 0
99
-
100
- for (let current: any = fiber; current; current = current.return) {
101
- // hidden by Suspense or a frozen screen
102
- if ((current.tag === SUSPENSE_TAG || current.tag === OFFSCREEN_TAG) && current.memoizedState !== null) {
103
- isHidden = true
104
- }
105
-
106
- if (current.tag !== HOST_COMPONENT_TAG) {
107
- continue
108
- }
71
+ collectVisibleAncestors(committedHosts, collectShadowNodes)
109
72
 
110
- // its ancestors are visible and already collected
111
- if (refreshedTags.has(current.stateNode?.canonical?.nativeTag)) {
112
- break
113
- }
114
-
115
- hostFibers.push(current)
116
- }
117
-
118
- if (isHidden) {
119
- continue
120
- }
121
-
122
- for (const hostFiber of hostFibers) {
123
- const node = hostFiber.stateNode?.node
124
- const alternateNode = hostFiber.alternate?.stateNode?.node
125
- const hostTag = hostFiber.stateNode?.canonical?.nativeTag
126
-
127
- if (hostTag !== undefined) {
128
- refreshedTags.add(hostTag)
129
- }
130
-
131
- if (node) {
132
- nodes.push(node)
133
- }
134
-
135
- if (alternateNode && alternateNode !== node) {
136
- nodes.push(alternateNode)
137
- }
73
+ if (refreshNodes.length > 0) {
74
+ HybridShadowRegistry.refreshReactNodes(refreshNodes)
138
75
  }
139
- }
140
76
 
141
- if (nodes.length > 0) {
142
- HybridShadowRegistry.refreshReactNodes(nodes)
77
+ owners.refresh(committedHosts)
78
+ } finally {
79
+ committedHosts.length = 0
80
+ refreshNodes = []
143
81
  }
144
82
  }
145
83
 
@@ -191,9 +129,10 @@ HybridShadowRegistry.add = (handle, styles, scope) => {
191
129
  }
192
130
 
193
131
  if (filteredStyles.length > 0) {
194
- const node = findShadowNodeForHandle(handle)
132
+ const host = getHostFor(handle)
133
+ const node = host && getShadowNode(host)
195
134
 
196
- if (!node) {
135
+ if (!host || !node) {
197
136
  throw new Error(
198
137
  `Unistyles: Could not find shadow node for one of your components of type ${handle?.constructor?.name ?? 'unknown'}`,
199
138
  )
@@ -207,6 +146,11 @@ HybridShadowRegistry.add = (handle, styles, scope) => {
207
146
  }
208
147
 
209
148
  HybridShadowRegistry.link(node, filteredStyles)
149
+ owners.link(host)
150
+
151
+ if (!handle.__internalInstanceHandle) {
152
+ linkedHosts.set(handle, host)
153
+ }
210
154
 
211
155
  if (scope) {
212
156
  HybridShadowRegistry.setScopedTheme(previousScopedTheme)
@@ -219,12 +163,16 @@ HybridShadowRegistry.remove = (handle) => {
219
163
  return
220
164
  }
221
165
 
222
- const maybeNode = findShadowNodeForHandle(handle)
166
+ const linkedHost = handle.__internalInstanceHandle ? undefined : linkedHosts.get(handle)
167
+ const host = linkedHost ?? getHostFor(handle)
168
+ const maybeNode = host && getShadowNode(host)
223
169
 
224
- if (maybeNode) {
225
- const fiber = findFiberForHandle(handle)
170
+ if (linkedHost) {
171
+ linkedHosts.delete(handle)
172
+ }
226
173
 
227
- if (fiber && isInsideSuspendedBoundary(fiber)) {
174
+ if (host && maybeNode) {
175
+ if (isHidden(host)) {
228
176
  HybridShadowRegistry.suspend(maybeNode)
229
177
  } else {
230
178
  HybridShadowRegistry.unlink(maybeNode)
@@ -0,0 +1,78 @@
1
+ import type { Scope } from '../../components/ScopedThemeContext'
2
+ import type { StyleSource } from '../../unifiber/src'
3
+
4
+ import { ScopedThemeContext } from '../../components/ScopedThemeContext'
5
+
6
+ type ScopedThemeAccess = {
7
+ get(): string | undefined
8
+ set(name: string | undefined): void
9
+ }
10
+
11
+ export const createUnistylesStyleSource = (scopedTheme: ScopedThemeAccess) => {
12
+ let epoch = 0
13
+ let warned = false
14
+
15
+ const source: StyleSource = {
16
+ name: 'unistyles',
17
+ epoch: () => epoch,
18
+ contexts: [ScopedThemeContext],
19
+ contextKey: (_context, scope) => (scope as Scope | null)?.name,
20
+ resolve: (props, read) => {
21
+ try {
22
+ return resolveFresh(props, read(ScopedThemeContext))
23
+ } catch (error) {
24
+ if (!warned) {
25
+ warned = true
26
+ console.warn(`Unistyles: Could not refresh styles for a CSS transition. ${String(error)}`)
27
+ }
28
+
29
+ return undefined
30
+ }
31
+ },
32
+ }
33
+
34
+ const resolveFresh = (props: Record<string, any>, scope: Scope | null | undefined) => {
35
+ const styles = [props.style].flat(Infinity)
36
+ const fresh: Record<string, unknown> = {}
37
+ let hasUnistyles = false
38
+
39
+ for (const style of styles) {
40
+ if (!style || typeof style !== 'object') {
41
+ continue
42
+ }
43
+
44
+ Object.assign(fresh, style)
45
+
46
+ for (const key in style) {
47
+ if (!key.startsWith('unistyles_') || !Object.prototype.hasOwnProperty.call(style, key)) {
48
+ continue
49
+ }
50
+
51
+ hasUnistyles = true
52
+
53
+ const previousScopedTheme = scope ? scopedTheme.get() : undefined
54
+
55
+ if (scope) {
56
+ scopedTheme.set(scope.name)
57
+ }
58
+
59
+ try {
60
+ Object.assign(fresh, style[key]?.uni__getStyles?.())
61
+ } finally {
62
+ if (scope) {
63
+ scopedTheme.set(previousScopedTheme)
64
+ }
65
+ }
66
+ }
67
+ }
68
+
69
+ return hasUnistyles ? fresh : undefined
70
+ }
71
+
72
+ return {
73
+ source,
74
+ bumpEpoch: () => {
75
+ epoch++
76
+ },
77
+ }
78
+ }
@@ -1,48 +1,8 @@
1
- export type StateNode = {
2
- node?: ShadowNode
3
- canonical?: {
4
- nativeTag?: number
5
- }
6
- }
7
-
8
- export type ShadowNode = {
9
- __hostObjectShadowNodeWrapper: any
10
- }
1
+ export type { ShadowNode } from '../../unifiber/src'
11
2
 
12
3
  export type ViewHandle = {
13
- __internalInstanceHandle?: {
14
- stateNode?: StateNode
15
- elementType?: string
16
- }
17
- getScrollResponder?: () => {
18
- getNativeScrollRef?: () => {
19
- __internalInstanceHandle?: {
20
- stateNode?: StateNode
21
- }
22
- }
23
- }
24
- getNativeScrollRef?: () => {
25
- __internalInstanceHandle?: {
26
- stateNode?: StateNode
27
- }
28
- }
29
- _viewRef?: {
30
- __internalInstanceHandle?: {
31
- stateNode?: StateNode
32
- }
33
- }
34
- viewRef?: {
35
- current?: {
36
- __internalInstanceHandle?: {
37
- stateNode?: StateNode
38
- }
39
- }
40
- }
41
- _nativeRef?: {
42
- __internalInstanceHandle?: {
43
- stateNode?: StateNode
44
- }
45
- }
4
+ __internalInstanceHandle?: unknown
5
+ constructor?: { name?: string }
46
6
  }
47
7
 
48
8
  export type Unistyle = {
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Jacek Pudysz
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,92 @@
1
+ <div align="center">
2
+
3
+ # unifiber
4
+
5
+ **One small, tested place for everything React Native styling libraries read from React's private fiber tree.**
6
+
7
+ Built for [Unistyles](https://github.com/jpudysz/react-native-unistyles) and Uniwind Pro.
8
+
9
+ `React 19` · `React Native 0.86 – 0.87` · `iOS + Android` · `Hermes-first` · `MIT`
10
+
11
+ </div>
12
+
13
+ ---
14
+
15
+ ## Why this exists
16
+
17
+ Unistyles and Uniwind both do something React Native doesn't officially support: they update the native shadow tree **without a React render**. Theme switches, breakpoints and insets reach native views in a single commit. To do that, both read React's private fiber fields: `__internalInstanceHandle`, `stateNode.node`, `memoizedState`, `return`, `alternate` and more.
18
+
19
+ Until now, each library kept its own copy of those reads. They drifted apart, and both had bugs that only show up on real apps.
20
+
21
+ unifiber is the one module that knows what a fiber looks like. It answers questions such as "which native view is this ref?", "is it hidden, and why?" and "what must refresh?". It's tested against **React Native's own components** and **Unistyles' real code**. A daily CI run against React Native nightly catches changes to React's internals before they ship.
22
+
23
+ ## API
24
+
25
+ `Fiber` and `Reanimated` are plain objects. A **`Host`** is a native view's creation fiber behind an opaque type: free to keep, and stable, so the same view is always the same `Host` (`===` and `WeakMap` keys work).
26
+
27
+ ### ref → Host
28
+ | | |
29
+ |---|---|
30
+ | `getHostFor(ref)` | Native-view refs, RN composites (ScrollView, FlatList / SectionList / VirtualizedList, ImageBackground, KeyboardAvoidingView, RefreshControl), and class components that render their view directly (Button on Android). Any other class component gives the first native view it renders, which may not be the one you styled. Call once per link and keep the result. |
31
+ | `getShadowNodeFor(ref)` | Hot path when you don't keep a Host. |
32
+ | `getHostForInstanceHandle(handle)` | For fibers handed back from C++ (`ShadowNodeFamily::getInstanceHandle`). |
33
+ | `getContentContainerFor(ref)` | ScrollView / list content container, through RN's public `getInnerViewRef()`. |
34
+
35
+ ### Host → native
36
+ | | |
37
+ |---|---|
38
+ | `getShadowNode(host)` | The node in React's `stateNode.node` wrapper. |
39
+ | `getShadowNodes(host, out?)` | Every node React may diff against or re-attach: one after a commit, two while a render is in flight. |
40
+ | `getNativeTag(host)` | `undefined` once the view has unmounted. |
41
+ | `getParentHost(host)` | The nearest native view above (ActivityIndicator's wrapper, on both platforms). |
42
+ | `patchRenderedProps(host, patch)` | Replaces React's diff baseline on both halves. **The only write**, used by Uniwind's baseline. |
43
+
44
+ ### Hidden state
45
+ | | |
46
+ |---|---|
47
+ | `isHidden(host)` | Inside a Suspense fallback, a frozen screen or a hidden `<Activity>`: suspend instead of unlinking. Also right inside a ref cleanup, where React has not switched the committed tree yet. |
48
+ | `isSuspended` · `isFrozen` · `isInHiddenActivity` | Why. Frozen means react-freeze (react-native-screens `freezeOnBlur`, react-navigation). |
49
+ | `collectVisibleAncestors(hosts, visit)` | Batch refresh. Each visible native view from `hosts` up to the root, visited once, in one shared pass. |
50
+ | `collectAncestors(hosts, visit)` | The same walk, with hidden views included. These are the semantics of Uniwind's `collectHostNodes` today. |
51
+
52
+ ### Diagnostics
53
+ | | |
54
+ |---|---|
55
+ | `verify(host, expected)` | Style keys React would re-send, i.e. undo, on this view's next render. |
56
+ | `getOwners(host)` | *Development builds only:* the components that created the view, e.g. `['ProfileCard', 'ProfileScreen']`. |
57
+ | `getCreationStack(host)` | *Development builds only:* where the JSX was written, for Metro to symbolicate. |
58
+
59
+ ### Adapters: when a 3rd-party component owns the view
60
+ Reanimated's `AnimatedComponent` keeps its own copy of a view's style for CSS transitions, so a native-only theme change gets overridden. The adapter keeps that copy in sync, so the theme change **animates** instead.
61
+
62
+ ```ts
63
+ const owners = Fiber.createOwnerRegistry({
64
+ name: 'unistyles',
65
+ epoch: () => themeVersion, // bump on every runtime change
66
+ contexts: [ScopedThemeContext],
67
+ contextKey: (_ctx, scope) => scope?.name, // stable scopes are renamed in place
68
+ resolve: (props, read) => freshStyles(props, read(ScopedThemeContext)),
69
+ }, [Reanimated.cssAdapter], warnOnce)
70
+
71
+ owners.link(host) // in the link path: ~86 ns for a plain view
72
+ owners.refresh(hosts) // after a native-only update
73
+ ```
74
+
75
+ Hidden views (a frozen screen, Suspense, a hidden `<Activity>`) are refreshed too, so a transition-only view shows the new value when it's revealed. **Trade-off:** a view that also has a keyframe animation (`animation*` keys) or pseudo-style values isn't refreshed while hidden. After it's revealed, it transitions from the pre-hide value to the new one, then settles correctly. Reanimated registers animations and pseudo-styles again on update, and React runs no `componentWillUnmount` for a subtree deleted while hidden, so refreshing them would leak.
76
+
77
+ An adapter that throws is switched off for the session and reported once. Private Reanimated fields are pinned by a contract test against the 4.5.1 and 4.7.0 sources.
78
+
79
+ ## Compatibility
80
+
81
+ | | |
82
+ |---|---|
83
+ | React | 19.2, and 19.3.1 with RN nightly (fiber tags pinned for 19.x) |
84
+ | React Native | 0.87.1, 0.86.3 · iOS, Android · development and production. CI also runs React Native **nightly** (main) every day; 0.89.0-nightly-20261016 passes |
85
+ | Reanimated | 4.5.1, 4.7.0 |
86
+ | Unistyles | 3.5.3 and `main` (its real code runs in the suite) |
87
+ | Uniwind | its lookups copied verbatim into the suite |
88
+ | Engine | Hermes (legacy Hermes benchmarked) |
89
+
90
+ ## License
91
+
92
+ MIT