@expo/ui 56.0.0 → 56.0.2

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 (78) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/android/build.gradle +2 -2
  3. package/android/src/main/java/expo/modules/ui/ExpoUIModule.kt +1 -1
  4. package/android/src/main/java/expo/modules/ui/TextFieldView.kt +27 -80
  5. package/android/src/main/java/expo/modules/ui/icon/IconView.kt +6 -1
  6. package/build/community/bottom-sheet/BottomSheet.android.d.ts.map +1 -1
  7. package/build/community/bottom-sheet/BottomSheet.ios.d.ts.map +1 -1
  8. package/build/jetpack-compose/DropdownMenu/DropdownMenuItem.d.ts +4 -0
  9. package/build/jetpack-compose/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
  10. package/build/jetpack-compose/HorizontalFloatingToolbar/index.d.ts +8 -0
  11. package/build/jetpack-compose/HorizontalFloatingToolbar/index.d.ts.map +1 -1
  12. package/build/jetpack-compose/HorizontalPager/index.d.ts +2 -1
  13. package/build/jetpack-compose/HorizontalPager/index.d.ts.map +1 -1
  14. package/build/jetpack-compose/Icon/index.d.ts +12 -4
  15. package/build/jetpack-compose/Icon/index.d.ts.map +1 -1
  16. package/build/jetpack-compose/TextField/index.d.ts +21 -34
  17. package/build/jetpack-compose/TextField/index.d.ts.map +1 -1
  18. package/build/jetpack-compose/index.d.ts +2 -2
  19. package/build/jetpack-compose/index.d.ts.map +1 -1
  20. package/build/swift-ui/TextField/index.d.ts +1 -0
  21. package/build/swift-ui/TextField/index.d.ts.map +1 -1
  22. package/build/swift-ui/index.d.ts +1 -1
  23. package/build/swift-ui/index.d.ts.map +1 -1
  24. package/expo-module.config.json +1 -1
  25. package/ios/TextFieldView.swift +15 -15
  26. package/local-maven-repo/expo/modules/ui/expo.modules.ui/{56.0.0/expo.modules.ui-56.0.0-sources.jar → 56.0.2/expo.modules.ui-56.0.2-sources.jar} +0 -0
  27. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.2/expo.modules.ui-56.0.2-sources.jar.md5 +1 -0
  28. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.2/expo.modules.ui-56.0.2-sources.jar.sha1 +1 -0
  29. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.2/expo.modules.ui-56.0.2-sources.jar.sha256 +1 -0
  30. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.2/expo.modules.ui-56.0.2-sources.jar.sha512 +1 -0
  31. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.2/expo.modules.ui-56.0.2.aar +0 -0
  32. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.2/expo.modules.ui-56.0.2.aar.md5 +1 -0
  33. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.2/expo.modules.ui-56.0.2.aar.sha1 +1 -0
  34. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.2/expo.modules.ui-56.0.2.aar.sha256 +1 -0
  35. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.2/expo.modules.ui-56.0.2.aar.sha512 +1 -0
  36. package/local-maven-repo/expo/modules/ui/expo.modules.ui/{56.0.0/expo.modules.ui-56.0.0.module → 56.0.2/expo.modules.ui-56.0.2.module} +22 -22
  37. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.2/expo.modules.ui-56.0.2.module.md5 +1 -0
  38. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.2/expo.modules.ui-56.0.2.module.sha1 +1 -0
  39. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.2/expo.modules.ui-56.0.2.module.sha256 +1 -0
  40. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.2/expo.modules.ui-56.0.2.module.sha512 +1 -0
  41. package/local-maven-repo/expo/modules/ui/expo.modules.ui/{56.0.0/expo.modules.ui-56.0.0.pom → 56.0.2/expo.modules.ui-56.0.2.pom} +1 -1
  42. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.2/expo.modules.ui-56.0.2.pom.md5 +1 -0
  43. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.2/expo.modules.ui-56.0.2.pom.sha1 +1 -0
  44. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.2/expo.modules.ui-56.0.2.pom.sha256 +1 -0
  45. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.2/expo.modules.ui-56.0.2.pom.sha512 +1 -0
  46. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml +4 -4
  47. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.md5 +1 -1
  48. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.sha1 +1 -1
  49. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.sha256 +1 -1
  50. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.sha512 +1 -1
  51. package/package.json +14 -14
  52. package/src/community/bottom-sheet/BottomSheet.android.tsx +3 -2
  53. package/src/community/bottom-sheet/BottomSheet.ios.tsx +3 -2
  54. package/src/jetpack-compose/DropdownMenu/DropdownMenuItem.tsx +4 -6
  55. package/src/jetpack-compose/HorizontalFloatingToolbar/index.tsx +8 -8
  56. package/src/jetpack-compose/HorizontalPager/index.tsx +3 -1
  57. package/src/jetpack-compose/Icon/index.tsx +18 -5
  58. package/src/jetpack-compose/TextField/index.tsx +30 -50
  59. package/src/jetpack-compose/index.ts +17 -2
  60. package/src/swift-ui/TextField/index.tsx +3 -0
  61. package/src/swift-ui/index.tsx +6 -1
  62. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.0/expo.modules.ui-56.0.0-sources.jar.md5 +0 -1
  63. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.0/expo.modules.ui-56.0.0-sources.jar.sha1 +0 -1
  64. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.0/expo.modules.ui-56.0.0-sources.jar.sha256 +0 -1
  65. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.0/expo.modules.ui-56.0.0-sources.jar.sha512 +0 -1
  66. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.0/expo.modules.ui-56.0.0.aar +0 -0
  67. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.0/expo.modules.ui-56.0.0.aar.md5 +0 -1
  68. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.0/expo.modules.ui-56.0.0.aar.sha1 +0 -1
  69. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.0/expo.modules.ui-56.0.0.aar.sha256 +0 -1
  70. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.0/expo.modules.ui-56.0.0.aar.sha512 +0 -1
  71. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.0/expo.modules.ui-56.0.0.module.md5 +0 -1
  72. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.0/expo.modules.ui-56.0.0.module.sha1 +0 -1
  73. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.0/expo.modules.ui-56.0.0.module.sha256 +0 -1
  74. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.0/expo.modules.ui-56.0.0.module.sha512 +0 -1
  75. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.0/expo.modules.ui-56.0.0.pom.md5 +0 -1
  76. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.0/expo.modules.ui-56.0.0.pom.sha1 +0 -1
  77. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.0/expo.modules.ui-56.0.0.pom.sha256 +0 -1
  78. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.0/expo.modules.ui-56.0.0.pom.sha512 +0 -1
