@beppla/tapas-ui 1.5.2 → 1.5.7

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 (173) hide show
  1. package/commonjs/Alert/README.md +75 -0
  2. package/commonjs/BarChart/README.md +172 -0
  3. package/commonjs/Button/README.md +108 -0
  4. package/commonjs/Calendar/Calendar.base.js +1 -1
  5. package/commonjs/Calendar/Calendar.base.js.map +1 -1
  6. package/commonjs/Calendar/README.md +410 -0
  7. package/commonjs/Card/README.md +126 -0
  8. package/commonjs/CheckBox/README.md +147 -0
  9. package/commonjs/CircularProgress/README.md +70 -0
  10. package/commonjs/Collapsible/README.md +140 -0
  11. package/commonjs/ComboChart/README.md +124 -0
  12. package/commonjs/DashboardCard/README.md +120 -0
  13. package/commonjs/DataTable/README.md +159 -0
  14. package/commonjs/DeviceSelectionModal/README.md +124 -0
  15. package/commonjs/DraggableFlatList/README.md +35 -0
  16. package/commonjs/Drawer/README.md +175 -0
  17. package/commonjs/Dropdown/Dropdown.js +60 -30
  18. package/commonjs/Dropdown/Dropdown.js.map +1 -1
  19. package/commonjs/Dropdown/README.md +230 -0
  20. package/commonjs/ExternalLink/README.md +81 -0
  21. package/commonjs/Gantt/README.md +155 -0
  22. package/commonjs/Grid/README.md +197 -0
  23. package/commonjs/Header/README.md +109 -0
  24. package/commonjs/HelloWave/README.md +28 -0
  25. package/commonjs/Hoverable/Hoverable.js.map +1 -1
  26. package/commonjs/IconText/README.md +99 -0
  27. package/commonjs/Image/PreviewImg/README.md +100 -0
  28. package/commonjs/Image/README.md +88 -0
  29. package/commonjs/Input/Input.js +60 -4
  30. package/commonjs/Input/Input.js.map +1 -1
  31. package/commonjs/Layout/README.md +174 -0
  32. package/commonjs/LineChart/README.md +181 -0
  33. package/commonjs/ListItem/README.md +122 -0
  34. package/commonjs/MessageBox/MessageBox.js +7 -1
  35. package/commonjs/MessageBox/MessageBox.js.map +1 -1
  36. package/commonjs/MessageBox/README.md +120 -0
  37. package/commonjs/Navigation/README.md +197 -0
  38. package/commonjs/NumericInput/README.md +95 -0
  39. package/commonjs/Overlay/README.md +84 -0
  40. package/commonjs/Pagination/README.md +106 -0
  41. package/commonjs/PieChart/README.md +212 -0
  42. package/commonjs/Popover/README.md +82 -0
  43. package/commonjs/Progress/README.md +106 -0
  44. package/commonjs/RadioButton/README.md +85 -0
  45. package/commonjs/ScanButton/README.md +72 -0
  46. package/commonjs/SearchInput/SearchInput.js.map +1 -1
  47. package/commonjs/SheetTitle/README.md +89 -0
  48. package/commonjs/Shell/README.md +152 -0
  49. package/commonjs/Shell/Shell.js.map +1 -1
  50. package/commonjs/StatisticCard/README.md +129 -0
  51. package/commonjs/Status/README.md +75 -0
  52. package/commonjs/Steps/README.md +76 -0
  53. package/commonjs/Switch/Switch.js +101 -0
  54. package/commonjs/Switch/Switch.js.map +1 -0
  55. package/commonjs/Tab/README.md +161 -0
  56. package/commonjs/Tag/README.md +93 -0
  57. package/commonjs/Task/README.md +110 -0
  58. package/commonjs/Text/README.md +97 -0
  59. package/commonjs/TextArea/README.md +127 -0
  60. package/commonjs/TextArea/TextArea.js +4 -2
  61. package/commonjs/TextArea/TextArea.js.map +1 -1
  62. package/commonjs/Theme/README.md +161 -0
  63. package/commonjs/Theme/makeStyles.js +30 -0
  64. package/commonjs/Theme/makeStyles.js.map +1 -0
  65. package/commonjs/Theme/withTheme.js +91 -0
  66. package/commonjs/Theme/withTheme.js.map +1 -0
  67. package/commonjs/Timeline/README.md +111 -0
  68. package/commonjs/Toast/README.md +96 -0
  69. package/commonjs/Upload/Upload.js +126 -0
  70. package/commonjs/Upload/Upload.js.map +1 -0
  71. package/commonjs/index.js +24 -4
  72. package/commonjs/index.js.map +1 -1
  73. package/module/Alert/README.md +75 -0
  74. package/module/BarChart/README.md +172 -0
  75. package/module/Button/README.md +108 -0
  76. package/module/Calendar/Calendar.base.js +1 -1
  77. package/module/Calendar/Calendar.base.js.map +1 -1
  78. package/module/Calendar/README.md +410 -0
  79. package/module/Card/README.md +126 -0
  80. package/module/CheckBox/README.md +147 -0
  81. package/module/CircularProgress/README.md +70 -0
  82. package/module/Collapsible/README.md +140 -0
  83. package/module/ComboChart/README.md +124 -0
  84. package/module/DashboardCard/README.md +120 -0
  85. package/module/DataTable/README.md +159 -0
  86. package/module/DeviceSelectionModal/README.md +124 -0
  87. package/module/DraggableFlatList/README.md +35 -0
  88. package/module/Drawer/README.md +175 -0
  89. package/module/Dropdown/Dropdown.js +60 -30
  90. package/module/Dropdown/Dropdown.js.map +1 -1
  91. package/module/Dropdown/README.md +230 -0
  92. package/module/ExternalLink/README.md +81 -0
  93. package/module/Gantt/README.md +155 -0
  94. package/module/Grid/README.md +197 -0
  95. package/module/Header/README.md +109 -0
  96. package/module/HelloWave/README.md +28 -0
  97. package/module/Hoverable/Hoverable.js.map +1 -1
  98. package/module/IconText/README.md +99 -0
  99. package/module/Image/PreviewImg/README.md +100 -0
  100. package/module/Image/README.md +88 -0
  101. package/module/Input/Input.js +60 -4
  102. package/module/Input/Input.js.map +1 -1
  103. package/module/Layout/README.md +174 -0
  104. package/module/LineChart/README.md +181 -0
  105. package/module/ListItem/README.md +122 -0
  106. package/module/MessageBox/MessageBox.js +8 -2
  107. package/module/MessageBox/MessageBox.js.map +1 -1
  108. package/module/MessageBox/README.md +120 -0
  109. package/module/Navigation/README.md +197 -0
  110. package/module/NumericInput/README.md +95 -0
  111. package/module/Overlay/README.md +84 -0
  112. package/module/Pagination/README.md +106 -0
  113. package/module/PieChart/README.md +212 -0
  114. package/module/Popover/README.md +82 -0
  115. package/module/Progress/README.md +106 -0
  116. package/module/RadioButton/README.md +85 -0
  117. package/module/ScanButton/README.md +72 -0
  118. package/module/SearchInput/SearchInput.js.map +1 -1
  119. package/module/SheetTitle/README.md +89 -0
  120. package/module/Shell/README.md +152 -0
  121. package/module/Shell/Shell.js.map +1 -1
  122. package/module/StatisticCard/README.md +129 -0
  123. package/module/Status/README.md +75 -0
  124. package/module/Steps/README.md +76 -0
  125. package/module/Switch/Switch.js +96 -0
  126. package/module/Switch/Switch.js.map +1 -0
  127. package/module/Tab/README.md +161 -0
  128. package/module/Tag/README.md +93 -0
  129. package/module/Task/README.md +110 -0
  130. package/module/Text/README.md +97 -0
  131. package/module/TextArea/README.md +127 -0
  132. package/module/TextArea/TextArea.js +4 -2
  133. package/module/TextArea/TextArea.js.map +1 -1
  134. package/module/Theme/README.md +161 -0
  135. package/module/Theme/makeStyles.js +24 -0
  136. package/module/Theme/makeStyles.js.map +1 -0
  137. package/module/Theme/withTheme.js +82 -0
  138. package/module/Theme/withTheme.js.map +1 -0
  139. package/module/Timeline/README.md +111 -0
  140. package/module/Toast/README.md +96 -0
  141. package/module/Upload/Upload.js +121 -0
  142. package/module/Upload/Upload.js.map +1 -0
  143. package/module/index.js +11 -3
  144. package/module/index.js.map +1 -1
  145. package/package.json +1 -1
  146. package/typescript/Dropdown/Dropdown.d.ts +20 -0
  147. package/typescript/Dropdown/Dropdown.d.ts.map +1 -1
  148. package/typescript/Grid/FixedSizeGrid.d.ts +1 -3
  149. package/typescript/Grid/FixedSizeGrid.d.ts.map +1 -1
  150. package/typescript/Grid/Grid.base.d.ts +1 -3
  151. package/typescript/Grid/Grid.base.d.ts.map +1 -1
  152. package/typescript/Grid/VariableSizeGrid.d.ts +1 -3
  153. package/typescript/Grid/VariableSizeGrid.d.ts.map +1 -1
  154. package/typescript/Input/Input.d.ts +5 -0
  155. package/typescript/Input/Input.d.ts.map +1 -1
  156. package/typescript/MessageBox/MessageBox.d.ts.map +1 -1
  157. package/typescript/SearchInput/SearchInput.d.ts +4 -0
  158. package/typescript/SearchInput/SearchInput.d.ts.map +1 -1
  159. package/typescript/Switch/Switch.d.ts +15 -0
  160. package/typescript/Switch/Switch.d.ts.map +1 -0
  161. package/typescript/TextArea/TextArea.d.ts +2 -0
  162. package/typescript/TextArea/TextArea.d.ts.map +1 -1
  163. package/typescript/Theme/makeStyles.d.ts +11 -0
  164. package/typescript/Theme/makeStyles.d.ts.map +1 -0
  165. package/typescript/Theme/withTheme.d.ts +12 -0
  166. package/typescript/Theme/withTheme.d.ts.map +1 -0
  167. package/typescript/Upload/Upload.d.ts +25 -0
  168. package/typescript/Upload/Upload.d.ts.map +1 -0
  169. package/typescript/WebViewBridge/useWebViewBridge.d.ts +1 -1
  170. package/typescript/WebViewBridge/useWebViewBridge.d.ts.map +1 -1
  171. package/typescript/common/hooks/useBridgelessFix.d.ts +1 -1
  172. package/typescript/index.d.ts +8 -2
  173. package/typescript/index.d.ts.map +1 -1
