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
@@ -2,6 +2,7 @@ import React, { useEffect, useMemo, useRef } from 'react';
2
2
  import { Animated, Platform, Text, View } from 'react-native';
3
3
  import Svg, { Circle as SvgCircle } from 'react-native-svg';
4
4
  import { isText, clamp, parseNumber, parsePercentage } from '../../utils';
5
+ import { useReducedMotion } from '../../hooks/animation';
5
6
  import { useCircleTokens } from './tokens';
6
7
  const SVG_ROTATION = {
7
8
  top: -90,
@@ -17,95 +18,95 @@ const WEB_ROTATION = {
17
18
  };
18
19
  const isTransparentColor = value => {
19
20
  const normalized = value.trim().toLowerCase();
20
- if (!normalized) return true;
21
- if (normalized === 'transparent') return true;
21
+ if (!normalized || normalized === 'transparent') return true;
22
22
  const rgbaMatch = normalized.match(/^rgba\(([^)]*)\)$/);
23
23
  if (rgbaMatch) {
24
- const parts = rgbaMatch[1].split(',').map(part => part.trim());
25
- const alpha = Number(parts[3]);
24
+ const alpha = Number(rgbaMatch[1].split(',')[3]?.trim());
26
25
  return Number.isFinite(alpha) && alpha === 0;
27
26
  }
28
27
  return false;
29
28
  };
30
29
  const AnimatedSvgCircle = Animated.createAnimatedComponent(SvgCircle);
31
- export const Circle = props => {
30
+ const CircleImpl = props => {
32
31
  const {
33
32
  tokensOverride,
34
- rate: rateProp,
33
+ rate: rateP,
35
34
  size,
36
35
  strokeWidth,
37
36
  color,
38
37
  layerColor,
39
- fill: fillProp,
40
- clockwise: clockwiseProp,
41
- startPosition: startPositionProp,
42
- lineCap: lineCapProp,
43
- animated: animatedProp,
38
+ fill: fillP,
39
+ clockwise: cwP,
40
+ startPosition: startP,
41
+ lineCap: capP,
42
+ animated: animP,
44
43
  animationDuration,
45
44
  style,
46
45
  textStyle,
47
46
  children
48
47
  } = props;
49
48
  const tokens = useCircleTokens(tokensOverride);
50
- const fill = fillProp ?? tokens.defaults.fill;
51
- const clockwise = clockwiseProp ?? tokens.defaults.clockwise;
52
- const startPosition = startPositionProp ?? tokens.defaults.startPosition;
53
- const lineCap = lineCapProp ?? tokens.defaults.lineCap;
54
- const animated = animatedProp ?? tokens.defaults.animated;
55
- const resolvedSize = Math.max(0, parseNumber(size, tokens.defaults.size));
56
- const resolvedStrokeWidth = Math.max(0, parseNumber(strokeWidth, tokens.defaults.strokeWidth));
57
- const rate = clamp(parsePercentage(rateProp ?? tokens.defaults.rate), 0, 100);
58
- const resolvedColor = color ?? tokens.colors.color;
59
- const resolvedLayerColor = layerColor ?? tokens.colors.layerColor;
49
+ const reducedMotion = useReducedMotion();
50
+ const fill = fillP ?? tokens.defaults.fill;
51
+ const clockwise = cwP ?? tokens.defaults.clockwise;
52
+ const startPosition = startP ?? tokens.defaults.startPosition;
53
+ const lineCap = capP ?? tokens.defaults.lineCap;
54
+ const animated = animP ?? tokens.defaults.animated;
55
+ const rSize = Math.max(0, parseNumber(size, tokens.defaults.size));
56
+ const rStroke = Math.max(0, parseNumber(strokeWidth, tokens.defaults.strokeWidth));
57
+ const rate = clamp(parsePercentage(rateP ?? tokens.defaults.rate), 0, 100);
58
+ const rColor = color ?? tokens.colors.color;
59
+ const rLayerColor = layerColor ?? tokens.colors.layerColor;
60
60
  const baseStyle = useMemo(() => [tokens.layout.root, {
61
- width: resolvedSize,
62
- height: resolvedSize
63
- }, style], [resolvedSize, style, tokens.layout.root]);
61
+ width: rSize,
62
+ height: rSize
63
+ }, style], [rSize, style, tokens.layout.root]);
64
64
  const contentStyle = useMemo(() => [tokens.layout.content, {
65
- width: resolvedSize,
66
- height: resolvedSize
67
- }], [resolvedSize, tokens.layout.content]);
65
+ width: rSize,
66
+ height: rSize
67
+ }], [rSize, tokens.layout.content]);
68
68
  const content = useMemo(() => {
69
69
  if (children == null || children === false) return null;
70
- const childArray = React.Children.toArray(children);
71
- if (childArray.every(isText)) {
72
- return /*#__PURE__*/React.createElement(Text, {
73
- style: [tokens.layout.text, {
74
- color: tokens.colors.text,
75
- fontSize: tokens.typography.fontSize,
76
- lineHeight: tokens.typography.lineHeight
77
- }, textStyle]
78
- }, childArray.map(String).join(''));
79
- }
70
+ const arr = React.Children.toArray(children);
71
+ if (arr.every(isText)) return /*#__PURE__*/React.createElement(Text, {
72
+ style: [tokens.layout.text, {
73
+ color: tokens.colors.text,
74
+ fontSize: tokens.typography.fontSize,
75
+ lineHeight: tokens.typography.lineHeight
76
+ }, textStyle]
77
+ }, arr.map(String).join(''));
80
78
  return children;
81
79
  }, [children, textStyle, tokens.colors.text, tokens.layout.text, tokens.typography.fontSize, tokens.typography.lineHeight]);
