@expo/ui 55.0.1 → 55.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (269) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/CONTRIBUTING.md +30 -0
  3. package/android/build.gradle +2 -2
  4. package/android/src/main/java/expo/modules/ui/AnimatedVisibilityView.kt +130 -0
  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 +302 -31
  9. package/android/src/main/java/expo/modules/ui/ExpoUIModule.kt +204 -57
  10. package/android/src/main/java/expo/modules/ui/HorizontalFloatingToolbarView.kt +21 -8
  11. package/android/src/main/java/expo/modules/ui/ModifierRegistry.kt +149 -40
  12. package/android/src/main/java/expo/modules/ui/ProgressView.kt +189 -89
  13. package/android/src/main/java/expo/modules/ui/RNHostView.kt +204 -50
  14. package/android/src/main/java/expo/modules/ui/RadioButtonView.kt +3 -7
  15. package/android/src/main/java/expo/modules/ui/SegmentedButtonView.kt +115 -0
  16. package/android/src/main/java/expo/modules/ui/SegmentedControlView.kt +35 -0
  17. package/android/src/main/java/expo/modules/ui/SliderView.kt +70 -12
  18. package/android/src/main/java/expo/modules/ui/SwitchView.kt +62 -104
  19. package/android/src/main/java/expo/modules/ui/ToggleButtonView.kt +95 -57
  20. package/android/src/main/java/expo/modules/ui/button/Button.kt +117 -158
  21. package/android/src/main/java/expo/modules/ui/button/FloatingActionButton.kt +92 -0
  22. package/android/src/main/java/expo/modules/ui/button/IconButton.kt +73 -80
  23. package/android/src/main/java/expo/modules/ui/convertibles/AnimatableFloat.kt +26 -0
  24. package/android/src/main/java/expo/modules/ui/convertibles/AnimationSpecParams.kt +93 -0
  25. package/android/src/main/java/expo/modules/ui/convertibles/GraphicsLayerParams.kt +24 -0
  26. package/android/src/main/java/expo/modules/ui/menu/DropdownMenu.kt +39 -0
  27. package/android/src/main/java/expo/modules/ui/menu/DropdownMenuItem.kt +70 -0
  28. package/android/src/main/java/expo/modules/ui/menu/DropdownMenuRecords.kt +18 -0
  29. package/build/jetpack-compose/AnimatedVisibility/index.d.ts +134 -0
  30. package/build/jetpack-compose/AnimatedVisibility/index.d.ts.map +1 -0
  31. package/build/jetpack-compose/AnimatedVisibility/symbols.d.ts +3 -0
  32. package/build/jetpack-compose/AnimatedVisibility/symbols.d.ts.map +1 -0
  33. package/build/jetpack-compose/Button/index.d.ts +65 -51
  34. package/build/jetpack-compose/Button/index.d.ts.map +1 -1
  35. package/build/jetpack-compose/Card/index.d.ts +72 -14
  36. package/build/jetpack-compose/Card/index.d.ts.map +1 -1
  37. package/build/jetpack-compose/Checkbox/index.d.ts +73 -0
  38. package/build/jetpack-compose/Checkbox/index.d.ts.map +1 -0
  39. package/build/jetpack-compose/Chip/index.d.ts +247 -27
  40. package/build/jetpack-compose/Chip/index.d.ts.map +1 -1
  41. package/build/jetpack-compose/DatePicker/index.d.ts +137 -3
  42. package/build/jetpack-compose/DatePicker/index.d.ts.map +1 -1
  43. package/build/jetpack-compose/DropdownMenu/DropdownMenuItem.d.ts +70 -0
  44. package/build/jetpack-compose/DropdownMenu/DropdownMenuItem.d.ts.map +1 -0
  45. package/build/jetpack-compose/DropdownMenu/index.d.ts +68 -0
  46. package/build/jetpack-compose/DropdownMenu/index.d.ts.map +1 -0
  47. package/build/jetpack-compose/FloatingActionButton/index.d.ts +150 -0
  48. package/build/jetpack-compose/FloatingActionButton/index.d.ts.map +1 -0
  49. package/build/jetpack-compose/HorizontalFloatingToolbar/index.d.ts +2 -2
  50. package/build/jetpack-compose/HorizontalFloatingToolbar/index.d.ts.map +1 -1
  51. package/build/jetpack-compose/IconButton/index.d.ts +45 -29
  52. package/build/jetpack-compose/IconButton/index.d.ts.map +1 -1
  53. package/build/jetpack-compose/MultiChoiceSegmentedButtonRow/index.d.ts +17 -0
  54. package/build/jetpack-compose/MultiChoiceSegmentedButtonRow/index.d.ts.map +1 -0
  55. package/build/jetpack-compose/Progress/index.d.ts +78 -35
  56. package/build/jetpack-compose/Progress/index.d.ts.map +1 -1
  57. package/build/jetpack-compose/RadioButton/index.d.ts +2 -2
  58. package/build/jetpack-compose/RadioButton/index.d.ts.map +1 -1
  59. package/build/jetpack-compose/SegmentedButton/index.d.ts +74 -0
  60. package/build/jetpack-compose/SegmentedButton/index.d.ts.map +1 -0
  61. package/build/jetpack-compose/SingleChoiceSegmentedButtonRow/index.d.ts +17 -0
  62. package/build/jetpack-compose/SingleChoiceSegmentedButtonRow/index.d.ts.map +1 -0
  63. package/build/jetpack-compose/Slider/index.d.ts +34 -10
  64. package/build/jetpack-compose/Slider/index.d.ts.map +1 -1
  65. package/build/jetpack-compose/Spacer/index.d.ts +2 -2
  66. package/build/jetpack-compose/Switch/index.d.ts +25 -47
  67. package/build/jetpack-compose/Switch/index.d.ts.map +1 -1
  68. package/build/jetpack-compose/ToggleButton/index.d.ts +60 -32
  69. package/build/jetpack-compose/ToggleButton/index.d.ts.map +1 -1
  70. package/build/jetpack-compose/index.d.ts +5 -4
  71. package/build/jetpack-compose/index.d.ts.map +1 -1
  72. package/build/jetpack-compose/modifiers/animation.d.ts +44 -0
  73. package/build/jetpack-compose/modifiers/animation.d.ts.map +1 -0
  74. package/build/jetpack-compose/modifiers/index.d.ts +68 -4
  75. package/build/jetpack-compose/modifiers/index.d.ts.map +1 -1
  76. package/build/swift-ui/AccessoryWidgetBackground/index.d.ts +4 -0
  77. package/build/swift-ui/AccessoryWidgetBackground/index.d.ts.map +1 -0
  78. package/build/swift-ui/ConfirmationDialog/index.d.ts.map +1 -1
  79. package/build/swift-ui/ContextMenu/index.d.ts.map +1 -1
  80. package/build/swift-ui/ControlGroup/index.d.ts +29 -0
  81. package/build/swift-ui/ControlGroup/index.d.ts.map +1 -0
  82. package/build/swift-ui/Gauge/index.d.ts.map +1 -1
  83. package/build/swift-ui/Image/index.d.ts +7 -1
  84. package/build/swift-ui/Image/index.d.ts.map +1 -1
  85. package/build/swift-ui/Label/index.d.ts.map +1 -1
  86. package/build/swift-ui/LabeledContent/index.d.ts.map +1 -1
  87. package/build/swift-ui/Menu/index.d.ts.map +1 -1
  88. package/build/swift-ui/Picker/index.d.ts.map +1 -1
  89. package/build/swift-ui/Popover/index.d.ts.map +1 -1
  90. package/build/swift-ui/ProgressView/index.d.ts +1 -5
  91. package/build/swift-ui/ProgressView/index.d.ts.map +1 -1
  92. package/build/swift-ui/Section/index.d.ts.map +1 -1
  93. package/build/swift-ui/Slider/index.d.ts.map +1 -1
  94. package/build/swift-ui/SlotView.d.ts +5 -0
  95. package/build/swift-ui/SlotView.d.ts.map +1 -0
  96. package/build/swift-ui/Stepper/index.d.ts +3 -3
  97. package/build/swift-ui/Stepper/index.d.ts.map +1 -1
  98. package/build/swift-ui/Text/index.d.ts +33 -1
  99. package/build/swift-ui/Text/index.d.ts.map +1 -1
  100. package/build/swift-ui/index.d.ts +2 -0
  101. package/build/swift-ui/index.d.ts.map +1 -1
  102. package/build/swift-ui/modifiers/index.d.ts +54 -1
  103. package/build/swift-ui/modifiers/index.d.ts.map +1 -1
  104. package/build/swift-ui/modifiers/shapes/index.d.ts +2 -2
  105. package/build/swift-ui/types.d.ts +7 -0
  106. package/build/swift-ui/types.d.ts.map +1 -1
  107. package/expo-module.config.json +1 -1
  108. package/ios/AccessoryWidgetBackgroundView.swift +27 -0
  109. package/ios/BottomSheetView.swift +1 -6
  110. package/ios/ClosedRangeDateRecord.swift +10 -0
  111. package/ios/ColorPickerView.swift +9 -8
  112. package/ios/ConfirmationDialog/ConfirmationDialog.swift +7 -15
  113. package/ios/ConfirmationDialog/ConfirmationDialogProps.swift +0 -5
  114. package/ios/ContextMenu/ContextMenu.swift +27 -22
  115. package/ios/ContextMenu/ContextMenuRecords.swift +0 -6
  116. package/ios/ControlGroupView.swift +33 -0
  117. package/ios/DatePickerView.swift +7 -5
  118. package/ios/DisclosureGroupView.swift +5 -7
  119. package/ios/ExpoUIModule.swift +10 -32
  120. package/ios/GaugeView.swift +4 -26
  121. package/ios/HostView.swift +1 -2
  122. package/ios/ImageView.swift +22 -11
  123. package/ios/Label.swift +2 -17
  124. package/ios/LabeledContentView.swift +3 -27
  125. package/ios/ListView.swift +6 -14
  126. package/ios/Menu/MenuRecords.swift +0 -2
  127. package/ios/Menu/MenuView.swift +2 -5
  128. package/ios/Modifiers/DefaultScrollAnchorForRoleModifier.swift +32 -0
  129. package/ios/Modifiers/DefaultScrollAnchorModifier.swift +16 -0
  130. package/ios/Modifiers/ResizableModifier.swift +24 -0
  131. package/ios/Modifiers/Rotation3DEffectModifier.swift +20 -0
  132. package/ios/Modifiers/View+ModifierArray.swift +29 -0
  133. package/ios/Modifiers/ViewModifierRegistry.swift +37 -3
  134. package/ios/Modifiers/WidgetModifiers.swift +46 -0
  135. package/ios/Picker/PickerView.swift +8 -16
  136. package/ios/Popover/PopoverProps.swift +0 -4
  137. package/ios/Popover/PopoverView.swift +5 -11
  138. package/ios/ProgressView.swift +0 -5
  139. package/ios/RNHostView.swift +91 -10
  140. package/ios/SectionView.swift +9 -17
  141. package/ios/SecureFieldView.swift +0 -1
  142. package/ios/ShareLink/ShareLinkView.swift +1 -1
  143. package/ios/SliderView.swift +16 -31
  144. package/ios/SlotView.swift +38 -0
  145. package/ios/StepperView.swift +12 -16
  146. package/ios/TextFieldView.swift +0 -1
  147. package/ios/TextView.swift +37 -1
  148. package/ios/Toggle/ToggleView.swift +5 -7
  149. package/ios/UIBaseView.swift +34 -3
  150. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.3/expo.modules.ui-55.0.3-sources.jar +0 -0
  151. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.3/expo.modules.ui-55.0.3-sources.jar.md5 +1 -0
  152. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.3/expo.modules.ui-55.0.3-sources.jar.sha1 +1 -0
  153. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.3/expo.modules.ui-55.0.3-sources.jar.sha256 +1 -0
  154. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.3/expo.modules.ui-55.0.3-sources.jar.sha512 +1 -0
  155. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.3/expo.modules.ui-55.0.3.aar +0 -0
  156. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.3/expo.modules.ui-55.0.3.aar.md5 +1 -0
  157. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.3/expo.modules.ui-55.0.3.aar.sha1 +1 -0
  158. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.3/expo.modules.ui-55.0.3.aar.sha256 +1 -0
  159. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.3/expo.modules.ui-55.0.3.aar.sha512 +1 -0
  160. package/local-maven-repo/expo/modules/ui/expo.modules.ui/{55.0.1/expo.modules.ui-55.0.1.module → 55.0.3/expo.modules.ui-55.0.3.module} +22 -22
  161. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.3/expo.modules.ui-55.0.3.module.md5 +1 -0
  162. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.3/expo.modules.ui-55.0.3.module.sha1 +1 -0
  163. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.3/expo.modules.ui-55.0.3.module.sha256 +1 -0
  164. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.3/expo.modules.ui-55.0.3.module.sha512 +1 -0
  165. package/local-maven-repo/expo/modules/ui/expo.modules.ui/{55.0.1/expo.modules.ui-55.0.1.pom → 55.0.3/expo.modules.ui-55.0.3.pom} +1 -1
  166. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.3/expo.modules.ui-55.0.3.pom.md5 +1 -0
  167. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.3/expo.modules.ui-55.0.3.pom.sha1 +1 -0
  168. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.3/expo.modules.ui-55.0.3.pom.sha256 +1 -0
  169. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.3/expo.modules.ui-55.0.3.pom.sha512 +1 -0
  170. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml +4 -4
  171. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.md5 +1 -1
  172. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.sha1 +1 -1
  173. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.sha256 +1 -1
  174. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.sha512 +1 -1
  175. package/package.json +5 -2
  176. package/src/jetpack-compose/AnimatedVisibility/index.tsx +206 -0
  177. package/src/jetpack-compose/AnimatedVisibility/symbols.ts +8 -0
  178. package/src/jetpack-compose/Button/index.tsx +69 -92
  179. package/src/jetpack-compose/Card/index.tsx +105 -29
  180. package/src/jetpack-compose/Checkbox/index.tsx +126 -0
  181. package/src/jetpack-compose/Chip/index.tsx +391 -51
  182. package/src/jetpack-compose/DatePicker/index.tsx +215 -6
  183. package/src/jetpack-compose/DropdownMenu/DropdownMenuItem.tsx +126 -0
  184. package/src/jetpack-compose/DropdownMenu/index.tsx +107 -0
  185. package/src/jetpack-compose/FloatingActionButton/index.tsx +207 -0
  186. package/src/jetpack-compose/HorizontalFloatingToolbar/index.tsx +4 -2
  187. package/src/jetpack-compose/IconButton/index.tsx +49 -56
  188. package/src/jetpack-compose/MultiChoiceSegmentedButtonRow/index.tsx +34 -0
  189. package/src/jetpack-compose/Progress/index.tsx +120 -62
  190. package/src/jetpack-compose/RadioButton/index.tsx +8 -9
  191. package/src/jetpack-compose/SegmentedButton/index.tsx +109 -0
  192. package/src/jetpack-compose/SingleChoiceSegmentedButtonRow/index.tsx +34 -0
  193. package/src/jetpack-compose/Slider/index.tsx +76 -29
  194. package/src/jetpack-compose/Spacer/index.tsx +2 -2
  195. package/src/jetpack-compose/Switch/index.tsx +32 -84
  196. package/src/jetpack-compose/ToggleButton/index.tsx +67 -43
  197. package/src/jetpack-compose/index.ts +5 -4
  198. package/src/jetpack-compose/modifiers/animation.ts +37 -0
  199. package/src/jetpack-compose/modifiers/index.ts +86 -6
  200. package/src/swift-ui/AccessoryWidgetBackground/index.tsx +12 -0
  201. package/src/swift-ui/ConfirmationDialog/index.tsx +4 -12
  202. package/src/swift-ui/ContextMenu/index.tsx +6 -20
  203. package/src/swift-ui/ControlGroup/index.tsx +59 -0
  204. package/src/swift-ui/Gauge/index.tsx +5 -20
  205. package/src/swift-ui/Image/index.tsx +7 -1
  206. package/src/swift-ui/Label/index.tsx +2 -5
  207. package/src/swift-ui/LabeledContent/index.tsx +3 -12
  208. package/src/swift-ui/Menu/index.tsx +2 -6
  209. package/src/swift-ui/Picker/index.tsx +4 -11
  210. package/src/swift-ui/Popover/index.tsx +3 -12
  211. package/src/swift-ui/ProgressView/index.tsx +1 -3
  212. package/src/swift-ui/Section/index.tsx +4 -9
  213. package/src/swift-ui/Slider/index.tsx +4 -12
  214. package/src/swift-ui/SlotView.tsx +8 -0
  215. package/src/swift-ui/Stepper/index.tsx +7 -7
  216. package/src/swift-ui/Text/index.tsx +66 -2
  217. package/src/swift-ui/index.tsx +2 -0
  218. package/src/swift-ui/modifiers/index.ts +87 -1
  219. package/src/swift-ui/types.ts +5 -0
  220. package/android/src/main/java/expo/modules/ui/FilterChipView.kt +0 -59
  221. package/android/src/main/java/expo/modules/ui/PickerView.kt +0 -161
  222. package/android/src/main/java/expo/modules/ui/TextButtonView.kt +0 -33
  223. package/android/src/main/java/expo/modules/ui/menu/ContextMenu.kt +0 -183
  224. package/android/src/main/java/expo/modules/ui/menu/ContextMenuRecords.kt +0 -64
  225. package/build/jetpack-compose/Button/types.d.ts +0 -5
  226. package/build/jetpack-compose/Button/types.d.ts.map +0 -1
  227. package/build/jetpack-compose/ContextMenu/Submenu.d.ts +0 -17
  228. package/build/jetpack-compose/ContextMenu/Submenu.d.ts.map +0 -1
  229. package/build/jetpack-compose/ContextMenu/index.d.ts +0 -65
  230. package/build/jetpack-compose/ContextMenu/index.d.ts.map +0 -1
  231. package/build/jetpack-compose/ContextMenu/utils.d.ts +0 -24
  232. package/build/jetpack-compose/ContextMenu/utils.d.ts.map +0 -1
  233. package/build/jetpack-compose/FilterChip/index.d.ts +0 -49
  234. package/build/jetpack-compose/FilterChip/index.d.ts.map +0 -1
  235. package/build/jetpack-compose/Picker/index.d.ts +0 -62
  236. package/build/jetpack-compose/Picker/index.d.ts.map +0 -1
  237. package/build/jetpack-compose/TextButton/index.d.ts +0 -29
  238. package/build/jetpack-compose/TextButton/index.d.ts.map +0 -1
  239. package/ios/ConfirmationDialog/ConfirmationDialogComponents.swift +0 -26
  240. package/ios/ContextMenu/ContextMenuComponents.swift +0 -37
  241. package/ios/Menu/MenuComponents.swift +0 -12
  242. package/ios/Picker/PickerComponents.swift +0 -24
  243. package/ios/Popover/PopoverComponents.swift +0 -18
  244. package/ios/SectionComponents.swift +0 -34
  245. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.1/expo.modules.ui-55.0.1-sources.jar +0 -0
  246. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.1/expo.modules.ui-55.0.1-sources.jar.md5 +0 -1
  247. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.1/expo.modules.ui-55.0.1-sources.jar.sha1 +0 -1
  248. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.1/expo.modules.ui-55.0.1-sources.jar.sha256 +0 -1
  249. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.1/expo.modules.ui-55.0.1-sources.jar.sha512 +0 -1
  250. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.1/expo.modules.ui-55.0.1.aar +0 -0
  251. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.1/expo.modules.ui-55.0.1.aar.md5 +0 -1
  252. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.1/expo.modules.ui-55.0.1.aar.sha1 +0 -1
  253. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.1/expo.modules.ui-55.0.1.aar.sha256 +0 -1
  254. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.1/expo.modules.ui-55.0.1.aar.sha512 +0 -1
  255. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.1/expo.modules.ui-55.0.1.module.md5 +0 -1
  256. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.1/expo.modules.ui-55.0.1.module.sha1 +0 -1
  257. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.1/expo.modules.ui-55.0.1.module.sha256 +0 -1
  258. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.1/expo.modules.ui-55.0.1.module.sha512 +0 -1
  259. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.1/expo.modules.ui-55.0.1.pom.md5 +0 -1
  260. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.1/expo.modules.ui-55.0.1.pom.sha1 +0 -1
  261. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.1/expo.modules.ui-55.0.1.pom.sha256 +0 -1
  262. package/local-maven-repo/expo/modules/ui/expo.modules.ui/55.0.1/expo.modules.ui-55.0.1.pom.sha512 +0 -1
  263. package/src/jetpack-compose/Button/types.ts +0 -57
  264. package/src/jetpack-compose/ContextMenu/Submenu.tsx +0 -21
  265. package/src/jetpack-compose/ContextMenu/index.tsx +0 -149
  266. package/src/jetpack-compose/ContextMenu/utils.ts +0 -144
  267. package/src/jetpack-compose/FilterChip/index.tsx +0 -89
  268. package/src/jetpack-compose/Picker/index.tsx +0 -90
  269. package/src/jetpack-compose/TextButton/index.tsx +0 -55
