react-native-system-ui 0.0.7 → 1.0.1

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 (411) hide show
  1. package/README.md +46 -31
  2. package/dist/cjs/components/action-sheet/ActionSheet.js +128 -142
  3. package/dist/cjs/components/action-sheet/tokens.js +16 -27
  4. package/dist/cjs/components/area/Area.js +57 -70
  5. package/dist/cjs/components/area/tokens.js +6 -3
  6. package/dist/cjs/components/avatar/Avatar.js +38 -36
  7. package/dist/cjs/components/badge/Badge.js +68 -73
  8. package/dist/cjs/components/badge/tokens.js +6 -8
  9. package/dist/cjs/components/button/Button.js +135 -176
  10. package/dist/cjs/components/button/ButtonGroup.js +11 -45
  11. package/dist/cjs/components/button/tokens.js +1 -8
  12. package/dist/cjs/components/calendar/Calendar.js +212 -223
  13. package/dist/cjs/components/calendar/tokens.js +3 -3
  14. package/dist/cjs/components/cascader/Cascader.js +257 -267
  15. package/dist/cjs/components/cascader/tokens.js +2 -2
  16. package/dist/cjs/components/cascader/useCascaderExtend.js +25 -29
  17. package/dist/cjs/components/cell/Cell.js +94 -104
  18. package/dist/cjs/components/cell/CellGroup.js +37 -49
  19. package/dist/cjs/components/checkbox/Checkbox.js +140 -132
  20. package/dist/cjs/components/checkbox/CheckboxGroup.js +21 -51
  21. package/dist/cjs/components/checkbox/tokens.js +7 -10
  22. package/dist/cjs/components/circle/Circle.js +87 -74
  23. package/dist/cjs/components/collapse/Collapse.js +88 -104
  24. package/dist/cjs/components/config-provider/ConfigProvider.js +17 -4
  25. package/dist/cjs/components/config-provider/DirectionContext.js +15 -0
  26. package/dist/cjs/components/config-provider/index.js +7 -0
  27. package/dist/cjs/components/config-provider/locale/en-US.js +32 -0
  28. package/dist/cjs/components/config-provider/locale/zh-CN.js +32 -0
  29. package/dist/cjs/components/config-provider/useDirection.js +16 -0
  30. package/dist/cjs/components/count-down/CountDown.js +32 -27
  31. package/dist/cjs/components/datetime-picker/DatetimePicker.js +80 -104
  32. package/dist/cjs/components/datetime-picker/tokens.js +14 -3
  33. package/dist/cjs/components/dialog/Dialog.js +159 -121
  34. package/dist/cjs/components/dialog/imperative.js +24 -43
  35. package/dist/cjs/components/dialog/tokens.js +1 -0
  36. package/dist/cjs/components/divider/Divider.js +57 -62
  37. package/dist/cjs/components/empty/Empty.js +53 -52
  38. package/dist/cjs/components/error-boundary/ErrorBoundary.js +74 -0
  39. package/dist/cjs/components/error-boundary/index.js +19 -0
  40. package/dist/cjs/components/field/Field.js +109 -106
  41. package/dist/cjs/components/flex/Flex.js +32 -32
  42. package/dist/cjs/components/flex/FlexItem.js +27 -27
  43. package/dist/cjs/components/form/Form.js +178 -196
  44. package/dist/cjs/components/form/FormItem.js +87 -109
  45. package/dist/cjs/components/form/FormList.js +57 -45
  46. package/dist/cjs/components/form/tokens.js +6 -3
  47. package/dist/cjs/components/form/utils.js +15 -34
  48. package/dist/cjs/components/grid/Grid.js +44 -43
  49. package/dist/cjs/components/grid/GridItem.js +92 -86
  50. package/dist/cjs/components/image/Image.js +76 -79
  51. package/dist/cjs/components/image/tokens.js +5 -3
  52. package/dist/cjs/components/image-preview/ImagePreview.js +125 -113
  53. package/dist/cjs/components/image-preview/imperative.js +4 -13
  54. package/dist/cjs/components/image-preview/tokens.js +3 -1
  55. package/dist/cjs/components/index.js +13 -0
  56. package/dist/cjs/components/input/Input.js +40 -35
  57. package/dist/cjs/components/loading/Loading.js +32 -33
  58. package/dist/cjs/components/nav-bar/NavBar.js +88 -100
  59. package/dist/cjs/components/nav-bar/tokens.js +4 -10
  60. package/dist/cjs/components/notice-bar/NoticeBar.js +81 -80
  61. package/dist/cjs/components/notice-bar/tokens.js +3 -1
  62. package/dist/cjs/components/notify/Notify.js +89 -84
  63. package/dist/cjs/components/notify/imperative.js +32 -55
  64. package/dist/cjs/components/notify/tokens.js +2 -11
  65. package/dist/cjs/components/number-keyboard/NumberKeyboard.js +277 -283
  66. package/dist/cjs/components/number-keyboard/tokens.js +7 -1
  67. package/dist/cjs/components/overlay/Overlay.js +37 -52
  68. package/dist/cjs/components/overlay/tokens.js +5 -3
  69. package/dist/cjs/components/password-input/PasswordInput.js +114 -95
  70. package/dist/cjs/components/picker/Picker.js +465 -454
  71. package/dist/cjs/components/picker/tokens.js +1 -1
  72. package/dist/cjs/components/popup/Popup.js +269 -299
  73. package/dist/cjs/components/popup/tokens.js +1 -0
  74. package/dist/cjs/components/portal/Portal.js +12 -30
  75. package/dist/cjs/components/portal/PortalHost.js +151 -234
  76. package/dist/cjs/components/progress/Progress.js +103 -101
  77. package/dist/cjs/components/progress/tokens.js +1 -0
  78. package/dist/cjs/components/radio/Radio.js +98 -91
  79. package/dist/cjs/components/radio/RadioGroup.js +13 -45
  80. package/dist/cjs/components/radio/tokens.js +7 -10
  81. package/dist/cjs/components/safe-area-view/SafeAreaView.js +22 -26
  82. package/dist/cjs/components/search/Search.js +65 -57
  83. package/dist/cjs/components/selector/Selector.js +21 -27
  84. package/dist/cjs/components/share-sheet/ShareSheet.js +165 -161
  85. package/dist/cjs/components/share-sheet/tokens.js +3 -1
  86. package/dist/cjs/components/sidebar/Sidebar.js +51 -51
  87. package/dist/cjs/components/sidebar/SidebarContext.js +1 -2
  88. package/dist/cjs/components/sidebar/SidebarItem.js +19 -21
  89. package/dist/cjs/components/sidebar/tokens.js +4 -4
  90. package/dist/cjs/components/skeleton/Skeleton.js +71 -77
  91. package/dist/cjs/components/skeleton/tokens.js +1 -2
  92. package/dist/cjs/components/slider/Slider.js +156 -135
  93. package/dist/cjs/components/space/Space.js +57 -76
  94. package/dist/cjs/components/space/tokens.js +7 -1
  95. package/dist/cjs/components/stepper/Stepper.js +182 -158
  96. package/dist/cjs/components/stepper/tokens.js +1 -0
  97. package/dist/cjs/components/swiper/Swiper.js +256 -255
  98. package/dist/cjs/components/swiper/SwiperPagIndicator.js +26 -27
  99. package/dist/cjs/components/swiper/tokens.js +10 -3
  100. package/dist/cjs/components/switch/Switch.js +23 -25
  101. package/dist/cjs/components/tabbar/Tabbar.js +48 -40
  102. package/dist/cjs/components/tabbar/TabbarContext.js +1 -2
  103. package/dist/cjs/components/tabbar/TabbarItem.js +65 -68
  104. package/dist/cjs/components/tabs/Tabs.js +402 -439
  105. package/dist/cjs/components/tabs/tokens.js +3 -1
  106. package/dist/cjs/components/tag/Tag.js +68 -59
  107. package/dist/cjs/components/toast/Toast.js +91 -90
  108. package/dist/cjs/components/toast/imperative.js +16 -41
  109. package/dist/cjs/components/toast/tokens.js +1 -0
  110. package/dist/cjs/components/typography/Typography.js +25 -25
  111. package/dist/cjs/components/water-mark/WaterMark.js +80 -78
  112. package/dist/cjs/design-system/Text.js +38 -0
  113. package/dist/cjs/design-system/ThemeProvider.js +5 -11
  114. package/dist/cjs/design-system/createComponentTokensHook.js +11 -13
  115. package/dist/cjs/design-system/index.js +7 -0
  116. package/dist/cjs/design-system/mergeTokensOverride.js +1 -4
  117. package/dist/cjs/design-system/presets.js +2 -3
  118. package/dist/cjs/design-system/tokens.js +2 -11
  119. package/dist/cjs/hooks/animation/index.js +25 -0
  120. package/dist/cjs/hooks/animation/useAnimatedTransition.js +72 -0
  121. package/dist/cjs/hooks/animation/useReducedMotion.js +75 -0
  122. package/dist/cjs/hooks/aria/useAriaListBox.js +8 -16
  123. package/dist/cjs/hooks/aria/useAriaOverlay.js +3 -3
  124. package/dist/cjs/hooks/aria/useAriaPress.js +8 -21
  125. package/dist/cjs/hooks/aria/useAriaToggle.js +3 -3
  126. package/dist/cjs/hooks/gesture/useGestureScroll.js +60 -61
  127. package/dist/cjs/hooks/index.js +12 -0
  128. package/dist/cjs/hooks/overlay/OverlayStackStore.js +49 -69
  129. package/dist/cjs/hooks/overlay/useOverlayStack.js +13 -19
  130. package/dist/cjs/hooks/useControllableValue.js +13 -24
  131. package/dist/cjs/hooks/useCountDown.js +30 -38
  132. package/dist/cjs/hooks/useHairline.js +17 -29
  133. package/dist/cjs/hooks/useSafeAreaPadding.js +1 -4
  134. package/dist/cjs/index.js +67 -1
  135. package/dist/cjs/platform/animation.js +10 -2
  136. package/dist/cjs/platform/measure.js +21 -37
  137. package/dist/cjs/utils/color.js +20 -39
  138. package/dist/cjs/utils/compare.js +7 -12
  139. package/dist/cjs/utils/createPlatformShadow.js +28 -39
  140. package/dist/cjs/utils/date.js +20 -50
  141. package/dist/cjs/utils/deepMerge.js +16 -26
  142. package/dist/cjs/utils/hairline.js +75 -71
  143. package/dist/cjs/utils/index.js +22 -0
  144. package/dist/cjs/utils/number.js +21 -29
  145. package/dist/cjs/utils/render.js +21 -0
  146. package/dist/cjs/utils/rtl.js +25 -0
  147. package/dist/cjs/utils/string.js +8 -25
  148. package/dist/cjs/utils/validate.js +2 -4
  149. package/dist/es/components/action-sheet/ActionSheet.js +130 -144
  150. package/dist/es/components/action-sheet/tokens.js +16 -27
  151. package/dist/es/components/area/Area.js +58 -71
  152. package/dist/es/components/area/tokens.js +6 -3
  153. package/dist/es/components/avatar/Avatar.js +38 -36
  154. package/dist/es/components/avatar/index.js +1 -2
  155. package/dist/es/components/badge/Badge.js +70 -75
  156. package/dist/es/components/badge/tokens.js +6 -8
  157. package/dist/es/components/button/Button.js +136 -177
  158. package/dist/es/components/button/ButtonGroup.js +12 -46
  159. package/dist/es/components/button/tokens.js +2 -3
  160. package/dist/es/components/calendar/Calendar.js +214 -225
  161. package/dist/es/components/calendar/tokens.js +3 -3
  162. package/dist/es/components/cascader/Cascader.js +260 -270
  163. package/dist/es/components/cascader/tokens.js +2 -2
  164. package/dist/es/components/cascader/useCascaderExtend.js +25 -29
  165. package/dist/es/components/cell/Cell.js +95 -105
  166. package/dist/es/components/cell/CellGroup.js +37 -48
  167. package/dist/es/components/checkbox/Checkbox.js +141 -133
  168. package/dist/es/components/checkbox/CheckboxGroup.js +22 -52
  169. package/dist/es/components/checkbox/tokens.js +7 -10
  170. package/dist/es/components/circle/Circle.js +87 -73
  171. package/dist/es/components/collapse/Collapse.js +90 -105
  172. package/dist/es/components/config-provider/ConfigProvider.js +11 -4
  173. package/dist/es/components/config-provider/DirectionContext.js +2 -0
  174. package/dist/es/components/config-provider/index.js +1 -0
  175. package/dist/es/components/config-provider/locale/en-US.js +32 -0
  176. package/dist/es/components/config-provider/locale/zh-CN.js +32 -0
  177. package/dist/es/components/config-provider/useDirection.js +3 -0
  178. package/dist/es/components/count-down/CountDown.js +35 -30
  179. package/dist/es/components/datetime-picker/DatetimePicker.js +80 -104
  180. package/dist/es/components/datetime-picker/tokens.js +14 -3
  181. package/dist/es/components/dialog/Dialog.js +160 -121
  182. package/dist/es/components/dialog/imperative.js +24 -43
  183. package/dist/es/components/dialog/tokens.js +1 -0
  184. package/dist/es/components/divider/Divider.js +59 -63
  185. package/dist/es/components/empty/Empty.js +54 -52
  186. package/dist/es/components/error-boundary/ErrorBoundary.js +62 -0
  187. package/dist/es/components/error-boundary/index.js +1 -0
  188. package/dist/es/components/field/Field.js +109 -106
  189. package/dist/es/components/flex/Flex.js +32 -31
  190. package/dist/es/components/flex/FlexItem.js +28 -27
  191. package/dist/es/components/form/Form.js +179 -197
  192. package/dist/es/components/form/FormItem.js +86 -107
  193. package/dist/es/components/form/FormList.js +57 -45
  194. package/dist/es/components/form/tokens.js +6 -3
  195. package/dist/es/components/form/utils.js +15 -34
  196. package/dist/es/components/grid/Grid.js +44 -42
  197. package/dist/es/components/grid/GridItem.js +94 -87
  198. package/dist/es/components/image/Image.js +79 -82
  199. package/dist/es/components/image/tokens.js +5 -3
  200. package/dist/es/components/image-preview/ImagePreview.js +125 -113
  201. package/dist/es/components/image-preview/imperative.js +4 -13
  202. package/dist/es/components/image-preview/tokens.js +3 -1
  203. package/dist/es/components/index.js +3 -1
  204. package/dist/es/components/input/Input.js +41 -36
  205. package/dist/es/components/loading/Loading.js +34 -34
  206. package/dist/es/components/nav-bar/NavBar.js +88 -100
  207. package/dist/es/components/nav-bar/tokens.js +4 -4
  208. package/dist/es/components/notice-bar/NoticeBar.js +81 -79
  209. package/dist/es/components/notice-bar/tokens.js +3 -1
  210. package/dist/es/components/notify/Notify.js +93 -87
  211. package/dist/es/components/notify/imperative.js +33 -56
  212. package/dist/es/components/notify/tokens.js +2 -5
  213. package/dist/es/components/number-keyboard/NumberKeyboard.js +277 -283
  214. package/dist/es/components/number-keyboard/tokens.js +7 -1
  215. package/dist/es/components/overlay/Overlay.js +36 -51
  216. package/dist/es/components/overlay/tokens.js +5 -3
  217. package/dist/es/components/password-input/PasswordInput.js +114 -95
  218. package/dist/es/components/picker/Picker.js +465 -454
  219. package/dist/es/components/picker/tokens.js +1 -1
  220. package/dist/es/components/popup/Popup.js +269 -298
  221. package/dist/es/components/popup/tokens.js +1 -0
  222. package/dist/es/components/portal/Portal.js +13 -30
  223. package/dist/es/components/portal/PortalHost.js +152 -234
  224. package/dist/es/components/progress/Progress.js +103 -101
  225. package/dist/es/components/progress/tokens.js +1 -0
  226. package/dist/es/components/radio/Radio.js +100 -93
  227. package/dist/es/components/radio/RadioGroup.js +15 -46
  228. package/dist/es/components/radio/tokens.js +7 -10
  229. package/dist/es/components/safe-area-view/SafeAreaView.js +22 -25
  230. package/dist/es/components/search/Search.js +66 -58
  231. package/dist/es/components/selector/Selector.js +21 -27
  232. package/dist/es/components/share-sheet/ShareSheet.js +167 -163
  233. package/dist/es/components/share-sheet/tokens.js +3 -1
  234. package/dist/es/components/sidebar/Sidebar.js +53 -53
  235. package/dist/es/components/sidebar/SidebarContext.js +1 -2
  236. package/dist/es/components/sidebar/SidebarItem.js +19 -20
  237. package/dist/es/components/sidebar/tokens.js +4 -4
  238. package/dist/es/components/skeleton/Skeleton.js +71 -77
  239. package/dist/es/components/skeleton/tokens.js +1 -2
  240. package/dist/es/components/slider/Slider.js +156 -134
  241. package/dist/es/components/space/Space.js +59 -78
  242. package/dist/es/components/space/tokens.js +7 -1
  243. package/dist/es/components/stepper/Stepper.js +183 -159
  244. package/dist/es/components/stepper/tokens.js +1 -0
  245. package/dist/es/components/swiper/Swiper.js +258 -257
  246. package/dist/es/components/swiper/SwiperPagIndicator.js +26 -27
  247. package/dist/es/components/swiper/tokens.js +10 -3
  248. package/dist/es/components/switch/Switch.js +23 -25
  249. package/dist/es/components/tabbar/Tabbar.js +49 -41
  250. package/dist/es/components/tabbar/TabbarContext.js +1 -2
  251. package/dist/es/components/tabbar/TabbarItem.js +66 -69
  252. package/dist/es/components/tabs/Tabs.js +403 -440
  253. package/dist/es/components/tabs/tokens.js +3 -1
  254. package/dist/es/components/tag/Tag.js +71 -61
  255. package/dist/es/components/toast/Toast.js +94 -91
  256. package/dist/es/components/toast/imperative.js +16 -41
  257. package/dist/es/components/toast/tokens.js +1 -0
  258. package/dist/es/components/typography/Typography.js +25 -25
  259. package/dist/es/components/water-mark/WaterMark.js +81 -79
  260. package/dist/es/design-system/Text.js +19 -0
  261. package/dist/es/design-system/ThemeProvider.js +5 -11
  262. package/dist/es/design-system/createComponentTokensHook.js +11 -13
  263. package/dist/es/design-system/index.js +1 -0
  264. package/dist/es/design-system/mergeTokensOverride.js +1 -4
  265. package/dist/es/design-system/presets.js +2 -3
  266. package/dist/es/design-system/tokens.js +1 -9
  267. package/dist/es/hooks/animation/index.js +2 -0
  268. package/dist/es/hooks/animation/useAnimatedTransition.js +53 -0
  269. package/dist/es/hooks/animation/useReducedMotion.js +54 -0
  270. package/dist/es/hooks/aria/useAriaListBox.js +8 -16
  271. package/dist/es/hooks/aria/useAriaOverlay.js +3 -3
  272. package/dist/es/hooks/aria/useAriaPress.js +8 -21
  273. package/dist/es/hooks/aria/useAriaToggle.js +3 -3
  274. package/dist/es/hooks/gesture/useGestureScroll.js +60 -61
  275. package/dist/es/hooks/index.js +1 -0
  276. package/dist/es/hooks/overlay/OverlayStackStore.js +49 -69
  277. package/dist/es/hooks/overlay/useOverlayStack.js +13 -19
  278. package/dist/es/hooks/useControllableValue.js +13 -24
  279. package/dist/es/hooks/useCountDown.js +30 -38
  280. package/dist/es/hooks/useHairline.js +16 -28
  281. package/dist/es/hooks/useSafeAreaPadding.js +1 -4
  282. package/dist/es/index.js +8 -1
  283. package/dist/es/platform/animation.js +9 -1
  284. package/dist/es/platform/measure.js +21 -37
  285. package/dist/es/utils/color.js +18 -35
  286. package/dist/es/utils/compare.js +7 -12
  287. package/dist/es/utils/createPlatformShadow.js +28 -39
  288. package/dist/es/utils/date.js +20 -50
  289. package/dist/es/utils/deepMerge.js +16 -26
  290. package/dist/es/utils/hairline.js +74 -65
  291. package/dist/es/utils/index.js +2 -0
  292. package/dist/es/utils/number.js +21 -29
  293. package/dist/es/utils/render.js +7 -0
  294. package/dist/es/utils/rtl.js +17 -0
  295. package/dist/es/utils/string.js +8 -25
  296. package/dist/es/utils/validate.js +1 -2
  297. package/dist/types/components/action-sheet/ActionSheet.d.ts +1 -1
  298. package/dist/types/components/area/Area.d.ts +1 -1
  299. package/dist/types/components/area/tokens.d.ts +4 -0
  300. package/dist/types/components/avatar/Avatar.d.ts +1 -1
  301. package/dist/types/components/avatar/index.d.ts +1 -2
  302. package/dist/types/components/badge/Badge.d.ts +1 -1
  303. package/dist/types/components/button/Button.d.ts +1 -1
  304. package/dist/types/components/button/index.d.ts +1 -1
  305. package/dist/types/components/calendar/Calendar.d.ts +1 -1
  306. package/dist/types/components/cascader/Cascader.d.ts +1 -1
  307. package/dist/types/components/cell/Cell.d.ts +1 -1
  308. package/dist/types/components/cell/CellGroup.d.ts +1 -1
  309. package/dist/types/components/cell/index.d.ts +2 -2
  310. package/dist/types/components/checkbox/Checkbox.d.ts +1 -1
  311. package/dist/types/components/circle/Circle.d.ts +1 -1
  312. package/dist/types/components/collapse/Collapse.d.ts +1 -2
  313. package/dist/types/components/config-provider/DirectionContext.d.ts +3 -0
  314. package/dist/types/components/config-provider/index.d.ts +2 -1
  315. package/dist/types/components/config-provider/locale/en-US.d.ts +32 -0
  316. package/dist/types/components/config-provider/locale/zh-CN.d.ts +32 -0
  317. package/dist/types/components/config-provider/useDirection.d.ts +1 -0
  318. package/dist/types/components/count-down/CountDown.d.ts +1 -1
  319. package/dist/types/components/datetime-picker/DatetimePicker.d.ts +1 -1
  320. package/dist/types/components/datetime-picker/tokens.d.ts +12 -0
  321. package/dist/types/components/dialog/Dialog.d.ts +1 -1
  322. package/dist/types/components/dialog/tokens.d.ts +1 -0
  323. package/dist/types/components/divider/Divider.d.ts +1 -1
  324. package/dist/types/components/empty/Empty.d.ts +1 -1
  325. package/dist/types/components/error-boundary/ErrorBoundary.d.ts +6 -0
  326. package/dist/types/components/error-boundary/index.d.ts +2 -0
  327. package/dist/types/components/field/Field.d.ts +1 -1
  328. package/dist/types/components/flex/Flex.d.ts +1 -1
  329. package/dist/types/components/flex/FlexItem.d.ts +1 -1
  330. package/dist/types/components/flex/index.d.ts +2 -2
  331. package/dist/types/components/form/Form.d.ts +1 -1
  332. package/dist/types/components/form/FormItem.d.ts +2 -1
  333. package/dist/types/components/form/index.d.ts +2 -2
  334. package/dist/types/components/form/tokens.d.ts +4 -0
  335. package/dist/types/components/grid/Grid.d.ts +1 -1
  336. package/dist/types/components/grid/GridItem.d.ts +1 -1
  337. package/dist/types/components/grid/index.d.ts +2 -2
  338. package/dist/types/components/image/Image.d.ts +1 -1
  339. package/dist/types/components/image-preview/ImagePreview.d.ts +1 -1
  340. package/dist/types/components/image-preview/tokens.d.ts +1 -0
  341. package/dist/types/components/index.d.ts +4 -1
  342. package/dist/types/components/input/Input.d.ts +3 -3
  343. package/dist/types/components/loading/Loading.d.ts +1 -1
  344. package/dist/types/components/nav-bar/NavBar.d.ts +1 -1
  345. package/dist/types/components/nav-bar/tokens.d.ts +1 -1
  346. package/dist/types/components/notice-bar/NoticeBar.d.ts +1 -1
  347. package/dist/types/components/notice-bar/tokens.d.ts +1 -0
  348. package/dist/types/components/notify/Notify.d.ts +2 -2
  349. package/dist/types/components/notify/index.d.ts +1 -1
  350. package/dist/types/components/number-keyboard/tokens.d.ts +5 -0
  351. package/dist/types/components/overlay/Overlay.d.ts +1 -5
  352. package/dist/types/components/overlay/tokens.d.ts +3 -0
  353. package/dist/types/components/password-input/PasswordInput.d.ts +1 -1
  354. package/dist/types/components/picker/Picker.d.ts +6 -6
  355. package/dist/types/components/popup/Popup.d.ts +3 -42
  356. package/dist/types/components/popup/tokens.d.ts +1 -0
  357. package/dist/types/components/portal/Portal.d.ts +9 -6
  358. package/dist/types/components/portal/PortalHost.d.ts +1 -1
  359. package/dist/types/components/radio/RadioGroup.d.ts +1 -1
  360. package/dist/types/components/safe-area-view/SafeAreaView.d.ts +1 -1
  361. package/dist/types/components/search/Search.d.ts +1 -1
  362. package/dist/types/components/share-sheet/ShareSheet.d.ts +1 -1
  363. package/dist/types/components/share-sheet/tokens.d.ts +1 -0
  364. package/dist/types/components/sidebar/Sidebar.d.ts +1 -1
  365. package/dist/types/components/sidebar/SidebarContext.d.ts +1 -1
  366. package/dist/types/components/sidebar/SidebarItem.d.ts +1 -1
  367. package/dist/types/components/sidebar/index.d.ts +2 -2
  368. package/dist/types/components/skeleton/Skeleton.d.ts +1 -1
  369. package/dist/types/components/slider/Slider.d.ts +1 -1
  370. package/dist/types/components/stepper/Stepper.d.ts +1 -1
  371. package/dist/types/components/stepper/tokens.d.ts +1 -0
  372. package/dist/types/components/swiper/Swiper.d.ts +1 -1
  373. package/dist/types/components/swiper/index.d.ts +1 -1
  374. package/dist/types/components/swiper/tokens.d.ts +8 -0
  375. package/dist/types/components/tabbar/Tabbar.d.ts +2 -2
  376. package/dist/types/components/tabbar/TabbarContext.d.ts +1 -1
  377. package/dist/types/components/tabbar/TabbarItem.d.ts +2 -2
  378. package/dist/types/components/tabs/Tabs.d.ts +1 -1
  379. package/dist/types/components/tabs/index.d.ts +1 -1
  380. package/dist/types/components/tabs/tokens.d.ts +1 -0
  381. package/dist/types/components/tag/Tag.d.ts +1 -1
  382. package/dist/types/components/toast/Toast.d.ts +2 -2
  383. package/dist/types/components/toast/index.d.ts +1 -1
  384. package/dist/types/components/toast/tokens.d.ts +1 -0
  385. package/dist/types/components/water-mark/WaterMark.d.ts +1 -1
  386. package/dist/types/design-system/Text.d.ts +3 -0
  387. package/dist/types/design-system/index.d.ts +1 -0
  388. package/dist/types/design-system/tokens.d.ts +0 -1
  389. package/dist/types/hooks/animation/index.d.ts +3 -0
  390. package/dist/types/hooks/animation/useAnimatedTransition.d.ts +13 -0
  391. package/dist/types/hooks/animation/useReducedMotion.d.ts +3 -0
  392. package/dist/types/hooks/aria/useAriaOverlay.d.ts +1 -1
  393. package/dist/types/hooks/gesture/useGestureScroll.d.ts +11 -10
  394. package/dist/types/hooks/index.d.ts +1 -0
  395. package/dist/types/hooks/overlay/OverlayStackStore.d.ts +8 -8
  396. package/dist/types/hooks/useCountDown.d.ts +1 -1
  397. package/dist/types/hooks/useHairline.d.ts +1 -1
  398. package/dist/types/index.d.ts +5 -0
  399. package/dist/types/platform/animation.d.ts +8 -0
  400. package/dist/types/platform/measure.d.ts +1 -1
  401. package/dist/types/utils/color.d.ts +0 -2
  402. package/dist/types/utils/compare.d.ts +1 -1
  403. package/dist/types/utils/createPlatformShadow.d.ts +2 -2
  404. package/dist/types/utils/date.d.ts +2 -2
  405. package/dist/types/utils/hairline.d.ts +5 -10
  406. package/dist/types/utils/index.d.ts +2 -0
  407. package/dist/types/utils/number.d.ts +2 -2
  408. package/dist/types/utils/render.d.ts +5 -0
  409. package/dist/types/utils/rtl.d.ts +5 -0
  410. package/dist/types/utils/validate.d.ts +0 -1
  411. package/package.json +25 -4
