@expo/ui 55.0.2 → 55.0.4

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 (232) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/android/build.gradle +2 -2
  3. package/android/src/main/java/expo/modules/ui/AnimatedVisibilityView.kt +130 -0
  4. package/android/src/main/java/expo/modules/ui/BottomSheetView.kt +91 -13
  5. package/android/src/main/java/expo/modules/ui/CardView.kt +138 -34
  6. package/android/src/main/java/expo/modules/ui/CheckboxView.kt +98 -0
  7. package/android/src/main/java/expo/modules/ui/ChipView.kt +267 -142
  8. package/android/src/main/java/expo/modules/ui/DatePickerView.kt +258 -70
  9. package/android/src/main/java/expo/modules/ui/ExpoUIModule.kt +209 -61
  10. package/android/src/main/java/expo/modules/ui/ModifierRegistry.kt +44 -1
  11. package/android/src/main/java/expo/modules/ui/ProgressView.kt +189 -89
  12. package/android/src/main/java/expo/modules/ui/RadioButtonView.kt +3 -7
  13. package/android/src/main/java/expo/modules/ui/SegmentedButtonView.kt +115 -0
  14. package/android/src/main/java/expo/modules/ui/SegmentedControlView.kt +35 -0
  15. package/android/src/main/java/expo/modules/ui/SliderView.kt +70 -12
  16. package/android/src/main/java/expo/modules/ui/SwitchView.kt +53 -161
  17. package/android/src/main/java/expo/modules/ui/TextInputView.kt +39 -15
  18. package/android/src/main/java/expo/modules/ui/ToggleButtonView.kt +95 -57
  19. package/android/src/main/java/expo/modules/ui/button/Button.kt +117 -158
  20. package/android/src/main/java/expo/modules/ui/button/FloatingActionButton.kt +92 -0
  21. package/android/src/main/java/expo/modules/ui/button/IconButton.kt +73 -86
  22. package/android/src/main/java/expo/modules/ui/menu/DropdownMenu.kt +39 -0
  23. package/android/src/main/java/expo/modules/ui/menu/DropdownMenuItem.kt +70 -0
  24. package/android/src/main/java/expo/modules/ui/menu/DropdownMenuRecords.kt +18 -0
  25. package/build/datetime-picker/DateTimePicker.android.d.ts +3 -0
  26. package/build/datetime-picker/DateTimePicker.android.d.ts.map +1 -0
  27. package/build/datetime-picker/DateTimePicker.d.ts +3 -0
  28. package/build/datetime-picker/DateTimePicker.d.ts.map +1 -0
  29. package/build/datetime-picker/DateTimePicker.web.d.ts +3 -0
  30. package/build/datetime-picker/DateTimePicker.web.d.ts.map +1 -0
  31. package/build/datetime-picker/index.d.ts +5 -0
  32. package/build/datetime-picker/index.d.ts.map +1 -0
  33. package/build/datetime-picker/types.d.ts +128 -0
  34. package/build/datetime-picker/types.d.ts.map +1 -0
  35. package/build/jetpack-compose/AnimatedVisibility/index.d.ts +134 -0
  36. package/build/jetpack-compose/AnimatedVisibility/index.d.ts.map +1 -0
  37. package/build/jetpack-compose/AnimatedVisibility/symbols.d.ts +3 -0
  38. package/build/jetpack-compose/AnimatedVisibility/symbols.d.ts.map +1 -0
  39. package/build/jetpack-compose/Button/index.d.ts +65 -51
  40. package/build/jetpack-compose/Button/index.d.ts.map +1 -1
  41. package/build/jetpack-compose/Card/index.d.ts +72 -14
  42. package/build/jetpack-compose/Card/index.d.ts.map +1 -1
  43. package/build/jetpack-compose/Checkbox/index.d.ts +73 -0
  44. package/build/jetpack-compose/Checkbox/index.d.ts.map +1 -0
  45. package/build/jetpack-compose/Chip/index.d.ts +247 -27
  46. package/build/jetpack-compose/Chip/index.d.ts.map +1 -1
  47. package/build/jetpack-compose/DatePicker/index.d.ts +38 -3
  48. package/build/jetpack-compose/DatePicker/index.d.ts.map +1 -1
  49. package/build/jetpack-compose/DropdownMenu/DropdownMenuItem.d.ts +70 -0
  50. package/build/jetpack-compose/DropdownMenu/DropdownMenuItem.d.ts.map +1 -0
  51. package/build/jetpack-compose/DropdownMenu/index.d.ts +68 -0
  52. package/build/jetpack-compose/DropdownMenu/index.d.ts.map +1 -0
  53. package/build/jetpack-compose/FloatingActionButton/index.d.ts +150 -0
  54. package/build/jetpack-compose/FloatingActionButton/index.d.ts.map +1 -0
  55. package/build/jetpack-compose/HorizontalFloatingToolbar/index.d.ts +2 -2
  56. package/build/jetpack-compose/HorizontalFloatingToolbar/index.d.ts.map +1 -1
  57. package/build/jetpack-compose/IconButton/index.d.ts +45 -29
  58. package/build/jetpack-compose/IconButton/index.d.ts.map +1 -1
  59. package/build/jetpack-compose/ModalBottomSheet/index.d.ts +65 -13
  60. package/build/jetpack-compose/ModalBottomSheet/index.d.ts.map +1 -1
  61. package/build/jetpack-compose/MultiChoiceSegmentedButtonRow/index.d.ts +17 -0
  62. package/build/jetpack-compose/MultiChoiceSegmentedButtonRow/index.d.ts.map +1 -0
  63. package/build/jetpack-compose/Progress/index.d.ts +78 -35
  64. package/build/jetpack-compose/Progress/index.d.ts.map +1 -1
  65. package/build/jetpack-compose/RadioButton/index.d.ts +2 -2
  66. package/build/jetpack-compose/RadioButton/index.d.ts.map +1 -1
  67. package/build/jetpack-compose/SegmentedButton/index.d.ts +74 -0
  68. package/build/jetpack-compose/SegmentedButton/index.d.ts.map +1 -0
  69. package/build/jetpack-compose/SingleChoiceSegmentedButtonRow/index.d.ts +17 -0
  70. package/build/jetpack-compose/SingleChoiceSegmentedButtonRow/index.d.ts.map +1 -0
  71. package/build/jetpack-compose/Slider/index.d.ts +34 -10
  72. package/build/jetpack-compose/Slider/index.d.ts.map +1 -1
  73. package/build/jetpack-compose/Switch/index.d.ts +10 -50
  74. package/build/jetpack-compose/Switch/index.d.ts.map +1 -1
  75. package/build/jetpack-compose/TextInput/index.d.ts +9 -0
  76. package/build/jetpack-compose/TextInput/index.d.ts.map +1 -1
  77. package/build/jetpack-compose/ToggleButton/index.d.ts +60 -32
  78. package/build/jetpack-compose/ToggleButton/index.d.ts.map +1 -1
  79. package/build/jetpack-compose/index.d.ts +5 -4
  80. package/build/jetpack-compose/index.d.ts.map +1 -1
  81. package/build/jetpack-compose/modifiers/index.d.ts +18 -1
  82. package/build/jetpack-compose/modifiers/index.d.ts.map +1 -1
  83. package/build/swift-ui/Link/index.d.ts +36 -0
  84. package/build/swift-ui/Link/index.d.ts.map +1 -0
  85. package/build/swift-ui/ProgressView/index.d.ts +1 -5
  86. package/build/swift-ui/ProgressView/index.d.ts.map +1 -1
  87. package/build/swift-ui/Stepper/index.d.ts +3 -3
  88. package/build/swift-ui/Stepper/index.d.ts.map +1 -1
  89. package/build/swift-ui/Text/index.d.ts +33 -1
  90. package/build/swift-ui/Text/index.d.ts.map +1 -1
  91. package/build/swift-ui/index.d.ts +1 -0
  92. package/build/swift-ui/index.d.ts.map +1 -1
  93. package/build/swift-ui/modifiers/environment.d.ts +16 -1
  94. package/build/swift-ui/modifiers/environment.d.ts.map +1 -1
  95. package/build/swift-ui/modifiers/index.d.ts +24 -7
  96. package/build/swift-ui/modifiers/index.d.ts.map +1 -1
  97. package/build/swift-ui/modifiers/shapes/index.d.ts +2 -2
  98. package/build/swift-ui/modifiers/widgets.d.ts +14 -0
  99. package/build/swift-ui/modifiers/widgets.d.ts.map +1 -0
  100. package/build/swift-ui/types.d.ts +7 -0
  101. package/build/swift-ui/types.d.ts.map +1 -1
  102. package/expo-module.config.json +1 -1
  103. package/ios/BottomSheetView.swift +1 -6
  104. package/ios/ClosedRangeDateRecord.swift +10 -0
  105. package/ios/ColorPickerView.swift +9 -8
  106. package/ios/ConfirmationDialog/ConfirmationDialog.swift +4 -6
  107. package/ios/DatePickerView.swift +7 -5
  108. package/ios/DisclosureGroupView.swift +5 -7
  109. package/ios/ExpoUIModule.swift +1 -0
  110. package/ios/LinkView.swift +29 -0
  111. package/ios/ListView.swift +6 -14
  112. package/ios/Modifiers/DefaultScrollAnchorForRoleModifier.swift +32 -0
  113. package/ios/Modifiers/DefaultScrollAnchorModifier.swift +16 -0
  114. package/ios/Modifiers/EnvironmentModifier.swift +14 -0
  115. package/ios/Modifiers/ViewModifierRegistry.swift +12 -0
  116. package/ios/Modifiers/WidgetModifiers.swift +12 -0
  117. package/ios/Picker/PickerView.swift +6 -10
  118. package/ios/Popover/PopoverView.swift +3 -5
  119. package/ios/ProgressView.swift +0 -5
  120. package/ios/SectionView.swift +3 -5
  121. package/ios/SliderView.swift +8 -6
  122. package/ios/StepperView.swift +12 -16
  123. package/ios/TextView.swift +37 -1
  124. package/ios/Toggle/ToggleView.swift +5 -7
  125. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.4/expo.modules.ui-55.0.4-sources.jar +0 -0
  126. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.4/expo.modules.ui-55.0.4-sources.jar.md5 +1 -0
  127. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.4/expo.modules.ui-55.0.4-sources.jar.sha1 +1 -0
  128. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.4/expo.modules.ui-55.0.4-sources.jar.sha256 +1 -0
  129. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.4/expo.modules.ui-55.0.4-sources.jar.sha512 +1 -0
  130. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.4/expo.modules.ui-55.0.4.aar +0 -0
  131. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.4/expo.modules.ui-55.0.4.aar.md5 +1 -0
  132. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.4/expo.modules.ui-55.0.4.aar.sha1 +1 -0
  133. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.4/expo.modules.ui-55.0.4.aar.sha256 +1 -0
  134. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.4/expo.modules.ui-55.0.4.aar.sha512 +1 -0
  135. package/local-maven-repo/expo/modules/ui/expo.modules.ui/{55.0.2/expo.modules.ui-55.0.2.module → 55.0.4/expo.modules.ui-55.0.4.module} +22 -22
  136. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.4/expo.modules.ui-55.0.4.module.md5 +1 -0
  137. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.4/expo.modules.ui-55.0.4.module.sha1 +1 -0
  138. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.4/expo.modules.ui-55.0.4.module.sha256 +1 -0
  139. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.4/expo.modules.ui-55.0.4.module.sha512 +1 -0
  140. package/local-maven-repo/expo/modules/ui/expo.modules.ui/{55.0.2/expo.modules.ui-55.0.2.pom → 55.0.4/expo.modules.ui-55.0.4.pom} +1 -1
  141. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.4/expo.modules.ui-55.0.4.pom.md5 +1 -0
  142. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.4/expo.modules.ui-55.0.4.pom.sha1 +1 -0
  143. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.4/expo.modules.ui-55.0.4.pom.sha256 +1 -0
  144. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.4/expo.modules.ui-55.0.4.pom.sha512 +1 -0
  145. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml +4 -4
  146. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.md5 +1 -1
  147. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.sha1 +1 -1
  148. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.sha256 +1 -1
  149. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.sha512 +1 -1
  150. package/package.json +9 -2
  151. package/src/datetime-picker/DateTimePicker.android.tsx +126 -0
  152. package/src/datetime-picker/DateTimePicker.tsx +94 -0
  153. package/src/datetime-picker/DateTimePicker.web.tsx +5 -0
  154. package/src/datetime-picker/index.tsx +11 -0
  155. package/src/datetime-picker/types.tsx +147 -0
  156. package/src/jetpack-compose/AnimatedVisibility/index.tsx +206 -0
  157. package/src/jetpack-compose/AnimatedVisibility/symbols.ts +8 -0
  158. package/src/jetpack-compose/Button/index.tsx +69 -92
  159. package/src/jetpack-compose/Card/index.tsx +105 -29
  160. package/src/jetpack-compose/Checkbox/index.tsx +126 -0
  161. package/src/jetpack-compose/Chip/index.tsx +391 -51
  162. package/src/jetpack-compose/DatePicker/index.tsx +112 -7
  163. package/src/jetpack-compose/DropdownMenu/DropdownMenuItem.tsx +126 -0
  164. package/src/jetpack-compose/DropdownMenu/index.tsx +107 -0
  165. package/src/jetpack-compose/FloatingActionButton/index.tsx +207 -0
  166. package/src/jetpack-compose/HorizontalFloatingToolbar/index.tsx +4 -2
  167. package/src/jetpack-compose/IconButton/index.tsx +49 -56
  168. package/src/jetpack-compose/ModalBottomSheet/index.tsx +85 -15
  169. package/src/jetpack-compose/MultiChoiceSegmentedButtonRow/index.tsx +34 -0
  170. package/src/jetpack-compose/Progress/index.tsx +120 -62
  171. package/src/jetpack-compose/RadioButton/index.tsx +8 -9
  172. package/src/jetpack-compose/SegmentedButton/index.tsx +109 -0
  173. package/src/jetpack-compose/SingleChoiceSegmentedButtonRow/index.tsx +34 -0
  174. package/src/jetpack-compose/Slider/index.tsx +76 -29
  175. package/src/jetpack-compose/Switch/index.tsx +17 -87
  176. package/src/jetpack-compose/TextInput/index.tsx +10 -0
  177. package/src/jetpack-compose/ToggleButton/index.tsx +67 -43
  178. package/src/jetpack-compose/index.ts +5 -4
  179. package/src/jetpack-compose/modifiers/index.ts +26 -2
  180. package/src/swift-ui/Link/index.tsx +52 -0
  181. package/src/swift-ui/ProgressView/index.tsx +1 -3
  182. package/src/swift-ui/Stepper/index.tsx +7 -7
  183. package/src/swift-ui/Text/index.tsx +66 -2
  184. package/src/swift-ui/index.tsx +1 -0
  185. package/src/swift-ui/modifiers/environment.ts +17 -4
  186. package/src/swift-ui/modifiers/index.ts +44 -10
  187. package/src/swift-ui/modifiers/widgets.ts +18 -0
  188. package/src/swift-ui/types.ts +5 -0
  189. package/android/src/main/java/expo/modules/ui/FilterChipView.kt +0 -59
  190. package/android/src/main/java/expo/modules/ui/PickerView.kt +0 -161
  191. package/android/src/main/java/expo/modules/ui/TextButtonView.kt +0 -33
  192. package/android/src/main/java/expo/modules/ui/menu/ContextMenu.kt +0 -183
  193. package/android/src/main/java/expo/modules/ui/menu/ContextMenuRecords.kt +0 -64
  194. package/build/jetpack-compose/Button/types.d.ts +0 -5
  195. package/build/jetpack-compose/Button/types.d.ts.map +0 -1
  196. package/build/jetpack-compose/ContextMenu/Submenu.d.ts +0 -17
  197. package/build/jetpack-compose/ContextMenu/Submenu.d.ts.map +0 -1
  198. package/build/jetpack-compose/ContextMenu/index.d.ts +0 -65
  199. package/build/jetpack-compose/ContextMenu/index.d.ts.map +0 -1
  200. package/build/jetpack-compose/ContextMenu/utils.d.ts +0 -24
  201. package/build/jetpack-compose/ContextMenu/utils.d.ts.map +0 -1
  202. package/build/jetpack-compose/FilterChip/index.d.ts +0 -49
  203. package/build/jetpack-compose/FilterChip/index.d.ts.map +0 -1
  204. package/build/jetpack-compose/Picker/index.d.ts +0 -62
  205. package/build/jetpack-compose/Picker/index.d.ts.map +0 -1
  206. package/build/jetpack-compose/TextButton/index.d.ts +0 -29
  207. package/build/jetpack-compose/TextButton/index.d.ts.map +0 -1
  208. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2/expo.modules.ui-55.0.2-sources.jar +0 -0
  209. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2/expo.modules.ui-55.0.2-sources.jar.md5 +0 -1
  210. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2/expo.modules.ui-55.0.2-sources.jar.sha1 +0 -1
  211. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2/expo.modules.ui-55.0.2-sources.jar.sha256 +0 -1
  212. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2/expo.modules.ui-55.0.2-sources.jar.sha512 +0 -1
  213. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2/expo.modules.ui-55.0.2.aar +0 -0
  214. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2/expo.modules.ui-55.0.2.aar.md5 +0 -1
  215. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2/expo.modules.ui-55.0.2.aar.sha1 +0 -1
  216. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2/expo.modules.ui-55.0.2.aar.sha256 +0 -1
  217. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2/expo.modules.ui-55.0.2.aar.sha512 +0 -1
  218. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2/expo.modules.ui-55.0.2.module.md5 +0 -1
  219. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2/expo.modules.ui-55.0.2.module.sha1 +0 -1
  220. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2/expo.modules.ui-55.0.2.module.sha256 +0 -1
  221. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2/expo.modules.ui-55.0.2.module.sha512 +0 -1
  222. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2/expo.modules.ui-55.0.2.pom.md5 +0 -1
  223. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2/expo.modules.ui-55.0.2.pom.sha1 +0 -1
  224. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2/expo.modules.ui-55.0.2.pom.sha256 +0 -1
  225. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.2/expo.modules.ui-55.0.2.pom.sha512 +0 -1
  226. package/src/jetpack-compose/Button/types.ts +0 -57
  227. package/src/jetpack-compose/ContextMenu/Submenu.tsx +0 -21
  228. package/src/jetpack-compose/ContextMenu/index.tsx +0 -149
  229. package/src/jetpack-compose/ContextMenu/utils.ts +0 -144
  230. package/src/jetpack-compose/FilterChip/index.tsx +0 -89
  231. package/src/jetpack-compose/Picker/index.tsx +0 -90
  232. package/src/jetpack-compose/TextButton/index.tsx +0 -55