@@ -1,10 +1,16 @@
1
1
  package expo.modules.ui
2
2
 
3
+ import androidx.compose.material3.AlertDialog
4
+ import androidx.compose.ui.res.stringResource
3
5
  import androidx.compose.material3.DatePicker
4
6
  import androidx.compose.material3.DatePickerDefaults
7
+ import androidx.compose.material3.DatePickerDialog
5
8
  import androidx.compose.material3.DatePickerState
6
9
  import androidx.compose.material3.DisplayMode
7
10
  import androidx.compose.material3.ExperimentalMaterial3Api
11
+ import androidx.compose.material3.SelectableDates
12
+ import androidx.compose.material3.Text
13
+ import androidx.compose.material3.TextButton
8
14
  import androidx.compose.material3.TimePicker
9
15
  import androidx.compose.material3.TimePickerDefaults
10
16
  import androidx.compose.material3.TimePickerLayoutType
@@ -28,10 +34,11 @@ data class DatePickerResult(
28
34
  val date: Long?
29
35
  ) : Record
30
36
 
37
+
31
38
  enum class DisplayedComponents(val value: String) : Enumerable {
32
39
  DATE("date"),
33
40
  HOUR_AND_MINUTE("hourAndMinute"),
34
- DATE_AND_TIME("dateAndTime")
41
+ DATE_AND_TIME("dateAndTime") // for alignment with JS, not supported at the moment
35
42
  }
