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,19 +3,21 @@ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'
3
3
  import { Animated, Easing, Pressable, StyleSheet, Text, View, Platform } from 'react-native';
4
4
  import { Arrow, Close } from 'react-native-system-icon';
5
5
  import { useAriaPress } from '../../hooks';
6
+ import { useLocale } from '../config-provider/useLocale';
7
+ import { useDirection } from '../config-provider/useDirection';
6
8
  import { parseNumber } from '../../utils/number';
7
9
  import { isRenderable, isText } from '../../utils/validate';
10
+ import { renderTextOrNode } from '../../utils';
8
11
  import { nativeDriverEnabled } from '../../platform';
12
+ import { useReducedMotion } from '../../hooks/animation';
9
13
  import { useNoticeBarTokens } from './tokens';
10
14
  const AnimatedText = Animated.createAnimatedComponent(Text);
11
15
  const IS_WEB = Platform.OS === 'web';
12
16
  if (IS_WEB) {
13
17
  const globalObj = typeof globalThis !== 'undefined' ? globalThis : window;
14
- if (globalObj.global === undefined) {
15
- globalObj.global = globalObj;
16
- }
18
+ if (globalObj.global === undefined) globalObj.global = globalObj;
17
19
  }
18
- export const NoticeBar = props => {
20
+ const NoticeBarImpl = props => {
19
21
  const {
20
22
  text,
21
23
  children,
@@ -40,6 +42,9 @@ export const NoticeBar = props => {
40
42
  style,
41
43
  ...rest
42
44
  } = props;
45
+ const locale = useLocale();
46
+ const layoutDir = useDirection();
47
+ const reducedMotion = useReducedMotion();
43
48
  const tokens = useNoticeBarTokens(tokensOverride);
44
49
  const resolvedColor = color ?? tokens.colors.text;
45
50
  const resolvedBackground = background ?? tokens.colors.background;
@@ -61,11 +66,11 @@ export const NoticeBar = props => {
61
66
  const verticalItems = useMemo(() => {
62
67
  if (!isVertical) return [];
63
68
  if (items && items.length) return items;
64
- const childArray = React.Children.toArray(children);
65
- if (childArray.length) return childArray;
69
+ const arr = React.Children.toArray(children);
70
+ if (arr.length) return arr;
66
71
  return text !== undefined ? [text] : [];
67
72
  }, [children, isVertical, items, text]);
68
- const hasVerticalLoop = isVertical && verticalItems.length > 1;
73
+ const hasVerticalLoop = !reducedMotion && isVertical && verticalItems.length > 1;
69
74
  const verticalTrackItems = useMemo(() => hasVerticalLoop ? [...verticalItems, verticalItems[0]] : verticalItems, [hasVerticalLoop, verticalItems]);
70
75
  const verticalTranslateY = useRef(new Animated.Value(0)).current;
71
76
  const [itemHeight, setItemHeight] = useState(0);
@@ -75,16 +80,20 @@ export const NoticeBar = props => {
75
80
  const setContainerWidthSafe = useCallback(next => {
76
81
  setContainerWidth(prev => Math.abs(prev - next) < 0.5 ? prev : next);
77
82
  }, []);
83
+ const onCloseRef = useRef(onClose);
84
+ onCloseRef.current = onClose;
85
+ const onReplayRef = useRef(onReplay);
86
+ onReplayRef.current = onReplay;
78
87
  const handleClose = useCallback(() => {
79
88
  setVisible(false);
80
- onClose?.();
81
- }, [onClose]);
89
+ onCloseRef.current?.();
90
+ }, []);
82
91
  const closePress = useAriaPress({
83
92
  disabled: mode !== 'closeable' || !visible,
84
93
  onPress: handleClose,
85
94
  extraProps: {
86
95
  accessibilityRole: 'button',
87
- accessibilityLabel: '关闭'
96
+ accessibilityLabel: locale?.vanNoticeBar?.close ?? 'Close'
88
97
  }
89
98
  });
90
99
  const barPress = useAriaPress({
@@ -94,7 +103,7 @@ export const NoticeBar = props => {
94
103
  accessibilityRole: 'button'
95
104
  } : undefined
96
105
  });
97
- const rightNode = useMemo(() => mode === 'closeable' ? /*#__PURE__*/React.createElement(Pressable, _extends({
106
+ const rightNode = mode === 'closeable' ? /*#__PURE__*/React.createElement(Pressable, _extends({
98
107
  hitSlop: 8
99
108
  }, closePress.interactionProps), /*#__PURE__*/React.createElement(Close, {
100
109
  size: 16,
@@ -104,42 +113,36 @@ export const NoticeBar = props => {
104
113
  size: 16,
105
114
  fill: resolvedColor,
106
115
  color: resolvedColor
107
- }) : rightIcon || null, [closePress.interactionProps, mode, resolvedColor, rightIcon]);
116
+ }) : rightIcon || null;
108
117
  const hasLeft = isRenderable(leftIcon);
109
118
  const hasRight = Boolean(rightNode);
110
119
  const effectiveContainerWidth = Math.max(0, containerWidth - (hasLeft ? tokens.spacing.sidePadding : 0) - (hasRight ? tokens.spacing.sidePadding : 0));
111
- const shouldScroll = !isVertical && !wrapable && (scrollable ?? contentWidth > effectiveContainerWidth);
120
+ const shouldScroll = !reducedMotion && !isVertical && !wrapable && (scrollable ?? contentWidth > effectiveContainerWidth);
112
121
  useEffect(() => {
113
- if (!visible) {
114
- translateX.stopAnimation();
115
- return;
116
- }
117
- if (isVertical) {
122
+ if (!visible || isVertical) {
118
123
  translateX.stopAnimation();
119
124
  return;
120
125
  }
121
- if (!shouldScroll || contentWidth === 0 || containerWidth === 0) {
122
- translateX.setValue(0);
123
- return;
124
- }
125
- if (resolvedSpeed <= 0 || !Number.isFinite(resolvedSpeed)) {
126
+ if (!shouldScroll || contentWidth === 0 || containerWidth === 0 || resolvedSpeed <= 0 || !Number.isFinite(resolvedSpeed)) {
126
127
  translateX.setValue(0);
127
128
  return;
128
129
  }
129
130
  let cancelled = false;
130
131
  const duration = (contentWidth + containerWidth) / resolvedSpeed * 1000;
132
+ const rtlSign = layoutDir === 'rtl' ? -1 : 1;
131
133
  const run = initial => {
132
- translateX.setValue(initial ? 0 : containerWidth);
134
+ translateX.setValue(initial ? 0 : rtlSign * containerWidth);
133
135
  Animated.sequence([Animated.delay(resolvedDelay * 1000), Animated.timing(translateX, {
134
- toValue: -contentWidth,
136
+ toValue: -rtlSign * contentWidth,
135
137
  duration,
136
138
  easing: Easing.linear,
137
- useNativeDriver: nativeDriverEnabled
139
+ useNativeDriver: nativeDriverEnabled,
140
+ isInteraction: false
138
141
  })]).start(({
139
142
  finished
140
143
  }) => {
141
144
  if (finished && !cancelled) {
142
- onReplay?.();
145
+ onReplayRef.current?.();
143
146
  run(false);
144
147
  }
145
148
  });
@@ -149,7 +152,7 @@ export const NoticeBar = props => {
149
152
  cancelled = true;
150
153
  translateX.stopAnimation();
151
154
  };
152
- }, [shouldScroll, translateX, visible, resolvedDelay, resolvedSpeed, contentWidth, containerWidth, onReplay, isVertical]);
155
+ }, [shouldScroll, translateX, visible, resolvedDelay, resolvedSpeed, contentWidth, containerWidth, isVertical, layoutDir]);
153
156
  useEffect(() => {
154
157
  if (!visible) {
155
158
  verticalTranslateY.stopAnimation();
@@ -165,13 +168,15 @@ export const NoticeBar = props => {
165
168
  toValue: -itemHeight * i,
166
169
  duration: resolvedVerticalDuration,
167
170
  easing: Easing.linear,
168
- useNativeDriver: nativeDriverEnabled
171
+ useNativeDriver: nativeDriverEnabled,
172
+ isInteraction: false
169
173
  }));
170
174
  }
171
175
  steps.push(Animated.timing(verticalTranslateY, {
172
176
  toValue: 0,
173
177
  duration: 0,
174
- useNativeDriver: nativeDriverEnabled
178
+ useNativeDriver: nativeDriverEnabled,
179
+ isInteraction: false
175
180
  }));
176
181
  const loopAnimation = Animated.loop(Animated.sequence(steps));
177
182
  loopAnimation.start();
@@ -187,28 +192,23 @@ export const NoticeBar = props => {
187
192
  }, []);
188
193
  const verticalContentNode = useMemo(() => {
189
194
  if (!isVertical || verticalTrackItems.length === 0) return null;
190
- if (!hasVerticalLoop) {
191
- const single = verticalTrackItems[0];
192
- if (isText(single)) {
193
- return /*#__PURE__*/React.createElement(Text, _extends({
194
- onLayout: textOnLayout,
195
- style: [styles.text, {
196
- color: resolvedColor,
197
- fontSize: tokens.typography.fontSize
198
- }],
199
- numberOfLines: 1,
200
- ellipsizeMode: "tail"
201
- }, restTextProps), single);
202
- }
203
- return single;
204
- }
195
+ if (!hasVerticalLoop) return renderTextOrNode(verticalTrackItems[0], [S.text, {
196
+ color: resolvedColor,
197
+ fontFamily: tokens.typography.fontFamily,
198
+ fontSize: tokens.typography.fontSize
199
+ }], {
200
+ numberOfLines: 1,
201
+ ...restTextProps
202
+ });
205
203
  return /*#__PURE__*/React.createElement(View, {
206
- style: [styles.verticalViewport, itemHeight ? {
204
+ style: [S.vViewport, itemHeight ? {
207
205
  height: itemHeight
208
206
  } : undefined],
209
207
  pointerEvents: "none"
210
208
  }, /*#__PURE__*/React.createElement(Animated.View, {
211
- style: [styles.verticalTrack, {
209
+ renderToHardwareTextureAndroid: true,
210
+ shouldRasterizeIOS: true,
211
+ style: [S.vTrack, {
212
212
  transform: [{
213
213
  translateY: verticalTranslateY
214
214
  }]
@@ -216,17 +216,16 @@ export const NoticeBar = props => {
216
216
  }, verticalTrackItems.map((item, index) => /*#__PURE__*/React.createElement(View, {
217
217
  key: index,
218
218
  onLayout: index === 0 ? handleItemLayout : undefined,
219
- style: styles.verticalItem
220
- }, isText(item) ? /*#__PURE__*/React.createElement(Text, _extends({
221
- onLayout: textOnLayout,
222
- style: [styles.text, {
223
- color: resolvedColor,
224
- fontSize: tokens.typography.fontSize
225
- }],
219
+ style: S.vItem
220
+ }, renderTextOrNode(item, [S.text, {
221
+ color: resolvedColor,
222
+ fontFamily: tokens.typography.fontFamily,
223
+ fontSize: tokens.typography.fontSize
224
+ }], {
226
225
  numberOfLines: 1,
227
- ellipsizeMode: "tail"
228
- }, restTextProps), item) : item))));
229
- }, [handleItemLayout, hasVerticalLoop, isVertical, itemHeight, resolvedColor, restTextProps, textOnLayout, tokens.typography.fontSize, verticalTrackItems, verticalTranslateY]);
226
+ ...restTextProps
227
+ })))));
228
+ }, [handleItemLayout, hasVerticalLoop, isVertical, itemHeight, resolvedColor, restTextProps, textOnLayout, tokens.typography.fontFamily, tokens.typography.fontSize, verticalTrackItems, verticalTranslateY]);
230
229
  const handleContainerLayout = useCallback(event => {
231
230
  setContainerWidthSafe(event.nativeEvent.layout.width);
232
231
  }, [setContainerWidthSafe]);
@@ -235,11 +234,9 @@ export const NoticeBar = props => {
235
234
  textOnLayout?.(event);
236
235
  }, [setContentWidthSafe, textOnLayout]);
237
236
  const handleNodeLayout = useCallback(event => setContentWidthSafe(event.nativeEvent.layout.width), [setContentWidthSafe]);
238
- if (!visible) {
239
- return null;
240
- }
237
+ if (!visible) return null;
241
238
  return /*#__PURE__*/React.createElement(Pressable, _extends({
242
- style: [styles.container, {
239
+ style: [S.ctr, {
243
240
  backgroundColor: resolvedBackground,
244
241
  paddingHorizontal: tokens.spacing.paddingHorizontal,
245
242
  paddingVertical: wrapable ? tokens.spacing.wrapPaddingVertical : tokens.spacing.paddingVertical,
@@ -247,13 +244,13 @@ export const NoticeBar = props => {
247
244
  borderRadius: tokens.layout.radius
248
245
  }, style],
249
246
  disabled: barPress.states.disabled
250
- }, barPress.interactionProps, rest), hasLeft ? /*#__PURE__*/React.createElement(View, {
251
- style: [styles.sideSection, {
247
+ }, barPress.interactionProps, rest), hasLeft && /*#__PURE__*/React.createElement(View, {
248
+ style: [S.side, {
252
249
  minWidth: tokens.layout.sideMinWidth
253
250
  }]
254
- }, leftIcon) : null, /*#__PURE__*/React.createElement(View, {
251
+ }, leftIcon), /*#__PURE__*/React.createElement(View, {
255
252
  onLayout: handleContainerLayout,
256
- style: [styles.content, wrapable && styles.contentWrap, hasLeft && {
253
+ style: [S.content, wrapable && S.contentWrap, hasLeft && {
257
254
  paddingLeft: tokens.spacing.sidePadding
258
255
  }, hasRight && {
259
256
  paddingRight: tokens.spacing.sidePadding
@@ -261,8 +258,9 @@ export const NoticeBar = props => {
261
258
  pointerEvents: "none"
262
259
  }, isVertical ? verticalContentNode : shouldScroll ? isTextContent ? /*#__PURE__*/React.createElement(AnimatedText, _extends({
263
260
  onLayout: handleTextLayout,
264
- style: [styles.text, styles.scrollText, {
261
+ style: [S.text, S.scrollText, {
265
262
  color: resolvedColor,
263
+ fontFamily: tokens.typography.fontFamily,
266
264
  fontSize: tokens.typography.fontSize,
267
265
  transform: [{
268
266
  translateX
@@ -273,34 +271,37 @@ export const NoticeBar = props => {
273
271
  ellipsizeMode: 'clip'
274
272
  }, restTextProps), content) : /*#__PURE__*/React.createElement(Animated.View, {
275
273
  onLayout: handleNodeLayout,
276
- style: [styles.text, {
274
+ renderToHardwareTextureAndroid: true,
275
+ shouldRasterizeIOS: true,
276
+ style: [S.text, {
277
277
  transform: [{
278
278
  translateX
279
279
  }]
280
280
  }]
281
281
  }, content) : isTextContent ? /*#__PURE__*/React.createElement(Text, _extends({
282
282
  onLayout: handleTextLayout,
283
- style: [styles.text, {
283
+ style: [S.text, {
284
284
  color: resolvedColor,
285
+ fontFamily: tokens.typography.fontFamily,
285
286
  fontSize: tokens.typography.fontSize
286
- }, wrapable && styles.wrapText],
287
+ }, wrapable && S.wrapText],
287
288
  numberOfLines: wrapable ? undefined : 1,
288
289
  ellipsizeMode: wrapable ? 'tail' : 'clip'
289
290
  }, restTextProps), content) : /*#__PURE__*/React.createElement(View, {
290
291
  onLayout: handleNodeLayout,
291
- style: [styles.text, wrapable && styles.wrapText]
292
- }, content)), rightNode ? /*#__PURE__*/React.createElement(View, {
293
- style: [styles.sideSection, {
292
+ style: [S.text, wrapable && S.wrapText]
293
+ }, content)), rightNode && /*#__PURE__*/React.createElement(View, {
294
+ style: [S.side, {
294
295
  minWidth: tokens.layout.sideMinWidth
295
296
  }]
296
- }, rightNode) : null);
297
+ }, rightNode));
297
298
  };
298
- const styles = StyleSheet.create({
299
- container: {
299
+ const S = StyleSheet.create({
300
+ ctr: {
300
301
  flexDirection: 'row',
301
302
  alignItems: 'center'
302
303
  },
303
- sideSection: {
304
+ side: {
304
305
  alignItems: 'center',
305
306
  justifyContent: 'center'
306
307
  },
@@ -326,17 +327,18 @@ const styles = StyleSheet.create({
326
327
  contentWrap: {
327
328
  flexDirection: 'column'
328
329
  },
329
- verticalViewport: {
330
+ vViewport: {
330
331
  width: '100%',
331
332
  overflow: 'hidden'
332
333
  },
333
- verticalTrack: {
334
+ vTrack: {
334
335
  flexDirection: 'column',
335
336
  width: '100%'
336
337
  },
337
- verticalItem: {
338
+ vItem: {
338
339
  width: '100%',
339
340
  justifyContent: 'center'
340
341
  }
341
342
  });
343
+ export const NoticeBar = /*#__PURE__*/React.memo(NoticeBarImpl);
342
344
  NoticeBar.displayName = 'NoticeBar';
@@ -4,7 +4,8 @@ export const createNoticeBarTokens = foundations => {
4
4
  palette,
5
5
  fontSize,
6
6
  spacing,
7
- radii
7
+ radii,
8
+ typography
8
9
  } = foundations;
9
10
  return {
10
11
  colors: {
@@ -12,6 +13,7 @@ export const createNoticeBarTokens = foundations => {
12
13
  background: palette.warning[50]
13
14
  },
14
15
  typography: {
16
+ fontFamily: typography.fontFamily,
15
17
  fontSize: fontSize.sm
16
18
  },
17
19
  layout: {
@@ -1,13 +1,14 @@
1
1
  function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
2
- import React, { useCallback, useMemo } from 'react';
3
- import { Animated, Easing, Platform, Pressable, Text, View } from 'react-native';
4
- import { isFunction, isText } from '../../utils';
5
- import { useAriaPress, useSafeAreaPadding } from '../../hooks';
2
+ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
3
+ import { Animated, Easing, Platform, Pressable, View } from 'react-native';
4
+ import { isFunction, isText, renderTextOrNode } from '../../utils';
5
+ import { isRenderable } from '../../utils/validate';
6
+ import { useAriaPress, useSafeAreaPadding, useOverlayStack } from '../../hooks';
6
7
  import Portal from '../portal/Portal';
7
- import { useOverlayStack } from '../../hooks';
8
8
  import { nativeDriverEnabled } from '../../platform';
9
+ import { useReducedMotion } from '../../hooks/animation';
9
10
  import { useNotifyTokens } from './tokens';
10
- export const NotifyContent = props => {
11
+ const NotifyContentImpl = props => {
11
12
  const {
12
13
  visible,
13
14
  message,
@@ -29,7 +30,7 @@ export const NotifyContent = props => {
29
30
  onClosed
30
31
  } = props;
31
32
  const tokens = useNotifyTokens(tokensOverride);
32
- const paddingVertical = tokens.spacing.paddingVertical;
33
+ const reducedMotion = useReducedMotion();
33
34
  const safeAreaPadding = useSafeAreaPadding({
34
35
  top: 0,
35
36
  bottom: 0
@@ -39,30 +40,38 @@ export const NotifyContent = props => {
39
40
  const closeOnClick = closeOnClickProp ?? tokens.defaults.closeOnClick;
40
41
  const safeAreaInsetTop = props.safeAreaInsetTop ?? (position === 'top' ? tokens.defaults.safeAreaInsetTop : false);
41
42
  const safeAreaInsetBottom = props.safeAreaInsetBottom ?? (position === 'bottom' ? tokens.defaults.safeAreaInsetBottom : false);
42
- const safeTop = safeAreaInsetTop && position === 'top' ? safeAreaPadding.paddingTop : 0;
43
- const safeBottom = safeAreaInsetBottom && position === 'bottom' ? safeAreaPadding.paddingBottom : 0;
43
+ const safeAreaTopValue = safeAreaInsetTop && position === 'top' ? safeAreaPadding.paddingTop : 0;
44
+ const safeAreaBottomValue = safeAreaInsetBottom && position === 'bottom' ? safeAreaPadding.paddingBottom : 0;
44
45
  const offset = typeof offsetProp === 'number' && Number.isFinite(offsetProp) ? Math.max(0, offsetProp) : 0;
45
46
  const addOffset = (value, delta) => typeof value === 'string' ? `calc(${value} + ${delta}px)` : value + delta;
46
- const safeBottomInset = safeAreaInsetBottom && position === 'bottom' && typeof safeBottom === 'number' ? safeBottom + offset : offset;
47
- const webTopPadding = Platform.OS === 'web' && position === 'top' ? addOffset(safeTop, offset) : undefined;
48
- const webBottomPadding = Platform.OS === 'web' && safeAreaInsetBottom && position === 'bottom' ? addOffset(safeBottom, offset) : undefined;
47
+ const safeAreaBottomInset = safeAreaInsetBottom && position === 'bottom' && typeof safeAreaBottomValue === 'number' ? safeAreaBottomValue + offset : offset;
48
+ const webTopPadding = Platform.OS === 'web' && position === 'top' ? addOffset(safeAreaTopValue, offset) : undefined;
49
+ const webBottomPadding = Platform.OS === 'web' && safeAreaInsetBottom && position === 'bottom' ? addOffset(safeAreaBottomValue, offset) : undefined;
49
50
  const variant = tokens.colors.variants[type];
50
51
  const resolvedBackground = background ?? variant.background;
51
52
  const resolvedTextColor = color ?? variant.text;
52
53
  const resolvedDuration = durationProp ?? tokens.defaults.duration;
53
- const [barHeight, setBarHeight] = React.useState(0);
54
- const handleLayout = useCallback(event => {
55
- const height = event.nativeEvent.layout.height;
54
+ const onCloseRef = useRef(onClose);
55
+ onCloseRef.current = onClose;
56
+ const onOpenRef = useRef(onOpen);
57
+ onOpenRef.current = onOpen;
58
+ const onOpenedRef = useRef(onOpened);
59
+ onOpenedRef.current = onOpened;
60
+ const onClosedRef = useRef(onClosed);
61
+ onClosedRef.current = onClosed;
62
+ const onClickRef = useRef(onClick);
63
+ onClickRef.current = onClick;
64
+ const [barHeight, setBarHeight] = useState(0);
65
+ const handleLayout = useCallback(e => {
66
+ const height = e.nativeEvent.layout.height;
56
67
  if (!height) return;
57
68
  setBarHeight(prev => prev === height ? prev : height);
58
69
  }, []);
59
-
60
- // 关键:静态调用时 Notify 初次挂载的 visible=true,需要执行进入动画
61
70
  const canAnimate = barHeight > 0;
62
- const [mounted, setMounted] = React.useState(visible);
63
- const animated = React.useRef(new Animated.Value(0)).current;
64
- const animationRef = React.useRef(null);
65
- const animationIdRef = React.useRef(0);
71
+ const [mounted, setMounted] = useState(visible);
72
+ const animatedValue = useRef(new Animated.Value(0)).current;
73
+ const animationRef = useRef(null);
74
+ const animationIdRef = useRef(0);
66
75
  const {
67
76
  zIndex: stackZIndex
68
77
  } = useOverlayStack({
@@ -71,22 +80,22 @@ export const NotifyContent = props => {
71
80
  zIndex
72
81
  });
73
82
  const resolvedZIndex = stackZIndex ?? zIndex;
74
- const prevVisibleRef = React.useRef(visible);
75
- const closingRef = React.useRef(false);
76
- React.useEffect(() => {
83
+ const previousVisibleRef = useRef(visible);
84
+ const closingRef = useRef(false);
85
+ useEffect(() => {
77
86
  animationIdRef.current += 1;
78
87
  const animationId = animationIdRef.current;
79
88
  animationRef.current?.stop();
80
- const durationValue = tokens.defaults.animationDuration;
89
+ const d = reducedMotion ? 0 : tokens.defaults.animationDuration;
81
90
  if (visible) {
82
91
  setMounted(true);
83
92
  if (!canAnimate) {
84
- animated.setValue(0);
93
+ animatedValue.setValue(0);
85
94
  return;
86
95
  }
87
- animationRef.current = Animated.timing(animated, {
96
+ animationRef.current = Animated.timing(animatedValue, {
88
97
  toValue: 1,
89
- duration: durationValue,
98
+ duration: d,
90
99
  easing: Easing.out(Easing.cubic),
91
100
  useNativeDriver: nativeDriverEnabled,
92
101
  isInteraction: false
@@ -94,13 +103,13 @@ export const NotifyContent = props => {
94
103
  animationRef.current.start();
95
104
  } else {
96
105
  if (!canAnimate) {
97
- animated.setValue(0);
106
+ animatedValue.setValue(0);
98
107
  setMounted(false);
99
108
  return;
100
109
  }
101
- animationRef.current = Animated.timing(animated, {
110
+ animationRef.current = Animated.timing(animatedValue, {
102
111
  toValue: 0,
103
- duration: durationValue,
112
+ duration: d,
104
113
  easing: Easing.out(Easing.cubic),
105
114
  useNativeDriver: nativeDriverEnabled,
106
115
  isInteraction: false
@@ -112,51 +121,47 @@ export const NotifyContent = props => {
112
121
  setMounted(false);
113
122
  });
114
123
  }
115
- }, [animated, canAnimate, tokens.defaults.animationDuration, visible]);
116
- React.useEffect(() => () => {
124
+ }, [animatedValue, canAnimate, reducedMotion, tokens.defaults.animationDuration, visible]);
125
+ useEffect(() => () => {
117
126
  animationRef.current?.stop();
118
127
  }, []);
119
- React.useEffect(() => {
120
- let openedTimer = null;
128
+ const resolvedAnimDuration = reducedMotion ? 0 : tokens.defaults.animationDuration;
129
+ useEffect(() => {
121
130
  if (visible) {
122
131
  closingRef.current = false;
123
- if (!prevVisibleRef.current) {
124
- onOpen?.();
125
- if (onOpened) openedTimer = setTimeout(onOpened, tokens.defaults.animationDuration);
132
+ if (!previousVisibleRef.current) {
133
+ onOpenRef.current?.();
134
+ if (onOpenedRef.current) {
135
+ const cb = onOpenedRef.current;
136
+ const t = setTimeout(cb, resolvedAnimDuration);
137
+ previousVisibleRef.current = visible;
138
+ return () => clearTimeout(t);
139
+ }
126
140
  }
127
- } else if (prevVisibleRef.current) {
128
- closingRef.current = true;
129
- }
130
- prevVisibleRef.current = visible;
131
- return () => {
132
- if (openedTimer) clearTimeout(openedTimer);
133
- };
134
- }, [onOpen, onOpened, tokens.defaults.animationDuration, visible]);
135
- React.useEffect(() => {
141
+ } else if (previousVisibleRef.current) closingRef.current = true;
142
+ previousVisibleRef.current = visible;
143
+ }, [resolvedAnimDuration, visible]);
144
+ useEffect(() => {
136
145
  if (!mounted && closingRef.current) {
137
146
  closingRef.current = false;
138
- onClosed?.();
139
- }
140
- }, [mounted, onClosed]);
141
- React.useEffect(() => {
142
- let timer = null;
143
- if (visible && resolvedDuration > 0) {
144
- timer = setTimeout(() => {
145
- onClose?.();
146
- }, resolvedDuration);
147
+ onClosedRef.current?.();
147
148
  }
148
- return () => {
149
- if (timer) clearTimeout(timer);
150
- };
151
- }, [onClose, resolvedDuration, visible]);
149
+ }, [mounted]);
150
+ useEffect(() => {
151
+ if (!visible || resolvedDuration <= 0) return;
152
+ const timeout = setTimeout(() => {
153
+ onCloseRef.current?.();
154
+ }, resolvedDuration);
155
+ return () => clearTimeout(timeout);
156
+ }, [resolvedDuration, visible]);
152
157
  const contentHeight = barHeight > 0 ? barHeight : tokens.sizing.minHeight;
153
158
  const interactive = closeOnClick || isFunction(onClick);
154
159
  const handlePress = useCallback(() => {
155
- onClick?.();
156
- if (closeOnClick) onClose?.();
157
- }, [closeOnClick, onClick, onClose]);
160
+ onClickRef.current?.();
161
+ if (closeOnClick) onCloseRef.current?.();
162
+ }, [closeOnClick]);
158
163
  const accessibilityRole = interactive ? 'button' : 'alert';
159
- const press = useAriaPress({
164
+ const pressProps = useAriaPress({
160
165
  disabled: !interactive,
161
166
  onPress: handlePress,
162
167
  extraProps: {
@@ -164,17 +169,17 @@ export const NotifyContent = props => {
164
169
  accessibilityLiveRegion: 'assertive'
165
170
  }
166
171
  });
167
- const translateY = useMemo(() => position === 'bottom' ? animated.interpolate({
172
+ const translateY = useMemo(() => position === 'bottom' ? animatedValue.interpolate({
168
173
  inputRange: [0, 1],
169
174
  outputRange: [contentHeight, 0]
170
- }) : animated.interpolate({
175
+ }) : animatedValue.interpolate({
171
176
  inputRange: [0, 1],
172
177
  outputRange: [-contentHeight, 0]
173
- }), [animated, contentHeight, position]);
174
- const hasMessage = message !== undefined && message !== null && message !== false && message !== '';
175
- const bar = useMemo(() => /*#__PURE__*/React.createElement(View, {
178
+ }), [animatedValue, contentHeight, position]);
179
+ const hasMessage = isRenderable(message) && (typeof message !== 'string' || message !== '');
180
+ const barRender = useMemo(() => /*#__PURE__*/React.createElement(View, {
176
181
  style: [tokens.layout.container, position === 'top' ? {
177
- paddingTop: webTopPadding ?? addOffset(safeTop, offset)
182
+ paddingTop: webTopPadding ?? addOffset(safeAreaTopValue, offset)
178
183
  } : null, webBottomPadding !== undefined ? {
179
184
  paddingBottom: webBottomPadding
180
185
  } : null]
@@ -187,9 +192,11 @@ export const NotifyContent = props => {
187
192
  testID: "rv-notify-bar",
188
193
  accessibilityRole: !interactive ? accessibilityRole : undefined,
189
194
  accessibilityLiveRegion: !interactive ? 'assertive' : undefined,
195
+ renderToHardwareTextureAndroid: true,
196
+ shouldRasterizeIOS: true,
190
197
  onLayout: handleLayout,
191
198
  style: [tokens.layout.container, {
192
- opacity: animated,
199
+ opacity: animatedValue,
193
200
  transform: [{
194
201
  translateY
195
202
  }]
@@ -201,20 +208,19 @@ export const NotifyContent = props => {
201
208
  }, /*#__PURE__*/React.createElement(View, {
202
209
  style: [tokens.layout.content, {
203
210
  paddingHorizontal: tokens.spacing.paddingHorizontal,
204
- paddingVertical,
211
+ paddingVertical: tokens.spacing.paddingVertical,
205
212
  minHeight: tokens.sizing.minHeight
206
213
  }]
207
- }, hasMessage ? isText(message) ? /*#__PURE__*/React.createElement(Text, {
208
- style: [tokens.layout.text, {
209
- color: resolvedTextColor,
210
- fontSize: tokens.typography.fontSize,
211
- lineHeight: tokens.typography.lineHeight
212
- }, textStyle]
213
- }, message) : message : null)))), position === 'bottom' ? /*#__PURE__*/React.createElement(View, {
214
+ }, hasMessage && (isText(message) ? renderTextOrNode(message, [tokens.layout.text, {
215
+ color: resolvedTextColor,
216
+ fontFamily: tokens.typography.fontFamily,
217
+ fontSize: tokens.typography.fontSize,
218
+ lineHeight: tokens.typography.lineHeight
219
+ }, textStyle]) : message))))), position === 'bottom' && /*#__PURE__*/React.createElement(View, {
214
220
  style: {
215
- height: safeBottomInset
221
+ height: safeAreaBottomInset
216
222
  }
217
- }) : null), [accessibilityRole, animated, contentHeight, handleLayout, hasMessage, interactive, message, offset, paddingVertical, position, resolvedBackground, resolvedTextColor, safeBottomInset, safeTop, style, textStyle, tokens.layout.container, tokens.layout.content, tokens.layout.text, tokens.sizing.minHeight, tokens.spacing.paddingHorizontal, tokens.typography.fontSize, tokens.typography.lineHeight, translateY, webBottomPadding, webTopPadding]);
223
+ })), [accessibilityRole, animatedValue, contentHeight, handleLayout, hasMessage, interactive, message, offset, resolvedBackground, resolvedTextColor, safeAreaBottomInset, safeAreaTopValue, style, textStyle, tokens.layout.container, tokens.layout.content, tokens.layout.text, tokens.sizing.minHeight, tokens.spacing.paddingHorizontal, tokens.spacing.paddingVertical, tokens.typography.fontFamily, tokens.typography.fontSize, tokens.typography.lineHeight, translateY, webBottomPadding, webTopPadding, position]);
218
224
  if (!mounted) return null;
219
225
  return /*#__PURE__*/React.createElement(View, {
220
226
  testID: "rv-notify",
@@ -223,14 +229,14 @@ export const NotifyContent = props => {
223
229
  bottom: 0
224
230
  } : {
225
231
  top: 0
226
- }, resolvedZIndex !== undefined && resolvedZIndex !== null ? {
232
+ }, resolvedZIndex != null ? {
227
233
  zIndex: resolvedZIndex
228
234
  } : null]
229
- }, interactive ? /*#__PURE__*/React.createElement(Pressable, _extends({}, press.interactionProps, {
235
+ }, interactive ? /*#__PURE__*/React.createElement(Pressable, _extends({}, pressProps.interactionProps, {
230
236
  disabled: !interactive
231
- }), bar) : bar);
237
+ }), barRender) : barRender);
232
238
  };
233
- export const Notify = props => /*#__PURE__*/React.createElement(Portal, null, /*#__PURE__*/React.createElement(NotifyContent, props));
234
- NotifyContent.displayName = 'NotifyContent';
235
- Notify.displayName = 'Notify';
239
+ export const NotifyContent = /*#__PURE__*/React.memo(NotifyContentImpl);
240
+ const NotifyImpl = props => /*#__PURE__*/React.createElement(Portal, null, /*#__PURE__*/React.createElement(NotifyContent, props));
241
+ export const Notify = /*#__PURE__*/React.memo(NotifyImpl);
236
242
  export default Notify;