82
80
  if (Platform.OS === 'web') {
83
- const safeStroke = Math.min(resolvedStrokeWidth, resolvedSize / 2);
84
- const innerSize = Math.max(0, resolvedSize - safeStroke * 2);
81
+ const safeStroke = Math.min(rStroke, rSize / 2);
82
+ const innerSize = Math.max(0, rSize - safeStroke * 2);
85
83
  const progressAngle = rate / 100 * 360;
86
84
  const rotation = WEB_ROTATION[startPosition];
87
- const shouldRenderInner = innerSize > 0 && !isTransparentColor(fill);
88
- const gradient = clockwise ? `conic-gradient(from ${rotation}deg, ${resolvedColor} 0deg ${progressAngle}deg, ${resolvedLayerColor} ${progressAngle}deg 360deg)` : `conic-gradient(from ${rotation}deg, ${resolvedLayerColor} 0deg ${360 - progressAngle}deg, ${resolvedColor} ${360 - progressAngle}deg 360deg)`;
85
+ const showInner = innerSize > 0 && !isTransparentColor(fill);
86
+ const gradient = clockwise ? `conic-gradient(from ${rotation}deg, ${rColor} 0deg ${progressAngle}deg, ${rLayerColor} ${progressAngle}deg 360deg)` : `conic-gradient(from ${rotation}deg, ${rLayerColor} 0deg ${360 - progressAngle}deg, ${rColor} ${360 - progressAngle}deg 360deg)`;
89
87
  const webRingStyle = {
90
- width: resolvedSize,
91
- height: resolvedSize,
92
- borderRadius: resolvedSize / 2,
88
+ width: rSize,
89
+ height: rSize,
90
+ borderRadius: rSize / 2,
93
91
  backgroundImage: gradient
94
92
  };
95
93
  if (safeStroke > 0) {
96
94
  const mask = `radial-gradient(farthest-side, transparent calc(100% - ${safeStroke}px), #000 calc(100% - ${safeStroke}px))`;
97
- webRingStyle.WebkitMaskImage = mask;
98
- webRingStyle.maskImage = mask;
99
- webRingStyle.WebkitMaskRepeat = 'no-repeat';
100
- webRingStyle.maskRepeat = 'no-repeat';
101
- webRingStyle.WebkitMaskSize = '100% 100%';
102
- webRingStyle.maskSize = '100% 100%';
95
+ Object.assign(webRingStyle, {
96
+ WebkitMaskImage: mask,
97
+ maskImage: mask,
98
+ WebkitMaskRepeat: 'no-repeat',
99
+ maskRepeat: 'no-repeat',
100
+ WebkitMaskSize: '100% 100%',
101
+ maskSize: '100% 100%'
102
+ });
103
103
  }
104
+ ;
104
105
  return /*#__PURE__*/React.createElement(View, {
105
106
  style: baseStyle
106
107
  }, /*#__PURE__*/React.createElement(View, {
107
108
  style: [tokens.layout.webRing, webRingStyle]
108
- }), shouldRenderInner ? /*#__PURE__*/React.createElement(View, {
109
+ }), showInner ? /*#__PURE__*/React.createElement(View, {
109
110
  style: [tokens.layout.webInner, {
110
111
  width: innerSize,
111
112
  height: innerSize,
@@ -117,46 +118,53 @@ export const Circle = props => {
117
118
  }) : null, /*#__PURE__*/React.createElement(View, {
118
119
  pointerEvents: "box-none",
119
120
  style: contentStyle
120
- }, content));
121
+ }, isText(content) ? /*#__PURE__*/React.createElement(Text, {
122
+ style: [tokens.layout.text, {
123
+ color: tokens.colors.text,
124
+ fontSize: tokens.typography.fontSize
125
+ }, textStyle]
126
+ }, content) : content));
121
127
  }