@@ -204,21 +204,6 @@ private struct StatefulSelectableTextField: View {
204
204
  isFocused = true
205
205
  }
206
206
  }
207
- .onChange(of: state.value as? String) { newValue in
208
- if let max = props.maxLength, let str = newValue, str.count > max {
209
- state.value = String(str.prefix(max))
210
- return
211
- }
212
- props.onTextChange(["value": newValue])
213
- props.onTextChangeSync?.invoke(arguments: [newValue])
214
- }
215
- .onChange(of: textManager.isFocused) { newValue in
216
- isFocused = newValue
217
- }
218
- .onChange(of: isFocused) { newValue in
219
- textManager.isFocused = newValue
220
- props.onFocusChange(["value": newValue])
221
- }
222
207
  .onChange(of: localSelection) { newSel in
223
208
  let text = (state.value as? String) ?? ""
224
209
  var start = text.count
@@ -235,6 +220,21 @@ private struct StatefulSelectableTextField: View {
235
220
  selection.value = ["start": start, "end": end]
236
221
  props.onSelectionChange(["start": start, "end": end])
237
222
  }
223
+ .onChange(of: state.value as? String) { newValue in
224
+ if let max = props.maxLength, let str = newValue, str.count > max {
225
+ state.value = String(str.prefix(max))
226
+ return
227
+ }
228
+ props.onTextChange(["value": newValue])
229
+ props.onTextChangeSync?.invoke(arguments: [newValue])
230
+ }
231
+ .onChange(of: textManager.isFocused) { newValue in
232
+ isFocused = newValue
233
+ }
234
+ .onChange(of: isFocused) { newValue in
235
+ textManager.isFocused = newValue
236
+ props.onFocusChange(["value": newValue])
237
+ }
238
238
  .onChange(of: selection.value as? NSDictionary) { _ in
239
239
  guard let start = extractInt(selection.value, "start"),
240
240
  let end = extractInt(selection.value, "end") else { return }
@@ -0,0 +1 @@
1
+ fcc61a62df8eb780a822914cee4b167b6e70519d
@@ -0,0 +1 @@
1
+ 30e043f7f04143f7b44a22ed5db105d71be86f4aa49f21d082d3c9acd84ea32a
@@ -0,0 +1 @@
1
+ 69bc561d70dc77219abb25903821b7f0f170b1a06c4cd40714ece8709b85404ad09bcd4fc9cbe67faf9a04e413a625e4880be8a5c78fd6426ed8f78f4b7ce4f6
@@ -0,0 +1 @@
1
+ a60331ab720130c5c2ab6c627a68c5c8f15aa917
@@ -0,0 +1 @@
1
+ 7c0946b01b4c9e3cc7c3790f36779a0d5ff3bb832562de233badb2168d613e45
@@ -0,0 +1 @@
1
+ 222495b3d9e3c00846f79962ed79cdd46c2a2a2df76077b8752576200bfd728c3cc885cc0e0762869c57b24391882b9ee65ffa3f02a2c2490faa44e983640dd4
@@ -3,7 +3,7 @@
3
3
  "component": {
4
4
  "group": "expo.modules.ui",
5
5
  "module": "expo.modules.ui",
6
- "version": "56.0.0",
6
+ "version": "56.0.2",
7
7
  "attributes": {
8
8
  "org.gradle.status": "release"
9
9
  }
@@ -24,13 +24,13 @@
24
24
  },
25
25
  "files": [
26
26
  {
27
- "name": "expo.modules.ui-56.0.0.aar",
28
- "url": "expo.modules.ui-56.0.0.aar",
29
- "size": 1696571,
30
- "sha512": "bb6d6f249bf4cfc959b4d91eb99d8e8eef4492f49edd6b5d6129e00dbbba8730fffad57405fe82ed9aa5e9ab5ab35869c8dc2058ebb098b57bd78164d8f120c7",
31
- "sha256": "03f3e6dc4e44853be482e14a42715dd60703ec309db644c8a4f2eaf32f48b175",
32
- "sha1": "d0d995cd2756336baddf9f1a055a443fb794d766",
33
- "md5": "8d84c1fc054ab28580873a3562c0043e"
27
+ "name": "expo.modules.ui-56.0.2.aar",
28
+ "url": "expo.modules.ui-56.0.2.aar",
29
+ "size": 1700493,
30
+ "sha512": "222495b3d9e3c00846f79962ed79cdd46c2a2a2df76077b8752576200bfd728c3cc885cc0e0762869c57b24391882b9ee65ffa3f02a2c2490faa44e983640dd4",
31
+ "sha256": "7c0946b01b4c9e3cc7c3790f36779a0d5ff3bb832562de233badb2168d613e45",
32
+ "sha1": "a60331ab720130c5c2ab6c627a68c5c8f15aa917",
33
+ "md5": "c9daa8165fdcd9ceb61785e0c560a949"
34
34
  }
35
35
  ]
36
36
  },
@@ -141,13 +141,13 @@
141
141
  ],
