react-native-system-ui 0.0.3 → 0.0.4

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 (168) hide show
  1. package/dist/cjs/components/area/Area.js +4 -10
  2. package/dist/cjs/components/avatar/Avatar.js +3 -3
  3. package/dist/cjs/components/avatar/tokens.js +2 -1
  4. package/dist/cjs/components/badge/Badge.js +30 -38
  5. package/dist/cjs/components/button/Button.js +13 -13
  6. package/dist/cjs/components/button/ButtonGroup.js +8 -8
  7. package/dist/cjs/components/calendar/Calendar.js +10 -10
  8. package/dist/cjs/components/cascader/Cascader.js +4 -4
  9. package/dist/cjs/components/cascader/useCascaderExtend.js +5 -15
  10. package/dist/cjs/components/checkbox/CheckboxGroup.js +2 -2
  11. package/dist/cjs/components/circle/Circle.js +2 -2
  12. package/dist/cjs/components/collapse/Collapse.js +13 -16
  13. package/dist/cjs/components/config-provider/ConfigProvider.js +1 -1
  14. package/dist/cjs/components/datetime-picker/DatetimePicker.js +7 -7
  15. package/dist/cjs/components/dialog/Dialog.js +4 -6
  16. package/dist/cjs/components/dialog/tokens.js +2 -1
  17. package/dist/cjs/components/dropdown-menu/DropdownItem.js +53 -52
  18. package/dist/cjs/components/dropdown-menu/DropdownMenu.js +19 -23
  19. package/dist/cjs/components/dropdown-menu/tokens.js +20 -3
  20. package/dist/cjs/components/field/Field.js +6 -6
  21. package/dist/cjs/components/form/Form.js +5 -9
  22. package/dist/cjs/components/grid/Grid.js +4 -4
  23. package/dist/cjs/components/image/Image.js +19 -15
  24. package/dist/cjs/components/image-preview/ImagePreview.js +62 -60
  25. package/dist/cjs/components/image-preview/tokens.js +21 -2
  26. package/dist/cjs/components/index-bar/IndexAnchor.js +7 -6
  27. package/dist/cjs/components/index-bar/IndexBar.js +38 -44
  28. package/dist/cjs/components/index-bar/tokens.js +22 -13
  29. package/dist/cjs/components/index.js +343 -0
  30. package/dist/cjs/components/input/Input.js +7 -10
  31. package/dist/cjs/components/notice-bar/NoticeBar.js +69 -95
  32. package/dist/cjs/components/notify/Notify.js +46 -22
  33. package/dist/cjs/components/notify/defaults.js +2 -2
  34. package/dist/cjs/components/notify/imperative.js +1 -1
  35. package/dist/cjs/components/notify/tokens.js +5 -4
  36. package/dist/cjs/components/number-keyboard/NumberKeyboard.js +12 -12
  37. package/dist/cjs/components/number-keyboard/tokens.js +4 -2
  38. package/dist/cjs/components/overlay/useOverlayStack.js +5 -1
  39. package/dist/cjs/components/pagination/Pagination.js +2 -2
  40. package/dist/cjs/components/password-input/PasswordInput.js +35 -27
  41. package/dist/cjs/components/picker/Picker.js +11 -12
  42. package/dist/cjs/components/picker/WheelPicker.js +9 -9
  43. package/dist/cjs/components/picker/tokens.js +4 -2
  44. package/dist/cjs/components/popup/Popup.js +39 -54
  45. package/dist/cjs/components/popup/tokens.js +2 -1
  46. package/dist/cjs/components/portal/Portal.js +5 -0
  47. package/dist/cjs/components/portal/PortalHost.js +1 -13
  48. package/dist/cjs/components/pull-refresh/PullRefresh.js +46 -27
  49. package/dist/cjs/components/radio/RadioGroup.js +2 -2
  50. package/dist/cjs/components/search/Search.js +52 -67
  51. package/dist/cjs/components/search/tokens.js +2 -1
  52. package/dist/cjs/components/selector/Selector.js +3 -3
  53. package/dist/cjs/components/share-sheet/ShareSheet.js +64 -62
  54. package/dist/cjs/components/share-sheet/tokens.js +15 -2
  55. package/dist/cjs/components/sidebar/Sidebar.js +15 -19
  56. package/dist/cjs/components/sidebar/SidebarItem.js +0 -3
  57. package/dist/cjs/components/skeleton/Skeleton.js +44 -56
  58. package/dist/cjs/components/slider/Slider.js +55 -61
  59. package/dist/cjs/components/stepper/Stepper.js +13 -16
  60. package/dist/cjs/components/stepper/tokens.js +4 -2
  61. package/dist/cjs/components/swiper/Swiper.js +21 -42
  62. package/dist/cjs/components/swiper/useSwiperWeb.js +15 -18
  63. package/dist/cjs/components/tabbar/Tabbar.js +8 -11
  64. package/dist/cjs/components/tabbar/TabbarItem.js +0 -3
  65. package/dist/cjs/components/tabs/Tabs.js +33 -54
  66. package/dist/cjs/components/tabs/tokens.js +9 -1
  67. package/dist/cjs/components/tabs/useTabsScroll.js +4 -0
  68. package/dist/cjs/components/toast/Toast.js +10 -8
  69. package/dist/cjs/components/toast/tokens.js +5 -1
  70. package/dist/cjs/components/typography/Typography.js +17 -30
  71. package/dist/cjs/components/uploader/Uploader.js +49 -46
  72. package/dist/cjs/components/uploader/tokens.js +27 -1
  73. package/dist/cjs/components/water-mark/WaterMark.js +16 -16
  74. package/dist/cjs/hooks/usePresenceAnimation.js +12 -2
  75. package/dist/es/components/area/Area.js +5 -11
  76. package/dist/es/components/avatar/Avatar.js +3 -3
  77. package/dist/es/components/avatar/tokens.js +2 -1
  78. package/dist/es/components/badge/Badge.js +31 -39
  79. package/dist/es/components/button/Button.js +14 -14
  80. package/dist/es/components/button/ButtonGroup.js +7 -7
  81. package/dist/es/components/calendar/Calendar.js +11 -11
  82. package/dist/es/components/cascader/Cascader.js +5 -5
  83. package/dist/es/components/cascader/useCascaderExtend.js +5 -9
  84. package/dist/es/components/checkbox/CheckboxGroup.js +3 -3
  85. package/dist/es/components/circle/Circle.js +3 -3
  86. package/dist/es/components/collapse/Collapse.js +14 -17
  87. package/dist/es/components/config-provider/ConfigProvider.js +2 -2
  88. package/dist/es/components/datetime-picker/DatetimePicker.js +8 -8
  89. package/dist/es/components/dialog/Dialog.js +4 -6
  90. package/dist/es/components/dialog/tokens.js +2 -1
  91. package/dist/es/components/dropdown-menu/DropdownItem.js +53 -52
  92. package/dist/es/components/dropdown-menu/DropdownMenu.js +20 -24
  93. package/dist/es/components/dropdown-menu/tokens.js +20 -3
  94. package/dist/es/components/field/Field.js +7 -7
  95. package/dist/es/components/field/index.js +1 -1
  96. package/dist/es/components/form/Form.js +6 -10
  97. package/dist/es/components/grid/Grid.js +3 -3
  98. package/dist/es/components/image/Image.js +20 -16
  99. package/dist/es/components/image-preview/ImagePreview.js +63 -61
  100. package/dist/es/components/image-preview/tokens.js +21 -2
  101. package/dist/es/components/index-bar/IndexAnchor.js +7 -6
  102. package/dist/es/components/index-bar/IndexBar.js +39 -45
  103. package/dist/es/components/index-bar/tokens.js +22 -13
  104. package/dist/es/components/index.js +50 -1
  105. package/dist/es/components/input/Input.js +8 -11
  106. package/dist/es/components/notice-bar/NoticeBar.js +70 -96
  107. package/dist/es/components/notify/Notify.js +46 -23
  108. package/dist/es/components/notify/defaults.js +2 -2
  109. package/dist/es/components/notify/imperative.js +1 -1
  110. package/dist/es/components/notify/tokens.js +5 -4
  111. package/dist/es/components/number-keyboard/NumberKeyboard.js +13 -13
  112. package/dist/es/components/number-keyboard/tokens.js +4 -2
  113. package/dist/es/components/overlay/useOverlayStack.js +6 -2
  114. package/dist/es/components/pagination/Pagination.js +3 -3
  115. package/dist/es/components/password-input/PasswordInput.js +36 -28
  116. package/dist/es/components/picker/Picker.js +12 -13
  117. package/dist/es/components/picker/WheelPicker.js +10 -10
  118. package/dist/es/components/picker/tokens.js +4 -2
  119. package/dist/es/components/popup/Popup.js +41 -56
  120. package/dist/es/components/popup/tokens.js +2 -1
  121. package/dist/es/components/portal/Portal.js +5 -0
  122. package/dist/es/components/portal/PortalHost.js +1 -13
  123. package/dist/es/components/pull-refresh/PullRefresh.js +47 -28
  124. package/dist/es/components/radio/RadioGroup.js +3 -3
  125. package/dist/es/components/search/Search.js +53 -68
  126. package/dist/es/components/search/tokens.js +2 -1
  127. package/dist/es/components/selector/Selector.js +4 -4
  128. package/dist/es/components/share-sheet/ShareSheet.js +65 -63
  129. package/dist/es/components/share-sheet/tokens.js +15 -2
  130. package/dist/es/components/sidebar/Sidebar.js +14 -18
  131. package/dist/es/components/sidebar/SidebarItem.js +0 -3
  132. package/dist/es/components/skeleton/Skeleton.js +45 -57
  133. package/dist/es/components/slider/Slider.js +56 -62
  134. package/dist/es/components/stepper/Stepper.js +14 -17
  135. package/dist/es/components/stepper/tokens.js +4 -2
  136. package/dist/es/components/swiper/Swiper.js +22 -43
  137. package/dist/es/components/swiper/useSwiperWeb.js +16 -19
  138. package/dist/es/components/tabbar/Tabbar.js +9 -12
  139. package/dist/es/components/tabbar/TabbarItem.js +0 -3
  140. package/dist/es/components/tabs/Tabs.js +34 -55
  141. package/dist/es/components/tabs/tokens.js +9 -1
  142. package/dist/es/components/tabs/useTabsScroll.js +4 -0
  143. package/dist/es/components/toast/Toast.js +10 -8
  144. package/dist/es/components/toast/tokens.js +5 -1
  145. package/dist/es/components/typography/Typography.js +18 -31
  146. package/dist/es/components/uploader/Uploader.js +49 -46
  147. package/dist/es/components/uploader/tokens.js +27 -1
  148. package/dist/es/components/water-mark/WaterMark.js +17 -17
  149. package/dist/es/hooks/usePresenceAnimation.js +12 -2
  150. package/dist/types/components/dialog/tokens.d.ts +1 -0
  151. package/dist/types/components/dropdown-menu/tokens.d.ts +17 -0
  152. package/dist/types/components/field/index.d.ts +1 -1
  153. package/dist/types/components/image-preview/tokens.d.ts +16 -0
  154. package/dist/types/components/index-bar/tokens.d.ts +13 -4
  155. package/dist/types/components/index.d.ts +102 -0
  156. package/dist/types/components/notify/defaults.d.ts +2 -2
  157. package/dist/types/components/number-keyboard/tokens.d.ts +1 -0
  158. package/dist/types/components/password-input/PasswordInput.d.ts +4 -0
  159. package/dist/types/components/picker/tokens.d.ts +2 -0
  160. package/dist/types/components/popup/tokens.d.ts +1 -0
  161. package/dist/types/components/search/tokens.d.ts +1 -0
  162. package/dist/types/components/share-sheet/tokens.d.ts +13 -0
  163. package/dist/types/components/stepper/tokens.d.ts +2 -0
  164. package/dist/types/components/tabs/tokens.d.ts +8 -0
  165. package/dist/types/components/toast/tokens.d.ts +4 -0
  166. package/dist/types/components/uploader/tokens.d.ts +25 -0
  167. package/dist/types/hooks/usePresenceAnimation.d.ts +6 -1
  168. package/package.json +135 -135
