@unif/react-native-chat 0.1.0 → 0.1.2

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 (91) hide show
  1. package/README.md +156 -0
  2. package/lib/commonjs/bubble/Bubble.js +131 -0
  3. package/lib/commonjs/bubble/Bubble.js.map +1 -0
  4. package/lib/commonjs/bubble/BubbleList.js +73 -0
  5. package/lib/commonjs/bubble/BubbleList.js.map +1 -0
  6. package/lib/commonjs/bubble/index.md +111 -0
  7. package/lib/commonjs/card-wrapper/CardWrapper.js +65 -0
  8. package/lib/commonjs/card-wrapper/CardWrapper.js.map +1 -0
  9. package/lib/commonjs/card-wrapper/index.md +78 -0
  10. package/lib/commonjs/conversations/Conversations.js +184 -0
  11. package/lib/commonjs/conversations/Conversations.js.map +1 -0
  12. package/lib/commonjs/conversations/index.md +90 -0
  13. package/lib/commonjs/index.js +63 -0
  14. package/lib/commonjs/index.js.map +1 -0
  15. package/lib/commonjs/package.json +1 -0
  16. package/lib/commonjs/prompts/Prompts.js +87 -0
  17. package/lib/commonjs/prompts/Prompts.js.map +1 -0
  18. package/lib/commonjs/prompts/index.md +81 -0
  19. package/lib/commonjs/sender/Sender.js +354 -0
  20. package/lib/commonjs/sender/Sender.js.map +1 -0
  21. package/lib/commonjs/sender/index.md +131 -0
  22. package/lib/commonjs/theme/tokens.js +67 -0
  23. package/lib/commonjs/theme/tokens.js.map +1 -0
  24. package/lib/commonjs/welcome/Welcome.js +152 -0
  25. package/lib/commonjs/welcome/Welcome.js.map +1 -0
  26. package/lib/commonjs/welcome/index.md +95 -0
  27. package/lib/module/bubble/Bubble.js +126 -0
  28. package/lib/module/bubble/Bubble.js.map +1 -0
  29. package/lib/module/bubble/BubbleList.js +68 -0
  30. package/lib/module/bubble/BubbleList.js.map +1 -0
  31. package/lib/module/bubble/index.md +111 -0
  32. package/lib/module/card-wrapper/CardWrapper.js +60 -0
  33. package/lib/module/card-wrapper/CardWrapper.js.map +1 -0
  34. package/lib/module/card-wrapper/index.md +78 -0
  35. package/lib/module/conversations/Conversations.js +179 -0
  36. package/lib/module/conversations/Conversations.js.map +1 -0
  37. package/lib/module/conversations/index.md +90 -0
  38. package/lib/module/index.js +23 -0
  39. package/lib/module/index.js.map +1 -0
  40. package/lib/module/package.json +1 -0
  41. package/lib/module/prompts/Prompts.js +82 -0
  42. package/lib/module/prompts/Prompts.js.map +1 -0
  43. package/lib/module/prompts/index.md +81 -0
  44. package/lib/module/sender/Sender.js +349 -0
  45. package/lib/module/sender/Sender.js.map +1 -0
  46. package/lib/module/sender/index.md +131 -0
  47. package/lib/module/theme/tokens.js +63 -0
  48. package/lib/module/theme/tokens.js.map +1 -0
  49. package/lib/module/welcome/Welcome.js +147 -0
  50. package/lib/module/welcome/Welcome.js.map +1 -0
  51. package/lib/module/welcome/index.md +95 -0
  52. package/lib/typescript/commonjs/bubble/Bubble.d.ts +29 -0
  53. package/lib/typescript/commonjs/bubble/Bubble.d.ts.map +1 -0
  54. package/lib/typescript/commonjs/bubble/BubbleList.d.ts +20 -0
  55. package/lib/typescript/commonjs/bubble/BubbleList.d.ts.map +1 -0
  56. package/lib/typescript/commonjs/card-wrapper/CardWrapper.d.ts +22 -0
  57. package/lib/typescript/commonjs/card-wrapper/CardWrapper.d.ts.map +1 -0
  58. package/lib/typescript/commonjs/conversations/Conversations.d.ts +37 -0
  59. package/lib/typescript/commonjs/conversations/Conversations.d.ts.map +1 -0
  60. package/lib/typescript/commonjs/index.d.ts +20 -0
  61. package/lib/typescript/commonjs/index.d.ts.map +1 -0
  62. package/lib/typescript/commonjs/package.json +1 -0
  63. package/lib/typescript/commonjs/prompts/Prompts.d.ts +27 -0
  64. package/lib/typescript/commonjs/prompts/Prompts.d.ts.map +1 -0
  65. package/lib/typescript/commonjs/sender/Sender.d.ts +58 -0
  66. package/lib/typescript/commonjs/sender/Sender.d.ts.map +1 -0
  67. package/lib/typescript/commonjs/theme/tokens.d.ts +52 -0
  68. package/lib/typescript/commonjs/theme/tokens.d.ts.map +1 -0
  69. package/lib/typescript/commonjs/welcome/Welcome.d.ts +39 -0
  70. package/lib/typescript/commonjs/welcome/Welcome.d.ts.map +1 -0
  71. package/lib/typescript/module/bubble/Bubble.d.ts +29 -0
  72. package/lib/typescript/module/bubble/Bubble.d.ts.map +1 -0
  73. package/lib/typescript/module/bubble/BubbleList.d.ts +20 -0
  74. package/lib/typescript/module/bubble/BubbleList.d.ts.map +1 -0
  75. package/lib/typescript/module/card-wrapper/CardWrapper.d.ts +22 -0
  76. package/lib/typescript/module/card-wrapper/CardWrapper.d.ts.map +1 -0
  77. package/lib/typescript/module/conversations/Conversations.d.ts +37 -0
  78. package/lib/typescript/module/conversations/Conversations.d.ts.map +1 -0
  79. package/lib/typescript/module/index.d.ts +20 -0
  80. package/lib/typescript/module/index.d.ts.map +1 -0
  81. package/lib/typescript/module/package.json +1 -0
  82. package/lib/typescript/module/prompts/Prompts.d.ts +27 -0
  83. package/lib/typescript/module/prompts/Prompts.d.ts.map +1 -0
  84. package/lib/typescript/module/sender/Sender.d.ts +58 -0
  85. package/lib/typescript/module/sender/Sender.d.ts.map +1 -0
  86. package/lib/typescript/module/theme/tokens.d.ts +52 -0
  87. package/lib/typescript/module/theme/tokens.d.ts.map +1 -0
  88. package/lib/typescript/module/welcome/Welcome.d.ts +39 -0
  89. package/lib/typescript/module/welcome/Welcome.d.ts.map +1 -0
  90. package/package.json +39 -8
  91. package/src/sender/Sender.tsx +2 -0
