@expo/ui 56.0.4 → 56.0.6

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 (89) hide show
  1. package/CHANGELOG.md +22 -1
  2. package/android/build.gradle +2 -2
  3. package/android/src/main/java/expo/modules/ui/SliderView.kt +10 -4
  4. package/build/State/useNativeState.d.ts +2 -1
  5. package/build/State/useNativeState.d.ts.map +1 -1
  6. package/build/community/slider/Slider.android.d.ts +7 -0
  7. package/build/community/slider/Slider.android.d.ts.map +1 -0
  8. package/build/community/slider/Slider.d.ts +8 -0
  9. package/build/community/slider/Slider.d.ts.map +1 -0
  10. package/build/community/slider/Slider.ios.d.ts +7 -0
  11. package/build/community/slider/Slider.ios.d.ts.map +1 -0
  12. package/build/community/slider/index.d.ts +5 -0
  13. package/build/community/slider/index.d.ts.map +1 -0
  14. package/build/community/slider/types.d.ts +75 -0
  15. package/build/community/slider/types.d.ts.map +1 -0
  16. package/build/jetpack-compose/Slider/index.d.ts +10 -0
  17. package/build/jetpack-compose/Slider/index.d.ts.map +1 -1
  18. package/build/swift-ui/ScrollView/index.d.ts +3 -2
  19. package/build/swift-ui/ScrollView/index.d.ts.map +1 -1
  20. package/build/swift-ui/Slider/index.d.ts +10 -0
  21. package/build/swift-ui/Slider/index.d.ts.map +1 -1
  22. package/build/swift-ui/modifiers/index.d.ts +15 -1
  23. package/build/swift-ui/modifiers/index.d.ts.map +1 -1
  24. package/build/universal/TextInput/index.d.ts +1 -0
  25. package/build/universal/TextInput/index.d.ts.map +1 -1
  26. package/build/universal/index.d.ts +1 -1
  27. package/build/universal/index.d.ts.map +1 -1
  28. package/expo-module.config.json +1 -1
  29. package/ios/ChartView.swift +8 -4
  30. package/ios/Convertibles/AxisOptions.swift +19 -0
  31. package/ios/Convertibles/ScrollIndicatorVisibilityOptions.swift +22 -0
  32. package/ios/Modifiers/ContainerRelativeFrameModifier.swift +1 -18
  33. package/ios/Modifiers/ScrollIndicatorsModifier.swift +13 -0
  34. package/ios/Modifiers/ViewModifierRegistry.swift +4 -17
  35. package/ios/SliderView.swift +21 -6
  36. package/local-maven-repo/expo/modules/ui/expo.modules.ui/{56.0.4/expo.modules.ui-56.0.4-sources.jar → 56.0.6/expo.modules.ui-56.0.6-sources.jar} +0 -0
  37. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.6/expo.modules.ui-56.0.6-sources.jar.md5 +1 -0
  38. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.6/expo.modules.ui-56.0.6-sources.jar.sha1 +1 -0
  39. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.6/expo.modules.ui-56.0.6-sources.jar.sha256 +1 -0
  40. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.6/expo.modules.ui-56.0.6-sources.jar.sha512 +1 -0
  41. package/local-maven-repo/expo/modules/ui/expo.modules.ui/{56.0.4/expo.modules.ui-56.0.4.aar → 56.0.6/expo.modules.ui-56.0.6.aar} +0 -0
  42. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.6/expo.modules.ui-56.0.6.aar.md5 +1 -0
  43. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.6/expo.modules.ui-56.0.6.aar.sha1 +1 -0
  44. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.6/expo.modules.ui-56.0.6.aar.sha256 +1 -0
  45. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.6/expo.modules.ui-56.0.6.aar.sha512 +1 -0
  46. package/local-maven-repo/expo/modules/ui/expo.modules.ui/{56.0.4/expo.modules.ui-56.0.4.module → 56.0.6/expo.modules.ui-56.0.6.module} +22 -22
  47. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.6/expo.modules.ui-56.0.6.module.md5 +1 -0
  48. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.6/expo.modules.ui-56.0.6.module.sha1 +1 -0
  49. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.6/expo.modules.ui-56.0.6.module.sha256 +1 -0
  50. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.6/expo.modules.ui-56.0.6.module.sha512 +1 -0
  51. package/local-maven-repo/expo/modules/ui/expo.modules.ui/{56.0.4/expo.modules.ui-56.0.4.pom → 56.0.6/expo.modules.ui-56.0.6.pom} +1 -1
  52. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.6/expo.modules.ui-56.0.6.pom.md5 +1 -0
  53. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.6/expo.modules.ui-56.0.6.pom.sha1 +1 -0
  54. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.6/expo.modules.ui-56.0.6.pom.sha256 +1 -0
  55. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.6/expo.modules.ui-56.0.6.pom.sha512 +1 -0
  56. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml +4 -4
  57. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.md5 +1 -1
  58. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.sha1 +1 -1
  59. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.sha256 +1 -1
  60. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.sha512 +1 -1
  61. package/package.json +8 -4
  62. package/src/State/useNativeState.ts +6 -3
  63. package/src/community/slider/Slider.android.tsx +49 -0
  64. package/src/community/slider/Slider.ios.tsx +48 -0
  65. package/src/community/slider/Slider.tsx +45 -0
  66. package/src/community/slider/index.tsx +7 -0
  67. package/src/community/slider/types.tsx +75 -0
  68. package/src/jetpack-compose/Slider/index.tsx +10 -0
  69. package/src/swift-ui/ScrollView/index.tsx +3 -2
  70. package/src/swift-ui/Slider/index.tsx +10 -0
  71. package/src/swift-ui/modifiers/index.ts +19 -0
  72. package/src/universal/TextInput/index.tsx +1 -0
  73. package/src/universal/index.ts +1 -1
  74. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.4/expo.modules.ui-56.0.4-sources.jar.md5 +0 -1
  75. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.4/expo.modules.ui-56.0.4-sources.jar.sha1 +0 -1
  76. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.4/expo.modules.ui-56.0.4-sources.jar.sha256 +0 -1
  77. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.4/expo.modules.ui-56.0.4-sources.jar.sha512 +0 -1
  78. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.4/expo.modules.ui-56.0.4.aar.md5 +0 -1
  79. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.4/expo.modules.ui-56.0.4.aar.sha1 +0 -1
  80. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.4/expo.modules.ui-56.0.4.aar.sha256 +0 -1
  81. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.4/expo.modules.ui-56.0.4.aar.sha512 +0 -1
  82. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.4/expo.modules.ui-56.0.4.module.md5 +0 -1
  83. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.4/expo.modules.ui-56.0.4.module.sha1 +0 -1
  84. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.4/expo.modules.ui-56.0.4.module.sha256 +0 -1
  85. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.4/expo.modules.ui-56.0.4.module.sha512 +0 -1
  86. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.4/expo.modules.ui-56.0.4.pom.md5 +0 -1
  87. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.4/expo.modules.ui-56.0.4.pom.sha1 +0 -1
  88. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.4/expo.modules.ui-56.0.4.pom.sha256 +0 -1
  89. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.4/expo.modules.ui-56.0.4.pom.sha512 +0 -1