36
43
 
37
44
  enum class Variant(val value: String) : Enumerable {
@@ -47,26 +54,298 @@ enum class Variant(val value: String) : Enumerable {
47
54
  }
48
55
  }
49
56
 
57
+ class DateTimePickerColorOverrides : Record {
58
+ // DatePicker colors
59
+ @Field val containerColor: AndroidColor? = null
60
+ @Field val titleContentColor: AndroidColor? = null
61
+ @Field val headlineContentColor: AndroidColor? = null
62
+ @Field val weekdayContentColor: AndroidColor? = null
63
+ @Field val subheadContentColor: AndroidColor? = null
64
+ @Field val navigationContentColor: AndroidColor? = null
65
+ @Field val yearContentColor: AndroidColor? = null
66
+ @Field val disabledYearContentColor: AndroidColor? = null
67
+ @Field val currentYearContentColor: AndroidColor? = null
68
+ @Field val selectedYearContentColor: AndroidColor? = null
69
+ @Field val disabledSelectedYearContentColor: AndroidColor? = null
70
+ @Field val selectedYearContainerColor: AndroidColor? = null
71
+ @Field val disabledSelectedYearContainerColor: AndroidColor? = null
72
+ @Field val dayContentColor: AndroidColor? = null
73
+ @Field val disabledDayContentColor: AndroidColor? = null
74
+ @Field val selectedDayContentColor: AndroidColor? = null
75
+ @Field val disabledSelectedDayContentColor: AndroidColor? = null
76
+ @Field val selectedDayContainerColor: AndroidColor? = null
77
+ @Field val disabledSelectedDayContainerColor: AndroidColor? = null
78
+ @Field val todayContentColor: AndroidColor? = null
79
+ @Field val todayDateBorderColor: AndroidColor? = null
80
+ @Field val dayInSelectionRangeContentColor: AndroidColor? = null
81
+ @Field val dayInSelectionRangeContainerColor: AndroidColor? = null
82
+ @Field val dividerColor: AndroidColor? = null
83
+
84
+ // TimePicker colors
85
+ @Field val clockDialColor: AndroidColor? = null
86
+ @Field val clockDialSelectedContentColor: AndroidColor? = null
87
+ @Field val clockDialUnselectedContentColor: AndroidColor? = null
88
+ @Field val selectorColor: AndroidColor? = null
89
+ @Field val periodSelectorBorderColor: AndroidColor? = null
90
+ @Field val periodSelectorSelectedContainerColor: AndroidColor? = null
91
+ @Field val periodSelectorUnselectedContainerColor: AndroidColor? = null
92
+ @Field val periodSelectorSelectedContentColor: AndroidColor? = null
93
+ @Field val periodSelectorUnselectedContentColor: AndroidColor? = null
94
+ @Field val timeSelectorSelectedContainerColor: AndroidColor? = null
95
+ @Field val timeSelectorUnselectedContainerColor: AndroidColor? = null
96
+ @Field val timeSelectorSelectedContentColor: AndroidColor? = null
97
+ @Field val timeSelectorUnselectedContentColor: AndroidColor? = null
98
+ }
99
+
100
+ class SelectableDatesRecord : Record {
101
+ @Field val start: Long? = null
102
+ @Field val end: Long? = null
103
+ }
104
+
50
105
  data class DateTimePickerProps(
51
- val title: String = "",
52
106
  val initialDate: Long? = null,
53
107
  val variant: Variant = Variant.PICKER,
54
108
  val displayedComponents: DisplayedComponents = DisplayedComponents.DATE,
55
109
  val showVariantToggle: Boolean = true,
56
110
  val is24Hour: Boolean = true,
57
111
  val color: AndroidColor? = null,
112
+ val elementColors: DateTimePickerColorOverrides = DateTimePickerColorOverrides(),
113
+ val selectableDates: SelectableDatesRecord? = null,
58
114
  val modifiers: ModifierList = emptyList()
59
115
  ) : ComposeProps