@@ -53,19 +53,16 @@ const TabbarBase = props => {
53
53
  const placeholder = placeholderProp ?? tokens.defaults.placeholder;
54
54
  const iconSize = iconSizeProp ?? tokens.icon.size;
55
55
  const enableSafeAreaInsetBottom = safeAreaInsetBottom ?? fixed;
56
- const items = (0, _react().useMemo)(() => _react().default.Children.toArray(children).filter(_react().default.isValidElement), [children]);
57
- const firstName = (0, _react().useMemo)(() => items.length ? items[0].props.name ?? 0 : undefined, [items]);
56
+ const items = _react().default.Children.toArray(children).filter(_react().default.isValidElement);
57
+ const firstName = items.length ? items[0].props.name ?? 0 : undefined;
58
58
  const [activeValue, setActiveValue] = (0, _hooks.useControllableValue)(props, {
59
59
  defaultValue: firstName,
60
60
  valuePropName: 'value',
61
61
  defaultValuePropName: 'defaultValue',
62
62
  trigger: 'onChange'
63
63
  });
64
- const itemNames = (0, _react().useMemo)(() => items.map((item, index) => item.props.name ?? index), [items]);
65
- const currentName = (0, _react().useMemo)(() => {
66
- if (activeValue === undefined || activeValue === null) return firstName;
67
- return itemNames.some(name => name === activeValue) ? activeValue : firstName;
68
- }, [activeValue, firstName, itemNames]);
64
+ const itemNames = items.map((item, index) => item.props.name ?? index);
65
+ const currentName = activeValue === undefined || activeValue === null ? firstName : itemNames.some(name => name === activeValue) ? activeValue : firstName;
69
66
  const [barHeight, setBarHeight] = (0, _react().useState)(tokens.layout.height);
70
67
  const enablePlaceholder = fixed && placeholder;
71
68
  const handleLayout = (0, _react().useCallback)(event => {
@@ -74,15 +71,15 @@ const TabbarBase = props => {
74
71
  setBarHeight(prev => Math.abs(prev - nextHeight) < 0.5 ? prev : nextHeight);
75
72
  }, [enablePlaceholder]);
76
73
  const onSelect = (0, _react().useCallback)((name, index) => setActiveValue(name, index), [setActiveValue]);
77
- const contextValue = (0, _react().useMemo)(() => ({
74
+ const contextValue = {
78
75
  activeValue: currentName,
79
76
  activeColor: activeColor ?? tokens.colors.active,
80
77
  inactiveColor: inactiveColor ?? tokens.colors.inactive,
81
78
  fontSize: tokens.typography.fontSize,
82
79
  fontWeight: tokens.typography.fontWeight,
83
80
  onSelect
84
- }), [activeColor, currentName, inactiveColor, onSelect, tokens.colors.active, tokens.colors.inactive, tokens.typography.fontSize, tokens.typography.fontWeight]);
85
- const clonedChildren = (0, _react().useMemo)(() => items.map((item, index) => {
81
+ };
82
+ const clonedChildren = items.map((item, index) => {
86
83
  const name = item.props.name ?? index;
87
84
  return /*#__PURE__*/_react().default.cloneElement(item, {
88
85
  key: item.key ?? name,
@@ -91,7 +88,7 @@ const TabbarBase = props => {
91
88
  iconSize,
92
89
  tokensOverride: (0, _designSystem.mergeTokensOverride)(tokensOverride, item.props.tokensOverride)
93
90
  });
94
- }), [iconSize, items, tokensOverride]);
91
+ });
95
92
  if (items.length === 0) return null;
96
93
  const ContentWrapper = enableSafeAreaInsetBottom ? _safeAreaView.SafeAreaView : _reactNative().View;
97
94
  return /*#__PURE__*/_react().default.createElement(_react().default.Fragment, null, enablePlaceholder && /*#__PURE__*/_react().default.createElement(_reactNative().View, {
@@ -46,9 +46,6 @@ const TabbarItem = props => {
46
46
  const tokens = (0, _tokens.useTabbarTokens)(tokensOverride);
47
47
  const context = (0, _TabbarContext.useTabbarContext)();
48
48
  if (!context) {
49
- if (typeof __DEV__ !== 'undefined' && __DEV__) {
50
- console.warn('[TabbarItem] 需要作为 Tabbar 的子节点使用。');
51
- }
52
49
  return null;
53
50
  }
54
51
  const itemName = name ?? index ?? 0;
@@ -138,10 +138,10 @@ const TabBarItemInner = ({
138
138
  }, ellipsis && !isJumbo ? styles.ellipsis : null, titleStyle],
139
139
  numberOfLines: ellipsis && !isJumbo ? 1 : undefined
140
140
  }, renderTitle), (0, _validate.isRenderable)(renderDescription) && ((0, _validate.isText)(renderDescription) ? /*#__PURE__*/_react().default.createElement(_reactNative().Text, {
141
- style: [styles.description, isJumbo ? {
141
+ style: [styles.descriptionText, isJumbo ? {
142
142
  color: descriptionColor,
143
143
  fontSize: tokens.typography.descriptionSize,
144
- marginTop: 8,
144
+ marginTop: tokens.spacing.jumboDescriptionMarginTop,
145
145
  textAlign: 'center',
146
146
  backgroundColor: isActive ? tokens.colors.jumboDescriptionActiveBackground : tokens.colors.jumboDescriptionBackground,
147
147
  paddingHorizontal: tokens.jumbo.descriptionPaddingHorizontal,
@@ -150,26 +150,29 @@ const TabBarItemInner = ({
150
150
  } : {
151
151
  color: descriptionColor,
152
152
  fontSize: tokens.typography.descriptionSize,
153
- marginTop: 2,
153
+ marginTop: tokens.spacing.descriptionMarginTop,
154
154
  textAlign: 'center'
155
155
  }, descriptionStyle]
156
156
  }, renderDescription) : /*#__PURE__*/_react().default.createElement(_reactNative().View, {
157
- style: [styles.description, isJumbo ? {
158
- marginTop: 8,
157
+ style: [styles.descriptionView, isJumbo ? {
158
+ marginTop: tokens.spacing.jumboDescriptionMarginTop,
159
159
  alignItems: 'center',
160
160
  backgroundColor: isActive ? tokens.colors.jumboDescriptionActiveBackground : tokens.colors.jumboDescriptionBackground,
161
161
  paddingHorizontal: tokens.jumbo.descriptionPaddingHorizontal,
162
162
  paddingVertical: tokens.jumbo.descriptionPaddingVertical,
163
163
  borderRadius: tokens.jumbo.descriptionRadius
164
164
  } : {
165
- marginTop: 2,
165
+ marginTop: tokens.spacing.descriptionMarginTop,
166
166
  alignItems: 'center'
167
167
  }]
168
168
  }, renderDescription)), (0, _validate.isRenderable)(pane.badge) && /*#__PURE__*/_react().default.createElement(_reactNative().View, {
169
- style: styles.badge
169
+ style: [styles.badge, {
170
+ marginTop: tokens.spacing.badgeMarginTop
171
+ }]
170
172
  }, (0, _validate.isText)(pane.badge) ? /*#__PURE__*/_react().default.createElement(_reactNative().Text, {
171
173
  style: [styles.badgeText, {
172
- color: tokens.colors.badgeText
174
+ color: tokens.colors.badgeText,
175
+ fontSize: tokens.typography.badgeTextSize
173
176
  }]
174
177
  }, pane.badge) : pane.badge)));
175
178
  };
@@ -231,7 +234,7 @@ const TabsBaseInner = (props, ref) => {
231
234
  preventScroll: true
232
235
  };
233
236
  const isSwipeable = !!swipeableConfig;
234
- const panes = (0, _react().useMemo)(() => {
237
+ const panes = (() => {
235
238
  const result = [];
236
239
  let paneIndex = 0;
237
240
  const walk = nodes => {
@@ -243,11 +246,6 @@ const TabsBaseInner = (props, ref) => {
243
246
  return;
244
247
  }
245
248
  if (!(0, _utils.isTabPaneElement)(element)) {
246
- if (typeof __DEV__ !== 'undefined' && __DEV__) {
247
- const type = element.type;
248
- const childName = typeof type === 'string' ? type : type.displayName ?? type.name ?? 'Unknown';
249
- console.warn('[Tabs] children 只能是 <Tabs.TabPane />,已忽略:', childName);
250
- }
251
249
  return;
252
250
  }
253
251
  const paneProps = element.props;
@@ -263,7 +261,7 @@ const TabsBaseInner = (props, ref) => {
263
261
  };
264
262
  walk(children);
265
263
  return result;
266
- }, [children]);
264
+ })();
267
265
  const firstPaneName = panes[0]?.name;
268
266
  const [activeValue, setActiveValue] = (0, _hooks.useControllableValue)(props, {
269
267
  defaultValue: firstPaneName,
@@ -276,13 +274,13 @@ const TabsBaseInner = (props, ref) => {
276
274
  (0, _react().useEffect)(() => {
277
275
  currentNameRef.current = currentName;
278
276
  }, [currentName]);
279
- const nameIndexMap = (0, _react().useMemo)(() => {
277
+ const nameIndexMap = (() => {
280
278
  const map = new Map();
281
279
  panes.forEach(pane => {
282
280
  map.set(pane.name, pane.index);
283
281
  });
284
282
  return map;
285
- }, [panes]);
283
+ })();
286
284
  const activeIndex = currentName == null ? -1 : nameIndexMap.get(currentName) ?? -1;
287
285
  const visitedRef = (0, _react().useRef)(new Set());
288
286
  (0, _react().useEffect)(() => {
@@ -331,12 +329,7 @@ const TabsBaseInner = (props, ref) => {
331
329
  navContentSizeSyncFrameRef.current = null;
332
330
  };
333
331
  }, []);
334
- const scrollable = (0, _react().useMemo)(() => {
335
- if ((0, _validate.isBoolean)(scrollableProp)) {
336
- return scrollableProp;
337
- }
338
- return panes.length > resolvedSwipeThreshold || ellipsis === false;
339
- }, [ellipsis, panes.length, resolvedSwipeThreshold, scrollableProp]);
332
+ const scrollable = (0, _validate.isBoolean)(scrollableProp) ? scrollableProp : panes.length > resolvedSwipeThreshold || ellipsis === false;
340
333
  const indicatorColor = color ?? tokens.colors.indicator;
341
334
  const indicatorCornerRadius = resolvedLineHeight ? resolvedLineHeight / 2 : tokens.indicator.radius;
342
335
  const {
@@ -405,12 +398,8 @@ const TabsBaseInner = (props, ref) => {
405
398
  const runBeforeChange = (0, _react().useCallback)(name => {
406
399
  if (!beforeChange) return Promise.resolve(true);
407
400
  try {
408
- return Promise.resolve(beforeChange(name)).then(res => res !== false).catch(error => {
409
- if (typeof __DEV__ !== 'undefined' && __DEV__) console.warn('[Tabs] beforeChange 抛出异常:', error);
410
- return false;
411
- });
401
+ return Promise.resolve(beforeChange(name)).then(res => res !== false).catch(() => false);
412
402
  } catch (error) {
413
- if (typeof __DEV__ !== 'undefined' && __DEV__) console.warn('[Tabs] beforeChange 抛出异常:', error);
414
403
  return Promise.resolve(false);
415
404
  }
416
405
  }, [beforeChange]);
@@ -509,15 +498,7 @@ const TabsBaseInner = (props, ref) => {
509
498
  }, [currentName, scrollIntoView]);
510
499
  const borderEnabled = border ?? false;
511
500
  const showIndicator = type === 'line';
512
- const navHeight = (0, _react().useMemo)(() => {
513
- if (type === 'jumbo') {
514
- return tokens.jumbo.height;
515
- }
516
- if (type === 'card') {
517
- return tokens.card.height;
518
- }
519
- return tokens.tabList.height;
520
- }, [type, tokens]);
501
+ const navHeight = type === 'jumbo' ? tokens.jumbo.height : type === 'card' ? tokens.card.height : tokens.tabList.height;
521
502
  const navPaddingBottom = _reactNative().Platform.OS === 'web' && type !== 'line' && type !== 'card' ? tokens.tabList.paddingBottom : 0;
522
503
  const indicatorBottom = showIndicator ? type === 'line' ? 0 : tokens.indicator.offset : 0;
523
504
  if (panes.length === 0) {
@@ -591,7 +572,9 @@ const TabsBaseInner = (props, ref) => {
591
572
  backgroundColor: background
592
573
  }, tabBarStyle]
593
574
  }, navLeft && /*#__PURE__*/_react().default.createElement(_reactNative().View, {
594
- style: styles.navSide
575
+ style: [styles.navSide, {
576
+ paddingHorizontal: tokens.spacing.navSidePaddingHorizontal
577
+ }]
595
578
  }, navLeft), /*#__PURE__*/_react().default.createElement(_reactNative().View, {
596
579
  style: [styles.nav, {
597
580
  minHeight: navHeight + navPaddingBottom,
@@ -605,7 +588,9 @@ const TabsBaseInner = (props, ref) => {
605
588
  } : null],
606
589
  onLayout: handleNavContainerLayout
607
590
  }, navBody), navRight && /*#__PURE__*/_react().default.createElement(_reactNative().View, {
608
- style: styles.navSide
591
+ style: [styles.navSide, {
592
+ paddingHorizontal: tokens.spacing.navSidePaddingHorizontal
593
+ }]
609
594
  }, navRight));
610
595
  const paneNodes = panes.map(pane => {
611
596
  const isActive = pane.name === currentName;
@@ -648,7 +633,9 @@ const TabsBaseInner = (props, ref) => {
648
633
  style: [styles.container, style],
649
634
  onLayout: handleContainerLayout
650
635
  }), navContent, navBottom && /*#__PURE__*/_react().default.createElement(_reactNative().View, {
651
- style: styles.navBottom
636
+ style: [styles.navBottom, {
637
+ marginTop: tokens.spacing.navBottomMarginTop
638
+ }]
652
639
  }, navBottom), contentNode);
653
640
  };
654
641
  const styles = _reactNative().StyleSheet.create({
@@ -674,12 +661,8 @@ const styles = _reactNative().StyleSheet.create({
674
661
  navContentStatic: {
675
662
  flex: 1
676
663
  },
677
- navSide: {
678
- paddingHorizontal: 8
679
- },
680
- navBottom: {
681
- marginTop: 8
682
- },
664
+ navSide: {},
665
+ navBottom: {},
683
666
  labelWrapper: {
684
667
  justifyContent: 'center',
685
668
  alignItems: 'center',
@@ -707,20 +690,16 @@ const styles = _reactNative().StyleSheet.create({
707
690
  title: {
708
691
  includeFontPadding: false
709
692
  },
710
- description: {
711
- marginTop: 2,
693
+ descriptionText: {
712
694
  includeFontPadding: false
713
695
  },
696
+ descriptionView: {},
714
697
  ellipsis: {
715
698
  maxWidth: '100%',
716
699
  flexShrink: 1
717
700
  },
718
- badge: {
719
- marginTop: 4
720
- },
721
- badgeText: {
722
- fontSize: 10
723
- },
701
+ badge: {},
702
+ badgeText: {},
724
703
  indicator: {
725
704
  position: 'absolute',
726
705
  bottom: 0,
@@ -67,7 +67,15 @@ const createTokens = foundations => {
67
67
  titleActiveWeight: foundations.typography.weight.semiBold,
68
68
  descriptionSize: fontSize.xs,
69
69
  jumboTitleSize: fontSize.md,
70
- jumboLineHeight: Math.round(fontSize.md * 1.6)
70
+ jumboLineHeight: Math.round(fontSize.md * 1.6),
71
+ badgeTextSize: fontSize.xxs
72
+ },
73
+ spacing: {
74
+ navSidePaddingHorizontal: spacing.sm,
75
+ navBottomMarginTop: spacing.sm,
76
+ descriptionMarginTop: spacing.xxs,
77
+ jumboDescriptionMarginTop: spacing.sm,
78
+ badgeMarginTop: spacing.xs
71
79
  },
72
80
  indicator: {
73
81
  height: 3,
@@ -87,7 +87,11 @@ const useTabsScroll = ({
87
87
  const listenerId = navScrollX.addListener(({
88
88
  value
89
89
  }) => {
90
+ const prev = navLastScrollXRef.current;
90
91
  navLastScrollXRef.current = value;
92
+ if (Math.abs(value - prev) < 0.5) {
93
+ return;
94
+ }
91
95
  navScrollRef.current?.scrollTo({
92
96
  x: value,
93
97
  y: 0,
@@ -84,7 +84,7 @@ const Toast = props => {
84
84
  });
85
85
  const prevVisibleRef = (0, _react().useRef)(visible);
86
86
  const closingRef = (0, _react().useRef)(false);
87
- const positionOffset = windowHeight > 0 ? Math.round(windowHeight * 0.2) : 60;
87
+ const positionOffset = windowHeight > 0 ? Math.round(windowHeight * tokens.positionOffsetRatio) : tokens.positionOffsetMin;
88
88
  const needsSafeAreaTop = safeAreaInsetTopProp !== undefined ? safeAreaInsetTopProp : position === 'top';
89
89
  const needsSafeAreaBottom = safeAreaInsetBottomProp !== undefined ? safeAreaInsetBottomProp : position === 'bottom';
90
90
  const positionStyle = position === 'top' ? {
@@ -185,7 +185,7 @@ const Toast = props => {
185
185
  };
186
186
  const toastStyle = {
187
187
  borderRadius: tokens.radius,
188
- opacity: closeOnClick && toastPress.states.pressed ? 0.85 : animated,
188
+ opacity: closeOnClick && toastPress.states.pressed ? tokens.pressedOpacity : animated,
189
189
  backgroundColor: tokens.colors.variants[type],
190
190
  maxWidth: tokens.maxWidth,
191
191
  ...boxStyle
@@ -193,13 +193,17 @@ const Toast = props => {
193
193
  if (!mounted) return null;
194
194
  const hasMessage = message !== undefined && message !== null && message !== false && message !== '';
195
195
  return /*#__PURE__*/_react().default.createElement(_Portal.default, null, /*#__PURE__*/_react().default.createElement(_reactNative().View, {
196
- style: [styles.backdrop, positionStyle, stackZIndex ? {
196
+ style: [styles.backdrop, {
197
+ backgroundColor: tokens.colors.transparent
198
+ }, positionStyle, stackZIndex ? {
197
199
  zIndex: stackZIndex
198
200
  } : undefined],
199
201
  pointerEvents: forbidClick || overlay || closeOnClick ? 'auto' : 'none'
200
202
  }, overlay || forbidClick ? /*#__PURE__*/_react().default.createElement(_reactNative().Pressable, {
201
203
  testID: "rv-toast-overlay",
202
- style: [styles.overlay, overlay && {
204
+ style: [styles.overlay, {
205
+ backgroundColor: tokens.colors.transparent
206
+ }, overlay && {
203
207
  backgroundColor: colors.backdrop
204
208
  }, overlayStyle],
205
209
  pointerEvents: "auto",
@@ -236,12 +240,10 @@ exports.Toast = Toast;
236
240
  const styles = _reactNative().StyleSheet.create({
237
241
  backdrop: {
238
242
  flex: 1,
239
- alignItems: 'center',
240
- backgroundColor: 'transparent'
243
+ alignItems: 'center'
241
244
  },
242
245
  overlay: {
243
- ..._reactNative().StyleSheet.absoluteFillObject,
244
- backgroundColor: 'transparent'
246
+ ..._reactNative().StyleSheet.absoluteFillObject
245
247
  },
246
248
  toast: {
247
249
  alignItems: 'center',
@@ -17,7 +17,8 @@ const createToastTokens = foundations => {
17
17
  success: backdrop,
18
18
  fail: backdrop,
19
19
  loading: backdrop
20
- }
20
+ },
21
+ transparent: 'transparent'
21
22
  },
22
23
  fontSize: foundations.fontSize.sm,
23
24
  lineHeight: Math.round(foundations.fontSize.sm * foundations.typography.lineHeightMultiplier),
@@ -31,6 +32,9 @@ const createToastTokens = foundations => {
31
32
  defaultPadding: foundations.spacing.lg,
32
33
  defaultWidth: 88,
33
34
  defaultMinHeight: 88,
35
+ pressedOpacity: 0.85,
36
+ positionOffsetRatio: 0.2,
37
+ positionOffsetMin: 60,
34
38
  animationDuration: 160
35
39
  };
36
40
  };
@@ -73,21 +73,18 @@ const TypographyTextBaseInner = /*#__PURE__*/_react().default.forwardRef((props,
73
73
  }
74
74
  const fontSize = level ? tokens.sizing.titles[level].fontSize : tokens.sizing.sizes[size];
75
75
  const lineHeight = level ? tokens.sizing.titles[level].lineHeight : fontSize * tokens.sizing.lineHeightMultiplier;
76
- const baseStyle = (0, _react().useMemo)(() => {
77
- const textDecorationLine = underline && deleted ? 'underline line-through' : underline ? 'underline' : deleted ? 'line-through' : undefined;
78
- const computedStyle = {
79
- color: resolvedColor,
80
- fontSize,
81
- lineHeight,
82
- fontFamily: tokens.typography.fontFamily,
83
- fontWeight: strong ? tokens.typography.weight.strong : tokens.typography.weight.regular,
84
- includeFontPadding: false,
85
- textDecorationLine,
86
- textAlign: center ? 'center' : undefined,
87
- opacity: disabled ? tokens.opacity.disabled : 1
88
- };
89
- return [computedStyle, style];
90
- }, [resolvedColor, fontSize, lineHeight, tokens.typography.fontFamily, tokens.opacity.disabled, tokens.typography.weight.regular, tokens.typography.weight.strong, strong, center, disabled, underline, deleted, style]);
76
+ const textDecorationLine = underline && deleted ? 'underline line-through' : underline ? 'underline' : deleted ? 'line-through' : undefined;
77
+ const baseStyle = [{
78
+ color: resolvedColor,
79
+ fontSize,
80
+ lineHeight,
81
+ fontFamily: tokens.typography.fontFamily,
82
+ fontWeight: strong ? tokens.typography.weight.strong : tokens.typography.weight.regular,
83
+ includeFontPadding: false,
84
+ textDecorationLine,
85
+ textAlign: center ? 'center' : undefined,
86
+ opacity: disabled ? tokens.opacity.disabled : 1
87
+ }, style];
91
88
  const hasActionText = !!ellipsisConfig && (ellipsisConfig.expandText || ellipsisConfig.collapseText);
92
89
  const shouldShowAction = hasActionText && (isTruncated || expanded || isWeb);
93
90
  const handleToggleEllipsis = (0, _react().useCallback)(() => {
@@ -98,21 +95,15 @@ const TypographyTextBaseInner = /*#__PURE__*/_react().default.forwardRef((props,
98
95
  return next;
99
96
  });
100
97
  }, [ellipsisConfig]);
101
- const actionLabel = (0, _react().useMemo)(() => {
102
- if (!ellipsisConfig) return undefined;
103
- return expanded ? ellipsisConfig.collapseText ?? ellipsisConfig.expandText : ellipsisConfig.expandText ?? ellipsisConfig.collapseText;
104
- }, [ellipsisConfig, expanded]);
105
- const actionTextStyle = (0, _react().useMemo)(() => ({
98
+ const actionLabel = !ellipsisConfig ? undefined : expanded ? ellipsisConfig.collapseText ?? ellipsisConfig.expandText : ellipsisConfig.expandText ?? ellipsisConfig.collapseText;
99
+ const actionTextStyle = {
106
100
  color: tokens.colors.primary,
107
101
  fontSize: tokens.sizing.sizes.sm,
108
102
  fontWeight: tokens.typography.weight.medium,
109
103
  marginLeft: tokens.sizing.actionMarginLeft,
110
104
  includeFontPadding: false
111
- }), [tokens.colors.primary, tokens.sizing.sizes.sm, tokens.typography.weight.medium, tokens.sizing.actionMarginLeft]);
112
- const textStyle = (0, _react().useMemo)(() => {
113
- if (!shouldShowAction) return baseStyle;
114
- return [baseStyle, FLEX_SHRINK_STYLE];
115
- }, [shouldShowAction, baseStyle]);
105
+ };
106
+ const textStyle = shouldShowAction ? [baseStyle, FLEX_SHRINK_STYLE] : baseStyle;
116
107
  const textNode = /*#__PURE__*/_react().default.createElement(_reactNative().Text, _extends({
117
108
  ref: ref,
118
109
  style: textStyle,
@@ -170,11 +161,7 @@ const TypographyLink = /*#__PURE__*/_react().default.forwardRef((props, ref) =>
170
161
  if (href) {
171
162
  try {
172
163
  await _reactNative().Linking.openURL(href);
173
- } catch (error) {
174
- if (typeof __DEV__ !== 'undefined' && __DEV__) {
175
- console.warn('[Typography.Link] Failed to open url', error);
176
- }
177
- }
164
+ } catch {}
178
165
  }
179
166
  }, [onPress, href]);
180
167
  return /*#__PURE__*/_react().default.createElement(TypographyTextBase, _extends({
@@ -278,9 +278,7 @@ const Uploader = /*#__PURE__*/_react().default.forwardRef((props, ref) => {
278
278
  if (available <= 0) return prev;
279
279
  return [...prev, ...next.slice(0, available).map(item => normalizeItem(item))];
280
280
  });
281
- }).catch(error => {
282
- if (typeof __DEV__ !== 'undefined' && __DEV__) console.warn('[Uploader] onUpload rejected:', error);
283
- });
281
+ }).catch(() => {});
284
282
  };
285
283
  const closeImagePreview = () => setPreviewVisible(false);
286
284
  (0, _react().useImperativeHandle)(ref, () => ({
@@ -326,7 +324,7 @@ const Uploader = /*#__PURE__*/_react().default.forwardRef((props, ref) => {
326
324
  };
327
325
  const renderStatus = status => {
328
326
  if (!status) return null;
329
- const baseStyle = [styles.status, {
327
+ const baseStyle = [statusStyle, {
330
328
  backgroundColor: tokens.colors.maskBackground
331
329
  }];
332
330
  if (status === 'pending') {
@@ -337,7 +335,8 @@ const Uploader = /*#__PURE__*/_react().default.forwardRef((props, ref) => {
337
335
  color: tokens.colors.maskText
338
336
  }), /*#__PURE__*/_react().default.createElement(_reactNative().Text, {
339
337
  style: [styles.statusText, {
340
- color: tokens.colors.maskText
338
+ color: tokens.colors.maskText,
339
+ fontSize: tokens.typography.statusTextSize
341
340
  }]
342
341
  }, statusTextRender?.(status) ?? statusDefaults.pending));
343
342
  }
@@ -347,7 +346,8 @@ const Uploader = /*#__PURE__*/_react().default.forwardRef((props, ref) => {
347
346
  testID: "rv-uploader-status-failed"
348
347
  }, /*#__PURE__*/_react().default.createElement(_reactNative().Text, {
349
348
  style: [styles.statusText, {
350
- color: tokens.colors.failed
349
+ color: tokens.colors.failed,
350
+ fontSize: tokens.typography.statusTextSize
351
351
  }]
352
352
  }, statusTextRender?.(status) ?? statusDefaults.failed));
353
353
  }
@@ -364,19 +364,38 @@ const Uploader = /*#__PURE__*/_react().default.forwardRef((props, ref) => {
364
364
  backgroundColor: tokens.colors.background,
365
365
  borderColor: tokens.colors.border
366
366
  };
367
+ const placeholderStyle = [styles.placeholder, {
368
+ paddingHorizontal: tokens.spacing.placeholderPaddingHorizontal
369
+ }];
367
370
  const placeholderNameStyle = [styles.placeholderName, {
368
- color: tokens.colors.text
371
+ color: tokens.colors.text,
372
+ fontSize: tokens.typography.placeholderNameSize,
373
+ marginTop: tokens.spacing.placeholderNameMarginTop
369
374
  }];
370
375
  const deleteStyle = [styles.delete, {
371
- backgroundColor: tokens.colors.deleteBackground
376
+ backgroundColor: tokens.colors.deleteBackground,
377
+ borderRadius: tokens.radii.deleteButton,
378
+ top: tokens.spacing.deleteOffset,
379
+ right: tokens.spacing.deleteOffset,
380
+ minWidth: tokens.sizing.deleteMinSize,
381
+ minHeight: tokens.sizing.deleteMinSize,
382
+ paddingHorizontal: tokens.spacing.deletePaddingHorizontal
372
383
  }];
373
384
  const deleteIconStyle = {
374
385
  color: tokens.colors.deleteIcon
375
386
  };
387
+ const statusStyle = [styles.status, {
388
+ gap: tokens.spacing.statusGap
389
+ }];
390
+ const uploadContentStyle = [styles.uploadContent, {
391
+ gap: tokens.spacing.uploadContentGap
392
+ }];
376
393
  const renderPlaceholder = name => /*#__PURE__*/_react().default.createElement(_reactNative().View, {
377
- style: styles.placeholder
394
+ style: placeholderStyle
378
395
  }, /*#__PURE__*/_react().default.createElement(_reactNative().Text, {
379
- style: styles.placeholderIcon
396
+ style: [styles.placeholderIcon, {
397
+ fontSize: tokens.typography.placeholderIconSize
398
+ }]
380
399
  }, "FILE"), name && /*#__PURE__*/_react().default.createElement(_reactNative().Text, {
381
400
  style: placeholderNameStyle,
382
401
  numberOfLines: 1
@@ -414,7 +433,9 @@ const Uploader = /*#__PURE__*/_react().default.forwardRef((props, ref) => {
414
433
  }, /*#__PURE__*/_react().default.createElement(_reactNative().Pressable, {
415
434
  style: ({
416
435
  pressed
417
- }) => [styles.preview, frameStyle, pressed && styles.pressed],
436
+ }) => [styles.preview, frameStyle, pressed && {
437
+ opacity: tokens.opacity.pressed
438
+ }],
418
439
  onPress: () => handlePreview(item, index),
419
440
  testID: `rv-uploader-preview-${index}`
420
441
  }, source ? /*#__PURE__*/_react().default.createElement(_image.default, {
@@ -444,19 +465,25 @@ const Uploader = /*#__PURE__*/_react().default.forwardRef((props, ref) => {
444
465
  }, renderDelete(() => removeTask(task.id), `rv-uploader-task-delete-${task.id}`)))))) : null, canShowUpload ? /*#__PURE__*/_react().default.createElement(_reactNative().Pressable, {
445
466
  style: ({
446
467
  pressed
447
- }) => [styles.upload, boxStyle, frameStyle, pressed && styles.pressed, uploadDisabled && styles.disabled],
468
+ }) => [styles.upload, boxStyle, frameStyle, pressed && {
469
+ opacity: tokens.opacity.pressed
470
+ }, uploadDisabled && {
471
+ opacity: tokens.opacity.disabled
472
+ }],
448
473
  onPress: handleUploadPress,
449
474
  disabled: uploadDisabled,
450
475
  testID: "rv-uploader-upload"
451
476
  }, children ?? /*#__PURE__*/_react().default.createElement(_reactNative().View, {
452
- style: styles.uploadContent
477
+ style: uploadContentStyle
453
478
  }, uploadIcon ?? /*#__PURE__*/_react().default.createElement(_reactNative().Text, {
454
479
  style: [styles.uploadIcon, {
455
- color: tokens.colors.icon
480
+ color: tokens.colors.icon,
481
+ fontSize: tokens.typography.uploadIconSize
456
482
  }]
457
483
  }, "+"), uploadText ? /*#__PURE__*/_react().default.createElement(_reactNative().Text, {
458
484
  style: [styles.uploadText, {
459
- color: tokens.colors.text
485
+ color: tokens.colors.text,
486
+ fontSize: tokens.typography.uploadTextSize
460
487
  }]
461
488
  }, uploadText) : null)) : null), previewFullImage ? /*#__PURE__*/_react().default.createElement(_imagePreview.default, _extends({}, previewOptions, {
462
489
  visible: previewVisible,
@@ -483,12 +510,6 @@ const styles = _reactNative().StyleSheet.create({
483
510
  borderWidth: _reactNative().StyleSheet.hairlineWidth,
484
511
  overflow: 'hidden'
485
512
  },
486
- pressed: {
487
- opacity: 0.85
488
- },
489
- disabled: {
490
- opacity: 0.65
491
- },
492
513
  image: {
493
514
  width: '100%',
494
515
  height: '100%'
@@ -496,17 +517,12 @@ const styles = _reactNative().StyleSheet.create({
496
517
  placeholder: {
497
518
  flex: 1,
498
519
  justifyContent: 'center',
499
- alignItems: 'center',
500
- paddingHorizontal: 6
520
+ alignItems: 'center'
501
521
  },
502
522
  placeholderIcon: {
503
- fontSize: 20,
504
523
  fontWeight: '600'
505
524
  },
506
- placeholderName: {
507
- marginTop: 6,
508
- fontSize: 11
509
- },
525
+ placeholderName: {},
510
526
  cover: {
511
527
  ..._reactNative().StyleSheet.absoluteFillObject,
512
528
  justifyContent: 'center',
@@ -515,22 +531,13 @@ const styles = _reactNative().StyleSheet.create({
515
531
  status: {
516
532
  ..._reactNative().StyleSheet.absoluteFillObject,
517
533
  justifyContent: 'center',
518
- alignItems: 'center',
519
- gap: 4
520
- },
521
- statusText: {
522
- fontSize: 12
534
+ alignItems: 'center'
523
535
  },
536
+ statusText: {},
524
537
  delete: {
525
538
  position: 'absolute',
526
- top: 4,
527
- right: 4,
528
- minWidth: 20,
529
- minHeight: 20,
530
- borderRadius: 12,
531
539
  justifyContent: 'center',
532
- alignItems: 'center',
533
- paddingHorizontal: 4
540
+ alignItems: 'center'
534
541
  },
535
542
  upload: {
536
543
  borderWidth: _reactNative().StyleSheet.hairlineWidth,
@@ -539,16 +546,12 @@ const styles = _reactNative().StyleSheet.create({
539
546
  },
540
547
  uploadContent: {
541
548
  justifyContent: 'center',
542
- alignItems: 'center',
543
- gap: 4
549
+ alignItems: 'center'
544
550
  },
545
551
  uploadIcon: {
546
- fontSize: 24,
547
552
  fontWeight: '600'
548
553
  },
549
- uploadText: {
550
- fontSize: 12
551
- }
554
+ uploadText: {}
552
555
  });
553
556
  Uploader.displayName = 'Uploader';
554
557
  var _default = exports.default = Uploader;