@expo/ui 56.0.2 → 56.0.3

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 (77) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/android/build.gradle +2 -2
  3. package/android/src/main/java/expo/modules/ui/ExpoUIModule.kt +6 -0
  4. package/android/src/main/java/expo/modules/ui/MaskView.kt +56 -0
  5. package/build/community/masked-view/MaskedView.android.d.ts +8 -0
  6. package/build/community/masked-view/MaskedView.android.d.ts.map +1 -0
  7. package/build/community/masked-view/MaskedView.d.ts +10 -0
  8. package/build/community/masked-view/MaskedView.d.ts.map +1 -0
  9. package/build/community/masked-view/MaskedView.ios.d.ts +8 -0
  10. package/build/community/masked-view/MaskedView.ios.d.ts.map +1 -0
  11. package/build/community/masked-view/index.d.ts +4 -0
  12. package/build/community/masked-view/index.d.ts.map +1 -0
  13. package/build/community/masked-view/types.d.ts +19 -0
  14. package/build/community/masked-view/types.d.ts.map +1 -0
  15. package/build/community/picker/Picker.android.d.ts +10 -2
  16. package/build/community/picker/Picker.android.d.ts.map +1 -1
  17. package/build/community/picker/Picker.d.ts +10 -2
  18. package/build/community/picker/Picker.d.ts.map +1 -1
  19. package/build/community/picker/Picker.ios.d.ts +10 -2
  20. package/build/community/picker/Picker.ios.d.ts.map +1 -1
  21. package/build/community/picker/types.d.ts +12 -10
  22. package/build/community/picker/types.d.ts.map +1 -1
  23. package/build/jetpack-compose/modifiers/index.d.ts +1 -1
  24. package/expo-module.config.json +1 -1
  25. package/local-maven-repo/expo/modules/ui/expo.modules.ui/{56.0.2/expo.modules.ui-56.0.2-sources.jar → 56.0.3/expo.modules.ui-56.0.3-sources.jar} +0 -0
  26. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.3/expo.modules.ui-56.0.3-sources.jar.md5 +1 -0
  27. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.3/expo.modules.ui-56.0.3-sources.jar.sha1 +1 -0
  28. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.3/expo.modules.ui-56.0.3-sources.jar.sha256 +1 -0
  29. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.3/expo.modules.ui-56.0.3-sources.jar.sha512 +1 -0
  30. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.3/expo.modules.ui-56.0.3.aar +0 -0
  31. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.3/expo.modules.ui-56.0.3.aar.md5 +1 -0
  32. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.3/expo.modules.ui-56.0.3.aar.sha1 +1 -0
  33. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.3/expo.modules.ui-56.0.3.aar.sha256 +1 -0
  34. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.3/expo.modules.ui-56.0.3.aar.sha512 +1 -0
  35. package/local-maven-repo/expo/modules/ui/expo.modules.ui/{56.0.2/expo.modules.ui-56.0.2.module → 56.0.3/expo.modules.ui-56.0.3.module} +23 -23
  36. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.3/expo.modules.ui-56.0.3.module.md5 +1 -0
  37. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.3/expo.modules.ui-56.0.3.module.sha1 +1 -0
  38. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.3/expo.modules.ui-56.0.3.module.sha256 +1 -0
  39. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.3/expo.modules.ui-56.0.3.module.sha512 +1 -0
  40. package/local-maven-repo/expo/modules/ui/expo.modules.ui/{56.0.2/expo.modules.ui-56.0.2.pom → 56.0.3/expo.modules.ui-56.0.3.pom} +2 -2
  41. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.3/expo.modules.ui-56.0.3.pom.md5 +1 -0
  42. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.3/expo.modules.ui-56.0.3.pom.sha1 +1 -0
  43. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.3/expo.modules.ui-56.0.3.pom.sha256 +1 -0
  44. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.3/expo.modules.ui-56.0.3.pom.sha512 +1 -0
  45. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml +4 -4
  46. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.md5 +1 -1
  47. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.sha1 +1 -1
  48. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.sha256 +1 -1
  49. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.sha512 +1 -1
  50. package/package.json +8 -4
  51. package/src/community/masked-view/MaskedView.android.tsx +40 -0
  52. package/src/community/masked-view/MaskedView.ios.tsx +32 -0
  53. package/src/community/masked-view/MaskedView.tsx +34 -0
  54. package/src/community/masked-view/index.tsx +3 -0
  55. package/src/community/masked-view/types.ts +19 -0
  56. package/src/community/picker/Picker.android.tsx +12 -5
  57. package/src/community/picker/Picker.ios.tsx +9 -6
  58. package/src/community/picker/Picker.tsx +3 -4
  59. package/src/community/picker/types.tsx +24 -18
  60. package/src/jetpack-compose/modifiers/index.ts +1 -1
  61. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.2/expo.modules.ui-56.0.2-sources.jar.md5 +0 -1
  62. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.2/expo.modules.ui-56.0.2-sources.jar.sha1 +0 -1
  63. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.2/expo.modules.ui-56.0.2-sources.jar.sha256 +0 -1
  64. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.2/expo.modules.ui-56.0.2-sources.jar.sha512 +0 -1
  65. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.2/expo.modules.ui-56.0.2.aar +0 -0
  66. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.2/expo.modules.ui-56.0.2.aar.md5 +0 -1
  67. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.2/expo.modules.ui-56.0.2.aar.sha1 +0 -1
  68. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.2/expo.modules.ui-56.0.2.aar.sha256 +0 -1
  69. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.2/expo.modules.ui-56.0.2.aar.sha512 +0 -1
  70. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.2/expo.modules.ui-56.0.2.module.md5 +0 -1
  71. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.2/expo.modules.ui-56.0.2.module.sha1 +0 -1
  72. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.2/expo.modules.ui-56.0.2.module.sha256 +0 -1
  73. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.2/expo.modules.ui-56.0.2.module.sha512 +0 -1
  74. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.2/expo.modules.ui-56.0.2.pom.md5 +0 -1
  75. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.2/expo.modules.ui-56.0.2.pom.sha1 +0 -1
  76. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.2/expo.modules.ui-56.0.2.pom.sha256 +0 -1
  77. package/local-maven-repo/expo/modules/ui/expo.modules.ui/56.0.2/expo.modules.ui-56.0.2.pom.sha512 +0 -1
package/CHANGELOG.md CHANGED
@@ -10,6 +10,10 @@
10
10
 
