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
package/README.md CHANGED
@@ -1,12 +1,13 @@
1
1
  # react-native-system-ui
2
2
 
3
- 面向 React Native 的设计系统级组件库。Tokens + ThemeProvider 主题体系,按需引入、体积可控;API 统一可组合,支持可访问性与多端一致。
3
+ 面向 React Native 的高性能设计系统组件库。基于 Design Tokens 驱动主题体系,50+ 组件全量覆盖移动端场景;原生 StyleSheet 零运行时开销,单组件均值 **3.4 KB gzip**;iOS / Android / Web 三端同构,API 一致、行为对齐。
4
4
 
5
- ## 特性
5
+ ## 核心优势
6
6
 
7
- - **设计系统**:Design Tokens + ThemeProvider,无 less、基于 StyleSheet,组件不耦合具体样式,利于主题定制与按需复用。
8
- - **体积可控**:支持 Tree Shaking 与按需引入,单组件体积可控;详见文档站「组件体积」。
9
- - **API 统一**:语义贴近主流移动端组件库,迁移成本低;文档与示例聚焦落地与扩展。
7
+ - **极致轻量**:全组件经过逐行精简——冗余 Hook 移除、StyleSheet 合并、计算内联、辅助函数提取;按需引入 + Tree Shaking,单组件平均 gzip 仅 **3.4 KB**,最小组件(SafeAreaView)仅 **0.6 KB**。
8
+ - **原生性能**:纯 StyleSheet 驱动,零 CSS-in-JS 运行时;动画基于原生 Animated / LayoutAnimation,无 JS 线程阻塞;列表类组件(Picker、Swiper、Tabs)基于 FlatList / ScrollView 原生滚动,确保 60fps 流畅交互。
9
+ - **三端同构**:iOS / Android / Web 统一 API 与交互行为;Swiper、Picker 等核心组件在 Web 端自动适配桌面鼠标拖拽与移动端触控,无需业务层额外处理。
10
+ - **设计系统**:Design Tokens + ThemeProvider 分层架构,组件自管 tokens;支持 light / dark / 品牌主题一键切换,样式定制不侵入组件实现。
10
11
 
11
12
  ## 快速开始
12
13
 
@@ -20,7 +21,7 @@ pnpm add react-native-system-icon
20
21
  # 同时保证项目已安装 react 和 react-native(>=18.2 / >=0.79)
21
22
  ```
22
23
 
23
- **优先使用 ConfigProvider** 包裹根节点,这样 Button、Toast、Popup、Dialog 等都能直接使用,无需再配弹层挂载点。
24
+ **优先使用 ConfigProvider** 包裹根节点,Button、Toast、Popup、Dialog 等即可直接使用,无需额外配置弹层挂载点。
24
25
 
25
26
  ```tsx
26
27
  import { ConfigProvider, Button, Toast } from 'react-native-system-ui'