@@ -3,15 +3,19 @@ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'
3
3
  import { Animated, Easing, Platform, Pressable, StyleSheet, Text, View, useWindowDimensions } from 'react-native';
4
4
  import { SafeAreaView } from '../safe-area-view';
5
5
  import { addPopStateListener, nativeDriverEnabled } from '../../platform';
6
+ import { useReducedMotion } from '../../hooks/animation';
6
7
  import { createPlatformShadow } from '../../utils/createPlatformShadow';
7
8
  import { isRenderable, isText } from '../../utils/validate';
8
9
  import { Cross } from 'react-native-system-icon';
9
10
  import Portal from '../portal/Portal';
10
11
  import { useAriaOverlay, useOverlayStack } from '../../hooks';
12
+ import { useLocale } from '../config-provider/useLocale';
13
+ import { useDirection } from '../config-provider/useDirection';
11
14
  import { usePopupTokens } from './tokens';
12
15
  const AnimatedPressable = Animated.createAnimatedComponent(Pressable);
13
- const EASING_IN_CUBIC = Easing.bezier(0.55, 0.055, 0.675, 0.19);
14
- const EASING_OUT_CIRC = Easing.bezier(0.075, 0.82, 0.165, 1.0);
16
+ const EASE_OUT = Easing.bezier(0.075, 0.82, 0.165, 1.0);
17
+ const EASE_IN = Easing.bezier(0.55, 0.055, 0.675, 0.19);
18
+ const CAPTURE = () => true;
15
19
  const placementConfig = {
16
20
  top: {
17
21
  container: {
@@ -49,66 +53,37 @@ const placementConfig = {
49
53
  axis: 'y'
50
54
  }
51
55
  };
52
- const buildRadius = (round, placement, radius) => {
56
+ const buildRadius = (round, p, r) => {
53
57
  if (!round) return;
54
- switch (placement) {
55
- case 'top':
56
- return {
57
- borderBottomLeftRadius: radius,
58
- borderBottomRightRadius: radius
59
- };
60
- case 'bottom':
61
- return {
62
- borderTopLeftRadius: radius,
63
- borderTopRightRadius: radius
64
- };
65
- case 'left':
66
- return {
67
- borderTopRightRadius: radius,
68
- borderBottomRightRadius: radius
69
- };
70
- case 'right':
71
- return {
72
- borderTopLeftRadius: radius,
73
- borderBottomLeftRadius: radius
74
- };
75
- default:
76
- return {
77
- borderRadius: radius
78
- };
79
- }
80
- };
81
- const renderHeaderNode = (node, options) => {
82
- if (!isRenderable(node)) return null;
83
- if (isText(node)) {
84
- return /*#__PURE__*/React.createElement(Text, {
85
- style: options.textStyle
86
- }, node);
87
- }
88
- return /*#__PURE__*/React.createElement(View, {
89
- style: options.wrapperStyle
90
- }, node);
91
- };
92
- const renderWithSafeArea = (children, opts, onSafeAreaTopLayout) => {
93
- if (opts.safeArea) {
94
- return /*#__PURE__*/React.createElement(SafeAreaView, null, children);
95
- }
96
- return /*#__PURE__*/React.createElement(React.Fragment, null, opts.safeAreaInsetTop ? /*#__PURE__*/React.createElement(SafeAreaView, {
97
- edge: "top",
98
- onLayout: onSafeAreaTopLayout,
99
- pointerEvents: "none"
100
- }) : null, children, opts.safeAreaInsetBottom && /*#__PURE__*/React.createElement(SafeAreaView, {
101
- edge: "bottom",
102
- pointerEvents: "none"
103
- }));
58
+ if (p === 'top') return {
59
+ borderBottomLeftRadius: r,
60
+ borderBottomRightRadius: r
61
+ };
62
+ if (p === 'bottom') return {
63
+ borderTopLeftRadius: r,
64
+ borderTopRightRadius: r
65
+ };
66
+ if (p === 'left') return {
67
+ borderTopRightRadius: r,
68
+ borderBottomRightRadius: r
69
+ };
70
+ if (p === 'right') return {
71
+ borderTopLeftRadius: r,
72
+ borderBottomLeftRadius: r
73
+ };
74
+ return {
75
+ borderRadius: r
76
+ };
104
77
  };
105
- const hiddenContentStyle = {
78
+ const hiddenStyle = {
106
79
  opacity: 0,
107
80
  shadowOpacity: 0,
108
81
  shadowRadius: 0,
109
82
  elevation: 0
110
83
  };
111
- export const Popup = props => {
84
+ const PopupImpl = props => {
85
+ const locale = useLocale();
86
+ const layoutDir = useDirection();
112
87
  const {
113
88
  visible,
114
89
  placement: placementProp,
@@ -118,7 +93,7 @@ export const Popup = props => {
118
93
  tokensOverride,
119
94
  overlay = true,
120
95
  overlayStyle,
121
- overlayAccessibilityLabel = '关闭弹层',
96
+ overlayAccessibilityLabel = locale?.vanPopup?.closeOverlay ?? 'Close overlay',
122
97
  closeOnOverlayPress,
123
98
  closeOnClickOverlay,
124
99
  overlayTestID = 'popup-overlay',
@@ -128,7 +103,7 @@ export const Popup = props => {
128
103
  round,
129
104
  safeArea = false,
130
105
  safeAreaInsetTop = false,
131
- safeAreaInsetBottom: safeAreaInsetBottomProp,
106
+ safeAreaInsetBottom: safeBottomP,
132
107
  lockScroll = true,
133
108
  destroyOnClose = true,
134
109
  duration = 300,
@@ -148,155 +123,167 @@ export const Popup = props => {
148
123
  ...rest
149
124
  } = props;
150
125
  const placement = placementProp ?? position ?? 'center';
151
- const shouldCloseOnOverlay = closeOnClickOverlay ?? closeOnOverlayPress ?? true;
152
- const shouldTranslate = placement !== 'center';
153
- const safeAreaInsetBottom = safeAreaInsetBottomProp ?? false;
126
+ const closeOvl = closeOnClickOverlay ?? closeOnOverlayPress ?? true;
127
+ const isCenter = placement === 'center';
128
+ const safeAreaInsetBottom = safeBottomP ?? false;
154
129
  const tokens = usePopupTokens(tokensOverride);
155
- const shadow = useMemo(() => createPlatformShadow({
156
- color: tokens.shadow.color,
157
- opacity: tokens.shadow.opacity,
158
- radius: tokens.shadow.radius,
159
- offsetY: tokens.shadow.offsetY,
160
- elevation: tokens.shadow.elevation
161
- }), [tokens.shadow.color, tokens.shadow.elevation, tokens.shadow.offsetY, tokens.shadow.opacity, tokens.shadow.radius]);
162
- const dynamicStyles = useMemo(() => ({
163
- popup: {
164
- backgroundColor: tokens.colors.background,
165
- padding: tokens.spacing.padding,
166
- ...shadow
167
- },
168
- title: {
169
- color: tokens.colors.title,
170
- fontSize: tokens.typography.titleSize,
171
- fontWeight: tokens.typography.titleWeight,
172
- marginHorizontal: tokens.spacing.descriptionHorizontal,
173
- textAlign: 'center'
174
- },
175
- titleWrapper: {
176
- marginTop: tokens.spacing.titleTop,
177
- marginBottom: tokens.spacing.titleBottom,
178
- marginHorizontal: tokens.spacing.descriptionHorizontal,
179
- alignItems: 'center'
180
- },
181
- description: {
182
- color: tokens.colors.description,
183
- fontSize: tokens.typography.descriptionSize,
184
- lineHeight: tokens.typography.descriptionLineHeight
185
- },
186
- descriptionWrapper: {
187
- marginHorizontal: tokens.spacing.descriptionHorizontal,
188
- marginBottom: tokens.spacing.descriptionBottom
189
- },
190
- closeIconBase: {
191
- minWidth: tokens.spacing.closeIconSize,
192
- minHeight: tokens.spacing.closeIconSize,
193
- padding: tokens.spacing.closeIconPadding
194
- },
195
- closeIconDefault: {
196
- width: tokens.spacing.closeIconSize,
197
- height: tokens.spacing.closeIconSize
198
- },
199
- popupSide: {
200
- width: tokens.layout.sideWidth,
201
- maxWidth: tokens.layout.maxWidth
202
- },
203
- popupCenter: {
204
- minWidth: tokens.layout.minWidth,
205
- maxWidth: tokens.layout.centerMaxWidth
206
- }
207
- }), [shadow, tokens.colors.background, tokens.colors.description, tokens.colors.title, tokens.layout.centerMaxWidth, tokens.layout.maxWidth, tokens.layout.minWidth, tokens.layout.sideWidth, tokens.spacing.closeIconPadding, tokens.spacing.closeIconSize, tokens.spacing.descriptionBottom, tokens.spacing.descriptionHorizontal, tokens.spacing.padding, tokens.spacing.titleBottom, tokens.spacing.titleTop, tokens.typography.descriptionLineHeight, tokens.typography.descriptionSize, tokens.typography.titleSize, tokens.typography.titleWeight]);
130
+ const reducedMotion = useReducedMotion();
131
+ const cbRef = useRef({
132
+ onOpened,
133
+ onClosed,
134
+ onOpen,
135
+ onClose,
136
+ beforeClose,
137
+ onClickOverlay
138
+ });
139
+ cbRef.current = {
140
+ onOpened,
141
+ onClosed,
142
+ onOpen,
143
+ onClose,
144
+ beforeClose,
145
+ onClickOverlay
146
+ };
147
+ const ds = useMemo(() => {
148
+ const shadow = createPlatformShadow(tokens.shadow);
149
+ const {
150
+ colors: c,
151
+ spacing: s,
152
+ typography: t,
153
+ layout: l
154
+ } = tokens;
155
+ return {
156
+ popup: {
157
+ backgroundColor: c.background,
158
+ padding: s.padding,
159
+ ...shadow
160
+ },
161
+ title: {
162
+ color: c.title,
163
+ fontFamily: t.fontFamily,
164
+ fontSize: t.titleSize,
165
+ fontWeight: t.titleWeight,
166
+ marginHorizontal: s.descriptionHorizontal,
167
+ textAlign: 'center'
168
+ },
169
+ titleWrap: {
170
+ marginTop: s.titleTop,
171
+ marginBottom: s.titleBottom,
172
+ marginHorizontal: s.descriptionHorizontal,
173
+ alignItems: 'center'
174
+ },
175
+ desc: {
176
+ color: c.description,
177
+ fontFamily: t.fontFamily,
178
+ fontSize: t.descriptionSize,
179
+ lineHeight: t.descriptionLineHeight
180
+ },
181
+ descWrap: {
182
+ marginHorizontal: s.descriptionHorizontal,
183
+ marginBottom: s.descriptionBottom
184
+ },
185
+ closeBase: {
186
+ minWidth: s.closeIconSize,
187
+ minHeight: s.closeIconSize,
188
+ padding: s.closeIconPadding
189
+ },
190
+ closeDef: {
191
+ width: s.closeIconSize,
192
+ height: s.closeIconSize
193
+ },
194
+ side: {
195
+ width: l.sideWidth,
196
+ maxWidth: l.maxWidth
197
+ },
198
+ center: {
199
+ minWidth: l.minWidth,
200
+ maxWidth: l.centerMaxWidth
201
+ }
202
+ };
203
+ }, [tokens]);
208
204
  const [mounted, setMounted] = useState(visible);
209
- const [interactionVisible, setInteractionVisible] = useState(visible);
210
- const isOpen = visible || interactionVisible;
211
- const canCloseOnOverlay = shouldCloseOnOverlay && (onClose || beforeClose);
205
+ const [interVis, setInterVis] = useState(visible);
206
+ const isOpen = visible || interVis;
207
+ const canCloseOvl = closeOvl && (onClose || beforeClose);
212
208
  const progress = useRef(new Animated.Value(0)).current;
213
- const animationRef = useRef(null);
214
- const animationSeqRef = useRef(0);
215
- const prevVisible = useRef(visible);
209
+ const animRef = useRef(null);
210
+ const seqRef = useRef(0);
211
+ const prevVis = useRef(visible);
216
212
  const closingRef = useRef(false);
217
- const isVertical = placement === 'top' || placement === 'bottom';
218
- const isHorizontal = placement === 'left' || placement === 'right';
219
- const direction = placement === 'top' || placement === 'left' ? -1 : 1;
220
- const runAnimation = useCallback(show => {
221
- animationSeqRef.current += 1;
222
- const currentSeq = animationSeqRef.current;
223
- const easing = show ? EASING_OUT_CIRC : EASING_IN_CUBIC;
224
- animationRef.current?.stop();
225
- const animation = Animated.timing(progress, {
213
+ const isV = placement === 'top' || placement === 'bottom';
214
+ const isH = placement === 'left' || placement === 'right';
215
+ const dir = placement === 'top' || placement === 'left' ? -1 : 1;
216
+ const runAnim = useCallback((show, rm) => {
217
+ seqRef.current += 1;
218
+ const seq = seqRef.current;
219
+ animRef.current?.stop();
220
+ const d = rm ? 0 : duration;
221
+ const a = Animated.timing(progress, {
226
222
  toValue: show ? 1 : 0,
227
- duration,
228
- easing,
223
+ duration: d,
224
+ easing: show ? EASE_OUT : EASE_IN,
229
225
  useNativeDriver: nativeDriverEnabled,
230
226
  isInteraction: false
231
227
  });
232
- animationRef.current = animation;
233
- animation.start(({
228
+ animRef.current = a;
229
+ a.start(({
234
230
  finished
235
231
  }) => {
236
- if (!finished || currentSeq !== animationSeqRef.current) return;
237
- if (show) {
238
- onOpened?.();
239
- } else {
240
- setInteractionVisible(false);
241
- if (destroyOnClose) {
242
- setMounted(false);
243
- }
244
- onClosed?.();
232
+ if (!finished || seq !== seqRef.current) return;
233
+ if (show) cbRef.current.onOpened?.();else {
234
+ setInterVis(false);
235
+ if (destroyOnClose) setMounted(false);
236
+ cbRef.current.onClosed?.();
245
237
  }
246
238
  });
247
- }, [destroyOnClose, duration, onClosed, onOpened, progress]);
239
+ }, [destroyOnClose, duration, progress]);
248
240
  useEffect(() => {
249
241
  if (visible) {
250
242
  setMounted(true);
251
- setInteractionVisible(true);
252
- runAnimation(true);
243
+ setInterVis(true);
244
+ runAnim(true, reducedMotion);
253
245
  } else {
254
- if (!prevVisible.current) return;
255
- runAnimation(false);
246
+ if (prevVis.current) runAnim(false, reducedMotion);
256
247
  }
257
- }, [runAnimation, visible]);
248
+ }, [runAnim, visible, reducedMotion]);
258
249
  useEffect(() => {
259
- if (visible && !prevVisible.current) {
260
- onOpen?.();
261
- }
262
- prevVisible.current = visible;
263
- }, [onOpen, visible]);
250
+ if (visible && !prevVis.current) cbRef.current.onOpen?.();
251
+ prevVis.current = visible;
252
+ }, [visible]);
264
253
  useEffect(() => () => {
265
- animationRef.current?.stop();
254
+ animRef.current?.stop();
266
255
  }, []);
267
256
  const requestClose = useCallback(async reason => {
268
257
  if (closingRef.current) return;
269
258
  closingRef.current = true;
270
259
  try {
271
- if (beforeClose) {
272
- const result = await beforeClose(reason);
273
- if (result === false) {
274
- return;
275
- }
260
+ if (cbRef.current.beforeClose) {
261
+ const r = await cbRef.current.beforeClose(reason);
262
+ if (r === false) return;
276
263
  }
277
- onClose?.();
264
+ ;
265
+ cbRef.current.onClose?.();
278
266
  } finally {
279
267
  closingRef.current = false;
280
268
  }
281
- }, [beforeClose, onClose]);
269
+ }, []);
282
270
  useEffect(() => {
283
- if (!closeOnPopstate) {
284
- return;
285
- }
286
- const handler = () => {
287
- if (!visible) return;
288
- requestClose('close');
289
- };
290
- return addPopStateListener(handler);
271
+ if (!closeOnPopstate) return;
272
+ return addPopStateListener(() => {
273
+ if (visible) requestClose('close');
274
+ });
291
275
  }, [closeOnPopstate, requestClose, visible]);
292
- const handleStackClose = useCallback(() => {
293
- requestClose('close');
294
- }, [requestClose]);
276
+ const handleOvlPress = useCallback(() => {
277
+ cbRef.current.onClickOverlay?.();
278
+ if (closeOvl) requestClose('overlay');
279
+ }, [requestClose, closeOvl]);
280
+ const handleClosePress = useCallback(() => requestClose('close-icon'), [requestClose]);
281
+ const handleEscape = useCallback(() => requestClose('close'), [requestClose]);
295
282
  const {
296
- zIndex: stackZIndex
283
+ zIndex: stackZ
297
284
  } = useOverlayStack({
298
285
  visible: isOpen,
299
- onClose: handleStackClose,
286
+ onClose: handleEscape,
300
287
  closeOnBack: closeOnBackPress,
301
288
  lockScroll,
302
289
  zIndex,
@@ -308,7 +295,7 @@ export const Popup = props => {
308
295
  } = useAriaOverlay({
309
296
  isOpen,
310
297
  onClose: () => requestClose('overlay'),
311
- isDismissable: shouldCloseOnOverlay,
298
+ isDismissable: closeOvl,
312
299
  overlayProps: {
313
300
  ...(Platform.OS === 'android' ? {} : {
314
301
  accessibilityRole: 'dialog'
@@ -317,174 +304,165 @@ export const Popup = props => {
317
304
  }
318
305
  });
319
306
  const {
320
- onLayout: overlayOnLayout,
321
- ...overlayRestProps
307
+ onLayout: ovlOnLayout,
308
+ ...ovlRest
322
309
  } = overlayProps;
323
- const contentInteractionProps = stopPropagation ? {
324
- ...overlayRestProps,
325
- onStartShouldSetResponder: () => true
326
- } : overlayRestProps;
327
- const config = placementConfig[placement];
310
+ const contentProps = useMemo(() => stopPropagation ? {
311
+ ...ovlRest,
312
+ onStartShouldSetResponder: CAPTURE
313
+ } : ovlRest, [ovlRest, stopPropagation]);
314
+ const cfg = placementConfig[placement];
328
315
  const radiusStyle = buildRadius(round, placement, tokens.radius.round);
329
316
  const {
330
- width: windowWidth,
331
- height: windowHeight
317
+ width: wW,
318
+ height: wH
332
319
  } = useWindowDimensions();
333
- const translateDistance = placement === 'left' || placement === 'right' ? windowWidth : placement === 'top' || placement === 'bottom' ? windowHeight : 0;
334
- const translateTransform = useMemo(() => {
335
- if (!shouldTranslate) return null;
336
- const outputRange = [translateDistance * direction, 0];
337
- return config.axis === 'y' ? {
320
+ const dist = isH ? wW : isV ? wH : 0;
321
+ const translateT = useMemo(() => {
322
+ if (isCenter) return null;
323
+ const out = [dist * dir, 0];
324
+ return cfg.axis === 'y' ? {
338
325
  translateY: progress.interpolate({
339
326
  inputRange: [0, 1],
340
- outputRange
327
+ outputRange: out
341
328
  })
342
329
  } : {
343
330
  translateX: progress.interpolate({
344
331
  inputRange: [0, 1],
345
- outputRange
332
+ outputRange: out
346
333
  })
347
334
  };
348
- }, [config.axis, direction, progress, shouldTranslate, translateDistance]);
349
- const baseTransform = translateTransform ? [translateTransform] : [];
350
- const animatedContentStyle = useMemo(() => {
351
- const extraTransform = contentAnimationStyle?.transform;
352
- const transform = Array.isArray(extraTransform) ? [...baseTransform, ...extraTransform] : baseTransform;
353
- const baseStyle = {
335
+ }, [cfg.axis, dir, dist, isCenter, progress]);
336
+ const baseT = useMemo(() => translateT ? [translateT] : [], [translateT]);
337
+ const animStyle = useMemo(() => {
338
+ const et = contentAnimationStyle?.transform;
339
+ const t = Array.isArray(et) ? [...baseT, ...et] : baseT;
340
+ const s = {
354
341
  ...contentAnimationStyle,
355
- transform
342
+ transform: t
356
343
  };
357
- if (placement === 'center') {
358
- return {
359
- ...baseStyle,
360
- opacity: progress
361
- };
362
- }
363
- if (contentAnimationStyle?.opacity == null) {
364
- return {
365
- ...baseStyle,
366
- opacity: 1
367
- };
368
- }
369
- return baseStyle;
370
- }, [baseTransform, contentAnimationStyle, placement, progress]);
371
- const handleContentLayout = useCallback(event => {
372
- overlayOnLayout?.(event);
373
- }, [overlayOnLayout]);
374
- const [safeAreaTopHeight, setSafeAreaTopHeight] = useState(0);
375
- const handleSafeAreaTopLayout = useCallback(event => {
376
- setSafeAreaTopHeight(event.nativeEvent.layout.height);
377
- }, []);
344
+ if (isCenter) return {
345
+ ...s,
346
+ opacity: progress
347
+ };
348
+ if (contentAnimationStyle?.opacity == null) return {
349
+ ...s,
350
+ opacity: 1
351
+ };
352
+ return s;
353
+ }, [baseT, contentAnimationStyle, isCenter, progress]);
354
+ const [saTopH, setSaTopH] = useState(0);
355
+ const onSaTop = useCallback(e => setSaTopH(e.nativeEvent.layout.height), []);
378
356
  const shouldRender = mounted || visible;
379
357
  const hidden = !isOpen;
380
- const hasCustomCloseIcon = closeIcon != null;
381
358
  const hasHeader = isRenderable(title) || isRenderable(description);
382
- const headerPadding = tokens.spacing.closeIconRight + tokens.spacing.closeIconSize;
383
- const headerPaddingStyle = closeable && closeIconPosition.startsWith('top-') ? closeIconPosition.endsWith('right') ? {
384
- paddingRight: headerPadding
385
- } : {
386
- paddingLeft: headerPadding
387
- } : undefined;
388
- const closeIconTopValue = closeIconPosition.includes('top') ? tokens.spacing.closeIconTop + safeAreaTopHeight : undefined;
389
- const closeIconBottomValue = closeIconPosition.includes('bottom') ? tokens.spacing.closeIconTop : undefined;
390
- const closeIconVerticalStyle = closeIconBottomValue !== undefined ? {
391
- bottom: closeIconBottomValue
392
- } : {
393
- top: closeIconTopValue
394
- };
395
- const closeIconHorizontalStyle = closeIconPosition.endsWith('left') ? {
396
- left: tokens.spacing.closeIconRight
397
- } : {
398
- right: tokens.spacing.closeIconRight
399
- };
400
359
  const headerNode = useMemo(() => {
401
360
  if (!hasHeader) return null;
361
+ const pad = tokens.spacing.closeIconRight + tokens.spacing.closeIconSize;
362
+ const ps = closeable && closeIconPosition.startsWith('top-') ? closeIconPosition.endsWith('right') ? {
363
+ paddingRight: pad
364
+ } : {
365
+ paddingLeft: pad
366
+ } : undefined;
367
+ const renderH = (n, ts, ws) => !isRenderable(n) ? null : isText(n) ? /*#__PURE__*/React.createElement(Text, {
368
+ style: ts
369
+ }, n) : /*#__PURE__*/React.createElement(View, {
370
+ style: ws
371
+ }, n);
402
372
  return /*#__PURE__*/React.createElement(View, {
403
- style: [styles.header, headerPaddingStyle]
404
- }, renderHeaderNode(title, {
405
- textStyle: [styles.title, dynamicStyles.title],
406
- wrapperStyle: dynamicStyles.titleWrapper
407
- }), renderHeaderNode(description, {
408
- textStyle: [styles.description, dynamicStyles.description],
409
- wrapperStyle: dynamicStyles.descriptionWrapper
410
- }));
411
- }, [description, dynamicStyles.description, dynamicStyles.descriptionWrapper, dynamicStyles.title, dynamicStyles.titleWrapper, hasHeader, headerPaddingStyle, title]);
412
- const contentBody = useMemo(() => hasHeader ? /*#__PURE__*/React.createElement(React.Fragment, null, headerNode, children) : children, [children, hasHeader, headerNode]);
413
- const closeIconNode = useMemo(() => {
373
+ style: [S.header, ps]
374
+ }, renderH(title, [S.title, ds.title], ds.titleWrap), renderH(description, [S.desc, ds.desc], ds.descWrap));
375
+ }, [closeable, closeIconPosition, description, ds, hasHeader, title, tokens.spacing.closeIconRight, tokens.spacing.closeIconSize]);
376
+ const closeNode = useMemo(() => {
414
377
  if (!closeable) return null;
378
+ const custom = closeIcon != null;
379
+ const v = closeIconPosition.includes('bottom') ? {
380
+ bottom: tokens.spacing.closeIconTop
381
+ } : {
382
+ top: tokens.spacing.closeIconTop + saTopH
383
+ };
384
+ const isRtl = layoutDir === 'rtl';
385
+ const h = closeIconPosition.endsWith('left') ? isRtl ? {
386
+ right: tokens.spacing.closeIconRight
387
+ } : {
388
+ left: tokens.spacing.closeIconRight
389
+ } : isRtl ? {
390
+ left: tokens.spacing.closeIconRight
391
+ } : {
392
+ right: tokens.spacing.closeIconRight
393
+ };
415
394
  return /*#__PURE__*/React.createElement(Pressable, {
416
- style: [styles.closeIconBase, dynamicStyles.closeIconBase, closeIconVerticalStyle, closeIconHorizontalStyle, !hasCustomCloseIcon ? dynamicStyles.closeIconDefault : null],
395
+ style: [S.closeBase, ds.closeBase, v, h, !custom && ds.closeDef],
417
396
  hitSlop: 8,
418
- onPress: () => requestClose('close-icon')
419
- }, hasCustomCloseIcon ? closeIcon : /*#__PURE__*/React.createElement(Cross, {
397
+ onPress: handleClosePress
398
+ }, custom ? closeIcon : /*#__PURE__*/React.createElement(Cross, {
420
399
  size: 22,
421
400
  fill: tokens.colors.closeIcon,
422
401
  color: tokens.colors.closeIcon
423
402
  }));
424
- }, [closeIcon, closeIconHorizontalStyle, closeIconVerticalStyle, closeable, dynamicStyles.closeIconBase, dynamicStyles.closeIconDefault, hasCustomCloseIcon, requestClose, tokens.colors.closeIcon]);
425
- const content = useMemo(() => /*#__PURE__*/React.createElement(Animated.View, _extends({
426
- ref: overlayRef
427
- }, contentInteractionProps, {
428
- onLayout: handleContentLayout,
429
- renderToHardwareTextureAndroid: Platform.OS === 'android',
430
- shouldRasterizeIOS: Platform.OS === 'ios',
431
- style: [dynamicStyles.popup, placement === 'center' ? dynamicStyles.popupCenter : null, isVertical ? styles.popupVertical : null, isHorizontal ? dynamicStyles.popupSide : null, radiusStyle, animatedContentStyle, style, hidden ? hiddenContentStyle : null]
432
- }, rest), closeIconNode, renderWithSafeArea(contentBody, {
433
- safeArea,
434
- safeAreaInsetTop,
435
- safeAreaInsetBottom
436
- }, safeAreaInsetTop ? handleSafeAreaTopLayout : undefined)), [animatedContentStyle, closeIconNode, contentBody, contentInteractionProps, dynamicStyles.popup, dynamicStyles.popupCenter, dynamicStyles.popupSide, handleContentLayout, handleSafeAreaTopLayout, hidden, isHorizontal, isVertical, overlayRef, placement, radiusStyle, rest, safeArea, safeAreaInsetBottom, safeAreaInsetTop, style]);
403
+ }, [closeIcon, closeIconPosition, closeable, ds, handleClosePress, saTopH, tokens.colors.closeIcon, tokens.spacing.closeIconRight, tokens.spacing.closeIconTop]);
404
+ const body = hasHeader ? /*#__PURE__*/React.createElement(React.Fragment, null, headerNode, children) : children;
437
405
  if (!shouldRender) return null;
438
- const resolvedZIndex = stackZIndex ?? zIndex;
406
+ const rz = stackZ ?? zIndex;
407
+ const safeContent = safeArea ? /*#__PURE__*/React.createElement(SafeAreaView, null, body) : /*#__PURE__*/React.createElement(React.Fragment, null, safeAreaInsetTop && /*#__PURE__*/React.createElement(SafeAreaView, {
408
+ edge: "top",
409
+ onLayout: onSaTop,
410
+ pointerEvents: "none"
411
+ }), body, safeAreaInsetBottom && /*#__PURE__*/React.createElement(SafeAreaView, {
412
+ edge: "bottom",
413
+ pointerEvents: "none"
414
+ }));
439
415
  return /*#__PURE__*/React.createElement(Portal, null, /*#__PURE__*/React.createElement(View, {
440
- style: [styles.portalRoot, webFixedRootStyle, resolvedZIndex ? {
441
- zIndex: resolvedZIndex
416
+ style: [S.root, rz ? {
417
+ zIndex: rz
442
418
  } : undefined],
443
419
  pointerEvents: "box-none"
444
420
  }, /*#__PURE__*/React.createElement(View, {
445
- style: [styles.container, config.container],
421
+ style: [S.ctr, cfg.container],
446
422
  pointerEvents: isOpen ? 'auto' : 'none',
447
423
  accessibilityViewIsModal: isOpen,
448
424
  accessibilityLiveRegion: "polite",
449
- onAccessibilityEscape: () => requestClose('close')
425
+ onAccessibilityEscape: handleEscape
450
426
  }, overlay && isOpen ? /*#__PURE__*/React.createElement(AnimatedPressable, _extends({
451
427
  testID: overlayTestID,
452
- style: [styles.overlay, {
428
+ style: [S.ovl, {
453
429
  backgroundColor: tokens.colors.overlay,
454
430
  opacity: progress
455
431
  }, overlayStyle],
456
432
  renderToHardwareTextureAndroid: Platform.OS === 'android',
457
433
  shouldRasterizeIOS: Platform.OS === 'ios',
458
434
  pointerEvents: isOpen ? 'auto' : 'none'
459
- }, canCloseOnOverlay ? {
435
+ }, canCloseOvl ? {
460
436
  accessibilityRole: 'button',
461
437
  accessibilityLabel: overlayAccessibilityLabel,
462
- accessibilityHint: '双击即可关闭弹层'
438
+ accessibilityHint: locale?.vanPopup?.closeHint ?? 'Double-tap to close'
463
439
  } : {
464
440
  accessible: false
465
441
  }, {
466
- onPress: () => {
467
- onClickOverlay?.();
468
- if (shouldCloseOnOverlay) {
469
- requestClose('overlay');
470
- }
471
- }
442
+ onPress: handleOvlPress
472
443
  })) : null, !overlay && lockScroll && isOpen ? /*#__PURE__*/React.createElement(View, {
473
- style: styles.lockLayer,
444
+ style: S.lock,
474
445
  pointerEvents: "auto",
475
- onStartShouldSetResponder: () => true,
476
- onMoveShouldSetResponder: () => true
477
- }) : null, content)));
446
+ onStartShouldSetResponder: CAPTURE,
447
+ onMoveShouldSetResponder: CAPTURE
448
+ }) : null, /*#__PURE__*/React.createElement(Animated.View, _extends({
449
+ ref: overlayRef
450
+ }, contentProps, {
451
+ onLayout: ovlOnLayout,
452
+ renderToHardwareTextureAndroid: Platform.OS === 'android',
453
+ shouldRasterizeIOS: Platform.OS === 'ios',
454
+ style: [ds.popup, isCenter && ds.center, isV && S.popV, isH && ds.side, radiusStyle, animStyle, style, hidden && hiddenStyle]
455
+ }, rest), closeNode, safeContent))));
478
456
  };
479
- const styles = StyleSheet.create({
480
- portalRoot: {
457
+ const S = StyleSheet.create({
458
+ root: {
481
459
  ...StyleSheet.absoluteFillObject,
482
460
  justifyContent: 'center'
483
461
  },
484
- container: {
462
+ ctr: {
485
463
  flex: 1
486
464
  },
487
- overlay: {
465
+ ovl: {
488
466
  ...StyleSheet.absoluteFillObject,
489
467
  opacity: 0
490
468
  },
@@ -494,28 +472,21 @@ const styles = StyleSheet.create({
494
472
  title: {
495
473
  includeFontPadding: false
496
474
  },
497
- description: {
475
+ desc: {
498
476
  includeFontPadding: false
499
477
  },
500
- popupVertical: {
478
+ popV: {
501
479
  alignSelf: 'stretch'
502
480
  },
503
- closeIconBase: {
481
+ closeBase: {
504
482
  position: 'absolute',
505
483
  zIndex: 999,
506
484
  alignItems: 'center',
507
485
  justifyContent: 'center'
508
486
  },
509
- lockLayer: {
487
+ lock: {
510
488
  ...StyleSheet.absoluteFillObject
511
489
  }
512
490
  });
513
- const webFixedRootStyle = Platform.OS === 'web' ? {
514
- position: 'fixed',
515
- top: 0,
516
- left: 0,
517
- right: 0,
518
- bottom: 0
519
- } : undefined;
520
- Popup.displayName = 'Popup';
491
+ export const Popup = /*#__PURE__*/React.memo(PopupImpl);
521
492
  export default Popup;