@@ -0,0 +1,129 @@
1
+ # StatisticCard
2
+
3
+ 统计卡片组件,用于展示关键指标和数据,支持趋势指示、前缀/后缀、图标等功能。适用于仪表板、数据大屏和统计报表。
4
+
5
+ ## 功能特性
6
+
7
+ - ✅ 数值展示,支持前缀(如 $)和后缀(如 %)
8
+ - ✅ 趋势指示器:正向增长绿色(#00B894)、负向下降红色(#D63031)
9
+ - ✅ 趋势百分比自动格式化(1 位小数,带 +/- 符号)
10
+ - ✅ 支持自定义图标(React 节点,显示在右上角)
11
+ - ✅ 支持描述文本
12
+ - ✅ 加载状态(loading),显示 "Loading..." 替代数值
13
+ - ✅ 可点击交互:有 onPress 时自动切换为 TouchableOpacity
14
+ - ✅ 自定义数值颜色
15
+ - ✅ 基于 Card 组件封装,最小高度 120px
16
+
17
+ ## 安装使用
18
+
19
+ ```tsx
20
+ import { StatisticCard } from '@beppla/tapas-ui/components/StatisticCard';
21
+ ```
22
+
23
+ ## Props
24
+
25
+ | 属性 | 类型 | 默认值 | 说明 |
26
+ |------|------|--------|------|
27
+ | title | `string` | (必填) | 指标标题 |
28
+ | value | `string \| number` | (必填) | 指标数值 |
29
+ | prefix | `string` | `''` | 数值前缀(如 $、EUR) |
30
+ | suffix | `string` | `''` | 数值后缀(如 %、单) |
31
+ | trend | `{ value: number; isPositive?: boolean }` | - | 趋势数据 |
32
+ | description | `string` | - | 描述文本 |
33
+ | icon | `React.ReactNode` | - | 右上角图标(任意 React 节点) |
34
+ | color | `string` | `'#FF6B00'` | 数值颜色 |
35
+ | onPress | `() => void` | - | 点击回调 |
36
+ | loading | `boolean` | `false` | 是否加载中 |
37
+ | style | `any` | - | 自定义样式 |
38
+
39
+ ## 使用示例
40
+
41
+ ### 基础用法
42
+
43
+ ```tsx
44
+ <StatisticCard title="Total Sales" value="1,234" />
45
+ ```
46
+
47
+ ### 带前缀和后缀
48
+
49
+ ```tsx
50
+ <StatisticCard title="Revenue" value="12,345" prefix="$" />
51
+ <StatisticCard title="Growth Rate" value="15.8" suffix="%" />
52
+ ```
53
+
54
+ ### 带趋势指示
55
+
56
+ ```tsx
57
+ <StatisticCard
58
+ title="Monthly Revenue"
59
+ value="45,678"
60
+ prefix="$"
61
+ trend={{ value: 12.5, isPositive: true }}
62
+ description="Compared to last month"
63
+ />
64
+
65
+ <StatisticCard
66
+ title="Error Rate"
67
+ value="2.3"
68
+ suffix="%"
69
+ trend={{ value: 5.2, isPositive: false }}
70
+ description="Compared to last week"
71
+ color="#D63031"
72
+ />
73
+ ```
74
+
75
+ ### 带图标
76
+
77
+ ```tsx
78
+ import TapasIcon from '@beppla/tapas-ui/components/Icons/TapasIcon';
79
+
80
+ <StatisticCard
81
+ title="Total Orders"
82
+ value="8,456"
83
+ icon={<TapasIcon name="shopping_cart" size={24} color="#FF6B00" />}
84
+ trend={{ value: 8.3, isPositive: true }}
85
+ />
86
+ ```
87
+
88
+ ### 仪表板组合
89
+
90
+ ```tsx
91
+ <View style={{ flexDirection: 'row', flexWrap: 'wrap', gap: 16 }}>
92
+ <StatisticCard
93
+ title="Total Revenue"
94
+ value="123,456"
95
+ prefix="$"
96
+ trend={{ value: 15.3, isPositive: true }}
97
+ description="Last 30 days"
98
+ color="#FF6B00"
99
+ />
100
+ <StatisticCard
101
+ title="New Users"
102
+ value="1,234"
103
+ trend={{ value: 8.2, isPositive: true }}
104
+ color="#0066CC"
105
+ />
106
+ <StatisticCard
107
+ title="Conversion Rate"
108
+ value="3.45"
109
+ suffix="%"
110
+ trend={{ value: 2.1, isPositive: false }}
111
+ color="#00B894"
112
+ />
113
+ </View>
114
+ ```
115
+
116
+ ### 加载中
117
+
118
+ ```tsx
119
+ <StatisticCard title="Loading Data" value="0" loading />
120
+ ```
121
+
122
+ ## 注意事项
123
+
124
+ - `title` 和 `value` 为必填属性
125
+ - `trend.isPositive` 默认为 `true`(不传或传 `undefined` 时视为正向)
126
+ - 趋势值显示精度为小数点后 1 位(`toFixed(1)`)
127
+ - 加载状态显示 "Loading..." 文本,不渲染数值和趋势
128
+ - 有 `onPress` 时容器变为 TouchableOpacity(activeOpacity=0.7),无 `onPress` 时为 View
129
+ - 默认数值颜色为橙色(#FF6B00),可通过 `color` 自定义
@@ -0,0 +1,75 @@
1
+ # Status
2
+
3
+ 状态标签组件,用于展示不同类型的状态信息。支持 point(圆点)和 solid(填充)两种显示模式。
4
+
5
+ ## 功能特性
6
+
7
+ - ✅ 支持 6 种状态类型:success、error、warning、waiting、unavailable、disabled
8
+ - ✅ 支持 point 模式(圆点 + 文字)和 solid 模式(带边框文字)
9
+ - ✅ 自动首字母大写显示
10
+ - ✅ 各状态类型使用主题色渲染
11
+ - ✅ 空标签自动返回 null,不渲染
12
+ - ✅ 支持自定义样式覆盖
13
+ - ✅ 支持 testID 属性用于测试
14
+ - ✅ 使用 React.memo 优化渲染性能
15
+
16
+ ## 安装使用
17
+
18
+ ```tsx
19
+ import Status from '@beppla/tapas-ui/components/Status/Status';
20
+ // 或具名导出
21
+ import { StatusTag } from '@beppla/tapas-ui/components/Status/Status';
22
+ ```
23
+
24
+ ## Props
25
+
26
+ | 属性 | 类型 | 默认值 | 说明 |
27
+ |------|------|--------|------|
28
+ | tag | `string` | - | 状态文字 |
29
+ | type | `STATUS_TYPE` | - | 状态类型 |
30
+ | mode | `'point' \| 'solid'` | `'point'` | 显示模式 |
31
+ | testID | `string` | - | 测试标识 |
32
+ | styles | `StyleProp<ViewStyle>` | - | 自定义容器样式 |
33
+
34
+ ### STATUS_TYPE
35
+
36
+ ```ts
37
+ type STATUS_TYPE = 'success' | 'error' | 'warning' | 'waiting' | 'unavailable' | 'disabled';
38
+ ```
39
+
40
+ ## 使用示例
41
+
42
+ ### Point 模式(圆点 + 文字)
43
+
44
+ ```tsx
45
+ <Status tag="Active" type="success" mode="point" />
46
+ <Status tag="Error" type="error" mode="point" />
47
+ <Status tag="Warning" type="warning" mode="point" />
48
+ <Status tag="Waiting" type="waiting" mode="point" />
49
+ ```
50
+
51
+ ### Solid 模式(带边框文字)
52
+
53
+ ```tsx
54
+ <Status tag="Available" type="success" mode="solid" />
55
+ <Status tag="Cancelled" type="error" mode="solid" />
56
+ <Status tag="Pending" type="warning" mode="solid" />
57
+ ```
58
+
59
+ ### 全部状态类型
60
+
61
+ ```tsx
62
+ {(['success', 'error', 'warning', 'waiting', 'unavailable', 'disabled'] as STATUS_TYPE[]).map(
63
+ (type) => (
64
+ <Status key={type} type={type} tag={type} mode="point" />
65
+ )
66
+ )}
67
+ ```
68
+
69
+ ## 注意事项
70
+
71
+ - `tag` 为空字符串时组件不渲染(返回 null)
72
+ - 标签文字会自动首字母大写(通过 `capitalizeFirstLetter` 处理)
73
+ - point 模式下圆点为 8x8 像素,带圆角
74
+ - solid 模式使用边框 + 文字颜色,不填充背景
75
+ - waiting 状态在 point 模式下有特殊样式(使用边框而非背景色)
@@ -0,0 +1,76 @@
1
+ # Steps
2
+
3
+ 步骤条组件,用于展示多步骤流程的当前进度。步骤编号以圆形展示,已完成步骤显示对勾图标,步骤之间以连接线相连,支持点击已完成和当前步骤进行导航。
4
+
5
+ ## 功能特性
6
+
7
+ - ✅ 多步骤流程展示
8
+ - ✅ 三种步骤状态:完成(对勾图标)、当前(高亮)、待完成(灰色编号)
9
+ - ✅ 步骤间连接线颜色跟随状态变化
10
+ - ✅ 支持点击已完成/当前步骤进行导航
11
+ - ✅ 待完成步骤不可点击
12
+ - ✅ 横向排列布局
13
+ - ✅ 主题色适配(品牌色高亮)
14
+ - ✅ React.memo 优化性能
15
+
16
+ ## 安装使用
17
+
18
+ ```tsx
19
+ import { Steps } from '@beppla/tapas-ui';
20
+ ```
21
+
22
+ ## Props
23
+
24
+ | 属性 | 类型 | 默认值 | 说明 |
25
+ |------|------|--------|------|
26
+ | steps | `{ title: string; description?: string }[]` | `[]` | 步骤配置数组(必填) |
27
+ | currentStep | `number` | - | 当前步骤索引,从 0 开始(必填) |
28
+ | onPressStep | `(step: number) => void` | - | 步骤点击回调,参数为步骤编号(从 1 开始)(必填) |
29
+ | testID | `string` | - | 测试标识 |
30
+
31
+ ## 使用示例
32
+
33
+ ### 基础用法
34
+
35
+ ```tsx
36
+ const steps = [
37
+ { title: 'Step 1' },
38
+ { title: 'Step 2' },
39
+ { title: 'Step 3' },
40
+ ];
41
+
42
+ <Steps
43
+ steps={steps}
44
+ currentStep={1}
45
+ onPressStep={(step) => console.log('Navigate to step:', step)}
46
+ />
47
+ ```
48
+
49
+ ### 全部完成
50
+
51
+ ```tsx
52
+ <Steps
53
+ steps={[{ title: 'Info' }, { title: 'Payment' }, { title: 'Done' }]}
54
+ currentStep={3}
55
+ onPressStep={handleStepPress}
56
+ />
57
+ ```
58
+
59
+ ### 第一步
60
+
61
+ ```tsx
62
+ <Steps
63
+ steps={[{ title: 'Cart' }, { title: 'Checkout' }, { title: 'Confirm' }]}
64
+ currentStep={0}
65
+ onPressStep={handleStepPress}
66
+ />
67
+ ```
68
+
69
+ ## 注意事项
70
+
71
+ - `currentStep` 从 0 开始索引,0 表示第一步为当前步骤
72
+ - `onPressStep` 回调参数为步骤编号(从 1 开始),与界面展示一致
73
+ - 仅已完成和当前步骤可点击,待完成步骤点击无响应
74
+ - 步骤圆形尺寸固定 28x28,连接线宽度 76px
75
+ - `title` 和 `description` 在当前实现中仅用于数据传递,界面展示为编号/对勾
76
+ - 需在 `ThemeProvider` 内使用
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+
3
+ import React, { useEffect, useRef } from 'react';
4
+ import { View, TouchableOpacity, Animated } from 'react-native';
5
+ import { makeStyles, withTheme } from '@rneui/themed';
6
+ import { jsx as _jsx } from "react/jsx-runtime";
7
+ const TapasSwitch = ({
8
+ trackColor,
9
+ thumbColor,
10
+ width = 56,
11
+ height = 32,
12
+ onValueChange,
13
+ value,
14
+ disabled,
15
+ testID,
16
+ containerStyle
17
+ }) => {
18
+ const styles = useStyles();
19
+ const leftAnim = useRef(new Animated.Value(value ? width - height - 1 : 3)).current;
20
+ useEffect(() => {
21
+ Animated.timing(leftAnim, {
22
+ toValue: value ? width - height - 1 : 3,
23
+ duration: 200,
24
+ useNativeDriver: false
25
+ }).start();
26
+ }, [value, width, height, leftAnim]);
27
+ const thumbSize = height - 6;
28
+ return /*#__PURE__*/_jsx(View, {
29
+ style: [styles.container, containerStyle],
30
+ children: /*#__PURE__*/_jsx(TouchableOpacity, {
31
+ testID: testID,
32
+ activeOpacity: 0.8,
33
+ onPress: () => {
34
+ if (!disabled && onValueChange) {
35
+ onValueChange(!value);
36
+ }
37
+ },
38
+ style: [styles.track, {
39
+ width,
40
+ height,
41
+ borderRadius: height / 2,
42
+ backgroundColor: value ? trackColor?.true ?? (disabled ? styles.disabledOnBg.backgroundColor : styles.onBg.backgroundColor) : trackColor?.false ?? (disabled ? styles.disabledOffBg.backgroundColor : styles.offBg.backgroundColor),
43
+ opacity: disabled ? 0.6 : 1
44
+ }],
45
+ children: /*#__PURE__*/_jsx(Animated.View, {
46
+ style: [{
47
+ width: thumbSize,
48
+ height: thumbSize,
49
+ borderRadius: thumbSize / 2,
50
+ backgroundColor: thumbColor ?? styles.thumb.backgroundColor,
51
+ transform: [{
52
+ translateX: leftAnim
53
+ }]
54
+ }, !disabled && styles.shadow]
55
+ })
56
+ })
57
+ });
58
+ };
59
+ const useStyles = makeStyles(theme => ({
60
+ container: {
61
+ justifyContent: 'center',
62
+ alignItems: 'center'
63
+ },
64
+ track: {
65
+ padding: 3,
66
+ justifyContent: 'center',
67
+ position: 'relative'
68
+ },
69
+ onBg: {
70
+ backgroundColor: theme.colors.success
71
+ },
72
+ offBg: {
73
+ backgroundColor: theme.colors.grey3
74
+ },
75
+ disabledOnBg: {
76
+ backgroundColor: theme.colors.grey3
77
+ },
78
+ disabledOffBg: {
79
+ backgroundColor: theme.colors.grey4
80
+ },
81
+ thumb: {
82
+ backgroundColor: theme.colors.white
83
+ },
84
+ shadow: {
85
+ shadowColor: 'rgba(0, 0, 0, 0.12)',
86
+ shadowOffset: {
87
+ width: 0,
88
+ height: 4
89
+ },
90
+ shadowOpacity: 0.12,
91
+ shadowRadius: 16,
92
+ elevation: 8
93
+ }
94
+ }));
95
+ export default withTheme(/*#__PURE__*/React.memo(TapasSwitch));
96
+ //# sourceMappingURL=Switch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","useEffect","useRef","View","TouchableOpacity","Animated","makeStyles","withTheme","jsx","_jsx","TapasSwitch","trackColor","thumbColor","width","height","onValueChange","value","disabled","testID","containerStyle","styles","useStyles","leftAnim","Value","current","timing","toValue","duration","useNativeDriver","start","thumbSize","style","container","children","activeOpacity","onPress","track","borderRadius","backgroundColor","true","disabledOnBg","onBg","false","disabledOffBg","offBg","opacity","thumb","transform","translateX","shadow","theme","justifyContent","alignItems","padding","position","colors","success","grey3","grey4","white","shadowColor","shadowOffset","shadowOpacity","shadowRadius","elevation","memo"],"sourceRoot":"../../../components","sources":["Switch/Switch.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,161 @@
1
+ # TapasTab
2
+
3
+ Tab 标签页组件,扩展 `@rneui/themed` 的 Tab 组件,新增 `content` 宽度模式,支持根据标签文本内容自适应宽度,而非默认的平分容器宽度。
4
+
5
+ ## 功能特性
6
+
7
+ - 两种宽度模式:`fill`(平分容器宽度)和 `content`(内容自适应宽度)
8
+ - `content` 模式下自动启用水平滚动(`scrollable`)
9
+ - 可配置标签最小宽度(`minTabWidth`)和最大宽度(`maxTabWidth`)
10
+ - 可配置内容模式下的水平内边距(`contentPadding`)
11
+ - 底部分隔线显示控制和颜色自定义
12
+ - 文本超出时自动省略号处理(Web 端 `text-overflow: ellipsis`)
13
+ - 完全兼容 `@rneui/themed` Tab 的所有原生属性
14
+ - `TapasTab.Item` 直接复用 `@rneui Tab.Item`
15
+
16
+ ## 安装使用
17
+
18
+ ```tsx
19
+ import { TapasTab } from '@beppla/tapas-ui';
20
+ ```
21
+
22
+ ## Props
23
+
24
+ | 属性 | 类型 | 默认值 | 说明 |
25
+ |------|------|--------|------|
26
+ | value | `number` | - | 当前选中标签索引(受控,必填) |
27
+ | onChange | `(value: number) => void` | - | 标签切换回调(必填) |
28
+ | widthMode | `'fill' \| 'content'` | `'fill'` | 宽度模式 |
29
+ | minTabWidth | `number` | - | content 模式下标签最小宽度(像素) |
30
+ | maxTabWidth | `number` | - | content 模式下标签最大宽度(像素) |
31
+ | contentPadding | `number` | `16` | content 模式下标签水平内边距 |
32
+ | showDivider | `boolean` | `true` | 是否显示底部分隔线(仅 content 模式) |
33
+ | dividerColor | `string` | `'#e0e0e0'` | 底部分隔线颜色 |
34
+ | containerStyle | `StyleProp<ViewStyle>` | - | 容器自定义样式 |
35
+ | buttonStyle | `StyleProp<ViewStyle>` | - | 按钮自定义样式 |
36
+ | indicatorStyle | `StyleProp<ViewStyle>` | - | 指示器自定义样式 |
37
+ | titleStyle | `StyleProp<TextStyle>` | - | 标题文本自定义样式 |
38
+ | children | `React.ReactElement<TabItemProps>[]` | - | TapasTab.Item 子组件 |
39
+
40
+ ## 使用示例
41
+
42
+ ### 基础平分模式(默认)
43
+
44
+ ```tsx
45
+ import { TapasTab } from '@beppla/tapas-ui';
46
+ import { useState } from 'react';
47
+
48
+ export default function App() {
49
+ const [index, setIndex] = useState(0);
50
+
51
+ return (
52
+ <TapasTab value={index} onChange={setIndex}>
53
+ <TapasTab.Item title="Tab 1" />
54
+ <TapasTab.Item title="Tab 2" />
55
+ <TapasTab.Item title="Tab 3" />
56
+ </TapasTab>
57
+ );
58
+ }
59
+ ```
60
+
61
+ ### 内容自适应模式
62
+
63
+ ```tsx
64
+ <TapasTab value={index} onChange={setIndex} widthMode="content">
65
+ <TapasTab.Item title="Short" />
66
+ <TapasTab.Item title="Medium Length" />
67
+ <TapasTab.Item title="This is a very long tab label" />
68
+ </TapasTab>
69
+ ```
70
+
71
+ ### 带最小/最大宽度控制
72
+
73
+ ```tsx
74
+ <TapasTab
75
+ value={index}
76
+ onChange={setIndex}
77
+ widthMode="content"
78
+ minTabWidth={80}
79
+ maxTabWidth={180}
80
+ >
81
+ <TapasTab.Item title="Short" />
82
+ <TapasTab.Item title="Medium" />
83
+ <TapasTab.Item title="Very long label text here" />
84
+ </TapasTab>
85
+ ```
86
+
87
+ ### 自定义内边距
88
+
89
+ ```tsx
90
+ <TapasTab
91
+ value={index}
92
+ onChange={setIndex}
93
+ widthMode="content"
94
+ contentPadding={30}
95
+ >
96
+ <TapasTab.Item title="Home" />
97
+ <TapasTab.Item title="Products" />
98
+ <TapasTab.Item title="Orders" />
99
+ </TapasTab>
100
+ ```
101
+
102
+ ### 实际应用场景(商品管理导航)
103
+
104
+ ```tsx
105
+ import { TapasTab } from '@beppla/tapas-ui';
106
+ import { useState } from 'react';
107
+ import { View, Text } from 'react-native';
108
+
109
+ const tabs = ['All', 'Pending', 'Published', 'Unpublished', 'Low Stock'];
110
+
111
+ export default function ProductTabs() {
112
+ const [index, setIndex] = useState(0);
113
+
114
+ return (
115
+ <View>
116
+ <TapasTab
117
+ value={index}
118
+ onChange={setIndex}
119
+ widthMode="content"
120
+ minTabWidth={60}
121
+ contentPadding={20}
122
+ >
123
+ {tabs.map((tab, i) => (
124
+ <TapasTab.Item key={i} title={tab} />
125
+ ))}
126
+ </TapasTab>
127
+ <View style={{ padding: 16 }}>
128
+ <Text>{tabs[index]} content here</Text>
129
+ </View>
130
+ </View>
131
+ );
132
+ }
133
+ ```
134
+
135
+ ### 自定义样式
136
+
137
+ ```tsx
138
+ <TapasTab
139
+ value={index}
140
+ onChange={setIndex}
141
+ widthMode="fill"
142
+ containerStyle={{ backgroundColor: '#f5f5f5' }}
143
+ buttonStyle={{ paddingVertical: 12 }}
144
+ titleStyle={{ fontSize: 14, fontWeight: '600' }}
145
+ indicatorStyle={{ backgroundColor: '#1976d2', height: 3 }}
146
+ >
147
+ <TapasTab.Item title="Tab 1" />
148
+ <TapasTab.Item title="Tab 2" />
149
+ </TapasTab>
150
+ ```
151
+
152
+ ## 注意事项
153
+
154
+ - `fill` 模式(默认)将标签平均分配容器宽度,与原生 `@rneui Tab` 行为一致
155
+ - `content` 模式根据文本内容动态调整每个标签宽度,自动启用水平滚动
156
+ - `minTabWidth` 和 `maxTabWidth` 仅在 `widthMode='content'` 时生效
157
+ - `content` 模式下,`buttonStyle` 和 `titleStyle` 会自动注入到每个 `TapasTab.Item`
158
+ - `showDivider` 仅在 `content` 模式下生效,通过外层 View 的 `borderBottomWidth` 实现
159
+ - 在 `content` 模式下,文本自动设置为不换行(Web `whiteSpace: nowrap`)并显示省略号
160
+ - `TapasTab.Item` 是 `@rneui Tab.Item` 的直接引用,支持所有 `TabItemProps`
161
+ - `containerStyle` 在 `content` 模式下会自动追加 `width: '100%'`
@@ -0,0 +1,93 @@
1
+ # Tag
2
+
3
+ 标签组件,用于标记和分类信息。支持关闭按钮、多种尺寸和禁用状态。
4
+
5
+ ## 功能特性
6
+
7
+ - ✅ 支持三种尺寸:small(32px)、middle(36px)、large(40px)
8
+ - ✅ 可选的关闭按钮,支持点击关闭回调
9
+ - ✅ 支持禁用状态,禁用时关闭按钮不可点击
10
+ - ✅ 文字超出宽度自动省略(可设置最大宽度)
11
+ - ✅ 胶囊形圆角样式
12
+ - ✅ 灰色背景,主题色文字
13
+ - ✅ 使用 React.memo 优化渲染性能
14
+ - ✅ 支持无障碍标签(accessibilityRole="button")
15
+
16
+ ## 安装使用
17
+
18
+ ```tsx
19
+ import Tag from '@beppla/tapas-ui/components/Tag/Tag';
20
+ ```
21
+
22
+ ## Props
23
+
24
+ | 属性 | 类型 | 默认值 | 说明 |
25
+ |------|------|--------|------|
26
+ | children | `React.ReactNode` | - | 标签内容 |
27
+ | closable | `boolean` | `true` | 是否显示关闭按钮 |
28
+ | onClose | `() => void` | - | 关闭按钮点击回调 |
29
+ | style | `StyleProp<ViewStyle>` | - | 自定义容器样式 |
30
+ | size | `'small' \| 'middle' \| 'large'` | `'large'` | 标签尺寸 |
31
+ | textMaxWidth | `number` | `226` | 文字最大宽度 |
32
+ | disabled | `boolean` | `false` | 是否禁用 |
33
+
34
+ ## 使用示例
35
+
36
+ ### 基础用法
37
+
38
+ ```tsx
39
+ <Tag>标签文字</Tag>
40
+ ```
41
+
42
+ ### 可关闭标签
43
+
44
+ ```tsx
45
+ <Tag closable onClose={() => console.log('closed')}>
46
+ 可关闭
47
+ </Tag>
48
+ ```
49
+
50
+ ### 不同尺寸
51
+
52
+ ```tsx
53
+ <Tag size="small">Small</Tag>
54
+ <Tag size="middle">Middle</Tag>
55
+ <Tag size="large">Large</Tag>
56
+ ```
57
+
58
+ ### 禁用状态
59
+
60
+ ```tsx
61
+ <Tag disabled>禁用标签</Tag>
62
+ ```
63
+
64
+ ### 标签列表(可删除)
65
+
66
+ ```tsx
67
+ const [list, setList] = useState([
68
+ { name: '标签1', value: '1' },
69
+ { name: '标签2', value: '2' },
70
+ ]);
71
+
72
+ <View style={{ flexDirection: 'row' }}>
73
+ {list.map((item, idx) => (
74
+ <Tag
75
+ key={item.value}
76
+ onClose={() => {
77
+ const newList = [...list];
78
+ newList.splice(idx, 1);
79
+ setList(newList);
80
+ }}
81
+ >
82
+ {item.name}
83
+ </Tag>
84
+ ))}
85
+ </View>
86
+ ```
87
+
88
+ ## 注意事项
89
+
90
+ - 默认 `closable` 为 `true`,如不需要关闭按钮请显式设置为 `false`
91
+ - 禁用状态下关闭图标仍然显示,但不可点击
92
+ - `textMaxWidth` 默认为 226,超出文字会被裁剪(overflow: hidden)
93
+ - 标签之间默认有 `marginRight: 8` 和 `marginBottom: 8` 的间距