react-native-system-ui 0.0.6 → 1.0.0

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 (366) hide show
  1. package/README.md +53 -30
  2. package/dist/cjs/components/action-sheet/ActionSheet.js +97 -105
  3. package/dist/cjs/components/action-sheet/tokens.js +16 -27
  4. package/dist/cjs/components/area/Area.js +54 -67
  5. package/dist/cjs/components/area/tokens.js +6 -3
  6. package/dist/cjs/components/avatar/Avatar.js +25 -23
  7. package/dist/cjs/components/badge/Badge.js +31 -31
  8. package/dist/cjs/components/badge/tokens.js +6 -8
  9. package/dist/cjs/components/button/Button.js +115 -151
  10. package/dist/cjs/components/button/ButtonGroup.js +8 -42
  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 +177 -180
  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 +70 -83
  18. package/dist/cjs/components/cell/CellGroup.js +16 -29
  19. package/dist/cjs/components/checkbox/Checkbox.js +139 -132
  20. package/dist/cjs/components/checkbox/CheckboxGroup.js +4 -35
  21. package/dist/cjs/components/checkbox/tokens.js +7 -10
  22. package/dist/cjs/components/circle/Circle.js +25 -24
  23. package/dist/cjs/components/collapse/Collapse.js +75 -91
  24. package/dist/cjs/components/config-provider/ConfigProvider.js +16 -3
  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 +20 -15
  31. package/dist/cjs/components/datetime-picker/DatetimePicker.js +61 -84
  32. package/dist/cjs/components/datetime-picker/tokens.js +14 -3
  33. package/dist/cjs/components/dialog/Dialog.js +153 -121
  34. package/dist/cjs/components/dialog/imperative.js +17 -30
  35. package/dist/cjs/components/divider/Divider.js +26 -28
  36. package/dist/cjs/components/empty/Empty.js +35 -39
  37. package/dist/cjs/components/error-boundary/ErrorBoundary.js +73 -0
  38. package/dist/cjs/components/error-boundary/index.js +19 -0
  39. package/dist/cjs/components/field/Field.js +109 -106
  40. package/dist/cjs/components/flex/Flex.js +18 -18
  41. package/dist/cjs/components/flex/FlexItem.js +26 -27
  42. package/dist/cjs/components/form/Form.js +142 -161
  43. package/dist/cjs/components/form/FormItem.js +69 -97
  44. package/dist/cjs/components/form/FormList.js +49 -37
  45. package/dist/cjs/components/form/tokens.js +6 -3
  46. package/dist/cjs/components/form/utils.js +15 -34
  47. package/dist/cjs/components/grid/Grid.js +30 -29
  48. package/dist/cjs/components/grid/GridItem.js +84 -85
  49. package/dist/cjs/components/image/Image.js +55 -59
  50. package/dist/cjs/components/image/tokens.js +2 -2
  51. package/dist/cjs/components/image-preview/ImagePreview.js +124 -112
  52. package/dist/cjs/components/image-preview/imperative.js +4 -13
  53. package/dist/cjs/components/index.js +13 -0
  54. package/dist/cjs/components/input/Input.js +30 -22
  55. package/dist/cjs/components/loading/Loading.js +14 -15
  56. package/dist/cjs/components/nav-bar/NavBar.js +68 -83
  57. package/dist/cjs/components/nav-bar/tokens.js +1 -9
  58. package/dist/cjs/components/notice-bar/NoticeBar.js +74 -77
  59. package/dist/cjs/components/notify/Notify.js +88 -84
  60. package/dist/cjs/components/notify/imperative.js +20 -43
  61. package/dist/cjs/components/notify/tokens.js +1 -11
  62. package/dist/cjs/components/number-keyboard/NumberKeyboard.js +187 -209
  63. package/dist/cjs/components/overlay/Overlay.js +37 -52
  64. package/dist/cjs/components/overlay/tokens.js +5 -3
  65. package/dist/cjs/components/password-input/PasswordInput.js +98 -79
  66. package/dist/cjs/components/picker/Picker.js +440 -421
  67. package/dist/cjs/components/picker/tokens.js +1 -1
  68. package/dist/cjs/components/popup/Popup.js +263 -293
  69. package/dist/cjs/components/portal/Portal.js +12 -29
  70. package/dist/cjs/components/portal/PortalHost.js +151 -234
  71. package/dist/cjs/components/progress/Progress.js +51 -48
  72. package/dist/cjs/components/radio/Radio.js +45 -42
  73. package/dist/cjs/components/radio/RadioGroup.js +8 -40
  74. package/dist/cjs/components/radio/tokens.js +7 -10
  75. package/dist/cjs/components/safe-area-view/SafeAreaView.js +22 -26
  76. package/dist/cjs/components/search/Search.js +51 -43
  77. package/dist/cjs/components/selector/Selector.js +14 -13
  78. package/dist/cjs/components/share-sheet/ShareSheet.js +160 -161
  79. package/dist/cjs/components/sidebar/Sidebar.js +39 -45
  80. package/dist/cjs/components/sidebar/SidebarContext.js +1 -2
  81. package/dist/cjs/components/sidebar/SidebarItem.js +13 -16
  82. package/dist/cjs/components/sidebar/tokens.js +1 -3
  83. package/dist/cjs/components/skeleton/Skeleton.js +30 -37
  84. package/dist/cjs/components/skeleton/tokens.js +1 -2
  85. package/dist/cjs/components/slider/Slider.js +156 -135
  86. package/dist/cjs/components/space/Space.js +46 -69
  87. package/dist/cjs/components/stepper/Stepper.js +177 -155
  88. package/dist/cjs/components/swiper/Swiper.js +251 -253
  89. package/dist/cjs/components/swiper/SwiperPagIndicator.js +25 -27
  90. package/dist/cjs/components/swiper/tokens.js +10 -3
  91. package/dist/cjs/components/switch/Switch.js +13 -15
  92. package/dist/cjs/components/tabbar/Tabbar.js +35 -27
  93. package/dist/cjs/components/tabbar/TabbarContext.js +1 -2
  94. package/dist/cjs/components/tabbar/TabbarItem.js +65 -68
  95. package/dist/cjs/components/tabs/Tabs.js +286 -313
  96. package/dist/cjs/components/tag/Tag.js +46 -37
  97. package/dist/cjs/components/toast/Toast.js +90 -90
  98. package/dist/cjs/components/toast/imperative.js +16 -41
  99. package/dist/cjs/components/typography/Typography.js +3 -5
  100. package/dist/cjs/components/water-mark/WaterMark.js +31 -29
  101. package/dist/cjs/design-system/ThemeProvider.js +5 -11
  102. package/dist/cjs/design-system/createComponentTokensHook.js +11 -13
  103. package/dist/cjs/design-system/presets.js +2 -3
  104. package/dist/cjs/design-system/tokens.js +2 -11
  105. package/dist/cjs/hooks/animation/index.js +25 -0
  106. package/dist/cjs/hooks/animation/useAnimatedTransition.js +72 -0
  107. package/dist/cjs/hooks/animation/useReducedMotion.js +75 -0
  108. package/dist/cjs/hooks/aria/useAriaListBox.js +8 -16
  109. package/dist/cjs/hooks/aria/useAriaOverlay.js +3 -3
  110. package/dist/cjs/hooks/aria/useAriaPress.js +8 -21
  111. package/dist/cjs/hooks/aria/useAriaToggle.js +3 -3
  112. package/dist/cjs/hooks/gesture/useGestureScroll.js +60 -61
  113. package/dist/cjs/hooks/index.js +12 -0
  114. package/dist/cjs/hooks/overlay/OverlayStackStore.js +49 -69
  115. package/dist/cjs/hooks/overlay/useOverlayStack.js +13 -19
  116. package/dist/cjs/hooks/useControllableValue.js +10 -21
  117. package/dist/cjs/hooks/useCountDown.js +14 -22
  118. package/dist/cjs/hooks/useHairline.js +17 -29
  119. package/dist/cjs/hooks/useSafeAreaPadding.js +1 -4
  120. package/dist/cjs/index.js +67 -1
  121. package/dist/cjs/platform/animation.js +10 -2
  122. package/dist/cjs/platform/measure.js +18 -36
  123. package/dist/cjs/utils/color.js +21 -35
  124. package/dist/cjs/utils/compare.js +7 -12
  125. package/dist/cjs/utils/createPlatformShadow.js +28 -39
  126. package/dist/cjs/utils/date.js +20 -50
  127. package/dist/cjs/utils/deepMerge.js +16 -26
  128. package/dist/cjs/utils/hairline.js +74 -71
  129. package/dist/cjs/utils/index.js +22 -0
  130. package/dist/cjs/utils/number.js +21 -29
  131. package/dist/cjs/utils/render.js +27 -0
  132. package/dist/cjs/utils/rtl.js +25 -0
  133. package/dist/cjs/utils/string.js +8 -25
  134. package/dist/es/components/action-sheet/ActionSheet.js +99 -107
  135. package/dist/es/components/action-sheet/tokens.js +16 -27
  136. package/dist/es/components/area/Area.js +55 -68
  137. package/dist/es/components/area/tokens.js +6 -3
  138. package/dist/es/components/avatar/Avatar.js +25 -23
  139. package/dist/es/components/avatar/index.js +1 -2
  140. package/dist/es/components/badge/Badge.js +33 -33
  141. package/dist/es/components/badge/tokens.js +6 -8
  142. package/dist/es/components/button/Button.js +116 -152
  143. package/dist/es/components/button/ButtonGroup.js +9 -43
  144. package/dist/es/components/button/tokens.js +2 -3
  145. package/dist/es/components/calendar/Calendar.js +214 -225
  146. package/dist/es/components/calendar/tokens.js +3 -3
  147. package/dist/es/components/cascader/Cascader.js +180 -183
  148. package/dist/es/components/cascader/tokens.js +2 -2
  149. package/dist/es/components/cascader/useCascaderExtend.js +25 -29
  150. package/dist/es/components/cell/Cell.js +71 -84
  151. package/dist/es/components/cell/CellGroup.js +16 -28
  152. package/dist/es/components/checkbox/Checkbox.js +140 -133
  153. package/dist/es/components/checkbox/CheckboxGroup.js +5 -36
  154. package/dist/es/components/checkbox/tokens.js +7 -10
  155. package/dist/es/components/circle/Circle.js +25 -23
  156. package/dist/es/components/collapse/Collapse.js +77 -92
  157. package/dist/es/components/config-provider/ConfigProvider.js +10 -3
  158. package/dist/es/components/config-provider/DirectionContext.js +2 -0
  159. package/dist/es/components/config-provider/index.js +1 -0
  160. package/dist/es/components/config-provider/locale/en-US.js +32 -0
  161. package/dist/es/components/config-provider/locale/zh-CN.js +32 -0
  162. package/dist/es/components/config-provider/useDirection.js +3 -0
  163. package/dist/es/components/count-down/CountDown.js +23 -18
  164. package/dist/es/components/datetime-picker/DatetimePicker.js +61 -84
  165. package/dist/es/components/datetime-picker/tokens.js +14 -3
  166. package/dist/es/components/dialog/Dialog.js +154 -121
  167. package/dist/es/components/dialog/imperative.js +17 -30
  168. package/dist/es/components/divider/Divider.js +28 -29
  169. package/dist/es/components/empty/Empty.js +36 -39
  170. package/dist/es/components/error-boundary/ErrorBoundary.js +61 -0
  171. package/dist/es/components/error-boundary/index.js +1 -0
  172. package/dist/es/components/field/Field.js +109 -106
  173. package/dist/es/components/flex/Flex.js +18 -17
  174. package/dist/es/components/flex/FlexItem.js +27 -27
  175. package/dist/es/components/form/Form.js +143 -162
  176. package/dist/es/components/form/FormItem.js +68 -95
  177. package/dist/es/components/form/FormList.js +49 -37
  178. package/dist/es/components/form/tokens.js +6 -3
  179. package/dist/es/components/form/utils.js +15 -34
  180. package/dist/es/components/grid/Grid.js +30 -28
  181. package/dist/es/components/grid/GridItem.js +84 -84
  182. package/dist/es/components/image/Image.js +58 -62
  183. package/dist/es/components/image/tokens.js +2 -2
  184. package/dist/es/components/image-preview/ImagePreview.js +124 -112
  185. package/dist/es/components/image-preview/imperative.js +4 -13
  186. package/dist/es/components/index.js +3 -1
  187. package/dist/es/components/input/Input.js +31 -23
  188. package/dist/es/components/loading/Loading.js +16 -16
  189. package/dist/es/components/nav-bar/NavBar.js +68 -83
  190. package/dist/es/components/nav-bar/tokens.js +1 -3
  191. package/dist/es/components/notice-bar/NoticeBar.js +74 -76
  192. package/dist/es/components/notify/Notify.js +92 -87
  193. package/dist/es/components/notify/imperative.js +21 -44
  194. package/dist/es/components/notify/tokens.js +1 -5
  195. package/dist/es/components/number-keyboard/NumberKeyboard.js +187 -209
  196. package/dist/es/components/overlay/Overlay.js +36 -51
  197. package/dist/es/components/overlay/tokens.js +5 -3
  198. package/dist/es/components/password-input/PasswordInput.js +98 -79
  199. package/dist/es/components/picker/Picker.js +440 -421
  200. package/dist/es/components/picker/tokens.js +1 -1
  201. package/dist/es/components/popup/Popup.js +263 -292
  202. package/dist/es/components/portal/Portal.js +13 -29
  203. package/dist/es/components/portal/PortalHost.js +152 -234
  204. package/dist/es/components/progress/Progress.js +51 -48
  205. package/dist/es/components/radio/Radio.js +47 -44
  206. package/dist/es/components/radio/RadioGroup.js +10 -41
  207. package/dist/es/components/radio/tokens.js +7 -10
  208. package/dist/es/components/safe-area-view/SafeAreaView.js +22 -25
  209. package/dist/es/components/search/Search.js +52 -44
  210. package/dist/es/components/selector/Selector.js +14 -13
  211. package/dist/es/components/share-sheet/ShareSheet.js +162 -163
  212. package/dist/es/components/sidebar/Sidebar.js +41 -47
  213. package/dist/es/components/sidebar/SidebarContext.js +1 -2
  214. package/dist/es/components/sidebar/SidebarItem.js +13 -15
  215. package/dist/es/components/sidebar/tokens.js +1 -3
  216. package/dist/es/components/skeleton/Skeleton.js +30 -37
  217. package/dist/es/components/skeleton/tokens.js +1 -2
  218. package/dist/es/components/slider/Slider.js +156 -134
  219. package/dist/es/components/space/Space.js +48 -71
  220. package/dist/es/components/stepper/Stepper.js +178 -156
  221. package/dist/es/components/swiper/Swiper.js +252 -254
  222. package/dist/es/components/swiper/SwiperPagIndicator.js +25 -27
  223. package/dist/es/components/swiper/tokens.js +10 -3
  224. package/dist/es/components/switch/Switch.js +13 -15
  225. package/dist/es/components/tabbar/Tabbar.js +36 -28
  226. package/dist/es/components/tabbar/TabbarContext.js +1 -2
  227. package/dist/es/components/tabbar/TabbarItem.js +66 -69
  228. package/dist/es/components/tabs/Tabs.js +286 -313
  229. package/dist/es/components/tag/Tag.js +49 -39
  230. package/dist/es/components/toast/Toast.js +93 -91
  231. package/dist/es/components/toast/imperative.js +16 -41
  232. package/dist/es/components/typography/Typography.js +3 -5
  233. package/dist/es/components/water-mark/WaterMark.js +32 -30
  234. package/dist/es/design-system/ThemeProvider.js +5 -11
  235. package/dist/es/design-system/createComponentTokensHook.js +11 -13
  236. package/dist/es/design-system/presets.js +2 -3
  237. package/dist/es/design-system/tokens.js +1 -9
  238. package/dist/es/hooks/animation/index.js +2 -0
  239. package/dist/es/hooks/animation/useAnimatedTransition.js +53 -0
  240. package/dist/es/hooks/animation/useReducedMotion.js +54 -0
  241. package/dist/es/hooks/aria/useAriaListBox.js +8 -16
  242. package/dist/es/hooks/aria/useAriaOverlay.js +3 -3
  243. package/dist/es/hooks/aria/useAriaPress.js +8 -21
  244. package/dist/es/hooks/aria/useAriaToggle.js +3 -3
  245. package/dist/es/hooks/gesture/useGestureScroll.js +60 -61
  246. package/dist/es/hooks/index.js +1 -0
  247. package/dist/es/hooks/overlay/OverlayStackStore.js +49 -69
  248. package/dist/es/hooks/overlay/useOverlayStack.js +13 -19
  249. package/dist/es/hooks/useControllableValue.js +10 -21
  250. package/dist/es/hooks/useCountDown.js +14 -22
  251. package/dist/es/hooks/useHairline.js +16 -28
  252. package/dist/es/hooks/useSafeAreaPadding.js +1 -4
  253. package/dist/es/index.js +8 -1
  254. package/dist/es/platform/animation.js +9 -1
  255. package/dist/es/platform/measure.js +18 -36
  256. package/dist/es/utils/color.js +21 -35
  257. package/dist/es/utils/compare.js +7 -12
  258. package/dist/es/utils/createPlatformShadow.js +28 -39
  259. package/dist/es/utils/date.js +20 -50
  260. package/dist/es/utils/deepMerge.js +16 -26
  261. package/dist/es/utils/hairline.js +73 -65
  262. package/dist/es/utils/index.js +2 -0
  263. package/dist/es/utils/number.js +21 -29
  264. package/dist/es/utils/render.js +7 -0
  265. package/dist/es/utils/rtl.js +17 -0
  266. package/dist/es/utils/string.js +8 -25
  267. package/dist/types/components/action-sheet/ActionSheet.d.ts +1 -1
  268. package/dist/types/components/area/Area.d.ts +1 -1
  269. package/dist/types/components/area/tokens.d.ts +4 -0
  270. package/dist/types/components/avatar/Avatar.d.ts +1 -1
  271. package/dist/types/components/avatar/index.d.ts +1 -2
  272. package/dist/types/components/badge/Badge.d.ts +1 -1
  273. package/dist/types/components/button/Button.d.ts +1 -1
  274. package/dist/types/components/button/index.d.ts +1 -1
  275. package/dist/types/components/calendar/Calendar.d.ts +1 -1
  276. package/dist/types/components/cascader/Cascader.d.ts +1 -1
  277. package/dist/types/components/cell/Cell.d.ts +1 -1
  278. package/dist/types/components/cell/CellGroup.d.ts +1 -1
  279. package/dist/types/components/cell/index.d.ts +2 -2
  280. package/dist/types/components/checkbox/Checkbox.d.ts +1 -1
  281. package/dist/types/components/circle/Circle.d.ts +1 -1
  282. package/dist/types/components/collapse/Collapse.d.ts +1 -2
  283. package/dist/types/components/config-provider/DirectionContext.d.ts +3 -0
  284. package/dist/types/components/config-provider/index.d.ts +2 -1
  285. package/dist/types/components/config-provider/locale/en-US.d.ts +32 -0
  286. package/dist/types/components/config-provider/locale/zh-CN.d.ts +32 -0
  287. package/dist/types/components/config-provider/useDirection.d.ts +1 -0
  288. package/dist/types/components/count-down/CountDown.d.ts +1 -1
  289. package/dist/types/components/datetime-picker/DatetimePicker.d.ts +1 -1
  290. package/dist/types/components/datetime-picker/tokens.d.ts +12 -0
  291. package/dist/types/components/dialog/Dialog.d.ts +1 -1
  292. package/dist/types/components/divider/Divider.d.ts +1 -1
  293. package/dist/types/components/empty/Empty.d.ts +1 -1
  294. package/dist/types/components/error-boundary/ErrorBoundary.d.ts +6 -0
  295. package/dist/types/components/error-boundary/index.d.ts +2 -0
  296. package/dist/types/components/field/Field.d.ts +1 -1
  297. package/dist/types/components/flex/Flex.d.ts +1 -1
  298. package/dist/types/components/flex/FlexItem.d.ts +1 -1
  299. package/dist/types/components/flex/index.d.ts +2 -2
  300. package/dist/types/components/form/Form.d.ts +1 -1
  301. package/dist/types/components/form/FormItem.d.ts +2 -1
  302. package/dist/types/components/form/index.d.ts +2 -2
  303. package/dist/types/components/form/tokens.d.ts +4 -0
  304. package/dist/types/components/grid/Grid.d.ts +1 -1
  305. package/dist/types/components/grid/GridItem.d.ts +1 -1
  306. package/dist/types/components/grid/index.d.ts +2 -2
  307. package/dist/types/components/image/Image.d.ts +1 -1
  308. package/dist/types/components/image-preview/ImagePreview.d.ts +1 -1
  309. package/dist/types/components/index.d.ts +4 -1
  310. package/dist/types/components/input/Input.d.ts +3 -3
  311. package/dist/types/components/loading/Loading.d.ts +1 -1
  312. package/dist/types/components/nav-bar/NavBar.d.ts +1 -1
  313. package/dist/types/components/notice-bar/NoticeBar.d.ts +1 -1
  314. package/dist/types/components/notify/Notify.d.ts +2 -2
  315. package/dist/types/components/notify/index.d.ts +1 -1
  316. package/dist/types/components/overlay/Overlay.d.ts +1 -5
  317. package/dist/types/components/overlay/tokens.d.ts +3 -0
  318. package/dist/types/components/password-input/PasswordInput.d.ts +1 -1
  319. package/dist/types/components/picker/Picker.d.ts +5 -5
  320. package/dist/types/components/popup/Popup.d.ts +3 -42
  321. package/dist/types/components/portal/Portal.d.ts +9 -6
  322. package/dist/types/components/portal/PortalHost.d.ts +1 -1
  323. package/dist/types/components/radio/RadioGroup.d.ts +1 -1
  324. package/dist/types/components/safe-area-view/SafeAreaView.d.ts +1 -1
  325. package/dist/types/components/search/Search.d.ts +1 -1
  326. package/dist/types/components/share-sheet/ShareSheet.d.ts +1 -1
  327. package/dist/types/components/sidebar/Sidebar.d.ts +1 -1
  328. package/dist/types/components/sidebar/SidebarContext.d.ts +1 -1
  329. package/dist/types/components/sidebar/SidebarItem.d.ts +1 -1
  330. package/dist/types/components/sidebar/index.d.ts +2 -2
  331. package/dist/types/components/skeleton/Skeleton.d.ts +1 -1
  332. package/dist/types/components/slider/Slider.d.ts +1 -1
  333. package/dist/types/components/stepper/Stepper.d.ts +1 -1
  334. package/dist/types/components/swiper/Swiper.d.ts +1 -1
  335. package/dist/types/components/swiper/index.d.ts +1 -1
  336. package/dist/types/components/swiper/tokens.d.ts +8 -0
  337. package/dist/types/components/tabbar/Tabbar.d.ts +2 -2
  338. package/dist/types/components/tabbar/TabbarContext.d.ts +1 -1
  339. package/dist/types/components/tabbar/TabbarItem.d.ts +2 -2
  340. package/dist/types/components/tabs/Tabs.d.ts +1 -1
  341. package/dist/types/components/tabs/index.d.ts +1 -1
  342. package/dist/types/components/tag/Tag.d.ts +1 -1
  343. package/dist/types/components/toast/Toast.d.ts +2 -2
  344. package/dist/types/components/toast/index.d.ts +1 -1
  345. package/dist/types/components/water-mark/WaterMark.d.ts +1 -1
  346. package/dist/types/design-system/tokens.d.ts +0 -1
  347. package/dist/types/hooks/animation/index.d.ts +3 -0
  348. package/dist/types/hooks/animation/useAnimatedTransition.d.ts +13 -0
  349. package/dist/types/hooks/animation/useReducedMotion.d.ts +3 -0
  350. package/dist/types/hooks/aria/useAriaOverlay.d.ts +1 -1
  351. package/dist/types/hooks/gesture/useGestureScroll.d.ts +11 -10
  352. package/dist/types/hooks/index.d.ts +1 -0
  353. package/dist/types/hooks/overlay/OverlayStackStore.d.ts +8 -8
  354. package/dist/types/hooks/useHairline.d.ts +1 -1
  355. package/dist/types/index.d.ts +5 -0
  356. package/dist/types/platform/animation.d.ts +8 -0
  357. package/dist/types/platform/measure.d.ts +1 -1
  358. package/dist/types/utils/compare.d.ts +1 -1
  359. package/dist/types/utils/createPlatformShadow.d.ts +2 -2
  360. package/dist/types/utils/date.d.ts +2 -2
  361. package/dist/types/utils/hairline.d.ts +5 -10
  362. package/dist/types/utils/index.d.ts +2 -0
  363. package/dist/types/utils/number.d.ts +2 -2
  364. package/dist/types/utils/render.d.ts +5 -0
  365. package/dist/types/utils/rtl.d.ts +5 -0
  366. package/package.json +10 -3