142
142
  "files": [
143
143
  {
144
- "name": "expo.modules.ui-56.0.0.aar",
145
- "url": "expo.modules.ui-56.0.0.aar",
146
- "size": 1696571,
147
- "sha512": "bb6d6f249bf4cfc959b4d91eb99d8e8eef4492f49edd6b5d6129e00dbbba8730fffad57405fe82ed9aa5e9ab5ab35869c8dc2058ebb098b57bd78164d8f120c7",
148
- "sha256": "03f3e6dc4e44853be482e14a42715dd60703ec309db644c8a4f2eaf32f48b175",
149
- "sha1": "d0d995cd2756336baddf9f1a055a443fb794d766",
150
- "md5": "8d84c1fc054ab28580873a3562c0043e"
144
+ "name": "expo.modules.ui-56.0.2.aar",
145
+ "url": "expo.modules.ui-56.0.2.aar",
146
+ "size": 1700493,
147
+ "sha512": "222495b3d9e3c00846f79962ed79cdd46c2a2a2df76077b8752576200bfd728c3cc885cc0e0762869c57b24391882b9ee65ffa3f02a2c2490faa44e983640dd4",
148
+ "sha256": "7c0946b01b4c9e3cc7c3790f36779a0d5ff3bb832562de233badb2168d613e45",
149
+ "sha1": "a60331ab720130c5c2ab6c627a68c5c8f15aa917",
150
+ "md5": "c9daa8165fdcd9ceb61785e0c560a949"
151
151
  }
152
152
  ]
153
153
  },
@@ -161,13 +161,13 @@
161
161
  },
162
162
  "files": [
163
163
  {
164
- "name": "expo.modules.ui-56.0.0-sources.jar",
165
- "url": "expo.modules.ui-56.0.0-sources.jar",
166
- "size": 81673,
167
- "sha512": "35c1745e420dc897e6ff8ecc87b3e1099f25796b361769b57ea5eda8024f0e78aa6ed32a4372a4a68b3c4b7a0c7d193fd26fcce38b3bdf1931bdaaa0fb187ec7",
168
- "sha256": "dd76cece816d055a95f0885ed0ca67518bbb553ea7f943c8df733d9cb85fe6ad",
169
- "sha1": "0bd7314ee11fab753cd321e1fc2a5a79a5503783",
170
- "md5": "19a4c78efc70fac17522ec1916675616"
164
+ "name": "expo.modules.ui-56.0.2-sources.jar",
165
+ "url": "expo.modules.ui-56.0.2-sources.jar",
166
+ "size": 81393,
167
+ "sha512": "69bc561d70dc77219abb25903821b7f0f170b1a06c4cd40714ece8709b85404ad09bcd4fc9cbe67faf9a04e413a625e4880be8a5c78fd6426ed8f78f4b7ce4f6",
168
+ "sha256": "30e043f7f04143f7b44a22ed5db105d71be86f4aa49f21d082d3c9acd84ea32a",
169
+ "sha1": "fcc61a62df8eb780a822914cee4b167b6e70519d",
170
+ "md5": "25616b6077449f887cfccb76c53298bf"
171
171
  }
172
172
  ]
