@expo/ui 57.0.13 → 57.0.15
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.
- package/CHANGELOG.md +34 -0
- package/android/build.gradle +2 -2
- package/android/src/main/java/expo/modules/ui/ExpoUIModule.kt +17 -3
- package/android/src/main/java/expo/modules/ui/ProgressView.kt +31 -0
- package/android/src/main/java/expo/modules/ui/RNHostView.kt +161 -11
- package/build/PresentedContentContext.d.ts +18 -0
- package/build/PresentedContentContext.d.ts.map +1 -0
- package/build/community/pager-view/PagerView.android.d.ts.map +1 -1
- package/build/jetpack-compose/AlertDialog/index.d.ts.map +1 -1
- package/build/jetpack-compose/BasicAlertDialog/index.d.ts.map +1 -1
- package/build/jetpack-compose/DropdownMenu/index.d.ts.map +1 -1
- package/build/jetpack-compose/ExposedDropdownMenuBox/ExposedDropdownMenu.d.ts.map +1 -1
- package/build/jetpack-compose/Host/index.d.ts +3 -0
- package/build/jetpack-compose/Host/index.d.ts.map +1 -1
- package/build/jetpack-compose/ModalBottomSheet/index.d.ts.map +1 -1
- package/build/jetpack-compose/Progress/index.d.ts +25 -2
- package/build/jetpack-compose/Progress/index.d.ts.map +1 -1
- package/build/jetpack-compose/RNHostView/index.d.ts +6 -6
- package/build/jetpack-compose/RNHostView/index.d.ts.map +1 -1
- package/build/jetpack-compose/TextField/shared.d.ts +2 -1
- package/build/jetpack-compose/TextField/shared.d.ts.map +1 -1
- package/build/jetpack-compose/Tooltip/index.d.ts.map +1 -1
- package/build/keyboard/index.d.ts +43 -0
- package/build/keyboard/index.d.ts.map +1 -0
- package/build/keyboard/interop.d.ts +16 -0
- package/build/keyboard/interop.d.ts.map +1 -0
- package/build/keyboard/textInputState.d.ts +2 -0
- package/build/keyboard/textInputState.d.ts.map +1 -0
- package/build/keyboard/textInputState.web.d.ts +11 -0
- package/build/keyboard/textInputState.web.d.ts.map +1 -0
- package/build/swift-ui/Background/index.d.ts +18 -0
- package/build/swift-ui/Background/index.d.ts.map +1 -0
- package/build/swift-ui/BottomSheet/index.d.ts.map +1 -1
- package/build/swift-ui/Host/index.d.ts +3 -0
- package/build/swift-ui/Host/index.d.ts.map +1 -1
- package/build/swift-ui/Popover/index.d.ts.map +1 -1
- package/build/swift-ui/RNHostView.d.ts +4 -1
- package/build/swift-ui/RNHostView.d.ts.map +1 -1
- package/build/swift-ui/SecureField/index.d.ts.map +1 -1
- package/build/swift-ui/TextField/index.d.ts.map +1 -1
- package/build/swift-ui/index.d.ts +1 -0
- package/build/swift-ui/index.d.ts.map +1 -1
- package/build/swift-ui/modifiers/index.d.ts +9 -34
- package/build/swift-ui/modifiers/index.d.ts.map +1 -1
- package/build/swift-ui/modifiers/presentationModifiers.d.ts +3 -2
- package/build/swift-ui/modifiers/presentationModifiers.d.ts.map +1 -1
- package/build/swift-ui/modifiers/shapeStyle.d.ts +54 -0
- package/build/swift-ui/modifiers/shapeStyle.d.ts.map +1 -0
- package/build/universal/BottomSheet/index.android.d.ts +1 -1
- package/build/universal/BottomSheet/index.android.d.ts.map +1 -1
- package/build/universal/BottomSheet/index.d.ts +1 -1
- package/build/universal/BottomSheet/index.d.ts.map +1 -1
- package/build/universal/BottomSheet/index.ios.d.ts +1 -1
- package/build/universal/BottomSheet/index.ios.d.ts.map +1 -1
- package/build/universal/BottomSheet/types.d.ts +20 -0
- package/build/universal/BottomSheet/types.d.ts.map +1 -1
- package/build/universal/ListItem/ListItem.android.d.ts.map +1 -1
- package/build/universal/ListItem/types.d.ts +19 -0
- package/build/universal/ListItem/types.d.ts.map +1 -1
- package/build/universal/RNHostView/index.android.d.ts +1 -1
- package/build/universal/RNHostView/index.android.d.ts.map +1 -1
- package/build/universal/RNHostView/index.d.ts +1 -1
- package/build/universal/RNHostView/index.d.ts.map +1 -1
- package/build/universal/RNHostView/index.ios.d.ts +1 -1
- package/build/universal/RNHostView/index.ios.d.ts.map +1 -1
- package/build/universal/RNHostView/types.d.ts +2 -0
- package/build/universal/RNHostView/types.d.ts.map +1 -1
- package/build/utils/useMergeRefs.d.ts +12 -0
- package/build/utils/useMergeRefs.d.ts.map +1 -0
- package/expo-module.config.json +1 -1
- package/ios/BackgroundView.swift +34 -0
- package/ios/ColorPickerView.swift +1 -1
- package/ios/Convertibles/ShapeStyleValue.swift +129 -0
- package/ios/ExpoUIModule.swift +4 -0
- package/ios/HostView.swift +7 -0
- package/ios/Modifiers/ForegroundStyleModifier.swift +12 -105
- package/ios/Modifiers/ViewModifierRegistry.swift +29 -5
- package/ios/RNHostView.swift +64 -4
- package/local-maven-repo/expo/modules/ui/expo.modules.ui/{57.0.13/expo.modules.ui-57.0.13-sources.jar → 57.0.15/expo.modules.ui-57.0.15-sources.jar} +0 -0
- package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.15/expo.modules.ui-57.0.15-sources.jar.md5 +1 -0
- package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.15/expo.modules.ui-57.0.15-sources.jar.sha1 +1 -0
- package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.15/expo.modules.ui-57.0.15-sources.jar.sha256 +1 -0
- package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.15/expo.modules.ui-57.0.15-sources.jar.sha512 +1 -0
- package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.15/expo.modules.ui-57.0.15.aar +0 -0
- package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.15/expo.modules.ui-57.0.15.aar.md5 +1 -0
- package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.15/expo.modules.ui-57.0.15.aar.sha1 +1 -0
- package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.15/expo.modules.ui-57.0.15.aar.sha256 +1 -0
- package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.15/expo.modules.ui-57.0.15.aar.sha512 +1 -0
- package/local-maven-repo/expo/modules/ui/expo.modules.ui/{57.0.13/expo.modules.ui-57.0.13.module → 57.0.15/expo.modules.ui-57.0.15.module} +22 -22
- package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.15/expo.modules.ui-57.0.15.module.md5 +1 -0
- package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.15/expo.modules.ui-57.0.15.module.sha1 +1 -0
- package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.15/expo.modules.ui-57.0.15.module.sha256 +1 -0
- package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.15/expo.modules.ui-57.0.15.module.sha512 +1 -0
- package/local-maven-repo/expo/modules/ui/expo.modules.ui/{57.0.13/expo.modules.ui-57.0.13.pom → 57.0.15/expo.modules.ui-57.0.15.pom} +1 -1
- package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.15/expo.modules.ui-57.0.15.pom.md5 +1 -0
- package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.15/expo.modules.ui-57.0.15.pom.sha1 +1 -0
- package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.15/expo.modules.ui-57.0.15.pom.sha256 +1 -0
- package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.15/expo.modules.ui-57.0.15.pom.sha512 +1 -0
- package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml +4 -4
- package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.md5 +1 -1
- package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.sha1 +1 -1
- package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.sha256 +1 -1
- package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.sha512 +1 -1
- package/package.json +4 -4
- package/src/PresentedContentContext.tsx +22 -0
- package/src/community/pager-view/PagerView.android.tsx +1 -7
- package/src/jetpack-compose/AlertDialog/index.tsx +6 -1
- package/src/jetpack-compose/BasicAlertDialog/index.tsx +7 -1
- package/src/jetpack-compose/DropdownMenu/index.tsx +7 -1
- package/src/jetpack-compose/ExposedDropdownMenuBox/ExposedDropdownMenu.tsx +3 -1
- package/src/jetpack-compose/Host/index.tsx +28 -17
- package/src/jetpack-compose/ModalBottomSheet/index.tsx +8 -1
- package/src/jetpack-compose/Progress/index.tsx +32 -2
- package/src/jetpack-compose/RNHostView/index.tsx +28 -13
- package/src/jetpack-compose/TextField/shared.ts +7 -1
- package/src/jetpack-compose/Tooltip/index.tsx +2 -1
- package/src/keyboard/index.tsx +243 -0
- package/src/keyboard/interop.ts +99 -0
- package/src/keyboard/textInputState.ts +2 -0
- package/src/keyboard/textInputState.web.ts +16 -0
- package/src/swift-ui/Background/index.tsx +38 -0
- package/src/swift-ui/BottomSheet/index.tsx +4 -1
- package/src/swift-ui/Host/index.tsx +33 -18
- package/src/swift-ui/Popover/index.tsx +7 -1
- package/src/swift-ui/RNHostView.tsx +20 -3
- package/src/swift-ui/SecureField/index.tsx +8 -2
- package/src/swift-ui/TextField/index.tsx +8 -1
- package/src/swift-ui/index.tsx +1 -0
- package/src/swift-ui/modifiers/index.ts +10 -39
- package/src/swift-ui/modifiers/presentationModifiers.ts +3 -2
- package/src/swift-ui/modifiers/shapeStyle.ts +55 -0
- package/src/ts-declarations/react-native-text-input-state.d.ts +26 -0
- package/src/universal/BottomSheet/index.android.tsx +4 -0
- package/src/universal/BottomSheet/index.ios.tsx +5 -0
- package/src/universal/BottomSheet/index.tsx +4 -0
- package/src/universal/BottomSheet/types.ts +22 -0
- package/src/universal/ListItem/ListItem.android.tsx +2 -1
- package/src/universal/ListItem/types.ts +21 -0
- package/src/universal/RNHostView/index.android.tsx +2 -1
- package/src/universal/RNHostView/index.ios.tsx +6 -2
- package/src/universal/RNHostView/index.tsx +2 -0
- package/src/universal/RNHostView/types.ts +3 -0
- package/src/utils/useMergeRefs.ts +47 -0
- package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.13/expo.modules.ui-57.0.13-sources.jar.md5 +0 -1
- package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.13/expo.modules.ui-57.0.13-sources.jar.sha1 +0 -1
- package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.13/expo.modules.ui-57.0.13-sources.jar.sha256 +0 -1
- package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.13/expo.modules.ui-57.0.13-sources.jar.sha512 +0 -1
- package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.13/expo.modules.ui-57.0.13.aar +0 -0
- package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.13/expo.modules.ui-57.0.13.aar.md5 +0 -1
- package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.13/expo.modules.ui-57.0.13.aar.sha1 +0 -1
- package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.13/expo.modules.ui-57.0.13.aar.sha256 +0 -1
- package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.13/expo.modules.ui-57.0.13.aar.sha512 +0 -1
- package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.13/expo.modules.ui-57.0.13.module.md5 +0 -1
- package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.13/expo.modules.ui-57.0.13.module.sha1 +0 -1
- package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.13/expo.modules.ui-57.0.13.module.sha256 +0 -1
- package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.13/expo.modules.ui-57.0.13.module.sha512 +0 -1
- package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.13/expo.modules.ui-57.0.13.pom.md5 +0 -1
- package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.13/expo.modules.ui-57.0.13.pom.sha1 +0 -1
- package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.13/expo.modules.ui-57.0.13.pom.sha256 +0 -1
- package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.13/expo.modules.ui-57.0.13.pom.sha512 +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -10,6 +10,40 @@
|
|
|
10
10
|
|
|
11
11
|
### 💡 Others
|
|
12
12
|
|
|
13
|
+
## 57.0.15 — 2026-09-01
|
|
14
|
+
|
|
15
|
+
### 🎉 New features
|
|
16
|
+
|
|
17
|
+
- [universal] Added `containerColor` and `contentColor` props to `BottomSheet`, and a `colors` prop to `ListItem`, so a sheet's chrome and its rows can be recolored to match an app's own theme instead of always using each platform's opaque default. Forwards to capabilities the `jetpack-compose` and `swift-ui` layers already expose (`ModalBottomSheet.containerColor`/`contentColor`, `presentationBackground`, `ListItem.colors`) without changing default behavior when omitted. ([#49575](https://github.com/expo/expo/pull/49575) by [@timheilman](https://github.com/timheilman))
|
|
18
|
+
- [iOS] Added the `ShapeStyle` type, shared by the modifiers that paint an area, and taught `foregroundStyle` to accept materials (`ultraThin`, `thin`, `regular`, `thick`, `ultraThick` and `bar`). ([#48905](https://github.com/expo/expo/pull/48905) by [@Den1Marshall](https://github.com/Den1Marshall))
|
|
19
|
+
|
|
20
|
+
### 🐛 Bug fixes
|
|
21
|
+
|
|
22
|
+
- [iOS][Android] Fixed a `matchContents` `RNHostView` inside a `matchContents` `Host` growing the layout on every pass. ([#49483](https://github.com/expo/expo/pull/49483) by [@intergalacticspacehighway](https://github.com/intergalacticspacehighway))
|
|
23
|
+
- [iOS] Fix modifier application rebuilding a fresh `AnyViewModifier` every body evaluation, which defeated AttributeGraph subtree pruning during scroll. ([#48426](https://github.com/expo/expo/pull/48426) by [@wielski](https://github.com/wielski))
|
|
24
|
+
- [Android] Fix a drag that starts on a hosted `TextInput` not scrolling the `ScrollView` around it. React Native's text input asks its ancestors not to intercept the gesture, then releases them one move later, and Jetpack Compose read that release as "Compose claimed the gesture" and cancelled the hosted subtree. `RNHostView` no longer passes such a release on to Compose. ([#49510](https://github.com/expo/expo/issues/49510) by [@kilarsky](https://github.com/kilarsky)) ([#49520](https://github.com/expo/expo/pull/49520) by [@expo-tuft[bot]](https://github.com/apps/expo-tuft))
|
|
25
|
+
|
|
26
|
+
## 57.0.14 — 2026-08-26
|
|
27
|
+
|
|
28
|
+
### 🛠 Breaking changes
|
|
29
|
+
|
|
30
|
+
- [Android] Removed the `style` prop from `RNHostView`. It set a React Native style on a view that Jetpack Compose positions and sizes; use `modifiers` instead. Hosted views are now measured where Compose drew them, so a style is no longer needed to keep `measure()` and the drawn position in agreement. ([#48970](https://github.com/expo/expo/pull/48970) by [@nishan](https://github.com/intergalacticspacehighway))
|
|
31
|
+
|
|
32
|
+
### 🎉 New features
|
|
33
|
+
|
|
34
|
+
- [iOS] Added the `Background` component, which draws any view behind another view with an optional `alignment`, matching SwiftUI's `background(alignment:content:)`. ([#48904](https://github.com/expo/expo/pull/48904) by [@Den1Marshall](https://github.com/Den1Marshall))
|
|
35
|
+
- [android] Added the `amplitude`, `wavelength` and `waveSpeed` props to `LinearWavyProgressIndicator` and `CircularWavyProgressIndicator`, so the Material 3 wave can be configured instead of always using the Compose defaults. ([#49265](https://github.com/expo/expo/pull/49265) by [@felipe-software](https://github.com/felipe-software))
|
|
36
|
+
|
|
37
|
+
### 🐛 Bug fixes
|
|
38
|
+
|
|
39
|
+
- [iOS] Fixed a crash when a focused `TextField` or `SecureField` is unmounted inside a list row that is being removed, for example closing a modal with the keyboard up on a field nested in `SwipeActions`. Hosted text inputs now blur before React removes their native views. ([#49348](https://github.com/expo/expo/issues/49348) by [@nishan](https://github.com/intergalacticspacehighway)) ([#49357](https://github.com/expo/expo/pull/49357) by [@expo-tuft[bot]](https://github.com/apps/expo-tuft))
|
|
40
|
+
- Fixed the keyboard staying open when tapping outside a text field hosted by `<Host>`. A parent `ScrollView`'s tap-to-dismiss, its `keyboardShouldPersistTaps` setting, and `Keyboard.dismiss()` now reach hosted text fields. React Native treats the whole `<Host>` as the input, so a tap on other content inside the same host still keeps the keyboard open. ([#48788](https://github.com/expo/expo/pull/48788) by [@intergalacticspacehighway](https://github.com/intergalacticspacehighway))
|
|
41
|
+
- [iOS] Fix a hosted `Pressable` dropping its press when the finger moves, by measuring hosted React Native views where SwiftUI placed them. ([#48969](https://github.com/expo/expo/pull/48969) by [@nishan](https://github.com/intergalacticspacehighway))
|
|
42
|
+
- [iOS] Fix hosted React Native views receiving no touches inside a `BottomSheet` or `Popover`. ([#48969](https://github.com/expo/expo/pull/48969) by [@nishan](https://github.com/intergalacticspacehighway))
|
|
43
|
+
- [Android] Fix touch handling for hosted React Native views: a `Pressable` dropped its press when the finger moved, hosted content stole gestures from enclosing scrollables, a back gesture was reported as a long press, a press fired after a Jetpack Compose pager or scrollable had already claimed the gesture, and content inside `AlertDialog`, `DropdownMenu`, `ExposedDropdownMenu` and `TooltipBox` received no touches at all. Hosted views are now measured where Jetpack Compose placed them, and dispatch their own touches only when presented in their own window. ([#48970](https://github.com/expo/expo/pull/48970) by [@nishan](https://github.com/intergalacticspacehighway))
|
|
44
|
+
- [Android] Fix a hosted `Pressable` in a `PagerView` ignoring presses on pages after the first, where a re-parented host kept the bounds of the holder it left and answered for a screen area it no longer occupied. ([#46386](https://github.com/expo/expo/issues/46386) by [@TomCorvus](https://github.com/TomCorvus)) ([#48970](https://github.com/expo/expo/pull/48970) by [@nishan](https://github.com/intergalacticspacehighway))
|
|
45
|
+
- [iOS] Fix `ColorPicker` reporting every color one value too low, because `colorToHex` truncated instead of rounding. Apps feed the reported value back into `selection`, so the error compounded and each interaction moved all three channels down by one. ([#49356](https://github.com/expo/expo/pull/49356) by [@batuhandemir98](https://github.com/batuhandemir98))
|
|
46
|
+
|
|
13
47
|
## 57.0.13 — 2026-08-24
|
|
14
48
|
|
|
15
49
|
### 🎉 New features
|
package/android/build.gradle
CHANGED
|
@@ -12,13 +12,13 @@ apply plugin: 'expo-module-gradle-plugin'
|
|
|
12
12
|
apply plugin: 'org.jetbrains.kotlin.plugin.compose'
|
|
13
13
|
|
|
14
14
|
group = 'expo.modules.ui'
|
|
15
|
-
version = '57.0.
|
|
15
|
+
version = '57.0.15'
|
|
16
16
|
|
|
17
17
|
android {
|
|
18
18
|
namespace "expo.modules.ui"
|
|
19
19
|
defaultConfig {
|
|
20
20
|
versionCode 1
|
|
21
|
-
versionName "57.0.
|
|
21
|
+
versionName "57.0.15"
|
|
22
22
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
|
23
23
|
}
|
|
24
24
|
buildFeatures {
|
|
@@ -35,6 +35,7 @@ import expo.modules.ui.menu.DropdownMenuContent
|
|
|
35
35
|
import expo.modules.ui.menu.DropdownMenuProps
|
|
36
36
|
import expo.modules.ui.menu.DropdownMenuItemContent
|
|
37
37
|
import expo.modules.ui.menu.DropdownMenuItemProps
|
|
38
|
+
import expo.modules.kotlin.jni.fabric.NativeStatePropsGetter
|
|
38
39
|
import expo.modules.kotlin.jni.worklets.Worklet
|
|
39
40
|
import expo.modules.ui.state.ObservableState
|
|
40
41
|
import expo.modules.ui.state.WorkletCallback
|
|
@@ -72,6 +73,11 @@ class ExpoUIModule : Module() {
|
|
|
72
73
|
}
|
|
73
74
|
|
|
74
75
|
OnDestroy {
|
|
76
|
+
// `RNHostView` publishes its content origin into a process-global registry keyed by view tag.
|
|
77
|
+
// Tags restart in the next app context, so an entry whose view was never torn down would be
|
|
78
|
+
// read by an unrelated view after a reload.
|
|
79
|
+
NativeStatePropsGetter().clearAllContentOrigins()
|
|
80
|
+
|
|
75
81
|
imageLoader?.close()
|
|
76
82
|
imageLoader = null
|
|
77
83
|
okHttpClient?.dispatcher?.executorService?.shutdown()
|
|
@@ -173,9 +179,17 @@ class ExpoUIModule : Module() {
|
|
|
173
179
|
}
|
|
174
180
|
|
|
175
181
|
View(RNHostView::class) {
|
|
176
|
-
//
|
|
177
|
-
// `RootNodeKind` trait
|
|
178
|
-
|
|
182
|
+
// Also consumed by `ExpoViewShadowNode` in C++, which marks the shadow node with the
|
|
183
|
+
// `RootNodeKind` trait so `measure()` reports positions relative to this view. Kotlin reads
|
|
184
|
+
// the same prop to decide whether this view dispatches its subtree's touches, so the
|
|
185
|
+
// position in `measure()` and the dispatcher can never disagree.
|
|
186
|
+
Prop("layoutRoot") { view: RNHostView, layoutRoot: Boolean ->
|
|
187
|
+
view.setLayoutRoot(layoutRoot)
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
OnViewDestroys { view: RNHostView ->
|
|
191
|
+
view.clearPublishedContentOrigin()
|
|
192
|
+
}
|
|
179
193
|
}
|
|
180
194
|
|
|
181
195
|
View(SlotView::class) {
|
|
@@ -150,6 +150,9 @@ data class LinearWavyProgressIndicatorProps(
|
|
|
150
150
|
val color: Color? = null,
|
|
151
151
|
val trackColor: Color? = null,
|
|
152
152
|
val stopSize: Float? = null,
|
|
153
|
+
val amplitude: Float? = null,
|
|
154
|
+
val wavelength: Float? = null,
|
|
155
|
+
val waveSpeed: Float? = null,
|
|
153
156
|
val modifiers: ModifierList = emptyList()
|
|
154
157
|
) : ComposeProps
|
|
155
158
|
|
|
@@ -161,17 +164,27 @@ fun FunctionalComposableScope.LinearWavyProgressIndicatorContent(props: LinearWa
|
|
|
161
164
|
val stopSize = props.stopSize?.dp ?: WavyProgressIndicatorDefaults.LinearTrackStopIndicatorSize
|
|
162
165
|
|
|
163
166
|
if (props.progress != null) {
|
|
167
|
+
val wavelength = props.wavelength?.dp ?: WavyProgressIndicatorDefaults.LinearDeterminateWavelength
|
|
168
|
+
|
|
164
169
|
LinearWavyProgressIndicator(
|
|
165
170
|
progress = { props.progress },
|
|
166
171
|
color = color,
|
|
167
172
|
trackColor = trackColor,
|
|
168
173
|
stopSize = stopSize,
|
|
174
|
+
amplitude = props.amplitude.toAmplitude(),
|
|
175
|
+
wavelength = wavelength,
|
|
176
|
+
waveSpeed = props.waveSpeed?.dp ?: wavelength,
|
|
169
177
|
modifier = modifier
|
|
170
178
|
)
|
|
171
179
|
} else {
|
|
180
|
+
val wavelength = props.wavelength?.dp ?: WavyProgressIndicatorDefaults.LinearIndeterminateWavelength
|
|
181
|
+
|
|
172
182
|
LinearWavyProgressIndicator(
|
|
173
183
|
color = color,
|
|
174
184
|
trackColor = trackColor,
|
|
185
|
+
amplitude = props.amplitude ?: IndeterminateAmplitude,
|
|
186
|
+
wavelength = wavelength,
|
|
187
|
+
waveSpeed = props.waveSpeed?.dp ?: wavelength,
|
|
175
188
|
modifier = modifier
|
|
176
189
|
)
|
|
177
190
|
}
|
|
@@ -186,6 +199,9 @@ data class CircularWavyProgressIndicatorProps(
|
|
|
186
199
|
val progress: Float? = null,
|
|
187
200
|
val color: Color? = null,
|
|
188
201
|
val trackColor: Color? = null,
|
|
202
|
+
val amplitude: Float? = null,
|
|
203
|
+
val wavelength: Float? = null,
|
|
204
|
+
val waveSpeed: Float? = null,
|
|
189
205
|
val modifiers: ModifierList = emptyList()
|
|
190
206
|
) : ComposeProps
|
|
191
207
|
|
|
@@ -193,6 +209,8 @@ data class CircularWavyProgressIndicatorProps(
|
|
|
193
209
|
fun FunctionalComposableScope.CircularWavyProgressIndicatorContent(props: CircularWavyProgressIndicatorProps) {
|
|
194
210
|
val modifier = ModifierRegistry.applyModifiers(props.modifiers, appContext, composableScope, globalEventDispatcher)
|
|
195
211
|
val color = props.color.composeOrNull ?: ProgressIndicatorDefaults.circularColor
|
|
212
|
+
val wavelength = props.wavelength?.dp ?: WavyProgressIndicatorDefaults.CircularWavelength
|
|
213
|
+
val waveSpeed = props.waveSpeed?.dp ?: wavelength
|
|
196
214
|
|
|
197
215
|
if (props.progress != null) {
|
|
198
216
|
val trackColor = props.trackColor.composeOrNull ?: ProgressIndicatorDefaults.circularDeterminateTrackColor
|
|
@@ -201,6 +219,9 @@ fun FunctionalComposableScope.CircularWavyProgressIndicatorContent(props: Circul
|
|
|
201
219
|
progress = { props.progress },
|
|
202
220
|
color = color,
|
|
203
221
|
trackColor = trackColor,
|
|
222
|
+
amplitude = props.amplitude.toAmplitude(),
|
|
223
|
+
wavelength = wavelength,
|
|
224
|
+
waveSpeed = waveSpeed,
|
|
204
225
|
modifier = modifier
|
|
205
226
|
)
|
|
206
227
|
} else {
|
|
@@ -209,6 +230,9 @@ fun FunctionalComposableScope.CircularWavyProgressIndicatorContent(props: Circul
|
|
|
209
230
|
CircularWavyProgressIndicator(
|
|
210
231
|
color = color,
|
|
211
232
|
trackColor = trackColor,
|
|
233
|
+
amplitude = props.amplitude ?: IndeterminateAmplitude,
|
|
234
|
+
wavelength = wavelength,
|
|
235
|
+
waveSpeed = waveSpeed,
|
|
212
236
|
modifier = modifier
|
|
213
237
|
)
|
|
214
238
|
}
|
|
@@ -218,6 +242,13 @@ fun FunctionalComposableScope.CircularWavyProgressIndicatorContent(props: Circul
|
|
|
218
242
|
|
|
219
243
|
// Utility
|
|
220
244
|
|
|
245
|
+
private const val IndeterminateAmplitude = 1f
|
|
246
|
+
|
|
247
|
+
private fun Float?.toAmplitude(): (Float) -> Float {
|
|
248
|
+
val amplitude = this ?: return WavyProgressIndicatorDefaults.indicatorAmplitude
|
|
249
|
+
return { amplitude }
|
|
250
|
+
}
|
|
251
|
+
|
|
221
252
|
private fun String?.toStrokeCap(): StrokeCap? {
|
|
222
253
|
return when (this?.lowercase()) {
|
|
223
254
|
"round" -> StrokeCap.Round
|
|
@@ -14,7 +14,9 @@ import androidx.compose.runtime.Composable
|
|
|
14
14
|
import androidx.compose.runtime.MutableState
|
|
15
15
|
import androidx.compose.runtime.mutableStateOf
|
|
16
16
|
import androidx.compose.ui.Modifier
|
|
17
|
+
import androidx.compose.ui.layout.onGloballyPositioned
|
|
17
18
|
import androidx.compose.ui.layout.onSizeChanged
|
|
19
|
+
import androidx.compose.ui.layout.positionInRoot
|
|
18
20
|
import androidx.compose.ui.platform.LocalDensity
|
|
19
21
|
import androidx.compose.ui.unit.IntSize
|
|
20
22
|
import androidx.compose.ui.viewinterop.AndroidView
|
|
@@ -39,6 +41,8 @@ import expo.modules.kotlin.views.OptimizedComposeProps
|
|
|
39
41
|
@OptimizedComposeProps
|
|
40
42
|
internal data class RNHostViewProps(
|
|
41
43
|
val matchContents: MutableState<Boolean?> = mutableStateOf(null),
|
|
44
|
+
// Adds LeafNode and MeasurableYogaNode trait in Shadow node
|
|
45
|
+
val expoInternalSizeFromChildren: MutableState<Boolean?> = mutableStateOf(null),
|
|
42
46
|
val modifiers: ModifierList = emptyList()
|
|
43
47
|
) : ComposeProps
|
|
44
48
|
|
|
@@ -54,6 +58,31 @@ internal class RNHostView(context: Context, appContext: AppContext) :
|
|
|
54
58
|
private val childViewState = mutableStateOf<View?>(null)
|
|
55
59
|
private val wrapperState = mutableStateOf<TouchDispatchingRootViewGroup?>(null)
|
|
56
60
|
|
|
61
|
+
/**
|
|
62
|
+
* Whether this view owns its subtree's touches. False everywhere except content presented in its
|
|
63
|
+
* own window, where no React root sits above us to dispatch.
|
|
64
|
+
*
|
|
65
|
+
* Snapshot state because `publishContentOriginModifier` reads it during composition, and the prop
|
|
66
|
+
* can arrive after the first composition. A plain field would leave that composition publishing an
|
|
67
|
+
* origin from a coordinate space this view no longer measures from.
|
|
68
|
+
*/
|
|
69
|
+
private val layoutRootState = mutableStateOf(false)
|
|
70
|
+
private val layoutRoot: Boolean
|
|
71
|
+
get() = layoutRootState.value
|
|
72
|
+
|
|
73
|
+
private var lastContentOriginX = Double.NaN
|
|
74
|
+
private var lastContentOriginY = Double.NaN
|
|
75
|
+
|
|
76
|
+
internal fun setLayoutRoot(value: Boolean) {
|
|
77
|
+
val changed = layoutRootState.value != value
|
|
78
|
+
layoutRootState.value = value
|
|
79
|
+
wrapperState.value?.dispatchesTouchesToJS = value
|
|
80
|
+
if (changed && value) {
|
|
81
|
+
// As a layout root this view stops publishing an origin, so drop the one it already published.
|
|
82
|
+
clearPublishedContentOrigin()
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
57
86
|
private val childSizeState = mutableStateOf(IntSize.Zero)
|
|
58
87
|
private val childLayoutListener = View.OnLayoutChangeListener { _, l, t, r, b, _, _, _, _ ->
|
|
59
88
|
childSizeState.value = IntSize(r - l, b - t)
|
|
@@ -68,6 +97,7 @@ internal class RNHostView(context: Context, appContext: AppContext) :
|
|
|
68
97
|
}
|
|
69
98
|
child.addOnLayoutChangeListener(childLayoutListener)
|
|
70
99
|
val wrapper = TouchDispatchingRootViewGroup(child.context).apply {
|
|
100
|
+
dispatchesTouchesToJS = layoutRoot
|
|
71
101
|
val reactContext = child.context as? ReactContext
|
|
72
102
|
if (reactContext != null) {
|
|
73
103
|
eventDispatcher = UIManagerHelper.getEventDispatcherForReactTag(reactContext, child.id)
|
|
@@ -83,6 +113,7 @@ internal class RNHostView(context: Context, appContext: AppContext) :
|
|
|
83
113
|
if (view == childViewState.value) {
|
|
84
114
|
view.removeOnLayoutChangeListener(childLayoutListener)
|
|
85
115
|
wrapperState.value?.removeView(view)
|
|
116
|
+
clearPublishedContentOrigin()
|
|
86
117
|
childViewState.value = null
|
|
87
118
|
wrapperState.value = null
|
|
88
119
|
} else {
|
|
@@ -95,10 +126,22 @@ internal class RNHostView(context: Context, appContext: AppContext) :
|
|
|
95
126
|
child.removeOnLayoutChangeListener(childLayoutListener)
|
|
96
127
|
wrapperState.value?.removeView(child)
|
|
97
128
|
}
|
|
129
|
+
clearPublishedContentOrigin()
|
|
98
130
|
childViewState.value = null
|
|
99
131
|
wrapperState.value = null
|
|
100
132
|
}
|
|
101
133
|
|
|
134
|
+
/**
|
|
135
|
+
* The removal paths above do not run when React unmounts this view with its child still attached,
|
|
136
|
+
* so the module also calls this when the view is destroyed in OnViewDestroys. Without it the entry would stay in the
|
|
137
|
+
* process-global registry
|
|
138
|
+
*/
|
|
139
|
+
internal fun clearPublishedContentOrigin() {
|
|
140
|
+
lastContentOriginX = Double.NaN
|
|
141
|
+
lastContentOriginY = Double.NaN
|
|
142
|
+
shadowNodeProxy.clearContentOrigin()
|
|
143
|
+
}
|
|
144
|
+
|
|
102
145
|
@Composable
|
|
103
146
|
override fun ComposableScope.Content() {
|
|
104
147
|
val matchContents = props.matchContents.value ?: false
|
|
@@ -113,12 +156,15 @@ internal class RNHostView(context: Context, appContext: AppContext) :
|
|
|
113
156
|
.fillMaxSize()
|
|
114
157
|
.then(reportSizeToYogaNodeModifier())
|
|
115
158
|
}
|
|
159
|
+
// Origin last: a chain applies outside-in, so a caller `padding` or `offset` has to shift the
|
|
160
|
+
// content before it is read.
|
|
116
161
|
val modifiers = sizingModifier
|
|
117
162
|
.then(ModifierRegistry.applyModifiers(props.modifiers, appContext, scope, globalEventDispatcher))
|
|
163
|
+
.then(publishContentOriginModifier())
|
|
118
164
|
|
|
119
165
|
AndroidView(
|
|
120
166
|
factory = {
|
|
121
|
-
(wrapper
|
|
167
|
+
detachForReuse(wrapper)
|
|
122
168
|
wrapper
|
|
123
169
|
},
|
|
124
170
|
modifier = modifiers
|
|
@@ -144,6 +190,32 @@ internal class RNHostView(context: Context, appContext: AppContext) :
|
|
|
144
190
|
}
|
|
145
191
|
}
|
|
146
192
|
|
|
193
|
+
/**
|
|
194
|
+
* Publishes where Compose placed this view inside its `Host`, which Yoga has no way to know:
|
|
195
|
+
* Yoga puts the box at the `Host`'s origin while Compose may draw it anywhere inside. Without
|
|
196
|
+
* this, `measure()` reports the Yoga box, this makes Pressable cancel its press when the finger moves.
|
|
197
|
+
*/
|
|
198
|
+
@Composable
|
|
199
|
+
private fun publishContentOriginModifier(): Modifier {
|
|
200
|
+
// When layoutRoot is true, we don't set content origin because view acts like root and measure uses the view's origin as the origin.
|
|
201
|
+
if (layoutRoot) {
|
|
202
|
+
return Modifier
|
|
203
|
+
}
|
|
204
|
+
val density = LocalDensity.current
|
|
205
|
+
return Modifier.onGloballyPositioned { coordinates ->
|
|
206
|
+
val position = coordinates.positionInRoot()
|
|
207
|
+
with(density) {
|
|
208
|
+
val x = position.x.toDp().value.toDouble()
|
|
209
|
+
val y = position.y.toDp().value.toDouble()
|
|
210
|
+
if (x != lastContentOriginX || y != lastContentOriginY) {
|
|
211
|
+
lastContentOriginX = x
|
|
212
|
+
lastContentOriginY = y
|
|
213
|
+
shadowNodeProxy.setContentOrigin(x, y)
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
147
219
|
// Sets Yoga node size from Compose view size
|
|
148
220
|
// Listens Compose view size changes and updates the Yoga node size
|
|
149
221
|
@Composable
|
|
@@ -160,6 +232,21 @@ internal class RNHostView(context: Context, appContext: AppContext) :
|
|
|
160
232
|
}
|
|
161
233
|
}
|
|
162
234
|
|
|
235
|
+
/**
|
|
236
|
+
* Removes [wrapper] from the view that currently contains it, and clears its bounds.
|
|
237
|
+
*
|
|
238
|
+
* `AndroidView` hands back this same wrapper every time Compose rebuilds it, but Compose puts it
|
|
239
|
+
* inside a brand new container each time, so it has to leave the old one first. A removed view keeps
|
|
240
|
+
* the bounds that container gave it, and React Native finds touch targets by bounds — so until
|
|
241
|
+
* Compose lays the wrapper out again it would claim a screen area it no longer occupies and swallow
|
|
242
|
+
* presses meant for whatever is really there. Clearing the bounds keeps it out of the way.
|
|
243
|
+
* This causes https://github.com/expo/expo/issues/46386
|
|
244
|
+
*/
|
|
245
|
+
internal fun detachForReuse(wrapper: View) {
|
|
246
|
+
(wrapper.parent as? ViewGroup)?.removeView(wrapper)
|
|
247
|
+
wrapper.layout(0, 0, 0, 0)
|
|
248
|
+
}
|
|
249
|
+
|
|
163
250
|
/**
|
|
164
251
|
* A thin FrameLayout that intercepts touch events and dispatches them to JS via
|
|
165
252
|
* JSTouchDispatcher/JSPointerDispatcher, replicating the pattern from React Native's
|
|
@@ -185,11 +272,26 @@ private class TouchDispatchingRootViewGroup(
|
|
|
185
272
|
// True if the sheet consumed scroll on the most recent drag frame; drives the settle decision.
|
|
186
273
|
private var sheetMovingOnLastDragFrame = false
|
|
187
274
|
|
|
275
|
+
// True once a descendant asked us to stop ancestors from intercepting this gesture, so a later
|
|
276
|
+
// release from a different descendant doesn't reach Compose. See requestDisallowInterceptTouchEvent.
|
|
277
|
+
private var forwardedDisallowIntercept = false
|
|
278
|
+
|
|
188
279
|
// True once a fling was dispatched this gesture, so the gentle-release settle doesn't double-fire.
|
|
189
280
|
private var flingHandledThisGesture = false
|
|
190
281
|
|
|
191
282
|
var eventDispatcher: EventDispatcher? = null
|
|
192
283
|
|
|
284
|
+
/**
|
|
285
|
+
* Whether this view streams its subtree's touches to JavaScript.
|
|
286
|
+
*
|
|
287
|
+
* When false, an ancestor React root is already streaming them, and dispatching a second time
|
|
288
|
+
* would produce two streams in two coordinate spaces — the ancestor's moves land outside the
|
|
289
|
+
* host-relative responder region and `Pressable` drops the press on the first movement. The
|
|
290
|
+
* nested-scroll cooperation below stays active either way; only the JavaScript dispatch and the
|
|
291
|
+
* ancestor suppression are conditional.
|
|
292
|
+
*/
|
|
293
|
+
var dispatchesTouchesToJS: Boolean = false
|
|
294
|
+
|
|
193
295
|
private val reactContext: ThemedReactContext
|
|
194
296
|
get() = context as ThemedReactContext
|
|
195
297
|
|
|
@@ -215,17 +317,32 @@ private class TouchDispatchingRootViewGroup(
|
|
|
215
317
|
}
|
|
216
318
|
|
|
217
319
|
override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
|
|
320
|
+
if (ev.actionMasked == MotionEvent.ACTION_CANCEL && !dispatchesTouchesToJS) {
|
|
321
|
+
// Compose cancels this subtree when a gesture detector above it claims the gesture. The
|
|
322
|
+
// ancestor root, which dispatches this subtree's touches, keeps streaming moves, so a
|
|
323
|
+
// `Pressable` still fires on release. Tell it a native child took over.
|
|
324
|
+
//
|
|
325
|
+
// No child: the gesture is gone from here, so no end call follows, and naming one would leave
|
|
326
|
+
// the root's pointer dispatcher armed for good. Its pointer stream stays live as a result.
|
|
327
|
+
notifyAncestorRootViews { it.onChildStartedNativeGesture(null, ev) }
|
|
328
|
+
}
|
|
218
329
|
if (ev.actionMasked == MotionEvent.ACTION_DOWN) {
|
|
219
330
|
// Ancestor React roots (the surface root, outer hosts) also see this gesture and dispatch a
|
|
220
331
|
// duplicate JS touch stream in their own coordinate space. Their moves land outside the
|
|
221
332
|
// host-relative responder region and break `Pressable`. Tell them a native child owns the
|
|
222
333
|
// gesture, before dispatching our own start, so their stream ends ahead of it.
|
|
223
|
-
|
|
334
|
+
//
|
|
335
|
+
// Only when we are the one dispatching. Otherwise their stream is the only one there is, and
|
|
336
|
+
// suppressing it would leave this subtree with no touches at all.
|
|
337
|
+
if (dispatchesTouchesToJS) {
|
|
338
|
+
notifyAncestorRootViews { it.onChildStartedNativeGesture(this, ev) }
|
|
339
|
+
}
|
|
224
340
|
// dispatchTouchEvent is the true start of every gesture, so reset all per-gesture state here.
|
|
225
341
|
getLocationInWindow(gestureStartLocation)
|
|
226
342
|
trackingGestureOffset = true
|
|
227
343
|
sheetMovingOnLastDragFrame = false
|
|
228
344
|
flingHandledThisGesture = false
|
|
345
|
+
forwardedDisallowIntercept = false
|
|
229
346
|
}
|
|
230
347
|
|
|
231
348
|
// While a nested scroll is in flight the sheet may be sliding this whole view up/down. Re-express
|
|
@@ -247,7 +364,9 @@ private class TouchDispatchingRootViewGroup(
|
|
|
247
364
|
|
|
248
365
|
if (ev.actionMasked == MotionEvent.ACTION_UP || ev.actionMasked == MotionEvent.ACTION_CANCEL) {
|
|
249
366
|
trackingGestureOffset = false
|
|
250
|
-
|
|
367
|
+
if (dispatchesTouchesToJS) {
|
|
368
|
+
notifyAncestorRootViews { it.onChildEndedNativeGesture(this, ev) }
|
|
369
|
+
}
|
|
251
370
|
}
|
|
252
371
|
return handled
|
|
253
372
|
}
|
|
@@ -261,35 +380,49 @@ private class TouchDispatchingRootViewGroup(
|
|
|
261
380
|
}
|
|
262
381
|
|
|
263
382
|
override fun onInterceptTouchEvent(event: MotionEvent): Boolean {
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
383
|
+
if (dispatchesTouchesToJS) {
|
|
384
|
+
eventDispatcher?.let { dispatcher ->
|
|
385
|
+
jsTouchDispatcher.handleTouchEvent(event, dispatcher, reactContext)
|
|
386
|
+
jsPointerDispatcher?.handleMotionEvent(event, dispatcher, true)
|
|
387
|
+
}
|
|
267
388
|
}
|
|
268
389
|
return super.onInterceptTouchEvent(event)
|
|
269
390
|
}
|
|
270
391
|
|
|
271
392
|
@SuppressLint("ClickableViewAccessibility")
|
|
272
393
|
override fun onTouchEvent(event: MotionEvent): Boolean {
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
394
|
+
if (dispatchesTouchesToJS) {
|
|
395
|
+
eventDispatcher?.let { dispatcher ->
|
|
396
|
+
jsTouchDispatcher.handleTouchEvent(event, dispatcher, reactContext)
|
|
397
|
+
jsPointerDispatcher?.handleMotionEvent(event, dispatcher, false)
|
|
398
|
+
}
|
|
276
399
|
}
|
|
277
400
|
super.onTouchEvent(event)
|
|
278
401
|
return true
|
|
279
402
|
}
|
|
280
403
|
|
|
281
404
|
override fun onInterceptHoverEvent(event: MotionEvent): Boolean {
|
|
282
|
-
|
|
405
|
+
if (dispatchesTouchesToJS) {
|
|
406
|
+
eventDispatcher?.let { jsPointerDispatcher?.handleMotionEvent(event, it, true) }
|
|
407
|
+
}
|
|
283
408
|
return super.onInterceptHoverEvent(event)
|
|
284
409
|
}
|
|
285
410
|
|
|
286
411
|
override fun onHoverEvent(event: MotionEvent): Boolean {
|
|
287
|
-
|
|
412
|
+
if (dispatchesTouchesToJS) {
|
|
413
|
+
eventDispatcher?.let { jsPointerDispatcher?.handleMotionEvent(event, it, false) }
|
|
414
|
+
}
|
|
288
415
|
return super.onHoverEvent(event)
|
|
289
416
|
}
|
|
290
417
|
|
|
291
418
|
@OptIn(UnstableReactNativeAPI::class)
|
|
292
419
|
override fun onChildStartedNativeGesture(childView: View?, ev: MotionEvent) {
|
|
420
|
+
if (!dispatchesTouchesToJS) {
|
|
421
|
+
// React Native notifies only the first RootView above the child, which is us. Relay it to the
|
|
422
|
+
// root that actually dispatches, or a Pressable inside a hosted scrollable fires after a scroll.
|
|
423
|
+
notifyAncestorRootViews { it.onChildStartedNativeGesture(childView, ev) }
|
|
424
|
+
return
|
|
425
|
+
}
|
|
293
426
|
eventDispatcher?.let { dispatcher ->
|
|
294
427
|
jsTouchDispatcher.onChildStartedNativeGesture(ev, dispatcher, reactContext)
|
|
295
428
|
jsPointerDispatcher?.onChildStartedNativeGesture(childView, ev, dispatcher)
|
|
@@ -297,6 +430,10 @@ private class TouchDispatchingRootViewGroup(
|
|
|
297
430
|
}
|
|
298
431
|
|
|
299
432
|
override fun onChildEndedNativeGesture(childView: View, ev: MotionEvent) {
|
|
433
|
+
if (!dispatchesTouchesToJS) {
|
|
434
|
+
notifyAncestorRootViews { it.onChildEndedNativeGesture(childView, ev) }
|
|
435
|
+
return
|
|
436
|
+
}
|
|
300
437
|
eventDispatcher?.let { jsTouchDispatcher.onChildEndedNativeGesture(ev, it) }
|
|
301
438
|
jsPointerDispatcher?.onChildEndedNativeGesture()
|
|
302
439
|
}
|
|
@@ -310,6 +447,19 @@ private class TouchDispatchingRootViewGroup(
|
|
|
310
447
|
// yields. But don't call super: setting our own FLAG_DISALLOW_INTERCEPT would skip
|
|
311
448
|
// onInterceptTouchEvent, which must keep firing to dispatch touches to JS (the reason #43716
|
|
312
449
|
// added this override).
|
|
450
|
+
//
|
|
451
|
+
// Never forward a release after a claim in the same gesture. Compose's `AndroidView` interop
|
|
452
|
+
// cancels this subtree when the flag goes true then false inside one move event: it dispatches
|
|
453
|
+
// the move and consumes it on the initial pass, then reads that same consumption on the final
|
|
454
|
+
// pass as "Compose claimed the gesture" and sends ACTION_CANCEL down here. `ReactEditText` makes
|
|
455
|
+
// exactly that flip — it claims on ACTION_DOWN and releases on the first ACTION_MOVE — so a drag
|
|
456
|
+
// that starts on a TextInput killed the hosted ScrollView. The release is meant for the React
|
|
457
|
+
// Native ancestors inside this wrapper, which still get it; Compose clears its own flag when the
|
|
458
|
+
// gesture ends.
|
|
459
|
+
if (!disallowIntercept && forwardedDisallowIntercept) {
|
|
460
|
+
return
|
|
461
|
+
}
|
|
462
|
+
forwardedDisallowIntercept = disallowIntercept
|
|
313
463
|
parent?.requestDisallowInterceptTouchEvent(disallowIntercept)
|
|
314
464
|
}
|
|
315
465
|
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
export declare const PresentedContentContext: import("react").Context<boolean>;
|
|
3
|
+
/**
|
|
4
|
+
* Whether the surrounding content is presented in its own view controller — a sheet, a popover
|
|
5
|
+
* — rather than in the React Native surface.
|
|
6
|
+
*
|
|
7
|
+
* `RNHostView` needs this because nothing above such content dispatches React Native touches: the
|
|
8
|
+
* surface root is not one of its ancestors. A hosted view there has to dispatch its own touches and
|
|
9
|
+
* be the origin its content is measured from, and both of those come from a single `layoutRoot`
|
|
10
|
+
* prop.
|
|
11
|
+
*
|
|
12
|
+
* Defaults to `false`, so content that is not wrapped keeps deferring to the surface root.
|
|
13
|
+
*/
|
|
14
|
+
export declare function useIsPresentedInOwnWindow(): boolean;
|
|
15
|
+
export declare function PresentedContent({ children }: {
|
|
16
|
+
children: ReactNode;
|
|
17
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
18
|
+
//# sourceMappingURL=PresentedContentContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PresentedContentContext.d.ts","sourceRoot":"","sources":["../src/PresentedContentContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAElE,eAAO,MAAM,uBAAuB,kCAAuB,CAAC;AAE5D;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,IAAI,OAAO,CAEnD;AAED,wBAAgB,gBAAgB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CAErE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PagerView.android.d.ts","sourceRoot":"","sources":["../../../src/community/pager-view/PagerView.android.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,SAAS,CAAC;AAO/D;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"PagerView.android.d.ts","sourceRoot":"","sources":["../../../src/community/pager-view/PagerView.android.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,SAAS,CAAC;AAO/D;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,2CAwH9C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/jetpack-compose/AlertDialog/index.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/jetpack-compose/AlertDialog/index.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAG/C,OAAO,EAAkB,KAAK,cAAc,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGzF;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B;;OAEG;IACH,cAAc,CAAC,EAAE,UAAU,CAAC;IAC5B;;OAEG;IACH,gBAAgB,CAAC,EAAE,UAAU,CAAC;IAC9B;;OAEG;IACH,iBAAiB,CAAC,EAAE,UAAU,CAAC;IAC/B;;OAEG;IACH,gBAAgB,CAAC,EAAE,UAAU,CAAC;CAC/B,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;OAEG;IACH,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B;;OAEG;IACH,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;IAC7B;;;OAGG;IACH,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AA2BD;;GAEG;AACH,iBAAS,gBAAgB,CAAC,KAAK,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,2CAE7D;AAED;;GAEG;AACH,iBAAS,eAAe,CAAC,KAAK,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,2CAE5D;AAED;;GAEG;AACH,iBAAS,wBAAwB,CAAC,KAAK,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,2CAErE;AAED;;GAEG;AACH,iBAAS,wBAAwB,CAAC,KAAK,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,2CAErE;AAED;;GAEG;AACH,iBAAS,eAAe,CAAC,KAAK,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,2CAE5D;AAED;;;;GAIG;AACH,iBAAS,oBAAoB,CAAC,KAAK,EAAE,gBAAgB,2CAOpD;kBAPQ,oBAAoB;;;;;;;AAe7B,OAAO,EAAE,oBAAoB,IAAI,WAAW,EAAE,CAAC;AAG/C,YAAY,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/jetpack-compose/BasicAlertDialog/index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/jetpack-compose/BasicAlertDialog/index.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAkB,KAAK,cAAc,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGzF,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B;;OAEG;IACH,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B;;OAEG;IACH,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;CAC9B;AAyBD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,2CAO5D;AAGD,YAAY,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/jetpack-compose/DropdownMenu/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/jetpack-compose/DropdownMenu/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAGrE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAclD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,QAAQ,EAAE,SAAS,CAAC;IAEpB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAE9B;;OAEG;IACH,KAAK,CAAC,EAAE,UAAU,CAAC;IAEnB;;OAEG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAE7B;;OAEG;IACH,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;CAC9B;AAWD;;;GAGG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CAOnD;yBAPe,KAAK;;;AAUrB;;GAEG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CAErD;yBAFe,OAAO;;;AAKvB;;GAEG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CAErD;AAED,iBAAS,YAAY,CAAC,KAAK,EAAE,iBAAiB,2CAW7C;kBAXQ,YAAY;;;;;AAiBrB,OAAO,EAAE,YAAY,EAAE,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExposedDropdownMenu.d.ts","sourceRoot":"","sources":["../../../src/jetpack-compose/ExposedDropdownMenuBox/ExposedDropdownMenu.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"ExposedDropdownMenu.d.ts","sourceRoot":"","sources":["../../../src/jetpack-compose/ExposedDropdownMenuBox/ExposedDropdownMenu.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAG/C,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAQlD;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,QAAQ,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B;;OAEG;IACH,cAAc,CAAC,EAAE,UAAU,CAAC;IAC5B;;OAEG;IACH,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;IAC7B;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,2CAWlE"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type Ref } from 'react';
|
|
1
2
|
import { type ColorSchemeName, type ColorValue, type StyleProp, type ViewStyle } from 'react-native';
|
|
2
3
|
import { type PrimitiveBaseProps } from '../layout';
|
|
3
4
|
export interface HostProps extends PrimitiveBaseProps {
|
|
@@ -54,6 +55,8 @@ export interface HostProps extends PrimitiveBaseProps {
|
|
|
54
55
|
children: React.ReactNode;
|
|
55
56
|
style?: StyleProp<ViewStyle>;
|
|
56
57
|
pointerEvents?: 'box-none' | 'none' | 'box-only' | 'auto';
|
|
58
|
+
/** @hidden */
|
|
59
|
+
ref?: Ref<any>;
|
|
57
60
|
}
|
|
58
61
|
export declare function Host(props: HostProps): import("react/jsx-runtime").JSX.Element;
|
|
59
62
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/jetpack-compose/Host/index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/jetpack-compose/Host/index.tsx"],"names":[],"mappings":"AACA,OAAO,EAAW,KAAK,GAAG,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,SAAS,EAGf,MAAM,cAAc,CAAC;AAKtB,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAEpD,MAAM,WAAW,SAAU,SAAQ,kBAAkB;IACnD;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,GAAG;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAEvE;;;OAGG;IACH,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,WAAW,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,KAAK,IAAI,CAAC;IAEtF;;;;OAIG;IACH,0BAA0B,CAAC,EAAE,OAAO,CAAC;IAErC;;;;;OAKG;IACH,WAAW,CAAC,EAAE,eAAe,CAAC;IAE9B;;;;;OAKG;IACH,SAAS,CAAC,EAAE,UAAU,CAAC;IAEvB;;;OAGG;IACH,eAAe,CAAC,EAAE,aAAa,GAAG,aAAa,CAAC;IAEhD;;;;OAIG;IACH,4BAA4B,CAAC,EAAE,OAAO,CAAC;IAEvC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,aAAa,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,CAAC;IAC1D,cAAc;IACd,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;CAChB;AAeD,wBAAgB,IAAI,CAAC,KAAK,EAAE,SAAS,2CA6CpC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/jetpack-compose/ModalBottomSheet/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAiB,MAAM,OAAO,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/jetpack-compose/ModalBottomSheet/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAiB,MAAM,OAAO,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG/C,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAUlD,MAAM,MAAM,mBAAmB,GAAG;IAChC;;;OAGG;IACH,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B;;OAEG;IACH,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B;;;OAGG;IACH,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC;;;OAGG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC;;;OAGG;IACH,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACvC,CAAC;AAEF,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,QAAQ,EAAE,SAAS,CAAC;IACpB;;OAEG;IACH,GAAG,CAAC,EAAE,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAC/B;;;OAGG;IACH,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B;;;OAGG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;OAEG;IACH,cAAc,CAAC,EAAE,UAAU,CAAC;IAC5B;;OAEG;IACH,YAAY,CAAC,EAAE,UAAU,CAAC;IAC1B;;OAEG;IACH,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;OAGG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;OAEG;IACH,UAAU,CAAC,EAAE,0BAA0B,CAAC;IACxC;;OAEG;IACH,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;CAC9B;AAmCD;;GAEG;AACH,iBAAS,yBAAyB,CAAC,KAAK,EAAE,qBAAqB,2CAQ9D;kBARQ,yBAAyB;4BAPP;QAAE,QAAQ,EAAE,SAAS,CAAA;KAAE;;AAmBlD,eAAO,MAAM,gBAAgB,kCAA4B,CAAC"}
|
|
@@ -85,7 +85,30 @@ export interface CircularProgressIndicatorProps extends ProgressCommonConfig {
|
|
|
85
85
|
* Matches the Jetpack Compose `CircularProgressIndicator`.
|
|
86
86
|
*/
|
|
87
87
|
export declare const CircularProgressIndicator: import("react").ComponentType<CircularProgressIndicatorProps>;
|
|
88
|
-
|
|
88
|
+
/**
|
|
89
|
+
* Wave configuration shared by the wavy progress indicator variants.
|
|
90
|
+
*/
|
|
91
|
+
export type WavyProgressCommonConfig = {
|
|
92
|
+
/**
|
|
93
|
+
* Height of the wave, where `0` draws a flat line and `1` draws the full wave height.
|
|
94
|
+
* When set, the amplitude stays the same across the whole track.
|
|
95
|
+
* When omitted, a determinate indicator uses the Material 3 default, which flattens the wave as
|
|
96
|
+
* progress approaches `0` and `1`.
|
|
97
|
+
* An indeterminate indicator defaults to the full wave height.
|
|
98
|
+
*/
|
|
99
|
+
amplitude?: number;
|
|
100
|
+
/**
|
|
101
|
+
* Length of a single wave in dp. `CircularWavyProgressIndicator` rounds this to fit a whole
|
|
102
|
+
* number of waves around the ring, so the wave it draws can be slightly shorter or longer.
|
|
103
|
+
*/
|
|
104
|
+
wavelength?: number;
|
|
105
|
+
/**
|
|
106
|
+
* Speed of the wave in dp per second. Defaults to `wavelength`, which advances the wave by one
|
|
107
|
+
* wavelength per second. Set it to `0` to stop the wave from moving.
|
|
108
|
+
*/
|
|
109
|
+
waveSpeed?: number;
|
|
110
|
+
};
|
|
111
|
+
export interface LinearWavyProgressIndicatorProps extends ProgressCommonConfig, WavyProgressCommonConfig {
|
|
89
112
|
/**
|
|
90
113
|
* Size of the stop indicator in dp at the end of the determinate progress track.
|
|
91
114
|
*/
|
|
@@ -97,7 +120,7 @@ export interface LinearWavyProgressIndicatorProps extends ProgressCommonConfig {
|
|
|
97
120
|
* Matches the Jetpack Compose `LinearWavyProgressIndicator`.
|
|
98
121
|
*/
|
|
99
122
|
export declare const LinearWavyProgressIndicator: import("react").ComponentType<LinearWavyProgressIndicatorProps>;
|
|
100
|
-
export interface CircularWavyProgressIndicatorProps extends ProgressCommonConfig {
|
|
123
|
+
export interface CircularWavyProgressIndicatorProps extends ProgressCommonConfig, WavyProgressCommonConfig {
|
|
101
124
|
}
|
|
102
125
|
/**
|
|
103
126
|
* A circular progress indicator with wavy animation style.
|