@@ -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',
@@ -149,154 +124,166 @@ export const Popup = props => {
149
124
  } = props;
150
125
  const placement = placementProp ?? position ?? 'center';
151
126
  const shouldCloseOnOverlay = closeOnClickOverlay ?? closeOnOverlayPress ?? true;
152
- const shouldTranslate = placement !== 'center';
127
+ const isCenter = placement === 'center';
153
128
  const safeAreaInsetBottom = safeAreaInsetBottomProp ?? 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
+ fontSize: t.titleSize,
164
+ fontWeight: t.titleWeight,
165
+ marginHorizontal: s.descriptionHorizontal,
166
+ textAlign: 'center'
167
+ },
168
+ titleWrap: {
169
+ marginTop: s.titleTop,
170
+ marginBottom: s.titleBottom,
171
+ marginHorizontal: s.descriptionHorizontal,
172
+ alignItems: 'center'
173
+ },
174
+ desc: {
175
+ color: c.description,
176
+ fontSize: t.descriptionSize,
177
+ lineHeight: t.descriptionLineHeight
178
+ },
179
+ descWrap: {
180
+ marginHorizontal: s.descriptionHorizontal,
181
+ marginBottom: s.descriptionBottom
182
+ },
183
+ closeBase: {
184
+ minWidth: s.closeIconSize,
185
+ minHeight: s.closeIconSize,
186
+ padding: s.closeIconPadding
187
+ },
188
+ closeDef: {
189
+ width: s.closeIconSize,
190
+ height: s.closeIconSize
191
+ },
192
+ side: {
193
+ width: l.sideWidth,
194
+ maxWidth: l.maxWidth
195
+ },
196
+ center: {
197
+ minWidth: l.minWidth,
198
+ maxWidth: l.centerMaxWidth
199
+ }
200
+ };
201
+ }, [tokens]);
208
202
  const [mounted, setMounted] = useState(visible);
