@lobehub/chat 0.96.1 → 0.96.3
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/CHANGELOG.md +50 -0
- package/package.json +1 -1
- package/public/images/banner_market_modal.webp +0 -0
- package/src/app/chat/features/SessionListContent/CollapseGroup/index.tsx +7 -3
- package/src/app/chat/features/SessionListContent/Inbox/index.tsx +5 -23
- package/src/app/chat/features/SessionListContent/List/Item/index.tsx +17 -53
- package/src/app/chat/features/SessionListContent/ListItem/index.tsx +61 -0
- package/src/app/market/features/ShareAgentButton/Inner.tsx +4 -3
- package/src/app/settings/features/SideBar/Item.tsx +6 -1
- package/src/app/settings/features/SideBar/index.tsx +3 -1
- package/src/const/url.ts +1 -0
- package/src/features/AgentSetting/AgentPlugin/MarketList.tsx +22 -26
- package/src/features/AgentSetting/AgentPlugin/MarketSettingModal.tsx +9 -2
- package/src/features/PluginDevModal/index.tsx +13 -1
- package/public/images/market_modal_banner.webp +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,56 @@
|
|
|
2
2
|
|
|
3
3
|
# Changelog
|
|
4
4
|
|
|
5
|
+
### [Version 0.96.3](https://github.com/lobehub/lobe-chat/compare/v0.96.2...v0.96.3)
|
|
6
|
+
|
|
7
|
+
<sup>Released on **2023-10-28**</sup>
|
|
8
|
+
|
|
9
|
+
#### 💄 Styles
|
|
10
|
+
|
|
11
|
+
- **misc**: Fix SessionList on mobile.
|
|
12
|
+
|
|
13
|
+
<br/>
|
|
14
|
+
|
|
15
|
+
<details>
|
|
16
|
+
<summary><kbd>Improvements and Fixes</kbd></summary>
|
|
17
|
+
|
|
18
|
+
#### Styles
|
|
19
|
+
|
|
20
|
+
- **misc**: Fix SessionList on mobile ([e7e7b80](https://github.com/lobehub/lobe-chat/commit/e7e7b80))
|
|
21
|
+
|
|
22
|
+
</details>
|
|
23
|
+
|
|
24
|
+
<div align="right">
|
|
25
|
+
|
|
26
|
+
[](#readme-top)
|
|
27
|
+
|
|
28
|
+
</div>
|
|
29
|
+
|
|
30
|
+
### [Version 0.96.2](https://github.com/lobehub/lobe-chat/compare/v0.96.1...v0.96.2)
|
|
31
|
+
|
|
32
|
+
<sup>Released on **2023-10-28**</sup>
|
|
33
|
+
|
|
34
|
+
#### 💄 Styles
|
|
35
|
+
|
|
36
|
+
- **misc**: Fix some styles and make updates to various files.
|
|
37
|
+
|
|
38
|
+
<br/>
|
|
39
|
+
|
|
40
|
+
<details>
|
|
41
|
+
<summary><kbd>Improvements and Fixes</kbd></summary>
|
|
42
|
+
|
|
43
|
+
#### Styles
|
|
44
|
+
|
|
45
|
+
- **misc**: Fix some styles and make updates to various files ([44a5f0a](https://github.com/lobehub/lobe-chat/commit/44a5f0a))
|
|
46
|
+
|
|
47
|
+
</details>
|
|
48
|
+
|
|
49
|
+
<div align="right">
|
|
50
|
+
|
|
51
|
+
[](#readme-top)
|
|
52
|
+
|
|
53
|
+
</div>
|
|
54
|
+
|
|
5
55
|
### [Version 0.96.1](https://github.com/lobehub/lobe-chat/compare/v0.96.0...v0.96.1)
|
|
6
56
|
|
|
7
57
|
<sup>Released on **2023-10-28**</sup>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lobehub/chat",
|
|
3
|
-
"version": "0.96.
|
|
3
|
+
"version": "0.96.3",
|
|
4
4
|
"description": "An open-source, extensible (Function Calling), high-performance chatbot framework. It supports one-click free deployment of your private ChatGPT/LLM web application",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"chatbot",
|
|
Binary file
|
|
@@ -4,12 +4,16 @@ import { createStyles } from 'antd-style';
|
|
|
4
4
|
import { ChevronDown } from 'lucide-react';
|
|
5
5
|
import { memo } from 'react';
|
|
6
6
|
|
|
7
|
-
const useStyles = createStyles(({ css, prefixCls, token }) => ({
|
|
7
|
+
const useStyles = createStyles(({ css, prefixCls, token, responsive }) => ({
|
|
8
8
|
container: css`
|
|
9
9
|
.${prefixCls}-collapse-header {
|
|
10
|
-
padding-inline: 16px !important;
|
|
10
|
+
padding-inline: 16px 10px !important;
|
|
11
11
|
color: ${token.colorTextDescription} !important;
|
|
12
|
-
border-radius:
|
|
12
|
+
border-radius: ${token.borderRadius}px !important;
|
|
13
|
+
|
|
14
|
+
${responsive.mobile} {
|
|
15
|
+
border-radius: 0 !important;
|
|
16
|
+
}
|
|
13
17
|
|
|
14
18
|
&:hover {
|
|
15
19
|
color: ${token.colorText} !important;
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import { Avatar, List } from '@lobehub/ui';
|
|
2
|
-
import { useHover } from 'ahooks';
|
|
3
1
|
import { useResponsive } from 'antd-style';
|
|
4
2
|
import Link from 'next/link';
|
|
5
|
-
import { memo
|
|
3
|
+
import { memo } from 'react';
|
|
6
4
|
import { useTranslation } from 'react-i18next';
|
|
7
5
|
|
|
8
6
|
import { DEFAULT_INBOX_AVATAR } from '@/const/meta';
|
|
@@ -10,11 +8,9 @@ import { INBOX_SESSION_ID } from '@/const/session';
|
|
|
10
8
|
import { SESSION_CHAT_URL } from '@/const/url';
|
|
11
9
|
import { useSessionStore } from '@/store/session';
|
|
12
10
|
|
|
13
|
-
|
|
11
|
+
import ListItem from '../ListItem';
|
|
14
12
|
|
|
15
13
|
const Inbox = memo(() => {
|
|
16
|
-
const ref = useRef(null);
|
|
17
|
-
const isHovering = useHover(ref);
|
|
18
14
|
const { t } = useTranslation('chat');
|
|
19
15
|
const { mobile } = useResponsive();
|
|
20
16
|
const [activeId, activeSession, switchSession] = useSessionStore((s) => [
|
|
@@ -23,18 +19,6 @@ const Inbox = memo(() => {
|
|
|
23
19
|
s.switchSession,
|
|
24
20
|
]);
|
|
25
21
|
|
|
26
|
-
const avatarRender = useMemo(
|
|
27
|
-
() => (
|
|
28
|
-
<Avatar
|
|
29
|
-
animation={isHovering}
|
|
30
|
-
avatar={DEFAULT_INBOX_AVATAR}
|
|
31
|
-
size={46}
|
|
32
|
-
style={{ padding: 3 }}
|
|
33
|
-
/>
|
|
34
|
-
),
|
|
35
|
-
[isHovering],
|
|
36
|
-
);
|
|
37
|
-
|
|
38
22
|
return (
|
|
39
23
|
<Link
|
|
40
24
|
aria-label={t('inbox.title')}
|
|
@@ -45,11 +29,9 @@ const Inbox = memo(() => {
|
|
|
45
29
|
else activeSession(INBOX_SESSION_ID);
|
|
46
30
|
}}
|
|
47
31
|
>
|
|
48
|
-
<
|
|
49
|
-
active={
|
|
50
|
-
avatar={
|
|
51
|
-
ref={ref}
|
|
52
|
-
style={{ alignItems: 'center', borderRadius: 8 }}
|
|
32
|
+
<ListItem
|
|
33
|
+
active={activeId === INBOX_SESSION_ID}
|
|
34
|
+
avatar={DEFAULT_INBOX_AVATAR}
|
|
53
35
|
title={t('inbox.title')}
|
|
54
36
|
/>
|
|
55
37
|
</Link>
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import { SiOpenai } from '@icons-pack/react-simple-icons';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { createStyles, useResponsive } from 'antd-style';
|
|
5
|
-
import { memo, useMemo, useRef, useState } from 'react';
|
|
2
|
+
import { Tag } from '@lobehub/ui';
|
|
3
|
+
import { memo, useMemo, useState } from 'react';
|
|
6
4
|
import { Flexbox } from 'react-layout-kit';
|
|
7
5
|
import { shallow } from 'zustand/shallow';
|
|
8
6
|
|
|
@@ -10,33 +8,16 @@ import { settingsSelectors, useGlobalStore } from '@/store/global';
|
|
|
10
8
|
import { useSessionStore } from '@/store/session';
|
|
11
9
|
import { agentSelectors, sessionSelectors } from '@/store/session/selectors';
|
|
12
10
|
|
|
11
|
+
import ListItem from '../../ListItem';
|
|
13
12
|
import Actions from './Actions';
|
|
14
13
|
|
|
15
|
-
const { Item } = List;
|
|
16
|
-
|
|
17
|
-
const useStyles = createStyles(({ css }) => {
|
|
18
|
-
return {
|
|
19
|
-
container: css`
|
|
20
|
-
position: relative;
|
|
21
|
-
border-radius: 8px;
|
|
22
|
-
`,
|
|
23
|
-
|
|
24
|
-
modalRoot: css`
|
|
25
|
-
z-index: 2000;
|
|
26
|
-
`,
|
|
27
|
-
};
|
|
28
|
-
});
|
|
29
|
-
|
|
30
14
|
interface SessionItemProps {
|
|
31
15
|
id: string;
|
|
32
16
|
}
|
|
33
17
|
|
|
34
18
|
const SessionItem = memo<SessionItemProps>(({ id }) => {
|
|
35
19
|
const [open, setOpen] = useState(false);
|
|
36
|
-
|
|
37
|
-
const isHovering = useHover(ref);
|
|
38
|
-
const { mobile } = useResponsive();
|
|
39
|
-
const { styles } = useStyles();
|
|
20
|
+
|
|
40
21
|
const [defaultModel] = useGlobalStore((s) => [settingsSelectors.defaultAgentConfig(s).model]);
|
|
41
22
|
|
|
42
23
|
const [
|
|
@@ -73,19 +54,6 @@ const SessionItem = memo<SessionItemProps>(({ id }) => {
|
|
|
73
54
|
|
|
74
55
|
const actions = useMemo(() => <Actions id={id} setOpen={setOpen} />, [id]);
|
|
75
56
|
|
|
76
|
-
const avatarRender = useMemo(
|
|
77
|
-
() => (
|
|
78
|
-
<Avatar
|
|
79
|
-
animation={isHovering}
|
|
80
|
-
avatar={avatar}
|
|
81
|
-
background={avatarBackground}
|
|
82
|
-
shape="circle"
|
|
83
|
-
size={46}
|
|
84
|
-
/>
|
|
85
|
-
),
|
|
86
|
-
[isHovering, avatar, avatarBackground],
|
|
87
|
-
);
|
|
88
|
-
|
|
89
57
|
const addon = useMemo(
|
|
90
58
|
() =>
|
|
91
59
|
!showModel ? undefined : (
|
|
@@ -97,23 +65,19 @@ const SessionItem = memo<SessionItemProps>(({ id }) => {
|
|
|
97
65
|
);
|
|
98
66
|
|
|
99
67
|
return (
|
|
100
|
-
<
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
showAction={open || isHovering}
|
|
114
|
-
title={title}
|
|
115
|
-
/>
|
|
116
|
-
</Flexbox>
|
|
68
|
+
<ListItem
|
|
69
|
+
actions={actions}
|
|
70
|
+
active={active}
|
|
71
|
+
addon={addon}
|
|
72
|
+
avatar={avatar}
|
|
73
|
+
avatarBackground={avatarBackground}
|
|
74
|
+
date={updateAt}
|
|
75
|
+
description={description || systemRole}
|
|
76
|
+
loading={loading}
|
|
77
|
+
pin={pin}
|
|
78
|
+
showAction={open}
|
|
79
|
+
title={title}
|
|
80
|
+
/>
|
|
117
81
|
);
|
|
118
82
|
}, shallow);
|
|
119
83
|
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { Avatar, List, ListItemProps } from '@lobehub/ui';
|
|
2
|
+
import { useHover } from 'ahooks';
|
|
3
|
+
import { createStyles, useResponsive } from 'antd-style';
|
|
4
|
+
import { memo, useMemo, useRef } from 'react';
|
|
5
|
+
|
|
6
|
+
const { Item } = List;
|
|
7
|
+
|
|
8
|
+
const useStyles = createStyles(({ css, token, responsive }) => {
|
|
9
|
+
return {
|
|
10
|
+
container: css`
|
|
11
|
+
position: relative;
|
|
12
|
+
|
|
13
|
+
margin-block: 2px;
|
|
14
|
+
padding-right: 16px;
|
|
15
|
+
padding-left: 8px;
|
|
16
|
+
|
|
17
|
+
border-radius: ${token.borderRadius}px;
|
|
18
|
+
${responsive.mobile} {
|
|
19
|
+
margin-block: 0;
|
|
20
|
+
padding-left: 12px;
|
|
21
|
+
border-radius: 0;
|
|
22
|
+
}
|
|
23
|
+
`,
|
|
24
|
+
};
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
const ListItem = memo<ListItemProps & { avatar: string; avatarBackground?: string }>(
|
|
28
|
+
({ avatar, avatarBackground, active, showAction, actions, ...props }) => {
|
|
29
|
+
const ref = useRef(null);
|
|
30
|
+
const isHovering = useHover(ref);
|
|
31
|
+
const { mobile } = useResponsive();
|
|
32
|
+
const { styles } = useStyles();
|
|
33
|
+
|
|
34
|
+
const avatarRender = useMemo(
|
|
35
|
+
() => (
|
|
36
|
+
<Avatar
|
|
37
|
+
animation={isHovering}
|
|
38
|
+
avatar={avatar}
|
|
39
|
+
background={avatarBackground}
|
|
40
|
+
shape="circle"
|
|
41
|
+
size={46}
|
|
42
|
+
/>
|
|
43
|
+
),
|
|
44
|
+
[isHovering, avatar, avatarBackground],
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
return (
|
|
48
|
+
<Item
|
|
49
|
+
actions={actions}
|
|
50
|
+
active={mobile ? false : active}
|
|
51
|
+
avatar={avatarRender}
|
|
52
|
+
className={styles.container}
|
|
53
|
+
ref={ref}
|
|
54
|
+
showAction={actions && (isHovering || showAction)}
|
|
55
|
+
{...(props as any)}
|
|
56
|
+
/>
|
|
57
|
+
);
|
|
58
|
+
},
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
export default ListItem;
|
|
@@ -5,16 +5,17 @@ import Image from 'next/image';
|
|
|
5
5
|
import { memo } from 'react';
|
|
6
6
|
import { useTranslation } from 'react-i18next';
|
|
7
7
|
|
|
8
|
+
import MobilePadding from '@/components/MobilePadding';
|
|
8
9
|
import { AGENTS_INDEX_GITHUB } from '@/const/url';
|
|
9
10
|
|
|
10
11
|
const Inner = memo(() => {
|
|
11
12
|
const { t } = useTranslation('market');
|
|
12
13
|
return (
|
|
13
|
-
<
|
|
14
|
+
<MobilePadding>
|
|
14
15
|
<Image
|
|
15
16
|
alt={'banner'}
|
|
16
17
|
height={602}
|
|
17
|
-
src={'/images/
|
|
18
|
+
src={'/images/banner_market_modal.webp'}
|
|
18
19
|
style={{ height: 'auto', marginBottom: 24, width: '100%' }}
|
|
19
20
|
width={1602}
|
|
20
21
|
/>
|
|
@@ -45,7 +46,7 @@ const Inner = memo(() => {
|
|
|
45
46
|
>
|
|
46
47
|
{t('guide.func2.button')}
|
|
47
48
|
</Button>
|
|
48
|
-
</
|
|
49
|
+
</MobilePadding>
|
|
49
50
|
);
|
|
50
51
|
});
|
|
51
52
|
|
|
@@ -5,10 +5,15 @@ import { CSSProperties, ReactNode, memo } from 'react';
|
|
|
5
5
|
|
|
6
6
|
const { Item } = List;
|
|
7
7
|
|
|
8
|
-
const useStyles = createStyles(({ css }) => ({
|
|
8
|
+
const useStyles = createStyles(({ css, token, responsive }) => ({
|
|
9
9
|
container: css`
|
|
10
|
+
position: relative;
|
|
10
11
|
padding-top: 20px;
|
|
11
12
|
padding-bottom: 20px;
|
|
13
|
+
border-radius: ${token.borderRadius}px;
|
|
14
|
+
${responsive.mobile} {
|
|
15
|
+
border-radius: 0;
|
|
16
|
+
}
|
|
12
17
|
`,
|
|
13
18
|
}));
|
|
14
19
|
|
package/src/const/url.ts
CHANGED
|
@@ -10,6 +10,7 @@ import { INBOX_SESSION_ID } from './session';
|
|
|
10
10
|
export const GITHUB = pkg.homepage;
|
|
11
11
|
export const CHANGELOG = urlJoin(GITHUB, 'blob/master/CHANGELOG.md');
|
|
12
12
|
export const WIKI = urlJoin(GITHUB, 'wiki');
|
|
13
|
+
export const WIKI_PLUGIN_GUIDE = urlJoin(WIKI, 'Plugin-Development');
|
|
13
14
|
export const ABOUT = pkg.homepage;
|
|
14
15
|
export const FEEDBACK = pkg.bugs.url;
|
|
15
16
|
export const DISCORD = 'https://discord.gg/AYFPHvv2jT';
|
|
@@ -181,7 +181,17 @@ const MarketList = memo(() => {
|
|
|
181
181
|
{
|
|
182
182
|
children: isEmpty ? loadingList : [...deprecatedList, ...customList, ...list],
|
|
183
183
|
extra: (
|
|
184
|
-
<
|
|
184
|
+
<Space.Compact style={{ width: 'auto' }}>
|
|
185
|
+
<Button
|
|
186
|
+
icon={<Icon icon={LucideBlocks} />}
|
|
187
|
+
onClick={(e) => {
|
|
188
|
+
e.stopPropagation();
|
|
189
|
+
setModal(true);
|
|
190
|
+
}}
|
|
191
|
+
size={'small'}
|
|
192
|
+
>
|
|
193
|
+
{t('settingPlugin.addTooltip')}
|
|
194
|
+
</Button>
|
|
185
195
|
{hasDeprecated ? (
|
|
186
196
|
<Tooltip title={t('settingPlugin.clearDeprecated')}>
|
|
187
197
|
<Button
|
|
@@ -193,34 +203,20 @@ const MarketList = memo(() => {
|
|
|
193
203
|
}
|
|
194
204
|
}}
|
|
195
205
|
size={'small'}
|
|
196
|
-
type={'text'}
|
|
197
206
|
/>
|
|
198
207
|
</Tooltip>
|
|
199
208
|
) : null}
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
</Tooltip>
|
|
212
|
-
<Tooltip title={t('settingPlugin.settings')}>
|
|
213
|
-
<Button
|
|
214
|
-
icon={<Icon icon={LucideSettings} />}
|
|
215
|
-
onClick={(e) => {
|
|
216
|
-
e.stopPropagation();
|
|
217
|
-
setShowSettings(true);
|
|
218
|
-
}}
|
|
219
|
-
size={'small'}
|
|
220
|
-
/>
|
|
221
|
-
</Tooltip>
|
|
222
|
-
</Space.Compact>
|
|
223
|
-
</Flexbox>
|
|
209
|
+
<Tooltip title={t('settingPlugin.settings')}>
|
|
210
|
+
<Button
|
|
211
|
+
icon={<Icon icon={LucideSettings} />}
|
|
212
|
+
onClick={(e) => {
|
|
213
|
+
e.stopPropagation();
|
|
214
|
+
setShowSettings(true);
|
|
215
|
+
}}
|
|
216
|
+
size={'small'}
|
|
217
|
+
/>
|
|
218
|
+
</Tooltip>
|
|
219
|
+
</Space.Compact>
|
|
224
220
|
),
|
|
225
221
|
icon: LucideStore,
|
|
226
222
|
title: t('settingPlugin.title'),
|
|
@@ -5,7 +5,7 @@ import { useTranslation } from 'react-i18next';
|
|
|
5
5
|
import { Flexbox } from 'react-layout-kit';
|
|
6
6
|
|
|
7
7
|
import MobilePadding from '@/components/MobilePadding';
|
|
8
|
-
import { PLUGINS_INDEX_URL } from '@/const/url';
|
|
8
|
+
import { PLUGINS_INDEX_URL, WIKI_PLUGIN_GUIDE } from '@/const/url';
|
|
9
9
|
|
|
10
10
|
interface MarketSettingModalProps {
|
|
11
11
|
onOpenChange: (open: boolean) => void;
|
|
@@ -34,7 +34,14 @@ const MarketSettingModal = memo<MarketSettingModalProps>(({ open, onOpenChange }
|
|
|
34
34
|
style={{ width: '100%' }}
|
|
35
35
|
/>
|
|
36
36
|
),
|
|
37
|
-
desc:
|
|
37
|
+
desc: (
|
|
38
|
+
<>
|
|
39
|
+
{t('dev.modalDesc')}
|
|
40
|
+
<a href={WIKI_PLUGIN_GUIDE} rel="noreferrer" target={'_blank'}>
|
|
41
|
+
{WIKI_PLUGIN_GUIDE}
|
|
42
|
+
</a>
|
|
43
|
+
</>
|
|
44
|
+
),
|
|
38
45
|
label: t('settings.indexUrl.title'),
|
|
39
46
|
},
|
|
40
47
|
],
|
|
@@ -6,6 +6,7 @@ import { useTranslation } from 'react-i18next';
|
|
|
6
6
|
import { Flexbox } from 'react-layout-kit';
|
|
7
7
|
|
|
8
8
|
import MobilePadding from '@/components/MobilePadding';
|
|
9
|
+
import { WIKI_PLUGIN_GUIDE } from '@/const/url';
|
|
9
10
|
import { CustomPlugin } from '@/types/plugin';
|
|
10
11
|
|
|
11
12
|
import ManifestForm from './ManifestForm';
|
|
@@ -102,7 +103,18 @@ const DevModal = memo<DevModalProps>(
|
|
|
102
103
|
>
|
|
103
104
|
<Flexbox gap={mobile ? 0 : 16}>
|
|
104
105
|
<MobilePadding bottom={0} gap={16}>
|
|
105
|
-
<Alert
|
|
106
|
+
<Alert
|
|
107
|
+
message={
|
|
108
|
+
<>
|
|
109
|
+
{t('dev.modalDesc')}
|
|
110
|
+
<a href={WIKI_PLUGIN_GUIDE} rel="noreferrer" target={'_blank'}>
|
|
111
|
+
{WIKI_PLUGIN_GUIDE}
|
|
112
|
+
</a>
|
|
113
|
+
</>
|
|
114
|
+
}
|
|
115
|
+
showIcon
|
|
116
|
+
type={'info'}
|
|
117
|
+
/>
|
|
106
118
|
{/*<Tabs*/}
|
|
107
119
|
{/* items={[*/}
|
|
108
120
|
{/* { children: <MetaForm />, key: 'meta', label: t('dev.tabs.meta') },*/}
|
|
Binary file
|