@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.
Files changed (167) 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/README.md +230 -0
  18. package/commonjs/ExternalLink/README.md +81 -0
  19. package/commonjs/Gantt/README.md +155 -0
  20. package/commonjs/Grid/README.md +197 -0
  21. package/commonjs/Header/README.md +109 -0
  22. package/commonjs/HelloWave/README.md +28 -0
  23. package/commonjs/Hoverable/Hoverable.js.map +1 -1
  24. package/commonjs/IconText/README.md +99 -0
  25. package/commonjs/Image/PreviewImg/README.md +100 -0
  26. package/commonjs/Image/README.md +88 -0
  27. package/commonjs/Input/Input.js +60 -4
  28. package/commonjs/Input/Input.js.map +1 -1
  29. package/commonjs/Layout/README.md +174 -0
  30. package/commonjs/LineChart/README.md +181 -0
  31. package/commonjs/ListItem/README.md +122 -0
  32. package/commonjs/MessageBox/MessageBox.js +7 -1
  33. package/commonjs/MessageBox/MessageBox.js.map +1 -1
  34. package/commonjs/MessageBox/README.md +120 -0
  35. package/commonjs/Navigation/README.md +197 -0
  36. package/commonjs/NumericInput/README.md +95 -0
  37. package/commonjs/Overlay/README.md +84 -0
  38. package/commonjs/Pagination/README.md +106 -0
  39. package/commonjs/PieChart/README.md +212 -0
  40. package/commonjs/Popover/README.md +82 -0
  41. package/commonjs/Progress/README.md +106 -0
  42. package/commonjs/RadioButton/README.md +85 -0
  43. package/commonjs/ScanButton/README.md +72 -0
  44. package/commonjs/SearchInput/SearchInput.js.map +1 -1
  45. package/commonjs/SheetTitle/README.md +89 -0
  46. package/commonjs/Shell/README.md +152 -0
  47. package/commonjs/Shell/Shell.js.map +1 -1
  48. package/commonjs/StatisticCard/README.md +129 -0
  49. package/commonjs/Status/README.md +75 -0
  50. package/commonjs/Steps/README.md +76 -0
  51. package/commonjs/Switch/Switch.js +101 -0
  52. package/commonjs/Switch/Switch.js.map +1 -0
  53. package/commonjs/Tab/README.md +161 -0
  54. package/commonjs/Tag/README.md +93 -0
  55. package/commonjs/Task/README.md +110 -0
  56. package/commonjs/Text/README.md +97 -0
  57. package/commonjs/TextArea/README.md +127 -0
  58. package/commonjs/TextArea/TextArea.js +4 -2
  59. package/commonjs/TextArea/TextArea.js.map +1 -1
  60. package/commonjs/Theme/README.md +161 -0
  61. package/commonjs/Theme/makeStyles.js +30 -0
  62. package/commonjs/Theme/makeStyles.js.map +1 -0
  63. package/commonjs/Theme/withTheme.js +91 -0
  64. package/commonjs/Theme/withTheme.js.map +1 -0
  65. package/commonjs/Timeline/README.md +111 -0
  66. package/commonjs/Toast/README.md +96 -0
  67. package/commonjs/Upload/Upload.js +126 -0
  68. package/commonjs/Upload/Upload.js.map +1 -0
  69. package/commonjs/index.js +24 -4
  70. package/commonjs/index.js.map +1 -1
  71. package/module/Alert/README.md +75 -0
  72. package/module/BarChart/README.md +172 -0
  73. package/module/Button/README.md +108 -0
  74. package/module/Calendar/Calendar.base.js +1 -1
  75. package/module/Calendar/Calendar.base.js.map +1 -1
  76. package/module/Calendar/README.md +410 -0
  77. package/module/Card/README.md +126 -0
  78. package/module/CheckBox/README.md +147 -0
  79. package/module/CircularProgress/README.md +70 -0
  80. package/module/Collapsible/README.md +140 -0
  81. package/module/ComboChart/README.md +124 -0
  82. package/module/DashboardCard/README.md +120 -0
  83. package/module/DataTable/README.md +159 -0
  84. package/module/DeviceSelectionModal/README.md +124 -0
  85. package/module/DraggableFlatList/README.md +35 -0
  86. package/module/Drawer/README.md +175 -0
  87. package/module/Dropdown/README.md +230 -0
  88. package/module/ExternalLink/README.md +81 -0
  89. package/module/Gantt/README.md +155 -0
  90. package/module/Grid/README.md +197 -0
  91. package/module/Header/README.md +109 -0
  92. package/module/HelloWave/README.md +28 -0
  93. package/module/Hoverable/Hoverable.js.map +1 -1
  94. package/module/IconText/README.md +99 -0
  95. package/module/Image/PreviewImg/README.md +100 -0
  96. package/module/Image/README.md +88 -0
  97. package/module/Input/Input.js +60 -4
  98. package/module/Input/Input.js.map +1 -1
  99. package/module/Layout/README.md +174 -0
  100. package/module/LineChart/README.md +181 -0
  101. package/module/ListItem/README.md +122 -0
  102. package/module/MessageBox/MessageBox.js +8 -2
  103. package/module/MessageBox/MessageBox.js.map +1 -1
  104. package/module/MessageBox/README.md +120 -0
  105. package/module/Navigation/README.md +197 -0
  106. package/module/NumericInput/README.md +95 -0
  107. package/module/Overlay/README.md +84 -0
  108. package/module/Pagination/README.md +106 -0
  109. package/module/PieChart/README.md +212 -0
  110. package/module/Popover/README.md +82 -0
  111. package/module/Progress/README.md +106 -0
  112. package/module/RadioButton/README.md +85 -0
  113. package/module/ScanButton/README.md +72 -0
  114. package/module/SearchInput/SearchInput.js.map +1 -1
  115. package/module/SheetTitle/README.md +89 -0
  116. package/module/Shell/README.md +152 -0
  117. package/module/Shell/Shell.js.map +1 -1
  118. package/module/StatisticCard/README.md +129 -0
  119. package/module/Status/README.md +75 -0
  120. package/module/Steps/README.md +76 -0
  121. package/module/Switch/Switch.js +96 -0
  122. package/module/Switch/Switch.js.map +1 -0
  123. package/module/Tab/README.md +161 -0
  124. package/module/Tag/README.md +93 -0
  125. package/module/Task/README.md +110 -0
  126. package/module/Text/README.md +97 -0
  127. package/module/TextArea/README.md +127 -0
  128. package/module/TextArea/TextArea.js +4 -2
  129. package/module/TextArea/TextArea.js.map +1 -1
  130. package/module/Theme/README.md +161 -0
  131. package/module/Theme/makeStyles.js +24 -0
  132. package/module/Theme/makeStyles.js.map +1 -0
  133. package/module/Theme/withTheme.js +82 -0
  134. package/module/Theme/withTheme.js.map +1 -0
  135. package/module/Timeline/README.md +111 -0
  136. package/module/Toast/README.md +96 -0
  137. package/module/Upload/Upload.js +121 -0
  138. package/module/Upload/Upload.js.map +1 -0
  139. package/module/index.js +11 -3
  140. package/module/index.js.map +1 -1
  141. package/package.json +1 -1
  142. package/typescript/Grid/FixedSizeGrid.d.ts +1 -3
  143. package/typescript/Grid/FixedSizeGrid.d.ts.map +1 -1
  144. package/typescript/Grid/Grid.base.d.ts +1 -3
  145. package/typescript/Grid/Grid.base.d.ts.map +1 -1
  146. package/typescript/Grid/VariableSizeGrid.d.ts +1 -3
  147. package/typescript/Grid/VariableSizeGrid.d.ts.map +1 -1
  148. package/typescript/Input/Input.d.ts +5 -0
  149. package/typescript/Input/Input.d.ts.map +1 -1
  150. package/typescript/MessageBox/MessageBox.d.ts.map +1 -1
  151. package/typescript/SearchInput/SearchInput.d.ts +4 -0
  152. package/typescript/SearchInput/SearchInput.d.ts.map +1 -1
  153. package/typescript/Switch/Switch.d.ts +15 -0
  154. package/typescript/Switch/Switch.d.ts.map +1 -0
  155. package/typescript/TextArea/TextArea.d.ts +2 -0
  156. package/typescript/TextArea/TextArea.d.ts.map +1 -1
  157. package/typescript/Theme/makeStyles.d.ts +11 -0
  158. package/typescript/Theme/makeStyles.d.ts.map +1 -0
  159. package/typescript/Theme/withTheme.d.ts +12 -0
  160. package/typescript/Theme/withTheme.d.ts.map +1 -0
  161. package/typescript/Upload/Upload.d.ts +25 -0
  162. package/typescript/Upload/Upload.d.ts.map +1 -0
  163. package/typescript/WebViewBridge/useWebViewBridge.d.ts +1 -1
  164. package/typescript/WebViewBridge/useWebViewBridge.d.ts.map +1 -1
  165. package/typescript/common/hooks/useBridgelessFix.d.ts +1 -1
  166. package/typescript/index.d.ts +7 -1
  167. package/typescript/index.d.ts.map +1 -1