@@ -1118,23 +1118,6 @@ internal struct ListSectionMargins: ViewModifier, Record {
1118
1118
  }
1119
1119
  }
1120
1120
 
1121
- internal enum AxisOptions: String, Enumerable {
1122
- case horizontal
1123
- case vertical
1124
- case both
1125
-
1126
- func toAxis() -> Axis.Set {
1127
- switch self {
1128
- case .vertical:
1129
- return .vertical
1130
- case .horizontal:
1131
- return .horizontal
1132
- case .both:
1133
- return [.vertical, .horizontal]
1134
- }
1135
- }
1136
- }
1137
-
1138
1121
  internal struct GridCellUnsizedAxes: ViewModifier, Record {
1139
1122
  @Field var axes: AxisOptions?
1140
1123
 
@@ -1891,6 +1874,10 @@ extension ViewModifierRegistry {
1891
1874
  return try ScrollDisabledModifier(from: params, appContext: appContext)
1892
1875
  }
1893
1876
 
1877
+ register("scrollIndicators") { params, appContext, _ in
1878
+ return try ScrollIndicatorsModifier(from: params, appContext: appContext)
1879
+ }
1880
+
1894
1881
  register("tabViewStyle") { params, appContext, _ in
1895
1882
  return try TabViewStyleModifier(from: params, appContext: appContext)
1896
1883
  }
@@ -16,11 +16,11 @@ struct SliderView: ExpoSwiftUI.View {
16
16
  #if !os(tvOS)
17
17
  sliderContent
18
18
  .onAppear {
19
- value = props.value ?? 0.0
19
+ value = clamp(props.value ?? 0.0)
20
20
  }
21
21
  .onChange(of: props.value) { newValue in
22
22
  guard !isEditing else { return }
23
- value = newValue ?? 0.0
23
+ value = clamp(newValue ?? 0.0)
24
24
  }
25
25
  .onChange(of: value) { newValue in
26
26
  if props.value != newValue {
@@ -35,6 +35,19 @@ struct SliderView: ExpoSwiftUI.View {
35
35
  }
36
36
 
37
37
  #if !os(tvOS)
38
+ private func clamp(_ raw: Float) -> Float {
39
+ let lower = Swift.max(props.min ?? -.infinity, props.lowerLimit ?? -.infinity)
40
+ let upper = Swift.min(props.max ?? .infinity, props.upperLimit ?? .infinity)
41
+ return Swift.min(upper, Swift.max(lower, raw))
42
+ }
43
+
44
+ private var clampedBinding: Binding<Float> {
45
+ Binding(
46
+ get: { value },
47
+ set: { newValue in value = clamp(newValue) }
48
+ )
49
+ }
50
+
38
51
  @ViewBuilder
39
52
  private var sliderContent: some View {
40
53
  let label = props.children?.slot("label")
@@ -43,7 +56,7 @@ struct SliderView: ExpoSwiftUI.View {
43
56
 
44
57
  if let min = props.min, let max = props.max, let step = props.step {
45
58
  Slider(
46
- value: $value,
59
+ value: clampedBinding,
47
60
  in: min...max,
48
61
  step: step,
49
62
  label: { label },
@@ -55,7 +68,7 @@ struct SliderView: ExpoSwiftUI.View {
55
68
  }
56
69
  } else if let min = props.min, let max = props.max {
57
70
  Slider(
58
- value: $value,
71
+ value: clampedBinding,
59
72
  in: min...max,
60
73
  label: { label },
61
74
  minimumValueLabel: { minimumValueLabel },
@@ -66,7 +79,7 @@ struct SliderView: ExpoSwiftUI.View {
66
79
  }
67
80
  } else if let step = props.step {
68
81
  Slider(
69
- value: $value,
82
+ value: clampedBinding,
70
83
  in: 0...1,
71
84
  step: step,
72
85
  label: { label },
@@ -78,7 +91,7 @@ struct SliderView: ExpoSwiftUI.View {
78
91
  }
79
92
  } else {
80
93
  Slider(
81
- value: $value,
94
+ value: clampedBinding,
82
95
  label: { label },
83
96
  minimumValueLabel: { minimumValueLabel },
84
97
  maximumValueLabel: { maximumValueLabel }
@@ -96,6 +109,8 @@ final class SliderProps: UIBaseViewProps {
96
109
  @Field var step: Float?
97
110
  @Field var min: Float?
98
111
  @Field var max: Float?
112
+ @Field var lowerLimit: Float?
113
+ @Field var upperLimit: Float?
99
114
  var onValueChanged = EventDispatcher()
100
115
  var onEditingChanged = EventDispatcher()
101
116
  }
@@ -0,0 +1 @@
1
+ a534f795e8ea46629011b2f8939608619b954ff1
@@ -0,0 +1 @@
1
+ 213a1693673392a710d27fef37d99ef030c8a8783b4ccaa971ea914588dc5241
@@ -0,0 +1 @@
1
+ 26e067865e2bbdd9f770d670f8212c2a309bee05009f722931b339ca9f76c235bbed2286a876d9c7a7b0ddb0e4b152617031f487c047ae78d0672ecc2649c6be
@@ -0,0 +1 @@
1
+ 28dcb1963deda39da1d284330ae45e0c900c24bd
@@ -0,0 +1 @@
1
+ 034e7b27268544deeae53969a3c6edb7dccaa9648517de96383f64de4735b61d
@@ -0,0 +1 @@
1
+ 9153e9187cc172ce1793a149742c785d8a21bdb184999f83942f74a9eec67fac4526c6710563a45ce99d43773f1e2e2b2a7d11fedf03653a5d3125c66900c85e
@@ -3,7 +3,7 @@
3
3
  "component": {
4
4
  "group": "expo.modules.ui",
5
5
  "module": "expo.modules.ui",
6
- "version": "56.0.4",
6
+ "version": "56.0.6",
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.4.aar",
28
- "url": "expo.modules.ui-56.0.4.aar",
29
- "size": 1740154,
30
- "sha512": "24e656ae1e397c8abea2fb5a2d49bc826a58f84afd58b3104ff22cede3fcf720f86ac532223279fa5efda5c402d0c75f3ab700bdcbb5b0847c2618028243c04c",
31
- "sha256": "c04258a22308940aa735f6f81a47fa83d842db257c39396b2e3d9007cb6802fb",
32
- "sha1": "f071c18852f0767d13d3b64a54aac75cb42108bd",
33
- "md5": "ec6173e86a8ac7f1e588b08dc6ff96b1"
27
+ "name": "expo.modules.ui-56.0.6.aar",
28
+ "url": "expo.modules.ui-56.0.6.aar",
29
+ "size": 1741087,
30
+ "sha512": "9153e9187cc172ce1793a149742c785d8a21bdb184999f83942f74a9eec67fac4526c6710563a45ce99d43773f1e2e2b2a7d11fedf03653a5d3125c66900c85e",
31
+ "sha256": "034e7b27268544deeae53969a3c6edb7dccaa9648517de96383f64de4735b61d",
32
+ "sha1": "28dcb1963deda39da1d284330ae45e0c900c24bd",
33
+ "md5": "69d6e33780c1406aa3d7dace9bdb5302"
34
34
  }
35
35
  ]
36
36
  },
@@ -141,13 +141,13 @@
141
141
  ],
142
142
  "files": [
143
143
  {
144
- "name": "expo.modules.ui-56.0.4.aar",
145
- "url": "expo.modules.ui-56.0.4.aar",
146
- "size": 1740154,
147
- "sha512": "24e656ae1e397c8abea2fb5a2d49bc826a58f84afd58b3104ff22cede3fcf720f86ac532223279fa5efda5c402d0c75f3ab700bdcbb5b0847c2618028243c04c",
148
- "sha256": "c04258a22308940aa735f6f81a47fa83d842db257c39396b2e3d9007cb6802fb",
149
- "sha1": "f071c18852f0767d13d3b64a54aac75cb42108bd",
150
- "md5": "ec6173e86a8ac7f1e588b08dc6ff96b1"
144
+ "name": "expo.modules.ui-56.0.6.aar",
145
+ "url": "expo.modules.ui-56.0.6.aar",
146
+ "size": 1741087,
147
+ "sha512": "9153e9187cc172ce1793a149742c785d8a21bdb184999f83942f74a9eec67fac4526c6710563a45ce99d43773f1e2e2b2a7d11fedf03653a5d3125c66900c85e",
148
+ "sha256": "034e7b27268544deeae53969a3c6edb7dccaa9648517de96383f64de4735b61d",
149
+ "sha1": "28dcb1963deda39da1d284330ae45e0c900c24bd",
150
+ "md5": "69d6e33780c1406aa3d7dace9bdb5302"
151
151
  }
152
152
  ]
153
153
  },
@@ -161,13 +161,13 @@
161
161
  },
162
162
  "files": [
163
163
  {
164
- "name": "expo.modules.ui-56.0.4-sources.jar",
165
- "url": "expo.modules.ui-56.0.4-sources.jar",
166
- "size": 82167,
167
- "sha512": "788dc7a233524ec8b7eed4a0f242bf546284f3a2ea501806e2e90047c3221702430584413d684677dc330195a378feed1bb1956e2d980c8f689ebce716cf54b6",
168
- "sha256": "e144b778f1df5f7e73be22ffe120819c376f3309599468cc22a5c5528ce3ad84",
169
- "sha1": "15482bf66b78fc5bb944571c2ee52b665c21b307",
170
- "md5": "813c4db4263146688584a4c5f309f653"
164
+ "name": "expo.modules.ui-56.0.6-sources.jar",
165
+ "url": "expo.modules.ui-56.0.6-sources.jar",
166
+ "size": 82267,
167
+ "sha512": "26e067865e2bbdd9f770d670f8212c2a309bee05009f722931b339ca9f76c235bbed2286a876d9c7a7b0ddb0e4b152617031f487c047ae78d0672ecc2649c6be",
168
+ "sha256": "213a1693673392a710d27fef37d99ef030c8a8783b4ccaa971ea914588dc5241",
169
+ "sha1": "a534f795e8ea46629011b2f8939608619b954ff1",
170
+ "md5": "f6beb7095321eea7da6845fa478235b0"
171
171
  }
172
172
  ]
173
173
  }
@@ -0,0 +1 @@
1
+ d7c80c16e1995920f696bf4f8676ee0208f51bea
@@ -0,0 +1 @@
1
+ 22a0498924db370ce70a0f895ee07fc9c79669679c0ac257851ba1225330b990
@@ -0,0 +1 @@
1
+ 88a8b97dd20a2c8cacfa8f5ca445d444fc60eccdd0ee5ba04083b0b5f509091ea976ae80c9ceacde4c0e267cb7873815707a07028efb94893ab60299724fb6dd
@@ -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.4</version>
12
+ <version>56.0.6</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
+ 656a2d7cce1be45517a43cf7c9010a47be716994
@@ -0,0 +1 @@
1
+ 88522b12f07c121eb385f9e2bbfc235461ff9fa12a4311c0c3e8db3b9224e7d8
@@ -0,0 +1 @@
1
+ 03523e913bb66754494f8af213caa9ce93d944050e1bff21dda5eb9c614fd384dbea15795217496be8791c4c61210d4629f22ce473811f20302790db638416a8
@@ -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.4</latest>
7
- <release>56.0.4</release>
6
+ <latest>56.0.6</latest>
7
+ <release>56.0.6</release>
8
8
  <versions>
9
- <version>56.0.4</version>
9
+ <version>56.0.6</version>
10
10
  </versions>
11
- <lastUpdated>20260508193741</lastUpdated>
11
+ <lastUpdated>20260513103326</lastUpdated>
12
12
  </versioning>
13
13
  </metadata>
@@ -1 +1 @@
1
- 0353edd352ef8d23fd2c25605acce957
1
+ b3ca330a5f2396c76ef2a75c6a63a1b5
@@ -1 +1 @@
1
- 1be87e0b21c297d2164f2c6cce94471c3f08282a
1
+ 056c42f73a3ce70484fd129941ba605b4b43b1a2
@@ -1 +1 @@
1
- 9eddcd5edc295d99bcb6a5b1a2b56feeddcf04eccd4b0c850a2ebf3aa44a8431
1
+ 51b027c8f2849c17546bf8aa17f35a8707289abfd20627996422c4cf2287115e
@@ -1 +1 @@
1
- fa71ba728a32752b3b8d26ccd45cb960c27b569b108ed1eb545600621a2b0e9e6839c3fc4cefe5bce0c2b498aa76fdc06d271db7f86e9815ba765ee048501653
1
+ b7ac9cf92e7dbf7455874551e21d961c47e7df4031554f03584b4c67ad1e64e8510ad7a4a99f1ab39a4bd945a94f162f43153c49b16a851b398e6d42505cd8b1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@expo/ui",
3
- "version": "56.0.4",
3
+ "version": "56.0.6",
4
4
  "description": "A collection of UI components",
5
5
  "sideEffects": [
6
6
  "*.fx.js"
@@ -43,6 +43,10 @@
43
43
  "types": "./build/community/picker/index.d.ts",
44
44
  "default": "./src/community/picker/index.tsx"
45
45
  },
46
+ "./community/slider": {
47
+ "types": "./build/community/slider/index.d.ts",
48
+ "default": "./src/community/slider/index.tsx"
49
+ },
46
50
  "./community/masked-view": {
47
51
  "types": "./build/community/masked-view/index.d.ts",
48
52
  "default": "./src/community/masked-view/index.tsx"
@@ -81,9 +85,9 @@
81
85
  "@types/babel__core": "^7.20.5",
82
86
  "@types/node": "^22.14.0",
83
87
  "@types/react": "~19.2.0",
84
- "react-native-reanimated": "4.3.0",
88
+ "react-native-reanimated": "4.3.1",
85
89
  "react-native-worklets": "0.8.3",
86
- "expo": "56.0.0-preview.7",
90
+ "expo": "56.0.0-preview.10",
87
91
  "expo-module-scripts": "56.0.2"
88
92
  },
89
93
  "jest": {
@@ -112,7 +116,7 @@
112
116
  "optional": true
113
117
  }
114
118
  },
115
- "gitHead": "a30353e69ca0d72b9fac5830abc631feda1ba3ae",
119
+ "gitHead": "40f0a6f6711d93762e0506b37e6e077e4bd9a541",
116
120
  "scripts": {
117
121
  "build": "expo-module build",
118
122
  "clean": "expo-module clean",
@@ -1,5 +1,6 @@
1
1
  import { requireNativeModule } from 'expo';
2
2
  import { type SharedObject, useReleasingSharedObject } from 'expo-modules-core';
3
+ import { useRef } from 'react';
3
4
 
4
5
  import { worklets } from './optionalWorklets';
5
6
 
@@ -19,14 +20,16 @@ export type ObservableState<T> = SharedObject & {
19
20
  };
20
21
 
21
22
  /**
22
- * Creates an observable native state that is automatically cleaned up when the component unmounts.
23
+ * Creates an observable native state that is automatically cleaned up when the
24
+ * component unmounts. `initialValue` is captured once on the first render
23
25
  */
24
26
  export function useNativeState<T>(initialValue: T): ObservableState<T> {
27
+ const initialValueRef = useRef(initialValue);
25
28
  return useReleasingSharedObject(() => {
26
- const state = new ExpoUI.ObservableState({ value: initialValue });
29
+ const state = new ExpoUI.ObservableState({ value: initialValueRef.current });
27
30
  defineValueProperty(state);
28
31
  return state;
29
- }, [JSON.stringify(initialValue)]) as ObservableState<T>;
32
+ }, []) as ObservableState<T>;
30
33
  }
31
34
 
32
35
  type NativeObservableState = {
@@ -0,0 +1,49 @@
1
+ import { type SliderProps } from './types';
2
+ import { Host } from '../../jetpack-compose/Host';
3
+ import { Slider as ComposeSlider } from '../../jetpack-compose/Slider';
4
+
5
+ /**
6
+ * A drop-in replacement for `@react-native-community/slider` on Android.
7
+ * Renders a Material 3 `Slider` wrapped in a Host.
8
+ */
9
+ export function Slider(props: SliderProps) {
10
+ const {
11
+ value,
12
+ minimumValue,
13
+ maximumValue,
14
+ lowerLimit,
15
+ upperLimit,
16
+ step,
17
+ disabled,
18
+ inverted,
19
+ minimumTrackTintColor,
20
+ maximumTrackTintColor,
21
+ thumbTintColor,
22
+ onValueChange,
23
+ style,
24
+ } = props;
25
+ const min = minimumValue ?? 0;
26
+ const max = maximumValue ?? 1;
27
+ const steps = step && step > 0 ? Math.max(0, Math.round((max - min) / step) - 1) : 0;
28
+ const hostStyle = inverted ? [style, { transform: [{ scaleX: -1 }] }] : style;
29
+ const colors = {
30
+ activeTrackColor: minimumTrackTintColor,
31
+ inactiveTrackColor: maximumTrackTintColor,
32
+ thumbColor: thumbTintColor,
33
+ };
34
+ return (
35
+ <Host matchContents={{ vertical: true }} style={hostStyle}>
36
+ <ComposeSlider
37
+ value={value}
38
+ min={minimumValue}
39
+ max={maximumValue}
40
+ lowerLimit={lowerLimit}
41
+ upperLimit={upperLimit}
42
+ steps={steps}
43
+ enabled={disabled === undefined ? undefined : !disabled}
44
+ colors={colors}
45
+ onValueChange={onValueChange}
46
+ />
47
+ </Host>
48
+ );
49
+ }
@@ -0,0 +1,48 @@
1
+ import { type SliderProps } from './types';
2
+ import { Host } from '../../swift-ui/Host';
3
+ import { Slider as SwiftUISlider } from '../../swift-ui/Slider';
4
+ import { disabled as disabledModifier, tint as tintModifier } from '../../swift-ui/modifiers';
5
+ import type { ModifierConfig } from '../../types';
6
+
7
+ /**
8
+ * A drop-in replacement for `@react-native-community/slider` on iOS.
9
+ * Renders a SwiftUI `Slider` wrapped in a Host.
10
+ */
11
+ export function Slider(props: SliderProps) {
12
+ const {
13
+ value,
14
+ minimumValue,
15
+ maximumValue,
16
+ lowerLimit,
17
+ upperLimit,
18
+ step,
19
+ disabled,
20
+ inverted,
21
+ minimumTrackTintColor,
22
+ onValueChange,
23
+ style,
24
+ } = props;
25
+ const hostStyle = inverted ? [style, { transform: [{ scaleX: -1 }] }] : style;
26
+ // SwiftUI's Slider only exposes `.tint(...)` for the minimum (active)
27
+ // track. `maximumTrackTintColor` and `thumbTintColor` are accepted at the
28
+ // type level but not visually applied on iOS
29
+ const modifiers: ModifierConfig[] = [];
30
+ if (disabled) modifiers.push(disabledModifier(true));
31
+ if (minimumTrackTintColor !== undefined) {
32
+ modifiers.push(tintModifier(minimumTrackTintColor as string));
33
+ }
34
+ return (
35
+ <Host matchContents={{ vertical: true }} style={hostStyle}>
36
+ <SwiftUISlider
37
+ value={value}
38
+ min={minimumValue}
39
+ max={maximumValue}
40
+ lowerLimit={lowerLimit}
41
+ upperLimit={upperLimit}
42
+ step={step && step > 0 ? step : undefined}
43
+ modifiers={modifiers.length > 0 ? modifiers : undefined}
44
+ onValueChange={onValueChange}
45
+ />
46
+ </Host>
47
+ );
48
+ }
@@ -0,0 +1,45 @@
1
+ import * as React from 'react';
2
+ import { StyleSheet } from 'react-native';
3
+
4
+ import { type SliderProps } from './types';
5
+
6
+ /**
7
+ * A drop-in replacement for `@react-native-community/slider`. Renders a
8
+ * SwiftUI `Slider` on iOS, a Material 3 `Slider` on Android, and a native
9
+ * HTML `<input type="range">` on web.
10
+ */
11
+ export function Slider(props: SliderProps) {
12
+ const {
13
+ value,
14
+ minimumValue = 0,
15
+ maximumValue = 1,
16
+ lowerLimit,
17
+ upperLimit,
18
+ step,
19
+ disabled,
20
+ inverted,
21
+ minimumTrackTintColor,
22
+ onValueChange,
23
+ style,
24
+ } = props;
25
+ const clamp = (v: number) =>
26
+ Math.min(upperLimit ?? Infinity, Math.max(lowerLimit ?? -Infinity, v));
27
+ return (
28
+ <input
29
+ type="range"
30
+ min={minimumValue}
31
+ max={maximumValue}
32
+ step={step && step > 0 ? step : 'any'}
33
+ value={clamp(value ?? 0)}
34
+ disabled={disabled}
35
+ onChange={(e) => onValueChange?.(clamp(e.target.valueAsNumber))}
36
+ style={{
37
+ ...(StyleSheet.flatten(style) as React.CSSProperties),
38
+ ...(minimumTrackTintColor !== undefined && {
39
+ accentColor: minimumTrackTintColor as string,
40
+ }),
41
+ ...(inverted && { transform: 'scaleX(-1)' }),
42
+ }}
43
+ />
44
+ );
45
+ }
@@ -0,0 +1,7 @@
1
+ import { Slider } from './Slider';
2
+
3
+ export type { SliderProps } from './types';
4
+
5
+ export default Slider;
6
+ // named export needed for docs generator
7
+ export { Slider };
@@ -0,0 +1,75 @@
1
+ import type { ColorValue, StyleProp, ViewStyle } from 'react-native';
2
+
3
+ /**
4
+ * Props for the `Slider` community drop-in component.
5
+ * Compatible with `@react-native-community/slider`.
6
+ */
7
+ export type SliderProps = {
8
+ /**
9
+ * Initial / current value of the slider.
10
+ * Behaves like the community lib: passing a new value updates the thumb,
11
+ * but live drag emits via `onValueChange` without needing external state.
12
+ * @default 0
13
+ */
14
+ value?: number;
15
+ /**
16
+ * Initial minimum value of the slider.
17
+ * @default 0
18
+ */
19
+ minimumValue?: number;
20
+ /**
21
+ * Initial maximum value of the slider.
22
+ * @default 1
23
+ */
24
+ maximumValue?: number;
25
+ /**
26
+ * The lower limit value of the slider. The user won't be able to slide
27
+ * below this limit.
28
+ */
29
+ lowerLimit?: number;
30
+ /**
31
+ * The upper limit value of the slider. The user won't be able to slide
32
+ * above this limit.
33
+ */
34
+ upperLimit?: number;
35
+ /**
36
+ * If true the user won't be able to move the slider.
37
+ * @default false
38
+ */
39
+ disabled?: boolean;
40
+ /**
41
+ * Step value of the slider. The value should be between 0 and
42
+ * (maximumValue - minimumValue). A value of 0 means continuous (no
43
+ * snapping).
44
+ * @default 0
45
+ */
46
+ step?: number;
47
+ /**
48
+ * Reverses the direction of the slider so the maximum value is on the
49
+ * left and the minimum value is on the right.
50
+ * @default false
51
+ */
52
+ inverted?: boolean;
53
+ /**
54
+ * Color of the track to the left of the thumb.
55
+ */
56
+ minimumTrackTintColor?: ColorValue;
57
+ /**
58
+ * Color of the track to the right of the thumb.
59
+ * @platform android
60
+ */
61
+ maximumTrackTintColor?: ColorValue;
62
+ /**
63
+ * Color of the thumb.
64
+ * @platform android
65
+ */
66
+ thumbTintColor?: ColorValue;
67
+ /**
68
+ * Callback continuously called while the user is dragging the slider.
69
+ */
70
+ onValueChange?: (value: number) => void;
71
+ /**
72
+ * Used to style and layout the Slider.
73
+ */
74
+ style?: StyleProp<ViewStyle>;
75
+ };
@@ -47,6 +47,16 @@ export type SliderProps = {
47
47
  * @default 1
48
48
  */
49
49
  max?: number;
50
+ /**
51
+ * Lower limit the user can drag the thumb to. The visible track still
52
+ * spans `min..max`, but the thumb stops at `lowerLimit` during drag.
53
+ */
54
+ lowerLimit?: number;
55
+ /**
56
+ * Upper limit the user can drag the thumb to. The visible track still
57
+ * spans `min..max`, but the thumb stops at `upperLimit` during drag.
58
+ */
59
+ upperLimit?: number;
50
60
  /**
51
61
  * Whether the slider is enabled for user interaction.
52
62
  * @default true
@@ -6,12 +6,13 @@ import { type CommonViewModifierProps } from '../types';
6
6
  export type ScrollViewProps = {
7
7
  children: React.ReactNode;
8
8
  /**
9
- * The scrollable axes.
9
+ * The scrollable axes. Pass `'both'` to enable 2D (horizontal + vertical) scrolling.
10
10
  * @default 'vertical'
11
11
  */
12
12
  axes?: 'vertical' | 'horizontal' | 'both';
13
13
  /**
14
- * Whether to show scroll indicators.
14
+ * Whether to show scroll indicators. For richer visibility control (e.g. `'never'`)
15
+ * or per-axis control, use the `scrollIndicators(...)` modifier instead.
15
16
  * @default true
16
17
  */
17
18
  showsIndicators?: boolean;
@@ -21,6 +21,16 @@ export type SliderProps = {
21
21
  * The maximum value of the slider. Updating this value does not trigger callbacks if the current value is above `max`.
22
22
  */
23
23
  max?: number;
24
+ /**
25
+ * Lower limit the user can drag the thumb to. The visible track still
26
+ * spans `min..max`, but the thumb stops at `lowerLimit` during drag.
27
+ */
28
+ lowerLimit?: number;
29
+ /**
30
+ * Upper limit the user can drag the thumb to. The visible track still
31
+ * spans `min..max`, but the thumb stops at `upperLimit` during drag.
32
+ */
33
+ upperLimit?: number;
24
34
  /**
25
35
  * A label describing the slider's purpose.
26
36
  */