60
116
 
117
+ data class DatePickerDialogProps(
118
+ val initialDate: Long? = null,
119
+ val variant: Variant = Variant.PICKER,
120
+ val showVariantToggle: Boolean = true,
121
+ val confirmButtonLabel: String? = null,
122
+ val dismissButtonLabel: String? = null,
123
+ val color: AndroidColor? = null,
124
+ val elementColors: DateTimePickerColorOverrides = DateTimePickerColorOverrides(),
125
+ val selectableDates: SelectableDatesRecord? = null,
126
+ ) : ComposeProps
127
+
128
+ data class TimePickerDialogProps(
129
+ val initialDate: Long? = null,
130
+ val is24Hour: Boolean = true,
131
+ val confirmButtonLabel: String? = null,
132
+ val dismissButtonLabel: String? = null,
133
+ val color: AndroidColor? = null,
134
+ val elementColors: DateTimePickerColorOverrides = DateTimePickerColorOverrides(),
135
+ ) : ComposeProps
136
+
137
+ private fun toUtcDayMillis(localMillis: Long): Long {
138
+ val cal = Calendar.getInstance()
139
+ cal.timeInMillis = localMillis
140
+ val utcCal = Calendar.getInstance(java.util.TimeZone.getTimeZone("UTC"))
141
+ utcCal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0)
142
+ utcCal.set(Calendar.MILLISECOND, 0)
143
+ return utcCal.timeInMillis
144
+ }
145
+
146
+ @OptIn(ExperimentalMaterial3Api::class)
147
+ @Composable
148
+ fun rememberSelectableDates(selectableDatesRecord: SelectableDatesRecord?): SelectableDates {
149
+ val start = selectableDatesRecord?.start
150
+ val end = selectableDatesRecord?.end
151
+ return remember(start, end) {
152
+ if (start != null || end != null) {
153
+ val startUtcDayMillis = start?.let { toUtcDayMillis(it) }
154
+ val endUtcDayMillis = end?.let { toUtcDayMillis(it) }
155
+
156
+ val startYear = start?.let {
157
+ val cal = Calendar.getInstance()
158
+ cal.timeInMillis = it
159
+ cal.get(Calendar.YEAR)
160
+ }
161
+ val endYear = end?.let {
162
+ val cal = Calendar.getInstance()
163
+ cal.timeInMillis = it
164
+ cal.get(Calendar.YEAR)
165
+ }
166
+
167
+ object : SelectableDates {
168
+ override fun isSelectableDate(utcTimeMillis: Long): Boolean {
169
+ if (startUtcDayMillis != null && utcTimeMillis < startUtcDayMillis) return false
170
+ if (endUtcDayMillis != null && utcTimeMillis > endUtcDayMillis) return false
171
+ return true
172
+ }
173
+
174
+ override fun isSelectableYear(year: Int): Boolean {
175
+ if (startYear != null && year < startYear) return false
176
+ if (endYear != null && year > endYear) return false
177
+ return true
178
+ }
179
+ }
180
+ } else {
181
+ DatePickerDefaults.AllDates
182
+ }
183
+ }
184
+ }
185
+
186
+ @OptIn(ExperimentalMaterial3Api::class)
187
+ @Composable
188
+ fun buildDatePickerColors(
189
+ elementColors: DateTimePickerColorOverrides = DateTimePickerColorOverrides(),
190
+ colorProp: androidx.compose.ui.graphics.Color? = null,
191
+ defaults: androidx.compose.material3.DatePickerColors = DatePickerDefaults.colors()
192
+ ): androidx.compose.material3.DatePickerColors {
193
+ return defaults.copy(
194
+ containerColor = elementColors.containerColor.composeOrNull ?: defaults.containerColor,
195
+ titleContentColor = elementColors.titleContentColor.composeOrNull ?: colorProp ?: defaults.titleContentColor,
196
+ headlineContentColor = elementColors.headlineContentColor.composeOrNull ?: colorProp ?: defaults.headlineContentColor,
197
+ weekdayContentColor = elementColors.weekdayContentColor.composeOrNull ?: defaults.weekdayContentColor,
198
+ subheadContentColor = elementColors.subheadContentColor.composeOrNull ?: defaults.subheadContentColor,
199
+ navigationContentColor = elementColors.navigationContentColor.composeOrNull ?: defaults.navigationContentColor,
200
+ yearContentColor = elementColors.yearContentColor.composeOrNull ?: defaults.yearContentColor,
201
+ disabledYearContentColor = elementColors.disabledYearContentColor.composeOrNull ?: defaults.disabledYearContentColor,
202
+ currentYearContentColor = elementColors.currentYearContentColor.composeOrNull ?: defaults.currentYearContentColor,
203
+ selectedYearContentColor = elementColors.selectedYearContentColor.composeOrNull ?: defaults.selectedYearContentColor,
204
+ disabledSelectedYearContentColor = elementColors.disabledSelectedYearContentColor.composeOrNull ?: defaults.disabledSelectedYearContentColor,
205
+ selectedYearContainerColor = elementColors.selectedYearContainerColor.composeOrNull ?: defaults.selectedYearContainerColor,
206
+ disabledSelectedYearContainerColor = elementColors.disabledSelectedYearContainerColor.composeOrNull ?: defaults.disabledSelectedYearContainerColor,
207
+ dayContentColor = elementColors.dayContentColor.composeOrNull ?: defaults.dayContentColor,
208
+ disabledDayContentColor = elementColors.disabledDayContentColor.composeOrNull ?: defaults.disabledDayContentColor,
209
+ selectedDayContentColor = elementColors.selectedDayContentColor.composeOrNull ?: defaults.selectedDayContentColor,
210
+ disabledSelectedDayContentColor = elementColors.disabledSelectedDayContentColor.composeOrNull ?: defaults.disabledSelectedDayContentColor,
211
+ selectedDayContainerColor = elementColors.selectedDayContainerColor.composeOrNull ?: colorProp ?: defaults.selectedDayContainerColor,
212
+ disabledSelectedDayContainerColor = elementColors.disabledSelectedDayContainerColor.composeOrNull ?: defaults.disabledSelectedDayContainerColor,
213
+ todayContentColor = elementColors.todayContentColor.composeOrNull ?: defaults.todayContentColor,
214
+ todayDateBorderColor = elementColors.todayDateBorderColor.composeOrNull ?: colorProp ?: defaults.todayDateBorderColor,
215
+ dayInSelectionRangeContentColor = elementColors.dayInSelectionRangeContentColor.composeOrNull ?: defaults.dayInSelectionRangeContentColor,
216
+ dayInSelectionRangeContainerColor = elementColors.dayInSelectionRangeContainerColor.composeOrNull ?: defaults.dayInSelectionRangeContainerColor,
217
+ dividerColor = elementColors.dividerColor.composeOrNull ?: defaults.dividerColor
218
+ )
219
+ }
220
+
221
+ @OptIn(ExperimentalMaterial3Api::class)
222
+ @Composable
223
+ fun buildTimePickerColors(
224
+ elementColors: DateTimePickerColorOverrides = DateTimePickerColorOverrides(),
225
+ colorProp: androidx.compose.ui.graphics.Color? = null,
226
+ defaults: androidx.compose.material3.TimePickerColors = TimePickerDefaults.colors()
227
+ ): androidx.compose.material3.TimePickerColors {
228
+ return defaults.copy(
229
+ containerColor = elementColors.containerColor.composeOrNull ?: defaults.containerColor,
230
+ clockDialColor = elementColors.clockDialColor.composeOrNull ?: colorProp?.copy(alpha = 0.3f) ?: defaults.clockDialColor,
231
+ clockDialSelectedContentColor = elementColors.clockDialSelectedContentColor.composeOrNull ?: defaults.clockDialSelectedContentColor,
232
+ clockDialUnselectedContentColor = elementColors.clockDialUnselectedContentColor.composeOrNull ?: defaults.clockDialUnselectedContentColor,
233
+ selectorColor = elementColors.selectorColor.composeOrNull ?: colorProp ?: defaults.selectorColor,
234
+ periodSelectorBorderColor = elementColors.periodSelectorBorderColor.composeOrNull ?: defaults.periodSelectorBorderColor,
235
+ periodSelectorSelectedContainerColor = elementColors.periodSelectorSelectedContainerColor.composeOrNull ?: defaults.periodSelectorSelectedContainerColor,
236
+ periodSelectorUnselectedContainerColor = elementColors.periodSelectorUnselectedContainerColor.composeOrNull ?: defaults.periodSelectorUnselectedContainerColor,
237
+ periodSelectorSelectedContentColor = elementColors.periodSelectorSelectedContentColor.composeOrNull ?: defaults.periodSelectorSelectedContentColor,
238
+ periodSelectorUnselectedContentColor = elementColors.periodSelectorUnselectedContentColor.composeOrNull ?: defaults.periodSelectorUnselectedContentColor,
239
+ timeSelectorSelectedContainerColor = elementColors.timeSelectorSelectedContainerColor.composeOrNull ?: colorProp ?: defaults.timeSelectorSelectedContainerColor,
240
+ timeSelectorUnselectedContainerColor = elementColors.timeSelectorUnselectedContainerColor.composeOrNull ?: defaults.timeSelectorUnselectedContainerColor,
241
+ timeSelectorSelectedContentColor = elementColors.timeSelectorSelectedContentColor.composeOrNull ?: defaults.timeSelectorSelectedContentColor,
242
+ timeSelectorUnselectedContentColor = elementColors.timeSelectorUnselectedContentColor.composeOrNull ?: defaults.timeSelectorUnselectedContentColor
243
+ )
244
+ }
245
+
246
+ @OptIn(ExperimentalMaterial3Api::class)
247
+ @Composable
248
+ fun ExpoDatePickerDialogContent(props: DatePickerDialogProps, onDateSelected: (DatePickerResult) -> Unit, onDismissRequest: () -> Unit) {
249
+ val locale = LocalConfiguration.current.locales[0]
250
+ val variant = props.variant.toDisplayMode()
251
+ val selectableDates = rememberSelectableDates(props.selectableDates)
252
+ val fallbackDate = remember { Date().time }
253
+ val initialDate = props.initialDate ?: fallbackDate
254
+
255
+ val state = remember(variant, initialDate, selectableDates) {
256
+ DatePickerState(
257
+ initialDisplayMode = variant,
258
+ locale = locale,
259
+ initialSelectedDateMillis = initialDate,
260
+ initialDisplayedMonthMillis = initialDate,
261
+ yearRange = DatePickerDefaults.YearRange,
262
+ selectableDates = selectableDates
263
+ )
264
+ }
265
+
266
+ val colors = buildDatePickerColors(props.elementColors, props.color.composeOrNull, DatePickerDefaults.colors())
267
+
268
+ DatePickerDialog(
269
+ onDismissRequest = { onDismissRequest() },
270
+ confirmButton = {
271
+ TextButton(onClick = { onDateSelected(DatePickerResult(date = state.selectedDateMillis)) }) {
272
+ Text(props.confirmButtonLabel ?: stringResource(android.R.string.ok))
273
+ }
274
+ },
275
+ dismissButton = {
276
+ TextButton(onClick = { onDismissRequest() }) {
277
+ Text(props.dismissButtonLabel ?: stringResource(android.R.string.cancel))
278
+ }
279
+ },
280
+ colors = colors
281
+ ) {
282
+ DatePicker(
283
+ state = state,
284
+ showModeToggle = props.showVariantToggle,
285
+ colors = colors
286
+ )
287
+ }
288
+ }
289
+
290
+ @OptIn(ExperimentalMaterial3Api::class)
291
+ @Composable
292
+ fun ExpoTimePickerDialogContent(props: TimePickerDialogProps, onDateSelected: (DatePickerResult) -> Unit, onDismissRequest: () -> Unit) {
293
+ val initialDate = props.initialDate
294
+
295
+ val state = remember(initialDate, props.is24Hour) {
296
+ val cal = Calendar.getInstance()
297
+ if (initialDate != null) {
298
+ cal.timeInMillis = initialDate
299
+ }
300
+ TimePickerState(
301
+ initialHour = cal.get(Calendar.HOUR_OF_DAY),
302
+ initialMinute = cal.get(Calendar.MINUTE),
303
+ is24Hour = props.is24Hour
304
+ )
305
+ }
306
+
307
+ val timePickerColors = buildTimePickerColors(props.elementColors, props.color.composeOrNull, TimePickerDefaults.colors())
308
+
309
+ AlertDialog(
310
+ onDismissRequest = { onDismissRequest() },
311
+ confirmButton = {
312
+ TextButton(onClick = {
313
+ val cal = Calendar.getInstance()
314
+ if (initialDate != null) {
315
+ cal.timeInMillis = initialDate
316
+ }
317
+ cal.set(Calendar.HOUR_OF_DAY, state.hour)
318
+ cal.set(Calendar.MINUTE, state.minute)
319
+ onDateSelected(DatePickerResult(date = cal.time.time))
320
+ }) {
321
+ Text(props.confirmButtonLabel ?: stringResource(android.R.string.ok))
322
+ }
323
+ },
324
+ dismissButton = {
325
+ TextButton(onClick = { onDismissRequest() }) {
326
+ Text(props.dismissButtonLabel ?: stringResource(android.R.string.cancel))
327
+ }
328
+ },
329
+ text = {
330
+ TimePicker(
331
+ state = state,
332
+ layoutType = TimePickerLayoutType.Vertical,
333
+ colors = timePickerColors
334
+ )
335
+ }
336
+ )
337
+ }
338
+
61
339
  @OptIn(ExperimentalMaterial3Api::class)
