@expo/ui 56.0.5 → 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 (78) hide show
  1. package/CHANGELOG.md +12 -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/Slider/index.d.ts +10 -0
  19. package/build/swift-ui/Slider/index.d.ts.map +1 -1
  20. package/build/universal/TextInput/index.d.ts +1 -0
  21. package/build/universal/TextInput/index.d.ts.map +1 -1
  22. package/build/universal/index.d.ts +1 -1
  23. package/build/universal/index.d.ts.map +1 -1
  24. package/expo-module.config.json +1 -1
  25. package/ios/ChartView.swift +8 -4
  26. package/ios/SliderView.swift +21 -6
  27. package/local-maven-repo/expo/modules/ui/expo.modules.ui/{56.0.5/expo.modules.ui-56.0.5-sources.jar → 56.0.6/expo.modules.ui-56.0.6-sources.jar} +0 -0
  28. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.6/expo.modules.ui-56.0.6-sources.jar.md5 +1 -0
  29. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.6/expo.modules.ui-56.0.6-sources.jar.sha1 +1 -0
  30. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.6/expo.modules.ui-56.0.6-sources.jar.sha256 +1 -0
  31. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.6/expo.modules.ui-56.0.6-sources.jar.sha512 +1 -0
  32. package/local-maven-repo/expo/modules/ui/expo.modules.ui/{56.0.5/expo.modules.ui-56.0.5.aar → 56.0.6/expo.modules.ui-56.0.6.aar} +0 -0
  33. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.6/expo.modules.ui-56.0.6.aar.md5 +1 -0
  34. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.6/expo.modules.ui-56.0.6.aar.sha1 +1 -0
  35. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.6/expo.modules.ui-56.0.6.aar.sha256 +1 -0
  36. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.6/expo.modules.ui-56.0.6.aar.sha512 +1 -0
  37. package/local-maven-repo/expo/modules/ui/expo.modules.ui/{56.0.5/expo.modules.ui-56.0.5.module → 56.0.6/expo.modules.ui-56.0.6.module} +22 -22
  38. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.6/expo.modules.ui-56.0.6.module.md5 +1 -0
  39. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.6/expo.modules.ui-56.0.6.module.sha1 +1 -0
  40. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.6/expo.modules.ui-56.0.6.module.sha256 +1 -0
  41. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.6/expo.modules.ui-56.0.6.module.sha512 +1 -0
  42. package/local-maven-repo/expo/modules/ui/expo.modules.ui/{56.0.5/expo.modules.ui-56.0.5.pom → 56.0.6/expo.modules.ui-56.0.6.pom} +1 -1
  43. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.6/expo.modules.ui-56.0.6.pom.md5 +1 -0
  44. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.6/expo.modules.ui-56.0.6.pom.sha1 +1 -0
  45. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.6/expo.modules.ui-56.0.6.pom.sha256 +1 -0
  46. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.6/expo.modules.ui-56.0.6.pom.sha512 +1 -0
  47. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml +4 -4
  48. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.md5 +1 -1
  49. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.sha1 +1 -1
  50. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.sha256 +1 -1
  51. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.sha512 +1 -1
  52. package/package.json +7 -3
  53. package/src/State/useNativeState.ts +6 -3
  54. package/src/community/slider/Slider.android.tsx +49 -0
  55. package/src/community/slider/Slider.ios.tsx +48 -0
  56. package/src/community/slider/Slider.tsx +45 -0
  57. package/src/community/slider/index.tsx +7 -0
  58. package/src/community/slider/types.tsx +75 -0
  59. package/src/jetpack-compose/Slider/index.tsx +10 -0
  60. package/src/swift-ui/Slider/index.tsx +10 -0
  61. package/src/universal/TextInput/index.tsx +1 -0
  62. package/src/universal/index.ts +1 -1
  63. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.5/expo.modules.ui-56.0.5-sources.jar.md5 +0 -1
  64. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.5/expo.modules.ui-56.0.5-sources.jar.sha1 +0 -1
  65. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.5/expo.modules.ui-56.0.5-sources.jar.sha256 +0 -1
  66. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.5/expo.modules.ui-56.0.5-sources.jar.sha512 +0 -1
  67. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.5/expo.modules.ui-56.0.5.aar.md5 +0 -1
  68. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.5/expo.modules.ui-56.0.5.aar.sha1 +0 -1
  69. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.5/expo.modules.ui-56.0.5.aar.sha256 +0 -1
  70. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.5/expo.modules.ui-56.0.5.aar.sha512 +0 -1
  71. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.5/expo.modules.ui-56.0.5.module.md5 +0 -1
  72. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.5/expo.modules.ui-56.0.5.module.sha1 +0 -1
  73. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.5/expo.modules.ui-56.0.5.module.sha256 +0 -1
  74. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.5/expo.modules.ui-56.0.5.module.sha512 +0 -1
  75. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.5/expo.modules.ui-56.0.5.pom.md5 +0 -1
  76. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.5/expo.modules.ui-56.0.5.pom.sha1 +0 -1
  77. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.5/expo.modules.ui-56.0.5.pom.sha256 +0 -1
  78. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.5/expo.modules.ui-56.0.5.pom.sha512 +0 -1
