@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,70 @@
|
|
|
1
|
+
# CircularProgress
|
|
2
|
+
|
|
3
|
+
圆形进度条组件,用于显示任务进度、加载状态或完成百分比。基于 `react-native-circular-progress` 库封装,提供简洁的圆形进度展示,自动适配主题颜色。
|
|
4
|
+
|
|
5
|
+
## 功能特性
|
|
6
|
+
|
|
7
|
+
- ✅ 圆形进度条展示
|
|
8
|
+
- ✅ 自定义尺寸(size)和线宽(width)
|
|
9
|
+
- ✅ 自定义填充百分比(fill: 0-100)
|
|
10
|
+
- ✅ 自定义进度色(tintColor)和背景色(backgroundColor)
|
|
11
|
+
- ✅ 圆角端点(lineCap: round)
|
|
12
|
+
- ✅ 可调起始角度(rotation)
|
|
13
|
+
- ✅ 主题色自动适配(成功色 / 灰色背景)
|
|
14
|
+
- ✅ React.memo 优化性能
|
|
15
|
+
|
|
16
|
+
## 安装使用
|
|
17
|
+
|
|
18
|
+
```tsx
|
|
19
|
+
import { CircularProgress } from '@beppla/tapas-ui';
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Props
|
|
23
|
+
|
|
24
|
+
继承 `react-native-circular-progress` 的 `CircularProgressProps`,额外属性如下:
|
|
25
|
+
|
|
26
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
27
|
+
|------|------|--------|------|
|
|
28
|
+
| size | `number` | - | 圆形直径(必填) |
|
|
29
|
+
| fill | `number` | - | 填充百分比 0-100(必填) |
|
|
30
|
+
| width | `number` | - | 进度线宽度(必填) |
|
|
31
|
+
| backgroundColor | `string` | 主题 grey3 | 背景圆环颜色 |
|
|
32
|
+
| tintColor | `string` | 主题 success 色 | 进度圆环颜色 |
|
|
33
|
+
| rotation | `number` | `0` | 起始角度 |
|
|
34
|
+
| lineCap | `string` | `'round'` | 端点样式 |
|
|
35
|
+
| showFillText | `boolean` | - | 是否显示百分比文本(预留) |
|
|
36
|
+
| testID | `string` | - | 测试标识 |
|
|
37
|
+
|
|
38
|
+
## 使用示例
|
|
39
|
+
|
|
40
|
+
### 基础用法
|
|
41
|
+
|
|
42
|
+
```tsx
|
|
43
|
+
<CircularProgress size={80} fill={75} width={8} />
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### 自定义颜色
|
|
47
|
+
|
|
48
|
+
```tsx
|
|
49
|
+
<CircularProgress
|
|
50
|
+
size={100}
|
|
51
|
+
fill={60}
|
|
52
|
+
width={10}
|
|
53
|
+
tintColor="#F55523"
|
|
54
|
+
backgroundColor="#E0E0E0"
|
|
55
|
+
/>
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### 小尺寸
|
|
59
|
+
|
|
60
|
+
```tsx
|
|
61
|
+
<CircularProgress size={40} fill={100} width={4} />
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## 注意事项
|
|
65
|
+
|
|
66
|
+
- 依赖 `react-native-circular-progress` 库,请确保已安装
|
|
67
|
+
- `fill` 值范围为 0-100,表示百分比
|
|
68
|
+
- 默认 `backgroundColor` 使用主题 `grey3`,`tintColor` 使用主题 `success` 色
|
|
69
|
+
- `showFillText` 属性已定义但尚未在渲染中实现
|
|
70
|
+
- 需在 `ThemeProvider` 内使用
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# Collapsible
|
|
2
|
+
|
|
3
|
+
可折叠面板组件,点击标题行可展开或折叠内容区域。适用于 FAQ、设置面板、内容分组等场景。
|
|
4
|
+
|
|
5
|
+
## 功能特性
|
|
6
|
+
|
|
7
|
+
- 点击标题行切换展开/折叠状态
|
|
8
|
+
- 支持初始状态控制(`initialOpen`)
|
|
9
|
+
- 展开/折叠状态变化回调(`onToggle`)
|
|
10
|
+
- 折叠时内容不渲染,优化性能
|
|
11
|
+
- 展开/折叠图标指示器(`expand_less` / `expand_more`)
|
|
12
|
+
- 可自定义标题样式和内容区域样式
|
|
13
|
+
- 可自定义图标大小和颜色
|
|
14
|
+
- 使用 `React.memo` 优化避免不必要的重渲染
|
|
15
|
+
|
|
16
|
+
## 安装使用
|
|
17
|
+
|
|
18
|
+
```tsx
|
|
19
|
+
import { Collapsible } from '@beppla/tapas-ui';
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Props
|
|
23
|
+
|
|
24
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
25
|
+
|------|------|--------|------|
|
|
26
|
+
| title | `string` | - | 面板标题文本(必填) |
|
|
27
|
+
| children | `React.ReactNode` | - | 可折叠的内容区域 |
|
|
28
|
+
| initialOpen | `boolean` | `false` | 初始是否展开 |
|
|
29
|
+
| onToggle | `(isOpen: boolean) => void` | - | 展开/折叠状态变化回调 |
|
|
30
|
+
| titleStyle | `any` | - | 标题文本自定义样式 |
|
|
31
|
+
| contentStyle | `any` | - | 内容区域自定义样式 |
|
|
32
|
+
| iconColor | `string` | `theme.colors.grey1` | 指示器图标颜色 |
|
|
33
|
+
| iconSize | `number` | `18` | 指示器图标大小 |
|
|
34
|
+
| testID | `string` | - | 测试 ID |
|
|
35
|
+
|
|
36
|
+
## 使用示例
|
|
37
|
+
|
|
38
|
+
### 基础用法
|
|
39
|
+
|
|
40
|
+
```tsx
|
|
41
|
+
import { Collapsible } from '@beppla/tapas-ui';
|
|
42
|
+
import { Text } from 'react-native';
|
|
43
|
+
|
|
44
|
+
<Collapsible title="Basic Panel">
|
|
45
|
+
<Text>This is the collapsible content.</Text>
|
|
46
|
+
</Collapsible>
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### 初始展开
|
|
50
|
+
|
|
51
|
+
```tsx
|
|
52
|
+
<Collapsible title="Initially Open" initialOpen={true}>
|
|
53
|
+
<Text>This panel starts in the open state.</Text>
|
|
54
|
+
</Collapsible>
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### 带状态回调
|
|
58
|
+
|
|
59
|
+
```tsx
|
|
60
|
+
<Collapsible
|
|
61
|
+
title="With Callback"
|
|
62
|
+
onToggle={(isOpen) => {
|
|
63
|
+
console.log('Panel is now', isOpen ? 'open' : 'closed');
|
|
64
|
+
}}
|
|
65
|
+
>
|
|
66
|
+
<Text>Toggle me and check the console.</Text>
|
|
67
|
+
</Collapsible>
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### 多个面板组合
|
|
71
|
+
|
|
72
|
+
```tsx
|
|
73
|
+
import { Collapsible } from '@beppla/tapas-ui';
|
|
74
|
+
import { View, Text } from 'react-native';
|
|
75
|
+
|
|
76
|
+
<View style={{ gap: 8 }}>
|
|
77
|
+
<Collapsible title="Section 1" initialOpen={true}>
|
|
78
|
+
<Text>First section content</Text>
|
|
79
|
+
</Collapsible>
|
|
80
|
+
<Collapsible title="Section 2">
|
|
81
|
+
<Text>Second section content</Text>
|
|
82
|
+
</Collapsible>
|
|
83
|
+
<Collapsible title="Section 3">
|
|
84
|
+
<Text>Third section content</Text>
|
|
85
|
+
</Collapsible>
|
|
86
|
+
</View>
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### 自定义样式
|
|
90
|
+
|
|
91
|
+
```tsx
|
|
92
|
+
<Collapsible
|
|
93
|
+
title="Styled Panel"
|
|
94
|
+
titleStyle={{ fontSize: 18, fontWeight: 'bold', color: '#1976d2' }}
|
|
95
|
+
contentStyle={{ backgroundColor: '#f5f5f5', padding: 12, borderRadius: 4 }}
|
|
96
|
+
iconSize={24}
|
|
97
|
+
iconColor="#ff6b6b"
|
|
98
|
+
>
|
|
99
|
+
<Text>Customized collapsible panel</Text>
|
|
100
|
+
</Collapsible>
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### FAQ 页面场景
|
|
104
|
+
|
|
105
|
+
```tsx
|
|
106
|
+
import { Collapsible } from '@beppla/tapas-ui';
|
|
107
|
+
import { ScrollView, View, Text } from 'react-native';
|
|
108
|
+
|
|
109
|
+
const faqs = [
|
|
110
|
+
{ q: 'How to register?', a: 'Click the register button and fill in your details.' },
|
|
111
|
+
{ q: 'How to reset password?', a: 'Click "Forgot Password" on the login page.' },
|
|
112
|
+
{ q: 'How to contact support?', a: 'Use the chat button in the bottom right.' },
|
|
113
|
+
];
|
|
114
|
+
|
|
115
|
+
export default function FAQPage() {
|
|
116
|
+
return (
|
|
117
|
+
<ScrollView style={{ padding: 16 }}>
|
|
118
|
+
<Text style={{ fontSize: 20, fontWeight: 'bold', marginBottom: 16 }}>FAQ</Text>
|
|
119
|
+
<View style={{ gap: 8 }}>
|
|
120
|
+
{faqs.map((faq, i) => (
|
|
121
|
+
<Collapsible key={i} title={faq.q}>
|
|
122
|
+
<Text style={{ color: '#555', lineHeight: 20 }}>{faq.a}</Text>
|
|
123
|
+
</Collapsible>
|
|
124
|
+
))}
|
|
125
|
+
</View>
|
|
126
|
+
</ScrollView>
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## 注意事项
|
|
132
|
+
|
|
133
|
+
- 标题点击区域包含整行(图标 + 标题文本),使用 `TouchableOpacity` 实现
|
|
134
|
+
- `initialOpen` 仅在组件首次挂载时生效,后续状态由内部 `useState` 管理
|
|
135
|
+
- 折叠状态下内容不渲染(条件渲染 `{isOpen && ...}`),有助于性能优化
|
|
136
|
+
- 展开时图标为 `expand_less`(向上箭头),折叠时为 `expand_more`(向下箭头)
|
|
137
|
+
- `iconColor` 未指定时默认使用主题的 `grey1` 颜色
|
|
138
|
+
- `titleStyle` 会与默认样式合并(默认 fontSize: 16, fontWeight: '600')
|
|
139
|
+
- 内容区域默认左缩进 24px(`marginLeft: 24`),可通过 `contentStyle` 覆盖
|
|
140
|
+
- 组件使用 `React.memo` 包装,仅在 props 变化时重新渲染
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# ComboChart
|
|
2
|
+
|
|
3
|
+
组合图表组件,支持在同一图表中混合展示柱状图和折线图。**仅支持 Web 平台**,基于 recharts 的 ComposedChart 实现。Native 端会显示提示信息,建议分别使用 BarChart 和 LineChart。
|
|
4
|
+
|
|
5
|
+
## 功能特性
|
|
6
|
+
|
|
7
|
+
- ✅ 柱状图和折线图混合展示
|
|
8
|
+
- ✅ 支持多个柱状图系列和折线图系列
|
|
9
|
+
- ✅ 支持双 Y 轴(left / right),展示不同量级数据
|
|
10
|
+
- ✅ 图例支持 top / bottom / left / right 四个位置
|
|
11
|
+
- ✅ 网格线显示控制
|
|
12
|
+
- ✅ X 轴标签旋转角度和显示间隔控制
|
|
13
|
+
- ✅ Y 轴格式化函数
|
|
14
|
+
- ✅ 折线图样式配置(线宽、数据点大小、隐藏数据点)
|
|
15
|
+
- ✅ 响应式容器(ResponsiveContainer)
|
|
16
|
+
- ✅ Tooltip 悬停提示
|
|
17
|
+
- ✅ 空数据友好提示
|
|
18
|
+
- ✅ **仅支持 Web 平台**(使用 recharts 库)
|
|
19
|
+
|
|
20
|
+
## 安装使用
|
|
21
|
+
|
|
22
|
+
```tsx
|
|
23
|
+
import { ComboChart } from '@beppla/tapas-ui/components/ComboChart';
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Props
|
|
27
|
+
|
|
28
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
29
|
+
|------|------|--------|------|
|
|
30
|
+
| categories | `string[]` | (必填) | X 轴分类标签数组 |
|
|
31
|
+
| series | `ComboChartDataSeries[]` | (必填) | 数据系列数组 |
|
|
32
|
+
| width | `number` | - | 图表宽度 |
|
|
33
|
+
| height | `number` | `350` | 图表高度 |
|
|
34
|
+
| showGrid | `boolean` | `true` | 是否显示网格线 |
|
|
35
|
+
| showLabels | `boolean` | `true` | 是否显示 X 轴标签 |
|
|
36
|
+
| showLegend | `boolean` | `true` | 是否显示图例 |
|
|
37
|
+
| legendPosition | `'top' \| 'bottom' \| 'left' \| 'right'` | `'bottom'` | 图例位置 |
|
|
38
|
+
| xAxisAngle | `number` | `-45` | X 轴标签旋转角度(负数逆时针) |
|
|
39
|
+
| xAxisInterval | `number \| 'preserveStartEnd' \| 'preserveStart' \| 'preserveEnd'` | `0` | X 轴标签显示间隔 |
|
|
40
|
+
| yAxisFormat | `(value: number) => string` | `(value) => value.toString()` | Y 轴格式化函数 |
|
|
41
|
+
| style | `any` | - | 容器样式 |
|
|
42
|
+
| testID | `string` | - | 测试标识 |
|
|
43
|
+
|
|
44
|
+
### ComboChartDataSeries
|
|
45
|
+
|
|
46
|
+
| 属性 | 类型 | 说明 |
|
|
47
|
+
|------|------|------|
|
|
48
|
+
| name | `string` | 系列名称(必填),显示在图例中 |
|
|
49
|
+
| data | `number[]` | 数据数组(必填),长度应与 categories 一致 |
|
|
50
|
+
| type | `'bar' \| 'line'` | 图表类型(必填) |
|
|
51
|
+
| color | `string` | 系列颜色 |
|
|
52
|
+
| yAxisId | `'left' \| 'right'` | 绑定的 Y 轴,默认 left |
|
|
53
|
+
| strokeWidth | `number` | 折线宽度(默认 2,仅 line 类型) |
|
|
54
|
+
| dotRadius | `number` | 数据点半径(默认 4,仅 line 类型) |
|
|
55
|
+
| activeDotRadius | `number` | 活动数据点半径(默认 6,仅 line 类型) |
|
|
56
|
+
| hideDot | `boolean` | 隐藏数据点(仅 line 类型) |
|
|
57
|
+
|
|
58
|
+
## 使用示例
|
|
59
|
+
|
|
60
|
+
### 基础用法
|
|
61
|
+
|
|
62
|
+
```tsx
|
|
63
|
+
<ComboChart
|
|
64
|
+
categories={['Store A', 'Store B', 'Store C', 'Store D', 'Store E']}
|
|
65
|
+
series={[
|
|
66
|
+
{ name: 'Revenue', data: [58000, 73000, 68000, 48000, 80000], type: 'bar', color: '#FFB800' },
|
|
67
|
+
{ name: 'Cost', data: [25000, 35000, 45000, 30000, 40000], type: 'line', color: '#E91E63' },
|
|
68
|
+
]}
|
|
69
|
+
height={350}
|
|
70
|
+
/>
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### 多系列组合
|
|
74
|
+
|
|
75
|
+
```tsx
|
|
76
|
+
<ComboChart
|
|
77
|
+
categories={['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun']}
|
|
78
|
+
series={[
|
|
79
|
+
{ name: 'Revenue', data: [50000, 60000, 70000, 55000, 65000, 75000], type: 'bar', color: '#FF6B00' },
|
|
80
|
+
{ name: 'Cost', data: [30000, 35000, 40000, 32000, 38000, 42000], type: 'bar', color: '#0066CC' },
|
|
81
|
+
{ name: 'Profit', data: [20000, 25000, 30000, 23000, 27000, 33000], type: 'line', color: '#00B894' },
|
|
82
|
+
{ name: 'Target', data: [22000, 24000, 28000, 25000, 29000, 35000], type: 'line', color: '#6C5CE7' },
|
|
83
|
+
]}
|
|
84
|
+
height={400}
|
|
85
|
+
/>
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### 双 Y 轴
|
|
89
|
+
|
|
90
|
+
```tsx
|
|
91
|
+
<ComboChart
|
|
92
|
+
categories={['Q1', 'Q2', 'Q3', 'Q4']}
|
|
93
|
+
series={[
|
|
94
|
+
{ name: 'Revenue', data: [150000, 180000, 210000, 240000], type: 'bar', color: '#FF6B00', yAxisId: 'left' },
|
|
95
|
+
{ name: 'Growth (%)', data: [15, 20, 17, 14], type: 'line', color: '#0066CC', yAxisId: 'right' },
|
|
96
|
+
]}
|
|
97
|
+
height={350}
|
|
98
|
+
/>
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### 长标签旋转 + Y 轴格式化
|
|
102
|
+
|
|
103
|
+
```tsx
|
|
104
|
+
<ComboChart
|
|
105
|
+
categories={['Store name A', 'Store name B', 'Store name C']}
|
|
106
|
+
series={[
|
|
107
|
+
{ name: 'Revenue', data: [850000, 680000, 730000], type: 'bar', color: '#FFB800' },
|
|
108
|
+
{ name: 'Cost', data: [15000, 12000, 18000], type: 'line', color: '#D63031', strokeWidth: 2, dotRadius: 4 },
|
|
109
|
+
]}
|
|
110
|
+
xAxisAngle={-90}
|
|
111
|
+
yAxisFormat={(v) => v >= 1000 ? `${(v / 1000).toFixed(0)}k` : v.toString()}
|
|
112
|
+
height={500}
|
|
113
|
+
/>
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## 注意事项
|
|
117
|
+
|
|
118
|
+
- **仅支持 Web 平台**,Native 端显示提示信息,建议在移动端分别使用 BarChart 和 LineChart
|
|
119
|
+
- 依赖 `recharts` 库,需确保项目已安装
|
|
120
|
+
- 设置 `yAxisId: 'right'` 的系列会自动启用右侧 Y 轴
|
|
121
|
+
- 默认 X 轴标签旋转 -45 度以避免长标签重叠,`xAxisAngle` 为 0 时不旋转
|
|
122
|
+
- 底部 margin 会根据 `xAxisAngle` 自动调整以避免标签被截断
|
|
123
|
+
- 折线图样式属性(strokeWidth、dotRadius 等)使用 `??` 运算符设默认值,传 `0` 有效
|
|
124
|
+
- 所有 series 的 data 数组长度应与 categories 数组长度一致
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# DashboardCard
|
|
2
|
+
|
|
3
|
+
仪表板卡片组件,支持 Header / Content / Footer 三段式布局,适用于数据概览、功能模块入口等场景。
|
|
4
|
+
|
|
5
|
+
## 功能特性
|
|
6
|
+
|
|
7
|
+
- ✅ 三段式布局:Header(图标+标题+描述标签+操作区)、Content、Footer
|
|
8
|
+
- ✅ 鼠标悬停阴影效果(Web 端 Hoverable 实现)
|
|
9
|
+
- ✅ 支持禁用状态,自动调整所有文本和图标颜色
|
|
10
|
+
- ✅ Header 支持自定义操作区域(React 节点),带独立点击事件
|
|
11
|
+
- ✅ Header 支持多个描述标签数组
|
|
12
|
+
- ✅ Footer 支持标题+描述+图标按钮
|
|
13
|
+
- ✅ 整卡可点击,支持 onCardPress 回调
|
|
14
|
+
- ✅ 标题单行截断,防止溢出
|
|
15
|
+
- ✅ 高度自定义样式:cardContainerStyle / cardStyle / contentStyle / headerStyle / titleStyle
|
|
16
|
+
|
|
17
|
+
## 安装使用
|
|
18
|
+
|
|
19
|
+
```tsx
|
|
20
|
+
import DashboardCard from '@beppla/tapas-ui/components/DashboardCard/DashboardCard';
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Props
|
|
24
|
+
|
|
25
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
26
|
+
|------|------|--------|------|
|
|
27
|
+
| header | `{ icon?: string; title?: string; description?: string[]; action?: ReactNode; onPressAction?: (value: any) => void; actionStyle?: StyleProp<ViewStyle> }` | - | 头部配置 |
|
|
28
|
+
| content | `string` | - | 内容区域文本 |
|
|
29
|
+
| footer | `{ title?: string; description?: string; onPress?: () => void; icon?: string }` | - | 底部配置 |
|
|
30
|
+
| onCardPress | `() => void` | - | 卡片点击回调 |
|
|
31
|
+
| disabled | `boolean` | - | 是否禁用 |
|
|
32
|
+
| testID | `string` | - | 测试标识 |
|
|
33
|
+
| cardContainerStyle | `StyleProp<ViewStyle>` | - | 卡片外层容器样式(Hoverable 层) |
|
|
34
|
+
| cardStyle | `StyleProp<ViewStyle>` | - | 卡片主体样式 |
|
|
35
|
+
| contentStyle | `StyleProp<ViewStyle>` | - | 内容区域样式 |
|
|
36
|
+
| headerStyle | `StyleProp<ViewStyle>` | - | 头部区域样式 |
|
|
37
|
+
| titleStyle | `StyleProp<ViewStyle>` | - | 标题区域样式 |
|
|
38
|
+
|
|
39
|
+
## 使用示例
|
|
40
|
+
|
|
41
|
+
### 基础用法
|
|
42
|
+
|
|
43
|
+
```tsx
|
|
44
|
+
<DashboardCard
|
|
45
|
+
header={{
|
|
46
|
+
icon: 'restaurant_menu',
|
|
47
|
+
title: '订单管理',
|
|
48
|
+
description: ['今日订单', '待处理'],
|
|
49
|
+
}}
|
|
50
|
+
content="查看订单详情"
|
|
51
|
+
footer={{
|
|
52
|
+
title: '总计',
|
|
53
|
+
description: '128 单',
|
|
54
|
+
icon: 'back',
|
|
55
|
+
onPress: () => console.log('Footer pressed'),
|
|
56
|
+
}}
|
|
57
|
+
onCardPress={() => console.log('Card pressed')}
|
|
58
|
+
/>
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### 带操作按钮
|
|
62
|
+
|
|
63
|
+
```tsx
|
|
64
|
+
<DashboardCard
|
|
65
|
+
header={{
|
|
66
|
+
icon: 'dashboard',
|
|
67
|
+
title: '数据概览',
|
|
68
|
+
action: <Text>...</Text>,
|
|
69
|
+
onPressAction: (value) => console.log('Action:', value),
|
|
70
|
+
}}
|
|
71
|
+
footer={{
|
|
72
|
+
title: '更新时间',
|
|
73
|
+
description: '5 分钟前',
|
|
74
|
+
}}
|
|
75
|
+
/>
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### 禁用状态
|
|
79
|
+
|
|
80
|
+
```tsx
|
|
81
|
+
<DashboardCard
|
|
82
|
+
disabled
|
|
83
|
+
header={{
|
|
84
|
+
icon: 'lock',
|
|
85
|
+
title: '功能暂不可用',
|
|
86
|
+
}}
|
|
87
|
+
contentStyle={{ padding: 16 }}
|
|
88
|
+
cardStyle={{ width: 400 }}
|
|
89
|
+
/>
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### 自定义宽度和内容
|
|
93
|
+
|
|
94
|
+
```tsx
|
|
95
|
+
<DashboardCard
|
|
96
|
+
cardStyle={{ width: 400 }}
|
|
97
|
+
contentStyle={{ padding: 16 }}
|
|
98
|
+
header={{
|
|
99
|
+
icon: 'restaurant_menu',
|
|
100
|
+
title: '自定义宽度卡片',
|
|
101
|
+
description: ['标签1', '标签2'],
|
|
102
|
+
}}
|
|
103
|
+
content="自定义内容区域"
|
|
104
|
+
footer={{
|
|
105
|
+
title: '底部标题',
|
|
106
|
+
description: '底部描述',
|
|
107
|
+
icon: 'back',
|
|
108
|
+
onPress: () => console.log('Navigate'),
|
|
109
|
+
}}
|
|
110
|
+
/>
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## 注意事项
|
|
114
|
+
|
|
115
|
+
- 禁用状态下 `onCardPress` 和 `footer.onPress` 均不会触发
|
|
116
|
+
- `header.description` 为字符串数组,每项显示为独立标签,空值会被过滤
|
|
117
|
+
- `footer.icon` 设置后才会渲染底部图标按钮(带旋转 180 度样式)
|
|
118
|
+
- `content` 属性为 string 时自动渲染为 Text,也支持传入 ReactNode
|
|
119
|
+
- 悬停效果在禁用状态下不会显示
|
|
120
|
+
- 组件使用 `@rneui/themed` 主题系统,需在 ThemeProvider 内使用
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
# DataTable 数据表格组件
|
|
2
|
+
|
|
3
|
+
简洁高效的数据表格组件,用于展示和管理结构化数据。支持列排序、分页、自定义单元格渲染和行点击事件,适合后台管理、报表展示等场景。
|
|
4
|
+
|
|
5
|
+
## 功能特性
|
|
6
|
+
|
|
7
|
+
- ✅ 声明式列定义(columns 配置)
|
|
8
|
+
- ✅ 列排序功能(sortable),升序/降序切换
|
|
9
|
+
- ✅ 内置分页组件集成(Pagination)
|
|
10
|
+
- ✅ 自定义单元格渲染(column.render)
|
|
11
|
+
- ✅ 行点击事件(onRow)
|
|
12
|
+
- ✅ 列对齐配置(left / center / right)
|
|
13
|
+
- ✅ 列宽自定义
|
|
14
|
+
- ✅ 加载中和空数据状态
|
|
15
|
+
- ✅ 水平滚动支持(ScrollView)
|
|
16
|
+
- ✅ 最大高度限制(maxHeight)
|
|
17
|
+
- ✅ 跨平台(Web + React Native)
|
|
18
|
+
|
|
19
|
+
## 安装使用
|
|
20
|
+
|
|
21
|
+
```tsx
|
|
22
|
+
import { DataTable } from '@beppla/tapas-ui';
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Props
|
|
26
|
+
|
|
27
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
28
|
+
|------|------|--------|------|
|
|
29
|
+
| columns | `DataTableColumn<T>[]` | - | 列定义数组(必填) |
|
|
30
|
+
| dataSource | `T[]` | - | 数据源(必填) |
|
|
31
|
+
| rowKey | `string \| ((record: T) => string \| number)` | `'id'` | 行唯一标识字段或函数 |
|
|
32
|
+
| loading | `boolean` | `false` | 是否显示加载状态 |
|
|
33
|
+
| pagination | `PaginationConfig \| false` | - | 分页配置,false 禁用 |
|
|
34
|
+
| onRow | `(record: T, index: number) => { onPress?: () => void }` | - | 行事件配置 |
|
|
35
|
+
| emptyText | `string` | `'No data'` | 空数据提示文本 |
|
|
36
|
+
| style | `any` | - | 容器样式 |
|
|
37
|
+
| headerStyle | `any` | - | 表头行样式 |
|
|
38
|
+
| rowStyle | `any` | - | 数据行样式 |
|
|
39
|
+
| maxHeight | `number` | - | 表格最大高度 |
|
|
40
|
+
|
|
41
|
+
### DataTableColumn
|
|
42
|
+
|
|
43
|
+
```tsx
|
|
44
|
+
interface DataTableColumn<T = any> {
|
|
45
|
+
key: string; // 列唯一标识(必填)
|
|
46
|
+
title: string; // 列标题(必填)
|
|
47
|
+
dataIndex?: string; // 数据字段名(默认为 key)
|
|
48
|
+
width?: number; // 列宽(默认 150)
|
|
49
|
+
align?: 'left' | 'center' | 'right'; // 对齐方式
|
|
50
|
+
sortable?: boolean; // 是否可排序
|
|
51
|
+
render?: (text: any, record: T, index: number) => React.ReactNode; // 自定义渲染
|
|
52
|
+
fixed?: 'left' | 'right'; // 固定列(预留)
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### PaginationConfig
|
|
57
|
+
|
|
58
|
+
```tsx
|
|
59
|
+
interface PaginationConfig {
|
|
60
|
+
current: number; // 当前页码
|
|
61
|
+
pageSize: number; // 每页条数
|
|
62
|
+
total: number; // 总数
|
|
63
|
+
onChange?: (page: number, pageSize: number) => void; // 页码变化回调
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## 使用示例
|
|
68
|
+
|
|
69
|
+
### 基础用法
|
|
70
|
+
|
|
71
|
+
```tsx
|
|
72
|
+
const columns = [
|
|
73
|
+
{ key: 'name', title: 'Name', width: 200, sortable: true },
|
|
74
|
+
{ key: 'age', title: 'Age', width: 100, align: 'center' as const },
|
|
75
|
+
{ key: 'email', title: 'Email', width: 250 },
|
|
76
|
+
];
|
|
77
|
+
|
|
78
|
+
const dataSource = [
|
|
79
|
+
{ id: 1, name: 'Alice', age: 28, email: 'alice@example.com' },
|
|
80
|
+
{ id: 2, name: 'Bob', age: 32, email: 'bob@example.com' },
|
|
81
|
+
];
|
|
82
|
+
|
|
83
|
+
<DataTable columns={columns} dataSource={dataSource} />
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### 自定义渲染 + 排序
|
|
87
|
+
|
|
88
|
+
```tsx
|
|
89
|
+
const columns = [
|
|
90
|
+
{ key: 'name', title: 'Name', width: 200, sortable: true },
|
|
91
|
+
{
|
|
92
|
+
key: 'status',
|
|
93
|
+
title: 'Status',
|
|
94
|
+
width: 120,
|
|
95
|
+
render: (text: string) => (
|
|
96
|
+
<View style={{ flexDirection: 'row', alignItems: 'center' }}>
|
|
97
|
+
<View style={{
|
|
98
|
+
width: 8, height: 8, borderRadius: 4,
|
|
99
|
+
backgroundColor: text === 'active' ? '#57B07B' : '#B81F1E',
|
|
100
|
+
marginRight: 8,
|
|
101
|
+
}} />
|
|
102
|
+
<Text>{text}</Text>
|
|
103
|
+
</View>
|
|
104
|
+
),
|
|
105
|
+
},
|
|
106
|
+
];
|
|
107
|
+
|
|
108
|
+
<DataTable columns={columns} dataSource={data} />
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### 分页
|
|
112
|
+
|
|
113
|
+
```tsx
|
|
114
|
+
<DataTable
|
|
115
|
+
columns={columns}
|
|
116
|
+
dataSource={pageData}
|
|
117
|
+
pagination={{
|
|
118
|
+
current: page,
|
|
119
|
+
pageSize: 10,
|
|
120
|
+
total: 100,
|
|
121
|
+
onChange: (newPage, newPageSize) => {
|
|
122
|
+
setPage(newPage);
|
|
123
|
+
fetchData(newPage, newPageSize);
|
|
124
|
+
},
|
|
125
|
+
}}
|
|
126
|
+
/>
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### 行点击
|
|
130
|
+
|
|
131
|
+
```tsx
|
|
132
|
+
<DataTable
|
|
133
|
+
columns={columns}
|
|
134
|
+
dataSource={data}
|
|
135
|
+
onRow={(record) => ({
|
|
136
|
+
onPress: () => navigation.navigate('Detail', { id: record.id }),
|
|
137
|
+
})}
|
|
138
|
+
/>
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### 限制高度
|
|
142
|
+
|
|
143
|
+
```tsx
|
|
144
|
+
<DataTable
|
|
145
|
+
columns={columns}
|
|
146
|
+
dataSource={longList}
|
|
147
|
+
maxHeight={400}
|
|
148
|
+
/>
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## 注意事项
|
|
152
|
+
|
|
153
|
+
- 排序为前端排序(内存排序),大数据量建议后端排序
|
|
154
|
+
- `pagination` 设为 `false` 可完全禁用分页
|
|
155
|
+
- 列宽默认 150px,未设置 `width` 的列统一使用此默认值
|
|
156
|
+
- 排序图标使用箭头字符( ↑ / ↓)
|
|
157
|
+
- Web 端显示水平滚动条,移动端隐藏
|
|
158
|
+
- `maxHeight` 会同时限制表体高度(maxHeight - 50)
|
|
159
|
+
- `dataIndex` 缺省时自动使用 `key` 作为数据字段名
|