@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,152 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _reactNative = require("react-native");
9
+ var _tokens = require("../theme/tokens");
10
+ var _jsxRuntime = require("react/jsx-runtime");
11
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
12
+ /**
13
+ * Welcome — 欢迎页
14
+ * 渐变背景 + 装饰性光晕 + 2x2 快捷入口卡片网格
15
+ */
16
+
17
+ const Welcome = ({
18
+ title = '你好,我是小U',
19
+ subtitle = '智能助手,有什么可以帮你?',
20
+ quickStarts = [],
21
+ onQuickStart,
22
+ gradientColors = [_tokens.chatTokens.colorBgWelcomeStart, _tokens.chatTokens.colorBgWelcomeMid, _tokens.chatTokens.colorBgWelcomeEnd],
23
+ style,
24
+ styles: semanticStyles,
25
+ testID = 'welcome',
26
+ renderIcon,
27
+ renderGradient
28
+ }) => {
29
+ const content = /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
30
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
31
+ style: defaultStyles.glowTopRight
32
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
33
+ style: defaultStyles.glowBottomLeft
34
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
35
+ style: defaultStyles.content,
36
+ children: [renderIcon?.('sparkles', 48, _tokens.chatTokens.colorPrimary), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
37
+ style: [defaultStyles.title, semanticStyles?.title],
38
+ children: title
39
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
40
+ style: [defaultStyles.subtitle, semanticStyles?.subtitle],
41
+ children: subtitle
42
+ }), quickStarts.length > 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
43
+ style: defaultStyles.grid,
44
+ children: quickStarts.map((item, index) => /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.TouchableOpacity, {
45
+ style: [defaultStyles.card, semanticStyles?.card],
46
+ onPress: () => onQuickStart?.(item.key),
47
+ activeOpacity: 0.7,
48
+ testID: `${testID}-quick-${index}`,
49
+ children: [renderIcon?.(item.icon, 24, _tokens.chatTokens.colorPrimary), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
50
+ style: [defaultStyles.cardTitle, semanticStyles?.cardTitle],
51
+ children: item.title
52
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
53
+ style: [defaultStyles.cardDescription, semanticStyles?.cardDescription],
54
+ children: item.description
55
+ })]
56
+ }, item.key))
57
+ })]
58
+ })]
59
+ });
60
+
61
+ // 如果提供了 renderGradient,使用自定义渐变
62
+ if (renderGradient) {
63
+ return renderGradient({
64
+ colors: gradientColors,
65
+ children: content,
66
+ style: {
67
+ ...defaultStyles.container,
68
+ ...semanticStyles?.root,
69
+ ...style
70
+ }
71
+ });
72
+ }
73
+
74
+ // 无渐变 fallback(纯色背景)
75
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
76
+ style: [defaultStyles.container, {
77
+ backgroundColor: gradientColors[0]
78
+ }, semanticStyles?.root, style],
79
+ testID: testID,
80
+ children: content
81
+ });
82
+ };
83
+ const defaultStyles = _reactNative.StyleSheet.create({
84
+ container: {
85
+ flex: 1
86
+ },
87
+ content: {
88
+ flex: 1,
89
+ justifyContent: 'flex-start',
90
+ alignItems: 'center',
91
+ paddingHorizontal: 20,
92
+ paddingTop: 56
93
+ },
94
+ glowTopRight: {
95
+ position: 'absolute',
96
+ top: -40,
97
+ right: -40,
98
+ width: 200,
99
+ height: 200,
100
+ borderRadius: 100,
101
+ backgroundColor: 'rgba(235,110,0,0.06)'
102
+ },
103
+ glowBottomLeft: {
104
+ position: 'absolute',
105
+ bottom: 40,
106
+ left: -40,
107
+ width: 160,
108
+ height: 160,
109
+ borderRadius: 80,
110
+ backgroundColor: 'rgba(0,122,255,0.04)'
111
+ },
112
+ title: {
113
+ marginTop: 16,
114
+ fontSize: 20,
115
+ fontWeight: '600',
116
+ color: _tokens.chatTokens.colorText
117
+ },
118
+ subtitle: {
119
+ marginTop: 6,
120
+ textAlign: 'center',
121
+ fontSize: 15,
122
+ color: _tokens.chatTokens.colorTextSecondary
123
+ },
124
+ grid: {
125
+ marginTop: 32,
126
+ width: '100%',
127
+ flexDirection: 'row',
128
+ flexWrap: 'wrap',
129
+ justifyContent: 'space-between',
130
+ gap: 12
131
+ },
132
+ card: {
133
+ width: '47%',
134
+ backgroundColor: _tokens.chatTokens.colorBgElevated,
135
+ borderRadius: 16,
136
+ padding: 16,
137
+ ..._tokens.chatTokens.shadowSm
138
+ },
139
+ cardTitle: {
140
+ marginTop: 8,
141
+ fontSize: 14,
142
+ fontWeight: '500',
143
+ color: _tokens.chatTokens.colorText
144
+ },
145
+ cardDescription: {
146
+ marginTop: 2,
147
+ fontSize: 11,
148
+ color: _tokens.chatTokens.colorTextSecondary
149
+ }
150
+ });
151
+ var _default = exports.default = /*#__PURE__*/_react.default.memo(Welcome);
152
+ //# sourceMappingURL=Welcome.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_react","_interopRequireDefault","require","_reactNative","_tokens","_jsxRuntime","e","__esModule","default","Welcome","title","subtitle","quickStarts","onQuickStart","gradientColors","chatTokens","colorBgWelcomeStart","colorBgWelcomeMid","colorBgWelcomeEnd","style","styles","semanticStyles","testID","renderIcon","renderGradient","content","jsxs","Fragment","children","jsx","View","defaultStyles","glowTopRight","glowBottomLeft","colorPrimary","Text","length","grid","map","item","index","TouchableOpacity","card","onPress","key","activeOpacity","icon","cardTitle","cardDescription","description","colors","container","root","backgroundColor","StyleSheet","create","flex","justifyContent","alignItems","paddingHorizontal","paddingTop","position","top","right","width","height","borderRadius","bottom","left","marginTop","fontSize","fontWeight","color","colorText","textAlign","colorTextSecondary","flexDirection","flexWrap","gap","colorBgElevated","padding","shadowSm","_default","exports","React","memo"],"sourceRoot":"../../../src","sources":["welcome/Welcome.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,95 @@
1
+ ---
2
+ title: Welcome 欢迎页
3
+ nav:
4
+ title: 组件
5
+ path: /components
6
+ ---
7
+
8
+ # Welcome 欢迎页
9
+
10
+ 聊天欢迎页组件,渐变背景 + 装饰性光晕 + 快捷入口卡片网格。
11
+
12
+ ## 何时使用
13
+
14
+ - 聊天界面无消息时的空状态
15
+ - 引导用户通过快捷入口开始对话
16
+
17
+ ## 代码示例
18
+
19
+ ### 基本用法
20
+
21
+ ```tsx
22
+ import { Welcome } from '@unif/react-native-chat';
23
+
24
+ <Welcome
25
+ title="你好,我是小U"
26
+ subtitle="智能助手,有什么可以帮你?"
27
+ />
28
+ ```
29
+
30
+ ### 带快捷入口
31
+
32
+ ```tsx
33
+ <Welcome
34
+ quickStarts={[
35
+ { key: 'balance', icon: 'wallet', title: '余额查询', description: '查看账户余额' },
36
+ { key: 'transfer', icon: 'send', title: '转账汇款', description: '快速转账' },
37
+ { key: 'invest', icon: 'trending-up', title: '理财推荐', description: '个性化推荐' },
38
+ { key: 'service', icon: 'chatbubbles', title: '客户服务', description: '在线客服' },
39
+ ]}
40
+ onQuickStart={(key) => console.log('选择:', key)}
41
+ renderIcon={(name, size, color) => <Icon name={name} size={size} color={color} />}
42
+ />
43
+ ```
44
+
45
+ ### 自定义渐变
46
+
47
+ ```tsx
48
+ import LinearGradient from 'react-native-linear-gradient';
49
+
50
+ <Welcome
51
+ gradientColors={['#E8F4FD', '#F0E6FF', '#F5F5F5']}
52
+ renderGradient={({ colors, children, style }) => (
53
+ <LinearGradient colors={colors} style={style}>
54
+ {children}
55
+ </LinearGradient>
56
+ )}
57
+ />
58
+ ```
59
+
60
+ ## API
61
+
62
+ ### WelcomeProps
63
+
64
+ | 属性 | 说明 | 类型 | 默认值 |
65
+ |------|------|------|--------|
66
+ | title | 主标题 | `string` | `'你好,我是小U'` |
67
+ | subtitle | 副标题 | `string` | `'智能助手,有什么可以帮你?'` |
68
+ | quickStarts | 快捷入口配置 | `WelcomeQuickStart[]` | `[]` |
69
+ | onQuickStart | 快捷入口点击回调 | `(key: string) => void` | - |
70
+ | gradientColors | 背景渐变色 | `string[]` | 内置渐变 |
71
+ | style | 容器样式 | `ViewStyle` | - |
72
+ | styles | 语义样式 | `Partial<WelcomeSemanticStyles>` | - |
73
+ | testID | 测试标识 | `string` | `'welcome'` |
74
+ | renderIcon | 图标渲染函数 | `(name, size, color) => ReactNode` | - |
75
+ | renderGradient | 渐变背景渲染函数 | `(props) => ReactNode` | - |
76
+
77
+ ### WelcomeQuickStart
78
+
79
+ | 属性 | 说明 | 类型 |
80
+ |------|------|------|
81
+ | key | 唯一标识 | `string` |
82
+ | icon | 图标名称 | `string` |
83
+ | title | 标题 | `string` |
84
+ | description | 描述 | `string` |
85
+
86
+ ### WelcomeSemanticStyles
87
+
88
+ | 属性 | 说明 | 类型 |
89
+ |------|------|------|
90
+ | root | 外层容器 | `ViewStyle` |
91
+ | title | 标题文字 | `TextStyle` |
92
+ | subtitle | 副标题文字 | `TextStyle` |
93
+ | card | 快捷入口卡片 | `ViewStyle` |
94
+ | cardTitle | 卡片标题 | `TextStyle` |
95
+ | cardDescription | 卡片描述 | `TextStyle` |
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Bubble — 消息气泡容器
5
+ *
6
+ * 根据 role 自动镜像布局:
7
+ * - user → 右对齐浅色气泡 + 不对称圆角
8
+ * - assistant → 左侧 Avatar + 名称 + 内容
9
+ */
10
+
11
+ import React from 'react';
12
+ import { View, Text, StyleSheet } from 'react-native';
13
+ import { chatTokens } from "../theme/tokens.js";
14
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
15
+ const Bubble = ({
16
+ role,
17
+ avatar,
18
+ name,
19
+ children,
20
+ footer,
21
+ style,
22
+ styles: semanticStyles,
23
+ testID
24
+ }) => {
25
+ if (role === 'user') {
26
+ return /*#__PURE__*/_jsxs(View, {
27
+ style: [defaultStyles.userRow, semanticStyles?.root, style],
28
+ testID: testID ?? 'bubble-user',
29
+ children: [/*#__PURE__*/_jsx(View, {
30
+ style: defaultStyles.userBubble,
31
+ children: typeof children === 'string' ? /*#__PURE__*/_jsx(Text, {
32
+ style: defaultStyles.userText,
33
+ children: children
34
+ }) : children
35
+ }), footer && /*#__PURE__*/_jsx(View, {
36
+ style: [defaultStyles.footer, semanticStyles?.footer],
37
+ children: footer
38
+ })]
39
+ });
40
+ }
41
+
42
+ // assistant / system
43
+ return /*#__PURE__*/_jsxs(View, {
44
+ style: [defaultStyles.assistantRow, semanticStyles?.root, style],
45
+ testID: testID ?? 'bubble-assistant',
46
+ children: [/*#__PURE__*/_jsxs(View, {
47
+ style: defaultStyles.headerRow,
48
+ children: [avatar && /*#__PURE__*/_jsx(View, {
49
+ style: [defaultStyles.avatarContainer, semanticStyles?.avatar],
50
+ children: avatar
51
+ }), name && /*#__PURE__*/_jsx(Text, {
52
+ style: [defaultStyles.assistantName, semanticStyles?.name],
53
+ children: name
54
+ })]
55
+ }), /*#__PURE__*/_jsx(View, {
56
+ style: [defaultStyles.contentArea, semanticStyles?.content],
57
+ children: children
58
+ }), footer && /*#__PURE__*/_jsx(View, {
59
+ style: [defaultStyles.footer, semanticStyles?.footer],
60
+ children: footer
61
+ }), /*#__PURE__*/_jsx(View, {
62
+ style: defaultStyles.separator
63
+ })]
64
+ });
65
+ };
66
+ const defaultStyles = StyleSheet.create({
67
+ // Assistant
68
+ assistantRow: {
69
+ paddingHorizontal: chatTokens.spaceMd,
70
+ paddingVertical: chatTokens.spaceSm,
71
+ marginBottom: 12
72
+ },
73
+ headerRow: {
74
+ flexDirection: 'row',
75
+ alignItems: 'center',
76
+ marginBottom: 6
77
+ },
78
+ avatarContainer: {
79
+ marginRight: 8
80
+ },
81
+ assistantName: {
82
+ fontSize: 13,
83
+ fontWeight: '500',
84
+ color: chatTokens.colorTextSecondary
85
+ },
86
+ contentArea: {
87
+ paddingLeft: 36
88
+ },
89
+ separator: {
90
+ marginTop: 12,
91
+ marginLeft: 36,
92
+ height: StyleSheet.hairlineWidth,
93
+ backgroundColor: chatTokens.colorBorder,
94
+ opacity: 0.5
95
+ },
96
+ footer: {
97
+ paddingLeft: 36,
98
+ marginTop: 4
99
+ },
100
+ // User
101
+ userRow: {
102
+ flexDirection: 'row',
103
+ justifyContent: 'flex-end',
104
+ flexWrap: 'wrap',
105
+ paddingHorizontal: chatTokens.spaceMd,
106
+ paddingVertical: chatTokens.spaceSm,
107
+ marginBottom: chatTokens.spaceSm
108
+ },
109
+ userBubble: {
110
+ backgroundColor: chatTokens.colorBgUserMsg,
111
+ borderTopLeftRadius: 20,
112
+ borderTopRightRadius: 20,
113
+ borderBottomLeftRadius: 20,
114
+ borderBottomRightRadius: 6,
115
+ paddingHorizontal: chatTokens.spaceMd,
116
+ paddingVertical: chatTokens.space,
117
+ maxWidth: '75%'
118
+ },
119
+ userText: {
120
+ fontSize: chatTokens.fontSize,
121
+ color: chatTokens.colorText,
122
+ lineHeight: chatTokens.lineHeight
123
+ }
124
+ });
125
+ export default /*#__PURE__*/React.memo(Bubble);
126
+ //# sourceMappingURL=Bubble.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","View","Text","StyleSheet","chatTokens","jsx","_jsx","jsxs","_jsxs","Bubble","role","avatar","name","children","footer","style","styles","semanticStyles","testID","defaultStyles","userRow","root","userBubble","userText","assistantRow","headerRow","avatarContainer","assistantName","contentArea","content","separator","create","paddingHorizontal","spaceMd","paddingVertical","spaceSm","marginBottom","flexDirection","alignItems","marginRight","fontSize","fontWeight","color","colorTextSecondary","paddingLeft","marginTop","marginLeft","height","hairlineWidth","backgroundColor","colorBorder","opacity","justifyContent","flexWrap","colorBgUserMsg","borderTopLeftRadius","borderTopRightRadius","borderBottomLeftRadius","borderBottomRightRadius","space","maxWidth","colorText","lineHeight","memo"],"sourceRoot":"../../../src","sources":["bubble/Bubble.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAOA,KAAK,MAAM,OAAO;AACzB,SACEC,IAAI,EACJC,IAAI,EACJC,UAAU,QAGL,cAAc;AACrB,SAAQC,UAAU,QAAO,oBAAiB;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAqB3C,MAAMC,MAA6B,GAAGA,CAAC;EACrCC,IAAI;EACJC,MAAM;EACNC,IAAI;EACJC,QAAQ;EACRC,MAAM;EACNC,KAAK;EACLC,MAAM,EAAEC,cAAc;EACtBC;AACF,CAAC,KAAK;EACJ,IAAIR,IAAI,KAAK,MAAM,EAAE;IACnB,oBACEF,KAAA,CAACP,IAAI;MACHc,KAAK,EAAE,CAACI,aAAa,CAACC,OAAO,EAAEH,cAAc,EAAEI,IAAI,EAAEN,KAAK,CAAE;MAC5DG,MAAM,EAAEA,MAAM,IAAI,aAAc;MAAAL,QAAA,gBAChCP,IAAA,CAACL,IAAI;QAACc,KAAK,EAAEI,aAAa,CAACG,UAAW;QAAAT,QAAA,EACnC,OAAOA,QAAQ,KAAK,QAAQ,gBAC3BP,IAAA,CAACJ,IAAI;UAACa,KAAK,EAAEI,aAAa,CAACI,QAAS;UAAAV,QAAA,EAAEA;QAAQ,CAAO,CAAC,GAEtDA;MACD,CACG,CAAC,EACNC,MAAM,iBACLR,IAAA,CAACL,IAAI;QAACc,KAAK,EAAE,CAACI,aAAa,CAACL,MAAM,EAAEG,cAAc,EAAEH,MAAM,CAAE;QAAAD,QAAA,EACzDC;MAAM,CACH,CACP;IAAA,CACG,CAAC;EAEX;;EAEA;EACA,oBACEN,KAAA,CAACP,IAAI;IACHc,KAAK,EAAE,CAACI,aAAa,CAACK,YAAY,EAAEP,cAAc,EAAEI,IAAI,EAAEN,KAAK,CAAE;IACjEG,MAAM,EAAEA,MAAM,IAAI,kBAAmB;IAAAL,QAAA,gBACrCL,KAAA,CAACP,IAAI;MAACc,KAAK,EAAEI,aAAa,CAACM,SAAU;MAAAZ,QAAA,GAClCF,MAAM,iBACLL,IAAA,CAACL,IAAI;QAACc,KAAK,EAAE,CAACI,aAAa,CAACO,eAAe,EAAET,cAAc,EAAEN,MAAM,CAAE;QAAAE,QAAA,EAClEF;MAAM,CACH,CACP,EACAC,IAAI,iBACHN,IAAA,CAACJ,IAAI;QAACa,KAAK,EAAE,CAACI,aAAa,CAACQ,aAAa,EAAEV,cAAc,EAAEL,IAAI,CAAE;QAAAC,QAAA,EAC9DD;MAAI,CACD,CACP;IAAA,CACG,CAAC,eACPN,IAAA,CAACL,IAAI;MAACc,KAAK,EAAE,CAACI,aAAa,CAACS,WAAW,EAAEX,cAAc,EAAEY,OAAO,CAAE;MAAAhB,QAAA,EAC/DA;IAAQ,CACL,CAAC,EACNC,MAAM,iBACLR,IAAA,CAACL,IAAI;MAACc,KAAK,EAAE,CAACI,aAAa,CAACL,MAAM,EAAEG,cAAc,EAAEH,MAAM,CAAE;MAAAD,QAAA,EACzDC;IAAM,CACH,CACP,eACDR,IAAA,CAACL,IAAI;MAACc,KAAK,EAAEI,aAAa,CAACW;IAAU,CAAE,CAAC;EAAA,CACpC,CAAC;AAEX,CAAC;AAED,MAAMX,aAAa,GAAGhB,UAAU,CAAC4B,MAAM,CAAC;EACtC;EACAP,YAAY,EAAE;IACZQ,iBAAiB,EAAE5B,UAAU,CAAC6B,OAAO;IACrCC,eAAe,EAAE9B,UAAU,CAAC+B,OAAO;IACnCC,YAAY,EAAE;EAChB,CAAC;EACDX,SAAS,EAAE;IACTY,aAAa,EAAE,KAAK;IACpBC,UAAU,EAAE,QAAQ;IACpBF,YAAY,EAAE;EAChB,CAAC;EACDV,eAAe,EAAE;IACfa,WAAW,EAAE;EACf,CAAC;EACDZ,aAAa,EAAE;IACba,QAAQ,EAAE,EAAE;IACZC,UAAU,EAAE,KAAK;IACjBC,KAAK,EAAEtC,UAAU,CAACuC;EACpB,CAAC;EACDf,WAAW,EAAE;IACXgB,WAAW,EAAE;EACf,CAAC;EACDd,SAAS,EAAE;IACTe,SAAS,EAAE,EAAE;IACbC,UAAU,EAAE,EAAE;IACdC,MAAM,EAAE5C,UAAU,CAAC6C,aAAa;IAChCC,eAAe,EAAE7C,UAAU,CAAC8C,WAAW;IACvCC,OAAO,EAAE;EACX,CAAC;EACDrC,MAAM,EAAE;IACN8B,WAAW,EAAE,EAAE;IACfC,SAAS,EAAE;EACb,CAAC;EAED;EACAzB,OAAO,EAAE;IACPiB,aAAa,EAAE,KAAK;IACpBe,cAAc,EAAE,UAAU;IAC1BC,QAAQ,EAAE,MAAM;IAChBrB,iBAAiB,EAAE5B,UAAU,CAAC6B,OAAO;IACrCC,eAAe,EAAE9B,UAAU,CAAC+B,OAAO;IACnCC,YAAY,EAAEhC,UAAU,CAAC+B;EAC3B,CAAC;EACDb,UAAU,EAAE;IACV2B,eAAe,EAAE7C,UAAU,CAACkD,cAAc;IAC1CC,mBAAmB,EAAE,EAAE;IACvBC,oBAAoB,EAAE,EAAE;IACxBC,sBAAsB,EAAE,EAAE;IAC1BC,uBAAuB,EAAE,CAAC;IAC1B1B,iBAAiB,EAAE5B,UAAU,CAAC6B,OAAO;IACrCC,eAAe,EAAE9B,UAAU,CAACuD,KAAK;IACjCC,QAAQ,EAAE;EACZ,CAAC;EACDrC,QAAQ,EAAE;IACRiB,QAAQ,EAAEpC,UAAU,CAACoC,QAAQ;IAC7BE,KAAK,EAAEtC,UAAU,CAACyD,SAAS;IAC3BC,UAAU,EAAE1D,UAAU,CAAC0D;EACzB;AACF,CAAC,CAAC;AAEF,4BAAe9D,KAAK,CAAC+D,IAAI,CAACtD,MAAM,CAAC","ignoreList":[]}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Bubble.List — 消息列表
5
+ * 封装 inverted FlatList,自动滚动到底部
6
+ */
7
+
8
+ import React, { useCallback } from 'react';
9
+ import { FlatList, View, StyleSheet } from 'react-native';
10
+ import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
11
+ function BubbleListInner(props) {
12
+ const {
13
+ items,
14
+ renderBubble,
15
+ keyExtractor,
16
+ onEndReached,
17
+ header,
18
+ footer,
19
+ style,
20
+ testID = 'bubble-list'
21
+ } = props;
22
+ const renderItem = useCallback(({
23
+ item
24
+ }) => /*#__PURE__*/_jsx(_Fragment, {
25
+ children: renderBubble(item)
26
+ }), [renderBubble]);
27
+ const defaultKeyExtractor = useCallback((item, index) => {
28
+ if (keyExtractor) return keyExtractor(item);
29
+ const record = item;
30
+ return record['id'] ?? String(index);
31
+ }, [keyExtractor]);
32
+ if (items.length === 0 && header) {
33
+ return /*#__PURE__*/_jsx(View, {
34
+ style: [defaultStyles.container, style],
35
+ testID: testID,
36
+ children: header
37
+ });
38
+ }
39
+ return /*#__PURE__*/_jsx(FlatList, {
40
+ data: items,
41
+ renderItem: renderItem,
42
+ keyExtractor: defaultKeyExtractor,
43
+ inverted: true,
44
+ style: [defaultStyles.list, style],
45
+ contentContainerStyle: defaultStyles.contentContainer,
46
+ onEndReached: onEndReached,
47
+ onEndReachedThreshold: 0.3,
48
+ ListFooterComponent: footer ? /*#__PURE__*/_jsx(_Fragment, {
49
+ children: footer
50
+ }) : null,
51
+ showsVerticalScrollIndicator: false,
52
+ testID: testID
53
+ });
54
+ }
55
+ const defaultStyles = StyleSheet.create({
56
+ container: {
57
+ flex: 1
58
+ },
59
+ list: {
60
+ flex: 1
61
+ },
62
+ contentContainer: {
63
+ paddingVertical: 8
64
+ }
65
+ });
66
+ const BubbleList = /*#__PURE__*/React.memo(BubbleListInner);
67
+ export default BubbleList;
68
+ //# sourceMappingURL=BubbleList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","useCallback","FlatList","View","StyleSheet","Fragment","_Fragment","jsx","_jsx","BubbleListInner","props","items","renderBubble","keyExtractor","onEndReached","header","footer","style","testID","renderItem","item","children","defaultKeyExtractor","index","record","String","length","defaultStyles","container","data","inverted","list","contentContainerStyle","contentContainer","onEndReachedThreshold","ListFooterComponent","showsVerticalScrollIndicator","create","flex","paddingVertical","BubbleList","memo"],"sourceRoot":"../../../src","sources":["bubble/BubbleList.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;;AAEA,OAAOA,KAAK,IAAGC,WAAW,QAAO,OAAO;AACxC,SAAQC,QAAQ,EAAEC,IAAI,EAAEC,UAAU,QAAuB,cAAc;AAAC,SAAAC,QAAA,IAAAC,SAAA,EAAAC,GAAA,IAAAC,IAAA;AAaxE,SAASC,eAAeA,CAAIC,KAAyB,EAAE;EACrD,MAAM;IACJC,KAAK;IACLC,YAAY;IACZC,YAAY;IACZC,YAAY;IACZC,MAAM;IACNC,MAAM;IACNC,KAAK;IACLC,MAAM,GAAG;EACX,CAAC,GAAGR,KAAK;EAET,MAAMS,UAAU,GAAGlB,WAAW,CAC5B,CAAC;IAACmB;EAAe,CAAC,kBAAKZ,IAAA,CAAAF,SAAA;IAAAe,QAAA,EAAGT,YAAY,CAACQ,IAAI;EAAC,CAAG,CAAC,EAChD,CAACR,YAAY,CACf,CAAC;EAED,MAAMU,mBAAmB,GAAGrB,WAAW,CACrC,CAACmB,IAAO,EAAEG,KAAa,KAAK;IAC1B,IAAIV,YAAY,EAAE,OAAOA,YAAY,CAACO,IAAI,CAAC;IAC3C,MAAMI,MAAM,GAAGJ,IAA+B;IAC9C,OAAQI,MAAM,CAAC,IAAI,CAAC,IAAeC,MAAM,CAACF,KAAK,CAAC;EAClD,CAAC,EACD,CAACV,YAAY,CACf,CAAC;EAED,IAAIF,KAAK,CAACe,MAAM,KAAK,CAAC,IAAIX,MAAM,EAAE;IAChC,oBACEP,IAAA,CAACL,IAAI;MAACc,KAAK,EAAE,CAACU,aAAa,CAACC,SAAS,EAAEX,KAAK,CAAE;MAACC,MAAM,EAAEA,MAAO;MAAAG,QAAA,EAC3DN;IAAM,CACH,CAAC;EAEX;EAEA,oBACEP,IAAA,CAACN,QAAQ;IACP2B,IAAI,EAAElB,KAAM;IACZQ,UAAU,EAAEA,UAAW;IACvBN,YAAY,EAAES,mBAAoB;IAClCQ,QAAQ;IACRb,KAAK,EAAE,CAACU,aAAa,CAACI,IAAI,EAAEd,KAAK,CAAE;IACnCe,qBAAqB,EAAEL,aAAa,CAACM,gBAAiB;IACtDnB,YAAY,EAAEA,YAAa;IAC3BoB,qBAAqB,EAAE,GAAI;IAC3BC,mBAAmB,EAAEnB,MAAM,gBAAGR,IAAA,CAAAF,SAAA;MAAAe,QAAA,EAAGL;IAAM,CAAG,CAAC,GAAG,IAAK;IACnDoB,4BAA4B,EAAE,KAAM;IACpClB,MAAM,EAAEA;EAAO,CAChB,CAAC;AAEN;AAEA,MAAMS,aAAa,GAAGvB,UAAU,CAACiC,MAAM,CAAC;EACtCT,SAAS,EAAE;IACTU,IAAI,EAAE;EACR,CAAC;EACDP,IAAI,EAAE;IACJO,IAAI,EAAE;EACR,CAAC;EACDL,gBAAgB,EAAE;IAChBM,eAAe,EAAE;EACnB;AACF,CAAC,CAAC;AAEF,MAAMC,UAAU,gBAAGxC,KAAK,CAACyC,IAAI,CAAChC,eAAe,CAA2B;AACxE,eAAe+B,UAAU","ignoreList":[]}
@@ -0,0 +1,111 @@
1
+ ---
2
+ title: Bubble 消息气泡
3
+ nav:
4
+ title: 组件
5
+ path: /components
6
+ ---
7
+
8
+ # Bubble 消息气泡
9
+
10
+ 消息气泡容器,根据 `role` 自动镜像布局。
11
+
12
+ ## 何时使用
13
+
14
+ - 展示聊天消息(用户消息、AI 回复、系统消息)
15
+ - 需要根据角色自动区分左右布局
16
+
17
+ ## 代码示例
18
+
19
+ ### 基本用法
20
+
21
+ ```tsx
22
+ import { Bubble } from '@unif/react-native-chat';
23
+
24
+ // 用户消息(右对齐)
25
+ <Bubble role="user">你好,请帮我查询订单</Bubble>
26
+
27
+ // AI 回复(左对齐)
28
+ <Bubble role="assistant" name="小U" avatar={<Avatar name="AI" />}>
29
+ 好的,正在为您查询...
30
+ </Bubble>
31
+ ```
32
+
33
+ ### 自定义底部区域
34
+
35
+ ```tsx
36
+ <Bubble role="assistant" footer={<Text>14:30</Text>}>
37
+ 这是消息内容
38
+ </Bubble>
39
+ ```
40
+
41
+ ### 语义样式覆盖
42
+
43
+ ```tsx
44
+ <Bubble
45
+ role="user"
46
+ styles={{
47
+ root: { paddingHorizontal: 20 },
48
+ content: { backgroundColor: '#E8F0FE' },
49
+ }}
50
+ >
51
+ 自定义样式的消息
52
+ </Bubble>
53
+ ```
54
+
55
+ ## API
56
+
57
+ ### BubbleProps
58
+
59
+ | 属性 | 说明 | 类型 | 默认值 |
60
+ |------|------|------|--------|
61
+ | role | 消息角色 | `'user' \| 'assistant' \| 'system'` | - |
62
+ | avatar | 头像(assistant/system 角色显示) | `ReactNode` | - |
63
+ | name | 发送者名称 | `string` | - |
64
+ | children | 消息内容 | `ReactNode` | - |
65
+ | footer | 底部区域(时间戳、操作等) | `ReactNode` | - |
66
+ | style | 外层容器样式 | `ViewStyle` | - |
67
+ | styles | 语义样式覆盖 | `Partial<BubbleSemanticStyles>` | - |
68
+ | testID | 测试标识 | `string` | - |
69
+
70
+ ### BubbleSemanticStyles
71
+
72
+ | 属性 | 说明 | 类型 |
73
+ |------|------|------|
74
+ | root | 外层容器 | `ViewStyle` |
75
+ | avatar | 头像容器 | `ViewStyle` |
76
+ | name | 名称文字 | `TextStyle` |
77
+ | content | 内容区域 | `ViewStyle` |
78
+ | footer | 底部区域 | `ViewStyle` |
79
+
80
+ ## Bubble.List 消息列表
81
+
82
+ 封装 inverted FlatList,消息从底部向上排列,支持泛型。
83
+
84
+ ### 基本用法
85
+
86
+ ```tsx
87
+ import { Bubble } from '@unif/react-native-chat';
88
+
89
+ <Bubble.List
90
+ items={messages}
91
+ header={<Welcome />}
92
+ renderBubble={(msg) => (
93
+ <Bubble role={msg.message.role}>
94
+ {msg.message.text}
95
+ </Bubble>
96
+ )}
97
+ />
98
+ ```
99
+
100
+ ### BubbleListProps
101
+
102
+ | 属性 | 说明 | 类型 | 默认值 |
103
+ |------|------|------|--------|
104
+ | items | 消息数据 | `T[]` | - |
105
+ | renderBubble | 渲染单条消息 | `(item: T) => ReactNode` | - |
106
+ | keyExtractor | 自定义 key 提取 | `(item: T) => string` | 使用 `item.id` |
107
+ | onEndReached | 滚动到底部回调(加载更多) | `() => void` | - |
108
+ | header | 列表为空时的顶部占位 | `ReactNode` | - |
109
+ | footer | 列表底部内容 | `ReactNode` | - |
110
+ | style | 容器样式 | `ViewStyle` | - |
111
+ | testID | 测试标识 | `string` | `'bubble-list'` |
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * CardWrapper — 通用卡片路由容器
5
+ * registry 通过 props 注入(而非全局 import),更灵活
6
+ */
7
+
8
+ import React from 'react';
9
+ import { View, Text, StyleSheet } from 'react-native';
10
+ import { chatTokens } from "../theme/tokens.js";
11
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
12
+ const CardWrapper = ({
13
+ cardType,
14
+ data,
15
+ actions,
16
+ registry = {},
17
+ fallback,
18
+ style,
19
+ testID
20
+ }) => {
21
+ const CardComponent = registry[cardType];
22
+ if (!CardComponent) {
23
+ return /*#__PURE__*/_jsx(View, {
24
+ style: [defaultStyles.container, style],
25
+ testID: testID,
26
+ children: fallback ?? /*#__PURE__*/_jsxs(Text, {
27
+ style: defaultStyles.fallback,
28
+ children: ["\u4E0D\u652F\u6301\u7684\u5361\u7247\u7C7B\u578B: ", cardType]
29
+ })
30
+ });
31
+ }
32
+ return /*#__PURE__*/_jsx(View, {
33
+ style: [defaultStyles.container, style],
34
+ testID: testID ?? `card-${cardType}`,
35
+ children: /*#__PURE__*/_jsx(CardComponent, {
36
+ data: data,
37
+ actions: actions
38
+ })
39
+ });
40
+ };
41
+ const defaultStyles = StyleSheet.create({
42
+ container: {
43
+ backgroundColor: chatTokens.colorBgElevated,
44
+ borderRadius: 12,
45
+ borderWidth: 1,
46
+ borderColor: chatTokens.colorBorder,
47
+ marginLeft: 8,
48
+ marginRight: 40,
49
+ marginBottom: 4,
50
+ overflow: 'hidden',
51
+ maxWidth: '85%'
52
+ },
53
+ fallback: {
54
+ padding: 12,
55
+ fontSize: 13,
56
+ color: chatTokens.colorTextSecondary
57
+ }
58
+ });
59
+ export default /*#__PURE__*/React.memo(CardWrapper);
60
+ //# sourceMappingURL=CardWrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","View","Text","StyleSheet","chatTokens","jsxs","_jsxs","jsx","_jsx","CardWrapper","cardType","data","actions","registry","fallback","style","testID","CardComponent","defaultStyles","container","children","create","backgroundColor","colorBgElevated","borderRadius","borderWidth","borderColor","colorBorder","marginLeft","marginRight","marginBottom","overflow","maxWidth","padding","fontSize","color","colorTextSecondary","memo"],"sourceRoot":"../../../src","sources":["card-wrapper/CardWrapper.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;;AAEA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAAQC,IAAI,EAAEC,IAAI,EAAEC,UAAU,QAAuB,cAAc;AACnE,SAAQC,UAAU,QAAO,oBAAiB;AAAC,SAAAC,IAAA,IAAAC,KAAA,EAAAC,GAAA,IAAAC,IAAA;AAiB3C,MAAMC,WAAuC,GAAGA,CAAC;EAC/CC,QAAQ;EACRC,IAAI;EACJC,OAAO;EACPC,QAAQ,GAAG,CAAC,CAAC;EACbC,QAAQ;EACRC,KAAK;EACLC;AACF,CAAC,KAAK;EACJ,MAAMC,aAAa,GAAGJ,QAAQ,CAACH,QAAQ,CAAC;EAExC,IAAI,CAACO,aAAa,EAAE;IAClB,oBACET,IAAA,CAACP,IAAI;MAACc,KAAK,EAAE,CAACG,aAAa,CAACC,SAAS,EAAEJ,KAAK,CAAE;MAACC,MAAM,EAAEA,MAAO;MAAAI,QAAA,EAC3DN,QAAQ,iBACPR,KAAA,CAACJ,IAAI;QAACa,KAAK,EAAEG,aAAa,CAACJ,QAAS;QAAAM,QAAA,GAAC,oDACzB,EAACV,QAAQ;MAAA,CACf;IACP,CACG,CAAC;EAEX;EAEA,oBACEF,IAAA,CAACP,IAAI;IACHc,KAAK,EAAE,CAACG,aAAa,CAACC,SAAS,EAAEJ,KAAK,CAAE;IACxCC,MAAM,EAAEA,MAAM,IAAI,QAAQN,QAAQ,EAAG;IAAAU,QAAA,eACrCZ,IAAA,CAACS,aAAa;MAACN,IAAI,EAAEA,IAAK;MAACC,OAAO,EAAEA;IAAQ,CAAE;EAAC,CAC3C,CAAC;AAEX,CAAC;AAED,MAAMM,aAAa,GAAGf,UAAU,CAACkB,MAAM,CAAC;EACtCF,SAAS,EAAE;IACTG,eAAe,EAAElB,UAAU,CAACmB,eAAe;IAC3CC,YAAY,EAAE,EAAE;IAChBC,WAAW,EAAE,CAAC;IACdC,WAAW,EAAEtB,UAAU,CAACuB,WAAW;IACnCC,UAAU,EAAE,CAAC;IACbC,WAAW,EAAE,EAAE;IACfC,YAAY,EAAE,CAAC;IACfC,QAAQ,EAAE,QAAQ;IAClBC,QAAQ,EAAE;EACZ,CAAC;EACDlB,QAAQ,EAAE;IACRmB,OAAO,EAAE,EAAE;IACXC,QAAQ,EAAE,EAAE;IACZC,KAAK,EAAE/B,UAAU,CAACgC;EACpB;AACF,CAAC,CAAC;AAEF,4BAAepC,KAAK,CAACqC,IAAI,CAAC5B,WAAW,CAAC","ignoreList":[]}