@@ -1842,6 +1842,14 @@ extension ViewModifierRegistry {
1842
1842
  return try ScrollDisabledModifier(from: params, appContext: appContext)
1843
1843
  }
1844
1844
 
1845
+ register("defaultScrollAnchor") { params, appContext, _ in
1846
+ return try DefaultScrollAnchorModifier(from: params, appContext: appContext)
1847
+ }
1848
+
1849
+ register("defaultScrollAnchorForRole") { params, appContext, _ in
1850
+ return try DefaultScrollAnchorForRoleModifier(from: params, appContext: appContext)
1851
+ }
1852
+
1845
1853
  register("progressViewStyle") { params, appContext, _ in
1846
1854
  return try ProgressViewStyleModifier(from: params, appContext: appContext)
1847
1855
  }
@@ -1885,5 +1893,9 @@ extension ViewModifierRegistry {
1885
1893
  register("contentTransition") { params, appContext, _ in
1886
1894
  return try ContentTransitionModifier(from: params, appContext: appContext)
1887
1895
  }
1896
+
1897
+ register("widgetURL") { params, appContext, _ in
1898
+ return try WidgetURLModifier(from: params, appContext: appContext)
1899
+ }
1888
1900
  }
1889
1901
  }
@@ -44,3 +44,15 @@ internal struct WidgetAccentedRenderingModeModifier: Record {
44
44
  #endif
45
45
  }