173
173
  }
@@ -0,0 +1 @@
1
+ 7462e9cebfaf3618633f57bc7ccb3b20a78b1535
@@ -0,0 +1 @@
1
+ ee0321724e44b775e5f24bf1712946ac3d8e8d71fffb8f567cfd13a631a3fd49
@@ -0,0 +1 @@
1
+ 30a3a47f5c5c292e336d0eaf7363d8e4efabd422856c4012f90ae524197559a099c8bb06597ab67b976bd35f9dcd6db468520ab1c0460a6a057a1c117cb1ad8d
@@ -9,7 +9,7 @@
9
9
  <modelVersion>4.0.0</modelVersion>
10
10
  <groupId>expo.modules.ui</groupId>
11
11
  <artifactId>expo.modules.ui</artifactId>
12
- <version>56.0.0</version>
12
+ <version>56.0.2</version>
13
13
  <packaging>aar</packaging>
14
14
  <name>expo.modules.ui</name>
15
15
  <url>https://github.com/expo/expo</url>
@@ -0,0 +1 @@
1
+ ae97b3c0a7e08063fe763d3aa22eb4a39d49e893
@@ -0,0 +1 @@
1
+ 94e0b9c22f4243dd3fae58fdff830551be50f8d9ee42e83c55c1dcb3dd50f6bb
@@ -0,0 +1 @@
1
+ e716bb9fb13a6f3a41154d67632da322143d58a8313021c86a7725304a9b6159fb13672249e717876b6750f16d205dde1fd8291903c19e23835a3c626532ecfa
@@ -3,11 +3,11 @@
3
3
  <groupId>expo.modules.ui</groupId>
4
4
  <artifactId>expo.modules.ui</artifactId>
5
5
  <versioning>
6
- <latest>56.0.0</latest>
7
- <release>56.0.0</release>
6
+ <latest>56.0.2</latest>
7
+ <release>56.0.2</release>
8
8
  <versions>
9
- <version>56.0.0</version>
9
+ <version>56.0.2</version>
10
10
  </versions>
11
- <lastUpdated>20260505215537</lastUpdated>
11
+ <lastUpdated>20260506162907</lastUpdated>
12
12
  </versioning>
13
13
  </metadata>
@@ -1 +1 @@
1
- 55bbe2f0b04c7b515ef2b6458600bae7
1
+ 62565e0bc43f40239455f1984b6f2783
@@ -1 +1 @@
1
- 927a400c8a6b999d54683344d8f3ba879862f914
1
+ ede29291f881a1a89bcda42bec68cca142494629
@@ -1 +1 @@
1
- 6bce79dbe05a0ad31ac167ad639e10b90c4f72b32211fdaaaa5afd613c3ab410
1
+ 6b80d88f119d1131b0152eb0c2bc170614baac7a8b4b601c46f98e77b3e6e638
@@ -1 +1 @@
1
- b8af01feb5ccdaadabe3e0e2a5a8a8b6e5f4c3e524732b2a9b50e435dd25241b5393b80106a25f77b128ded820d8f20ba974ae440fd201036afeb91fa9f7b174
1
+ 13ed149e856276890b0fdc417974b41e8064a36cf93e2a59e2f8fdc2bb19f3d4df19eb6ea0d10f28194231b9774a27eb05ae835f6ad5a1dcba7c63c3755e11ef
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@expo/ui",
3
- "version": "56.0.0",
3
+ "version": "56.0.2",
4
4
  "description": "A collection of UI components",
5
5
  "sideEffects": [
6
6
  "*.fx.js"
@@ -48,14 +48,6 @@
48
48
  "default": "./plugin/babel-plugin.js"
49
49
  }
50
50
  },
51
- "scripts": {
52
- "build": "expo-module build",
53
- "clean": "expo-module clean",
54
- "lint": "expo-module lint",
55
- "test": "expo-module test",
56
- "prepublishOnly": "expo-module prepublishOnly",
57
- "expo-module": "expo-module"
58
- },
59
51
  "homepage": "https://docs.expo.dev/versions/latest/sdk/ui/",
60
52
  "repository": {
61
53
  "type": "git",
@@ -85,16 +77,17 @@
85
77
  "@types/babel__core": "^7.20.5",
86
78
  "@types/node": "^22.14.0",
87
79
  "@types/react": "~19.2.0",
88
- "expo-module-scripts": "56.0.0",
89
80
  "react-native-reanimated": "4.3.0",
90
- "react-native-worklets": "0.8.3"
81
+ "react-native-worklets": "0.8.3",
82
+ "expo": "56.0.0-preview.3",
83
+ "expo-module-scripts": "56.0.1"
91
84
  },
