@expo/ui 55.0.0 → 55.0.2-canary-20260424-7bedc9d

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 (811) hide show
  1. package/CHANGELOG.md +103 -0
  2. package/CLAUDE.md +54 -0
  3. package/CONTRIBUTING.md +30 -0
  4. package/android/build.gradle +8 -7
  5. package/android/src/main/java/expo/modules/ui/AlertDialogView.kt +61 -28
  6. package/android/src/main/java/expo/modules/ui/AnimatedVisibilityView.kt +134 -0
  7. package/android/src/main/java/expo/modules/ui/BadgeView.kt +75 -0
  8. package/android/src/main/java/expo/modules/ui/BadgedBoxView.kt +25 -0
  9. package/android/src/main/java/expo/modules/ui/BasicAlertDialogView.kt +12 -3
  10. package/android/src/main/java/expo/modules/ui/BottomSheetView.kt +67 -5
  11. package/android/src/main/java/expo/modules/ui/CardView.kt +146 -37
  12. package/android/src/main/java/expo/modules/ui/CarouselView.kt +99 -68
  13. package/android/src/main/java/expo/modules/ui/CheckboxView.kt +103 -0
  14. package/android/src/main/java/expo/modules/ui/ChipView.kt +278 -142
  15. package/android/src/main/java/expo/modules/ui/ComposeViews.kt +6 -24
  16. package/android/src/main/java/expo/modules/ui/DatePickerView.kt +310 -31
  17. package/android/src/main/java/expo/modules/ui/DividerView.kt +23 -2
  18. package/android/src/main/java/expo/modules/ui/DockedSearchBarView.kt +4 -3
  19. package/android/src/main/java/expo/modules/ui/ExpoUIModule.kt +517 -159
  20. package/android/src/main/java/expo/modules/ui/ExposedDropdownMenuBoxComposableScope.kt +14 -0
  21. package/android/src/main/java/expo/modules/ui/HorizontalFloatingToolbarView.kt +25 -11
  22. package/android/src/main/java/expo/modules/ui/HostView.kt +24 -7
  23. package/android/src/main/java/expo/modules/ui/LazyColumnView.kt +7 -7
  24. package/android/src/main/java/expo/modules/ui/LazyRowView.kt +84 -0
  25. package/android/src/main/java/expo/modules/ui/ListItemView.kt +47 -36
  26. package/android/src/main/java/expo/modules/ui/ModifierRegistry.kt +253 -41
  27. package/android/src/main/java/expo/modules/ui/ProgressView.kt +196 -89
  28. package/android/src/main/java/expo/modules/ui/PullToRefreshBoxView.kt +24 -5
  29. package/android/src/main/java/expo/modules/ui/RNHostView.kt +208 -50
  30. package/android/src/main/java/expo/modules/ui/RadioButtonView.kt +5 -7
  31. package/android/src/main/java/expo/modules/ui/SearchBarView.kt +5 -4
  32. package/android/src/main/java/expo/modules/ui/SegmentedButtonView.kt +118 -0
  33. package/android/src/main/java/expo/modules/ui/SegmentedControlView.kt +36 -0
  34. package/android/src/main/java/expo/modules/ui/ShapeView.kt +5 -0
  35. package/android/src/main/java/expo/modules/ui/SliderView.kt +74 -12
  36. package/android/src/main/java/expo/modules/ui/SlotView.kt +18 -0
  37. package/android/src/main/java/expo/modules/ui/SpacerView.kt +2 -0
  38. package/android/src/main/java/expo/modules/ui/SurfaceView.kt +91 -12
  39. package/android/src/main/java/expo/modules/ui/SwitchView.kt +69 -107
  40. package/android/src/main/java/expo/modules/ui/SyncSwitchView.kt +37 -0
  41. package/android/src/main/java/expo/modules/ui/TextFieldView.kt +330 -0
  42. package/android/src/main/java/expo/modules/ui/TextView.kt +151 -12
  43. package/android/src/main/java/expo/modules/ui/ToggleButtonView.kt +99 -57
  44. package/android/src/main/java/expo/modules/ui/TooltipView.kt +170 -0
  45. package/android/src/main/java/expo/modules/ui/UIBaseView.kt +21 -6
  46. package/android/src/main/java/expo/modules/ui/UIComposableScope.kt +26 -0
  47. package/android/src/main/java/expo/modules/ui/Utils.kt +2 -0
  48. package/android/src/main/java/expo/modules/ui/button/Button.kt +124 -159
  49. package/android/src/main/java/expo/modules/ui/button/FloatingActionButton.kt +94 -0
  50. package/android/src/main/java/expo/modules/ui/button/IconButton.kt +75 -82
  51. package/android/src/main/java/expo/modules/ui/colors/MaterialColors.kt +152 -0
  52. package/android/src/main/java/expo/modules/ui/convertibles/AnimatableFloat.kt +26 -0
  53. package/android/src/main/java/expo/modules/ui/convertibles/AnimationSpecParams.kt +98 -0
  54. package/android/src/main/java/expo/modules/ui/convertibles/Arrangement.kt +3 -0
  55. package/android/src/main/java/expo/modules/ui/convertibles/GraphicsLayerParams.kt +26 -0
  56. package/android/src/main/java/expo/modules/ui/icon/IconView.kt +6 -2
  57. package/android/src/main/java/expo/modules/ui/menu/DropdownMenu.kt +39 -0
  58. package/android/src/main/java/expo/modules/ui/menu/DropdownMenuItem.kt +70 -0
  59. package/android/src/main/java/expo/modules/ui/menu/DropdownMenuRecords.kt +20 -0
  60. package/android/src/main/java/expo/modules/ui/menu/ExposedDropdownMenuBoxView.kt +32 -0
  61. package/android/src/main/java/expo/modules/ui/menu/ExposedDropdownMenuView.kt +42 -0
  62. package/android/src/main/java/expo/modules/ui/state/ObservableState.kt +25 -0
  63. package/android/src/main/java/expo/modules/ui/state/WorkletCallback.kt +26 -0
  64. package/build/State/index.fx.d.ts +2 -0
  65. package/build/State/index.fx.d.ts.map +1 -0
  66. package/build/State/optionalWorklets.d.ts +6 -0
  67. package/build/State/optionalWorklets.d.ts.map +1 -0
  68. package/build/State/useNativeState.d.ts +15 -0
  69. package/build/State/useNativeState.d.ts.map +1 -0
  70. package/build/State/useWorkletProp.d.ts +10 -0
  71. package/build/State/useWorkletProp.d.ts.map +1 -0
  72. package/build/State/utils.d.ts +6 -0
  73. package/build/State/utils.d.ts.map +1 -0
  74. package/build/community/picker/Picker.android.d.ts +3 -0
  75. package/build/community/picker/Picker.android.d.ts.map +1 -0
  76. package/build/community/picker/Picker.d.ts +3 -0
  77. package/build/community/picker/Picker.d.ts.map +1 -0
  78. package/build/community/picker/Picker.ios.d.ts +3 -0
  79. package/build/community/picker/Picker.ios.d.ts.map +1 -0
  80. package/build/community/picker/index.d.ts +5 -0
  81. package/build/community/picker/index.d.ts.map +1 -0
  82. package/build/community/picker/types.d.ts +107 -0
  83. package/build/community/picker/types.d.ts.map +1 -0
  84. package/build/community/segmented-control/SegmentedControl.android.d.ts +3 -0
  85. package/build/community/segmented-control/SegmentedControl.android.d.ts.map +1 -0
  86. package/build/community/segmented-control/SegmentedControl.d.ts +7 -0
  87. package/build/community/segmented-control/SegmentedControl.d.ts.map +1 -0
  88. package/build/community/segmented-control/SegmentedControl.ios.d.ts +3 -0
  89. package/build/community/segmented-control/SegmentedControl.ios.d.ts.map +1 -0
  90. package/build/community/segmented-control/index.d.ts +5 -0
  91. package/build/community/segmented-control/index.d.ts.map +1 -0
  92. package/build/community/segmented-control/types.d.ts +57 -0
  93. package/build/community/segmented-control/types.d.ts.map +1 -0
  94. package/build/community/segmented-control/vendor/SegmentedControl.d.ts +8 -0
  95. package/build/community/segmented-control/vendor/SegmentedControl.d.ts.map +1 -0
  96. package/build/community/segmented-control/vendor/SegmentedControlTab.d.ts +14 -0
  97. package/build/community/segmented-control/vendor/SegmentedControlTab.d.ts.map +1 -0
  98. package/build/community/segmented-control/vendor/SegmentsSeparators.d.ts +9 -0
  99. package/build/community/segmented-control/vendor/SegmentsSeparators.d.ts.map +1 -0
  100. package/build/datetime-picker/DateTimePicker.android.d.ts +3 -0
  101. package/build/datetime-picker/DateTimePicker.android.d.ts.map +1 -0
  102. package/build/datetime-picker/DateTimePicker.d.ts +3 -0
  103. package/build/datetime-picker/DateTimePicker.d.ts.map +1 -0
  104. package/build/datetime-picker/DateTimePicker.web.d.ts +3 -0
  105. package/build/datetime-picker/DateTimePicker.web.d.ts.map +1 -0
  106. package/build/datetime-picker/index.d.ts +5 -0
  107. package/build/datetime-picker/index.d.ts.map +1 -0
  108. package/build/datetime-picker/types.d.ts +128 -0
  109. package/build/datetime-picker/types.d.ts.map +1 -0
  110. package/build/jetpack-compose/AlertDialog/index.d.ts +72 -36
  111. package/build/jetpack-compose/AlertDialog/index.d.ts.map +1 -1
  112. package/build/jetpack-compose/AnimatedVisibility/index.d.ts +134 -0
  113. package/build/jetpack-compose/AnimatedVisibility/index.d.ts.map +1 -0
  114. package/build/jetpack-compose/AnimatedVisibility/symbols.d.ts +3 -0
  115. package/build/jetpack-compose/AnimatedVisibility/symbols.d.ts.map +1 -0
  116. package/build/jetpack-compose/Badge/index.d.ts +31 -0
  117. package/build/jetpack-compose/Badge/index.d.ts.map +1 -0
  118. package/build/jetpack-compose/BadgedBox/index.d.ts +29 -0
  119. package/build/jetpack-compose/BadgedBox/index.d.ts.map +1 -0
  120. package/build/jetpack-compose/BasicAlertDialog/index.d.ts +8 -3
  121. package/build/jetpack-compose/BasicAlertDialog/index.d.ts.map +1 -1
  122. package/build/jetpack-compose/Box/index.d.ts +14 -0
  123. package/build/jetpack-compose/Box/index.d.ts.map +1 -0
  124. package/build/jetpack-compose/Button/index.d.ts +66 -52
  125. package/build/jetpack-compose/Button/index.d.ts.map +1 -1
  126. package/build/jetpack-compose/Card/index.d.ts +72 -14
  127. package/build/jetpack-compose/Card/index.d.ts.map +1 -1
  128. package/build/jetpack-compose/Carousel/index.d.ts +86 -23
  129. package/build/jetpack-compose/Carousel/index.d.ts.map +1 -1
  130. package/build/jetpack-compose/Checkbox/index.d.ts +73 -0
  131. package/build/jetpack-compose/Checkbox/index.d.ts.map +1 -0
  132. package/build/jetpack-compose/Chip/index.d.ts +247 -27
  133. package/build/jetpack-compose/Chip/index.d.ts.map +1 -1
  134. package/build/jetpack-compose/Column/index.d.ts +22 -0
  135. package/build/jetpack-compose/Column/index.d.ts.map +1 -0
  136. package/build/jetpack-compose/DatePicker/index.d.ts +138 -4
  137. package/build/jetpack-compose/DatePicker/index.d.ts.map +1 -1
  138. package/build/jetpack-compose/Divider/index.d.ts +20 -5
  139. package/build/jetpack-compose/Divider/index.d.ts.map +1 -1
  140. package/build/jetpack-compose/DockedSearchBar/index.d.ts +3 -3
  141. package/build/jetpack-compose/DockedSearchBar/index.d.ts.map +1 -1
  142. package/build/jetpack-compose/DropdownMenu/DropdownMenuItem.d.ts +64 -0
  143. package/build/jetpack-compose/DropdownMenu/DropdownMenuItem.d.ts.map +1 -0
  144. package/build/jetpack-compose/DropdownMenu/index.d.ts +68 -0
  145. package/build/jetpack-compose/DropdownMenu/index.d.ts.map +1 -0
  146. package/build/jetpack-compose/ExposedDropdownMenuBox/ExposedDropdownMenu.d.ts +35 -0
  147. package/build/jetpack-compose/ExposedDropdownMenuBox/ExposedDropdownMenu.d.ts.map +1 -0
  148. package/build/jetpack-compose/ExposedDropdownMenuBox/index.d.ts +42 -0
  149. package/build/jetpack-compose/ExposedDropdownMenuBox/index.d.ts.map +1 -0
  150. package/build/jetpack-compose/FloatingActionButton/index.d.ts +150 -0
  151. package/build/jetpack-compose/FloatingActionButton/index.d.ts.map +1 -0
  152. package/build/jetpack-compose/FlowRow/index.d.ts +14 -0
  153. package/build/jetpack-compose/FlowRow/index.d.ts.map +1 -0
  154. package/build/jetpack-compose/HorizontalFloatingToolbar/index.d.ts +4 -4
  155. package/build/jetpack-compose/HorizontalFloatingToolbar/index.d.ts.map +1 -1
  156. package/build/jetpack-compose/Host/index.d.ts +14 -4
  157. package/build/jetpack-compose/Host/index.d.ts.map +1 -1
  158. package/build/jetpack-compose/Icon/index.d.ts +7 -7
  159. package/build/jetpack-compose/Icon/index.d.ts.map +1 -1
  160. package/build/jetpack-compose/IconButton/index.d.ts +45 -29
  161. package/build/jetpack-compose/IconButton/index.d.ts.map +1 -1
  162. package/build/jetpack-compose/LazyColumn/index.d.ts +2 -5
  163. package/build/jetpack-compose/LazyColumn/index.d.ts.map +1 -1
  164. package/build/jetpack-compose/LazyRow/index.d.ts +32 -0
  165. package/build/jetpack-compose/LazyRow/index.d.ts.map +1 -0
  166. package/build/jetpack-compose/ListItem/index.d.ts +34 -55
  167. package/build/jetpack-compose/ListItem/index.d.ts.map +1 -1
  168. package/build/jetpack-compose/ModalBottomSheet/index.d.ts +66 -14
  169. package/build/jetpack-compose/ModalBottomSheet/index.d.ts.map +1 -1
  170. package/build/jetpack-compose/MultiChoiceSegmentedButtonRow/index.d.ts +17 -0
  171. package/build/jetpack-compose/MultiChoiceSegmentedButtonRow/index.d.ts.map +1 -0
  172. package/build/jetpack-compose/Progress/index.d.ts +77 -35
  173. package/build/jetpack-compose/Progress/index.d.ts.map +1 -1
  174. package/build/jetpack-compose/PullToRefreshBox/index.d.ts +35 -10
  175. package/build/jetpack-compose/PullToRefreshBox/index.d.ts.map +1 -1
  176. package/build/jetpack-compose/RNHostView/index.d.ts +9 -15
  177. package/build/jetpack-compose/RNHostView/index.d.ts.map +1 -1
  178. package/build/jetpack-compose/RadioButton/index.d.ts +3 -3
  179. package/build/jetpack-compose/RadioButton/index.d.ts.map +1 -1
  180. package/build/jetpack-compose/Row/index.d.ts +22 -0
  181. package/build/jetpack-compose/Row/index.d.ts.map +1 -0
  182. package/build/jetpack-compose/SearchBar/index.d.ts +3 -3
  183. package/build/jetpack-compose/SearchBar/index.d.ts.map +1 -1
  184. package/build/jetpack-compose/SegmentedButton/index.d.ts +74 -0
  185. package/build/jetpack-compose/SegmentedButton/index.d.ts.map +1 -0
  186. package/build/jetpack-compose/Shape/index.d.ts +1 -1
  187. package/build/jetpack-compose/Shape/index.d.ts.map +1 -1
  188. package/build/jetpack-compose/SingleChoiceSegmentedButtonRow/index.d.ts +17 -0
  189. package/build/jetpack-compose/SingleChoiceSegmentedButtonRow/index.d.ts.map +1 -0
  190. package/build/jetpack-compose/Slider/index.d.ts +34 -10
  191. package/build/jetpack-compose/Slider/index.d.ts.map +1 -1
  192. package/build/jetpack-compose/SlotView.d.ts +7 -0
  193. package/build/jetpack-compose/SlotView.d.ts.map +1 -0
  194. package/build/jetpack-compose/Spacer/index.d.ts +4 -4
  195. package/build/jetpack-compose/Spacer/index.d.ts.map +1 -1
  196. package/build/jetpack-compose/Surface/index.d.ts +53 -3
  197. package/build/jetpack-compose/Surface/index.d.ts.map +1 -1
  198. package/build/jetpack-compose/Switch/index.d.ts +28 -50
  199. package/build/jetpack-compose/Switch/index.d.ts.map +1 -1
  200. package/build/jetpack-compose/SyncSwitch/index.d.ts +29 -0
  201. package/build/jetpack-compose/SyncSwitch/index.d.ts.map +1 -0
  202. package/build/jetpack-compose/Text/index.d.ts +77 -89
  203. package/build/jetpack-compose/Text/index.d.ts.map +1 -1
  204. package/build/jetpack-compose/TextField/index.d.ts +177 -0
  205. package/build/jetpack-compose/TextField/index.d.ts.map +1 -0
  206. package/build/jetpack-compose/ToggleButton/index.d.ts +60 -32
  207. package/build/jetpack-compose/ToggleButton/index.d.ts.map +1 -1
  208. package/build/jetpack-compose/Tooltip/index.d.ts +100 -0
  209. package/build/jetpack-compose/Tooltip/index.d.ts.map +1 -0
  210. package/build/jetpack-compose/colors.d.ts +171 -0
  211. package/build/jetpack-compose/colors.d.ts.map +1 -0
  212. package/build/jetpack-compose/index.d.ts +22 -9
  213. package/build/jetpack-compose/index.d.ts.map +1 -1
  214. package/build/jetpack-compose/layout-types.d.ts +26 -0
  215. package/build/jetpack-compose/layout-types.d.ts.map +1 -0
  216. package/build/jetpack-compose/layout.d.ts +5 -36
  217. package/build/jetpack-compose/layout.d.ts.map +1 -1
  218. package/build/jetpack-compose/modifiers/animation.d.ts +44 -0
  219. package/build/jetpack-compose/modifiers/animation.d.ts.map +1 -0
  220. package/build/jetpack-compose/modifiers/index.d.ts +116 -5
  221. package/build/jetpack-compose/modifiers/index.d.ts.map +1 -1
  222. package/build/swift-ui/AccessoryWidgetBackground/index.d.ts +4 -0
  223. package/build/swift-ui/AccessoryWidgetBackground/index.d.ts.map +1 -0
  224. package/build/swift-ui/BottomSheet/index.d.ts +1 -1
  225. package/build/swift-ui/BottomSheet/index.d.ts.map +1 -1
  226. package/build/swift-ui/Button/index.d.ts +1 -1
  227. package/build/swift-ui/Button/index.d.ts.map +1 -1
  228. package/build/swift-ui/Chart/index.d.ts +2 -2
  229. package/build/swift-ui/Chart/index.d.ts.map +1 -1
  230. package/build/swift-ui/ColorPicker/index.d.ts +1 -1
  231. package/build/swift-ui/ColorPicker/index.d.ts.map +1 -1
  232. package/build/swift-ui/ConfirmationDialog/index.d.ts +4 -4
  233. package/build/swift-ui/ConfirmationDialog/index.d.ts.map +1 -1
  234. package/build/swift-ui/ContentUnavailableView/index.d.ts +1 -1
  235. package/build/swift-ui/ContentUnavailableView/index.d.ts.map +1 -1
  236. package/build/swift-ui/ContextMenu/index.d.ts +5 -5
  237. package/build/swift-ui/ContextMenu/index.d.ts.map +1 -1
  238. package/build/swift-ui/ContextMenu/types.d.ts +1 -1
  239. package/build/swift-ui/ContextMenu/types.d.ts.map +1 -1
  240. package/build/swift-ui/ControlGroup/index.d.ts +29 -0
  241. package/build/swift-ui/ControlGroup/index.d.ts.map +1 -0
  242. package/build/swift-ui/DatePicker/index.d.ts +1 -1
  243. package/build/swift-ui/DatePicker/index.d.ts.map +1 -1
  244. package/build/swift-ui/DisclosureGroup/index.d.ts +1 -1
  245. package/build/swift-ui/DisclosureGroup/index.d.ts.map +1 -1
  246. package/build/swift-ui/Divider/index.d.ts +1 -1
  247. package/build/swift-ui/Divider/index.d.ts.map +1 -1
  248. package/build/swift-ui/Form/index.d.ts +1 -1
  249. package/build/swift-ui/Form/index.d.ts.map +1 -1
  250. package/build/swift-ui/Gauge/index.d.ts +1 -1
  251. package/build/swift-ui/Gauge/index.d.ts.map +1 -1
  252. package/build/swift-ui/GlassEffectContainer/index.d.ts +1 -1
  253. package/build/swift-ui/GlassEffectContainer/index.d.ts.map +1 -1
  254. package/build/swift-ui/Grid/index.d.ts +1 -1
  255. package/build/swift-ui/Grid/index.d.ts.map +1 -1
  256. package/build/swift-ui/Group/index.d.ts +1 -1
  257. package/build/swift-ui/Group/index.d.ts.map +1 -1
  258. package/build/swift-ui/HStack/index.d.ts +1 -1
  259. package/build/swift-ui/HStack/index.d.ts.map +1 -1
  260. package/build/swift-ui/Host/index.d.ts +2 -2
  261. package/build/swift-ui/Host/index.d.ts.map +1 -1
  262. package/build/swift-ui/Image/index.d.ts +11 -5
  263. package/build/swift-ui/Image/index.d.ts.map +1 -1
  264. package/build/swift-ui/Label/index.d.ts +1 -1
  265. package/build/swift-ui/Label/index.d.ts.map +1 -1
  266. package/build/swift-ui/LabeledContent/index.d.ts +1 -1
  267. package/build/swift-ui/LabeledContent/index.d.ts.map +1 -1
  268. package/build/swift-ui/LazyHStack/index.d.ts +14 -0
  269. package/build/swift-ui/LazyHStack/index.d.ts.map +1 -0
  270. package/build/swift-ui/LazyVStack/index.d.ts +14 -0
  271. package/build/swift-ui/LazyVStack/index.d.ts.map +1 -0
  272. package/build/swift-ui/Link/index.d.ts +36 -0
  273. package/build/swift-ui/Link/index.d.ts.map +1 -0
  274. package/build/swift-ui/List/ListForEach.d.ts +1 -1
  275. package/build/swift-ui/List/ListForEach.d.ts.map +1 -1
  276. package/build/swift-ui/List/index.d.ts +3 -3
  277. package/build/swift-ui/List/index.d.ts.map +1 -1
  278. package/build/swift-ui/Menu/index.d.ts +3 -3
  279. package/build/swift-ui/Menu/index.d.ts.map +1 -1
  280. package/build/swift-ui/Menu/types.d.ts +2 -2
  281. package/build/swift-ui/Menu/types.d.ts.map +1 -1
  282. package/build/swift-ui/Namespace.d.ts +1 -1
  283. package/build/swift-ui/Namespace.d.ts.map +1 -1
  284. package/build/swift-ui/Overlay/index.d.ts +18 -0
  285. package/build/swift-ui/Overlay/index.d.ts.map +1 -0
  286. package/build/swift-ui/Picker/index.d.ts +1 -1
  287. package/build/swift-ui/Picker/index.d.ts.map +1 -1
  288. package/build/swift-ui/Popover/index.d.ts +4 -4
  289. package/build/swift-ui/Popover/index.d.ts.map +1 -1
  290. package/build/swift-ui/ProgressView/index.d.ts +2 -6
  291. package/build/swift-ui/ProgressView/index.d.ts.map +1 -1
  292. package/build/swift-ui/RNHostView.d.ts +1 -1
  293. package/build/swift-ui/RNHostView.d.ts.map +1 -1
  294. package/build/swift-ui/ScrollView/index.d.ts +1 -1
  295. package/build/swift-ui/ScrollView/index.d.ts.map +1 -1
  296. package/build/swift-ui/Section/index.d.ts +1 -1
  297. package/build/swift-ui/Section/index.d.ts.map +1 -1
  298. package/build/swift-ui/SecureField/index.d.ts +12 -23
  299. package/build/swift-ui/SecureField/index.d.ts.map +1 -1
  300. package/build/swift-ui/Shapes/ConcentricRectangle.d.ts +2 -2
  301. package/build/swift-ui/Shapes/ConcentricRectangle.d.ts.map +1 -1
  302. package/build/swift-ui/Shapes/index.d.ts +6 -6
  303. package/build/swift-ui/Shapes/index.d.ts.map +1 -1
  304. package/build/swift-ui/ShareLink/index.d.ts +1 -1
  305. package/build/swift-ui/ShareLink/index.d.ts.map +1 -1
  306. package/build/swift-ui/Slider/index.d.ts +1 -1
  307. package/build/swift-ui/Slider/index.d.ts.map +1 -1
  308. package/build/swift-ui/SlotView.d.ts +5 -0
  309. package/build/swift-ui/SlotView.d.ts.map +1 -0
  310. package/build/swift-ui/Spacer/index.d.ts +1 -1
  311. package/build/swift-ui/Spacer/index.d.ts.map +1 -1
  312. package/build/swift-ui/Stepper/index.d.ts +4 -4
  313. package/build/swift-ui/Stepper/index.d.ts.map +1 -1
  314. package/build/swift-ui/SyncToggle/index.d.ts +29 -0
  315. package/build/swift-ui/SyncToggle/index.d.ts.map +1 -0
  316. package/build/swift-ui/TabView/Tab.d.ts +36 -0
  317. package/build/swift-ui/TabView/Tab.d.ts.map +1 -0
  318. package/build/swift-ui/TabView/index.d.ts +44 -0
  319. package/build/swift-ui/TabView/index.d.ts.map +1 -0
  320. package/build/swift-ui/Text/index.d.ts +34 -2
  321. package/build/swift-ui/Text/index.d.ts.map +1 -1
  322. package/build/swift-ui/TextField/index.d.ts +21 -67
  323. package/build/swift-ui/TextField/index.d.ts.map +1 -1
  324. package/build/swift-ui/Toggle/index.d.ts +2 -2
  325. package/build/swift-ui/Toggle/index.d.ts.map +1 -1
  326. package/build/swift-ui/VStack/index.d.ts +1 -1
  327. package/build/swift-ui/VStack/index.d.ts.map +1 -1
  328. package/build/swift-ui/ZStack/index.d.ts +3 -3
  329. package/build/swift-ui/ZStack/index.d.ts.map +1 -1
  330. package/build/swift-ui/index.d.ts +11 -1
  331. package/build/swift-ui/index.d.ts.map +1 -1
  332. package/build/swift-ui/modifiers/animation/index.d.ts +1 -1
  333. package/build/swift-ui/modifiers/animation/index.d.ts.map +1 -1
  334. package/build/swift-ui/modifiers/containerBackground.d.ts +10 -0
  335. package/build/swift-ui/modifiers/containerBackground.d.ts.map +1 -0
  336. package/build/swift-ui/modifiers/environment.d.ts +16 -1
  337. package/build/swift-ui/modifiers/environment.d.ts.map +1 -1
  338. package/build/swift-ui/modifiers/index.d.ts +139 -20
  339. package/build/swift-ui/modifiers/index.d.ts.map +1 -1
  340. package/build/swift-ui/modifiers/shapes/index.d.ts +7 -4
  341. package/build/swift-ui/modifiers/shapes/index.d.ts.map +1 -1
  342. package/build/swift-ui/modifiers/tabViewModifiers.d.ts +45 -0
  343. package/build/swift-ui/modifiers/tabViewModifiers.d.ts.map +1 -0
  344. package/build/swift-ui/modifiers/types.d.ts +1 -1
  345. package/build/swift-ui/modifiers/types.d.ts.map +1 -1
  346. package/build/swift-ui/modifiers/widgets.d.ts +14 -0
  347. package/build/swift-ui/modifiers/widgets.d.ts.map +1 -0
  348. package/build/swift-ui/types.d.ts +13 -1
  349. package/build/swift-ui/types.d.ts.map +1 -1
  350. package/build/types.d.ts +26 -0
  351. package/build/types.d.ts.map +1 -1
  352. package/build/universal/BottomSheet/index.android.d.ts +4 -0
  353. package/build/universal/BottomSheet/index.android.d.ts.map +1 -0
  354. package/build/universal/BottomSheet/index.d.ts +7 -0
  355. package/build/universal/BottomSheet/index.d.ts.map +1 -0
  356. package/build/universal/BottomSheet/index.ios.d.ts +4 -0
  357. package/build/universal/BottomSheet/index.ios.d.ts.map +1 -0
  358. package/build/universal/BottomSheet/types.d.ts +33 -0
  359. package/build/universal/BottomSheet/types.d.ts.map +1 -0
  360. package/build/universal/Button/index.android.d.ts +4 -0
  361. package/build/universal/Button/index.android.d.ts.map +1 -0
  362. package/build/universal/Button/index.d.ts +7 -0
  363. package/build/universal/Button/index.d.ts.map +1 -0
  364. package/build/universal/Button/index.ios.d.ts +4 -0
  365. package/build/universal/Button/index.ios.d.ts.map +1 -0
  366. package/build/universal/Button/types.d.ts +32 -0
  367. package/build/universal/Button/types.d.ts.map +1 -0
  368. package/build/universal/Checkbox/index.android.d.ts +4 -0
  369. package/build/universal/Checkbox/index.android.d.ts.map +1 -0
  370. package/build/universal/Checkbox/index.d.ts +7 -0
  371. package/build/universal/Checkbox/index.d.ts.map +1 -0
  372. package/build/universal/Checkbox/index.ios.d.ts +4 -0
  373. package/build/universal/Checkbox/index.ios.d.ts.map +1 -0
  374. package/build/universal/Checkbox/types.d.ts +32 -0
  375. package/build/universal/Checkbox/types.d.ts.map +1 -0
  376. package/build/universal/Column/index.android.d.ts +4 -0
  377. package/build/universal/Column/index.android.d.ts.map +1 -0
  378. package/build/universal/Column/index.d.ts +7 -0
  379. package/build/universal/Column/index.d.ts.map +1 -0
  380. package/build/universal/Column/index.ios.d.ts +4 -0
  381. package/build/universal/Column/index.ios.d.ts.map +1 -0
  382. package/build/universal/Column/types.d.ts +20 -0
  383. package/build/universal/Column/types.d.ts.map +1 -0
  384. package/build/universal/FieldGroup/FieldGroup.android.d.ts +9 -0
  385. package/build/universal/FieldGroup/FieldGroup.android.d.ts.map +1 -0
  386. package/build/universal/FieldGroup/FieldGroup.d.ts +10 -0
  387. package/build/universal/FieldGroup/FieldGroup.d.ts.map +1 -0
  388. package/build/universal/FieldGroup/FieldGroup.ios.d.ts +7 -0
  389. package/build/universal/FieldGroup/FieldGroup.ios.d.ts.map +1 -0
  390. package/build/universal/FieldGroup/FieldSection.android.d.ts +10 -0
  391. package/build/universal/FieldGroup/FieldSection.android.d.ts.map +1 -0
  392. package/build/universal/FieldGroup/FieldSection.d.ts +9 -0
  393. package/build/universal/FieldGroup/FieldSection.d.ts.map +1 -0
  394. package/build/universal/FieldGroup/FieldSection.ios.d.ts +10 -0
  395. package/build/universal/FieldGroup/FieldSection.ios.d.ts.map +1 -0
  396. package/build/universal/FieldGroup/FieldSectionSlots.d.ts +35 -0
  397. package/build/universal/FieldGroup/FieldSectionSlots.d.ts.map +1 -0
  398. package/build/universal/FieldGroup/groupChildren.d.ts +9 -0
  399. package/build/universal/FieldGroup/groupChildren.d.ts.map +1 -0
  400. package/build/universal/FieldGroup/index.d.ts +11 -0
  401. package/build/universal/FieldGroup/index.d.ts.map +1 -0
  402. package/build/universal/FieldGroup/types.d.ts +50 -0
  403. package/build/universal/FieldGroup/types.d.ts.map +1 -0
  404. package/build/universal/Host/index.android.d.ts +2 -0
  405. package/build/universal/Host/index.android.d.ts.map +1 -0
  406. package/build/universal/Host/index.d.ts +11 -0
  407. package/build/universal/Host/index.d.ts.map +1 -0
  408. package/build/universal/Host/index.ios.d.ts +3 -0
  409. package/build/universal/Host/index.ios.d.ts.map +1 -0
  410. package/build/universal/Row/index.android.d.ts +4 -0
  411. package/build/universal/Row/index.android.d.ts.map +1 -0
  412. package/build/universal/Row/index.d.ts +7 -0
  413. package/build/universal/Row/index.d.ts.map +1 -0
  414. package/build/universal/Row/index.ios.d.ts +4 -0
  415. package/build/universal/Row/index.ios.d.ts.map +1 -0
  416. package/build/universal/Row/types.d.ts +20 -0
  417. package/build/universal/Row/types.d.ts.map +1 -0
  418. package/build/universal/ScrollView/index.android.d.ts +4 -0
  419. package/build/universal/ScrollView/index.android.d.ts.map +1 -0
  420. package/build/universal/ScrollView/index.d.ts +7 -0
  421. package/build/universal/ScrollView/index.d.ts.map +1 -0
  422. package/build/universal/ScrollView/index.ios.d.ts +4 -0
  423. package/build/universal/ScrollView/index.ios.d.ts.map +1 -0
  424. package/build/universal/ScrollView/types.d.ts +23 -0
  425. package/build/universal/ScrollView/types.d.ts.map +1 -0
  426. package/build/universal/Slider/index.android.d.ts +4 -0
  427. package/build/universal/Slider/index.android.d.ts.map +1 -0
  428. package/build/universal/Slider/index.d.ts +7 -0
  429. package/build/universal/Slider/index.d.ts.map +1 -0
  430. package/build/universal/Slider/index.ios.d.ts +4 -0
  431. package/build/universal/Slider/index.ios.d.ts.map +1 -0
  432. package/build/universal/Slider/types.d.ts +42 -0
  433. package/build/universal/Slider/types.d.ts.map +1 -0
  434. package/build/universal/Spacer/index.android.d.ts +12 -0
  435. package/build/universal/Spacer/index.android.d.ts.map +1 -0
  436. package/build/universal/Spacer/index.d.ts +8 -0
  437. package/build/universal/Spacer/index.d.ts.map +1 -0
  438. package/build/universal/Spacer/index.ios.d.ts +16 -0
  439. package/build/universal/Spacer/index.ios.d.ts.map +1 -0
  440. package/build/universal/Spacer/types.d.ts +22 -0
  441. package/build/universal/Spacer/types.d.ts.map +1 -0
  442. package/build/universal/Switch/index.android.d.ts +4 -0
  443. package/build/universal/Switch/index.android.d.ts.map +1 -0
  444. package/build/universal/Switch/index.d.ts +7 -0
  445. package/build/universal/Switch/index.d.ts.map +1 -0
  446. package/build/universal/Switch/index.ios.d.ts +4 -0
  447. package/build/universal/Switch/index.ios.d.ts.map +1 -0
  448. package/build/universal/Switch/types.d.ts +32 -0
  449. package/build/universal/Switch/types.d.ts.map +1 -0
  450. package/build/universal/Text/index.android.d.ts +4 -0
  451. package/build/universal/Text/index.android.d.ts.map +1 -0
  452. package/build/universal/Text/index.d.ts +7 -0
  453. package/build/universal/Text/index.d.ts.map +1 -0
  454. package/build/universal/Text/index.ios.d.ts +4 -0
  455. package/build/universal/Text/index.ios.d.ts.map +1 -0
  456. package/build/universal/Text/types.d.ts +57 -0
  457. package/build/universal/Text/types.d.ts.map +1 -0
  458. package/build/universal/hooks.d.ts +7 -0
  459. package/build/universal/hooks.d.ts.map +1 -0
  460. package/build/universal/index.d.ts +14 -0
  461. package/build/universal/index.d.ts.map +1 -0
  462. package/build/universal/transformStyle.android.d.ts +13 -0
  463. package/build/universal/transformStyle.android.d.ts.map +1 -0
  464. package/build/universal/transformStyle.d.ts +7 -0
  465. package/build/universal/transformStyle.d.ts.map +1 -0
  466. package/build/universal/transformStyle.ios.d.ts +16 -0
  467. package/build/universal/transformStyle.ios.d.ts.map +1 -0
  468. package/build/universal/types.d.ts +74 -0
  469. package/build/universal/types.d.ts.map +1 -0
  470. package/expo-module.config.json +1 -1
  471. package/ios/AccessoryWidgetBackgroundView.swift +27 -0
  472. package/ios/BottomSheetView.swift +1 -6
  473. package/ios/ClosedRangeDateRecord.swift +10 -0
  474. package/ios/ColorPickerView.swift +9 -8
  475. package/ios/ConfirmationDialog/ConfirmationDialog.swift +7 -15
  476. package/ios/ConfirmationDialog/ConfirmationDialogProps.swift +0 -5
  477. package/ios/ContextMenu/ContextMenu.swift +27 -22
  478. package/ios/ContextMenu/ContextMenuRecords.swift +0 -6
  479. package/ios/ControlGroupView.swift +33 -0
  480. package/ios/DatePickerView.swift +7 -5
  481. package/ios/DisclosureGroupView.swift +5 -7
  482. package/ios/ExpoUI.podspec +3 -3
  483. package/ios/ExpoUIModule.swift +37 -32
  484. package/ios/GaugeView.swift +4 -26
  485. package/ios/HostView.swift +1 -2
  486. package/ios/ImageView.swift +22 -11
  487. package/ios/Label.swift +2 -17
  488. package/ios/LabeledContentView.swift +3 -27
  489. package/ios/LazyHStackView.swift +25 -0
  490. package/ios/LazyVStackView.swift +25 -0
  491. package/ios/LinkView.swift +29 -0
  492. package/ios/ListView.swift +6 -14
  493. package/ios/Menu/MenuRecords.swift +0 -2
  494. package/ios/Menu/MenuView.swift +2 -5
  495. package/ios/Modifiers/BackgroundModifier.swift +2 -0
  496. package/ios/Modifiers/ContainerBackgroundModifier.swift +47 -0
  497. package/ios/Modifiers/ContainerShapeModifier.swift +2 -0
  498. package/ios/Modifiers/ContentShapeModifier.swift +2 -0
  499. package/ios/Modifiers/DefaultScrollAnchorForRoleModifier.swift +32 -0
  500. package/ios/Modifiers/DefaultScrollAnchorModifier.swift +16 -0
  501. package/ios/Modifiers/EnvironmentModifier.swift +14 -0
  502. package/ios/Modifiers/GlassEffectModifier.swift +3 -0
  503. package/ios/Modifiers/IndexViewStyleModifier.swift +37 -0
  504. package/ios/Modifiers/KeyboardTypeModifier.swift +68 -0
  505. package/ios/Modifiers/LineLimitModifier.swift +29 -0
  506. package/ios/Modifiers/OnSubmitModifier.swift +21 -0
  507. package/ios/Modifiers/ResizableModifier.swift +24 -0
  508. package/ios/Modifiers/Rotation3DEffectModifier.swift +20 -0
  509. package/ios/Modifiers/ScrollTargetBehaviorModifier.swift +26 -0
  510. package/ios/Modifiers/ScrollTargetLayoutModifier.swift +14 -0
  511. package/ios/Modifiers/ShapeTypes.swift +1 -0
  512. package/ios/Modifiers/TabViewStyleModifier.swift +45 -0
  513. package/ios/Modifiers/TextContentTypeModifier.swift +191 -0
  514. package/ios/Modifiers/TextInputAutocapitalizationModifier.swift +28 -0
  515. package/ios/Modifiers/View+ModifierArray.swift +29 -0
  516. package/ios/Modifiers/ViewModifierRegistry.swift +97 -13
  517. package/ios/Modifiers/WidgetModifiers.swift +58 -0
  518. package/ios/OverlayView.swift +34 -0
  519. package/ios/Picker/PickerView.swift +8 -16
  520. package/ios/Popover/PopoverProps.swift +0 -4
  521. package/ios/Popover/PopoverView.swift +5 -11
  522. package/ios/ProgressView.swift +0 -5
  523. package/ios/RNHostView.swift +91 -10
  524. package/ios/SectionView.swift +9 -17
  525. package/ios/SecureFieldView.swift +5 -13
  526. package/ios/ShareLink/ShareLinkView.swift +1 -1
  527. package/ios/SliderView.swift +16 -31
  528. package/ios/SlotView.swift +38 -0
  529. package/ios/State/ObservableState.swift +28 -0
  530. package/ios/State/WorkletCallback.swift +29 -0
  531. package/ios/State/WorkletCallbackClassDef.swift +21 -0
  532. package/ios/StepperView.swift +12 -16
  533. package/ios/SyncToggle/SyncToggleView.swift +46 -0
  534. package/ios/TabView/Tab.swift +35 -0
  535. package/ios/TabView/TabView.swift +161 -0
  536. package/ios/TextFieldView.swift +26 -95
  537. package/ios/TextView.swift +37 -1
  538. package/ios/Toggle/ToggleView.swift +4 -6
  539. package/ios/UIBaseView.swift +34 -3
  540. package/jetpack-compose/index.d.ts +1 -0
  541. package/jetpack-compose/index.js +1 -0
  542. package/jetpack-compose/modifiers.d.ts +1 -0
  543. package/jetpack-compose/modifiers.js +1 -0
  544. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2-canary-20260424-7bedc9d/expo.modules.ui-55.0.2-canary-20260424-7bedc9d-sources.jar +0 -0
  545. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2-canary-20260424-7bedc9d/expo.modules.ui-55.0.2-canary-20260424-7bedc9d-sources.jar.md5 +1 -0
  546. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2-canary-20260424-7bedc9d/expo.modules.ui-55.0.2-canary-20260424-7bedc9d-sources.jar.sha1 +1 -0
  547. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2-canary-20260424-7bedc9d/expo.modules.ui-55.0.2-canary-20260424-7bedc9d-sources.jar.sha256 +1 -0
  548. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2-canary-20260424-7bedc9d/expo.modules.ui-55.0.2-canary-20260424-7bedc9d-sources.jar.sha512 +1 -0
  549. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2-canary-20260424-7bedc9d/expo.modules.ui-55.0.2-canary-20260424-7bedc9d.aar +0 -0
  550. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2-canary-20260424-7bedc9d/expo.modules.ui-55.0.2-canary-20260424-7bedc9d.aar.md5 +1 -0
  551. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2-canary-20260424-7bedc9d/expo.modules.ui-55.0.2-canary-20260424-7bedc9d.aar.sha1 +1 -0
  552. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2-canary-20260424-7bedc9d/expo.modules.ui-55.0.2-canary-20260424-7bedc9d.aar.sha256 +1 -0
  553. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2-canary-20260424-7bedc9d/expo.modules.ui-55.0.2-canary-20260424-7bedc9d.aar.sha512 +1 -0
  554. package/local-maven-repo/expo/modules/ui/expo.modules.ui/{55.0.0/expo.modules.ui-55.0.0.module → 55.0.2-canary-20260424-7bedc9d/expo.modules.ui-55.0.2-canary-20260424-7bedc9d.module} +49 -28
  555. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2-canary-20260424-7bedc9d/expo.modules.ui-55.0.2-canary-20260424-7bedc9d.module.md5 +1 -0
  556. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2-canary-20260424-7bedc9d/expo.modules.ui-55.0.2-canary-20260424-7bedc9d.module.sha1 +1 -0
  557. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2-canary-20260424-7bedc9d/expo.modules.ui-55.0.2-canary-20260424-7bedc9d.module.sha256 +1 -0
  558. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2-canary-20260424-7bedc9d/expo.modules.ui-55.0.2-canary-20260424-7bedc9d.module.sha512 +1 -0
  559. package/local-maven-repo/expo/modules/ui/expo.modules.ui/{55.0.0/expo.modules.ui-55.0.0.pom → 55.0.2-canary-20260424-7bedc9d/expo.modules.ui-55.0.2-canary-20260424-7bedc9d.pom} +24 -6
  560. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2-canary-20260424-7bedc9d/expo.modules.ui-55.0.2-canary-20260424-7bedc9d.pom.md5 +1 -0
  561. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2-canary-20260424-7bedc9d/expo.modules.ui-55.0.2-canary-20260424-7bedc9d.pom.sha1 +1 -0
  562. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2-canary-20260424-7bedc9d/expo.modules.ui-55.0.2-canary-20260424-7bedc9d.pom.sha256 +1 -0
  563. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2-canary-20260424-7bedc9d/expo.modules.ui-55.0.2-canary-20260424-7bedc9d.pom.sha512 +1 -0
  564. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml +4 -4
  565. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.md5 +1 -1
  566. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.sha1 +1 -1
  567. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.sha256 +1 -1
  568. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.sha512 +1 -1
  569. package/package.json +47 -8
  570. package/spm.config.json +56 -0
  571. package/src/State/index.fx.ts +69 -0
  572. package/src/State/optionalWorklets.ts +12 -0
  573. package/src/State/useNativeState.ts +44 -0
  574. package/src/State/useWorkletProp.ts +32 -0
  575. package/src/State/utils.ts +10 -0
  576. package/src/community/picker/Picker.android.tsx +70 -0
  577. package/src/community/picker/Picker.ios.tsx +73 -0
  578. package/src/community/picker/Picker.tsx +51 -0
  579. package/src/community/picker/index.tsx +7 -0
  580. package/src/community/picker/types.tsx +133 -0
  581. package/src/community/segmented-control/SegmentedControl.android.tsx +47 -0
  582. package/src/community/segmented-control/SegmentedControl.ios.tsx +53 -0
  583. package/src/community/segmented-control/SegmentedControl.tsx +7 -0
  584. package/src/community/segmented-control/index.tsx +11 -0
  585. package/src/community/segmented-control/types.tsx +67 -0
  586. package/src/community/segmented-control/vendor/LICENSE +21 -0
  587. package/src/community/segmented-control/vendor/SegmentedControl.tsx +149 -0
  588. package/src/community/segmented-control/vendor/SegmentedControlTab.tsx +72 -0
  589. package/src/community/segmented-control/vendor/SegmentsSeparators.tsx +58 -0
  590. package/src/datetime-picker/DateTimePicker.android.tsx +126 -0
  591. package/src/datetime-picker/DateTimePicker.tsx +94 -0
  592. package/src/datetime-picker/DateTimePicker.web.tsx +5 -0
  593. package/src/datetime-picker/index.tsx +11 -0
  594. package/src/datetime-picker/types.tsx +147 -0
  595. package/src/jetpack-compose/AlertDialog/index.tsx +94 -41
  596. package/src/jetpack-compose/AnimatedVisibility/index.tsx +206 -0
  597. package/src/jetpack-compose/AnimatedVisibility/symbols.ts +8 -0
  598. package/src/jetpack-compose/Badge/index.tsx +49 -0
  599. package/src/jetpack-compose/BadgedBox/index.tsx +58 -0
  600. package/src/jetpack-compose/BasicAlertDialog/index.tsx +9 -2
  601. package/src/jetpack-compose/Box/index.tsx +26 -0
  602. package/src/jetpack-compose/Button/index.tsx +69 -92
  603. package/src/jetpack-compose/Card/index.tsx +107 -29
  604. package/src/jetpack-compose/Carousel/index.tsx +118 -30
  605. package/src/jetpack-compose/Checkbox/index.tsx +126 -0
  606. package/src/jetpack-compose/Chip/index.tsx +391 -51
  607. package/src/jetpack-compose/Column/index.tsx +39 -0
  608. package/src/jetpack-compose/DatePicker/index.tsx +215 -6
  609. package/src/jetpack-compose/Divider/index.tsx +34 -14
  610. package/src/jetpack-compose/DropdownMenu/DropdownMenuItem.tsx +120 -0
  611. package/src/jetpack-compose/DropdownMenu/index.tsx +107 -0
  612. package/src/jetpack-compose/ExposedDropdownMenuBox/ExposedDropdownMenu.tsx +54 -0
  613. package/src/jetpack-compose/ExposedDropdownMenuBox/index.tsx +73 -0
  614. package/src/jetpack-compose/FloatingActionButton/index.tsx +207 -0
  615. package/src/jetpack-compose/FlowRow/index.tsx +29 -0
  616. package/src/jetpack-compose/HorizontalFloatingToolbar/index.tsx +5 -3
  617. package/src/jetpack-compose/Host/index.tsx +70 -23
  618. package/src/jetpack-compose/Icon/index.tsx +6 -6
  619. package/src/jetpack-compose/IconButton/index.tsx +49 -56
  620. package/src/jetpack-compose/LazyColumn/index.tsx +1 -4
  621. package/src/jetpack-compose/LazyRow/index.tsx +58 -0
  622. package/src/jetpack-compose/ListItem/index.tsx +59 -74
  623. package/src/jetpack-compose/ModalBottomSheet/index.tsx +87 -18
  624. package/src/jetpack-compose/MultiChoiceSegmentedButtonRow/index.tsx +34 -0
  625. package/src/jetpack-compose/Progress/index.tsx +122 -62
  626. package/src/jetpack-compose/PullToRefreshBox/index.tsx +35 -18
  627. package/src/jetpack-compose/RNHostView/index.tsx +9 -15
  628. package/src/jetpack-compose/RadioButton/index.tsx +8 -9
  629. package/src/jetpack-compose/Row/index.tsx +36 -0
  630. package/src/jetpack-compose/SegmentedButton/index.tsx +109 -0
  631. package/src/jetpack-compose/Shape/index.tsx +1 -1
  632. package/src/jetpack-compose/SingleChoiceSegmentedButtonRow/index.tsx +34 -0
  633. package/src/jetpack-compose/Slider/index.tsx +76 -29
  634. package/src/jetpack-compose/SlotView.tsx +15 -0
  635. package/src/jetpack-compose/Spacer/index.tsx +3 -3
  636. package/src/jetpack-compose/Surface/index.tsx +75 -4
  637. package/src/jetpack-compose/Switch/index.tsx +33 -85
  638. package/src/jetpack-compose/SyncSwitch/index.tsx +58 -0
  639. package/src/jetpack-compose/Text/index.tsx +171 -101
  640. package/src/jetpack-compose/TextField/index.tsx +276 -0
  641. package/src/jetpack-compose/ToggleButton/index.tsx +67 -43
  642. package/src/jetpack-compose/Tooltip/index.tsx +176 -0
  643. package/src/jetpack-compose/colors.ts +214 -0
  644. package/src/jetpack-compose/index.ts +22 -9
  645. package/src/jetpack-compose/layout-types.ts +48 -0
  646. package/src/jetpack-compose/layout.tsx +5 -106
  647. package/src/jetpack-compose/modifiers/animation.ts +37 -0
  648. package/src/jetpack-compose/modifiers/index.ts +162 -7
  649. package/src/swift-ui/AccessoryWidgetBackground/index.tsx +12 -0
  650. package/src/swift-ui/BottomSheet/index.tsx +2 -2
  651. package/src/swift-ui/Chart/index.tsx +1 -1
  652. package/src/swift-ui/ColorPicker/index.tsx +1 -1
  653. package/src/swift-ui/ConfirmationDialog/index.tsx +5 -13
  654. package/src/swift-ui/ContextMenu/index.tsx +8 -22
  655. package/src/swift-ui/ContextMenu/types.ts +1 -1
  656. package/src/swift-ui/ControlGroup/index.tsx +59 -0
  657. package/src/swift-ui/Gauge/index.tsx +5 -20
  658. package/src/swift-ui/Host/index.tsx +1 -1
  659. package/src/swift-ui/Image/index.tsx +11 -5
  660. package/src/swift-ui/Label/index.tsx +2 -5
  661. package/src/swift-ui/LabeledContent/index.tsx +3 -12
  662. package/src/swift-ui/LazyHStack/index.tsx +32 -0
  663. package/src/swift-ui/LazyVStack/index.tsx +32 -0
  664. package/src/swift-ui/Link/index.tsx +52 -0
  665. package/src/swift-ui/List/index.tsx +3 -3
  666. package/src/swift-ui/Menu/index.tsx +5 -9
  667. package/src/swift-ui/Menu/types.ts +2 -2
  668. package/src/swift-ui/Overlay/index.tsx +37 -0
  669. package/src/swift-ui/Picker/index.tsx +4 -11
  670. package/src/swift-ui/Popover/index.tsx +5 -14
  671. package/src/swift-ui/ProgressView/index.tsx +1 -3
  672. package/src/swift-ui/Section/index.tsx +4 -9
  673. package/src/swift-ui/SecureField/index.tsx +21 -39
  674. package/src/swift-ui/Shapes/ConcentricRectangle.tsx +1 -1
  675. package/src/swift-ui/Slider/index.tsx +4 -12
  676. package/src/swift-ui/SlotView.tsx +8 -0
  677. package/src/swift-ui/Stepper/index.tsx +7 -7
  678. package/src/swift-ui/SyncToggle/index.tsx +58 -0
  679. package/src/swift-ui/TabView/Tab.tsx +43 -0
  680. package/src/swift-ui/TabView/index.tsx +71 -0
  681. package/src/swift-ui/Text/index.tsx +66 -2
  682. package/src/swift-ui/TextField/index.tsx +33 -94
  683. package/src/swift-ui/Toggle/index.tsx +2 -2
  684. package/src/swift-ui/ZStack/index.tsx +2 -17
  685. package/src/swift-ui/index.tsx +12 -1
  686. package/src/swift-ui/modifiers/animation/index.ts +1 -1
  687. package/src/swift-ui/modifiers/containerBackground.ts +13 -0
  688. package/src/swift-ui/modifiers/environment.ts +17 -4
  689. package/src/swift-ui/modifiers/index.ts +283 -21
  690. package/src/swift-ui/modifiers/shapes/index.ts +6 -2
  691. package/src/swift-ui/modifiers/tabViewModifiers.ts +63 -0
  692. package/src/swift-ui/modifiers/types.ts +1 -1
  693. package/src/swift-ui/modifiers/widgets.ts +18 -0
  694. package/src/swift-ui/types.ts +27 -10
  695. package/src/types.ts +27 -0
  696. package/src/universal/BottomSheet/index.android.tsx +35 -0
  697. package/src/universal/BottomSheet/index.ios.tsx +35 -0
  698. package/src/universal/BottomSheet/index.tsx +65 -0
  699. package/src/universal/BottomSheet/types.ts +38 -0
  700. package/src/universal/Button/index.android.tsx +52 -0
  701. package/src/universal/Button/index.ios.tsx +48 -0
  702. package/src/universal/Button/index.tsx +88 -0
  703. package/src/universal/Button/types.ts +36 -0
  704. package/src/universal/Checkbox/index.android.tsx +36 -0
  705. package/src/universal/Checkbox/index.ios.tsx +30 -0
  706. package/src/universal/Checkbox/index.tsx +33 -0
  707. package/src/universal/Checkbox/types.ts +37 -0
  708. package/src/universal/Column/index.android.tsx +47 -0
  709. package/src/universal/Column/index.ios.tsx +50 -0
  710. package/src/universal/Column/index.tsx +48 -0
  711. package/src/universal/Column/types.ts +22 -0
  712. package/src/universal/FieldGroup/FieldGroup.android.tsx +40 -0
  713. package/src/universal/FieldGroup/FieldGroup.ios.tsx +27 -0
  714. package/src/universal/FieldGroup/FieldGroup.tsx +61 -0
  715. package/src/universal/FieldGroup/FieldSection.android.tsx +105 -0
  716. package/src/universal/FieldGroup/FieldSection.ios.tsx +42 -0
  717. package/src/universal/FieldGroup/FieldSection.tsx +131 -0
  718. package/src/universal/FieldGroup/FieldSectionSlots.tsx +67 -0
  719. package/src/universal/FieldGroup/groupChildren.tsx +53 -0
  720. package/src/universal/FieldGroup/index.ts +15 -0
  721. package/src/universal/FieldGroup/types.ts +60 -0
  722. package/src/universal/Host/index.android.tsx +1 -0
  723. package/src/universal/Host/index.ios.tsx +16 -0
  724. package/src/universal/Host/index.tsx +18 -0
  725. package/src/universal/Row/index.android.tsx +47 -0
  726. package/src/universal/Row/index.ios.tsx +50 -0
  727. package/src/universal/Row/index.tsx +54 -0
  728. package/src/universal/Row/types.ts +22 -0
  729. package/src/universal/ScrollView/index.android.tsx +37 -0
  730. package/src/universal/ScrollView/index.ios.tsx +78 -0
  731. package/src/universal/ScrollView/index.tsx +54 -0
  732. package/src/universal/ScrollView/types.ts +25 -0
  733. package/src/universal/Slider/index.android.tsx +43 -0
  734. package/src/universal/Slider/index.ios.tsx +34 -0
  735. package/src/universal/Slider/index.tsx +44 -0
  736. package/src/universal/Slider/types.ts +49 -0
  737. package/src/universal/Spacer/index.android.tsx +59 -0
  738. package/src/universal/Spacer/index.ios.tsx +44 -0
  739. package/src/universal/Spacer/index.tsx +31 -0
  740. package/src/universal/Spacer/types.ts +23 -0
  741. package/src/universal/Switch/index.android.tsx +26 -0
  742. package/src/universal/Switch/index.ios.tsx +30 -0
  743. package/src/universal/Switch/index.tsx +30 -0
  744. package/src/universal/Switch/types.ts +37 -0
  745. package/src/universal/Text/index.android.tsx +56 -0
  746. package/src/universal/Text/index.ios.tsx +110 -0
  747. package/src/universal/Text/index.tsx +69 -0
  748. package/src/universal/Text/types.ts +78 -0
  749. package/src/universal/hooks.ts +20 -0
  750. package/src/universal/index.ts +14 -0
  751. package/src/universal/transformStyle.android.ts +110 -0
  752. package/src/universal/transformStyle.ios.ts +113 -0
  753. package/src/universal/transformStyle.ts +17 -0
  754. package/src/universal/types.ts +108 -0
  755. package/tsconfig.json +2 -0
  756. package/android/src/main/java/expo/modules/ui/FilterChipView.kt +0 -59
  757. package/android/src/main/java/expo/modules/ui/PickerView.kt +0 -161
  758. package/android/src/main/java/expo/modules/ui/TextButtonView.kt +0 -33
  759. package/android/src/main/java/expo/modules/ui/TextInputView.kt +0 -88
  760. package/android/src/main/java/expo/modules/ui/menu/ContextMenu.kt +0 -183
  761. package/android/src/main/java/expo/modules/ui/menu/ContextMenuRecords.kt +0 -64
  762. package/build/jetpack-compose/Button/types.d.ts +0 -5
  763. package/build/jetpack-compose/Button/types.d.ts.map +0 -1
  764. package/build/jetpack-compose/ContextMenu/Submenu.d.ts +0 -17
  765. package/build/jetpack-compose/ContextMenu/Submenu.d.ts.map +0 -1
  766. package/build/jetpack-compose/ContextMenu/index.d.ts +0 -65
  767. package/build/jetpack-compose/ContextMenu/index.d.ts.map +0 -1
  768. package/build/jetpack-compose/ContextMenu/utils.d.ts +0 -24
  769. package/build/jetpack-compose/ContextMenu/utils.d.ts.map +0 -1
  770. package/build/jetpack-compose/FilterChip/index.d.ts +0 -49
  771. package/build/jetpack-compose/FilterChip/index.d.ts.map +0 -1
  772. package/build/jetpack-compose/Picker/index.d.ts +0 -62
  773. package/build/jetpack-compose/Picker/index.d.ts.map +0 -1
  774. package/build/jetpack-compose/TextButton/index.d.ts +0 -29
  775. package/build/jetpack-compose/TextButton/index.d.ts.map +0 -1
  776. package/build/jetpack-compose/TextInput/index.d.ts +0 -81
  777. package/build/jetpack-compose/TextInput/index.d.ts.map +0 -1
  778. package/ios/ConfirmationDialog/ConfirmationDialogComponents.swift +0 -26
  779. package/ios/ContextMenu/ContextMenuComponents.swift +0 -37
  780. package/ios/Menu/MenuComponents.swift +0 -12
  781. package/ios/Picker/PickerComponents.swift +0 -24
  782. package/ios/Popover/PopoverComponents.swift +0 -18
  783. package/ios/SectionComponents.swift +0 -34
  784. package/jetpack-compose.d.ts +0 -1
  785. package/jetpack-compose.js +0 -1
  786. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.0/expo.modules.ui-55.0.0-sources.jar +0 -0
  787. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.0/expo.modules.ui-55.0.0-sources.jar.md5 +0 -1
  788. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.0/expo.modules.ui-55.0.0-sources.jar.sha1 +0 -1
  789. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.0/expo.modules.ui-55.0.0-sources.jar.sha256 +0 -1
  790. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.0/expo.modules.ui-55.0.0-sources.jar.sha512 +0 -1
  791. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.0/expo.modules.ui-55.0.0.aar +0 -0
  792. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.0/expo.modules.ui-55.0.0.aar.md5 +0 -1
  793. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.0/expo.modules.ui-55.0.0.aar.sha1 +0 -1
  794. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.0/expo.modules.ui-55.0.0.aar.sha256 +0 -1
  795. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.0/expo.modules.ui-55.0.0.aar.sha512 +0 -1
  796. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.0/expo.modules.ui-55.0.0.module.md5 +0 -1
  797. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.0/expo.modules.ui-55.0.0.module.sha1 +0 -1
  798. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.0/expo.modules.ui-55.0.0.module.sha256 +0 -1
  799. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.0/expo.modules.ui-55.0.0.module.sha512 +0 -1
  800. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.0/expo.modules.ui-55.0.0.pom.md5 +0 -1
  801. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.0/expo.modules.ui-55.0.0.pom.sha1 +0 -1
  802. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.0/expo.modules.ui-55.0.0.pom.sha256 +0 -1
  803. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.0/expo.modules.ui-55.0.0.pom.sha512 +0 -1
  804. package/src/jetpack-compose/Button/types.ts +0 -57
  805. package/src/jetpack-compose/ContextMenu/Submenu.tsx +0 -21
  806. package/src/jetpack-compose/ContextMenu/index.tsx +0 -149
  807. package/src/jetpack-compose/ContextMenu/utils.ts +0 -144
  808. package/src/jetpack-compose/FilterChip/index.tsx +0 -89
  809. package/src/jetpack-compose/Picker/index.tsx +0 -90
  810. package/src/jetpack-compose/TextButton/index.tsx +0 -55
  811. package/src/jetpack-compose/TextInput/index.tsx +0 -117