@@ -105,40 +106,54 @@ export const AuroraBranding = () => (
105
106
 
106
107
  `themePresets.light` 等价于默认主题,`themePresets.dark` 提供深色配色,`themePresets.aurora` 演示品牌化圆角/字体,通过 `ThemeProvider` 配置。
107
108
 
108
- ## 架构总览
109
+ ## 架构
109
110
 
110
- | 层级 | 说明 |
111
+ | 层级 | 职责 |
111
112
  | --- | --- |
112
- | `src/design-system` | 仅承载基础设计变量(颜色、排版、间距、圆角等)与 `ThemeProvider`,只做公共部分。 |
113
- | `src/components/*` | 每个组件自带 `tokens.ts`/`useXXXTokens.ts` 等文件,负责自身的 token 推导与样式实现(Button 为首个示例)。 |
113
+ | `src/design-system` | 基础设计变量(颜色、排版、间距、圆角)与 ThemeProvider,仅承载公共部分 |
114
+ | `src/components/*` | 每个组件自带 `tokens.ts` / `useXXXTokens.ts`,自管 token 推导与样式,互不耦合 |
114
115
 
115
- > 这一层次化结构让“设计语言”与“交互实现”各司其职,可快速扩展到 40+ 组件而不失控。
116
+ > 分层架构使"设计语言"与"交互实现"各司其职,可平滑扩展至 50+ 组件而不失控。
116
117
 
117
- ## 已交付能力
118
+ ## 组件总览
118
119
 
119
- - **设计系统**:ConfigProvider、ThemeProvider、createTokens、themePresets(light/dark/aurora),组件自管 tokens。使用 Toast/Popup/Dialog 等弹层时推荐用 ConfigProvider 包裹根节点(内置 PortalHost)。
120
- - **基础与展示**:Button、Badge、Cell、Collapse、Divider、Empty、Flex、Grid、Space、Tag、Typography、Loading、NoticeBar、Popup、Portal、Progress、Slider、Toast、Dialog、Image、ImagePreview、Skeleton、WaterMark 等。
121
- - **表单与输入**:FormFieldInputPasswordInput、Checkbox、Radio、Switch、Stepper、Rate、Picker、DatetimePicker、Calendar、Search、NumberKeyboard、Area、Cascader、Selector 等。
122
- - **导航与反馈**:TabsNavBarTabbarActionSheetNotifyOverlayShareSheetSidebarSwiper 等。
123
- - **基础设施**:SafeAreaViewPortalHostOverlayProviderConfigProvider 的 locale(zhCN/enUS)。
124
- - **文档**:快速上手、架构设计、路线图及组件文档站(`docs/`)。
120
+ | 分类 | 组件 |
121
+ | --- | --- |
122
+ | **设计系统** | ConfigProviderThemeProvidercreateTokensthemePresets(light / dark / aurora) |
123
+ | **基础展示** | ButtonBadgeCellCollapseDividerEmptyFlexGridSpace、Tag、Typography、Loading、Avatar |
124
+ | **反馈交互** | ToastDialogActionSheetNotify、Overlay、Popup、Portal、NoticeBar、ShareSheet |
125
+ | **表单输入** | Form、Field、Input、PasswordInput、Checkbox、Radio、Switch、Stepper、Rate、Picker、DatetimePicker、Calendar、Search、NumberKeyboard、Area、Cascader、Selector |
126
+ | **导航布局** | Tabs、NavBar、Tabbar、Sidebar、Swiper(三端手势 + 桌面鼠标拖拽) |
127
+ | **数据展示** | Image、ImagePreview、Skeleton、Progress、Circle、Slider、CountDown、WaterMark |
128
+ | **基础设施** | SafeAreaView、PortalHost、OverlayProvider、locale(zhCN / enUS) |
125
129
 
126
- 详细组件列表与状态见 [指南 / 路线图](./docs/guide/roadmap.md)。
130
+ 详细组件列表与开发状态见 [路线图](./docs/guide/roadmap.md)。
127
131
 
128
132
  ## 组件体积
129
133
 
130
- 基于 `dist/es` 各组件目录 gzip 后相加(字节),非实际打包单 chunk 体积。当前体积较大的组件(Top 5):
131
-
132
- | 组件 | gzip 体积 |
133
- | --- | --- |
134
- | picker | ~10 KB |
135
- | swiper | ~10 KB |
136
- | tabs | ~9 KB |
137
- | dropdown-menu | ~6.5 KB |
138
- | form | ~6.3 KB |
139
-
140
- 完整列表与口径说明见文档站首页「组件体积」区域。
134
+ 按需引入后单组件均值约 **3.4 KB**(各组件目录 gzip 相加估算)。支持 Tree Shaking,实际打包体积以构建结果为准。
135
+
136
+ | 组件 | gzip | 组件 | gzip | 组件 | gzip |
137
+ | --- | ---: | --- | ---: | --- | ---: |
138
+ | picker | 8.4 KB | tabs | 7.7 KB | form | 6.6 KB |
139
+ | cascader | 5.8 KB | dialog | 5.6 KB | slider | 5.4 KB |
140
+ | field | 5.4 KB | calendar | 5.1 KB | popup | 5.0 KB |
141
+ | number-keyboard | 4.8 KB | checkbox | 4.8 KB | swiper | 4.7 KB |
142
+ | notify | 4.7 KB | button | 4.7 KB | toast | 4.6 KB |
143
+ | stepper | 4.5 KB | radio | 4.5 KB | image-preview | 4.3 KB |
144
+ | cell | 4.1 KB | grid | 3.9 KB | tabbar | 3.7 KB |
145
+ | notice-bar | 3.5 KB | collapse | 3.4 KB | password-input | 3.4 KB |
146
+ | action-sheet | 3.3 KB | portal | 3.3 KB | image | 3.2 KB |
147
+ | datetime-picker | 3.1 KB | sidebar | 3.0 KB | share-sheet | 2.7 KB |
148
+ | progress | 2.7 KB | selector | 2.7 KB | nav-bar | 2.6 KB |
149
+ | typography | 2.6 KB | circle | 2.4 KB | config-provider | 2.4 KB |
150
+ | badge | 2.3 KB | search | 2.3 KB | skeleton | 2.3 KB |
151
+ | water-mark | 2.2 KB | space | 2.1 KB | tag | 2.0 KB |
152
+ | flex | 1.9 KB | avatar | 1.7 KB | divider | 1.7 KB |
153
+ | empty | 1.6 KB | input | 1.5 KB | area | 1.5 KB |
154
+ | switch | 1.3 KB | loading | 1.2 KB | count-down | 1.2 KB |
155
+ | overlay | 1.0 KB | safe-area-view | 0.6 KB | | |
141
156
 
142
157
  ## 版本与反馈
143
158
 
144
- 当前为 v0.0.6,欢迎 issue / PR。
159
+ 当前为 v0.0.7,欢迎 issue / PR。
@@ -54,83 +54,74 @@ const ActionSheetHeader = /*#__PURE__*/_react().default.memo(({
54
54
  style: tokens.layout.header
55
55
  }, /*#__PURE__*/_react().default.createElement(_reactNative().View, {
56
56
  style: tokens.layout.titleContainer
57
- }, (0, _utils.isText)(title) ? /*#__PURE__*/_react().default.createElement(_reactNative().Text, {
58
- style: [tokens.layout.title, {
59
- color: colors.title,
60
- fontSize: typography.title
61
- }]
62
- }, title) : /*#__PURE__*/_react().default.createElement(_reactNative().View, {
57
+ }, (0, _utils.isText)(title) ? (0, _utils.renderTextOrNode)(title, [tokens.layout.title, {
58
+ color: colors.title,
59
+ fontSize: typography.title
60
+ }]) : /*#__PURE__*/_react().default.createElement(_reactNative().View, {
63
61
  style: tokens.layout.titleNode
64
- }, title)), closeable ? /*#__PURE__*/_react().default.createElement(_reactNative().Pressable, _extends({
62
+ }, title)), closeable && /*#__PURE__*/_react().default.createElement(_reactNative().Pressable, _extends({
65
63
  style: tokens.layout.closeButton,
66
64
  accessibilityRole: "button",
67
65
  hitSlop: 8
68
66
  }, closePress.interactionProps), /*#__PURE__*/_react().default.isValidElement(closeIcon) ? /*#__PURE__*/_react().default.cloneElement(closeIcon, {
69
67
  fill: colors.description,
70
68
  color: colors.description
71
- }) : closeIcon) : null);
69
+ }) : closeIcon));
72
70
  });