package/CHANGELOG.md CHANGED
@@ -10,6 +10,17 @@
10
10
 
11
11
  ### 💡 Others
12
12
 
13
+ ## 56.0.6 — 2026-05-13
14
+
15
+ ### 🎉 New features
16
+
17
+ - Added `@expo/ui/community/slider`, a drop-in replacement for `@react-native-community/slider`. ([#45623](https://github.com/expo/expo/pull/45623) by [@nishan](https://github.com/intergalacticspacehighway))
18
+ - Make `ChartView` public. ([#45674](https://github.com/expo/expo/pull/45674) by [@jakex7](https://github.com/jakex7))
19
+
20
+ ### 🐛 Bug fixes
21
+
22
+ - Fix `useNativeState` recreating the `ObservableState` when initial value changes; the seed is now captured once via `useRef`. ([#45623](https://github.com/expo/expo/pull/45623) by [@nishan](https://github.com/intergalacticspacehighway))
23
+
13
24
  ## 56.0.5 — 2026-05-11
14
25
 
15
26
  ### 🎉 New features
@@ -345,7 +356,7 @@ _This version does not introduce any user-facing changes._
345
356
  - [iOS] - Add range and custom label support in `DatePicker` ([#41546](https://github.com/expo/expo/pull/41546) by [@nishan](https://github.com/intergalacticspacehighway))
346
357
  - [jetpack-compose] Added `matchContents` support to `Host`. ([#41553](https://github.com/expo/expo/pull/41553) by [@kudo](https://github.com/kudo))
347
358
  - [iOS] Add `timerInterval` to `Progress` component. ([#41598](https://github.com/expo/expo/pull/41598) by [@jakex7](https://github.com/jakex7))
348
- - [iOS] Make some views public.
359
+ - [iOS] Make some views public. ([#41641](https://github.com/expo/expo/pull/41641) by [@jakex7](https://github.com/jakex7))
349
360
  - [iOS] - Add `Menu` component ([#41664](https://github.com/expo/expo/pull/41664) by [@nishan](https://github.com/intergalacticspacehighway))
350
361
  - [iOS] Remove presentation props from `BottomSheet` and add equivalent modifiers ([#42029](https://github.com/expo/expo/pull/42029) by [@nishan](https://github.com/intergalacticspacehighway))
351
362
  - [iOS] - Nested `Text` support ([#41707](https://github.com/expo/expo/pull/41707) by [@intergalacticspacehighway](https://github.com/intergalacticspacehighway))
@@ -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 = '56.0.5'
15
+ version = '56.0.6'
16
16
 
17
17
  android {
18
18
  namespace "expo.modules.ui"
19
19
  defaultConfig {
20
20
  versionCode 1
21
- versionName "56.0.5"
21
+ versionName "56.0.6"
22
22
  testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
23
23
  }
24
24
  buildFeatures {
@@ -42,6 +42,8 @@ data class SliderProps(
42
42
  val value: Float = 0.0f,
43
43
  val min: Float = 0.0f,
44
44
  val max: Float = 1.0f,
45
+ val lowerLimit: Float? = null,
46
+ val upperLimit: Float? = null,
45
47
  val steps: Int = 0,
46
48
  val enabled: Boolean = true,
47
49
  val colors: SliderColors = SliderColors(),
@@ -60,9 +62,12 @@ fun FunctionalComposableScope.SliderContent(props: SliderProps) {
60
62
  val onValueChangeFinished by remember { this@SliderContent.EventDispatcher<Unit>() }
61
63
  val interactionSource = remember { MutableInteractionSource() }
62
64
 
63
- var localValue by remember { mutableFloatStateOf(props.value.coerceIn(props.min, props.max)) }
65
+ val effectiveLower = maxOf(props.min, props.lowerLimit ?: Float.NEGATIVE_INFINITY)
66
+ val effectiveUpper = minOf(props.max, props.upperLimit ?: Float.POSITIVE_INFINITY)
67
+
68
+ var localValue by remember { mutableFloatStateOf(props.value.coerceIn(effectiveLower, effectiveUpper)) }
64
69
  var isDragging by remember { mutableStateOf(false) }
65
- val clampedPropsValue = props.value.coerceIn(props.min, props.max)
70
+ val clampedPropsValue = props.value.coerceIn(effectiveLower, effectiveUpper)
66
71
  var prevPropsValue by remember { mutableFloatStateOf(clampedPropsValue) }
67
72
 
68
73
  if (clampedPropsValue != prevPropsValue) {
@@ -90,9 +95,10 @@ fun FunctionalComposableScope.SliderContent(props: SliderProps) {
90
95
  enabled = props.enabled,
91
96
  interactionSource = interactionSource,
92
97
  onValueChange = {
98
+ val clamped = it.coerceIn(effectiveLower, effectiveUpper)
93
99
  isDragging = true
94
- localValue = it
95
- onValueChange(SliderValueChangedEvent(it))
100
+ localValue = clamped
101
+ onValueChange(SliderValueChangedEvent(clamped))
96
102
  },
97
103
  onValueChangeFinished = {
98
104
  isDragging = false
@@ -12,7 +12,8 @@ export type ObservableState<T> = SharedObject & {
12
12
  value: T;
13
13
  };
14
14
  /**
15
- * Creates an observable native state that is automatically cleaned up when the component unmounts.
15
+ * Creates an observable native state that is automatically cleaned up when the
16
+ * component unmounts. `initialValue` is captured once on the first render
16
17
  */
17
18
  export declare function useNativeState<T>(initialValue: T): ObservableState<T>;
18
19
  //# sourceMappingURL=useNativeState.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useNativeState.d.ts","sourceRoot":"","sources":["../../src/State/useNativeState.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,YAAY,EAA4B,MAAM,mBAAmB,CAAC;AAMhF;;;GAGG;AACH,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI,YAAY,GAAG;IAC9C;;;;OAIG;IACH,KAAK,EAAE,CAAC,CAAC;CACV,CAAC;AAEF;;GAEG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAMrE"}
1
+ {"version":3,"file":"useNativeState.d.ts","sourceRoot":"","sources":["../../src/State/useNativeState.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,YAAY,EAA4B,MAAM,mBAAmB,CAAC;AAOhF;;;GAGG;AACH,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI,YAAY,GAAG;IAC9C;;;;OAIG;IACH,KAAK,EAAE,CAAC,CAAC;CACV,CAAC;AAEF;;;GAGG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAOrE"}
@@ -0,0 +1,7 @@
1
+ import { type SliderProps } from './types';
2
+ /**
3
+ * A drop-in replacement for `@react-native-community/slider` on Android.
4
+ * Renders a Material 3 `Slider` wrapped in a Host.
5
+ */
6
+ export declare function Slider(props: SliderProps): import("react/jsx-runtime").JSX.Element;
7
+ //# sourceMappingURL=Slider.android.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Slider.android.d.ts","sourceRoot":"","sources":["../../../src/community/slider/Slider.android.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAI3C;;;GAGG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,WAAW,2CAwCxC"}
@@ -0,0 +1,8 @@
1
+ import { type SliderProps } from './types';
2
+ /**
3
+ * A drop-in replacement for `@react-native-community/slider`. Renders a
4
+ * SwiftUI `Slider` on iOS, a Material 3 `Slider` on Android, and a native
5
+ * HTML `<input type="range">` on web.
6
+ */
7
+ export declare function Slider(props: SliderProps): import("react/jsx-runtime").JSX.Element;
8
+ //# sourceMappingURL=Slider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Slider.d.ts","sourceRoot":"","sources":["../../../src/community/slider/Slider.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,WAAW,2CAkCxC"}
@@ -0,0 +1,7 @@
1
+ import { type SliderProps } from './types';
2
+ /**
3
+ * A drop-in replacement for `@react-native-community/slider` on iOS.
4
+ * Renders a SwiftUI `Slider` wrapped in a Host.
5
+ */
6
+ export declare function Slider(props: SliderProps): import("react/jsx-runtime").JSX.Element;
7
+ //# sourceMappingURL=Slider.ios.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Slider.ios.d.ts","sourceRoot":"","sources":["../../../src/community/slider/Slider.ios.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAM3C;;;GAGG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,WAAW,2CAqCxC"}
@@ -0,0 +1,5 @@
1
+ import { Slider } from './Slider';
2
+ export type { SliderProps } from './types';
3
+ export default Slider;
4
+ export { Slider };
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/community/slider/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,eAAe,MAAM,CAAC;AAEtB,OAAO,EAAE,MAAM,EAAE,CAAC"}
@@ -0,0 +1,75 @@
1
+ import type { ColorValue, StyleProp, ViewStyle } from 'react-native';
2
+ /**
3
+ * Props for the `Slider` community drop-in component.
4
+ * Compatible with `@react-native-community/slider`.
5
+ */
6
+ export type SliderProps = {
7
+ /**
8
+ * Initial / current value of the slider.
9
+ * Behaves like the community lib: passing a new value updates the thumb,
10
+ * but live drag emits via `onValueChange` without needing external state.
11
+ * @default 0
12
+ */
13
+ value?: number;
14
+ /**
15
+ * Initial minimum value of the slider.
16
+ * @default 0
17
+ */
18
+ minimumValue?: number;
19
+ /**
20
+ * Initial maximum value of the slider.
21
+ * @default 1
22
+ */
23
+ maximumValue?: number;
24
+ /**
25
+ * The lower limit value of the slider. The user won't be able to slide
26
+ * below this limit.
27
+ */
28
+ lowerLimit?: number;
29
+ /**
30
+ * The upper limit value of the slider. The user won't be able to slide
31
+ * above this limit.
32
+ */
33
+ upperLimit?: number;
34
+ /**
35
+ * If true the user won't be able to move the slider.
36
+ * @default false
37
+ */
38
+ disabled?: boolean;
39
+ /**
40
+ * Step value of the slider. The value should be between 0 and
41
+ * (maximumValue - minimumValue). A value of 0 means continuous (no
42
+ * snapping).
43
+ * @default 0
44
+ */
45
+ step?: number;
46
+ /**
47
+ * Reverses the direction of the slider so the maximum value is on the
48
+ * left and the minimum value is on the right.
49
+ * @default false
50
+ */
51
+ inverted?: boolean;
52
+ /**
53
+ * Color of the track to the left of the thumb.
54
+ */
55
+ minimumTrackTintColor?: ColorValue;
56
+ /**
57
+ * Color of the track to the right of the thumb.
58
+ * @platform android
59
+ */
60
+ maximumTrackTintColor?: ColorValue;
61
+ /**
62
+ * Color of the thumb.
63
+ * @platform android
64
+ */
65
+ thumbTintColor?: ColorValue;
66
+ /**
67
+ * Callback continuously called while the user is dragging the slider.
68
+ */
69
+ onValueChange?: (value: number) => void;
70
+ /**
71
+ * Used to style and layout the Slider.
72
+ */
73
+ style?: StyleProp<ViewStyle>;
74
+ };
75
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/community/slider/types.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAErE;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;OAEG;IACH,qBAAqB,CAAC,EAAE,UAAU,CAAC;IACnC;;;OAGG;IACH,qBAAqB,CAAC,EAAE,UAAU,CAAC;IACnC;;;OAGG;IACH,cAAc,CAAC,EAAE,UAAU,CAAC;IAC5B;;OAEG;IACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC;;OAEG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAC9B,CAAC"}
@@ -32,6 +32,16 @@ export type SliderProps = {
32
32
  * @default 1
33
33
  */
34
34
  max?: number;
35
+ /**
36
+ * Lower limit the user can drag the thumb to. The visible track still
37
+ * spans `min..max`, but the thumb stops at `lowerLimit` during drag.
38
+ */
39
+ lowerLimit?: number;
40
+ /**
41
+ * Upper limit the user can drag the thumb to. The visible track still
42
+ * spans `min..max`, but the thumb stops at `upperLimit` during drag.
43
+ */
44
+ upperLimit?: number;
35
45
  /**
36
46
  * Whether the slider is enabled for user interaction.
37
47
  * @default true
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/jetpack-compose/Slider/index.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,KAAK,EAAE,cAAc,EAAa,MAAM,aAAa,CAAC;AAa7D;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,gBAAgB,CAAC,EAAE,UAAU,CAAC;IAC9B,kBAAkB,CAAC,EAAE,UAAU,CAAC;IAChC,eAAe,CAAC,EAAE,UAAU,CAAC;IAC7B,iBAAiB,CAAC,EAAE,UAAU,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB;;OAEG;IACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC;;;OAGG;IACH,qBAAqB,CAAC,EAAE,MAAM,IAAI,CAAC;IACnC;;OAEG;IACH,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;IAC7B;;OAEG;IACH,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,CAAC;AAqDF;;;;GAIG;AACH,iBAAS,eAAe,CAAC,KAAK,EAAE,WAAW,2CAG1C;kBAHQ,eAAe;uBAnBF;QAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;KAAE;uBAU7B;QAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;KAAE;;AAiBnD,OAAO,EAAE,eAAe,IAAI,MAAM,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/jetpack-compose/Slider/index.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,KAAK,EAAE,cAAc,EAAa,MAAM,aAAa,CAAC;AAa7D;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,gBAAgB,CAAC,EAAE,UAAU,CAAC;IAC9B,kBAAkB,CAAC,EAAE,UAAU,CAAC;IAChC,eAAe,CAAC,EAAE,UAAU,CAAC;IAC7B,iBAAiB,CAAC,EAAE,UAAU,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB;;OAEG;IACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC;;;OAGG;IACH,qBAAqB,CAAC,EAAE,MAAM,IAAI,CAAC;IACnC;;OAEG;IACH,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;IAC7B;;OAEG;IACH,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,CAAC;AAqDF;;;;GAIG;AACH,iBAAS,eAAe,CAAC,KAAK,EAAE,WAAW,2CAG1C;kBAHQ,eAAe;uBAnBF;QAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;KAAE;uBAU7B;QAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;KAAE;;AAiBnD,OAAO,EAAE,eAAe,IAAI,MAAM,EAAE,CAAC"}
@@ -16,6 +16,16 @@ export type SliderProps = {
16
16
  * The maximum value of the slider. Updating this value does not trigger callbacks if the current value is above `max`.
17
17
  */
18
18
  max?: number;
19
+ /**
20
+ * Lower limit the user can drag the thumb to. The visible track still
21
+ * spans `min..max`, but the thumb stops at `lowerLimit` during drag.
22
+ */
23
+ lowerLimit?: number;
24
+ /**
25
+ * Upper limit the user can drag the thumb to. The visible track still
26
+ * spans `min..max`, but the thumb stops at `upperLimit` during drag.
27
+ */
28
+ upperLimit?: number;
19
29
  /**
20
30
  * A label describing the slider's purpose.
21
31
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/swift-ui/Slider/index.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAExD,MAAM,MAAM,WAAW,GAAG;IACxB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB;;OAEG;IACH,iBAAiB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACpC;;OAEG;IACH,iBAAiB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACpC;;OAEG;IACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC;;OAEG;IACH,gBAAgB,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;CACjD,GAAG,uBAAuB,CAAC;AAwC5B,wBAAgB,MAAM,CAAC,KAAK,EAAE,WAAW,2CAUxC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/swift-ui/Slider/index.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAExD,MAAM,MAAM,WAAW,GAAG;IACxB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB;;OAEG;IACH,iBAAiB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACpC;;OAEG;IACH,iBAAiB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACpC;;OAEG;IACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC;;OAEG;IACH,gBAAgB,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;CACjD,GAAG,uBAAuB,CAAC;AAwC5B,wBAAgB,MAAM,CAAC,KAAK,EAAE,WAAW,2CAUxC"}
@@ -1,4 +1,5 @@
1
1
  import type { TextInputProps } from './types';
2
2
  export declare function TextInput({ ref, value, onChangeText, placeholder, autoFocus, editable, multiline, keyboardType, autoCapitalize, autoCorrect, returnKeyType, onSubmitEditing, onFocus, onBlur, cursorColor, textAlign, readOnly, inputMode, enterKeyHint, defaultValue, numberOfLines, rows, testID, placeholderTextColor, style, textStyle, secureTextEntry, autoComplete, onContentSizeChange, maxLength, caretHidden, selectionColor, selection, onSelectionChange, selectTextOnFocus, }: TextInputProps): import("react/jsx-runtime").JSX.Element;
3
3
  export * from './types';
4
+ export { type ObservableState } from '../State';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/universal/TextInput/index.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,wBAAgB,SAAS,CAAC,EACxB,GAAG,EACH,KAAK,EACL,YAAY,EACZ,WAAW,EACX,SAAS,EACT,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,cAAc,EACd,WAAW,EACX,aAAa,EACb,eAAe,EACf,OAAO,EACP,MAAM,EACN,WAAW,EACX,SAAS,EACT,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,IAAI,EACJ,MAAM,EACN,oBAAoB,EACpB,KAAK,EACL,SAAS,EACT,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,SAAS,EACT,WAAW,EACX,cAAc,EACd,SAAS,EACT,iBAAiB,EACjB,iBAAiB,GAClB,EAAE,cAAc,2CAiFhB;AAED,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/universal/TextInput/index.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,wBAAgB,SAAS,CAAC,EACxB,GAAG,EACH,KAAK,EACL,YAAY,EACZ,WAAW,EACX,SAAS,EACT,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,cAAc,EACd,WAAW,EACX,aAAa,EACb,eAAe,EACf,OAAO,EACP,MAAM,EACN,WAAW,EACX,SAAS,EACT,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,IAAI,EACJ,MAAM,EACN,oBAAoB,EACpB,KAAK,EACL,SAAS,EACT,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,SAAS,EACT,WAAW,EACX,cAAc,EACd,SAAS,EACT,iBAAiB,EACjB,iBAAiB,GAClB,EAAE,cAAc,2CAiFhB;AAED,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,UAAU,CAAC"}
@@ -12,6 +12,6 @@ export * from './FieldGroup';
12
12
  export * from './Icon';
13
13
  export * from './Spacer';
14
14
  export * from './State';
15
- export * from './TextInput';
15
+ export { TextInput, type TextInputProps, type TextInputRef } from './TextInput';
16
16
  export type { UniversalStyle, UniversalAlignment, UniversalBaseProps } from './types';
17
17
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/universal/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,OAAO,CAAC;AACtB,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAE5B,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/universal/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,OAAO,CAAC;AACtB,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhF,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC"}
@@ -10,7 +10,7 @@
10
10
  "publication": {
11
11
  "groupId": "expo.modules.ui",
12
12
  "artifactId": "expo.modules.ui",
13
- "version": "56.0.5",
13
+ "version": "56.0.6",
14
14
  "repository": "local-maven-repo"
15
15
  }
16
16
  }
@@ -77,7 +77,7 @@ struct RuleChartStyle: Record {
77
77
  @Field var dashArray: [Double]?
78
78
  }
79
79
 
80
- final class ChartProps: UIBaseViewProps {
80
+ public final class ChartProps: UIBaseViewProps {
81
81
  @Field var data: [ChartDataPoint] = []
82
82
  @Field var type: ChartType = .line
83
83
  @Field var showGrid: Bool = true
@@ -93,8 +93,12 @@ final class ChartProps: UIBaseViewProps {
93
93
  @Field var ruleStyle: RuleChartStyle?
94
94
  }
95
95
 
96
- struct ChartView: ExpoSwiftUI.View {
97
- @ObservedObject var props: ChartProps
96
+ public struct ChartView: ExpoSwiftUI.View {
97
+ @ObservedObject public var props: ChartProps
98
+
99
+ public init(props: ChartProps) {
100
+ self.props = props
101
+ }
98
102
 
99
103
  @available(iOS 16.0, tvOS 16.0, *)
100
104
  private func createBaseBarMark(for dataPoint: ChartDataPoint) -> BarMark {
@@ -188,7 +192,7 @@ struct ChartView: ExpoSwiftUI.View {
188
192
  return ruleMark.lineStyle(.init(lineWidth: CGFloat(lineWidth)))
189
193
  }
190
194
 
191
- var body: some View {
195
+ public var body: some View {
192
196
  if #available(iOS 16.0, tvOS 16.0, *) {
193
197
  let hasIndividualColors = props.data.contains { $0.color != nil }
194
198
 
@@ -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.5",
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.5.aar",
28
- "url": "expo.modules.ui-56.0.5.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.5.aar",
145
- "url": "expo.modules.ui-56.0.5.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.5-sources.jar",
165
- "url": "expo.modules.ui-56.0.5-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.5</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.5</latest>
7
- <release>56.0.5</release>
6
+ <latest>56.0.6</latest>
7
+ <release>56.0.6</release>
8
8
  <versions>
9
- <version>56.0.5</version>
9
+ <version>56.0.6</version>
10
10
  </versions>
11
- <lastUpdated>20260511220218</lastUpdated>
11
+ <lastUpdated>20260513103326</lastUpdated>
12
12
  </versioning>
13
13
  </metadata>
@@ -1 +1 @@
1
- 4e6b84f9e67f4fe98ec4751441002b91
1
+ b3ca330a5f2396c76ef2a75c6a63a1b5
@@ -1 +1 @@
1
- 1b46921cef814ea6c21a4495ea9fbc40fb653ab9
1
+ 056c42f73a3ce70484fd129941ba605b4b43b1a2
@@ -1 +1 @@
1
- b25b5606567578f55f071b4b68967b4d99aff1ff095d6c9204df755569c25ebf
1
+ 51b027c8f2849c17546bf8aa17f35a8707289abfd20627996422c4cf2287115e
@@ -1 +1 @@
1
- 8c4eccfff9cf7add6b53b35b643b366d85f73e41f3a906ce6a7eddd09ea6fe83c0916856978c3fb7cecde4516ba77ecc82cc679e21890f9e87bcc035277f7e63
1
+ b7ac9cf92e7dbf7455874551e21d961c47e7df4031554f03584b4c67ad1e64e8510ad7a4a99f1ab39a4bd945a94f162f43153c49b16a851b398e6d42505cd8b1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@expo/ui",
3
- "version": "56.0.5",
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"
@@ -83,7 +87,7 @@
83
87
  "@types/react": "~19.2.0",
84
88
  "react-native-reanimated": "4.3.1",
85
89
  "react-native-worklets": "0.8.3",
86
- "expo": "56.0.0-preview.8",
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": "42013232893cb2aa71ab218e9b422d4a8476b3f0",
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
@@ -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
  */
@@ -124,3 +124,4 @@ export function TextInput({
124
124
  }
125
125
 
126
126
  export * from './types';
127
+ export { type ObservableState } from '../State';
@@ -12,6 +12,6 @@ export * from './FieldGroup';
12
12
  export * from './Icon';
13
13
  export * from './Spacer';
14
14
  export * from './State';
15
- export * from './TextInput';
15
+ export { TextInput, type TextInputProps, type TextInputRef } from './TextInput';
16
16
 
17
17
  export type { UniversalStyle, UniversalAlignment, UniversalBaseProps } from './types';
@@ -1 +0,0 @@
1
- 15482bf66b78fc5bb944571c2ee52b665c21b307
@@ -1 +0,0 @@
1
- e144b778f1df5f7e73be22ffe120819c376f3309599468cc22a5c5528ce3ad84
@@ -1 +0,0 @@
1
- 788dc7a233524ec8b7eed4a0f242bf546284f3a2ea501806e2e90047c3221702430584413d684677dc330195a378feed1bb1956e2d980c8f689ebce716cf54b6
@@ -1 +0,0 @@
1
- ec6173e86a8ac7f1e588b08dc6ff96b1
@@ -1 +0,0 @@
1
- f071c18852f0767d13d3b64a54aac75cb42108bd
@@ -1 +0,0 @@
1
- c04258a22308940aa735f6f81a47fa83d842db257c39396b2e3d9007cb6802fb
@@ -1 +0,0 @@
1
- 24e656ae1e397c8abea2fb5a2d49bc826a58f84afd58b3104ff22cede3fcf720f86ac532223279fa5efda5c402d0c75f3ab700bdcbb5b0847c2618028243c04c
@@ -1 +0,0 @@
1
- 8af300dc73a015cee99929df946b62705307d374
@@ -1 +0,0 @@
1
- 2d4e884d1d445423d4608a09248b9d49434fabb2e18c059dc4a2d78d66a55fe8
@@ -1 +0,0 @@
1
- 7ef41b17be6853a76e87a0b4a155f37861c02033bbb6ff137775ff9de82452e2ca6fa5e5b92e8a45c103ce4f43ae2e7557389f222468a48dfc3c1237f78db180
@@ -1 +0,0 @@
1
- e0d09d44f4f69b2700d13613441e6a47
@@ -1 +0,0 @@
1
- 3f3e8b7f098233c4c770b721cff0cc4fb302d55b
@@ -1 +0,0 @@
1
- 4f11274efe940c9970dcda4dd3ebd5d0d18adbdc37a0b17b5fed4bab2c8b5a91
@@ -1 +0,0 @@
1
- 455e2a3ebec70972f19e10afa615cfd2a1e82e61d2cd40b6c93711799eb9863253c60fe661b61fe9a8ceca4faf23d86a3eb6689baa0c7f929e56cf0b27989692