209
- const [interactionVisible, setInteractionVisible] = useState(visible);
210
- const isOpen = visible || interactionVisible;
211
- const canCloseOnOverlay = shouldCloseOnOverlay && (onClose || beforeClose);
203
+ const [interVis, setInterVis] = useState(visible);
204
+ const isOpen = visible || interVis;
205
+ const canCloseOvl = shouldCloseOnOverlay && (onClose || beforeClose);
212
206
  const progress = useRef(new Animated.Value(0)).current;
213
- const animationRef = useRef(null);
214
- const animationSeqRef = useRef(0);
215
- const prevVisible = useRef(visible);
207
+ const animRef = useRef(null);
208
+ const seqRef = useRef(0);
209
+ const prevVis = useRef(visible);
216
210
  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, {
211
+ const isV = placement === 'top' || placement === 'bottom';
212
+ const isH = placement === 'left' || placement === 'right';
213
+ const dir = placement === 'top' || placement === 'left' ? -1 : 1;
214
+ const runAnim = useCallback((show, rm) => {
215
+ seqRef.current += 1;
216
+ const seq = seqRef.current;
217
+ animRef.current?.stop();
218
+ const d = rm ? 0 : duration;
219
+ const a = Animated.timing(progress, {
226
220
  toValue: show ? 1 : 0,
227
- duration,
228
- easing,
221
+ duration: d,
222
+ easing: show ? EASE_OUT : EASE_IN,
229
223
  useNativeDriver: nativeDriverEnabled,
230
224
  isInteraction: false
231
225
  });
232
- animationRef.current = animation;
233
- animation.start(({
226
+ animRef.current = a;
227
+ a.start(({
234
228
  finished
235
229
  }) => {
236
- if (!finished || currentSeq !== animationSeqRef.current) return;
230
+ if (!finished || seq !== seqRef.current) return;
237
231
  if (show) {
238
- onOpened?.();
232
+ cbRef.current.onOpened?.();
239
233
  } else {
240
- setInteractionVisible(false);
241
- if (destroyOnClose) {
242
- setMounted(false);
243
- }
244
- onClosed?.();
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 (shouldCloseOnOverlay) requestClose('overlay');
279
+ }, [requestClose, shouldCloseOnOverlay]);
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,
@@ -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;