62
340
  @Composable
63
341
  fun FunctionalComposableScope.DateTimePickerContent(props: DateTimePickerProps, onDateSelected: (DatePickerResult) -> Unit) {
342
+ val modifier = ModifierRegistry.applyModifiers(props.modifiers, appContext, composableScope, globalEventDispatcher)
64
343
  if (props.displayedComponents == DisplayedComponents.HOUR_AND_MINUTE) {
65
- ExpoTimePicker(props = props, modifier = ModifierRegistry.applyModifiers(props.modifiers, appContext, composableScope, globalEventDispatcher)) {
344
+ ExpoTimePicker(props = props, modifier = modifier) {
66
345
  onDateSelected(it)
67
346
  }
68
347
  } else {
69
- ExpoDatePicker(props = props, modifier = ModifierRegistry.applyModifiers(props.modifiers, appContext, composableScope, globalEventDispatcher)) {
348
+ ExpoDatePicker(props = props, modifier = modifier) {
70
349
  onDateSelected(it)
71
350
  }
72
351
  }
@@ -78,15 +357,17 @@ fun ExpoDatePicker(modifier: Modifier = Modifier, props: DateTimePickerProps, on
78
357
  val locale = LocalConfiguration.current.locales[0]
79
358
  val variant = props.variant.toDisplayMode()
80
359
  val initialDate = props.initialDate
360
+ val selectableDates = rememberSelectableDates(props.selectableDates)
81
361
 
82
- val state = remember(variant, initialDate) {
362
+ val state = remember(variant, initialDate, selectableDates) {
363
+ val fallbackDate = Date().time
83
364
  DatePickerState(
84
365
  initialDisplayMode = variant,
85
366
  locale = locale,
86
- initialSelectedDateMillis = initialDate ?: Date().time,
87
- initialDisplayedMonthMillis = initialDate ?: Date().time,
367
+ initialSelectedDateMillis = initialDate ?: fallbackDate,
368
+ initialDisplayedMonthMillis = initialDate ?: fallbackDate,
88
369
  yearRange = DatePickerDefaults.YearRange,
89
- selectableDates = DatePickerDefaults.AllDates
370
+ selectableDates = selectableDates
90
371
  )
91
372
  }
92
373
 
@@ -98,42 +379,36 @@ fun ExpoDatePicker(modifier: Modifier = Modifier, props: DateTimePickerProps, on
98
379
  modifier = modifier,
99
380
  state = state,
100
381
  showModeToggle = props.showVariantToggle,
101
- colors = DatePickerDefaults.colors().copy(
102
- titleContentColor = colorToComposeColor(props.color),
103
- selectedDayContainerColor = colorToComposeColor(props.color),
104
- todayDateBorderColor = colorToComposeColor(props.color),
105
- headlineContentColor = colorToComposeColor(props.color)
106
- )
382
+ colors = buildDatePickerColors(props.elementColors, props.color.composeOrNull)
107
383
  )
108
384
  }
109
385
 
110
386
  @OptIn(ExperimentalMaterial3Api::class)
111
387
  @Composable
112
388
  fun ExpoTimePicker(modifier: Modifier = Modifier, props: DateTimePickerProps, onDateSelected: (DatePickerResult) -> Unit) {
113
- val cal = Calendar.getInstance()
389
+ val initialDate = props.initialDate
114
390
 
115
- val state = remember(props.initialDate, props.is24Hour) {
116
- val initialDate = props.initialDate
391
+ val state = remember(initialDate, props.is24Hour) {
392
+ val cal = Calendar.getInstance()
393
+ cal.isLenient = false
117
394
  if (initialDate != null) {
118
395
  cal.timeInMillis = initialDate
119
- } else {
120
- cal.time = Date()
121
396
  }
122
- val hour = cal.get(Calendar.HOUR_OF_DAY)
123
- val minute = cal.get(Calendar.MINUTE)
124
-
125
397
  TimePickerState(
126
- initialHour = hour,
127
- initialMinute = minute,
398
+ initialHour = cal.get(Calendar.HOUR_OF_DAY),
399
+ initialMinute = cal.get(Calendar.MINUTE),
128
400
  is24Hour = props.is24Hour
129
401
  )
130
402
  }
131
403
 
132
404
  LaunchedEffect(state.hour, state.minute) {
405
+ val cal = Calendar.getInstance()
406
+ cal.isLenient = false
407
+ if (initialDate != null) {
408
+ cal.timeInMillis = initialDate
409
+ }
133
410
  cal.set(Calendar.HOUR_OF_DAY, state.hour)
134
411
  cal.set(Calendar.MINUTE, state.minute)
135
- cal.isLenient = false
136
-
137
412
  onDateSelected(DatePickerResult(date = cal.time.time))
138
413
  }
139
414
 
@@ -141,10 +416,6 @@ fun ExpoTimePicker(modifier: Modifier = Modifier, props: DateTimePickerProps, on
141
416
  modifier = modifier,
142
417
  state = state,
143
418
  layoutType = TimePickerLayoutType.Vertical,
144
- colors = TimePickerDefaults.colors().copy(
145
- selectorColor = colorToComposeColor(props.color),
146
- timeSelectorSelectedContainerColor = colorToComposeColor(props.color),
147
- clockDialColor = colorToComposeColor(props.color).copy(alpha = 0.3f)
148
- )
419
+ colors = buildTimePickerColors(props.elementColors, props.color.composeOrNull)
149
420
  )
150
421
  }