@@ -0,0 +1,78 @@
1
+ ---
2
+ title: CardWrapper 卡片容器
3
+ nav:
4
+ title: 组件
5
+ path: /components
6
+ ---
7
+
8
+ # CardWrapper 卡片容器
9
+
10
+ 通用卡片路由容器,通过 `registry` props 注入实现卡片类型到组件的映射。
11
+
12
+ ## 何时使用
13
+
14
+ - AI 回复中包含结构化卡片内容(产品列表、表单、图表等)
15
+ - 需要根据 `cardType` 动态渲染不同业务组件
16
+
17
+ ## 代码示例
18
+
19
+ ### 基本用法
20
+
21
+ ```tsx
22
+ import { CardWrapper, type CardComponentType } from '@unif/react-native-chat';
23
+
24
+ // 定义业务卡片
25
+ const ProductCard: CardComponentType = ({ data, actions }) => (
26
+ <View>
27
+ <Text>{data.productName as string}</Text>
28
+ <Text>{data.price as string}</Text>
29
+ </View>
30
+ );
31
+
32
+ // 注册卡片
33
+ const registry = {
34
+ product_list: ProductCard,
35
+ };
36
+
37
+ <CardWrapper
38
+ cardType="product_list"
39
+ data={{ productName: '基金A', price: '1.2345' }}
40
+ actions={['buy', 'detail']}
41
+ registry={registry}
42
+ />
43
+ ```
44
+
45
+ ### 自定义 fallback
46
+
47
+ ```tsx
48
+ <CardWrapper
49
+ cardType="unknown_type"
50
+ data={{}}
51
+ actions={[]}
52
+ registry={registry}
53
+ fallback={<Text>暂不支持此类型</Text>}
54
+ />
55
+ ```
56
+
57
+ ## API
58
+
59
+ ### CardWrapperProps
60
+
61
+ | 属性 | 说明 | 类型 | 默认值 |
62
+ |------|------|------|--------|
63
+ | cardType | 卡片类型标识 | `string` | - |
64
+ | data | 卡片数据 | `Record<string, unknown>` | - |
65
+ | actions | 可用操作列表 | `string[]` | - |
66
+ | registry | 卡片注册表 | `Record<string, CardComponentType>` | `{}` |
67
+ | fallback | 未知卡片类型的 fallback | `ReactNode` | 默认错误提示 |
68
+ | style | 容器样式 | `ViewStyle` | - |
69
+ | testID | 测试标识 | `string` | - |
70
+
71
+ ### CardComponentType
72
+
73
+ ```typescript
74
+ type CardComponentType = React.ComponentType<{
75
+ data: Record<string, unknown>;
76
+ actions: string[];
77
+ }>;
78
+ ```
@@ -0,0 +1,179 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Conversations — 会话列表
5
+ *
6
+ * SectionList + 日期分组(今天/昨天/更早)
7
+ * 基于 ListItem 模式渲染
8
+ */
9
+
10
+ import React, { useCallback, useMemo } from 'react';
11
+ import { View, Text, TouchableOpacity, Alert, SectionList, StyleSheet } from 'react-native';
12
+ import { chatTokens } from "../theme/tokens.js";
13
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
14
+ function groupByDate(sessions) {
15
+ const now = new Date();
16
+ const todayStart = new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime();
17
+ const yesterdayStart = todayStart - 86400000;
18
+ const groups = [];
19
+ const today = [];
20
+ const yesterday = [];
21
+ const earlier = [];
22
+ for (const s of sessions) {
23
+ if (s.timestamp >= todayStart) {
24
+ today.push(s);
25
+ } else if (s.timestamp >= yesterdayStart) {
26
+ yesterday.push(s);
27
+ } else {
28
+ earlier.push(s);
29
+ }
30
+ }
31
+ if (today.length > 0) groups.push({
32
+ title: '今天',
33
+ data: today
34
+ });
35
+ if (yesterday.length > 0) groups.push({
36
+ title: '昨天',
37
+ data: yesterday
38
+ });
39
+ if (earlier.length > 0) groups.push({
40
+ title: '更早',
41
+ data: earlier
42
+ });
43
+ return groups;
44
+ }
45
+ const Conversations = ({
46
+ items,
47
+ activeId,
48
+ onSelect,
49
+ onDelete,
50
+ onNew,
51
+ groupByDate: shouldGroup = true,
52
+ header,
53
+ style,
54
+ styles: semanticStyles,
55
+ testID = 'conversations'
56
+ }) => {
57
+ const sections = useMemo(() => {
58
+ if (shouldGroup) {
59
+ return groupByDate(items);
60
+ }
61
+ return [{
62
+ title: '',
63
+ data: items
64
+ }];
65
+ }, [items, shouldGroup]);
66
+ const handleDelete = useCallback(item => {
67
+ if (!onDelete) return;
68
+ Alert.alert('删除会话', `确定删除"${item.title}"?`, [{
69
+ text: '取消',
70
+ style: 'cancel'
71
+ }, {
72
+ text: '删除',
73
+ style: 'destructive',
74
+ onPress: () => onDelete(item.id)
75
+ }]);
76
+ }, [onDelete]);
77
+ const renderItem = useCallback(({
78
+ item
79
+ }) => {
80
+ const isActive = item.id === activeId;
81
+ return /*#__PURE__*/_jsx(TouchableOpacity, {
82
+ style: [defaultStyles.sessionItem, semanticStyles?.item, isActive && defaultStyles.sessionItemActive, isActive && semanticStyles?.itemActive],
83
+ onPress: () => onSelect(item.id),
84
+ onLongPress: () => handleDelete(item),
85
+ activeOpacity: 0.7,
86
+ testID: `${testID}-item-${item.id}`,
87
+ children: /*#__PURE__*/_jsx(Text, {
88
+ style: defaultStyles.sessionTitle,
89
+ numberOfLines: 1,
90
+ children: item.title
91
+ })
92
+ });
93
+ }, [activeId, onSelect, handleDelete, semanticStyles, testID]);
94
+ const renderSectionHeader = useCallback(({
95
+ section
96
+ }) => {
97
+ if (!section.title) return null;
98
+ return /*#__PURE__*/_jsx(Text, {
99
+ style: [defaultStyles.sectionHeader, semanticStyles?.sectionHeader],
100
+ children: section.title
101
+ });
102
+ }, [semanticStyles]);
103
+ return /*#__PURE__*/_jsxs(View, {
104
+ style: [defaultStyles.container, semanticStyles?.root, style],
105
+ testID: testID,
106
+ children: [header, onNew && /*#__PURE__*/_jsx(View, {
107
+ style: defaultStyles.newButtonWrapper,
108
+ children: /*#__PURE__*/_jsx(TouchableOpacity, {
109
+ style: [defaultStyles.newButton, semanticStyles?.newButton],
110
+ onPress: onNew,
111
+ testID: `${testID}-new`,
112
+ children: /*#__PURE__*/_jsx(Text, {
113
+ style: defaultStyles.newButtonText,
114
+ children: "\uFF0B \u65B0\u5EFA\u4F1A\u8BDD"
115
+ })
116
+ })
117
+ }), /*#__PURE__*/_jsx(SectionList, {
118
+ sections: sections,
119
+ keyExtractor: item => item.id,
120
+ renderItem: renderItem,
121
+ renderSectionHeader: renderSectionHeader,
122
+ style: defaultStyles.list,
123
+ showsVerticalScrollIndicator: false,
124
+ stickySectionHeadersEnabled: false
125
+ })]
126
+ });
127
+ };
128
+ const defaultStyles = StyleSheet.create({
129
+ container: {
130
+ flex: 1
131
+ },
132
+ newButtonWrapper: {
133
+ alignItems: 'center',
134
+ paddingVertical: 12,
135
+ paddingHorizontal: 20
136
+ },
137
+ newButton: {
138
+ flexDirection: 'row',
139
+ alignItems: 'center',
140
+ justifyContent: 'center',
141
+ width: '80%',
142
+ paddingVertical: 10,
143
+ borderRadius: chatTokens.radiusFull,
144
+ borderWidth: 1,
145
+ borderColor: chatTokens.colorPrimary
146
+ },
147
+ newButtonText: {
148
+ fontSize: 14,
149
+ fontWeight: '500',
150
+ color: chatTokens.colorPrimary
151
+ },
152
+ sectionHeader: {
153
+ fontSize: 12,
154
+ color: chatTokens.colorTextSecondary,
155
+ paddingHorizontal: 20,
156
+ paddingTop: 16,
157
+ paddingBottom: 6
158
+ },
159
+ sessionItem: {
160
+ flexDirection: 'row',
161
+ alignItems: 'center',
162
+ paddingHorizontal: 20,
163
+ paddingVertical: 12
164
+ },
165
+ sessionItemActive: {
166
+ backgroundColor: '#F3F4F6'
167
+ },
168
+ sessionTitle: {
169
+ flex: 1,
170
+ fontSize: 14,
171
+ fontWeight: '500',
172
+ color: chatTokens.colorText
173
+ },
174
+ list: {
175
+ flex: 1
176
+ }
177
+ });
178
+ export default /*#__PURE__*/React.memo(Conversations);
179
+ //# sourceMappingURL=Conversations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","useCallback","useMemo","View","Text","TouchableOpacity","Alert","SectionList","StyleSheet","chatTokens","jsx","_jsx","jsxs","_jsxs","groupByDate","sessions","now","Date","todayStart","getFullYear","getMonth","getDate","getTime","yesterdayStart","groups","today","yesterday","earlier","s","timestamp","push","length","title","data","Conversations","items","activeId","onSelect","onDelete","onNew","shouldGroup","header","style","styles","semanticStyles","testID","sections","handleDelete","item","alert","text","onPress","id","renderItem","isActive","defaultStyles","sessionItem","sessionItemActive","itemActive","onLongPress","activeOpacity","children","sessionTitle","numberOfLines","renderSectionHeader","section","sectionHeader","container","root","newButtonWrapper","newButton","newButtonText","keyExtractor","list","showsVerticalScrollIndicator","stickySectionHeadersEnabled","create","flex","alignItems","paddingVertical","paddingHorizontal","flexDirection","justifyContent","width","borderRadius","radiusFull","borderWidth","borderColor","colorPrimary","fontSize","fontWeight","color","colorTextSecondary","paddingTop","paddingBottom","backgroundColor","colorText","memo"],"sourceRoot":"../../../src","sources":["conversations/Conversations.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,90 @@
1
+ ---
2
+ title: Conversations 会话列表
3
+ nav:
4
+ title: 组件
5
+ path: /components
6
+ ---
7
+
8
+ # Conversations 会话列表
9
+
10
+ 按日期分组的会话列表组件,支持新建、选中、删除操作。
11
+
12
+ ## 何时使用
13
+
14
+ - 展示聊天历史会话列表
15
+ - 需要按日期分组(今天/昨天/更早)
16
+ - 侧边栏会话管理
17
+
18
+ ## 代码示例
19
+
20
+ ### 基本用法
21
+
22
+ ```tsx
23
+ import { Conversations } from '@unif/react-native-chat';
24
+
25
+ <Conversations
26
+ items={sessions}
27
+ activeId={currentSessionId}
28
+ onSelect={(id) => switchSession(id)}
29
+ onDelete={(id) => deleteSession(id)}
30
+ onNew={() => createNewSession()}
31
+ />
32
+ ```
33
+
34
+ ### 不分组
35
+
36
+ ```tsx
37
+ <Conversations
38
+ items={sessions}
39
+ activeId={currentSessionId}
40
+ onSelect={handleSelect}
41
+ groupByDate={false}
42
+ />
43
+ ```
44
+
45
+ ### 自定义头部
46
+
47
+ ```tsx
48
+ <Conversations
49
+ items={sessions}
50
+ onSelect={handleSelect}
51
+ header={<DrawerHeader />}
52
+ />
53
+ ```
54
+
55
+ ## API
56
+
57
+ ### ConversationsProps
58
+
59
+ | 属性 | 说明 | 类型 | 默认值 |
60
+ |------|------|------|--------|
61
+ | items | 会话列表数据 | `ConversationItem[]` | - |
62
+ | activeId | 当前选中会话 ID | `string` | - |
63
+ | onSelect | 选中会话回调 | `(id: string) => void` | - |
64
+ | onDelete | 删除会话回调(长按触发) | `(id: string) => void` | - |
65
+ | onNew | 新建会话回调 | `() => void` | - |
66
+ | groupByDate | 按日期分组 | `boolean` | `true` |
67
+ | header | 列表顶部内容 | `ReactNode` | - |
68
+ | style | 容器样式 | `ViewStyle` | - |
69
+ | styles | 语义样式 | `Partial<ConversationsSemanticStyles>` | - |
70
+ | testID | 测试标识 | `string` | `'conversations'` |
71
+
72
+ ### ConversationItem
73
+
74
+ | 属性 | 说明 | 类型 |
75
+ |------|------|------|
76
+ | id | 唯一标识 | `string` |
77
+ | title | 会话标题 | `string` |
78
+ | lastMessage | 最后一条消息 | `string` |
79
+ | timestamp | 时间戳(毫秒) | `number` |
80
+ | messageCount | 消息数量 | `number` |
81
+
82
+ ### ConversationsSemanticStyles
83
+
84
+ | 属性 | 说明 | 类型 |
85
+ |------|------|------|
86
+ | root | 外层容器 | `ViewStyle` |
87
+ | newButton | 新建按钮 | `ViewStyle` |
88
+ | sectionHeader | 分组标题 | `TextStyle` |
89
+ | item | 会话项 | `ViewStyle` |
90
+ | itemActive | 选中态会话项 | `ViewStyle` |
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * @unif/react-native-chat
5
+ * AI 聊天 UI 组件库 — Bubble、Sender、Conversations、Prompts、Welcome、CardWrapper
6
+ */
7
+
8
+ // Bubble
9
+ export { default as Bubble } from "./bubble/Bubble.js";
10
+ export { default as BubbleList } from "./bubble/BubbleList.js";
11
+ // Sender
12
+ export { default as Sender } from "./sender/Sender.js";
13
+ // Conversations
14
+ export { default as Conversations } from "./conversations/Conversations.js";
15
+ // Prompts
16
+ export { default as Prompts } from "./prompts/Prompts.js";
17
+ // Welcome
18
+ export { default as Welcome } from "./welcome/Welcome.js";
19
+ // CardWrapper
20
+ export { default as CardWrapper } from "./card-wrapper/CardWrapper.js";
21
+ // Theme
22
+ export { chatTokens } from "./theme/tokens.js";
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["default","Bubble","BubbleList","Sender","Conversations","Prompts","Welcome","CardWrapper","chatTokens"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;;AAEA;AACA,SAAQA,OAAO,IAAIC,MAAM,QAAO,oBAAiB;AAEjD,SAAQD,OAAO,IAAIE,UAAU,QAAO,wBAAqB;AAGzD;AACA,SAAQF,OAAO,IAAIG,MAAM,QAAO,oBAAiB;AAGjD;AACA,SAAQH,OAAO,IAAII,aAAa,QAAO,kCAA+B;AAOtE;AACA,SAAQJ,OAAO,IAAIK,OAAO,QAAO,sBAAmB;AAGpD;AACA,SAAQL,OAAO,IAAIM,OAAO,QAAO,sBAAmB;AAOpD;AACA,SAAQN,OAAO,IAAIO,WAAW,QAAO,+BAA4B;AAGjE;AACA,SAAQC,UAAU,QAAO,mBAAgB","ignoreList":[]}
@@ -0,0 +1 @@
1
+ {"type":"module"}
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Prompts — 建议提示
5
+ * 水平 ScrollView + Chip 列表
6
+ */
7
+
8
+ import React from 'react';
9
+ import { View, Text, ScrollView, TouchableOpacity, StyleSheet } from 'react-native';
10
+ import { chatTokens } from "../theme/tokens.js";
11
+ import { jsx as _jsx } from "react/jsx-runtime";
12
+ const Prompts = ({
13
+ items,
14
+ onSelect,
15
+ disabled = false,
16
+ wrap = false,
17
+ style,
18
+ styles: semanticStyles,
19
+ testID = 'prompts'
20
+ }) => {
21
+ if (items.length === 0) return null;
22
+ const renderChips = () => items.map(item => /*#__PURE__*/_jsx(TouchableOpacity, {
23
+ style: [defaultStyles.chip, semanticStyles?.chip],
24
+ onPress: () => !disabled && onSelect(item),
25
+ activeOpacity: disabled ? 1 : 0.7,
26
+ disabled: disabled,
27
+ testID: `${testID}-${item.id}`,
28
+ children: /*#__PURE__*/_jsx(Text, {
29
+ style: [defaultStyles.chipText, semanticStyles?.chipText, disabled && defaultStyles.chipTextDisabled],
30
+ numberOfLines: 1,
31
+ children: item.label
32
+ })
33
+ }, item.id));
34
+ if (wrap) {
35
+ return /*#__PURE__*/_jsx(View, {
36
+ style: [defaultStyles.container, defaultStyles.wrapContainer, semanticStyles?.root, style],
37
+ testID: testID,
38
+ children: renderChips()
39
+ });
40
+ }
41
+ return /*#__PURE__*/_jsx(View, {
42
+ style: [defaultStyles.container, semanticStyles?.root, style],
43
+ testID: testID,
44
+ children: /*#__PURE__*/_jsx(ScrollView, {
45
+ horizontal: true,
46
+ showsHorizontalScrollIndicator: false,
47
+ contentContainerStyle: defaultStyles.scrollContent,
48
+ children: renderChips()
49
+ })
50
+ });
51
+ };
52
+ const defaultStyles = StyleSheet.create({
53
+ container: {
54
+ paddingVertical: 8,
55
+ backgroundColor: 'transparent'
56
+ },
57
+ scrollContent: {
58
+ paddingHorizontal: 12,
59
+ gap: 8
60
+ },
61
+ wrapContainer: {
62
+ flexDirection: 'row',
63
+ flexWrap: 'wrap',
64
+ paddingHorizontal: 12,
65
+ gap: 8
66
+ },
67
+ chip: {
68
+ backgroundColor: '#F3F4F6',
69
+ borderRadius: 16,
70
+ paddingHorizontal: 14,
71
+ paddingVertical: 8
72
+ },
73
+ chipText: {
74
+ fontSize: 13,
75
+ color: chatTokens.colorText
76
+ },
77
+ chipTextDisabled: {
78
+ color: chatTokens.colorTextPlaceholder
79
+ }
80
+ });
81
+ export default /*#__PURE__*/React.memo(Prompts);
82
+ //# sourceMappingURL=Prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","View","Text","ScrollView","TouchableOpacity","StyleSheet","chatTokens","jsx","_jsx","Prompts","items","onSelect","disabled","wrap","style","styles","semanticStyles","testID","length","renderChips","map","item","defaultStyles","chip","onPress","activeOpacity","id","children","chipText","chipTextDisabled","numberOfLines","label","container","wrapContainer","root","horizontal","showsHorizontalScrollIndicator","contentContainerStyle","scrollContent","create","paddingVertical","backgroundColor","paddingHorizontal","gap","flexDirection","flexWrap","borderRadius","fontSize","color","colorText","colorTextPlaceholder","memo"],"sourceRoot":"../../../src","sources":["prompts/Prompts.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,81 @@
1
+ ---
2
+ title: Prompts 建议提示
3
+ nav:
4
+ title: 组件
5
+ path: /components
6
+ ---
7
+
8
+ # Prompts 建议提示
9
+
10
+ 水平滚动的建议提示 Chip 列表,可选换行模式。
11
+
12
+ ## 何时使用
13
+
14
+ - AI 回复后展示后续建议问题
15
+ - 欢迎页展示快捷提问入口
16
+
17
+ ## 代码示例
18
+
19
+ ### 水平滚动
20
+
21
+ ```tsx
22
+ import { Prompts } from '@unif/react-native-chat';
23
+
24
+ <Prompts
25
+ items={[
26
+ { id: '1', label: '查询余额' },
27
+ { id: '2', label: '转账汇款' },
28
+ { id: '3', label: '理财推荐' },
29
+ ]}
30
+ onSelect={(item) => console.log(item.label)}
31
+ />
32
+ ```
33
+
34
+ ### 换行模式
35
+
36
+ ```tsx
37
+ <Prompts
38
+ items={suggestions}
39
+ onSelect={handleSelect}
40
+ wrap={true}
41
+ />
42
+ ```
43
+
44
+ ### 禁用状态
45
+
46
+ ```tsx
47
+ <Prompts
48
+ items={suggestions}
49
+ onSelect={handleSelect}
50
+ disabled={isRequesting}
51
+ />
52
+ ```
53
+
54
+ ## API
55
+
56
+ ### PromptsProps
57
+
58
+ | 属性 | 说明 | 类型 | 默认值 |
59
+ |------|------|------|--------|
60
+ | items | 建议项列表 | `PromptItem[]` | - |
61
+ | onSelect | 选中回调 | `(item: PromptItem) => void` | - |
62
+ | disabled | 禁用状态 | `boolean` | `false` |
63
+ | wrap | 换行模式(FlexWrap) | `boolean` | `false` |
64
+ | style | 容器样式 | `ViewStyle` | - |
65
+ | styles | 语义样式 | `Partial<PromptsSemanticStyles>` | - |
66
+ | testID | 测试标识 | `string` | `'prompts'` |
67
+
68
+ ### PromptItem
69
+
70
+ | 属性 | 说明 | 类型 |
71
+ |------|------|------|
72
+ | id | 唯一标识 | `string` |
73
+ | label | 显示文字 | `string` |
74
+
75
+ ### PromptsSemanticStyles
76
+
77
+ | 属性 | 说明 | 类型 |
78
+ |------|------|------|
79
+ | root | 外层容器 | `ViewStyle` |
80
+ | chip | Chip 样式 | `ViewStyle` |
81
+ | chipText | Chip 文字 | `TextStyle` |