73
- ActionSheetHeader.displayName = 'ActionSheetHeader';
74
71
  const ActionSheetItem = /*#__PURE__*/_react().default.memo(({
75
72
  action,
76
73
  index,
77
74
  tokens,
78
75
  onActionPress
79
76
  }) => {
80
- const disabled = !!action.disabled;
81
- const loading = !!action.loading;
77
+ const {
78
+ disabled,
79
+ loading,
80
+ name,
81
+ subname,
82
+ icon
83
+ } = action;
82
84
  const {
83
85
  colors,
84
86
  spacing,
85
87
  typography
86
88
  } = tokens;
87
- const handlePress = (0, _react().useCallback)(() => onActionPress(action, index), [action, index, onActionPress]);
88
89
  const actionPress = (0, _hooks.useAriaPress)({
89
- disabled: disabled || loading,
90
- onPress: handlePress,
90
+ disabled: !!disabled || !!loading,
91
+ onPress: (0, _react().useCallback)(() => onActionPress(action, index), [action, index, onActionPress]),
91
92
  extraProps: {
92
- accessibilityRole: 'button',
93
+ accessibilityRole: 'menuitem',
94
+ accessibilityLabel: (0, _utils.isText)(name) ? String(name) : undefined,
93
95
  accessibilityState: {
94
- disabled,
95
- busy: loading
96
+ disabled: !!disabled,
97
+ busy: !!loading
96
98
  },
97
99
  testID: `rv-action-sheet-item-${index}`
98
100
  }
99
101
  });
100
- const color = action.color ?? colors.item;
101
- const name = action.name;
102
- const subname = action.subname;
103
- const hasIcon = !!action.icon;
104
- const hasName = (0, _utils.isRenderable)(name);
105
- const hasSubname = (0, _utils.isRenderable)(subname);
106
102
  return /*#__PURE__*/_react().default.createElement(_reactNative().Pressable, _extends({
107
103
  style: ({
108
104
  pressed
109
- }) => [tokens.layout.item, hasIcon && tokens.layout.itemWithIcon, {
105
+ }) => [tokens.layout.item, !!icon && tokens.layout.itemWithIcon, {
110
106
  paddingVertical: spacing.vertical,
111
107
  paddingHorizontal: spacing.horizontal,
112
- backgroundColor: pressed && !disabled && !loading ? colors.itemPressedBackground : colors.itemBackground
108
+ backgroundColor: pressed && !action.disabled && !action.loading ? colors.itemPressedBackground : colors.itemBackground
113
109
  }, action.style]
114
- }, actionPress.interactionProps), hasIcon && /*#__PURE__*/_react().default.createElement(_reactNative().View, {
110
+ }, actionPress.interactionProps), !!icon && /*#__PURE__*/_react().default.createElement(_reactNative().View, {
115
111
  style: tokens.layout.icon
116
- }, action.icon), loading ? /*#__PURE__*/_react().default.createElement(_loading.default, {
112
+ }, icon), loading ? /*#__PURE__*/_react().default.createElement(_loading.default, {
117
113
  size: 20
118
- }) : hasName ? /*#__PURE__*/_react().default.createElement(_reactNative().View, {
114
+ }) : (0, _utils.isRenderable)(name) ? /*#__PURE__*/_react().default.createElement(_reactNative().View, {
119
115
  style: tokens.layout.itemTextWrapper
120
- }, (0, _utils.isText)(name) ? /*#__PURE__*/_react().default.createElement(_reactNative().Text, {
121
- style: [tokens.layout.itemText, {
122
- color: disabled ? colors.disabled : color,
123
- fontSize: typography.item
124
- }]
125
- }, name) : name, hasSubname ? (0, _utils.isText)(subname) ? /*#__PURE__*/_react().default.createElement(_reactNative().Text, {
126
- style: [tokens.layout.subname, {
127
- color: colors.subitem
128
- }]
129
- }, subname) : /*#__PURE__*/_react().default.createElement(_reactNative().View, {
116
+ }, (0, _utils.renderTextOrNode)(name, [tokens.layout.itemText, {
117
+ color: action.disabled ? colors.disabled : action.color ?? colors.item,
118
+ fontSize: typography.item
119
+ }]), (0, _utils.isRenderable)(subname) && ((0, _utils.isText)(subname) ? (0, _utils.renderTextOrNode)(subname, [tokens.layout.subname, {
120
+ color: colors.subitem
121
+ }]) : /*#__PURE__*/_react().default.createElement(_reactNative().View, {
130
122
  style: tokens.layout.subnameNode
131
- }, subname) : null) : null);
123
+ }, subname))) : null);
132
124
  });