package/CHANGELOG.md CHANGED
@@ -4,12 +4,114 @@
4
4
 
5
5
  ### 🛠 Breaking changes
6
6
 
7
+ - [iOS] Match `TextField` and `SecureField` API with SwiftUI: replaced `multiline`, `numberOfLines`, `allowNewlines` with `axis` prop. Moved `keyboardType`, `autocorrectionDisabled`, `onSubmit` from props to modifier registry. Renamed events `onValueChanged` → `onValueChange`, `onFocusChanged` → `onFocusChange`, `onSelectionChanged` → `onSelectionChange`. Removed hardcoded `fixedSize`. Added `LineLimitModifier` with `reservesSpace` and range support. Added `OnSubmitModifier` and `KeyboardTypeModifier`. ([#44549](https://github.com/expo/expo/pull/44549) by [@nishan](https://github.com/intergalacticspacehighway))
8
+ - [android] Match `TextField` API to native Compose: renamed `TextInput` to `TextField`/`OutlinedTextField`, replaced individual keyboard props with `keyboardOptions`/`keyboardActions` matching `KeyboardOptions`/`KeyboardActions`, added `enabled`, `readOnly`, `isError`, `singleLine`, `maxLines`, `minLines`, `shape`, `colors`. Added composable slots: `placeholder`, `leadingIcon`, `trailingIcon`, `prefix`, `suffix`, `supportingText`. Added imperative `focus()`/`blur()` and `onFocusChanged` event. ([#44545](https://github.com/expo/expo/pull/44545) by [@nishan](https://github.com/intergalacticspacehighway))
9
+ - [android] Match `Icon` API to native: renamed `tintColor` to `tint`. Match `ListItem` API to native: replaced string props with slot sub-components (`HeadlineContent`, `SupportingContent`, `OverlineContent`, `LeadingContent`, `TrailingContent`). Renamed color props to match `ListItemDefaults.colors()`. Added `tonalElevation`, `shadowElevation`. Removed `color`, `onPress`. ([#44054](https://github.com/expo/expo/pull/44054) by [@nishan](https://github.com/intergalacticspacehighway))
10
+ - [android] Refactored `PullToRefreshBox` indicator props: replaced `loadingIndicatorModifiers` with nested `indicator` prop containing `color`, `containerColor`, and `modifiers`. Added `contentAlignment` prop. ([#44079](https://github.com/expo/expo/pull/44079) by [@nishan](https://github.com/intergalacticspacehighway))
11
+ - [android] Split `Divider` into `HorizontalDivider` and `VerticalDivider` matching native Compose components. Added `thickness` and `color` props. ([#44035](https://github.com/expo/expo/pull/44035) by [@nishan](https://github.com/intergalacticspacehighway))
12
+ - [android] Match `AlertDialog` API to native Compose: replaced string props (`title`, `text`, `confirmButtonText`, `dismissButtonText`) with slot sub-components (`AlertDialog.Title`, `AlertDialog.Text`, `AlertDialog.ConfirmButton`, `AlertDialog.DismissButton`, `AlertDialog.Icon`). Removed `visible` prop (use conditional rendering), `onConfirmPressed`/`onDismissPressed` (renamed to `onDismissRequest`), and `confirmButtonColors`/`dismissButtonColors` (replaced with dialog-level `colors`). ([#43997](https://github.com/expo/expo/pull/43997) by [@nishan](https://github.com/intergalacticspacehighway))
13
+ - [android] Split `Carousel` into `HorizontalCenteredHeroCarousel`, `HorizontalMultiBrowseCarousel`, and `HorizontalUncontainedCarousel` matching native Compose components. Added `HorizontalCenteredHeroCarousel`. ([#44034](https://github.com/expo/expo/pull/44034) by [@nishan](https://github.com/intergalacticspacehighway))
14
+ - [iOS] Renamed Stepper `defaultValue` to `value` and `onValueChanged` to `onValueChange`. ([#43954](https://github.com/expo/expo/pull/43954) by [@nishan](https://github.com/intergalacticspacehighway))
15
+ - [android] Replace `Picker` with `SingleChoiceSegmentedButtonRow`, `MultiChoiceSegmentedButtonRow`, and `SegmentedButton` components. Replace `RadioButton` `nativeClickable` prop with `onClick` event. ([#43809](https://github.com/expo/expo/pull/43809) by [@nishan](https://github.com/intergalacticspacehighway))
16
+ - [android] Split `ToggleButton` into separate M3 components: `ToggleButton`, `IconToggleButton`, `FilledIconToggleButton`, `OutlinedIconToggleButton`. Removed `variant`, `text`, `color`, `disabled` props. Added `colors` with checked/unchecked variants. ([#43974](https://github.com/expo/expo/pull/43974) by [@nishan](https://github.com/intergalacticspacehighway))
17
+ - [android] Match `Switch` API to native: removed `variant` prop and split into separate `Switch` and `Checkbox` components matching native M3 APIs. Renamed `elementColors` to `colors`, `onValueChange` to `onCheckedChange`, removed `color` convenience prop. ([#43887](https://github.com/expo/expo/pull/43887) by [@nishan](https://github.com/intergalacticspacehighway))
18
+ - [android] Refactored Progress Indicators to match native Compose API: split into `LinearProgressIndicator`, `CircularProgressIndicator`, `LinearWavyProgressIndicator`, `CircularWavyProgressIndicator`. Flattened `elementColors.trackColor` to `trackColor`. Added `strokeCap`, `gapSize`, `strokeWidth` props. ([#43907](https://github.com/expo/expo/pull/43907) by [@nishan](https://github.com/intergalacticspacehighway))
19
+ - [android] Refactored `Card` to match native Material3 API: split into `Card`/`ElevatedCard`/`OutlinedCard` with type-specific props (`elevation`, `border`). ([#43896](https://github.com/expo/expo/pull/43896) by [@nishan](https://github.com/intergalacticspacehighway))
20
+ - [android] Split `Button` into separate M3 components: `Button`, `FilledTonalButton`, `OutlinedButton`, `ElevatedButton`, `TextButton`. Removed `variant`, `text`, `leadingIcon`, `trailingIcon`, `color`, `elementColors`, `disabled` props. ([#43859](https://github.com/expo/expo/pull/43859) by [@nishan](https://github.com/intergalacticspacehighway))
21
+ - [android] Split `IconButton` into separate M3 components: `IconButton`, `FilledIconButton`, `FilledTonalIconButton`, `OutlinedIconButton`. Removed `variant`, `color`, `elementColors`, `disabled`, `onPress` props. ([#43859](https://github.com/expo/expo/pull/43859) by [@nishan](https://github.com/intergalacticspacehighway))
22
+ - [android] Refactored `Chip` to match native Material3 API: split into `AssistChip`/`FilterChip`/`InputChip`/`SuggestionChip` with slot-based content, added `colors`/`elevation`/`border` props. Merged `FilterChip` into `Chip` module. ([#43900](https://github.com/expo/expo/pull/43900) by [@nishan](https://github.com/intergalacticspacehighway))
23
+ - [android] Refactored `Slider` to match native Material3 API: renamed `elementColors` to `colors`, removed `color` convenience prop. ([#43840](https://github.com/expo/expo/pull/43840) by [@nishan](https://github.com/intergalacticspacehighway))
24
+ - [android] rename ContextMenu to DropdownMenu ([#43794](https://github.com/expo/expo/pull/43794) by [@Ubax](https://github.com/Ubax))
25
+ - [android] configure ContextMenu by using native children ([#43792](https://github.com/expo/expo/pull/43792) by [@Ubax](https://github.com/Ubax))
26
+ - [android] control ContextMenu expanded state from JS ([#43793](https://github.com/expo/expo/pull/43793) by [@Ubax](https://github.com/Ubax))
27
+ - Bumped minimum iOS/tvOS version to 16.4, macOS to 13.4. ([#43296](https://github.com/expo/expo/pull/43296) by [@tsapeta](https://github.com/tsapeta))
28
+ - [jetpack-compose] Changed `Host` underlying `MaterialTheme` to `MaterialExpressiveTheme`. ([#44896](https://github.com/expo/expo/pull/44896) by [@kudo](https://github.com/kudo))
29
+
7
30
  ### 🎉 New features
8
31
 
32
+ - [android] Add `WorkletCallback` shared object for synchronous UI thread callbacks. ([#44681](https://github.com/expo/expo/pull/44681) by [@nishan](https://github.com/intergalacticspacehighway))
33
+ - [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))
34
+ - [iOS] Added `Overlay` component. ([#44610](https://github.com/expo/expo/pull/44610) by [@nishan](https://github.com/intergalacticspacehighway))
35
+ - add ExposedDropdownMenuBox ([#44201](https://github.com/expo/expo/pull/44201) by [@vonovak](https://github.com/vonovak))
36
+ - Added `@expo/ui/community/segmented-control` — a drop-in replacement for `@react-native-segmented-control/segmented-control`. ([#44611](https://github.com/expo/expo/pull/44611) by [@vonovak](https://github.com/vonovak))
37
+ - Added `@expo/ui/community/picker` — Android, iOS and web `Picker` drop-in replacement for `@react-native-picker/picker`. ([#44058](https://github.com/expo/expo/pull/44058) by [@vonovak](https://github.com/vonovak))
38
+ - [iOS] Added `TabView` and `TabView.Tab` components wrapping SwiftUI's `TabView`, with `tabViewStyle` and `indexViewStyle` modifiers for the page (swipeable) and bottom-tab styles. ([#44780](https://github.com/expo/expo/pull/44780) by [@vonovak](https://github.com/vonovak))
39
+ - [iOS] Added `containerRelativeShape` to shape types for `clipShape`, `mask`, `background`, `containerShape`, `contentShape`, and `glassEffect` modifiers. Enables proper shape adaptation in widgets and container-relative contexts using SwiftUI's `ContainerRelativeShape`. ([#44704](https://github.com/expo/expo/pull/44704) by [@hypnokermit](https://github.com/hypnokermit))
40
+ - [iOS] Add `ObservableState` shared object and `useNativeState` hook for controlling native SwiftUI state from JS. ([#44214](https://github.com/expo/expo/pull/44214) by [@nishan](https://github.com/intergalacticspacehighway))
41
+ - [iOS] Add shared object worklet support with `.value` property API for `ObservableState`. ([#44215](https://github.com/expo/expo/pull/44215) by [@nishan](https://github.com/intergalacticspacehighway))
42
+ - [iOS] Add `WorkletCallback` shared object for synchronous UI thread callbacks. ([#44216](https://github.com/expo/expo/pull/44216) by [@nishan](https://github.com/intergalacticspacehighway))
43
+ - [android] Added `TooltipBox`, `PlainTooltip`, and `RichTooltip` components matching native Compose Tooltip API. Supports plain and rich tooltips with slot-based content, programmatic show/dismiss via ref, and `isPersistent`, `hasAction`, `enableUserInput`, `focusable` props. ([#44373](https://github.com/expo/expo/pull/44373) by [@nishan](https://github.com/intergalacticspacehighway))
44
+ - [android] Added `Badge` and `BadgedBox` components wrapping Jetpack Compose's Badge API for status indicators and count overlays. ([#44139](https://github.com/expo/expo/pull/44139) by [@benjaminkomen](https://github.com/benjaminkomen))
45
+ - [android] Added `shape`, `border`, `selected`, `checked`, `onClick`, and `onCheckedChange` props to `Surface`, supporting clickable, selectable, and toggleable variants. ([#44079](https://github.com/expo/expo/pull/44079) by [@nishan](https://github.com/intergalacticspacehighway))
46
+ - [android] Added nested text support for Compose `Text` with style inheritance, custom fonts via `expo-font`, `background`, `shadow`, and `lineBreak` properties. ([#44094](https://github.com/expo/expo/pull/44094) by [@nishan](https://github.com/intergalacticspacehighway))
47
+ - [android] Added `outlined` variant to `TextInput` component. ([#43719](https://github.com/expo/expo/pull/43719) by [@benjaminkomen](https://github.com/benjaminkomen))
48
+ - Added `@expo/ui/datetimepicker` — an Android and iOS `DateTimePicker` drop-in replacement for `@react-native-community/datetimepicker`. ([#44014](https://github.com/expo/expo/pull/44014) by [@vonovak](https://github.com/vonovak))
49
+ - [iOS] Added `locale` and `timeZone` support to `modifiers`. ([#44013](https://github.com/expo/expo/pull/44013) by [@vonovak](https://github.com/vonovak))
50
+ - [android] Added `ref.hide()` for animated dismiss and more configurable props (`containerColor`, `contentColor`, `scrimColor`, `showDragHandle`, `sheetGesturesEnabled`, `properties`, `DragHandle` slot) to `BottomSheet`. ([#43972](https://github.com/expo/expo/pull/43972) by [@nishan](https://github.com/intergalacticspacehighway))
51
+ - [iOS] Added `date`, `dateStyle`, `timerInterval`, `countsDown`, and `pauseTime` props to `Text` component for displaying auto-updating dates, timers, and countdowns using SwiftUI's `Text.DateStyle`. ([#43552](https://github.com/expo/expo/pull/43552) by [@LouisRaverdy](https://github.com/LouisRaverdy))
52
+ - [android] Added `Checkbox` and `TriStateCheckbox` components. ([#43887](https://github.com/expo/expo/pull/43887) by [@nishan](https://github.com/intergalacticspacehighway))
53
+ - [Android] Added `DatePickerDialog` and `TimePickerDialog` components, and `selectableDates` prop to `DateTimePicker`. ([#43895](https://github.com/expo/expo/pull/43895) by [@vonovak](https://github.com/vonovak))
54
+ - [android] Added `FloatingActionButton` component. ([#43738](https://github.com/expo/expo/pull/43738) by [@benjaminkomen](https://github.com/benjaminkomen))
55
+ - [android] Added `enabled`, `onValueChangeFinished`, and `Slider.Thumb`/`Slider.Track` slot support to `Slider` component. ([#43840](https://github.com/expo/expo/pull/43840) by [@nishan](https://github.com/intergalacticspacehighway))
56
+ - [Android] Added `graphicsLayer` modifier and animation helpers for per-value animation in it. Added `indication` option to `clickable` modifier to control ripple effects. ([#43655](https://github.com/expo/expo/pull/43655) by [@vonovak](https://github.com/vonovak))
57
+ - [Android] Added border color customization for `Switch` and `Checkbox` components. ([#43770](https://github.com/expo/expo/pull/43770) by [@liestig](https://github.com/liestig))
58
+ - [iOS] Added `defaultScrollAnchor` modifier for controlling initial scroll position (iOS 17+). ([#43914](https://github.com/expo/expo/pull/43914) by [@ramonclaudio](https://github.com/ramonclaudio))
59
+ - [iOS] Added `defaultScrollAnchorForRole` modifier for per-role scroll anchor control (iOS 18+). ([#43923](https://github.com/expo/expo/pull/43923) by [@ramonclaudio](https://github.com/ramonclaudio))
60
+ - [iOS] Added `scrollTargetBehavior` and `scrollTargetLayout` modifiers for scroll target configuration (iOS 17+). ([#43955](https://github.com/expo/expo/pull/43955) by [@ramonclaudio](https://github.com/ramonclaudio))
61
+ - [iOS] Added `textInputAutocapitalization` modifier for controlling keyboard autocapitalization behavior (iOS 15+). ([#44547](https://github.com/expo/expo/pull/44547) by [@ramonclaudio](https://github.com/ramonclaudio))
62
+ - [iOS] Added `textContentType` modifier for enabling autofill and semantic text input hints (iOS 13+). ([#44548](https://github.com/expo/expo/pull/44548) by [@ramonclaudio](https://github.com/ramonclaudio))
63
+ - [iOS] Added `rotation3DEffect` modifier for 3D rotation transforms ([#43640](https://github.com/expo/expo/pull/43640) by [@vonovak](https://github.com/vonovak))
64
+ - [iOS] Added `ControlGroup` component. ([#43581](https://github.com/expo/expo/pull/43581) by [@nishan](https://github.com/intergalacticspacehighway))
65
+ - [android] detect FAB in HorizontalFloatingToolbar ([#43601](https://github.com/expo/expo/pull/43601) by [@Ubax](https://github.com/Ubax))
66
+ - [android] Add `elementColors` prop to the `DateTimePicker` component ([#43787](https://github.com/expo/expo/pull/43787) by [@iankberry](https://github.com/iankberry))
67
+ - [iOS] Added `AccessoryWidgetBackground` component ([#43729](https://github.com/expo/expo/pull/43729) by [@huextrat](https://github.com/huextrat))
68
+ - [iOS] Add support for local image uri ([#43707](https://github.com/expo/expo/pull/43707) by [@jakex7](https://github.com/jakex7))
69
+ - [android] add AnimatedVisibility transition API ([#43632](https://github.com/expo/expo/pull/43632) by [@Ubax](https://github.com/Ubax))
70
+ - [android] add `imePadding` modifier ([#43652](https://github.com/expo/expo/pull/43652) by [@Ubax](https://github.com/Ubax))
71
+ - [iOS] Add `Link` view. ([#43983](https://github.com/expo/expo/pull/43983) by [@jakex7](https://github.com/jakex7))
72
+ - [iOS] Add `widgetURL` modifier. ([#43984](https://github.com/expo/expo/pull/43984) by [@jakex7](https://github.com/jakex7))
73
+ - [swift-ui] Added `LazyHStack` and `LazyVStack`. ([#44612](https://github.com/expo/expo/pull/44612) by [@kudo](https://github.com/kudo))
74
+ - [jetpack-compose] Added `LazyRow` component and `onVisibilityChanged` modifier. ([#44615](https://github.com/expo/expo/pull/44615) by [@kudo](https://github.com/kudo))
75
+ - Added universal components. ([#44601](https://github.com/expo/expo/pull/44601) by [@kudo](https://github.com/kudo))
76
+ - [iOS] Add `containerBackground` modifier. ([#44192](https://github.com/expo/expo/pull/44192) by [@jakex7](https://github.com/jakex7))
77
+ - [jetpack-compose] Added `defaultMinSize` modifier. ([#44813](https://github.com/expo/expo/pull/44813) by [@kudo](https://github.com/kudo))
78
+ - [jetpack-compose] Added Material 3 dynamic colors support. ([#44896](https://github.com/expo/expo/pull/44896) by [@kudo](https://github.com/kudo))
79
+ - Added universal `FieldGroup` and `Spacer`. ([#44814](https://github.com/expo/expo/pull/44814) by [@kudo](https://github.com/kudo))
80
+
9
81
  ### 🐛 Bug fixes
10
82
 
83
+ - Fix `installOnUIRuntime` crash by ensuring `react-native-reanimated` initializes before accessing worklet runtime. ([#44582](https://github.com/expo/expo/pull/44582) by [@intergalacticspacehighway](https://github.com/intergalacticspacehighway))
84
+ - [iOS] Fix initial prop values not being applied since `init` runs before `updateProps`. ([#43954](https://github.com/expo/expo/pull/43954) by [@nishan](https://github.com/intergalacticspacehighway))
85
+ - [iOS] Fix prop syncing race condition where stale values override user interactions. Replace `onReceive(Sequence.publisher)` with `onAppear` + `onChange` across all SwiftUI views. ([#43954](https://github.com/expo/expo/pull/43954) by [@nishan](https://github.com/intergalacticspacehighway))
86
+ - [iOS] Fix `Slider` thumb snapping back during drag by guarding `.onReceive` with `isEditing` state. ([#43701](https://github.com/expo/expo/issues/43701) by [@fedeciancaglini](https://github.com/fedeciancaglini)) ([#43797](https://github.com/expo/expo/pull/43797) by [@fedeciancaglini](https://github.com/fedeciancaglini))
87
+ - [Android] Fix touch events for RN views inside Compose BottomSheet. ([#43716](https://github.com/expo/expo/pull/43716) by [@nishan](https://github.com/intergalacticspacehighway))
88
+ - [Android] Fix `RNHostView` child parent related crash. ([#43691](https://github.com/expo/expo/pull/43691) by [@nishan](https://github.com/intergalacticspacehighway))
89
+ - [iOS] Fix `foregroundStyle` typings and runtime narrowing so React Native color values like `PlatformColor()` work in color and gradient styles. ([#44349](https://github.com/expo/expo/pull/44349) by [@eliotgevers](https://github.com/eliotgevers))
90
+ - [Android] Added `RNHostView` to improve RN component layout inside Compose views. ([#43495](https://github.com/expo/expo/pull/43495) by [@nishan](https://github.com/intergalacticspacehighway))
91
+ - [Android] Fix `ContextMenu` not expanding when triggered by `IconButton`. ([#43592](https://github.com/expo/expo/pull/43592) by [@nishan](https://github.com/intergalacticspacehighway))
92
+ - [android] fix modifiers export ([#43639](https://github.com/expo/expo/pull/43639) by [@Ubax](https://github.com/Ubax))
93
+ - [jetpack-compose] Fixed `RNHostView` re-parenting exception. ([#44522](https://github.com/expo/expo/pull/44522) by [@kudo](https://github.com/kudo))
94
+ - Fixed runtime crash when missing `Host` component for SwiftUI or Jetpack Compose components. ([#44118](https://github.com/expo/expo/pull/44118) by [@kudo](https://github.com/kudo))
95
+
11
96
  ### 💡 Others
12
97
 
98
+ - [iOS] Add `AsyncFunction` support in `ExpoUIView` definition function. ([#43669](https://github.com/expo/expo/pull/43669) by [@nishan](https://github.com/intergalacticspacehighway))
99
+ - [iOS] Introduce `SlotView` to replace structural child view types with a single generic slot. ([#43607](https://github.com/expo/expo/pull/43607) by [@nishan](https://github.com/intergalacticspacehighway))
100
+ - [iOS] Make RNHostView SwiftUI view ([#43570](https://github.com/expo/expo/pull/43570) by [@nishan](https://github.com/intergalacticspacehighway))
101
+ - [jetpack-compose] Use view hash code as key for `Children`. ([#44521](https://github.com/expo/expo/pull/44521) by [@kudo](https://github.com/kudo))
102
+ - Refactored `ComposableScope` and allow extensibility. ([#44698](https://github.com/expo/expo/pull/44698) by [@kudo](https://github.com/kudo))
103
+ - [jetpack-compose] Reuse `HorizontalAlignment` converter in `LazyColumn`. ([#44755](https://github.com/expo/expo/pull/44755) by [@kudo](https://github.com/kudo))
104
+ - [jetpack-compose] Added `horizontalScroll` and `verticalScroll` modifiers. ([#44464](https://github.com/expo/expo/pull/44464) by [@kudo](https://github.com/kudo))
105
+ - [Android] Added AsyncFunction support to the functional `ExpoUIView` DSL. ([#44081](https://github.com/expo/expo/pull/44081) by [@kudo](https://github.com/kudo))
106
+ - [iOS] Fixed build error when using precompiled `ExpoModulesCore.xcframework`. ([#45016](https://github.com/expo/expo/pull/45016) by [@kudo](https://github.com/kudo))
107
+ - [Android] Improved application startup performance by reducing reflection. ([#45021](https://github.com/expo/expo/pull/45021) by [@lukmccall](https://github.com/lukmccall))
108
+
109
+ ## 55.0.1 — 2026-02-25
110
+
111
+ ### 🎉 New features
112
+
113
+ - [iOS] Added `luminanceToAlpha` modifier. ([#43417](https://github.com/expo/expo/pull/43417) by [@jakex7](https://github.com/jakex7))
114
+
13
115
  ## 55.0.0 — 2026-02-25
14
116
 
15
117
  ### 🎉 New features
@@ -163,6 +265,7 @@ _This version does not introduce any user-facing changes._
163
265
 
164
266
  ### 🎉 New features
165
267
 
268
+ - [Android] Add `label`, and `placeholder` props to TextField component. ([#40452](https://github.com/expo/expo/pull/40452) by [@akshayjadhav4](https://github.com/akshayjadhav4))
166
269
  - [iOS] Add `refreshable` modifier. ([#40201](https://github.com/expo/expo/pull/40201) by [@christianwooldridge](https://github.com/christianwooldridge))
167
270
  - [iOS] Add RTL support in swiftui. ([#40335](https://github.com/expo/expo/pull/40335) by [@kfirfitousi](https://github.com/kfirfitousi))
168
271
  - [Android] Add Carousel component. ([#40325](https://github.com/expo/expo/pull/40325) by [@aleqsio](https://github.com/aleqsio))
package/CLAUDE.md ADDED
@@ -0,0 +1,54 @@
1
+ # expo-ui component guidelines
2
+
3
+ expo-ui is a library of native UI components for React Native, bridging SwiftUI views on iOS and Jetpack Compose components on Android. Each platform has its own set of components exported from `@expo/ui/swift-ui` and `@expo/ui/jetpack-compose` respectively.
4
+
5
+ ## Core principle
6
+
7
+ Bridge native components to JavaScript with as little abstraction as possible. Native views should be thin wrappers — no added logic, state management, or behavior beyond what the platform component provides. Everything that can be set or controlled from JavaScript should be controlled from JavaScript.
8
+
9
+ Prefer controlled components: state lives in JS and is passed as props, not managed internally by the native view. Use a prop + callback pattern (e.g. `page` + `onPageChange`) instead of imperative ref methods (e.g. `setPage(index)`). This keeps the source of truth in React and makes components predictable and composable.
10
+
11
+ ## Naming
12
+
13
+ - The JavaScript API must mirror the native APIs closely.
14
+ - Exported components must have the same name as the underlying native component (e.g. SwiftUI `TabView` -> export `TabView`, Jetpack Compose `HorizontalPager` -> export `HorizontalPager`).
15
+ - Don't turn native-layer modifiers into props in the JS layer — modifiers stay as modifiers.
16
+ - Use `export function ComponentName` (the dominant pattern in this codebase). Use `export const` only for non-component values like modifiers or constants. Avoid the `export { LocalName as ExportName }` rename pattern unless the local name must differ.
17
+ - Props, constants, and enum values must use the same names as the native API. If SwiftUI calls it `scrollEnabled`, the JS prop is `scrollEnabled`. If Compose calls it `userScrollEnabled`, the JS prop is `userScrollEnabled`.
18
+ - Ensure components have the correct display name in React DevTools. Either name the function directly (e.g. `function TabView`) or set `.displayName`.
19
+
20
+ ## Props and events
21
+
22
+ - Include JSDoc for every supported prop.
23
+ - Events follow the expo-ui `ViewEvent` pattern: the public JS callback receives unwrapped values (e.g. `onPageSelected?: (position: number) => void`), and the component internally adapts to/from the native event shape.
24
+
25
+ ## Native code
26
+
27
+ - Expose all configurable properties of the underlying native component as props. Don't hardcode values that the user might want to change.
28
+ - Use `@Field` (iOS) and data class fields (Android) for props, `EventDispatcher` for events, and `AsyncFunction` for imperative methods when unavoidable.
29
+
30
+ ## File structure
31
+
32
+ - iOS (SwiftUI): `packages/expo-ui/ios/<ComponentName>/<ComponentName>View.swift` (or `ios/<ComponentName>View.swift` for simple components)
33
+ - Android (Compose): `packages/expo-ui/android/src/main/java/expo/modules/ui/<ComponentName>View.kt`
34
+ - TypeScript (SwiftUI): `packages/expo-ui/src/swift-ui/<ComponentName>/index.tsx`
35
+ - TypeScript (Compose): `packages/expo-ui/src/jetpack-compose/<ComponentName>/index.tsx`
36
+ - Register views in `ios/ExpoUIModule.swift` and `android/.../ExpoUIModule.kt`
37
+ - Export from `src/swift-ui/index.tsx` and `src/jetpack-compose/index.ts`
38
+
39
+ ## Example screens
40
+
41
+ For every component added, create example screens in NCL (native-component-list):
42
+
43
+ - `apps/native-component-list/src/screens/UI/<ComponentName>Screen.ios.tsx` — imports from `@expo/ui/swift-ui`
44
+ - `apps/native-component-list/src/screens/UI/<ComponentName>Screen.android.tsx` — imports from `@expo/ui/jetpack-compose`
45
+ - Register in both `UIScreen.ios.tsx` and `UIScreen.android.tsx`
46
+ - Keep the minimum set of examples needed to cover available features.
47
+
48
+ ## Before committing
49
+
50
+ 1. Run `pnpm build` in the package directory — the `build/` output must be committed alongside source changes. CI will fail otherwise.
51
+ 2. Run `pnpm lint --max-warnings 0`.
52
+ 3. Add a changelog entry to `CHANGELOG.md` under the "Unpublished" section.
53
+ 4. When adding a new component, add documentation for it. When adding a new feature to an existing component, update its documentation accordingly. Docs are MDX files in `docs/pages/versions/unversioned/sdk/ui/swift-ui/` and `docs/pages/versions/unversioned/sdk/ui/jetpack-compose/`.
54
+ 5. Regenerate API docs data by running `et gdad -p @expo/ui`. If the change is to be cherry-picked to an already-released SDK version, also run `et gdad -p @expo/ui -s <version>` (e.g. `et gdad -p @expo/ui -s 55` for SDK 55). Changes are very likely to be picked to the latest stable of expo-ui (`npm view @expo/ui version`).
@@ -0,0 +1,30 @@
1
+ # Contributing to `@expo/ui`
2
+
3
+ `@expo/ui` maps native UI frameworks (SwiftUI on iOS, Jetpack Compose on Android) to React Native.
4
+
5
+ ## Before opening a PR
6
+
7
+ - [ ] Rebuilt JS output: `yarn build` (from `packages/expo-ui/`) and committed the `build/` output.
8
+
9
+ ### When adding or updating a component
10
+
11
+ - [ ] Added an example to the relevant screen in `apps/native-component-list/src/screens/UI/`
12
+ - [ ] Regenerated docs (from repo root): `et gdad -p "expo-ui/swift-ui/<component>"` and/or `et gdad -p "expo-ui/jetpack-compose/<component>"`
13
+ - [ ] Added an example in the relevant docs page
14
+
15
+ ### When adding or updating a modifier
16
+
17
+ - [ ] Added an example to the relevant screen in `apps/native-component-list/src/screens/UI/`
18
+ - [ ] Regenerated docs (from repo root): `et gdad -p "expo-ui/swift-ui/modifiers"` and/or `et gdad -p "expo-ui/jetpack-compose/modifiers"`
19
+
20
+ ## Project structure
21
+
22
+ - `packages/expo-ui/ios/` - Swift/SwiftUI source files
23
+ - `packages/expo-ui/android/` - Kotlin/Jetpack Compose source files
24
+ - `packages/expo-ui/src/swift-ui/` - TypeScript components and types for the SwiftUI side
25
+ - `packages/expo-ui/src/jetpack-compose/` - TypeScript components and types for the Compose side
26
+
27
+ ## General guidelines
28
+
29
+ - **Match the native APIs** — prop names, types, and behavior should mirror their SwiftUI / Jetpack Compose counterparts as closely as possible.
30
+ - **Reuse existing types** — before creating a new Record or TypeScript type, check if one already exists.
@@ -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 = '55.0.0'
15
+ version = '55.0.2-canary-20260424-7bedc9d'
16
16
 
17
17
  android {
18
18
  namespace "expo.modules.ui"
19
19
  defaultConfig {
20
20
  versionCode 1
21
- versionName "55.0.0"
21
+ versionName "55.0.2-canary-20260424-7bedc9d"
22
22
  testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
23
23
  }
24
24
  buildFeatures {
@@ -37,15 +37,16 @@ android {
37
37
  dependencies {
38
38
  implementation 'com.facebook.react:react-android'
39
39
 
40
- implementation 'androidx.compose.foundation:foundation-android:1.10.2'
41
- implementation 'androidx.compose.ui:ui-android:1.10.2'
42
- implementation "androidx.compose.material3:material3:1.5.0-alpha13"
43
- implementation 'androidx.compose.material3:material3-android:1.5.0-alpha13'
40
+ implementation 'androidx.compose.foundation:foundation-android:1.10.6'
41
+ implementation 'androidx.compose.ui:ui-android:1.10.6'
42
+ implementation "androidx.compose.material3:material3:1.5.0-alpha17"
43
+ implementation 'androidx.compose.material3:material3-android:1.5.0-alpha17'
44
44
  implementation 'androidx.lifecycle:lifecycle-runtime:2.10.0'
45
45
  implementation 'androidx.fragment:fragment-ktx:1.8.9'
46
46
  implementation "androidx.graphics:graphics-shapes:1.1.0"
47
47
  implementation "com.squareup.okhttp3:okhttp:4.9.2"
48
- implementation "androidx.core:core-ktx:1.17.0"
48
+ implementation "com.google.android.material:material:1.13.0"
49
+ implementation "androidx.core:core-ktx:1.18.0"
49
50
 
50
51
  // Testing
51
52
  testImplementation 'junit:junit:4.13.2'
@@ -1,52 +1,85 @@
1
1
  package expo.modules.ui
2
2
 
3
+ import android.graphics.Color
3
4
  import androidx.compose.material3.AlertDialog
4
- import androidx.compose.material3.Text
5
- import androidx.compose.material3.TextButton
5
+ import androidx.compose.material3.AlertDialogDefaults
6
6
  import androidx.compose.runtime.Composable
7
+ import androidx.compose.ui.unit.dp
8
+ import androidx.compose.ui.window.DialogProperties
9
+ import expo.modules.kotlin.records.Field
7
10
  import expo.modules.kotlin.records.Record
8
11
  import expo.modules.kotlin.views.ComposeProps
9
12
  import expo.modules.kotlin.views.FunctionalComposableScope
10
- import java.io.Serializable
13
+ import expo.modules.kotlin.types.OptimizedRecord
14
+ import expo.modules.kotlin.views.OptimizedComposeProps
11
15
 
12
- open class AlertDialogButtonPressedEvent() : Record, Serializable
16
+ @OptimizedRecord
17
+ data class AlertDialogColors(
18
+ @Field val containerColor: Color? = null,
19
+ @Field val iconContentColor: Color? = null,
20
+ @Field val titleContentColor: Color? = null,
21
+ @Field val textContentColor: Color? = null
22
+ ) : Record
13
23
 
24
+ @OptimizedRecord
25
+ data class ExpoDialogProperties(
26
+ @Field val dismissOnBackPress: Boolean = true,
27
+ @Field val dismissOnClickOutside: Boolean = true,
28
+ @Field val usePlatformDefaultWidth: Boolean = true,
29
+ @Field val decorFitsSystemWindows: Boolean = true
30
+ ) : Record
31
+
32
+ @OptimizedComposeProps
14
33
  data class AlertDialogProps(
15
- val title: String? = null,
16
- val text: String? = null,
17
- val confirmButtonText: String? = null,
18
- val dismissButtonText: String? = null,
19
- val visible: Boolean = false,
34
+ val colors: AlertDialogColors = AlertDialogColors(),
35
+ val tonalElevation: Double? = null,
36
+ val properties: ExpoDialogProperties = ExpoDialogProperties(),
20
37
  val modifiers: ModifierList = emptyList()
21
38
  ) : ComposeProps
22
39
 
23
40
  @Composable
24
41
  fun FunctionalComposableScope.AlertDialogContent(
25
42
  props: AlertDialogProps,
26
- onDismissPressed: (AlertDialogButtonPressedEvent) -> Unit,
27
- onConfirmPressed: (AlertDialogButtonPressedEvent) -> Unit
43
+ onDismissRequest: () -> Unit
28
44
  ) {
29
- if (!props.visible) {
30
- return
31
- }
45
+ val titleSlotView = findChildSlotView(view, "title")
46
+ val textSlotView = findChildSlotView(view, "text")
47
+ val confirmButtonSlotView = findChildSlotView(view, "confirmButton")
48
+ val dismissButtonSlotView = findChildSlotView(view, "dismissButton")
49
+ val iconSlotView = findChildSlotView(view, "icon")
32
50
 
33
51
  AlertDialog(
52
+ onDismissRequest = { onDismissRequest() },
34
53
  confirmButton = {
35
- props.confirmButtonText?.let {
36
- TextButton(onClick = { onConfirmPressed(AlertDialogButtonPressedEvent()) }) {
37
- Text(it)
38
- }
39
- }
54
+ confirmButtonSlotView?.renderSlot()
55
+ },
56
+ modifier = ModifierRegistry.applyModifiers(props.modifiers, appContext, composableScope, globalEventDispatcher),
57
+ dismissButton = dismissButtonSlotView?.let {
58
+ { it.renderSlot() }
59
+ },
60
+ title = titleSlotView?.let {
61
+ { it.renderSlot() }
62
+ },
63
+ text = textSlotView?.let {
64
+ { it.renderSlot() }
40
65
  },
41
- dismissButton = {
42
- props.dismissButtonText?.let {
43
- TextButton(onClick = { onDismissPressed(AlertDialogButtonPressedEvent()) }) {
44
- Text(it)
45
- }
46
- }
66
+ icon = iconSlotView?.let {
67
+ { it.renderSlot() }
47
68
  },
48
- onDismissRequest = { onDismissPressed(AlertDialogButtonPressedEvent()) },
49
- title = { props.title?.let { Text(it) } },
50
- text = { props.text?.let { Text(it) } }
69
+ containerColor = props.colors.containerColor.composeOrNull
70
+ ?: AlertDialogDefaults.containerColor,
71
+ iconContentColor = props.colors.iconContentColor.composeOrNull
72
+ ?: AlertDialogDefaults.iconContentColor,
73
+ titleContentColor = props.colors.titleContentColor.composeOrNull
74
+ ?: AlertDialogDefaults.titleContentColor,
75
+ textContentColor = props.colors.textContentColor.composeOrNull
76
+ ?: AlertDialogDefaults.textContentColor,
77
+ tonalElevation = props.tonalElevation?.dp ?: AlertDialogDefaults.TonalElevation,
78
+ properties = DialogProperties(
79
+ dismissOnBackPress = props.properties.dismissOnBackPress,
80
+ dismissOnClickOutside = props.properties.dismissOnClickOutside,
81
+ usePlatformDefaultWidth = props.properties.usePlatformDefaultWidth,
82
+ decorFitsSystemWindows = props.properties.decorFitsSystemWindows
83
+ )
51
84
  )
52
85
  }
@@ -0,0 +1,134 @@
1
+ package expo.modules.ui
2
+
3
+ import androidx.compose.animation.AnimatedVisibility
4
+ import androidx.compose.animation.EnterTransition
5
+ import androidx.compose.animation.ExitTransition
6
+ import androidx.compose.animation.expandHorizontally
7
+ import androidx.compose.animation.expandIn
8
+ import androidx.compose.animation.expandVertically
9
+ import androidx.compose.animation.fadeIn
10
+ import androidx.compose.animation.fadeOut
11
+ import androidx.compose.animation.scaleIn
12
+ import androidx.compose.animation.scaleOut
13
+ import androidx.compose.animation.shrinkHorizontally
14
+ import androidx.compose.animation.shrinkOut
15
+ import androidx.compose.animation.shrinkVertically
16
+ import androidx.compose.animation.slideInHorizontally
17
+ import androidx.compose.animation.slideInVertically
18
+ import androidx.compose.animation.slideOutHorizontally
19
+ import androidx.compose.animation.slideOutVertically
20
+ import androidx.compose.runtime.Composable
21
+ import expo.modules.kotlin.records.Field
22
+ import expo.modules.kotlin.records.Record
23
+ import expo.modules.kotlin.types.Enumerable
24
+ import expo.modules.kotlin.views.ComposeProps
25
+ import expo.modules.kotlin.views.FunctionalComposableScope
26
+ import expo.modules.kotlin.types.OptimizedRecord
27
+ import expo.modules.kotlin.views.OptimizedComposeProps
28
+
29
+ // region Transition types
30
+
31
+ enum class EnterTransitionType(val value: String) : Enumerable {
32
+ FADE_IN("fadeIn"),
33
+ SLIDE_IN_HORIZONTALLY("slideInHorizontally"),
34
+ SLIDE_IN_VERTICALLY("slideInVertically"),
35
+ EXPAND_IN("expandIn"),
36
+ EXPAND_HORIZONTALLY("expandHorizontally"),
37
+ EXPAND_VERTICALLY("expandVertically"),
38
+ SCALE_IN("scaleIn")
39
+ }
40
+
41
+ enum class ExitTransitionType(val value: String) : Enumerable {
42
+ FADE_OUT("fadeOut"),
43
+ SLIDE_OUT_HORIZONTALLY("slideOutHorizontally"),
44
+ SLIDE_OUT_VERTICALLY("slideOutVertically"),
45
+ SHRINK_OUT("shrinkOut"),
46
+ SHRINK_HORIZONTALLY("shrinkHorizontally"),
47
+ SHRINK_VERTICALLY("shrinkVertically"),
48
+ SCALE_OUT("scaleOut")
49
+ }
50
+
51
+ @OptimizedRecord
52
+ data class EnterTransitionRecord(
53
+ @Field val type: EnterTransitionType = EnterTransitionType.FADE_IN,
54
+ @Field val initialAlpha: Float? = null,
55
+ @Field val initialOffsetX: Float? = null,
56
+ @Field val initialOffsetY: Float? = null,
57
+ @Field val initialScale: Float? = null
58
+ ) : Record
59
+
60
+ @OptimizedRecord
61
+ data class ExitTransitionRecord(
62
+ @Field val type: ExitTransitionType = ExitTransitionType.FADE_OUT,
63
+ @Field val targetAlpha: Float? = null,
64
+ @Field val targetOffsetX: Float? = null,
65
+ @Field val targetOffsetY: Float? = null,
66
+ @Field val targetScale: Float? = null
67
+ ) : Record
68
+
69
+ // endregion
70
+
71
+ // region Transition conversion
72
+
73
+ // TODO(@ubax): expose animationSpec parameter (tween, spring, duration) for all transitions
74
+ private fun EnterTransitionRecord.toComposeTransition(): EnterTransition = when (type) {
75
+ EnterTransitionType.FADE_IN ->
76
+ if (initialAlpha != null) fadeIn(initialAlpha = initialAlpha) else fadeIn()
77
+ EnterTransitionType.SLIDE_IN_HORIZONTALLY ->
78
+ if (initialOffsetX != null) slideInHorizontally { (it * initialOffsetX).toInt() } else slideInHorizontally()
79
+ EnterTransitionType.SLIDE_IN_VERTICALLY ->
80
+ if (initialOffsetY != null) slideInVertically { (it * initialOffsetY).toInt() } else slideInVertically()
81
+ // TODO(@ubax): expose expandFrom (Alignment) and initialSize parameters for expand transitions
82
+ EnterTransitionType.EXPAND_IN -> expandIn()
83
+ EnterTransitionType.EXPAND_HORIZONTALLY -> expandHorizontally()
84
+ EnterTransitionType.EXPAND_VERTICALLY -> expandVertically()
85
+ EnterTransitionType.SCALE_IN ->
86
+ if (initialScale != null) scaleIn(initialScale = initialScale) else scaleIn()
87
+ }
88
+
89
+ private fun ExitTransitionRecord.toComposeTransition(): ExitTransition = when (type) {
90
+ ExitTransitionType.FADE_OUT ->
91
+ if (targetAlpha != null) fadeOut(targetAlpha = targetAlpha) else fadeOut()
92
+ ExitTransitionType.SLIDE_OUT_HORIZONTALLY ->
93
+ if (targetOffsetX != null) slideOutHorizontally { (it * targetOffsetX).toInt() } else slideOutHorizontally()
94
+ ExitTransitionType.SLIDE_OUT_VERTICALLY ->
95
+ if (targetOffsetY != null) slideOutVertically { (it * targetOffsetY).toInt() } else slideOutVertically()
96
+ // TODO(@ubax): expose shrinkTowards (Alignment) and targetSize parameters for shrink transitions
97
+ ExitTransitionType.SHRINK_OUT -> shrinkOut()
98
+ ExitTransitionType.SHRINK_HORIZONTALLY -> shrinkHorizontally()
99
+ ExitTransitionType.SHRINK_VERTICALLY -> shrinkVertically()
100
+ ExitTransitionType.SCALE_OUT ->
101
+ if (targetScale != null) scaleOut(targetScale = targetScale) else scaleOut()
102
+ }
103
+
104
+ private fun List<EnterTransitionRecord>.toComposedEnterTransition(): EnterTransition? =
105
+ map { it.toComposeTransition() }.reduceOrNull { acc, transition -> acc + transition }
106
+
107
+ private fun List<ExitTransitionRecord>.toComposedExitTransition(): ExitTransition? =
108
+ map { it.toComposeTransition() }.reduceOrNull { acc, transition -> acc + transition }
109
+
110
+ // endregion
111
+
112
+ @OptimizedComposeProps
113
+ data class AnimatedVisibilityProps(
114
+ val visible: Boolean = true,
115
+ val enterTransition: List<EnterTransitionRecord>? = null,
116
+ val exitTransition: List<ExitTransitionRecord>? = null,
117
+ val modifiers: ModifierList = emptyList()
118
+ ) : ComposeProps
119
+
120
+ @Composable
121
+ fun FunctionalComposableScope.AnimatedVisibilityContent(props: AnimatedVisibilityProps) {
122
+ val enter = props.enterTransition?.takeIf { it.isNotEmpty() }?.toComposedEnterTransition()
123
+ val exit = props.exitTransition?.takeIf { it.isNotEmpty() }?.toComposedExitTransition()
124
+
125
+ AnimatedVisibility(
126
+ visible = props.visible,
127
+ enter = enter ?: (fadeIn() + expandIn()),
128
+ exit = exit ?: (fadeOut() + shrinkOut()),
129
+ modifier = ModifierRegistry
130
+ .applyModifiers(props.modifiers, appContext, composableScope, globalEventDispatcher)
131
+ ) {
132
+ Children(UIComposableScope())
133
+ }
134
+ }
@@ -0,0 +1,75 @@
1
+ package expo.modules.ui
2
+
3
+ import android.graphics.Color
4
+ import androidx.compose.foundation.layout.Box
5
+ import androidx.compose.material3.Badge
6
+ import androidx.compose.material3.BadgeDefaults
7
+ import androidx.compose.material3.contentColorFor
8
+ import androidx.compose.runtime.Composable
9
+ import androidx.compose.ui.Alignment
10
+ import androidx.compose.ui.Modifier
11
+ import androidx.compose.ui.layout.layout
12
+ import androidx.compose.ui.unit.dp
13
+ import androidx.core.view.size
14
+ import expo.modules.kotlin.views.ComposeProps
15
+ import expo.modules.kotlin.views.FunctionalComposableScope
16
+ import expo.modules.kotlin.views.OptimizedComposeProps
17
+
18
+ @OptimizedComposeProps
19
+ data class BadgeProps(
20
+ val containerColor: Color? = null,
21
+ val contentColor: Color? = null,
22
+ val modifiers: ModifierList = emptyList()
23
+ ) : ComposeProps
24
+
25
+ @Composable
26
+ fun FunctionalComposableScope.BadgeContent(props: BadgeProps) {
27
+ val resolvedContainerColor = props.containerColor.composeOrNull ?: BadgeDefaults.containerColor
28
+ val modifier = ModifierRegistry.applyModifiers(props.modifiers, appContext, composableScope, globalEventDispatcher)
29
+
30
+ if (view.size > 0) {
31
+ Badge(
32
+ modifier = modifier,
33
+ containerColor = resolvedContainerColor,
34
+ contentColor = props.contentColor.composeOrNull ?: contentColorFor(resolvedContainerColor)
35
+ ) {
36
+ Box(
37
+ modifier = Modifier.ensureBadgeContentCircular(),
38
+ contentAlignment = Alignment.Center
39
+ ) {
40
+ Children(UIComposableScope())
41
+ }
42
+ }
43
+ } else {
44
+ // No content lambda → renders as small 6dp dot per M3 spec
45
+ Badge(
46
+ modifier = modifier,
47
+ containerColor = resolvedContainerColor
48
+ )
49
+ }
50
+ }
51
+
52
+ /**
53
+ * Layout modifier that sizes the Badge content so the Badge renders as a circle
54
+ * for narrow content (single digits). Badge internally adds 4dp horizontal padding
55
+ * on each side (8dp total) but no vertical padding. To make the Badge square
56
+ * (and thus circular with CornerFull shape), the content width must be
57
+ * `height - totalHorizontalPadding`. For wide content (e.g. "999+"), the natural
58
+ * width is used, producing a pill shape.
59
+ *
60
+ * This is a workaround for Compose Badge becoming oval at font scales > 1.0.
61
+ * @see: https://issuetracker.google.com/issues/365493087
62
+ */
63
+ private fun Modifier.ensureBadgeContentCircular() = layout { measurable, constraints ->
64
+ val placeable = measurable.measure(constraints)
65
+ // Badge adds 4dp padding on each side = 8dp total horizontal padding
66
+ val targetWidth = placeable.height - BadgeHorizontalPaddingTotal.roundToPx()
67
+ val width = maxOf(placeable.width, targetWidth)
68
+ layout(width, placeable.height) {
69
+ placeable.placeRelative((width - placeable.width) / 2, 0)
70
+ }
71
+ }
72
+
73
+ // Badge internal horizontal padding: 4dp per side = 8dp total
74
+ // (BadgeWithContentHorizontalPadding is internal in Material 3)
75
+ private val BadgeHorizontalPaddingTotal = 8.dp
@@ -0,0 +1,25 @@
1
+ package expo.modules.ui
2
+
3
+ import androidx.compose.material3.Badge
4
+ import androidx.compose.material3.BadgedBox
5
+ import androidx.compose.runtime.Composable
6
+ import expo.modules.kotlin.views.ComposeProps
7
+ import expo.modules.kotlin.views.FunctionalComposableScope
8
+ import expo.modules.kotlin.views.OptimizedComposeProps
9
+
10
+ @OptimizedComposeProps
11
+ data class BadgedBoxProps(
12
+ val modifiers: ModifierList = emptyList()
13
+ ) : ComposeProps
14
+
15
+ @Composable
16
+ fun FunctionalComposableScope.BadgedBoxContent(props: BadgedBoxProps) {
17
+ val badgeSlot = findChildSlotView(view, "badge")
18
+
19
+ BadgedBox(
20
+ badge = { badgeSlot?.renderSlot() ?: Badge() },
21
+ modifier = ModifierRegistry.applyModifiers(props.modifiers, appContext, composableScope, globalEventDispatcher)
22
+ ) {
23
+ Children(UIComposableScope()) { !isSlotView(it) }
24
+ }
25
+ }