46
46
  }
47
+
48
+ internal struct WidgetURLModifier: ViewModifier, Record {
49
+ @Field var url: URL?
50
+
51
+ func body(content: Content) -> some View {
52
+ #if !os(tvOS)
53
+ content.widgetURL(url)
54
+ #else
55
+ content
56
+ #endif
57
+ }
58
+ }
@@ -12,14 +12,10 @@ internal final class PickerProps: UIBaseViewProps {
12
12
 
13
13
  internal struct PickerView: ExpoSwiftUI.View {
14
14
  @State var selection: AnyHashable?
15
- @State var prevSelection: AnyHashable?
16
15
  @ObservedObject var props: PickerProps
17
-
16
+
18
17
  init(props: PickerProps) {
19
18
  self.props = props
20
- let initialSelection = Self.getHashableFromEither(props.selection)
21
- _selection = State(initialValue: initialSelection)
22
- _prevSelection = State(initialValue: initialSelection)
23
19
  }
24
20
 
25
21
  @ViewBuilder
@@ -57,11 +53,11 @@ internal struct PickerView: ExpoSwiftUI.View {
57
53
  }
58
54
  props.onSelectionChange(payload)
59
55
  }
60
- .onReceive(props.selection.publisher) { newValue in
61
- let hashableValue = Self.getHashableFromEither(newValue)
62
- if prevSelection == hashableValue { return }
63
- selection = hashableValue
64
- prevSelection = hashableValue
56
+ .onChange(of: props.selection) { newValue in
57
+ selection = Self.getHashableFromEither(newValue)
58
+ }
59
+ .onAppear {
60
+ selection = Self.getHashableFromEither(props.selection)
65
61
  }
66
62
  }
67
63
 
@@ -7,11 +7,6 @@ internal struct PopoverView: ExpoSwiftUI.View {
7
7
  @ObservedObject var props: PopoverViewProps
8
8
  @State private var isPresented: Bool = false
9
9
 
10
- init(props: PopoverViewProps) {
11
- self.props = props
12
- _isPresented = State(initialValue: props.isPresented)
13
- }
14
-
15
10
  var body: some View {
16
11
  #if os(tvOS)
17
12
  triggerContent
@@ -40,6 +35,9 @@ internal struct PopoverView: ExpoSwiftUI.View {
40
35
  .onChange(of: props.isPresented) { newValue in
41
36
  isPresented = newValue
42
37
  }
38
+ .onAppear {
39
+ isPresented = props.isPresented
40
+ }
43
41
  #endif
44
42
  }
45
43
 
@@ -3,11 +3,6 @@
3
3
  import ExpoModulesCore
4
4
  import SwiftUI
5
5
 
6
- final class ClosedRangeDate: Record {
7
- @Field var lower: Date?
8
- @Field var upper: Date?
9
- }
10
-
11
6
  public final class ProgressViewProps: UIBaseViewProps {
12
7
  @Field var timerInterval: ClosedRangeDate?
13
8
  @Field var countsDown: Bool?
@@ -13,14 +13,12 @@ internal struct SectionView: ExpoSwiftUI.View {
13
13
  @ObservedObject var props: SectionProps
14
14
  @State private var isExpanded: Bool = true
15
15
 
16
- init(props: SectionProps) {
17
- self.props = props
18
- _isExpanded = State(initialValue: props.isExpanded ?? true)
19
- }
20
-
21
16
  var body: some View {
22
17
  if #available(iOS 17.0, macOS 14.0, tvOS 17.0, *), let propIsExpanded = props.isExpanded {
23
18
  collapsibleSection
19
+ .onAppear {
20
+ isExpanded = props.isExpanded ?? true
21
+ }
24
22
  .onChange(of: props.isExpanded) { newValue in
25
23
  if let newValue {
26
24
  isExpanded = newValue
@@ -7,15 +7,21 @@ struct SliderView: ExpoSwiftUI.View {
7
7
  @ObservedObject var props: SliderProps
8
8
  @State var value: Float = 0.0
9
9
  @State var isEditing: Bool = false
10
-
10
+
11
11
  init(props: SliderProps) {
12
12
  self.props = props
13
- _value = State(initialValue: props.value ?? 0.0)
14
13
  }
15
14
 
16
15
  var body: some View {
17
16
  #if !os(tvOS)
18
17
  sliderContent
18
+ .onAppear {
19
+ value = props.value ?? 0.0
20
+ }
21
+ .onChange(of: props.value) { newValue in
22
+ guard !isEditing else { return }
23
+ value = newValue ?? 0.0
24
+ }
19
25
  .onChange(of: value) { newValue in
20
26
  if props.value != newValue {
21
27
  props.onValueChanged([
@@ -23,10 +29,6 @@ struct SliderView: ExpoSwiftUI.View {
23
29
  ])
24
30
  }
25
31
  }
26
- .onReceive(props.value.publisher, perform: { newValue in
27
- guard !isEditing else { return }
28
- value = newValue
29
- })
30
32
  #else
31
33
  Text("Slider is not supported on tvOS")
32
34
  #endif
@@ -5,37 +5,33 @@ import ExpoModulesCore
5
5
 
6
6
  final class StepperProps: UIBaseViewProps {
7
7
  @Field var label: String
8
- @Field var defaultValue: Int?
8
+ @Field var value: Int = 0
9
9
  @Field var min: Int = 0
10
10
  @Field var max: Int = 100
11
11
  @Field var step: Int = 1
12
- var onValueChanged = EventDispatcher()
12
+ var onValueChange = EventDispatcher()
13
13
  }
14
14
 
15
15
  struct StepperView: ExpoSwiftUI.View {
16
16
  @ObservedObject var props: StepperProps
17
- @State var value: Int
18
-
17
+ @State var value: Int = 0
18
+
19
19
  init(props: StepperProps) {
20
20
  self.props = props
21
- let initialValue = props.defaultValue ?? 0
22
- let clampedValue = max(props.min, min(props.max, initialValue))
23
- self._value = State(initialValue: clampedValue)
24
21
  }
25
22
 
26
23
  var body: some View {
27
24
  #if !os(tvOS)
28
25
  Stepper(props.label, value: $value, in: props.min...props.max, step: props.step)
29
- .onChange(of: value, perform: { newValue in
30
- props.onValueChanged(([
31
- "value": Int(newValue)
32
- ]))
33
- })
34
26
  .onAppear {
35
- // Ensure the value is set correctly when the view appears
36
- if let defaultValue = props.defaultValue {
37
- let clampedValue = max(props.min, min(props.max, defaultValue))
38
- value = clampedValue
27
+ value = max(props.min, min(props.max, props.value))
28
+ }
29
+ .onChange(of: props.value) { newValue in
30
+ value = max(props.min, min(props.max, newValue))
31
+ }
32
+ .onChange(of: value) { newValue in
33
+ if props.value != newValue {
34
+ props.onValueChange(["value": Int(newValue)])
39
35
  }
40
36
  }
41
37
  #else
@@ -3,9 +3,28 @@
3
3
  import SwiftUI
4
4
  import ExpoModulesCore
5
5
 
6
+ public enum TextDateStyle: String, Enumerable {
7
+ case timer, relative, offset, date, time
8
+
9
+ func toSwiftUI() -> SwiftUI.Text.DateStyle {
10
+ switch self {
11
+ case .timer: return .timer
12
+ case .relative: return .relative
13
+ case .offset: return .offset
14
+ case .date: return .date
15
+ case .time: return .time
16
+ }
17
+ }
18
+ }
19
+
6
20
  public final class TextViewProps: UIBaseViewProps {
7
21
  @Field public var text: String = ""
8
22
  @Field public var markdownEnabled: Bool = false
23
+ @Field public var date: Date?
24
+ @Field public var dateStyle: TextDateStyle?
25
+ @Field public var timerInterval: ClosedRangeDate?
26
+ @Field public var countsDown: Bool?
27
+ @Field public var pauseTime: Date?
9
28
 
10
29
  // Override default frame alignment for text views
11
30
  override var defaultFrameAlignment: Alignment { .leading }
@@ -24,7 +43,24 @@ public struct TextView: ExpoSwiftUI.View {
24
43
  }
25
44
 
26
45
  internal func buildText(applyModifiers: Bool = true) -> Text {
27
- let text = props.markdownEnabled ? Text(LocalizedStringKey(props.text)) : Text(props.text)
46
+ let text: Text
47
+
48
+ if #available(iOS 16.0, tvOS 16.0, *),
49
+ let timerInterval = props.timerInterval,
50
+ let lower = timerInterval.lower,
51
+ let upper = timerInterval.upper,
52
+ lower <= upper {
53
+ text = Text(
54
+ timerInterval: ClosedRange(uncheckedBounds: (lower: lower, upper: upper)),
55
+ pauseTime: props.pauseTime,
56
+ countsDown: props.countsDown ?? true
57
+ )
58
+ } else if let date = props.date {
59
+ text = Text(date, style: props.dateStyle?.toSwiftUI() ?? .date)
60
+ } else {
61
+ text = props.markdownEnabled ? Text(LocalizedStringKey(props.text)) : Text(props.text)
62
+ }
63
+
28
64
  var result = applyModifiers
29
65
  ? text.applyTextModifiers(props.modifiers, appContext: props.appContext)
30
66
  : text
@@ -13,10 +13,9 @@ internal final class ToggleProps: UIBaseViewProps {
13
13
  internal struct ToggleView: ExpoSwiftUI.View {
14
14
  @ObservedObject var props: ToggleProps
15
15
  @State var checked: Bool = false
16
-
16
+
17
17
  init(props: ToggleProps) {
18
18
  self.props = props
19
- _checked = State(initialValue: props.isOn ?? false)
20
19
  }
21
20
 
22
21
  var body: some View {
@@ -30,11 +29,10 @@ internal struct ToggleView: ExpoSwiftUI.View {
30
29
  ])
31
30
  }
32
31
  .onChange(of: props.isOn) { newValue in
33
- guard let newValue else {
34
- checked = false
35
- return
36
- }
37
- checked = newValue
32
+ checked = newValue ?? false
33
+ }
34
+ .onAppear {
35
+ checked = props.isOn ?? false
38
36
  }
39
37
  }
40
38
 
@@ -0,0 +1 @@
1
+ d37f422ef8d7251d743ce6bbee5e16230ee6d654
@@ -0,0 +1 @@
1
+ 2798646e8f071faefc4a8c8678182ac8aa59fb458469aa6cc088658f4337ada2
@@ -0,0 +1 @@
1
+ 3d3bc9ee569cd399519716c66d92850b7bdde1ec0b0c328b938044699727988e55dbafec203f8f1b4613dd361bcfec03a21c084e031d73d95c45b982bd8ccd76
@@ -0,0 +1 @@
1
+ 734807c9b8517ef0239b2f71af20b03bef6fa322
@@ -0,0 +1 @@
1
+ 7ebaf9bde2723bcb47dd8a3cf5ffbdcf0f81b2d00b9db2926469cb968da468bf
@@ -0,0 +1 @@
1
+ 5ef7ef206deaa6dfef5a2e05e537a30f0403374ac99fdaa68f1c9e93971f6b61fde7ca393032684eb926a3f9ab5f54f706eb6dd8c3908c26f4cb40408401a2f0
@@ -3,7 +3,7 @@
3
3
  "component": {
4
4
  "group": "expo.modules.ui",
5
5
  "module": "expo.modules.ui",
6
- "version": "55.0.2",
6
+ "version": "55.0.4",
7
7
  "attributes": {
8
8
  "org.gradle.status": "release"
9
9
  }
@@ -24,13 +24,13 @@
24
24
  },
25
25
  "files": [
26
26
  {
27
- "name": "expo.modules.ui-55.0.2.aar",
28
- "url": "expo.modules.ui-55.0.2.aar",
29
- "size": 776412,
30
- "sha512": "8a56aa5f1a198809e7bd3601605ec9e5ae7414b7834d6d6a44c024991f27de1cd744ed4b575b23b6b537e3e759c39309b220ca9fe57ec76c42b4130326c331fb",
31
- "sha256": "9a82f1f77a7ee3f302982361eb41e2bb8b86cbd430061a07cce8c4511b40cbf4",
32
- "sha1": "d9837c255bb0284a69d6b234195055a11d9bd98f",
33
- "md5": "c2ddc40af222d8ef304b15d13a112399"
27
+ "name": "expo.modules.ui-55.0.4.aar",
28
+ "url": "expo.modules.ui-55.0.4.aar",
29
+ "size": 941708,
30
+ "sha512": "5ef7ef206deaa6dfef5a2e05e537a30f0403374ac99fdaa68f1c9e93971f6b61fde7ca393032684eb926a3f9ab5f54f706eb6dd8c3908c26f4cb40408401a2f0",
31
+ "sha256": "7ebaf9bde2723bcb47dd8a3cf5ffbdcf0f81b2d00b9db2926469cb968da468bf",
32
+ "sha1": "734807c9b8517ef0239b2f71af20b03bef6fa322",
33
+ "md5": "10502ee86098bcfdce95a529c46261bb"
34
34
  }
35
35
  ]
36
36
  },
@@ -120,13 +120,13 @@
120
120
  ],
121
121
  "files": [
122
122
  {
123
- "name": "expo.modules.ui-55.0.2.aar",
124
- "url": "expo.modules.ui-55.0.2.aar",
125
- "size": 776412,
126
- "sha512": "8a56aa5f1a198809e7bd3601605ec9e5ae7414b7834d6d6a44c024991f27de1cd744ed4b575b23b6b537e3e759c39309b220ca9fe57ec76c42b4130326c331fb",
127
- "sha256": "9a82f1f77a7ee3f302982361eb41e2bb8b86cbd430061a07cce8c4511b40cbf4",
128
- "sha1": "d9837c255bb0284a69d6b234195055a11d9bd98f",
129
- "md5": "c2ddc40af222d8ef304b15d13a112399"
123
+ "name": "expo.modules.ui-55.0.4.aar",
124
+ "url": "expo.modules.ui-55.0.4.aar",
125
+ "size": 941708,
126
+ "sha512": "5ef7ef206deaa6dfef5a2e05e537a30f0403374ac99fdaa68f1c9e93971f6b61fde7ca393032684eb926a3f9ab5f54f706eb6dd8c3908c26f4cb40408401a2f0",
127
+ "sha256": "7ebaf9bde2723bcb47dd8a3cf5ffbdcf0f81b2d00b9db2926469cb968da468bf",
128
+ "sha1": "734807c9b8517ef0239b2f71af20b03bef6fa322",
129
+ "md5": "10502ee86098bcfdce95a529c46261bb"
130
130
  }
131
131
  ]
132
132
  },
@@ -140,13 +140,13 @@
140
140
  },
141
141
  "files": [
142
142
  {
143
- "name": "expo.modules.ui-55.0.2-sources.jar",
144
- "url": "expo.modules.ui-55.0.2-sources.jar",
145
- "size": 56358,
146
- "sha512": "588744d4be57b3e7ed22bcccd40222dcb365367cd3bb72fd0aeb4c0f1925229f986b58712f477a0eebdeb0e8d887b09e0aab21764dc372a5755e622118d88d7b",
147
- "sha256": "2b50088dab0279da8a113fe0396237a4525f8a9fb130d4b1cd15b5072f866a53",
148
- "sha1": "a34da0ffd5b373d346c39f45a5a61ec09f5c1b7b",
149
- "md5": "88aeb5d46abccb005a1f657379a191dd"
143
+ "name": "expo.modules.ui-55.0.4-sources.jar",
144
+ "url": "expo.modules.ui-55.0.4-sources.jar",
145
+ "size": 60549,
146
+ "sha512": "3d3bc9ee569cd399519716c66d92850b7bdde1ec0b0c328b938044699727988e55dbafec203f8f1b4613dd361bcfec03a21c084e031d73d95c45b982bd8ccd76",
147
+ "sha256": "2798646e8f071faefc4a8c8678182ac8aa59fb458469aa6cc088658f4337ada2",
148
+ "sha1": "d37f422ef8d7251d743ce6bbee5e16230ee6d654",
149
+ "md5": "137fa3f768ea1d63be1de27d7d663a43"
150
150
  }
151
151
  ]
152
152
  }
@@ -0,0 +1 @@
1
+ b832195b632ff8761b0a6c59d4a12c0bbfb38f69
@@ -0,0 +1 @@
1
+ 3cde2316fb065490b2bf67953e88eb1c0490df22f69928632b795e760e13a9eb
@@ -0,0 +1 @@
1
+ 1cd6df7a2b2207a6167ddd1f4f34c37745a18fb16c125d58848cf3146fd8a11f43ccdc15f4c1a352a0d55efb1d2df382df19b30051197081b90a52077cb4a6e9
@@ -9,7 +9,7 @@
9
9
  <modelVersion>4.0.0</modelVersion>
10
10
  <groupId>expo.modules.ui</groupId>
11
11
  <artifactId>expo.modules.ui</artifactId>
12
- <version>55.0.2</version>
12
+ <version>55.0.4</version>
13
13
  <packaging>aar</packaging>
14
14
  <name>expo.modules.ui</name>
15
15
  <url>https://github.com/expo/expo</url>
@@ -0,0 +1 @@
1
+ 31874fcef8f1e3fef61c13fe7d64a32ac62819ce
@@ -0,0 +1 @@
1
+ 16bf7ce47844a5483c85b20fad391cfc6c74912b344eddb1e95f70395d9e1c68
@@ -0,0 +1 @@
1
+ f415dd7401f64dcab069526d91ecb1a42d76946ccf955930887bb74c84ac0cc3a7be6c13185cd34105466d1378532f738620c23cf6caa83444088a36d98acdb9
@@ -3,11 +3,11 @@
3
3
  <groupId>expo.modules.ui</groupId>
4
4
  <artifactId>expo.modules.ui</artifactId>
5
5
  <versioning>
6
- <latest>55.0.2</latest>
7
- <release>55.0.2</release>
6
+ <latest>55.0.4</latest>
7
+ <release>55.0.4</release>
8
8
  <versions>
9
- <version>55.0.2</version>
9
+ <version>55.0.4</version>
10
10
  </versions>
11
- <lastUpdated>20260311141702</lastUpdated>
11
+ <lastUpdated>20260318235530</lastUpdated>
12
12
  </versioning>
13
13
  </metadata>
@@ -1 +1 @@
1
- 3297c0326287d50f819c398744e70f0b
1
+ 1ef303d6294658c141b148e218bfa5f2
@@ -1 +1 @@
1
- 52a054a9646396b7224594f0d12720d91de3d216
1
+ 9f2d4595450ecfd97a61c05ecfdaef96283fcf68
@@ -1 +1 @@
1
- 0ae7bf34378bccc60cb770b147533c2b4f1d10ede0a368c6ce75ab9763c6f66e
1
+ 9214fc11ed71f55ebf46e8f7af5932b8d7ae30b2913e59a2f164e6ec886aa1fe
@@ -1 +1 @@
1
- b3f9f47205d7673ff988ddfc4632e556083ab8f5452376963677b9cc91314ff7363f811f1dfa575e8ead3c870ad237f0e930ee8804bdda308b00487e82bcd112
1
+ b99c173582718ffd673f85f8888fc07c83406aec2344101e8def140a275ea3b1e4a54d91c9b5a43a909b89ebff90ef60bd7e0ae9bec3f3666749c1cc8dd90635
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@expo/ui",
3
- "version": "55.0.2",
3
+ "version": "55.0.4",
4
4
  "description": "A collection of UI components",
5
5
  "sideEffects": [
6
6
  "*.fx.js"
@@ -22,6 +22,10 @@
22
22
  "./jetpack-compose/modifiers": {
23
23
  "types": "./build/jetpack-compose/modifiers/index.d.ts",
24
24
  "default": "./src/jetpack-compose/modifiers/index.ts"
25
+ },
26
+ "./datetimepicker": {
27
+ "types": "./build/datetime-picker/index.d.ts",
28
+ "default": "./src/datetime-picker/index.tsx"
25
29
  }
26
30
  },
27
31
  "scripts": {
@@ -55,10 +59,13 @@
55
59
  "@types/react": "~19.2.0",
56
60
  "expo-module-scripts": "^55.0.2"
57
61
  },
62
+ "jest": {
63
+ "preset": "expo-module-scripts"
64
+ },
58
65
  "peerDependencies": {
59
66
  "expo": "*",
60
67
  "react": "*",
61
68
  "react-native": "*"
62
69
  },
63
- "gitHead": "bcdd2c239f8a92cdf5140e35cde768352630acd6"
70
+ "gitHead": "31afdbe5613d666148711cb3ec58c4b617a00c14"
64
71
  }
@@ -0,0 +1,126 @@
1
+ import { buildEvent, buildChangeEvent, type DateTimePickerProps } from './types';
2
+ import {
3
+ DateTimePicker as AndroidPicker,
4
+ DatePickerDialog as AndroidDatePickerDialog,
5
+ TimePickerDialog as AndroidTimePickerDialog,
6
+ type DateTimePickerProps as AndroidDateTimePickerProps,
7
+ } from '../jetpack-compose/DatePicker';
8
+ import { Host } from '../jetpack-compose/Host';
9
+
10
+ function modeToDisplayedComponents(
11
+ mode: DateTimePickerProps['mode']
12
+ ): AndroidDateTimePickerProps['displayedComponents'] {
13
+ switch (mode) {
14
+ case 'time':
15
+ return 'hourAndMinute';
16
+ case 'datetime':
17
+ // Android has no inline datetime picker — fall back to date only.
18
+ return 'date';
19
+ case 'date':
20
+ default:
21
+ return 'date';
22
+ }
23
+ }
24
+
25
+ function displayToAndroidVariant(
26
+ display: DateTimePickerProps['display']
27
+ ): AndroidDateTimePickerProps['variant'] {
28
+ switch (display) {
29
+ case 'spinner':
30
+ return 'input';
31
+ default:
32
+ return 'picker';
33
+ }
34
+ }
35
+
36
+ export function DateTimePicker(props: DateTimePickerProps) {
37
+ const {
38
+ value,
39
+ onChange,
40
+ onValueChange,
41
+ onDismiss: onDismissProp,
42
+ mode = 'date',
43
+ minimumDate,
44
+ maximumDate,
45
+ display = 'default',
46
+ is24Hour,
47
+ testID,
48
+ style,
49
+ accentColor,
50
+ presentation = 'dialog',
51
+ positiveButton,
52
+ negativeButton,
53
+ } = props;
54
+
55
+ const onDismissed = () => {
56
+ if (onDismissProp) {
57
+ onDismissProp();
58
+ } else {
59
+ onChange?.(
60
+ {
61
+ type: 'dismissed',
62
+ nativeEvent: {
63
+ timestamp: value.getTime(),
64
+ utcOffset: -value.getTimezoneOffset(),
65
+ },
66
+ },
67
+ value
68
+ );
69
+ }
70
+ };
71
+
72
+ const onDateSelected = (date: Date) => {
73
+ if (onValueChange) {
74
+ onValueChange(buildChangeEvent(date), date);
75
+ } else {
76
+ onChange?.(buildEvent(date), date);
77
+ }
78
+ };
79
+
80
+ const selectableDates =
81
+ minimumDate || maximumDate ? { start: minimumDate, end: maximumDate } : undefined;
82
+
83
+ const dialogProps = {
84
+ initialDate: value.toISOString(),
85
+ color: accentColor,
86
+ confirmButtonLabel: positiveButton?.label,
87
+ dismissButtonLabel: negativeButton?.label,
88
+ onDateSelected,
89
+ onDismissRequest: onDismissed,
90
+ } as const;
91
+
92
+ if (presentation === 'dialog') {
93
+ if (mode === 'time') {
94
+ return (
95
+ <Host style={style}>
96
+ <AndroidTimePickerDialog {...dialogProps} is24Hour={is24Hour} />
97
+ </Host>
98
+ );
99
+ }
100
+ return (
101
+ <Host style={style}>
102
+ <AndroidDatePickerDialog
103
+ {...dialogProps}
104
+ variant={displayToAndroidVariant(display)}
105
+ selectableDates={selectableDates}
106
+ />
107
+ </Host>
108
+ );
109
+ }
110
+
111
+ return (
112
+ <Host matchContents={{ vertical: true }} style={style}>
113
+ <AndroidPicker
114
+ initialDate={value.toISOString()}
115
+ displayedComponents={modeToDisplayedComponents(mode)}
116
+ variant={displayToAndroidVariant(display)}
117
+ selectableDates={selectableDates}
118
+ is24Hour={is24Hour}
119
+ color={accentColor}
120
+ onDateSelected={onDateSelected}
121
+ showVariantToggle={false}
122
+ {...(testID ? { testID } : undefined)}
123
+ />
124
+ </Host>
125
+ );
126
+ }