11
11
  ### 💡 Others
12
12
 
13
+ ## 56.0.3 — 2026-05-07
14
+
15
+ _This version does not introduce any user-facing changes._
16
+
13
17
  ## 56.0.2 — 2026-05-06
14
18
 
15
19
  ### 🐛 Bug fixes
@@ -39,6 +43,7 @@ _This version does not introduce any user-facing changes._
39
43
  - [android] Add `colors` prop to `HorizontalFloatingToolbar` to override the variant's default toolbar and FAB container/content colors. ([#45244](https://github.com/expo/expo/pull/45244) by [@Ubax](https://github.com/Ubax))
40
44
  - [android] Added `HorizontalPager` component wrapping Compose's `HorizontalPager`. ([#45163](https://github.com/expo/expo/pull/45163) by [@vonovak](https://github.com/vonovak))
41
45
  - [compose] Added worklet and `ObservableState` support to `TextField`. Added `value` prop accepting `ObservableState<string | TextFieldValue>` (create via `useNativeState`). `onValueChange` now supports worklets for synchronous UI-thread updates. Added `TextFieldValue` type with `text` + `selection` for worklet-driven caret control. Replaced `defaultValue`, callers pass state via `useNativeState` or omit for an empty field. ([#45024](https://github.com/expo/expo/pull/45024) by [@nishan](https://github.com/intergalacticspacehighway))
46
+ - Added `@expo/ui/community/masked-view` — a drop-in replacement for `@react-native-masked-view/masked-view`. ([#45488](https://github.com/expo/expo/pull/45488) by [@vonovak](https://github.com/vonovak))
42
47
  - [android] Add `WorkletCallback` shared object for synchronous UI thread callbacks. ([#44681](https://github.com/expo/expo/pull/44681) by [@nishan](https://github.com/intergalacticspacehighway))
43
48
  - [android] Add `ObservableState` shared object and `useNativeState` hook for controlling native Compose state from JS. ([#44655](https://github.com/expo/expo/pull/44655) by [@intergalacticspacehighway](https://github.com/intergalacticspacehighway))
44
49
  - [iOS] Added `Mask` component wrapping SwiftUI's `.mask(alignment:_:)` modifier, with a `Mask.Content` slot for the mask element. ([#44934](https://github.com/expo/expo/pull/44934) by [@vonovak](https://github.com/vonovak))
@@ -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.2'
15
+ version = '56.0.3'
16
16
 
17
17
  android {
18
18
  namespace "expo.modules.ui"
19
19
  defaultConfig {
20
20
  versionCode 1
21
- versionName "56.0.2"
21
+ versionName "56.0.3"
22
22
  testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
23
23
  }
24
24
  buildFeatures {
@@ -672,6 +672,12 @@ class ExpoUIModule : Module() {
672
672
  }
673
673
  }
674
674
 
675
+ ExpoUIView<MaskViewProps>("MaskView") {
676
+ Content { props ->
677
+ MaskViewContent(props)
678
+ }
679
+ }
680
+
675
681
  //endregion Expo UI views
676
682
  }
677
683
  }
@@ -0,0 +1,56 @@
1
+ package expo.modules.ui
2
+
3
+ import androidx.compose.foundation.layout.Box
4
+ import androidx.compose.runtime.Composable
5
+ import androidx.compose.ui.Modifier
6
+ import androidx.compose.ui.draw.drawWithContent
7
+ import androidx.compose.ui.graphics.BlendMode
8
+ import androidx.compose.ui.graphics.CompositingStrategy
9
+ import androidx.compose.ui.graphics.graphicsLayer
10
+ import androidx.compose.ui.graphics.layer.drawLayer
11
+ import androidx.compose.ui.graphics.rememberGraphicsLayer
12
+ import expo.modules.kotlin.views.ComposeProps
13
+ import expo.modules.kotlin.views.FunctionalComposableScope
14
+ import expo.modules.kotlin.views.OptimizedComposeProps
15
+ import expo.modules.ui.convertibles.ContentAlignment
16
+
17
+ @OptimizedComposeProps
18
+ data class MaskViewProps(
19
+ val alignment: ContentAlignment = ContentAlignment.CENTER,
20
+ val modifiers: ModifierList = emptyList()
21
+ ) : ComposeProps
22
+
23
+ @Composable
24
+ fun FunctionalComposableScope.MaskViewContent(props: MaskViewProps) {
25
+ val maskSlotView = findChildSlotView(view, "content")
26
+ val maskLayer = rememberGraphicsLayer().apply { blendMode = BlendMode.DstIn }
27
+
28
+ Box(
29
+ modifier = ModifierRegistry
30
+ .applyModifiers(props.modifiers, appContext, composableScope, globalEventDispatcher)
31
+ .graphicsLayer { compositingStrategy = CompositingStrategy.Offscreen }
32
+ .drawWithContent {
33
+ drawContent()
34
+ drawLayer(maskLayer)
35
+ }
36
+ ) {
37
+ Children(UIComposableScope(), filter = { !isSlotView(it) })
38
+
39
+ if (maskSlotView != null) {
40
+ Box(
41
+ modifier = Modifier
42
+ .matchParentSize()
43
+ .drawWithContent {
44
+ maskLayer.record { this@drawWithContent.drawContent() }
45
+ },
46
+ contentAlignment = props.alignment.toComposeAlignment()
47
+ ) {
48
+ with(UIComposableScope()) {
49
+ with(maskSlotView) {
50
+ Content()
51
+ }
52
+ }
53
+ }
54
+ }
55
+ }
56
+ }
@@ -0,0 +1,8 @@
1
+ import type { MaskedViewProps } from './types';
2
+ /**
3
+ * Android implementation of `MaskedView`. Bridges arbitrary React Native children
4
+ * (and `maskElement`) into the Compose `MaskView` primitive via `RNHostView`.
5
+ */
6
+ export declare function MaskedView(props: MaskedViewProps): import("react/jsx-runtime").JSX.Element;
7
+ export default MaskedView;
8
+ //# sourceMappingURL=MaskedView.android.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MaskedView.android.d.ts","sourceRoot":"","sources":["../../../src/community/masked-view/MaskedView.android.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAY/C;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,2CAkBhD;AAED,eAAe,UAAU,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { MaskedViewProps } from './types';
2
+ /**
3
+ * Renders `children` with the alpha channel of `maskElement` applied as a mask:
4
+ * opaque pixels of `maskElement` reveal `children`, transparent pixels hide them.
5
+ *
6
+ * API-compatible with `@react-native-masked-view/masked-view`.
7
+ */
8
+ export declare function MaskedView(props: MaskedViewProps): import("react/jsx-runtime").JSX.Element;
9
+ export default MaskedView;
10
+ //# sourceMappingURL=MaskedView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MaskedView.d.ts","sourceRoot":"","sources":["../../../src/community/masked-view/MaskedView.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAI/C;;;;;GAKG;AAGH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,2CAgBhD;AAED,eAAe,UAAU,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { MaskedViewProps } from './types';
2
+ /**
3
+ * iOS implementation of `MaskedView`. Bridges arbitrary React Native children
4
+ * (and `maskElement`) into the SwiftUI `Mask` primitive via `RNHostView`.
5
+ */
6
+ export declare function MaskedView(props: MaskedViewProps): import("react/jsx-runtime").JSX.Element;
7
+ export default MaskedView;
8
+ //# sourceMappingURL=MaskedView.ios.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MaskedView.ios.d.ts","sourceRoot":"","sources":["../../../src/community/masked-view/MaskedView.ios.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAK/C;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,2CAkBhD;AAED,eAAe,UAAU,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { MaskedView } from './MaskedView';
2
+ export { MaskedView as default } from './MaskedView';
3
+ export type { MaskedViewProps } from './types';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/community/masked-view/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,UAAU,IAAI,OAAO,EAAE,MAAM,cAAc,CAAC;AACrD,YAAY,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { ReactElement, ReactNode } from 'react';
2
+ import type { ViewProps } from 'react-native';
3
+ /**
4
+ * Drop-in props for `@react-native-masked-view/masked-view`'s `MaskedView`.
5
+ *
6
+ * @see https://github.com/callstack/masked-view
7
+ */
8
+ export interface MaskedViewProps extends ViewProps {
9
+ /**
10
+ * The element used as the mask. Only opaque pixels of `maskElement` make the
11
+ * masked content visible — transparent pixels hide it.
12
+ */
13
+ maskElement: ReactElement;
14
+ /**
15
+ * Content rendered behind the mask.
16
+ */
17
+ children?: ReactNode;
18
+ }
19
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/community/masked-view/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C;;;;GAIG;AACH,MAAM,WAAW,eAAgB,SAAQ,SAAS;IAChD;;;OAGG;IACH,WAAW,EAAE,YAAY,CAAC;IAC1B;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB"}
@@ -1,3 +1,11 @@
1
- import { type PickerWithItems } from './types';
2
- export declare const Picker: PickerWithItems;
1
+ import * as React from 'react';
2
+ import { type PickerItemProps, type PickerItemValue, type PickerProps } from './types';
3
+ /**
4
+ * A drop-in replacement for `@react-native-picker/picker` on Android.
5
+ * Renders a Material 3 `ExposedDropdownMenuBox` wrapped in a Host.
6
+ */
7
+ export declare function Picker<T extends PickerItemValue>(props: PickerProps<T>): import("react/jsx-runtime").JSX.Element;
8
+ export declare namespace Picker {
9
+ var Item: React.ComponentType<PickerItemProps>;
10
+ }
3
11
  //# sourceMappingURL=Picker.android.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Picker.android.d.ts","sourceRoot":"","sources":["../../../src/community/picker/Picker.android.tsx"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,eAAe,EAGrB,MAAM,SAAS,CAAC;AAyDjB,eAAO,MAAM,MAAM,EAAE,eAAiE,CAAC"}
1
+ {"version":3,"file":"Picker.android.d.ts","sourceRoot":"","sources":["../../../src/community/picker/Picker.android.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,WAAW,EACjB,MAAM,SAAS,CAAC;AAYjB;;;GAGG;AACH,wBAAgB,MAAM,CAAC,CAAC,SAAS,eAAe,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,2CA8CtE;yBA9Ce,MAAM"}
@@ -1,3 +1,11 @@
1
- import { type PickerWithItems } from './types';
2
- export declare const Picker: PickerWithItems;
1
+ import * as React from 'react';
2
+ import { type PickerItemProps, type PickerItemValue, type PickerProps } from './types';
3
+ /**
4
+ * A drop-in replacement for `@react-native-picker/picker` on web.
5
+ * Renders a native `<select>` element.
6
+ */
7
+ export declare function Picker<T extends PickerItemValue>(props: PickerProps<T>): import("react/jsx-runtime").JSX.Element;
8
+ export declare namespace Picker {
9
+ var Item: React.ComponentType<PickerItemProps>;
10
+ }
3
11
  //# sourceMappingURL=Picker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Picker.d.ts","sourceRoot":"","sources":["../../../src/community/picker/Picker.tsx"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,eAAe,EAGrB,MAAM,SAAS,CAAC;AA0CjB,eAAO,MAAM,MAAM,EAAE,eAAiE,CAAC"}
1
+ {"version":3,"file":"Picker.d.ts","sourceRoot":"","sources":["../../../src/community/picker/Picker.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,WAAW,EACjB,MAAM,SAAS,CAAC;AAEjB;;;GAGG;AACH,wBAAgB,MAAM,CAAC,CAAC,SAAS,eAAe,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,2CAiCtE;yBAjCe,MAAM"}
@@ -1,3 +1,11 @@
1
- import { type PickerWithItems } from './types';
2
- export declare const Picker: PickerWithItems;
1
+ import * as React from 'react';
2
+ import { type PickerItemProps, type PickerItemValue, type PickerProps } from './types';
3
+ /**
4
+ * A drop-in replacement for `@react-native-picker/picker` on iOS.
5
+ * Renders a SwiftUI wheel picker wrapped in a Host.
6
+ */
7
+ export declare function Picker<T extends PickerItemValue>(props: PickerProps<T>): import("react/jsx-runtime").JSX.Element;
8
+ export declare namespace Picker {
9
+ var Item: React.ComponentType<PickerItemProps>;
10
+ }
3
11
  //# sourceMappingURL=Picker.ios.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Picker.ios.d.ts","sourceRoot":"","sources":["../../../src/community/picker/Picker.ios.tsx"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,eAAe,EAGrB,MAAM,SAAS,CAAC;AAgEjB,eAAO,MAAM,MAAM,EAAE,eAAiE,CAAC"}
1
+ {"version":3,"file":"Picker.ios.d.ts","sourceRoot":"","sources":["../../../src/community/picker/Picker.ios.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,WAAW,EACjB,MAAM,SAAS,CAAC;AAejB;;;GAGG;AACH,wBAAgB,MAAM,CAAC,CAAC,SAAS,eAAe,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,2CA8CtE;yBA9Ce,MAAM"}
@@ -1,11 +1,11 @@
1
1
  import { type Ref, type ReactNode, type ReactElement } from 'react';
2
- import type { StyleProp, ViewStyle } from 'react-native';
2
+ import { type StyleProp, type TextStyle, type ViewStyle } from 'react-native';
3
3
  export type PickerItemValue = string | number | null;
4
4
  /**
5
5
  * Props for the `Picker.Item` component.
6
6
  * Compatible with `@react-native-picker/picker`.
7
7
  */
8
- export type PickerItemProps<T extends PickerItemValue> = {
8
+ export type PickerItemProps<T extends PickerItemValue = PickerItemValue> = {
9
9
  /**
10
10
  * Display text for the item.
11
11
  */
@@ -15,15 +15,19 @@ export type PickerItemProps<T extends PickerItemValue> = {
15
15
  */
16
16
  value?: T;
17
17
  /**
18
- * Text color for the item.
19
- * @platform ios
18
+ * Text color for the item. Equivalent to setting `color` in the `style` prop.
20
19
  */
21
20
  color?: string;
22
21
  /**
23
- * Custom font family for the item.
24
- * @platform ios
22
+ * Custom font family for the item. Equivalent to setting `fontFamily` in the `style` prop.
25
23
  */
26
24
  fontFamily?: string;
25
+ /**
26
+ * Style applied to the item label. Only the following values take effect:
27
+ * `color`, `backgroundColor`, `fontFamily`, and `fontSize`. When also set
28
+ * via the top-level `color` or `fontFamily` props, values from `style` win.
29
+ */
30
+ style?: StyleProp<TextStyle>;
27
31
  /**
28
32
  * Whether the item is enabled.
29
33
  * @platform android
@@ -89,15 +93,13 @@ export type PickerRef = {
89
93
  */
90
94
  blur: () => void;
91
95
  };
92
- export type PickerWithItems = {
93
- <T extends PickerItemValue>(props: PickerProps<T>): ReactElement | null;
94
- Item: typeof PickerItem;
95
- };
96
96
  export type ExtractedPickerItem<T extends PickerItemValue = PickerItemValue> = {
97
97
  label: string;
98
98
  value: T;
99
99
  color?: string;
100
+ backgroundColor?: string;
100
101
  fontFamily?: string;
102
+ fontSize?: number;
101
103
  enabled?: boolean;
102
104
  };
103
105
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/community/picker/types.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,GAAG,EAAE,KAAK,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AAC9F,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzD,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;AAErD;;;GAGG;AACH,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,eAAe,IAAI;IACvD;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,KAAK,CAAC,EAAE,CAAC,CAAC;IACV;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,eAAe,EAClD,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,GACzB,YAAY,GAAG,IAAI,CAErB;AAED;;;GAGG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,eAAe,GAAG,eAAe,IAAI;IACrE;;OAEG;IACH,GAAG,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;IACrB;;OAEG;IACH,aAAa,CAAC,EAAE,CAAC,CAAC;IAClB;;OAEG;IACH,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG;IACtB;;;OAGG;IACH,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB;;;OAGG;IACH,IAAI,EAAE,MAAM,IAAI,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,CAAC,CAAC,SAAS,eAAe,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,YAAY,GAAG,IAAI,CAAC;IACxE,IAAI,EAAE,OAAO,UAAU,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,mBAAmB,CAAC,CAAC,SAAS,eAAe,GAAG,eAAe,IAAI;IAC7E,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,eAAe,EAC1D,QAAQ,EAAE,SAAS,GAClB,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAa1B"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/community/picker/types.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,GAAG,EAAE,KAAK,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AAC9F,OAAO,EAAc,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAE1F,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;AAErD;;;GAGG;AACH,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,eAAe,GAAG,eAAe,IAAI;IACzE;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,KAAK,CAAC,EAAE,CAAC,CAAC;IACV;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,eAAe,EAClD,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,GACzB,YAAY,GAAG,IAAI,CAErB;AAED;;;GAGG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,eAAe,GAAG,eAAe,IAAI;IACrE;;OAEG;IACH,GAAG,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;IACrB;;OAEG;IACH,aAAa,CAAC,EAAE,CAAC,CAAC;IAClB;;OAEG;IACH,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG;IACtB;;;OAGG;IACH,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB;;;OAGG;IACH,IAAI,EAAE,MAAM,IAAI,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,mBAAmB,CAAC,CAAC,SAAS,eAAe,GAAG,eAAe,IAAI;IAC7E,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,eAAe,EAC1D,QAAQ,EAAE,SAAS,GAClB,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAkB1B"}
@@ -82,7 +82,7 @@ export declare const imePadding: () => import("./createModifier").ModifierConfig
82
82
  export declare const offset: (x: number, y: number) => import("./createModifier").ModifierConfig;
83
83
  /**
84
84
  * Sets the background color.
85
- * @param color - Color string (hex, e.g., '#FF0000').
85
+ * @param color - A color string (hex, e.g., `'#FF0000'`).
86
86
  */
87
87
  export declare const background: (color: ColorValue) => import("./createModifier").ModifierConfig;
88
88
  /**
@@ -10,7 +10,7 @@
10
10
  "publication": {
11
11
  "groupId": "expo.modules.ui",
12
12
  "artifactId": "expo.modules.ui",
13
- "version": "56.0.2",
13
+ "version": "56.0.3",
14
14
  "repository": "local-maven-repo"
15
15
  }
16
16
  }
@@ -0,0 +1 @@
1
+ 15482bf66b78fc5bb944571c2ee52b665c21b307
@@ -0,0 +1 @@
1
+ e144b778f1df5f7e73be22ffe120819c376f3309599468cc22a5c5528ce3ad84
@@ -0,0 +1 @@
1
+ 788dc7a233524ec8b7eed4a0f242bf546284f3a2ea501806e2e90047c3221702430584413d684677dc330195a378feed1bb1956e2d980c8f689ebce716cf54b6
@@ -0,0 +1 @@
1
+ f071c18852f0767d13d3b64a54aac75cb42108bd
@@ -0,0 +1 @@
1
+ c04258a22308940aa735f6f81a47fa83d842db257c39396b2e3d9007cb6802fb
@@ -0,0 +1 @@
1
+ 24e656ae1e397c8abea2fb5a2d49bc826a58f84afd58b3104ff22cede3fcf720f86ac532223279fa5efda5c402d0c75f3ab700bdcbb5b0847c2618028243c04c
@@ -3,7 +3,7 @@
3
3
  "component": {
4
4
  "group": "expo.modules.ui",
5
5
  "module": "expo.modules.ui",
6
- "version": "56.0.2",
6
+ "version": "56.0.3",
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.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"
27
+ "name": "expo.modules.ui-56.0.3.aar",
28
+ "url": "expo.modules.ui-56.0.3.aar",
29
+ "size": 1740154,
30
+ "sha512": "24e656ae1e397c8abea2fb5a2d49bc826a58f84afd58b3104ff22cede3fcf720f86ac532223279fa5efda5c402d0c75f3ab700bdcbb5b0847c2618028243c04c",
31
+ "sha256": "c04258a22308940aa735f6f81a47fa83d842db257c39396b2e3d9007cb6802fb",
32
+ "sha1": "f071c18852f0767d13d3b64a54aac75cb42108bd",
33
+ "md5": "ec6173e86a8ac7f1e588b08dc6ff96b1"
34
34
  }
35
35
  ]
36
36
  },
@@ -135,19 +135,19 @@
135
135
  "group": "io.github.lukmccall.pika",
136
136
  "module": "pika-api",
137
137
  "version": {
138
- "requires": "0.2.1-2.1.20"
138
+ "requires": "0.3.2"
139
139
  }
140
140
  }
141
141
  ],
142
142
  "files": [
143
143
  {
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"
144
+ "name": "expo.modules.ui-56.0.3.aar",
145
+ "url": "expo.modules.ui-56.0.3.aar",
146
+ "size": 1740154,
147
+ "sha512": "24e656ae1e397c8abea2fb5a2d49bc826a58f84afd58b3104ff22cede3fcf720f86ac532223279fa5efda5c402d0c75f3ab700bdcbb5b0847c2618028243c04c",
148
+ "sha256": "c04258a22308940aa735f6f81a47fa83d842db257c39396b2e3d9007cb6802fb",
149
+ "sha1": "f071c18852f0767d13d3b64a54aac75cb42108bd",
150
+ "md5": "ec6173e86a8ac7f1e588b08dc6ff96b1"
151
151
  }
152
152
  ]
153
153
  },
@@ -161,13 +161,13 @@
161
161
  },
162
162
  "files": [
163
163
  {
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"
164
+ "name": "expo.modules.ui-56.0.3-sources.jar",
165
+ "url": "expo.modules.ui-56.0.3-sources.jar",
166
+ "size": 82167,
167
+ "sha512": "788dc7a233524ec8b7eed4a0f242bf546284f3a2ea501806e2e90047c3221702430584413d684677dc330195a378feed1bb1956e2d980c8f689ebce716cf54b6",
168
+ "sha256": "e144b778f1df5f7e73be22ffe120819c376f3309599468cc22a5c5528ce3ad84",
169
+ "sha1": "15482bf66b78fc5bb944571c2ee52b665c21b307",
170
+ "md5": "813c4db4263146688584a4c5f309f653"
171
171
  }
172
172
  ]
173
173
  }
@@ -0,0 +1 @@
1
+ 5a7ca98cf0b7d42beb78532a4de00ee4d1597e6e
@@ -0,0 +1 @@
1
+ 1b1e0569740ff5fbfa0a3412f1efbf8f7a5b3d577239f108ba4a5d51b39d41e6
@@ -0,0 +1 @@
1
+ 5d627db27038fcf6c659f4b5d030a112c19097b15258e490b60da47867204ddffed145a62b649b24be23e8ddb6668b98c31a14059489398be5c8f76782138a82
@@ -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.2</version>
12
+ <version>56.0.3</version>
13
13
  <packaging>aar</packaging>
14
14
  <name>expo.modules.ui</name>
15
15
  <url>https://github.com/expo/expo</url>
@@ -117,7 +117,7 @@
117
117
  <dependency>
118
118
  <groupId>io.github.lukmccall.pika</groupId>
119
119
  <artifactId>pika-api</artifactId>
120
- <version>0.2.1-2.1.20</version>
120
+ <version>0.3.2</version>
121
121
  <scope>runtime</scope>
122
122
  </dependency>
123
123
  </dependencies>
@@ -0,0 +1 @@
1
+ b6801cacf665cc9e2aecf9d0bb04c98f0ed1aa29
@@ -0,0 +1 @@
1
+ 8879720c37c6bebdc6150d3fed464da86ddcece3b0e75759ce3ab7f48943fe06
@@ -0,0 +1 @@
1
+ 2ecda699c389b7f19611c8a6c00c5011f69fdfb9d25c02997f93ee1e8037fc441b499a230e68ad1683bd3a3f3b5e08c139e04268319788a2c9852eb148bbb356
@@ -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.2</latest>
7
- <release>56.0.2</release>
6
+ <latest>56.0.3</latest>
7
+ <release>56.0.3</release>
8
8
  <versions>
9
- <version>56.0.2</version>
9
+ <version>56.0.3</version>
10
10
  </versions>
11
- <lastUpdated>20260506162907</lastUpdated>
11
+ <lastUpdated>20260507183248</lastUpdated>
12
12
  </versioning>
13
13
  </metadata>
@@ -1 +1 @@
1
- 62565e0bc43f40239455f1984b6f2783
1
+ 2702a9cd8caa702a371daaa128e279b6
@@ -1 +1 @@
1
- ede29291f881a1a89bcda42bec68cca142494629
1
+ 28b12bfa1f6047e1d7d83a26d0634e6ea132984d
@@ -1 +1 @@
1
- 6b80d88f119d1131b0152eb0c2bc170614baac7a8b4b601c46f98e77b3e6e638
1
+ bec6765e9b4021cab658bdd7166664ad2965e243fe454dceb03eee957a882710
@@ -1 +1 @@
1
- 13ed149e856276890b0fdc417974b41e8064a36cf93e2a59e2f8fdc2bb19f3d4df19eb6ea0d10f28194231b9774a27eb05ae835f6ad5a1dcba7c63c3755e11ef
1
+ 7d81095908e1c9f3e0480cb0787557ebc93b0721ba5da187bbabf0b2efb1f05ca77ff00d9fac3de537706e203024f5439428a890074ef651b619864bd44e2d44
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@expo/ui",
3
- "version": "56.0.2",
3
+ "version": "56.0.3",
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/masked-view": {
47
+ "types": "./build/community/masked-view/index.d.ts",
48
+ "default": "./src/community/masked-view/index.tsx"
49
+ },
46
50
  "./babel-plugin": {
47
51
  "types": "./plugin/babel-plugin.d.ts",
48
52
  "default": "./plugin/babel-plugin.js"
@@ -79,8 +83,8 @@
79
83
  "@types/react": "~19.2.0",
80
84
  "react-native-reanimated": "4.3.0",
81
85
  "react-native-worklets": "0.8.3",
82
- "expo": "56.0.0-preview.3",
83
- "expo-module-scripts": "56.0.1"
86
+ "expo": "56.0.0-preview.6",
87
+ "expo-module-scripts": "56.0.2"
84
88
  },
85
89
  "jest": {
86
90
  "preset": "expo-module-scripts"
@@ -108,7 +112,7 @@
108
112
  "optional": true
109
113
  }
110
114
  },
111
- "gitHead": "71ec800b2fa6133d22d69b70945132e22f1b7ae8",
115
+ "gitHead": "d7b4e5edff4bf2e619d2c2f16d158798c6d592ef",
112
116
  "scripts": {
113
117
  "build": "expo-module build",
114
118
  "clean": "expo-module clean",
@@ -0,0 +1,40 @@
1
+ import { requireNativeView } from 'expo';
2
+ import { StyleSheet, View } from 'react-native';
3
+
4
+ import type { MaskedViewProps } from './types';
5
+ import { Host } from '../../jetpack-compose/Host';
6
+ import { RNHostView } from '../../jetpack-compose/RNHostView';
7
+ import { Slot } from '../../jetpack-compose/SlotView';
8
+ import { fillMaxSize } from '../../jetpack-compose/modifiers';
9
+
10
+ const MaskNativeView: React.ComponentType<{
11
+ alignment?: 'topStart';
12
+ modifiers?: ReturnType<typeof fillMaxSize>[];
13
+ children?: React.ReactNode;
14
+ }> = requireNativeView('ExpoUI', 'MaskView');
15
+
16
+ /**
17
+ * Android implementation of `MaskedView`. Bridges arbitrary React Native children
18
+ * (and `maskElement`) into the Compose `MaskView` primitive via `RNHostView`.
19
+ */
20
+ export function MaskedView(props: MaskedViewProps) {
21
+ const { maskElement, children, style, ...viewProps } = props;
22
+ return (
23
+ <View {...viewProps} style={style}>
24
+ <Host style={StyleSheet.absoluteFill}>
25
+ <MaskNativeView alignment="topStart" modifiers={[fillMaxSize()]}>
26
+ <RNHostView modifiers={[fillMaxSize()]}>
27
+ <View style={[StyleSheet.absoluteFill, style]}>{children}</View>
28
+ </RNHostView>
29
+ <Slot slotName="content">
30
+ <RNHostView modifiers={[fillMaxSize()]}>
31
+ <View style={[StyleSheet.absoluteFill, style]}>{maskElement}</View>
32
+ </RNHostView>
33
+ </Slot>
34
+ </MaskNativeView>
35
+ </Host>
36
+ </View>
37
+ );
38
+ }
39
+
40
+ export default MaskedView;
@@ -0,0 +1,32 @@
1
+ import { StyleSheet, View } from 'react-native';
2
+
3
+ import type { MaskedViewProps } from './types';
4
+ import { Host } from '../../swift-ui/Host';
5
+ import { Mask } from '../../swift-ui/Mask';
6
+ import { RNHostView } from '../../swift-ui/RNHostView';
7
+
8
+ /**
9
+ * iOS implementation of `MaskedView`. Bridges arbitrary React Native children
10
+ * (and `maskElement`) into the SwiftUI `Mask` primitive via `RNHostView`.
11
+ */
12
+ export function MaskedView(props: MaskedViewProps) {
13
+ const { maskElement, children, style, ...viewProps } = props;
14
+ return (
15
+ <View {...viewProps} style={style}>
16
+ <Host style={StyleSheet.absoluteFill}>
17
+ <Mask alignment="topLeading">
18
+ <RNHostView>
19
+ <View style={[StyleSheet.absoluteFill, style]}>{children}</View>
20
+ </RNHostView>
21
+ <Mask.Content>
22
+ <RNHostView>
23
+ <View style={[StyleSheet.absoluteFill, style]}>{maskElement}</View>
24
+ </RNHostView>
25
+ </Mask.Content>
26
+ </Mask>
27
+ </Host>
28
+ </View>
29
+ );
30
+ }
31
+
32
+ export default MaskedView;
@@ -0,0 +1,34 @@
1
+ import { useEffect } from 'react';
2
+ import { View } from 'react-native';
3
+
4
+ import type { MaskedViewProps } from './types';
5
+
6
+ let warned = false;
7
+
8
+ /**
9
+ * Renders `children` with the alpha channel of `maskElement` applied as a mask:
10
+ * opaque pixels of `maskElement` reveal `children`, transparent pixels hide them.
11
+ *
12
+ * API-compatible with `@react-native-masked-view/masked-view`.
13
+ */
14
+ // This default file is used on platforms without a `.<platform>.tsx` override
15
+ // (notably web). It renders children unmasked and warns once.
16
+ export function MaskedView(props: MaskedViewProps) {
17
+ const { maskElement: _maskElement, children, style, ...rest } = props;
18
+ useEffect(() => {
19
+ if (!warned) {
20
+ warned = true;
21
+ console.warn(
22
+ '[@expo/ui/community/masked-view] MaskedView is not implemented on this platform. ' +
23
+ 'Children will render without a mask.'
24
+ );
25
+ }
26
+ }, []);
27
+ return (
28
+ <View {...rest} style={style}>
29
+ {children}
30
+ </View>
31
+ );
32
+ }
33
+
34
+ export default MaskedView;
@@ -0,0 +1,3 @@
1
+ export { MaskedView } from './MaskedView';
2
+ export { MaskedView as default } from './MaskedView';
3
+ export type { MaskedViewProps } from './types';
@@ -0,0 +1,19 @@
1
+ import type { ReactElement, ReactNode } from 'react';
2
+ import type { ViewProps } from 'react-native';
3
+
4
+ /**
5
+ * Drop-in props for `@react-native-masked-view/masked-view`'s `MaskedView`.
6
+ *
7
+ * @see https://github.com/callstack/masked-view
8
+ */
9
+ export interface MaskedViewProps extends ViewProps {
10
+ /**
11
+ * The element used as the mask. Only opaque pixels of `maskElement` make the
12
+ * masked content visible — transparent pixels hide it.
13
+ */
14
+ maskElement: ReactElement;
15
+ /**
16
+ * Content rendered behind the mask.
17
+ */
18
+ children?: ReactNode;
19
+ }
@@ -3,7 +3,7 @@ import * as React from 'react';
3
3
  import {
4
4
  extractPickerItems,
5
5
  PickerItem,
6
- type PickerWithItems,
6
+ type PickerItemProps,
7
7
  type PickerItemValue,
8
8
  type PickerProps,
9
9
  } from './types';
@@ -22,7 +22,7 @@ import { menuAnchor } from '../../jetpack-compose/modifiers';
22
22
  * A drop-in replacement for `@react-native-picker/picker` on Android.
23
23
  * Renders a Material 3 `ExposedDropdownMenuBox` wrapped in a Host.
24
24
  */
25
- function PickerImpl<T extends PickerItemValue>(props: PickerProps<T>) {
25
+ export function Picker<T extends PickerItemValue>(props: PickerProps<T>) {
26
26
  const { selectedValue, onValueChange, enabled, style, children, ref } = props;
27
27
  const items = extractPickerItems<T>(children);
28
28
  const [expanded, setExpanded] = React.useState(false);
@@ -52,7 +52,15 @@ function PickerImpl<T extends PickerItemValue>(props: PickerProps<T>) {
52
52
  setExpanded(false);
53
53
  }}>
54
54
  <DropdownMenuItem.Text>
55
- <Text>{item.label}</Text>
55
+ <Text
56
+ color={item.color}
57
+ style={{
58
+ fontFamily: item.fontFamily,
59
+ fontSize: item.fontSize,
60
+ background: item.backgroundColor,
61
+ }}>
62
+ {item.label}
63
+ </Text>
56
64
  </DropdownMenuItem.Text>
57
65
  </DropdownMenuItem>
58
66
  ))}
@@ -62,5 +70,4 @@ function PickerImpl<T extends PickerItemValue>(props: PickerProps<T>) {
62
70
  );
63
71
  }
64
72
 
65
- PickerImpl.displayName = 'Picker';
66
- export const Picker: PickerWithItems = Object.assign(PickerImpl, { Item: PickerItem });
73
+ Picker.Item = PickerItem as React.ComponentType<PickerItemProps>;
@@ -3,7 +3,7 @@ import * as React from 'react';
3
3
  import {
4
4
  extractPickerItems,
5
5
  PickerItem,
6
- type PickerWithItems,
6
+ type PickerItemProps,
7
7
  type PickerItemValue,
8
8
  type PickerProps,
9
9
  } from './types';
@@ -11,6 +11,7 @@ import { Host } from '../../swift-ui/Host';
11
11
  import { Picker as SwiftUIPicker } from '../../swift-ui/Picker';
12
12
  import { Text } from '../../swift-ui/Text';
13
13
  import {
14
+ backgroundOverlay,
14
15
  disabled as disabledModifier,
15
16
  fixedSize,
16
17
  foregroundStyle,
@@ -24,7 +25,7 @@ import { type ModifierConfig } from '../../types';
24
25
  * A drop-in replacement for `@react-native-picker/picker` on iOS.
25
26
  * Renders a SwiftUI wheel picker wrapped in a Host.
26
27
  */
27
- function PickerImpl<T extends PickerItemValue>(props: PickerProps<T>) {
28
+ export function Picker<T extends PickerItemValue>(props: PickerProps<T>) {
28
29
  const { selectedValue, onValueChange, enabled, style, children, ref } = props;
29
30
  const items = extractPickerItems<T>(children);
30
31
  const modifiers = [
@@ -55,8 +56,11 @@ function PickerImpl<T extends PickerItemValue>(props: PickerProps<T>) {
55
56
  if (item.color) {
56
57
  itemModifiers.push(foregroundStyle(item.color));
57
58
  }
58
- if (item.fontFamily) {
59
- itemModifiers.push(font({ family: item.fontFamily }));
59
+ if (item.fontFamily || item.fontSize != null) {
60
+ itemModifiers.push(font({ family: item.fontFamily, size: item.fontSize }));
61
+ }
62
+ if (item.backgroundColor) {
63
+ itemModifiers.push(backgroundOverlay({ color: item.backgroundColor }));
60
64
  }
61
65
  return (
62
66
  <Text key={String(item.value ?? index)} modifiers={itemModifiers}>
@@ -69,5 +73,4 @@ function PickerImpl<T extends PickerItemValue>(props: PickerProps<T>) {
69
73
  );
70
74
  }
71
75
 
72
- PickerImpl.displayName = 'Picker';
73
- export const Picker: PickerWithItems = Object.assign(PickerImpl, { Item: PickerItem });
76
+ Picker.Item = PickerItem as React.ComponentType<PickerItemProps>;
@@ -3,7 +3,7 @@ import * as React from 'react';
3
3
  import {
4
4
  extractPickerItems,
5
5
  PickerItem,
6
- type PickerWithItems,
6
+ type PickerItemProps,
7
7
  type PickerItemValue,
8
8
  type PickerProps,
9
9
  } from './types';
@@ -12,7 +12,7 @@ import {
12
12
  * A drop-in replacement for `@react-native-picker/picker` on web.
13
13
  * Renders a native `<select>` element.
14
14
  */
15
- function PickerImpl<T extends PickerItemValue>(props: PickerProps<T>) {
15
+ export function Picker<T extends PickerItemValue>(props: PickerProps<T>) {
16
16
  const { selectedValue, onValueChange, enabled, style, children, ref } = props;
17
17
  const items = extractPickerItems<T>(children);
18
18
  const selectRef = React.useRef<HTMLSelectElement>(null);
@@ -47,5 +47,4 @@ function PickerImpl<T extends PickerItemValue>(props: PickerProps<T>) {
47
47
  );
48
48
  }
49
49
 
50
- PickerImpl.displayName = 'Picker';
51
- export const Picker: PickerWithItems = Object.assign(PickerImpl, { Item: PickerItem });
50
+ Picker.Item = PickerItem as React.ComponentType<PickerItemProps>;
@@ -1,5 +1,5 @@
1
1
  import { Children, isValidElement, type Ref, type ReactNode, type ReactElement } from 'react';
2
- import type { StyleProp, ViewStyle } from 'react-native';
2
+ import { StyleSheet, type StyleProp, type TextStyle, type ViewStyle } from 'react-native';
3
3
 
4
4
  export type PickerItemValue = string | number | null;
5
5
 
@@ -7,7 +7,7 @@ export type PickerItemValue = string | number | null;
7
7
  * Props for the `Picker.Item` component.
8
8
  * Compatible with `@react-native-picker/picker`.
9
9
  */
10
- export type PickerItemProps<T extends PickerItemValue> = {
10
+ export type PickerItemProps<T extends PickerItemValue = PickerItemValue> = {
11
11
  /**
12
12
  * Display text for the item.
13
13
  */
@@ -17,15 +17,19 @@ export type PickerItemProps<T extends PickerItemValue> = {
17
17
  */
18
18
  value?: T;
19
19
  /**
20
- * Text color for the item.
21
- * @platform ios
20
+ * Text color for the item. Equivalent to setting `color` in the `style` prop.
22
21
  */
23
22
  color?: string;
24
23
  /**
25
- * Custom font family for the item.
26
- * @platform ios
24
+ * Custom font family for the item. Equivalent to setting `fontFamily` in the `style` prop.
27
25
  */
28
26
  fontFamily?: string;
27
+ /**
28
+ * Style applied to the item label. Only the following values take effect:
29
+ * `color`, `backgroundColor`, `fontFamily`, and `fontSize`. When also set
30
+ * via the top-level `color` or `fontFamily` props, values from `style` win.
31
+ */
32
+ style?: StyleProp<TextStyle>;
29
33
  /**
30
34
  * Whether the item is enabled.
31
35
  * @platform android
@@ -99,16 +103,13 @@ export type PickerRef = {
99
103
  blur: () => void;
100
104
  };
101
105
 
102
- export type PickerWithItems = {
103
- <T extends PickerItemValue>(props: PickerProps<T>): ReactElement | null;
104
- Item: typeof PickerItem;
105
- };
106
-
107
106
  export type ExtractedPickerItem<T extends PickerItemValue = PickerItemValue> = {
108
107
  label: string;
109
108
  value: T;
110
109
  color?: string;
110
+ backgroundColor?: string;
111
111
  fontFamily?: string;
112
+ fontSize?: number;
112
113
  enabled?: boolean;
113
114
  };
114
115
 
@@ -123,11 +124,16 @@ export function extractPickerItems<T extends PickerItemValue>(
123
124
  (child): child is ReactElement<PickerItemProps<T>> =>
124
125
  isValidElement(child) && child.type === PickerItem
125
126
  )
126
- .map(({ props: { label = '', value, color, fontFamily, enabled } }) => ({
127
- label,
128
- value: value as T,
129
- color,
130
- fontFamily,
131
- enabled,
132
- }));
127
+ .map(({ props: { label = '', value, color, fontFamily, style, enabled } }) => {
128
+ const flat = StyleSheet.flatten(style);
129
+ return {
130
+ label,
131
+ value: value as T,
132
+ color: (flat?.color as string | undefined) ?? color,
133
+ backgroundColor: flat?.backgroundColor as string | undefined,
134
+ fontFamily: flat?.fontFamily ?? fontFamily,
135
+ fontSize: flat?.fontSize,
136
+ enabled,
137
+ };
138
+ });
133
139
  }
@@ -142,7 +142,7 @@ export const offset = (x: number, y: number) => createModifier('offset', { x, y
142
142
 
143
143
  /**
144
144
  * Sets the background color.
145
- * @param color - Color string (hex, e.g., '#FF0000').
145
+ * @param color - A color string (hex, e.g., `'#FF0000'`).
146
146
  */
147
147
  export const background = (color: ColorValue) => createModifier('background', { color });
148
148
 
@@ -1 +0,0 @@
1
- fcc61a62df8eb780a822914cee4b167b6e70519d
@@ -1 +0,0 @@
1
- 30e043f7f04143f7b44a22ed5db105d71be86f4aa49f21d082d3c9acd84ea32a
@@ -1 +0,0 @@
1
- 69bc561d70dc77219abb25903821b7f0f170b1a06c4cd40714ece8709b85404ad09bcd4fc9cbe67faf9a04e413a625e4880be8a5c78fd6426ed8f78f4b7ce4f6
@@ -1 +0,0 @@
1
- c9daa8165fdcd9ceb61785e0c560a949
@@ -1 +0,0 @@
1
- a60331ab720130c5c2ab6c627a68c5c8f15aa917
@@ -1 +0,0 @@
1
- 7c0946b01b4c9e3cc7c3790f36779a0d5ff3bb832562de233badb2168d613e45
@@ -1 +0,0 @@
1
- 222495b3d9e3c00846f79962ed79cdd46c2a2a2df76077b8752576200bfd728c3cc885cc0e0762869c57b24391882b9ee65ffa3f02a2c2490faa44e983640dd4
@@ -1 +0,0 @@
1
- 7462e9cebfaf3618633f57bc7ccb3b20a78b1535
@@ -1 +0,0 @@
1
- ee0321724e44b775e5f24bf1712946ac3d8e8d71fffb8f567cfd13a631a3fd49
@@ -1 +0,0 @@
1
- 30a3a47f5c5c292e336d0eaf7363d8e4efabd422856c4012f90ae524197559a099c8bb06597ab67b976bd35f9dcd6db468520ab1c0460a6a057a1c117cb1ad8d
@@ -1 +0,0 @@
1
- c2c86437b146e2fb044d5ec4d1ecf5fe
@@ -1 +0,0 @@
1
- ae97b3c0a7e08063fe763d3aa22eb4a39d49e893
@@ -1 +0,0 @@
1
- 94e0b9c22f4243dd3fae58fdff830551be50f8d9ee42e83c55c1dcb3dd50f6bb
@@ -1 +0,0 @@
1
- e716bb9fb13a6f3a41154d67632da322143d58a8313021c86a7725304a9b6159fb13672249e717876b6750f16d205dde1fd8291903c19e23835a3c626532ecfa