92
85
  "jest": {
93
86
  "preset": "expo-module-scripts"
94
87
  },
95
88
  "peerDependencies": {
96
89
  "@babel/core": "*",
97
- "expo": "workspace:*",
90
+ "expo": "*",
98
91
  "react": "*",
99
92
  "react-dom": "*",
100
93
  "react-native": "*",
@@ -115,5 +108,12 @@
115
108
  "optional": true
116
109
  }
117
110
  },
118
- "gitHead": "6dcd9ce9d615d25df78597f60520492e35e02efb"
119
- }
111
+ "gitHead": "71ec800b2fa6133d22d69b70945132e22f1b7ae8",
112
+ "scripts": {
113
+ "build": "expo-module build",
114
+ "clean": "expo-module clean",
115
+ "lint": "expo-module lint",
116
+ "test": "expo-module test",
117
+ "expo-module": "expo-module"
118
+ }
119
+ }
@@ -1,5 +1,5 @@
1
1
  import { useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';
2
- import { StyleSheet, View } from 'react-native';
2
+ import { StyleSheet, useWindowDimensions, View } from 'react-native';
3
3
 
4
4
  import { BottomSheetContext, BottomSheetInternalContext } from './context';
5
5
  import type { BottomSheetMethods, BottomSheetProps } from './types';
@@ -65,6 +65,7 @@ export function BottomSheet(props: BottomSheetProps) {
65
65
  backgroundStyle,
66
66
  children,
67
67
  } = props;
68
+ const { width } = useWindowDimensions();
68
69
 
69
70
  const hasMultipleSnapPoints = snapPointsProp != null && snapPointsProp.length > 1;
70
71
  const fitToContents = enableDynamicSizing && (!snapPointsProp || snapPointsProp.length === 0);
@@ -196,7 +197,7 @@ export function BottomSheet(props: BottomSheetProps) {
196
197
  return (
197
198
  <BottomSheetInternalContext.Provider value={internalContextValue}>
198
199
  <BottomSheetContext.Provider value={methods}>
199
- <Host matchContents>
200
+ <Host style={{ position: 'absolute', width }}>
200
201
  <ModalBottomSheet
201
202
  ref={sheetRef}
202
203
  onDismissRequest={handleDismiss}
@@ -1,5 +1,5 @@
1
1
  import { useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';
2
- import { View } from 'react-native';
2
+ import { useWindowDimensions, View } from 'react-native';
3
3
 
4
4
  import { BottomSheetContext, BottomSheetInternalContext } from './context';
5
5
  import type { BottomSheetMethods, BottomSheetProps } from './types';
@@ -82,6 +82,7 @@ export function BottomSheet(props: BottomSheetProps) {
82
82
  handleComponent,
83
83
  children,
84
84
  } = props;
85
+ const { width } = useWindowDimensions();
85
86
 
86
87
  // Two-state pattern for animated close:
87
88
  // - isMounted: whether the native sheet tree exists in the React tree
@@ -234,7 +235,7 @@ export function BottomSheet(props: BottomSheetProps) {
234
235
  return (
235
236
  <BottomSheetInternalContext.Provider value={internalContextValue}>
236
237
  <BottomSheetContext.Provider value={methods}>
237
- <Host matchContents>
238
+ <Host style={{ position: 'absolute', width }}>
238
239
  <NativeBottomSheet
239
240
  isPresented={isPresented}
240
241
  onIsPresentedChange={handlePresentedChange}
@@ -22,12 +22,10 @@ export type DropdownMenuItemElementColors = {
22
22
  textColor?: ColorValue;
23
23
  /** Color of the text when the menu item is disabled. */
24
24
  disabledTextColor?: ColorValue;
25
- // TODO: At the moment IconView's tint color defaults to Color.Unspecified instead of LocalContentColor.current.
26
- // Thus the color override will not work for icons. At the moment icon color can only be set directly in IconView.
27
- // leadingIconColor?: ColorValue;
28
- // trailingIconColor?: ColorValue;
29
- // disabledLeadingIconColor?: ColorValue;
30
- // disabledTrailingIconColor?: ColorValue;
25
+ leadingIconColor?: ColorValue;
26
+ trailingIconColor?: ColorValue;
27
+ disabledLeadingIconColor?: ColorValue;
28
+ disabledTrailingIconColor?: ColorValue;
31
29
  };
32
30
 
33
31
  /**
@@ -10,20 +10,20 @@ export type HorizontalFloatingToolbarColors = {
10
10
  */
11
11
  toolbarContainerColor?: ColorValue;
12
12
 
13
- // Color of the toolbar content (icons/text).
14
- // TODO: At the moment IconView's tint color defaults to Color.Unspecified instead of LocalContentColor.current.
15
- // Thus the color override will not work.
16
- // toolbarContentColor?: ColorValue;
13
+ /**
14
+ * Color of the toolbar content (icons/text).
15
+ */
16
+ toolbarContentColor?: ColorValue;
17
17
 
18
18
  /**
19
19
  * Color of the floating action button container (background).
20
20
  */
21
21
  fabContainerColor?: ColorValue;
22
22
 
23
- // Color of the floating action button content (icon).
24
- // TODO: At the moment IconView's tint color defaults to Color.Unspecified instead of LocalContentColor.current.
25
- // Thus the color override will not work.
26
- // fabContentColor?: ColorValue;
23
+ /**
24
+ * Color of the floating action button content (icon).
25
+ */
26
+ fabContentColor?: ColorValue;
27
27
  };
28
28
 
29
29
  export type HorizontalFloatingToolbarProps = {
@@ -2,9 +2,11 @@ import { requireNativeView } from 'expo';
2
2
  import type { Ref } from 'react';
3
3
 
4
4
  import { type ModifierConfig, type ViewEvent } from '../../types';
5
- import type { PaddingValuesRecord } from '../Carousel';
5
+ import { type PaddingValuesRecord } from '../Carousel';
6
6
  import { createViewModifierEventListener } from '../modifiers/utils';
7
7
 
8
+ export type { PaddingValuesRecord };
9
+
8
10
  export type HorizontalPagerHandle = {
9
11
  /**
10
12
  * Mirrors Compose's `PagerState.animateScrollToPage`. Resolves when the
@@ -23,16 +23,22 @@ export type IconProps = {
23
23
  source: ImageSourcePropType;
24
24
 
25
25
  /**
26
- * The tint color to apply to the icon.
27
- * Accepts hex strings, named colors, or RGB arrays.
26
+ * The tint color to apply to the icon. Accepts hex strings, named colors,
27
+ * or RGB arrays.
28
+ *
29
+ * - When omitted, the icon inherits the color from the surrounding
30
+ * `LocalContentColor` (e.g. the toolbar/FAB content color).
31
+ * - When set to `null`, no tint is applied — the icon is drawn with its
32
+ * original colors (`Color.Unspecified`). Use this for multicolored icons.
28
33
  *
29
34
  * @example
30
35
  * ```tsx
31
36
  * <Icon source={require('./assets/star.xml')} tint="#007AFF" />
32
37
  * <Icon source={require('./assets/star.xml')} tint="blue" />
38
+ * <Icon source={require('./assets/multicolor.xml')} tint={null} />
33
39
  * ```
34
40
  */
35
- tint?: ColorValue;
41
+ tint?: ColorValue | null;
36
42
 
37
43
  /**
38
44
  * The size of the icon in density-independent pixels (dp).
@@ -80,8 +86,10 @@ export type IconProps = {
80
86
  /**
81
87
  * @hidden
82
88
  */
83
- export type NativeIconProps = Omit<IconProps, 'source'> & {
89
+ export type NativeIconProps = Omit<IconProps, 'source' | 'tint'> & {
84
90
  source: ImageResolvedAssetSource;
91
+ tint?: ColorValue;
92
+ inheritTint: boolean;
85
93
  };
86
94
 
87
95
  const IconNativeView: React.ComponentType<NativeIconProps> = requireNativeView(
@@ -90,12 +98,17 @@ const IconNativeView: React.ComponentType<NativeIconProps> = requireNativeView(
90
98
  );
91
99
 
92
100
  function transformIconProps(props: IconProps): NativeIconProps {
93
- const { source, modifiers, ...restProps } = props;
101
+ const { source, modifiers, tint, ...restProps } = props;
102
+ // Differentiate "tint not provided" (inherit `LocalContentColor`) from
103
+ // "tint explicitly null" (no tint, draw original colors).
104
+ const tintIsExplicitlyNull = 'tint' in props && tint === null;
94
105
 
95
106
  return {
96
107
  modifiers,
97
108
  ...(modifiers ? createViewModifierEventListener(modifiers) : undefined),
98
109
  ...restProps,
110
+ tint: tint ?? undefined,
111
+ inheritTint: !tintIsExplicitlyNull,
99
112
  source: Image.resolveAssetSource(source),
100
113
  };
101
114
  }
@@ -126,23 +126,15 @@ export type TextFieldColors = {
126
126
  errorSuffixColor?: ColorValue;
127
127
  };
128
128
 
129
- export type TextFieldValue = {
130
- text: string;
131
- selection: { start: number; end: number };
132
- };
133
-
134
- export type TextFieldValueLike = string | TextFieldValue;
135
-
136
129
  /** Shared props between `TextField` and `OutlinedTextField`. */
137
- type BaseTextFieldProps<T extends TextFieldValueLike = string> = {
130
+ type BaseTextFieldProps = {
138
131
  ref?: Ref<TextFieldRef>;
139
132
  /**
140
- * An observable state that holds the current value. Create one with either:
141
- * - `useNativeState('initial text')`.
142
- * - `useNativeState<TextFieldValue>({ text: '', selection: { start: 0, end: 0 } })`
143
- * If omitted, the field manages its own internal state.
133
+ * An observable state that holds the current text value. Create one with
134
+ * `useNativeState('initial text')`. If omitted, the field manages its own
135
+ * internal state.
144
136
  */
145
- value?: ObservableState<T>;
137
+ value?: ObservableState<string>;
146
138
  /** If true, the text field will be focused automatically when mounted. @default false */
147
139
  autoFocus?: boolean;
148
140
  /** @default true */
@@ -173,20 +165,18 @@ type BaseTextFieldProps<T extends TextFieldValueLike = string> = {
173
165
  };
174
166
 
175
167
  /**
176
- * Observable state the field writes the current selection to.
177
- * Create with `useNativeState({ start: 0, end: 0 })`.
178
- * Use `ref.setSelection(start, end)` to set programmatically.
179
- * @internal
168
+ * Observable state holding the current selection range. Create with
169
+ * `useNativeState({ start: 0, end: 0 })`. The field writes user-driven
170
+ * changes back to it, and writes from JS (or a worklet) update the
171
+ * cursor/selection in the field. Use `ref.setSelection(start, end)` for
172
+ * imperative one-shot updates.
180
173
  */
181
174
  selection?: ObservableState<{ start: number; end: number }>;
182
175
 
183
176
  /** Maximum number of characters allowed. Truncates natively as the user types. */
184
177
  maxLength?: number;
185
178
 
186
- /**
187
- * Called when the selection range changes.
188
- * @internal
189
- */
179
+ /** Called when the selection range changes. */
190
180
  onSelectionChange?: (selection: { start: number; end: number }) => void;
191
181
 
192
182
  /**
@@ -215,15 +205,12 @@ type BaseTextFieldProps<T extends TextFieldValueLike = string> = {
215
205
  keyboardOptions?: TextFieldKeyboardOptions;
216
206
  keyboardActions?: TextFieldKeyboardActions;
217
207
  /**
218
- * Fires whenever the value changes. The callback receives the same shape as `value`:
219
- * - `string` when `value` is a string observable (typing events only).
220
- * - `TextFieldValue` when `value` is a TextFieldValue observable (every gesture:
221
- * typing, tap-to-place, drag, select-all, arrow keys).
222
- *
223
- * If marked with the `'worklet'` directive, runs synchronously on the UI thread;
224
- * otherwise delivered asynchronously as a regular JS event.
208
+ * Fires whenever the text value changes. If marked with the `'worklet'`
209
+ * directive, runs synchronously on the UI thread; otherwise delivered
210
+ * asynchronously as a regular JS event. Use `onSelectionChange` (or read
211
+ * the `selection` observable) to react to selection-only changes.
225
212
  */
226
- onValueChange?: (value: T) => void;
213
+ onValueChange?: (value: string) => void;
227
214
  /** A callback triggered when the field gains or loses focus. */
228
215
  onFocusChanged?: (focused: boolean) => void;
229
216
  shape?: object;
@@ -232,14 +219,13 @@ type BaseTextFieldProps<T extends TextFieldValueLike = string> = {
232
219
  children?: React.ReactNode;
233
220
  };
234
221
 
235
- export type TextFieldProps<T extends TextFieldValueLike = string> = BaseTextFieldProps<T> & {
222
+ export type TextFieldProps = BaseTextFieldProps & {
236
223
  colors?: TextFieldColors;
237
224
  };
238
225
 
239
- export type OutlinedTextFieldProps<T extends TextFieldValueLike = string> =
240
- BaseTextFieldProps<T> & {
241
- colors?: TextFieldColors;
242
- };
226
+ export type OutlinedTextFieldProps = BaseTextFieldProps & {
227
+ colors?: TextFieldColors;
228
+ };
243
229
 
244
230
  // endregion Types
245
231
 
@@ -263,7 +249,7 @@ type NativeTextFieldProps = Omit<
263
249
  value?: number | null;
264
250
  selection?: number | null;
265
251
  onValueChangeSync?: number | null;
266
- } & ViewEvent<'onValueChange', TextFieldValue> &
252
+ } & ViewEvent<'onValueChange', { text: string; selection: { start: number; end: number } }> &
267
253
  ViewEvent<'onFocusChanged', { value: boolean }> &
268
254
  ViewEvent<'onSelectionChange', { start: number; end: number }> &
269
255
  ViewEvent<'onKeyboardAction', { action: string; value: string }>;
@@ -273,8 +259,8 @@ const TextFieldNativeView: React.ComponentType<NativeTextFieldProps> = requireNa
273
259
  'TextFieldView'
274
260
  );
275
261
 
276
- function useTransformedProps<T extends TextFieldValueLike>(
277
- props: TextFieldProps<T> | OutlinedTextFieldProps<T>,
262
+ function useTransformedProps(
263
+ props: TextFieldProps | OutlinedTextFieldProps,
278
264
  variant: 'filled' | 'outlined'
279
265
  ): NativeTextFieldProps {
280
266
  const {
@@ -289,8 +275,6 @@ function useTransformedProps<T extends TextFieldValueLike>(
289
275
  ...restProps
290
276
  } = props;
291
277
 
292
- const isStringMode = !value || typeof value.value === 'string';
293
-
294
278
  const isWorklet = !!onValueChange && !!worklets?.isWorkletFunction?.(onValueChange);
295
279
  const workletCallback = useWorkletProp(isWorklet ? onValueChange : undefined, 'onValueChange');
296
280
 
@@ -300,16 +284,11 @@ function useTransformedProps<T extends TextFieldValueLike>(
300
284
  ...restProps,
301
285
  variant,
302
286
  children,
303
- value: getStateId(value as ObservableState<TextFieldValueLike>),
287
+ value: getStateId(value),
304
288
  selection: getStateId(selection),
305
289
  onValueChangeSync: getStateId(workletCallback),
306
290
  onValueChange:
307
- !isWorklet && onValueChange
308
- ? (event) => {
309
- const payload = event.nativeEvent;
310
- onValueChange((isStringMode ? payload.text : payload) as T);
311
- }
312
- : undefined,
291
+ !isWorklet && onValueChange ? (event) => onValueChange(event.nativeEvent.text) : undefined,
313
292
  onFocusChanged: onFocusChanged ? (event) => onFocusChanged(event.nativeEvent.value) : undefined,
314
293
  onSelectionChange: onSelectionChange
315
294
  ? (event) => onSelectionChange({ start: event.nativeEvent.start, end: event.nativeEvent.end })
@@ -370,7 +349,7 @@ function SupportingText(props: { children: React.ReactNode }) {
370
349
  /**
371
350
  * A Material3 `TextField`.
372
351
  */
373
- function TextFieldComponent<T extends TextFieldValueLike = string>(props: TextFieldProps<T>) {
352
+ function TextFieldComponent(props: TextFieldProps) {
374
353
  return <TextFieldNativeView {...useTransformedProps(props, 'filled')} />;
375
354
  }
376
355
 
@@ -385,9 +364,7 @@ TextFieldComponent.SupportingText = SupportingText;
385
364
  /**
386
365
  * A Material3 `OutlinedTextField` with a transparent background and border outline.
387
366
  */
388
- function OutlinedTextFieldComponent<T extends TextFieldValueLike = string>(
389
- props: OutlinedTextFieldProps<T>
390
- ) {
367
+ function OutlinedTextFieldComponent(props: OutlinedTextFieldProps) {
391
368
  return <TextFieldNativeView {...useTransformedProps(props, 'outlined')} />;
392
369
  }
393
370
 
@@ -402,3 +379,6 @@ OutlinedTextFieldComponent.SupportingText = SupportingText;
402
379
  // endregion Components
403
380
 
404
381
  export { TextFieldComponent as TextField, OutlinedTextFieldComponent as OutlinedTextField };
382
+
383
+ // Exported for docs api data
384
+ export { type ObservableState };
@@ -27,12 +27,27 @@ export * from './Slider';
27
27
  export * from './Spacer';
28
28
  export * from './Switch';
29
29
  export * from './SyncSwitch';
30
- export * from './TextField';
30
+ export {
31
+ TextField,
32
+ OutlinedTextField,
33
+ type TextFieldProps,
34
+ type TextFieldRef,
35
+ type TextFieldCapitalization,
36
+ type TextFieldImeAction,
37
+ type TextFieldKeyboardOptions,
38
+ type TextFieldKeyboardType,
39
+ type TextFieldKeyboardActions,
40
+ type TextFieldColors,
41
+ } from './TextField';
31
42
  export * from './ToggleButton';
32
43
  export * from './Shape';
33
44
  export * from './ModalBottomSheet';
34
45
  export * from './Carousel';
35
- export * from './HorizontalPager';
46
+ export {
47
+ HorizontalPager,
48
+ type HorizontalPagerHandle,
49
+ type HorizontalPagerProps,
50
+ } from './HorizontalPager';
36
51
  export * from './SearchBar';
37
52
  export * from './DockedSearchBar';
38
53
  export * from './HorizontalFloatingToolbar';