@@ -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` 的间距
@@ -0,0 +1,110 @@
1
+ # Task
2
+
3
+ 任务卡片组件(TaskCard),用于在甘特图或看板中展示任务的详细信息。包含标题、描述、状态标签、完成进度和时间范围,四种状态(Waiting / Ongoing / Delay / Completed)各有对应的颜色和样式。
4
+
5
+ ## 功能特性
6
+
7
+ - ✅ 四种任务状态:Waiting(等待)、Ongoing(进行中)、Delay(延迟)、Completed(已完成)
8
+ - ✅ 状态自动匹配颜色和背景(绿色/红色/蓝色/灰色)
9
+ - ✅ 进度条背景色覆盖(左侧彩色边框 + 背景填充)
10
+ - ✅ 多条描述文本展示(description 数组)
11
+ - ✅ 完成百分比显示
12
+ - ✅ 时间范围展示(开始时间 - 结束时间)
13
+ - ✅ Completed 状态自动隐藏时间范围和状态标签
14
+ - ✅ 支持自定义状态文本(statusText)和完成文本(completedText)
15
+ - ✅ 卡片阴影效果
16
+ - ✅ 主题色适配
17
+
18
+ ## 安装使用
19
+
20
+ ```tsx
21
+ import { TaskCard } from '@beppla/tapas-ui';
22
+ ```
23
+
24
+ ## Props
25
+
26
+ | 属性 | 类型 | 默认值 | 说明 |
27
+ |------|------|--------|------|
28
+ | title | `string` | - | 任务标题(必填) |
29
+ | description | `string[]` | - | 描述文本数组(必填) |
30
+ | state | `keyof typeof TaskStatus` | - | 任务状态(必填) |
31
+ | timeRange | `string[]` | - | 时间范围 [start, end](必填) |
32
+ | completion | `number` | - | 完成比例(0-1) |
33
+ | statusText | `Record<keyof typeof TaskStatus, string>` | - | 自定义状态文本映射 |
34
+ | completedText | `string` | - | 完成状态显示文本 |
35
+ | style | `CSSProperties` | `{}` | 自定义外层样式 |
36
+
37
+ ### TaskStatus 枚举
38
+
39
+ ```tsx
40
+ enum TaskStatus {
41
+ Waiting = 'Waiting',
42
+ Ongoing = 'Ongoing',
43
+ Delay = 'Delay',
44
+ Completed = 'Completed',
45
+ }
46
+ ```
47
+
48
+ ## 使用示例
49
+
50
+ ### 进行中的任务
51
+
52
+ ```tsx
53
+ <TaskCard
54
+ title="Kitchen preparation"
55
+ description={['Table 5', 'Main course']}
56
+ state="Ongoing"
57
+ timeRange={['09:00', '10:30']}
58
+ completion={0.6}
59
+ />
60
+ ```
61
+
62
+ ### 延迟任务
63
+
64
+ ```tsx
65
+ <TaskCard
66
+ title="Delivery order #123"
67
+ description={['Customer: John', 'Priority: High']}
68
+ state="Delay"
69
+ timeRange={['14:00', '15:00']}
70
+ completion={0.3}
71
+ />
72
+ ```
73
+
74
+ ### 已完成任务
75
+
76
+ ```tsx
77
+ <TaskCard
78
+ title="Inventory check"
79
+ description={['Warehouse A']}
80
+ state="Completed"
81
+ timeRange={['08:00', '09:00']}
82
+ completedText="Done"
83
+ />
84
+ ```
85
+
86
+ ### 自定义状态文本
87
+
88
+ ```tsx
89
+ <TaskCard
90
+ title="Task"
91
+ description={['Info']}
92
+ state="Waiting"
93
+ timeRange={['10:00', '11:00']}
94
+ statusText={{
95
+ Waiting: 'Pending',
96
+ Ongoing: 'In Progress',
97
+ Delay: 'Overdue',
98
+ Completed: 'Finished',
99
+ }}
100
+ />
101
+ ```
102
+
103
+ ## 注意事项
104
+
105
+ - 组件使用 HTML div + span 元素,仅适用于 Web 平台
106
+ - `completion` 值范围 0-1,Completed 状态自动设为 1,Waiting 状态自动设为 0
107
+ - 进度背景宽度通过 CSS calc 计算:`calc(completion * 100% + 28px)`
108
+ - 描述文本超长会自动省略(text-overflow: ellipsis)
109
+ - 卡片使用 @rneui/themed 的 Card 组件,带有 boxShadow 效果
110
+ - 需在 `ThemeProvider` 内使用
@@ -0,0 +1,97 @@
1
+ # Text
2
+
3
+ 可交互的文本标签组件,支持选中状态、悬停效果、多种尺寸和两种视觉类型。适用于筛选标签、价格区间选择、分类标签等场景,非通用 Text 组件。
4
+
5
+ ## 功能特性
6
+
7
+ - ✅ 两种视觉类型:primary(填充灰色背景)和 secondary(边框样式)
8
+ - ✅ 三种尺寸模式:standard (40px) / medium (36px) / small (32px)
9
+ - ✅ 选中状态:primary 变为主题色背景+白字,secondary 显示主题色边框
10
+ - ✅ 鼠标悬停效果(仅 Web 端,Hoverable 实现)
11
+ - ✅ 禁用状态,颜色置灰,渲染为不可交互的 Text
12
+ - ✅ 支持点击事件
13
+ - ✅ 文本单行截断(numberOfLines=1)
14
+ - ✅ 继承 @rneui/themed TextProps
15
+ - ✅ 圆角样式(theme.radius.rounded)
16
+
17
+ ## 安装使用
18
+
19
+ ```tsx
20
+ import Text from '@beppla/tapas-ui/components/Text/Text';
21
+ ```
22
+
23
+ ## Props
24
+
25
+ | 属性 | 类型 | 默认值 | 说明 |
26
+ |------|------|--------|------|
27
+ | children | `React.ReactNode` | - | 文本内容 |
28
+ | mode | `'standard' \| 'medium' \| 'small'` | - | 尺寸模式,影响高度和字号 |
29
+ | type | `'primary' \| 'secondary'` | `'primary'` | 视觉类型 |
30
+ | selected | `boolean` | `false` | 是否选中 |
31
+ | disabled | `boolean` | - | 是否禁用 |
32
+ | onPress | `() => void` | - | 点击回调 |
33
+ | hoverStyle | `StyleProp<ViewStyle>` | - | 自定义悬停样式 |
34
+ | style | 继承自 TextProps | - | 自定义样式 |
35
+
36
+ ## 使用示例
37
+
38
+ ### 基础用法
39
+
40
+ ```tsx
41
+ <Text mode="standard">Hello World</Text>
42
+ ```
43
+
44
+ ### 不同尺寸
45
+
46
+ ```tsx
47
+ <Text mode="standard" style={{ width: 200 }}>Standard (40px)</Text>
48
+ <Text mode="medium" style={{ width: 160 }}>Medium (36px)</Text>
49
+ <Text mode="small" style={{ width: 100 }}>Small (32px)</Text>
50
+ ```
51
+
52
+ ### Secondary 类型
53
+
54
+ ```tsx
55
+ <Text mode="standard" type="secondary">边框样式</Text>
56
+ <Text mode="medium" type="secondary" selected>选中状态</Text>
57
+ ```
58
+
59
+ ### 选中与禁用
60
+
61
+ ```tsx
62
+ <Text mode="small" selected>已选中(Primary)</Text>
63
+ <Text mode="medium" disabled>已禁用</Text>
64
+ <Text mode="small" type="secondary" disabled>禁用边框</Text>
65
+ ```
66
+
67
+ ### 带点击事件
68
+
69
+ ```tsx
70
+ <Text mode="standard" onPress={() => console.log('Clicked')}>
71
+ 可点击标签
72
+ </Text>
73
+ ```
74
+
75
+ ### 动态选择
76
+
77
+ ```tsx
78
+ const [selected, setSelected] = useState(false);
79
+
80
+ <Text
81
+ mode="standard"
82
+ selected={selected}
83
+ onPress={() => setSelected(!selected)}
84
+ >
85
+ 切换选择状态
86
+ </Text>
87
+ ```
88
+
89
+ ## 注意事项
90
+
91
+ - 该组件是专用的**标签/筛选按钮组件**,非通用文本渲染组件
92
+ - 禁用状态下不渲染 TouchableOpacity,直接渲染为普通 RNText
93
+ - Web 端通过 Hoverable 实现悬停效果,Native 端无悬停
94
+ - `selected` 状态受外部控制,内部通过 `useEffect` 同步
95
+ - `mode` 属性决定高度和字号:standard=40px、medium=36px、small=32px(small 字号也更小)
96
+ - primary 类型选中时背景变为主色+白字,secondary 类型选中时添加主色边框
97
+ - 组件使用 `@rneui/themed` 主题系统,需在 ThemeProvider 内使用
@@ -0,0 +1,127 @@
1
+ # TextArea
2
+
3
+ 多行文本输入组件,支持浮动标签、字符计数、清空按钮和错误状态等功能。
4
+
5
+ ## 功能特性
6
+
7
+ - ✅ 支持多行文本输入
8
+ - ✅ 浮动标签动画(聚焦/有内容时标签上移)
9
+ - ✅ 字符计数功能(显示当前字数/最大字数)
10
+ - ✅ 一键清空按钮
11
+ - ✅ 必填标识(红色星号)
12
+ - ✅ 错误状态(红色边框 + 错误提示文字)
13
+ - ✅ 聚焦时边框变粗并使用主题色
14
+ - ✅ 可自定义高度、行数和背景色
15
+ - ✅ 支持禁用状态
16
+ - ✅ 兼容 RN 0.77 Bridgeless 模式(Android 焦点管理修复)
17
+
18
+ ## 安装使用
19
+
20
+ ```tsx
21
+ import TextArea from '@beppla/tapas-ui/components/TextArea/TextArea';
22
+ ```
23
+
24
+ ## Props
25
+
26
+ | 属性 | 类型 | 默认值 | 说明 |
27
+ |------|------|--------|------|
28
+ | height | `number` | `88` | 输入框高度 |
29
+ | label | `string` | - | 浮动标签文字 |
30
+ | showCount | `boolean` | `false` | 是否显示字符计数 |
31
+ | showClearBtn | `boolean` | `false` | 是否显示清空按钮 |
32
+ | value | `string` | - | 输入框内容 |
33
+ | numberOfLines | `number` | `4` | 显示行数 |
34
+ | maxCount | `number` | `100` | 最大字符数(仅用于计数显示) |
35
+ | placeholder | `string` | - | 占位文字 |
36
+ | required | `boolean` | `false` | 是否必填(显示红色星号) |
37
+ | onChangeText | `(value: string) => void` | - | 内容变化回调 |
38
+ | backgroundColor | `string` | - | 标签背景色 |
39
+ | state | `'normal' \| 'error'` | `'normal'` | 状态 |
40
+ | stateMsg | `string` | - | 状态提示信息 |
41
+ | disabled | `boolean` | - | 是否禁用 |
42
+ | enableBridgelessFix | `boolean` | `true` | 是否启用 RN 0.77 Bridgeless 模式兼容修复 |
43
+
44
+ ## 使用示例
45
+
46
+ ### 基础用法
47
+
48
+ ```tsx
49
+ <TextArea
50
+ label="描述"
51
+ placeholder="请输入详细描述..."
52
+ />
53
+ ```
54
+
55
+ ### 带字符计数
56
+
57
+ ```tsx
58
+ <TextArea
59
+ label="产品描述"
60
+ placeholder="请详细描述产品特性..."
61
+ showCount={true}
62
+ maxCount={150}
63
+ required={true}
64
+ />
65
+ ```
66
+
67
+ ### 带清空按钮
68
+
69
+ ```tsx
70
+ <TextArea
71
+ label="备注信息"
72
+ placeholder="请输入备注..."
73
+ showClearBtn={true}
74
+ value="示例文本"
75
+ />
76
+ ```
77
+
78
+ ### 错误状态
79
+
80
+ ```tsx
81
+ <TextArea
82
+ label="必填字段"
83
+ placeholder="此字段不能为空"
84
+ required={true}
85
+ state="error"
86
+ stateMsg="请输入有效的内容"
87
+ showCount={true}
88
+ maxCount={100}
89
+ />
90
+ ```
91
+
92
+ ### 完整功能
93
+
94
+ ```tsx
95
+ const [value, setValue] = useState('');
96
+
97
+ <TextArea
98
+ label="用户反馈"
99
+ placeholder="请详细描述您遇到的问题..."
100
+ required={true}
101
+ showCount={true}
102
+ showClearBtn={true}
103
+ maxCount={300}
104
+ numberOfLines={6}
105
+ height={120}
106
+ value={value}
107
+ onChangeText={setValue}
108
+ />
109
+ ```
110
+
111
+ ### 禁用状态
112
+
113
+ ```tsx
114
+ <TextArea
115
+ label="只读内容"
116
+ value="这是只读的文本内容"
117
+ disabled={true}
118
+ />
119
+ ```
120
+
121
+ ## 注意事项
122
+
123
+ - `maxCount` 仅用于计数显示,不会限制实际输入字数
124
+ - 当设置 `label` 时,`placeholder` 会在未聚焦且无内容时作为标签文字显示
125
+ - 不设置 `label` 时,`placeholder` 作为普通占位符显示
126
+ - 容器高度会根据 `height`、`numberOfLines`、`label` 和 `showCount` 自动计算
127
+ - Android 上启用了 Bridgeless 模式兼容修复,如遇焦点异常可设置 `enableBridgelessFix={false}`