@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.
- package/README.md +156 -0
- package/lib/commonjs/bubble/Bubble.js +131 -0
- package/lib/commonjs/bubble/Bubble.js.map +1 -0
- package/lib/commonjs/bubble/BubbleList.js +73 -0
- package/lib/commonjs/bubble/BubbleList.js.map +1 -0
- package/lib/commonjs/bubble/index.md +111 -0
- package/lib/commonjs/card-wrapper/CardWrapper.js +65 -0
- package/lib/commonjs/card-wrapper/CardWrapper.js.map +1 -0
- package/lib/commonjs/card-wrapper/index.md +78 -0
- package/lib/commonjs/conversations/Conversations.js +184 -0
- package/lib/commonjs/conversations/Conversations.js.map +1 -0
- package/lib/commonjs/conversations/index.md +90 -0
- package/lib/commonjs/index.js +63 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/prompts/Prompts.js +87 -0
- package/lib/commonjs/prompts/Prompts.js.map +1 -0
- package/lib/commonjs/prompts/index.md +81 -0
- package/lib/commonjs/sender/Sender.js +354 -0
- package/lib/commonjs/sender/Sender.js.map +1 -0
- package/lib/commonjs/sender/index.md +131 -0
- package/lib/commonjs/theme/tokens.js +67 -0
- package/lib/commonjs/theme/tokens.js.map +1 -0
- package/lib/commonjs/welcome/Welcome.js +152 -0
- package/lib/commonjs/welcome/Welcome.js.map +1 -0
- package/lib/commonjs/welcome/index.md +95 -0
- package/lib/module/bubble/Bubble.js +126 -0
- package/lib/module/bubble/Bubble.js.map +1 -0
- package/lib/module/bubble/BubbleList.js +68 -0
- package/lib/module/bubble/BubbleList.js.map +1 -0
- package/lib/module/bubble/index.md +111 -0
- package/lib/module/card-wrapper/CardWrapper.js +60 -0
- package/lib/module/card-wrapper/CardWrapper.js.map +1 -0
- package/lib/module/card-wrapper/index.md +78 -0
- package/lib/module/conversations/Conversations.js +179 -0
- package/lib/module/conversations/Conversations.js.map +1 -0
- package/lib/module/conversations/index.md +90 -0
- package/lib/module/index.js +23 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/prompts/Prompts.js +82 -0
- package/lib/module/prompts/Prompts.js.map +1 -0
- package/lib/module/prompts/index.md +81 -0
- package/lib/module/sender/Sender.js +349 -0
- package/lib/module/sender/Sender.js.map +1 -0
- package/lib/module/sender/index.md +131 -0
- package/lib/module/theme/tokens.js +63 -0
- package/lib/module/theme/tokens.js.map +1 -0
- package/lib/module/welcome/Welcome.js +147 -0
- package/lib/module/welcome/Welcome.js.map +1 -0
- package/lib/module/welcome/index.md +95 -0
- package/lib/typescript/commonjs/bubble/Bubble.d.ts +29 -0
- package/lib/typescript/commonjs/bubble/Bubble.d.ts.map +1 -0
- package/lib/typescript/commonjs/bubble/BubbleList.d.ts +20 -0
- package/lib/typescript/commonjs/bubble/BubbleList.d.ts.map +1 -0
- package/lib/typescript/commonjs/card-wrapper/CardWrapper.d.ts +22 -0
- package/lib/typescript/commonjs/card-wrapper/CardWrapper.d.ts.map +1 -0
- package/lib/typescript/commonjs/conversations/Conversations.d.ts +37 -0
- package/lib/typescript/commonjs/conversations/Conversations.d.ts.map +1 -0
- package/lib/typescript/commonjs/index.d.ts +20 -0
- package/lib/typescript/commonjs/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/package.json +1 -0
- package/lib/typescript/commonjs/prompts/Prompts.d.ts +27 -0
- package/lib/typescript/commonjs/prompts/Prompts.d.ts.map +1 -0
- package/lib/typescript/commonjs/sender/Sender.d.ts +58 -0
- package/lib/typescript/commonjs/sender/Sender.d.ts.map +1 -0
- package/lib/typescript/commonjs/theme/tokens.d.ts +52 -0
- package/lib/typescript/commonjs/theme/tokens.d.ts.map +1 -0
- package/lib/typescript/commonjs/welcome/Welcome.d.ts +39 -0
- package/lib/typescript/commonjs/welcome/Welcome.d.ts.map +1 -0
- package/lib/typescript/module/bubble/Bubble.d.ts +29 -0
- package/lib/typescript/module/bubble/Bubble.d.ts.map +1 -0
- package/lib/typescript/module/bubble/BubbleList.d.ts +20 -0
- package/lib/typescript/module/bubble/BubbleList.d.ts.map +1 -0
- package/lib/typescript/module/card-wrapper/CardWrapper.d.ts +22 -0
- package/lib/typescript/module/card-wrapper/CardWrapper.d.ts.map +1 -0
- package/lib/typescript/module/conversations/Conversations.d.ts +37 -0
- package/lib/typescript/module/conversations/Conversations.d.ts.map +1 -0
- package/lib/typescript/module/index.d.ts +20 -0
- package/lib/typescript/module/index.d.ts.map +1 -0
- package/lib/typescript/module/package.json +1 -0
- package/lib/typescript/module/prompts/Prompts.d.ts +27 -0
- package/lib/typescript/module/prompts/Prompts.d.ts.map +1 -0
- package/lib/typescript/module/sender/Sender.d.ts +58 -0
- package/lib/typescript/module/sender/Sender.d.ts.map +1 -0
- package/lib/typescript/module/theme/tokens.d.ts +52 -0
- package/lib/typescript/module/theme/tokens.d.ts.map +1 -0
- package/lib/typescript/module/welcome/Welcome.d.ts +39 -0
- package/lib/typescript/module/welcome/Welcome.d.ts.map +1 -0
- package/package.json +39 -8
- 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":"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","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":[]}
|