122
- const radius = Math.max(0, (resolvedSize - resolvedStrokeWidth) / 2);
128
+ const radius = Math.max(0, (rSize - rStroke) / 2);
123
129
  const circumference = 2 * Math.PI * radius;
124
130
  const rotation = SVG_ROTATION[startPosition];
125
- const safeDuration = Math.max(0, animationDuration ?? tokens.defaults.animationDuration);
126
- const dashOffsetTarget = (clockwise ? 1 : -1) * circumference * (1 - rate / 100);
127
- const dashOffset = useRef(new Animated.Value(dashOffsetTarget)).current;
131
+ const safeDur = Math.max(0, animationDuration ?? tokens.defaults.animationDuration);
132
+ const dashTarget = (clockwise ? 1 : -1) * circumference * (1 - rate / 100);
133
+ const dashOffset = useRef(new Animated.Value(dashTarget)).current;
128
134
  useEffect(() => {
129
- if (!animated || safeDuration <= 0) {
130
- dashOffset.setValue(dashOffsetTarget);
135
+ if (!animated || safeDur <= 0 || reducedMotion) {
136
+ dashOffset.setValue(dashTarget);
131
137
  return;
132
138
  }
133
- const animation = Animated.timing(dashOffset, {
134
- toValue: dashOffsetTarget,
135
- duration: safeDuration,
136
- useNativeDriver: false
139
+ ;
140
+ const anim = Animated.timing(dashOffset, {
141
+ toValue: dashTarget,
142
+ duration: safeDur,
143
+ useNativeDriver: false,
144
+ isInteraction: false
137
145
  });
138
- animation.start();
139
- return () => animation.stop();
140
- }, [animated, dashOffset, dashOffsetTarget, safeDuration]);
141
- const center = resolvedSize / 2;
146
+ anim.start();
147
+ return () => anim.stop();
148
+ }, [animated, dashOffset, dashTarget, reducedMotion, safeDur]);
149
+ const center = rSize / 2;
142
150
  return /*#__PURE__*/React.createElement(View, {
143
151
  style: baseStyle
144
152
  }, /*#__PURE__*/React.createElement(Svg, {
145
- width: resolvedSize,
146
- height: resolvedSize
153
+ width: rSize,
154
+ height: rSize
147
155
  }, /*#__PURE__*/React.createElement(SvgCircle, {
148
156
  cx: center,
149
157
  cy: center,
150
158
  r: radius,
151
- stroke: resolvedLayerColor,
152
- strokeWidth: resolvedStrokeWidth,
159
+ stroke: rLayerColor,
160
+ strokeWidth: rStroke,
153
161
  fill: fill
154
162
  }), /*#__PURE__*/React.createElement(AnimatedSvgCircle, {
155
163
  cx: center,
156
164
  cy: center,
157
165
  r: radius,
158
- stroke: resolvedColor,
159
- strokeWidth: resolvedStrokeWidth,
166
+ stroke: rColor,
167
+ strokeWidth: rStroke,
160
168
  fill: "transparent",
161
169
  strokeDasharray: `${circumference} ${circumference}`,
162
170
  strokeDashoffset: dashOffset,
@@ -167,7 +175,13 @@ export const Circle = props => {
167
175
  })), /*#__PURE__*/React.createElement(View, {
168
176
  pointerEvents: "box-none",
169
177
  style: contentStyle
170
- }, content));
178
+ }, isText(content) ? /*#__PURE__*/React.createElement(Text, {
179
+ style: [tokens.layout.text, {
180
+ color: tokens.colors.text,
181
+ fontSize: tokens.typography.fontSize
182
+ }, textStyle]
183
+ }, content) : content));
171
184
  };