133
- ActionSheetItem.displayName = 'ActionSheetItem';
134
125
  const ActionSheetCancel = /*#__PURE__*/_react().default.memo(({
135
126
  cancelText,
136
127
  tokens,
@@ -159,15 +150,12 @@ const ActionSheetCancel = /*#__PURE__*/_react().default.memo(({
159
150
  paddingHorizontal: spacing.horizontal,
160
151
  backgroundColor: colors.cancelBackground
161
152
  }]
162
- }, cancelPress.interactionProps), (0, _utils.isText)(cancelText) ? /*#__PURE__*/_react().default.createElement(_reactNative().Text, {
163
- style: [tokens.layout.cancelText, {
164
- color: colors.cancel,
165
- fontSize: typography.item
166
- }]
167
- }, cancelText) : cancelText));
153
+ }, cancelPress.interactionProps), (0, _utils.renderTextOrNode)(cancelText, [tokens.layout.cancelText, {
154
+ color: colors.cancel,
155
+ fontSize: typography.item
156
+ }])));
168
157
  });
169
- ActionSheetCancel.displayName = 'ActionSheetCancel';
170
- const ActionSheet = props => {
158
+ const ActionSheetImpl = props => {
171
159
  const {
172
160
  tokensOverride,
173
161
  visible,
@@ -175,137 +163,135 @@ const ActionSheet = props => {
175
163
  description,
176
164
  cancelText,
177
165
  actions = [],
178
- closeOnClickAction: closeOnClickActionProp,
166
+ closeOnClickAction: closeOnActP,
179
167
  closeOnSelect,
180
- closeable: closeableProp,
168
+ closeable: closeableP,
181
169
  closeIcon = defaultCloseIcon,
182
170
  beforeClose,
183
171
  onSelect,
184
172
  onCancel,
185
173
  onClose,
186
174
  children,
187
- round: roundProp,
188
- safeAreaInsetBottom: safeAreaInsetBottomProp,
189
- overlay: overlayProp,
190
- lockScroll: lockScrollProp,
191
- style: popupStyle,
192
- ...popupProps
175
+ round: roundP,
176
+ safeAreaInsetBottom: safeP,
177
+ overlay: ovP,
178
+ lockScroll: lockP,
179
+ style: popStyle,
180
+ ...popProps
193
181
  } = props;
194
182
  const tokens = (0, _tokens.useActionSheetTokens)(tokensOverride);
195
- const closeable = closeableProp ?? tokens.defaults.closeable;
196
- const round = roundProp ?? tokens.defaults.round;
197
- const safeAreaInsetBottom = safeAreaInsetBottomProp ?? tokens.defaults.safeAreaInsetBottom;
198
- const overlay = overlayProp ?? tokens.defaults.overlay;
199
- const lockScroll = lockScrollProp ?? tokens.defaults.lockScroll;
200
- const shouldCloseOnClickAction = closeOnClickActionProp ?? closeOnSelect ?? tokens.defaults.closeOnClickAction;
201
- const hasTitle = (0, _utils.isRenderable)(title);
202
- const hasDescription = (0, _utils.isRenderable)(description);
203
- const hasCancelText = (0, _utils.isRenderable)(cancelText);
204
- const lastPopupCloseReasonRef = (0, _react().useRef)('close');
183
+ const closeable = closeableP ?? tokens.defaults.closeable;
184
+ const round = roundP ?? tokens.defaults.round;
185
+ const safeBottom = safeP ?? tokens.defaults.safeAreaInsetBottom;
186
+ const overlay = ovP ?? tokens.defaults.overlay;
187
+ const lockScroll = lockP ?? tokens.defaults.lockScroll;
188
+ const closeOnAct = closeOnActP ?? closeOnSelect ?? tokens.defaults.closeOnClickAction;
189
+ const hasT = (0, _utils.isRenderable)(title);
190
+ const hasD = (0, _utils.isRenderable)(description);
191
+ const hasC = (0, _utils.isRenderable)(cancelText);
192
+ const lastReasonRef = (0, _react().useRef)('close');
205
193
  const closingRef = (0, _react().useRef)(false);
206
- const runBeforeClose = (0, _react().useCallback)(async action => {
207
- if (!beforeClose) return true;
194
+ const beforeCloseRef = (0, _react().useRef)(beforeClose);
195
+ beforeCloseRef.current = beforeClose;
196
+ const onCloseRef = (0, _react().useRef)(onClose);
197
+ onCloseRef.current = onClose;
198
+ const onCancelRef = (0, _react().useRef)(onCancel);
199
+ onCancelRef.current = onCancel;
200
+ const onSelectRef = (0, _react().useRef)(onSelect);
201
+ onSelectRef.current = onSelect;
202
+ const runBefore = (0, _react().useCallback)(async action => {
203
+ if (!beforeCloseRef.current) return true;
208
204
  try {
209
- return (await beforeClose(action)) !== false;
210
- } catch (error) {
205
+ return (await beforeCloseRef.current(action)) !== false;
206
+ } catch {
211
207
  return true;
212
208
  }
213
- }, [beforeClose]);
209
+ }, []);
214
210
  const emitClose = (0, _react().useCallback)(reason => {
215
- if (onClose) {
216
- if (reason === 'cancel') {
217
- onCancel?.();
218
- }
219
- onClose();
211
+ if (onCloseRef.current) {
212
+ if (reason === 'cancel') onCancelRef.current?.();
213
+ onCloseRef.current();
220
214
  return;
221
215
  }
222
- onCancel?.();
223
- }, [onCancel, onClose]);
224
- const requestClose = (0, _react().useCallback)(async action => {
216
+ ;
217
+ onCancelRef.current?.();
218
+ }, []);
219
+ const reqClose = (0, _react().useCallback)(async action => {
225
220
  if (closingRef.current) return;
226
221
  closingRef.current = true;
227
222
  try {
228
- const allowed = await runBeforeClose(action);
229
- if (!allowed) return;
223
+ const ok = await runBefore(action);
224
+ if (!ok) return;
230
225
  emitClose(action);
231
226
  } finally {
232
227
  closingRef.current = false;
233
228
  }
234
- }, [emitClose, runBeforeClose]);
235
- const handlePopupBeforeClose = (0, _react().useCallback)(reason => {
236
- const action = reason === 'close-icon' ? 'close-icon' : reason === 'overlay' ? 'overlay' : 'close';
237
- lastPopupCloseReasonRef.current = action;
238
- return runBeforeClose(action);
239
- }, [runBeforeClose]);
240
- const handlePopupClose = (0, _react().useCallback)(() => {
241
- emitClose(lastPopupCloseReasonRef.current);
229
+ }, [emitClose, runBefore]);
230
+ const onPopupBefore = (0, _react().useCallback)(reason => {
231
+ lastReasonRef.current = reason;
232
+ return runBefore(reason);
233
+ }, [runBefore]);
234
+ const onPopupClose = (0, _react().useCallback)(() => {
235
+ emitClose(lastReasonRef.current);
242
236
  }, [emitClose]);
243
- const handleCancel = (0, _react().useCallback)(() => {
244
- void requestClose('cancel');
245
- }, [requestClose]);
246
- const handleCloseIcon = (0, _react().useCallback)(() => {
247
- void requestClose('close-icon');
248
- }, [requestClose]);
249
- const handleActionPress = (0, _react().useCallback)((action, index) => {
250
- if (action.disabled || action.loading) {
251
- return;
252
- }
237
+ const onActPress = (0, _react().useCallback)((action, index) => {
238
+ if (action.disabled || action.loading) return;
253
239
  action.onPress?.(action);
254
240
  action.callback?.(action);
255
- onSelect?.(action, index);
256
- if (shouldCloseOnClickAction) {
257
- void requestClose('action');
258
- }
259
- }, [onSelect, requestClose, shouldCloseOnClickAction]);
260
- const popupStyleMemo = (0, _react().useMemo)(() => [tokens.layout.popup, popupStyle], [popupStyle, tokens.layout.popup]);
261
- const panelStyle = (0, _react().useMemo)(() => [tokens.layout.panel, {
262
- backgroundColor: tokens.colors.background
263
- }], [tokens.colors.background, tokens.layout.panel]);
264
- const headerNode = (0, _react().useMemo)(() => hasTitle ? /*#__PURE__*/_react().default.createElement(ActionSheetHeader, {
241
+ onSelectRef.current?.(action, index);
242
+ if (closeOnAct) void reqClose('action');
243
+ }, [reqClose, closeOnAct]);
244
+ const popStyleMemo = (0, _react().useMemo)(() => [tokens.layout.popup, popStyle], [tokens.layout.popup, popStyle]);
245
+ return /*#__PURE__*/_react().default.createElement(_popup.default, _extends({
246
+ visible: visible,
247
+ placement: "bottom",
248
+ round: round,
249
+ safeAreaInsetTop: hasT && closeable,
250
+ safeAreaInsetBottom: safeBottom,
251
+ overlay: overlay,
252
+ lockScroll: lockScroll,
253
+ beforeClose: onPopupBefore,
254
+ onClose: onPopupClose,
255
+ style: popStyleMemo
256
+ }, popProps), /*#__PURE__*/_react().default.createElement(_reactNative().View, {
257
+ accessibilityRole: "menu",
258
+ style: [tokens.layout.panel, {
259
+ backgroundColor: tokens.colors.background
260
+ }]
261
+ }, hasT && /*#__PURE__*/_react().default.createElement(ActionSheetHeader, {
265
262
  title: title,
266
263
  closeable: closeable,
267
264
  closeIcon: closeIcon,
268
265
  tokens: tokens,
269
- onClose: handleCloseIcon
270
- }) : null, [closeIcon, closeable, handleCloseIcon, hasTitle, title, tokens]);
271
- const descriptionNode = (0, _react().useMemo)(() => hasDescription ? /*#__PURE__*/_react().default.createElement(_reactNative().View, {
272
- style: [tokens.layout.descriptionContainer, (0, _utils.createHairlineBorderBottom)(tokens.colors.border)]
273
- }, (0, _utils.isText)(description) ? /*#__PURE__*/_react().default.createElement(_reactNative().Text, {
274
- style: [tokens.layout.description, {
275
- color: tokens.colors.description,
276
- fontSize: tokens.typography.description
277
- }]
278
- }, description) : /*#__PURE__*/_react().default.createElement(_reactNative().View, {
266
+ onClose: () => void reqClose('close-icon')
267
+ }), hasD && /*#__PURE__*/_react().default.createElement(_reactNative().View, {
268
+ style: tokens.layout.descriptionContainer
269
+ }, (0, _utils.isText)(description) ? (0, _utils.renderTextOrNode)(description, [tokens.layout.description, {
270
+ color: tokens.colors.description,
271
+ fontSize: tokens.typography.description
272
+ }]) : /*#__PURE__*/_react().default.createElement(_reactNative().View, {
279
273
  style: tokens.layout.descriptionNode
280
- }, description)) : null, [description, hasDescription, tokens.colors.border, tokens.colors.description, tokens.layout.description, tokens.layout.descriptionContainer, tokens.layout.descriptionNode, tokens.typography.description]);
281
- const actionNodes = (0, _react().useMemo)(() => actions.map((action, index) => /*#__PURE__*/_react().default.createElement(ActionSheetItem, {
274
+ }, description), /*#__PURE__*/_react().default.createElement(_reactNative().View, {
275
+ style: (0, _utils.createHairlineView)({
276
+ position: 'bottom',
277
+ color: tokens.colors.border,
278
+ left: 0,
279
+ right: 0
280
+ })
281
+ })), /*#__PURE__*/_react().default.createElement(_reactNative().View, {
282
+ style: tokens.layout.actions
283
+ }, actions.map((action, index) => /*#__PURE__*/_react().default.createElement(ActionSheetItem, {
282
284
  key: action.key ?? index,
283
285
  action: action,
284
286
  index: index,
285
287
  tokens: tokens,
286
- onActionPress: handleActionPress
287
- })), [actions, handleActionPress, tokens]);
288
- const cancelNode = (0, _react().useMemo)(() => hasCancelText ? /*#__PURE__*/_react().default.createElement(ActionSheetCancel, {
288
+ onActionPress: onActPress
289
+ }))), children, hasC && /*#__PURE__*/_react().default.createElement(ActionSheetCancel, {
289
290
  cancelText: cancelText,
290
291
  tokens: tokens,
291
- onPress: handleCancel
292
- }) : null, [cancelText, handleCancel, hasCancelText, tokens]);
293
- return /*#__PURE__*/_react().default.createElement(_popup.default, _extends({
294
- visible: visible,
295
- placement: "bottom",
296
- round: round,
297
- safeAreaInsetTop: hasTitle && closeable,
298
- safeAreaInsetBottom: safeAreaInsetBottom,
299
- overlay: overlay,
300
- lockScroll: lockScroll,
301
- beforeClose: handlePopupBeforeClose,
302
- onClose: handlePopupClose,
303
- style: popupStyleMemo
304
- }, popupProps), /*#__PURE__*/_react().default.createElement(_reactNative().View, {
305
- style: panelStyle
306
- }, headerNode, descriptionNode, /*#__PURE__*/_react().default.createElement(_reactNative().View, {
307
- style: tokens.layout.actions
308
- }, actionNodes), children, cancelNode));
292
+ onPress: () => void reqClose('cancel')
293
+ })));
309
294
  };
295
+ const ActionSheet = /*#__PURE__*/_react().default.memo(ActionSheetImpl);
310
296
  ActionSheet.displayName = 'ActionSheet';
311
297
  var _default = exports.default = ActionSheet;
@@ -5,12 +5,17 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.useActionSheetTokens = exports.createActionSheetTokens = void 0;
7
7
  var _designSystem = require("../../design-system");
8
+ const centered = {
9
+ alignItems: 'center',
10
+ justifyContent: 'center'
11
+ };
8
12
  const createActionSheetTokens = foundations => {
9
13
  const {
10
14
  palette,
11
15
  spacing,
12
16
  fontSize
13
17
  } = foundations;
18
+ const white = '#ffffff';
14
19
  return {
15
20
  defaults: {
16
21
  closeOnClickAction: false,
@@ -33,31 +38,25 @@ const createActionSheetTokens = foundations => {
33
38
  header: {
34
39
  position: 'relative',
35
40
  flexDirection: 'row',
36
- alignItems: 'center',
37
- justifyContent: 'center',
41
+ ...centered,
38
42
  paddingHorizontal: 16
39
43
  },
40
44
  titleContainer: {
41
45
  flex: 1,
42
- alignItems: 'center',
43
- justifyContent: 'center'
46
+ ...centered
44
47
  },
45
48
  title: {
46
49
  fontWeight: '600',
47
50
  textAlign: 'center'
48
51
  },
49
- titleNode: {
50
- alignItems: 'center',
51
- justifyContent: 'center'
52
- },
52
+ titleNode: centered,
53
53
  closeButton: {
54
54
  position: 'absolute',
55
55
  top: 0,
56
56
  right: 0,
57
57
  width: 48,
58
58
  height: 48,
59
- alignItems: 'center',
60
- justifyContent: 'center'
59
+ ...centered
61
60
  },
62
61
  descriptionContainer: {
63
62
  paddingTop: 12,
@@ -68,26 +67,19 @@ const createActionSheetTokens = foundations => {
68
67
  textAlign: 'center',
69
68
  lineHeight: 20
70
69
  },
71
- descriptionNode: {
72
- alignItems: 'center',
73
- justifyContent: 'center'
74
- },
70
+ descriptionNode: centered,
75
71
  actions: {
76
72
  width: '100%'
77
73
  },
78
74
  item: {
79
- alignItems: 'center',
80
- justifyContent: 'center',
75
+ ...centered,
81
76
  width: '100%'
82
77
  },
83
78
  itemWithIcon: {
84
79
  flexDirection: 'row',
85
80
  justifyContent: 'center'
86
81
  },
87
- itemTextWrapper: {
88
- alignItems: 'center',
89
- justifyContent: 'center'
90
- },
82
+ itemTextWrapper: centered,
91
83
  itemText: {
92
84
  lineHeight: 24
93
85
  },
@@ -106,16 +98,13 @@ const createActionSheetTokens = foundations => {
106
98
  width: '100%',
107
99
  marginBottom: 0
108
100
  },
109
- cancel: {
110
- alignItems: 'center',
111
- justifyContent: 'center'
112
- },
101
+ cancel: centered,
113
102
  cancelText: {
114
103
  lineHeight: 24
115
104
  }
116
105
  },
117
106
  colors: {
118
- background: '#ffffff',
107
+ background: white,
119
108
  title: palette.default[900],
120
109
  description: palette.default[500],
121
110
  item: palette.default[900],
@@ -123,9 +112,9 @@ const createActionSheetTokens = foundations => {
123
112
  cancel: palette.default[900],
124
113
  disabled: palette.default[400],
125
114
  border: palette.default[200],
126
- itemBackground: '#ffffff',
115
+ itemBackground: white,
127
116
  itemPressedBackground: palette.default[100],
128
- cancelBackground: '#ffffff',
117
+ cancelBackground: white,
129
118
  cancelGapBackground: palette.default[100] ?? '#f1f2f5'
130
119
  },
131
120
  typography: {