@beppla/tapas-ui 1.5.2 → 1.5.6
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.
- package/commonjs/Alert/README.md +75 -0
- package/commonjs/BarChart/README.md +172 -0
- package/commonjs/Button/README.md +108 -0
- package/commonjs/Calendar/Calendar.base.js +1 -1
- package/commonjs/Calendar/Calendar.base.js.map +1 -1
- package/commonjs/Calendar/README.md +410 -0
- package/commonjs/Card/README.md +126 -0
- package/commonjs/CheckBox/README.md +147 -0
- package/commonjs/CircularProgress/README.md +70 -0
- package/commonjs/Collapsible/README.md +140 -0
- package/commonjs/ComboChart/README.md +124 -0
- package/commonjs/DashboardCard/README.md +120 -0
- package/commonjs/DataTable/README.md +159 -0
- package/commonjs/DeviceSelectionModal/README.md +124 -0
- package/commonjs/DraggableFlatList/README.md +35 -0
- package/commonjs/Drawer/README.md +175 -0
- package/commonjs/Dropdown/README.md +230 -0
- package/commonjs/ExternalLink/README.md +81 -0
- package/commonjs/Gantt/README.md +155 -0
- package/commonjs/Grid/README.md +197 -0
- package/commonjs/Header/README.md +109 -0
- package/commonjs/HelloWave/README.md +28 -0
- package/commonjs/Hoverable/Hoverable.js.map +1 -1
- package/commonjs/IconText/README.md +99 -0
- package/commonjs/Image/PreviewImg/README.md +100 -0
- package/commonjs/Image/README.md +88 -0
- package/commonjs/Input/Input.js +60 -4
- package/commonjs/Input/Input.js.map +1 -1
- package/commonjs/Layout/README.md +174 -0
- package/commonjs/LineChart/README.md +181 -0
- package/commonjs/ListItem/README.md +122 -0
- package/commonjs/MessageBox/MessageBox.js +7 -1
- package/commonjs/MessageBox/MessageBox.js.map +1 -1
- package/commonjs/MessageBox/README.md +120 -0
- package/commonjs/Navigation/README.md +197 -0
- package/commonjs/NumericInput/README.md +95 -0
- package/commonjs/Overlay/README.md +84 -0
- package/commonjs/Pagination/README.md +106 -0
- package/commonjs/PieChart/README.md +212 -0
- package/commonjs/Popover/README.md +82 -0
- package/commonjs/Progress/README.md +106 -0
- package/commonjs/RadioButton/README.md +85 -0
- package/commonjs/ScanButton/README.md +72 -0
- package/commonjs/SearchInput/SearchInput.js.map +1 -1
- package/commonjs/SheetTitle/README.md +89 -0
- package/commonjs/Shell/README.md +152 -0
- package/commonjs/Shell/Shell.js.map +1 -1
- package/commonjs/StatisticCard/README.md +129 -0
- package/commonjs/Status/README.md +75 -0
- package/commonjs/Steps/README.md +76 -0
- package/commonjs/Switch/Switch.js +101 -0
- package/commonjs/Switch/Switch.js.map +1 -0
- package/commonjs/Tab/README.md +161 -0
- package/commonjs/Tag/README.md +93 -0
- package/commonjs/Task/README.md +110 -0
- package/commonjs/Text/README.md +97 -0
- package/commonjs/TextArea/README.md +127 -0
- package/commonjs/TextArea/TextArea.js +4 -2
- package/commonjs/TextArea/TextArea.js.map +1 -1
- package/commonjs/Theme/README.md +161 -0
- package/commonjs/Theme/makeStyles.js +30 -0
- package/commonjs/Theme/makeStyles.js.map +1 -0
- package/commonjs/Theme/withTheme.js +91 -0
- package/commonjs/Theme/withTheme.js.map +1 -0
- package/commonjs/Timeline/README.md +111 -0
- package/commonjs/Toast/README.md +96 -0
- package/commonjs/Upload/Upload.js +126 -0
- package/commonjs/Upload/Upload.js.map +1 -0
- package/commonjs/index.js +24 -4
- package/commonjs/index.js.map +1 -1
- package/module/Alert/README.md +75 -0
- package/module/BarChart/README.md +172 -0
- package/module/Button/README.md +108 -0
- package/module/Calendar/Calendar.base.js +1 -1
- package/module/Calendar/Calendar.base.js.map +1 -1
- package/module/Calendar/README.md +410 -0
- package/module/Card/README.md +126 -0
- package/module/CheckBox/README.md +147 -0
- package/module/CircularProgress/README.md +70 -0
- package/module/Collapsible/README.md +140 -0
- package/module/ComboChart/README.md +124 -0
- package/module/DashboardCard/README.md +120 -0
- package/module/DataTable/README.md +159 -0
- package/module/DeviceSelectionModal/README.md +124 -0
- package/module/DraggableFlatList/README.md +35 -0
- package/module/Drawer/README.md +175 -0
- package/module/Dropdown/README.md +230 -0
- package/module/ExternalLink/README.md +81 -0
- package/module/Gantt/README.md +155 -0
- package/module/Grid/README.md +197 -0
- package/module/Header/README.md +109 -0
- package/module/HelloWave/README.md +28 -0
- package/module/Hoverable/Hoverable.js.map +1 -1
- package/module/IconText/README.md +99 -0
- package/module/Image/PreviewImg/README.md +100 -0
- package/module/Image/README.md +88 -0
- package/module/Input/Input.js +60 -4
- package/module/Input/Input.js.map +1 -1
- package/module/Layout/README.md +174 -0
- package/module/LineChart/README.md +181 -0
- package/module/ListItem/README.md +122 -0
- package/module/MessageBox/MessageBox.js +8 -2
- package/module/MessageBox/MessageBox.js.map +1 -1
- package/module/MessageBox/README.md +120 -0
- package/module/Navigation/README.md +197 -0
- package/module/NumericInput/README.md +95 -0
- package/module/Overlay/README.md +84 -0
- package/module/Pagination/README.md +106 -0
- package/module/PieChart/README.md +212 -0
- package/module/Popover/README.md +82 -0
- package/module/Progress/README.md +106 -0
- package/module/RadioButton/README.md +85 -0
- package/module/ScanButton/README.md +72 -0
- package/module/SearchInput/SearchInput.js.map +1 -1
- package/module/SheetTitle/README.md +89 -0
- package/module/Shell/README.md +152 -0
- package/module/Shell/Shell.js.map +1 -1
- package/module/StatisticCard/README.md +129 -0
- package/module/Status/README.md +75 -0
- package/module/Steps/README.md +76 -0
- package/module/Switch/Switch.js +96 -0
- package/module/Switch/Switch.js.map +1 -0
- package/module/Tab/README.md +161 -0
- package/module/Tag/README.md +93 -0
- package/module/Task/README.md +110 -0
- package/module/Text/README.md +97 -0
- package/module/TextArea/README.md +127 -0
- package/module/TextArea/TextArea.js +4 -2
- package/module/TextArea/TextArea.js.map +1 -1
- package/module/Theme/README.md +161 -0
- package/module/Theme/makeStyles.js +24 -0
- package/module/Theme/makeStyles.js.map +1 -0
- package/module/Theme/withTheme.js +82 -0
- package/module/Theme/withTheme.js.map +1 -0
- package/module/Timeline/README.md +111 -0
- package/module/Toast/README.md +96 -0
- package/module/Upload/Upload.js +121 -0
- package/module/Upload/Upload.js.map +1 -0
- package/module/index.js +11 -3
- package/module/index.js.map +1 -1
- package/package.json +1 -1
- package/typescript/Grid/FixedSizeGrid.d.ts +1 -3
- package/typescript/Grid/FixedSizeGrid.d.ts.map +1 -1
- package/typescript/Grid/Grid.base.d.ts +1 -3
- package/typescript/Grid/Grid.base.d.ts.map +1 -1
- package/typescript/Grid/VariableSizeGrid.d.ts +1 -3
- package/typescript/Grid/VariableSizeGrid.d.ts.map +1 -1
- package/typescript/Input/Input.d.ts +5 -0
- package/typescript/Input/Input.d.ts.map +1 -1
- package/typescript/MessageBox/MessageBox.d.ts.map +1 -1
- package/typescript/SearchInput/SearchInput.d.ts +4 -0
- package/typescript/SearchInput/SearchInput.d.ts.map +1 -1
- package/typescript/Switch/Switch.d.ts +15 -0
- package/typescript/Switch/Switch.d.ts.map +1 -0
- package/typescript/TextArea/TextArea.d.ts +2 -0
- package/typescript/TextArea/TextArea.d.ts.map +1 -1
- package/typescript/Theme/makeStyles.d.ts +11 -0
- package/typescript/Theme/makeStyles.d.ts.map +1 -0
- package/typescript/Theme/withTheme.d.ts +12 -0
- package/typescript/Theme/withTheme.d.ts.map +1 -0
- package/typescript/Upload/Upload.d.ts +25 -0
- package/typescript/Upload/Upload.d.ts.map +1 -0
- package/typescript/WebViewBridge/useWebViewBridge.d.ts +1 -1
- package/typescript/WebViewBridge/useWebViewBridge.d.ts.map +1 -1
- package/typescript/common/hooks/useBridgelessFix.d.ts +1 -1
- package/typescript/index.d.ts +7 -1
- package/typescript/index.d.ts.map +1 -1
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# NumericInput
|
|
2
|
+
|
|
3
|
+
数字输入组件,包含加减按钮和文本输入框,适用于数量选择场景。
|
|
4
|
+
|
|
5
|
+
## 功能特性
|
|
6
|
+
|
|
7
|
+
- ✅ 加减按钮控制数值增减
|
|
8
|
+
- ✅ 支持手动键盘输入数字
|
|
9
|
+
- ✅ 可设置最大值和最小值限制
|
|
10
|
+
- ✅ 到达边界时自动禁用对应按钮
|
|
11
|
+
- ✅ 支持整体禁用状态
|
|
12
|
+
- ✅ 加号按钮使用主题色填充背景
|
|
13
|
+
- ✅ 支持 onReduce 和 onAdd 额外回调
|
|
14
|
+
- ✅ 兼容 RN 0.77 Bridgeless 模式(Android 焦点管理修复)
|
|
15
|
+
- ✅ 支持自定义输入框样式
|
|
16
|
+
- ✅ 支持 testID 属性用于测试
|
|
17
|
+
|
|
18
|
+
## 安装使用
|
|
19
|
+
|
|
20
|
+
```tsx
|
|
21
|
+
import NumericInput from '@beppla/tapas-ui/components/NumericInput/NumericInput';
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Props
|
|
25
|
+
|
|
26
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
27
|
+
|------|------|--------|------|
|
|
28
|
+
| value | `number` | - | 当前数值 |
|
|
29
|
+
| max | `number` | - | 最大值 |
|
|
30
|
+
| min | `number` | - | 最小值 |
|
|
31
|
+
| onChange | `(value: number) => void` | - | 数值变化回调 |
|
|
32
|
+
| onReduce | `() => void` | - | 减少按钮点击回调(在数值变化前触发) |
|
|
33
|
+
| onAdd | `() => void` | - | 增加按钮点击回调(在数值变化前触发) |
|
|
34
|
+
| disabled | `boolean` | - | 是否禁用整个组件 |
|
|
35
|
+
| inputStyle | `StyleProp<ViewStyle>` | - | 输入框自定义样式 |
|
|
36
|
+
| testID | `string` | - | 测试标识 |
|
|
37
|
+
| enableBridgelessFix | `boolean` | `true` | 是否启用 RN 0.77 Bridgeless 模式兼容修复 |
|
|
38
|
+
|
|
39
|
+
## 使用示例
|
|
40
|
+
|
|
41
|
+
### 基础用法
|
|
42
|
+
|
|
43
|
+
```tsx
|
|
44
|
+
<NumericInput
|
|
45
|
+
value={0}
|
|
46
|
+
min={0}
|
|
47
|
+
max={99}
|
|
48
|
+
onChange={(value) => console.log('数量:', value)}
|
|
49
|
+
/>
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### 设置范围
|
|
53
|
+
|
|
54
|
+
```tsx
|
|
55
|
+
<NumericInput
|
|
56
|
+
value={5}
|
|
57
|
+
min={1}
|
|
58
|
+
max={10}
|
|
59
|
+
onChange={(value) => setQuantity(value)}
|
|
60
|
+
/>
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### 禁用状态
|
|
64
|
+
|
|
65
|
+
```tsx
|
|
66
|
+
<NumericInput
|
|
67
|
+
value={3}
|
|
68
|
+
min={0}
|
|
69
|
+
max={99}
|
|
70
|
+
disabled
|
|
71
|
+
onChange={() => {}}
|
|
72
|
+
/>
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### 带额外回调
|
|
76
|
+
|
|
77
|
+
```tsx
|
|
78
|
+
<NumericInput
|
|
79
|
+
value={count}
|
|
80
|
+
min={0}
|
|
81
|
+
max={99}
|
|
82
|
+
onChange={(value) => setCount(value)}
|
|
83
|
+
onAdd={() => console.log('点击了增加')}
|
|
84
|
+
onReduce={() => console.log('点击了减少')}
|
|
85
|
+
/>
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## 注意事项
|
|
89
|
+
|
|
90
|
+
- `onReduce` 和 `onAdd` 在按钮点击时立即触发,即使数值已到边界也会触发
|
|
91
|
+
- `onChange` 只在数值实际变化时触发(边界处不触发)
|
|
92
|
+
- 手动输入时,超过 `max` 的值会被忽略
|
|
93
|
+
- 失焦时会触发 `onChange` 回调,Android 上有延迟处理以兼容 Bridgeless 模式
|
|
94
|
+
- 组件最小宽度 136px,高度 40px
|
|
95
|
+
- 如果 Android 上遇到焦点问题,可设置 `enableBridgelessFix={false}` 尝试
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# Overlay
|
|
2
|
+
|
|
3
|
+
覆盖层组件,基于 `@rneui/themed` 的 Overlay 封装,用于显示底部弹出的模态内容面板。预设从底部弹出、占屏幕 80% 高度的样式,适合底部 Sheet 和弹出菜单场景。
|
|
4
|
+
|
|
5
|
+
## 功能特性
|
|
6
|
+
|
|
7
|
+
- ✅ 继承 @rneui/themed OverlayProps 的全部能力
|
|
8
|
+
- ✅ 预设底部弹出样式(absolute + bottom: 0)
|
|
9
|
+
- ✅ 半透明遮罩背景(backdropStyle)
|
|
10
|
+
- ✅ 支持点击遮罩关闭(onBackdropPress)
|
|
11
|
+
- ✅ 自定义 overlayStyle 和 backdropStyle 覆盖默认样式
|
|
12
|
+
- ✅ 主题色适配
|
|
13
|
+
|
|
14
|
+
## 安装使用
|
|
15
|
+
|
|
16
|
+
```tsx
|
|
17
|
+
import { Overlay } from '@beppla/tapas-ui';
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Props
|
|
21
|
+
|
|
22
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
23
|
+
|------|------|--------|------|
|
|
24
|
+
| isVisible | `boolean` | - | 是否显示覆盖层(必填) |
|
|
25
|
+
| onBackdropPress | `() => void` | - | 点击遮罩回调 |
|
|
26
|
+
| overlayStyle | `StyleProp<ViewStyle>` | 底部弹出,宽100%,高80% | 覆盖层样式 |
|
|
27
|
+
| backdropStyle | `StyleProp<ViewStyle>` | 半透明灰色 | 遮罩样式 |
|
|
28
|
+
| children | `React.ReactNode` | - | 覆盖层内容 |
|
|
29
|
+
|
|
30
|
+
> 继承 `@rneui/themed` OverlayProps 的所有属性
|
|
31
|
+
|
|
32
|
+
## 使用示例
|
|
33
|
+
|
|
34
|
+
### 基础用法
|
|
35
|
+
|
|
36
|
+
```tsx
|
|
37
|
+
const [isVisible, setIsVisible] = useState(false);
|
|
38
|
+
|
|
39
|
+
<Button onPress={() => setIsVisible(true)}>Open Overlay</Button>
|
|
40
|
+
<Overlay
|
|
41
|
+
isVisible={isVisible}
|
|
42
|
+
onBackdropPress={() => setIsVisible(false)}
|
|
43
|
+
>
|
|
44
|
+
<View>
|
|
45
|
+
<Text>Overlay Content</Text>
|
|
46
|
+
</View>
|
|
47
|
+
</Overlay>
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### 自定义高度
|
|
51
|
+
|
|
52
|
+
```tsx
|
|
53
|
+
<Overlay
|
|
54
|
+
isVisible={isVisible}
|
|
55
|
+
onBackdropPress={() => setIsVisible(false)}
|
|
56
|
+
overlayStyle={{ height: '50%' }}
|
|
57
|
+
>
|
|
58
|
+
<Text>Half screen overlay</Text>
|
|
59
|
+
</Overlay>
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### 居中弹出
|
|
63
|
+
|
|
64
|
+
```tsx
|
|
65
|
+
<Overlay
|
|
66
|
+
isVisible={isVisible}
|
|
67
|
+
onBackdropPress={() => setIsVisible(false)}
|
|
68
|
+
overlayStyle={{
|
|
69
|
+
width: '80%',
|
|
70
|
+
height: 'auto',
|
|
71
|
+
position: 'relative',
|
|
72
|
+
borderRadius: 12,
|
|
73
|
+
}}
|
|
74
|
+
>
|
|
75
|
+
<Text>Centered modal content</Text>
|
|
76
|
+
</Overlay>
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## 注意事项
|
|
80
|
+
|
|
81
|
+
- 默认样式为底部弹出面板(`position: absolute, bottom: 0, width: 100%, height: 80%`)
|
|
82
|
+
- 传入 `overlayStyle` 会与默认样式合并(数组形式),后者优先级更高
|
|
83
|
+
- 组件需在 `ThemeProvider` 内使用
|
|
84
|
+
- 遮罩背景色使用主题的 `grey4` 颜色
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# Pagination
|
|
2
|
+
|
|
3
|
+
分页组件,用于大数据列表的分页导航。支持页码选择、每页条数切换、分组翻页和总数展示,适配桌面和移动端。
|
|
4
|
+
|
|
5
|
+
## 功能特性
|
|
6
|
+
|
|
7
|
+
- ✅ 页码分组展示(每组 5 页),前后翻组
|
|
8
|
+
- ✅ 当前页高亮(圆形选中样式)
|
|
9
|
+
- ✅ 每页条数下拉选择(Dropdown 集成)
|
|
10
|
+
- ✅ 总数显示(可选隐藏)
|
|
11
|
+
- ✅ 移动端自适应:默认隐藏总数和每页条数选择
|
|
12
|
+
- ✅ 自定义每页条数选项(pageSizeOptions)
|
|
13
|
+
- ✅ 自定义容器样式和背景色
|
|
14
|
+
- ✅ 下拉框位置和宽度可配置
|
|
15
|
+
- ✅ 无障碍支持(accessibilityRole / accessibilityLabel)
|
|
16
|
+
|
|
17
|
+
## 安装使用
|
|
18
|
+
|
|
19
|
+
```tsx
|
|
20
|
+
import { Pagination } from '@beppla/tapas-ui';
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Props
|
|
24
|
+
|
|
25
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
26
|
+
|------|------|--------|------|
|
|
27
|
+
| totalCount | `string` | - | 总数显示文本(必填) |
|
|
28
|
+
| pageParams | `TPageParams` | `{ page: 1, pageSize: 10, totalItems: 0, totalPage: 1 }` | 分页参数 |
|
|
29
|
+
| pageSizeOptions | `ItemProps[]` | `[1, 5, 10, 20, 50, 100]/Page` | 每页条数选项 |
|
|
30
|
+
| visibleTotalCount | `boolean` | 桌面端 `true`,移动端 `false` | 是否显示总数 |
|
|
31
|
+
| visiblePageSizeOptions | `boolean` | 桌面端 `true`,移动端 `false` | 是否显示每页条数选择 |
|
|
32
|
+
| onPageChange | `(page: TPageParams) => void` | - | 页码变化回调 |
|
|
33
|
+
| onPageSizeChange | `(item: ItemProps) => void` | - | 每页条数变化回调 |
|
|
34
|
+
| paginationContainerStyle | `StyleProp<ViewStyle>` | - | 容器样式 |
|
|
35
|
+
| pageSizePosition | `TDropdownPosition` | `'auto'` | 下拉框弹出位置 |
|
|
36
|
+
| backgroundColor | `string` | - | 背景色 |
|
|
37
|
+
| pageSizeDropdownWidth | `number` | 自动计算 | 下拉框宽度 |
|
|
38
|
+
|
|
39
|
+
### TPageParams
|
|
40
|
+
|
|
41
|
+
```tsx
|
|
42
|
+
type TPageParams = {
|
|
43
|
+
page: number; // 当前页码
|
|
44
|
+
pageSize: number; // 每页条数
|
|
45
|
+
totalItems: number; // 总条数
|
|
46
|
+
totalPage: number; // 总页数
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## 使用示例
|
|
51
|
+
|
|
52
|
+
### 基础用法
|
|
53
|
+
|
|
54
|
+
```tsx
|
|
55
|
+
<Pagination
|
|
56
|
+
totalCount="100 items"
|
|
57
|
+
pageParams={{
|
|
58
|
+
page: 1,
|
|
59
|
+
pageSize: 10,
|
|
60
|
+
totalItems: 100,
|
|
61
|
+
totalPage: 10,
|
|
62
|
+
}}
|
|
63
|
+
onPageChange={(params) => {
|
|
64
|
+
fetchData(params.page, params.pageSize);
|
|
65
|
+
}}
|
|
66
|
+
/>
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### 自定义每页条数
|
|
70
|
+
|
|
71
|
+
```tsx
|
|
72
|
+
<Pagination
|
|
73
|
+
totalCount="500 records"
|
|
74
|
+
pageParams={pageParams}
|
|
75
|
+
pageSizeOptions={[
|
|
76
|
+
{ name: '25/Page', value: 25 },
|
|
77
|
+
{ name: '50/Page', value: 50 },
|
|
78
|
+
{ name: '100/Page', value: 100 },
|
|
79
|
+
]}
|
|
80
|
+
onPageChange={handlePageChange}
|
|
81
|
+
onPageSizeChange={(item) => {
|
|
82
|
+
setPageSize(item.value);
|
|
83
|
+
}}
|
|
84
|
+
/>
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### 隐藏总数和条数选择
|
|
88
|
+
|
|
89
|
+
```tsx
|
|
90
|
+
<Pagination
|
|
91
|
+
totalCount=""
|
|
92
|
+
pageParams={pageParams}
|
|
93
|
+
visibleTotalCount={false}
|
|
94
|
+
visiblePageSizeOptions={false}
|
|
95
|
+
onPageChange={handlePageChange}
|
|
96
|
+
/>
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## 注意事项
|
|
100
|
+
|
|
101
|
+
- 页码分组为每组 5 页,通过左右箭头翻组
|
|
102
|
+
- `pageParams` 变化会自动同步内部状态
|
|
103
|
+
- 移动端自动隐藏总数和每页条数选择器
|
|
104
|
+
- 下拉框宽度默认根据最长选项文本自动计算(最小 140px,最大 200px)
|
|
105
|
+
- 组件使用 `React.memo` 优化渲染
|
|
106
|
+
- 下拉框基于 Dropdown 组件实现
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
# PieChart / NestedPieChart
|
|
2
|
+
|
|
3
|
+
饼图组件,包含基础饼图(PieChart)和嵌套饼图(NestedPieChart)两个组件。支持饼图、环形图(Donut)、多层级嵌套等展示方式。采用**双平台渲染**策略:Web 端使用 recharts,Native 端使用 react-native-svg-charts。
|
|
4
|
+
|
|
5
|
+
## 功能特性
|
|
6
|
+
|
|
7
|
+
### PieChart
|
|
8
|
+
- ✅ **双平台渲染**:Web 使用 recharts,Native 使用 react-native-svg-charts
|
|
9
|
+
- ✅ 支持饼图和环形图(通过 innerRadius 控制)
|
|
10
|
+
- ✅ 图例支持 top / bottom / left / right 四个位置
|
|
11
|
+
- ✅ 图例可显示数值,支持 left / right 对齐
|
|
12
|
+
- ✅ 自定义图例间距:行间距(legendItemGap)、Label-Value 间距(legendLabelValueGap)
|
|
13
|
+
- ✅ Label 最小宽度控制(legendLabelMinWidth),确保数值列对齐
|
|
14
|
+
- ✅ 饼图与图例间距可调(legendChartGap,左右位置时生效)
|
|
15
|
+
- ✅ 自定义外圆/内圆半径,支持数字(像素)和字符串(百分比)
|
|
16
|
+
- ✅ 支持扇区标签显示和中心文字
|
|
17
|
+
- ✅ 长图例列表自动滚动(Native 端 ScrollView)
|
|
18
|
+
|
|
19
|
+
### NestedPieChart
|
|
20
|
+
- ✅ 支持多层级嵌套饼图(仅 Web 平台)
|
|
21
|
+
- ✅ 树形数据结构和扁平数据结构,支持自动推断
|
|
22
|
+
- ✅ 分组图例(grouped legend),可折叠展开
|
|
23
|
+
- ✅ 自动配色策略(渐变色阶,baseColors 映射)
|
|
24
|
+
- ✅ 扇区点击/悬停、图例点击事件
|
|
25
|
+
- ✅ 图例过滤(enableLegendFilter)
|
|
26
|
+
- ✅ 自定义 Tooltip
|
|
27
|
+
- ✅ 格式化函数(数值 / 百分比)
|
|
28
|
+
|
|
29
|
+
## 安装使用
|
|
30
|
+
|
|
31
|
+
```tsx
|
|
32
|
+
import { PieChart } from '@beppla/tapas-ui/components/PieChart';
|
|
33
|
+
import { NestedPieChart } from '@beppla/tapas-ui/components/PieChart';
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## PieChart Props
|
|
37
|
+
|
|
38
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
39
|
+
|------|------|--------|------|
|
|
40
|
+
| data | `PieChartData[]` | (必填) | 饼图数据 |
|
|
41
|
+
| width | `number` | - | 图表宽度 |
|
|
42
|
+
| height | `number` | `300` | 图表高度 |
|
|
43
|
+
| colors | `string[]` | 默认 6 色 | 颜色方案 |
|
|
44
|
+
| outerRadius | `number \| string` | 自动计算 | 外圆半径,支持像素和百分比(如 `'80%'`) |
|
|
45
|
+
| innerRadius | `number \| string` | `0` | 内圆半径,设置后变为环形图 |
|
|
46
|
+
| padAngle | `number` | `0.02` | 扇区间隔角度 |
|
|
47
|
+
| showLabels | `boolean` | `false` | 是否在扇区上显示标签 |
|
|
48
|
+
| showLegend | `boolean` | `true` | 是否显示图例 |
|
|
49
|
+
| legendPosition | `'top' \| 'bottom' \| 'left' \| 'right'` | `'right'` | 图例位置 |
|
|
50
|
+
| showLegendValues | `boolean` | `true` | 图例是否显示数值 |
|
|
51
|
+
| legendValueAlign | `'left' \| 'right'` | `'right'` | 图例数值对齐方式 |
|
|
52
|
+
| legendItemGap | `number` | `8` | 图例行间距(px) |
|
|
53
|
+
| legendLabelValueGap | `number` | `12` | Label 与 Value 间距(px) |
|
|
54
|
+
| legendLabelMinWidth | `number` | - | Label 最小宽度,确保对齐 |
|
|
55
|
+
| legendChartGap | `number` | `30` | 饼图与图例间距(左右位置时生效) |
|
|
56
|
+
| centerText | `string` | - | 中心文字(环形图) |
|
|
57
|
+
| style | `any` | - | 容器样式 |
|
|
58
|
+
| testID | `string` | - | 测试标识 |
|
|
59
|
+
|
|
60
|
+
### PieChartData
|
|
61
|
+
|
|
62
|
+
| 属性 | 类型 | 说明 |
|
|
63
|
+
|------|------|------|
|
|
64
|
+
| value | `number` | 数值(必填) |
|
|
65
|
+
| label | `string` | 标签 |
|
|
66
|
+
| color | `string` | 自定义颜色(优先级高于 colors 数组) |
|
|
67
|
+
| key | `string \| number` | 唯一标识 |
|
|
68
|
+
|
|
69
|
+
## NestedPieChart Props
|
|
70
|
+
|
|
71
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
72
|
+
|------|------|--------|------|
|
|
73
|
+
| data | `NestedPieChartNode[] \| NestedPieChartFlatData[]` | (必填) | 嵌套数据 |
|
|
74
|
+
| dataType | `'tree' \| 'flat'` | 自动推断 | 数据类型 |
|
|
75
|
+
| levels | `number` | 自动计算 | 显示层数 |
|
|
76
|
+
| width | `number` | - | 图表宽度 |
|
|
77
|
+
| height | `number` | - | 图表高度 |
|
|
78
|
+
| outerRadius | `number \| string` | - | 外圆半径 |
|
|
79
|
+
| innerRadius | `number \| string` | - | 最内层半径 |
|
|
80
|
+
| radiusGap | `number` | `10` | 层间间隔 |
|
|
81
|
+
| colorStrategy | `ColorStrategy` | - | 配色策略(baseColors、autoGenerate、colorSteps) |
|
|
82
|
+
| colors | `string[]` | - | 默认配色数组 |
|
|
83
|
+
| showLegend | `boolean` | - | 是否显示图例 |
|
|
84
|
+
| legendMode | `'flat' \| 'grouped'` | - | 图例模式 |
|
|
85
|
+
| legendPosition | `'top' \| 'bottom' \| 'left' \| 'right'` | - | 图例位置 |
|
|
86
|
+
| legendContent | `'all' \| 'parent-only' \| 'children-only'` | - | 图例显示内容 |
|
|
87
|
+
| legendCollapsible | `boolean` | - | 图例是否可折叠 |
|
|
88
|
+
| legendDefaultExpanded | `boolean` | - | 图例默认展开 |
|
|
89
|
+
| legendSortStrategy | `'none' \| 'value-desc' \| 'value-asc' \| 'label-asc' \| 'label-desc'` | - | 图例排序策略 |
|
|
90
|
+
| legendGroupSortStrategy | `LegendSortStrategy` | - | 分组排序策略 |
|
|
91
|
+
| legendShowValues | `boolean` | - | 是否显示数值 |
|
|
92
|
+
| legendShowPercent | `boolean` | - | 是否显示百分比 |
|
|
93
|
+
| legendItemGap | `number` | - | 图例项间距 |
|
|
94
|
+
| legendGroupGap | `number` | - | 分组间距 |
|
|
95
|
+
| legendLabelMinWidth | `number` | - | Label 最小宽度 |
|
|
96
|
+
| legendChartGap | `number` | - | 饼图与图例间距 |
|
|
97
|
+
| showLabels | `boolean` | - | 是否显示扇区标签 |
|
|
98
|
+
| labelLevel | `'all' \| number` | - | 显示标签的层级 |
|
|
99
|
+
| formatValue | `(value: number) => string` | - | 数值格式化 |
|
|
100
|
+
| formatPercent | `(percent: number) => string` | - | 百分比格式化 |
|
|
101
|
+
| onSliceClick | `(event: SliceClickEvent) => void` | - | 扇区点击 |
|
|
102
|
+
| onSliceHover | `(event: SliceClickEvent \| null) => void` | - | 扇区悬停 |
|
|
103
|
+
| onLegendClick | `(event: LegendClickEvent) => void` | - | 图例点击 |
|
|
104
|
+
| enableLegendFilter | `boolean` | - | 点击图例过滤扇区 |
|
|
105
|
+
| showTooltip | `boolean` | - | 是否显示 Tooltip |
|
|
106
|
+
| customTooltip | `(event: SliceClickEvent) => ReactNode` | - | 自定义 Tooltip |
|
|
107
|
+
| padAngle | `number` | - | 扇区间隔角度 |
|
|
108
|
+
| centerText | `string` | - | 中心文字 |
|
|
109
|
+
| centerTextStyle | `React.CSSProperties` | - | 中心文字样式 |
|
|
110
|
+
| emptyText | `string` | - | 空数据文本 |
|
|
111
|
+
| style | `any` | - | 容器样式 |
|
|
112
|
+
| testID | `string` | - | 测试标识 |
|
|
113
|
+
|
|
114
|
+
## 使用示例
|
|
115
|
+
|
|
116
|
+
### 基础饼图
|
|
117
|
+
|
|
118
|
+
```tsx
|
|
119
|
+
<PieChart
|
|
120
|
+
data={[
|
|
121
|
+
{ value: 40, label: 'Category A', color: '#FF6B00' },
|
|
122
|
+
{ value: 30, label: 'Category B', color: '#0066CC' },
|
|
123
|
+
{ value: 20, label: 'Category C', color: '#00B894' },
|
|
124
|
+
{ value: 10, label: 'Category D', color: '#6C5CE7' },
|
|
125
|
+
]}
|
|
126
|
+
height={300}
|
|
127
|
+
/>
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### 环形图(Donut Chart)
|
|
131
|
+
|
|
132
|
+
```tsx
|
|
133
|
+
<PieChart
|
|
134
|
+
data={sampleData}
|
|
135
|
+
innerRadius="50%"
|
|
136
|
+
centerText="Total"
|
|
137
|
+
/>
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### 自定义饼图大小
|
|
141
|
+
|
|
142
|
+
```tsx
|
|
143
|
+
<PieChart data={sampleData} outerRadius={100} height={300} />
|
|
144
|
+
<PieChart data={sampleData} outerRadius="80%" height={350} />
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### 图例配置
|
|
148
|
+
|
|
149
|
+
```tsx
|
|
150
|
+
<PieChart
|
|
151
|
+
data={sampleData}
|
|
152
|
+
legendPosition="right"
|
|
153
|
+
showLegendValues
|
|
154
|
+
legendValueAlign="right"
|
|
155
|
+
legendItemGap={12}
|
|
156
|
+
legendLabelValueGap={20}
|
|
157
|
+
legendLabelMinWidth={200}
|
|
158
|
+
legendChartGap={48}
|
|
159
|
+
/>
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### NestedPieChart 嵌套饼图
|
|
163
|
+
|
|
164
|
+
```tsx
|
|
165
|
+
<NestedPieChart
|
|
166
|
+
data={[
|
|
167
|
+
{
|
|
168
|
+
key: 'food',
|
|
169
|
+
label: 'Food',
|
|
170
|
+
children: [
|
|
171
|
+
{ key: 'rice', label: 'Rice', value: 30 },
|
|
172
|
+
{ key: 'noodle', label: 'Noodle', value: 20 },
|
|
173
|
+
],
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
key: 'drink',
|
|
177
|
+
label: 'Drink',
|
|
178
|
+
children: [
|
|
179
|
+
{ key: 'coffee', label: 'Coffee', value: 25 },
|
|
180
|
+
{ key: 'tea', label: 'Tea', value: 15 },
|
|
181
|
+
],
|
|
182
|
+
},
|
|
183
|
+
]}
|
|
184
|
+
showLegend
|
|
185
|
+
legendMode="grouped"
|
|
186
|
+
legendCollapsible
|
|
187
|
+
/>
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### 自定义配色
|
|
191
|
+
|
|
192
|
+
```tsx
|
|
193
|
+
<NestedPieChart
|
|
194
|
+
data={nestedData}
|
|
195
|
+
colorStrategy={{
|
|
196
|
+
baseColors: { cash: '#00B894', card: '#FF6B00' },
|
|
197
|
+
autoGenerate: true,
|
|
198
|
+
}}
|
|
199
|
+
height={450}
|
|
200
|
+
/>
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
## 注意事项
|
|
204
|
+
|
|
205
|
+
- **PieChart 双平台渲染**:Web 端使用 recharts(功能完整),Native 端使用 react-native-svg-charts(功能受限)
|
|
206
|
+
- **NestedPieChart 仅支持 Web 平台**,Native 端会显示降级提示
|
|
207
|
+
- `innerRadius` 设置为大于 0 的值即变为环形图
|
|
208
|
+
- `outerRadius` 支持数字(像素)和字符串(百分比如 `'80%'`)
|
|
209
|
+
- `legendChartGap` 仅在图例位于 left / right 时生效
|
|
210
|
+
- `legendLabelMinWidth` 可确保不同长度标签的数值列对齐
|
|
211
|
+
- Native 端图例使用 ScrollView 实现长列表滚动
|
|
212
|
+
- 需安装对应平台依赖:Web 需要 `recharts`,Native 需要 `react-native-svg-charts` + `react-native-svg`
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# Popover
|
|
2
|
+
|
|
3
|
+
气泡弹出层组件,用于显示与触发元素相对定位的内容面板。支持四个方向(top/bottom/left/right)和三种箭头位置(start/center/end),适合工具提示、操作菜单等场景。
|
|
4
|
+
|
|
5
|
+
## 功能特性
|
|
6
|
+
|
|
7
|
+
- ✅ 四个弹出方向:top、bottom、left、right
|
|
8
|
+
- ✅ 三种箭头位置:start、center、end
|
|
9
|
+
- ✅ 自定义宽高尺寸
|
|
10
|
+
- ✅ 带阴影的浮层效果(elevation: 8)
|
|
11
|
+
- ✅ 箭头自动跟随方向和位置调整
|
|
12
|
+
- ✅ 通过 isVisible 控制显隐
|
|
13
|
+
- ✅ 支持自定义容器和内容区样式
|
|
14
|
+
- ✅ 主题色适配(withTheme HOC)
|
|
15
|
+
|
|
16
|
+
## 安装使用
|
|
17
|
+
|
|
18
|
+
```tsx
|
|
19
|
+
import { Popover } from '@beppla/tapas-ui';
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Props
|
|
23
|
+
|
|
24
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
25
|
+
|------|------|--------|------|
|
|
26
|
+
| isVisible | `boolean` | - | 是否显示(必填) |
|
|
27
|
+
| children | `React.ReactNode` | - | 弹出层内容 |
|
|
28
|
+
| position | `'top' \| 'bottom' \| 'left' \| 'right'` | `'bottom'` | 弹出方向 |
|
|
29
|
+
| arrowPosition | `'start' \| 'center' \| 'end'` | `'center'` | 箭头在边上的位置 |
|
|
30
|
+
| width | `number` | `392` | 弹出层宽度 |
|
|
31
|
+
| height | `number` | `696` | 弹出层高度 |
|
|
32
|
+
| containerStyle | `StyleProp<ViewStyle>` | - | 外层容器样式 |
|
|
33
|
+
| contentStyle | `StyleProp<ViewStyle>` | - | 内容区域样式 |
|
|
34
|
+
|
|
35
|
+
## 使用示例
|
|
36
|
+
|
|
37
|
+
### 基础用法
|
|
38
|
+
|
|
39
|
+
```tsx
|
|
40
|
+
const [isVisible, setIsVisible] = useState(false);
|
|
41
|
+
|
|
42
|
+
<Button onPress={() => setIsVisible(true)}>Show Popover</Button>
|
|
43
|
+
<Popover isVisible={isVisible} position="bottom">
|
|
44
|
+
<Text>Popover content here</Text>
|
|
45
|
+
</Popover>
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### 左侧弹出 + 箭头末端
|
|
49
|
+
|
|
50
|
+
```tsx
|
|
51
|
+
<Popover
|
|
52
|
+
isVisible={isVisible}
|
|
53
|
+
position="left"
|
|
54
|
+
arrowPosition="end"
|
|
55
|
+
width={392}
|
|
56
|
+
height={396}
|
|
57
|
+
>
|
|
58
|
+
<Text>Left popover with end arrow</Text>
|
|
59
|
+
</Popover>
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### 自定义尺寸
|
|
63
|
+
|
|
64
|
+
```tsx
|
|
65
|
+
<Popover
|
|
66
|
+
isVisible={isVisible}
|
|
67
|
+
position="top"
|
|
68
|
+
arrowPosition="start"
|
|
69
|
+
width={280}
|
|
70
|
+
height={200}
|
|
71
|
+
>
|
|
72
|
+
<Text>Compact popover</Text>
|
|
73
|
+
</Popover>
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## 注意事项
|
|
77
|
+
|
|
78
|
+
- 组件使用 `position: absolute` 定位,需要父容器提供合适的定位上下文
|
|
79
|
+
- `isVisible` 为 `false` 时组件返回 `null`,不占据布局空间
|
|
80
|
+
- 箭头使用 TapasIcon 的 `left_arrow` 图标,通过旋转适配不同方向
|
|
81
|
+
- `arrowPosition` 的 `center` 值根据 `width` 或 `height` 自动计算居中位置
|
|
82
|
+
- 需在 `ThemeProvider` 内使用
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# Progress
|
|
2
|
+
|
|
3
|
+
进度条组件,用于显示文件上传或图片处理等任务的进度状态。支持 image 和 file 两种布局类型,可展示进行中(progress)、完成(done)和失败(failed)三种状态。
|
|
4
|
+
|
|
5
|
+
## 功能特性
|
|
6
|
+
|
|
7
|
+
- ✅ 两种展示类型:image(图片进度条)和 file(文件进度条)
|
|
8
|
+
- ✅ 三种状态:progress(进行中)、done(完成)、failed(失败)
|
|
9
|
+
- ✅ 状态自动匹配图标和颜色(success / error)
|
|
10
|
+
- ✅ 自定义起始和结束内容区域(支持 ReactNode)
|
|
11
|
+
- ✅ 进度百分比展示
|
|
12
|
+
- ✅ file 类型支持文件名展示
|
|
13
|
+
- ✅ 主题色适配
|
|
14
|
+
- ✅ React.memo 优化渲染性能
|
|
15
|
+
|
|
16
|
+
## 安装使用
|
|
17
|
+
|
|
18
|
+
```tsx
|
|
19
|
+
import { Progress } from '@beppla/tapas-ui';
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Props
|
|
23
|
+
|
|
24
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
25
|
+
|------|------|--------|------|
|
|
26
|
+
| type | `'image' \| 'file'` | - | 展示类型(必填) |
|
|
27
|
+
| data | `ProgressData` | - | 进度数据(必填) |
|
|
28
|
+
| testID | `string` | - | 测试标识 |
|
|
29
|
+
|
|
30
|
+
### ProgressData
|
|
31
|
+
|
|
32
|
+
```tsx
|
|
33
|
+
interface ProgressData {
|
|
34
|
+
start: React.ReactNode | string; // 左侧内容(如缩略图、图标)
|
|
35
|
+
end?: React.ReactNode | string; // 右侧内容(状态文本)
|
|
36
|
+
status: 'progress' | 'done' | 'failed'; // 当前状态
|
|
37
|
+
progress?: number; // 进度值(0-100)
|
|
38
|
+
file?: string; // 文件名(file 类型使用)
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## 使用示例
|
|
43
|
+
|
|
44
|
+
### 图片上传进度
|
|
45
|
+
|
|
46
|
+
```tsx
|
|
47
|
+
<Progress
|
|
48
|
+
type="image"
|
|
49
|
+
data={{
|
|
50
|
+
start: <Image source={{ uri: thumbnail }} style={{ width: 40, height: 40 }} />,
|
|
51
|
+
status: 'progress',
|
|
52
|
+
progress: 65,
|
|
53
|
+
}}
|
|
54
|
+
/>
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### 上传完成
|
|
58
|
+
|
|
59
|
+
```tsx
|
|
60
|
+
<Progress
|
|
61
|
+
type="image"
|
|
62
|
+
data={{
|
|
63
|
+
start: <Image source={{ uri: thumbnail }} style={{ width: 40, height: 40 }} />,
|
|
64
|
+
status: 'done',
|
|
65
|
+
end: 'Uploaded',
|
|
66
|
+
}}
|
|
67
|
+
/>
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### 文件上传
|
|
71
|
+
|
|
72
|
+
```tsx
|
|
73
|
+
<Progress
|
|
74
|
+
type="file"
|
|
75
|
+
data={{
|
|
76
|
+
start: <TapasIcon name="file" size={20} />,
|
|
77
|
+
file: 'document.pdf',
|
|
78
|
+
status: 'progress',
|
|
79
|
+
progress: 42,
|
|
80
|
+
}}
|
|
81
|
+
/>
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### 上传失败
|
|
85
|
+
|
|
86
|
+
```tsx
|
|
87
|
+
<Progress
|
|
88
|
+
type="file"
|
|
89
|
+
data={{
|
|
90
|
+
start: <TapasIcon name="file" size={20} />,
|
|
91
|
+
file: 'report.xlsx',
|
|
92
|
+
status: 'failed',
|
|
93
|
+
end: 'Upload failed',
|
|
94
|
+
}}
|
|
95
|
+
/>
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## 注意事项
|
|
99
|
+
|
|
100
|
+
- `data` 为 null 或 undefined 时组件返回 null
|
|
101
|
+
- `image` 类型为左右布局,进度条位于中间
|
|
102
|
+
- `file` 类型为上下布局,文件名在上方,进度条在下方
|
|
103
|
+
- `end` 属性不存在时,默认显示 `progress%` 文本
|
|
104
|
+
- 进度条宽度通过 CSS `width: ${progress}%` 实现
|
|
105
|
+
- 使用 `withTheme` + `React.memo` 双重优化
|
|
106
|
+
- 需在 `ThemeProvider` 内使用
|