185
+ export const Circle = /*#__PURE__*/React.memo(CircleImpl);
172
186
  Circle.displayName = 'Circle';
173
187
  export default Circle;
@@ -1,9 +1,10 @@
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
2
  import React, { useCallback, useContext, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';
3
- import { Animated, Easing, Text, View } from 'react-native';
3
+ import { Animated, Easing, View } from 'react-native';
4
4
  import { Arrow } from 'react-native-system-icon';
5
+ import { useReducedMotion } from '../../hooks/animation';
5
6
  import { Cell } from '../cell';
6
- import { createHairlineView, isFunction, isNumber, isObject, isRenderable, isText } from '../../utils';
7
+ import { createHairlineView, isFunction, isNumber, isObject, isRenderable, renderTextOrNode } from '../../utils';
7
8
  import { useCollapseTokens } from './tokens';
8
9
  const CollapseContext = /*#__PURE__*/React.createContext(null);
9
10
  const normalizeValue = value => {
@@ -12,67 +13,45 @@ const normalizeValue = value => {
12
13
  if (value === null) return [];
13
14
  return [String(value)];
14
15
  };
15
- const buildOutputValue = (keys, accordion) => {
16
- if (accordion) {
17
- return keys[0] ?? '';
18
- }
19
- return keys;
20
- };
21
- export const Collapse = props => {
16
+ const buildOutputValue = (keys, accordion) => accordion ? keys[0] ?? '' : keys;
17
+ const CollapseImpl = props => {
22
18
  const {
23
19
  tokensOverride,
24
20
  children,
25
- accordion: accordionProp,
21
+ accordion: accP,
26
22
  value,
27
23
  defaultValue,
28
24
  onChange,
29
- border: borderProp,
30
- iconPosition: iconPositionProp,
25
+ border: borderP,
26
+ iconPosition: iconPosP,
31
27
  expandIcon,
32
28
  disabled,
33
29
  style,
34
30
  ...rest
35
31
  } = props;
36
32
  const tokens = useCollapseTokens(tokensOverride);
37
- const accordion = accordionProp ?? tokens.defaults.accordion;
38
- const border = borderProp ?? tokens.defaults.border;
39
- const iconPosition = iconPositionProp ?? tokens.defaults.iconPosition;
33
+ const accordion = accP ?? tokens.defaults.accordion;
34
+ const border = borderP ?? tokens.defaults.border;
35
+ const iconPosition = iconPosP ?? tokens.defaults.iconPosition;
40
36
  const {
41
37
  colors
42
38
  } = tokens;
43
39
  const controlled = value !== undefined;
44
- const normalizedValue = normalizeValue(value);
45
- const normalizedDefault = normalizeValue(defaultValue) ?? [];
46
- const [internalValue, setInternalValue] = useState(() => accordion ? normalizedDefault.slice(0, 1) : normalizedDefault);
47
- const activeKeys = controlled ? accordion ? (normalizedValue ?? []).slice(0, 1) : normalizedValue ?? [] : internalValue;
40
+ const normVal = normalizeValue(value);
41
+ const normDef = normalizeValue(defaultValue) ?? [];
42
+ const onChangeRef = useRef(onChange);
43
+ onChangeRef.current = onChange;
44
+ const [internalValue, setInternalValue] = useState(() => accordion ? normDef.slice(0, 1) : normDef);
45
+ const activeKeys = controlled ? accordion ? (normVal ?? []).slice(0, 1) : normVal ?? [] : internalValue;
48
46
  const toggle = useCallback((name, expand) => {
49
47
  if (disabled) return;
50
- const current = activeKeys;
51
- const exists = current.includes(name);
52
- let next;
53
- if (accordion) {
54
- if (expand === true) {
55
- next = exists ? current : [name];
56
- } else if (expand === false) {
57
- next = exists ? [] : current;
58
- } else {
59
- next = exists ? [] : [name];
60
- }
61
- } else {
62
- if (expand === true) {
63
- next = exists ? current : [...current, name];
64
- } else if (expand === false) {
65
- next = exists ? current.filter(item => item !== name) : current;
66
- } else {
67
- next = exists ? current.filter(item => item !== name) : [...current, name];
68
- }
69
- }
70
- if (!controlled) {
71
- setInternalValue(next);
72
- }
73
- onChange?.(buildOutputValue(next, accordion));
74
- }, [accordion, activeKeys, controlled, disabled, onChange]);
75
- const contextValue = useMemo(() => ({
48
+ const existing = activeKeys.includes(name);
49
+ const shouldExpand = expand ?? !existing;
50
+ const nextKeys = accordion ? shouldExpand ? [name] : existing ? [] : activeKeys : shouldExpand ? existing ? activeKeys : [...activeKeys, name] : existing ? activeKeys.filter(k => k !== name) : activeKeys;
51
+ if (!controlled) setInternalValue(nextKeys);
52
+ onChangeRef.current?.(buildOutputValue(nextKeys, accordion));
53
+ }, [accordion, activeKeys, controlled, disabled]);
54
+ const ctxVal = useMemo(() => ({
76
55
  activeKeys,
77
56
  toggle,
78
57
  accordion,
@@ -84,20 +63,18 @@ export const Collapse = props => {
84
63
  }), [accordion, activeKeys, border, disabled, expandIcon, iconPosition, tokens, toggle]);
85
64
  const renderedChildren = useMemo(() => {
86
65
  const items = React.Children.toArray(children);
87
- return items.map((child, index) => {
66
+ return items.map((child, i) => {
88
67
  if (! /*#__PURE__*/React.isValidElement(child)) return child;
89
- if (!isFunction(child.type) && !isObject(child.type)) {
90
- return child;
91
- }
92
- const name = child.props.name ?? String(index);
68
+ if (!isFunction(child.type) && !isObject(child.type)) return child;
69
+ const name = child.props.name ?? String(i);
93
70
  return /*#__PURE__*/React.cloneElement(child, {
94
71
  name,
95
- index
72
+ index: i
96
73
  });
97
74
  });
98
75
  }, [children]);
99
76
  return /*#__PURE__*/React.createElement(CollapseContext.Provider, {
100
- value: contextValue
77
+ value: ctxVal
101
78
  }, /*#__PURE__*/React.createElement(View, _extends({
102
79
  style: [tokens.layout.container, border && {
103
80
  backgroundColor: colors.background
@@ -112,7 +89,7 @@ export const Collapse = props => {
112
89
  color: colors.border
113
90
  }), renderedChildren));
114
91
  };
115
- const Hairline = ({
92
+ const Hairline = /*#__PURE__*/React.memo(({
116
93
  tokens,
117
94
  position,
118
95
  color,
@@ -128,18 +105,17 @@ const Hairline = ({
128
105
  pointerEvents: "none",
129
106
  style: [tokens.layout.hairline, hairlineStyle]
130
107
  });
131
- };
108
+ });
132
109
  const CollapsePanel = /*#__PURE__*/React.forwardRef((props, ref) => {
133
110
  const context = useContext(CollapseContext);
134
- if (!context) {
135
- throw new Error('Collapse.Panel must be used within Collapse');
136
- }
111
+ const reducedMotion = useReducedMotion();
112
+ if (!context) throw new Error('Collapse.Panel must be used within Collapse');
137
113
  const {
138
114
  activeKeys,
139
115
  toggle,
140
116
  iconPosition,
141
117
  expandIcon,
142
- disabled: collapseDisabled,
118
+ disabled: contextDisabled,
143
119
  tokens
144
120
  } = context;
145
121
  const {
@@ -152,8 +128,8 @@ const CollapsePanel = /*#__PURE__*/React.forwardRef((props, ref) => {
152
128
  extra,
153
129
  value,
154
130
  border: panelBorder = tokens.defaults.panelBorder,
155
- isLink = tokens.defaults.panelIsLink,
156
- size = tokens.defaults.panelSize,
131
+ isLink: isLinkProp = tokens.defaults.panelIsLink,
132
+ size: sizeProp = tokens.defaults.panelSize,
157
133
  disabled,
158
134
  readOnly,
159
135
  children,
@@ -164,7 +140,7 @@ const CollapsePanel = /*#__PURE__*/React.forwardRef((props, ref) => {
164
140
  } = props;
165
141
  const nameKey = String(name);
166
142
  const isActive = activeKeys.includes(nameKey);
167
- const mergedDisabled = collapseDisabled || disabled;
143
+ const mergedDisabled = contextDisabled || disabled;
168
144
  const {
169
145
  colors,
170
146
  spacing,
@@ -172,20 +148,33 @@ const CollapsePanel = /*#__PURE__*/React.forwardRef((props, ref) => {
172
148
  } = tokens;
173
149
  const [contentHeight, setContentHeight] = useState(0);
174
150
  const animation = useRef(new Animated.Value(isActive ? 1 : 0)).current;
175
- const rotate = animation.interpolate({
151
+ const collapseAnimRef = useRef(null);
152
+ const rotation = animation.interpolate({
176
153
  inputRange: [0, 1],
177
154
  outputRange: ['90deg', '-90deg']
178
155
  });
179
156
  useEffect(() => {
180
- Animated.timing(animation, {
157
+ collapseAnimRef.current?.stop();
158
+ const anim = Animated.timing(animation, {
181
159
  toValue: isActive ? 1 : 0,
182
- duration: tokens.defaults.animationDuration,
160
+ duration: reducedMotion ? 0 : tokens.defaults.animationDuration,
183
161
  easing: Easing.ease,
184
- useNativeDriver: false
185
- }).start();
186
- }, [animation, isActive, tokens.defaults.animationDuration]);
187
- const resolvedLabel = description ?? label;
188
- const resolvedValue = extra ?? value;
162
+ useNativeDriver: false,
163
+ isInteraction: false
164
+ });
165
+ collapseAnimRef.current = anim;
166
+ anim.start(({
167
+ finished
168
+ }) => {
169
+ if (finished) collapseAnimRef.current = null;
170
+ });
171
+ return () => {
172
+ collapseAnimRef.current?.stop();
173
+ collapseAnimRef.current = null;
174
+ };
175
+ }, [animation, isActive, reducedMotion, tokens.defaults.animationDuration]);
176
+ const renderedLabel = description ?? label;
177
+ const renderedValue = extra ?? value;
189
178
  const handleToggle = useCallback(() => {
190
179
  if (mergedDisabled || readOnly) return;
191
180
  toggle(nameKey);
@@ -197,11 +186,9 @@ const CollapsePanel = /*#__PURE__*/React.forwardRef((props, ref) => {
197
186
  }
198
187
  }), [mergedDisabled, nameKey, readOnly, toggle]);
199
188
  const handleContentLayout = useCallback(event => {
200
- const nextHeight = event.nativeEvent.layout.height;
201
- if (isNumber(nextHeight) && Number.isFinite(nextHeight) && nextHeight !== contentHeight) {
202
- setContentHeight(nextHeight);
203
- }
204
- }, [contentHeight]);
189
+ const height = event.nativeEvent.layout.height;
190
+ if (isNumber(height) && Number.isFinite(height)) setContentHeight(prev => prev === height ? prev : height);
191
+ }, []);
205
192
  const animatedStyle = useMemo(() => ({
206
193
  height: animation.interpolate({
207
194
  inputRange: [0, 1],
@@ -209,59 +196,54 @@ const CollapsePanel = /*#__PURE__*/React.forwardRef((props, ref) => {
209
196
  })
210
197
  }), [animation, contentHeight]);
211
198
  const renderExpandIcon = useCallback(() => {
212
- if (isFunction(expandIcon)) {
213
- return expandIcon(isActive);
214
- }
215
- if (expandIcon) {
216
- return expandIcon;
217
- }
199
+ if (isFunction(expandIcon)) return expandIcon(isActive);
200
+ if (expandIcon) return expandIcon;
218
201
  return /*#__PURE__*/React.createElement(Animated.View, {
219
202
  style: {
220
203
  transform: [{
221
- rotate
204
+ rotate: rotation
222
205
  }]
223
206
  }
224
207
  }, /*#__PURE__*/React.createElement(Arrow, {
225
208
  size: 16,
226
209
  fill: mergedDisabled ? colors.disabled : colors.arrow
227
210
  }));
228
- }, [colors.arrow, colors.disabled, expandIcon, isActive, mergedDisabled, rotate]);
229
- const contentNode = useMemo(() => !isText(children) ? children : /*#__PURE__*/React.createElement(Text, {
230
- style: {
231
- color: mergedDisabled ? colors.disabled : colors.description,
232
- fontSize: typography.descriptionSize,
233
- lineHeight: Math.round(typography.descriptionSize * 1.5)
234
- }
235
- }, children), [children, colors.description, colors.disabled, mergedDisabled, typography.descriptionSize]);
236
- const showItemBorder = Boolean(panelBorder);
237
- const showTopBorder = index > 0 && showItemBorder;
238
- const showHeaderBottomBorder = isActive && showItemBorder;
239
- const showExpandIcon = isLink && !readOnly;
211
+ }, [colors.arrow, colors.disabled, expandIcon, isActive, mergedDisabled, rotation]);
212
+ const contentNode = useMemo(() => renderTextOrNode(children, {
213
+ color: mergedDisabled ? colors.disabled : colors.description,
214
+ fontFamily: typography.fontFamily,
215
+ fontSize: typography.descriptionSize,
216
+ lineHeight: Math.round(typography.descriptionSize * 1.5)
217
+ }), [children, colors.description, colors.disabled, mergedDisabled, typography.descriptionSize, typography.fontFamily]);
218
+ const showInnerBorder = Boolean(panelBorder);
219
+ const showTopBorder = index > 0 && showInnerBorder;
220
+ const showHeaderBottomBorder = isActive && showInnerBorder;
221
+ const showExpandIcon = isLinkProp && !readOnly;
240
222
  const headerIcon = iconPosition === 'left' ? showExpandIcon || isRenderable(icon) ? /*#__PURE__*/React.createElement(View, {
241
223
  style: tokens.layout.headerIconRow
242
- }, showExpandIcon ? /*#__PURE__*/React.createElement(View, {
224
+ }, showExpandIcon && /*#__PURE__*/React.createElement(View, {
243
225
  style: {
244
226
  marginRight: icon ? tokens.spacing.iconGap : 0
245
227
  }
246
- }, renderExpandIcon()) : null, icon) : undefined : icon;
228
+ }, renderExpandIcon()), icon) : undefined : icon;
247
229
  const headerRightIcon = iconPosition === 'right' && showExpandIcon ? renderExpandIcon() : undefined;
248
230
  return /*#__PURE__*/React.createElement(View, _extends({
249
231
  style: [tokens.layout.panel, {
250
232
  backgroundColor: colors.background
251
233
  }, style]
252
- }, rest), showTopBorder ? /*#__PURE__*/React.createElement(Hairline, {
234
+ }, rest), showTopBorder && /*#__PURE__*/React.createElement(Hairline, {
253
235
  tokens: tokens,
254
236
  position: "top",
255
237
  color: colors.border,
256
238
  inset: spacing.paddingHorizontal
257
- }) : null, /*#__PURE__*/React.createElement(View, {
239
+ }), /*#__PURE__*/React.createElement(View, {
258
240
  style: tokens.layout.headerWrapper
259
241
  }, /*#__PURE__*/React.createElement(Cell, {
260
242
  title: title,
261
- label: resolvedLabel,
243
+ label: renderedLabel,
262
244
  icon: headerIcon,
263
- value: resolvedValue,
264
- size: size,
245
+ value: renderedValue,
246
+ size: sizeProp,
265
247
  border: false,
266
248
  disabled: mergedDisabled,
267
249
  onPress: readOnly ? undefined : handleToggle,
@@ -279,12 +261,12 @@ const CollapsePanel = /*#__PURE__*/React.forwardRef((props, ref) => {
279
261
  color: colors.disabled
280
262
  } : undefined,
281
263
  rightIcon: headerRightIcon
282
- }), showHeaderBottomBorder ? /*#__PURE__*/React.createElement(Hairline, {
264
+ }), showHeaderBottomBorder && /*#__PURE__*/React.createElement(Hairline, {
283
265
  tokens: tokens,
284
266
  position: "bottom",
285
267
  color: colors.border,
286
268
  inset: spacing.paddingHorizontal
287
- }) : null), /*#__PURE__*/React.createElement(Animated.View, {
269
+ })), /*#__PURE__*/React.createElement(Animated.View, {
288
270
  style: [tokens.layout.bodyWrapper, animatedStyle]
289
271
  }, /*#__PURE__*/React.createElement(View, {
290
272
  onLayout: handleContentLayout,
@@ -295,7 +277,10 @@ const CollapsePanel = /*#__PURE__*/React.forwardRef((props, ref) => {
295
277
  }]
296
278
  }, contentNode)));
297
279
  });
298
- Collapse.Panel = CollapsePanel;
299
- Collapse.Item = CollapsePanel;
300
- Collapse.displayName = 'Collapse';
280
+ CollapseImpl.Panel = CollapsePanel;
281
+ CollapseImpl.Item = CollapsePanel;
282
+ export const Collapse = Object.assign(/*#__PURE__*/React.memo(CollapseImpl), {
283
+ Panel: CollapsePanel,
284
+ Item: CollapsePanel
285
+ });
301
286
  export default Collapse;
@@ -1,18 +1,25 @@
1
1
  import React, { useContext } from 'react';
2
+ import { I18nManager } from 'react-native';
2
3
  import { ThemeProvider } from '../../design-system/ThemeProvider';
3
4
  import { PortalHost } from '../portal';
5
+ import { DirectionContext } from './DirectionContext';
4
6
  import { LocaleContext } from './LocaleContext';
5
7
  const ConfigProviderBase = ({
6
8
  theme,
7
9
  locale,
10
+ direction,
8
11
  children
9
12
  }) => {
10
- const parentLocale = useContext(LocaleContext);
11
- const resolvedLocale = locale ?? parentLocale;
13
+ const ctxLocale = useContext(LocaleContext);
14
+ const ctxDir = useContext(DirectionContext);
15
+ const rLocale = locale ?? ctxLocale;
16
+ const rDir = direction ?? ctxDir ?? (I18nManager.isRTL ? 'rtl' : 'ltr');
12
17
  return /*#__PURE__*/React.createElement(ThemeProvider, {
13
18
  value: theme
19
+ }, /*#__PURE__*/React.createElement(DirectionContext.Provider, {
20
+ value: rDir
14
21
  }, /*#__PURE__*/React.createElement(LocaleContext.Provider, {
15
- value: resolvedLocale
16
- }, /*#__PURE__*/React.createElement(PortalHost, null, children)));
22
+ value: rLocale
23
+ }, /*#__PURE__*/React.createElement(PortalHost, null, children))));
17
24
  };
18
25
  export const ConfigProvider = /*#__PURE__*/React.memo(ConfigProviderBase);
@@ -0,0 +1,2 @@
1
+ import React from 'react';
2
+ export const DirectionContext = /*#__PURE__*/React.createContext('ltr');
@@ -1,4 +1,5 @@
1
1
  export { ConfigProvider } from './ConfigProvider';
2
2
  export { useLocale } from './useLocale';
3
+ export { useDirection } from './useDirection';
3
4
  export { zhCN } from './locale/zh-CN';
4
5
  export { enUS } from './locale/en-US';