{t('index.spaceTitle')}
diff --git a/web/src/views/Login/index.tsx b/web/src/views/Login/index.tsx
index 6a5f31cd..6f6230c3 100644
--- a/web/src/views/Login/index.tsx
+++ b/web/src/views/Login/index.tsx
@@ -14,27 +14,33 @@ import React, { useState, useEffect } from 'react';
import { useTranslation } from 'react-i18next';
import { Button, Input, Form, App } from 'antd';
import type { FormProps } from 'antd';
+import clsx from 'clsx';
import { useUser, type LoginInfo } from '@/store/user';
import { login } from '@/api/user'
-import loginBg from '@/assets/images/login/loginBg.png'
-import check from '@/assets/images/login/check.png'
+import loginBg from '@/assets/images/login/bg.mp4'
+import check from '@/assets/images/login/check.svg'
import email from '@/assets/images/login/email.svg'
import lock from '@/assets/images/login/lock.svg'
import type { LoginForm } from './types';
+import { useI18n } from '@/store/locale'
/**
* Input field styling
*/
-const inputClassName = "rb:rounded-[8px]! rb:p-[12px]! rb:h-[44px]!"
+const inputClassName = "login-input rb:rounded-[8px]! rb:p-[12px]! rb:h-[44px]! rb:bg-transparent! rb:text-[#FFFFFF]! [&_input]:rb:text-[#FFFFFF]! [&_input]:rb:caret-[#FFFFFF]!"
/**
* Login page component
*/const LoginPage: React.FC = () => {
const { t } = useTranslation();
const { clearUserInfo, updateLoginInfo, getUserInfo } = useUser();
+ const { language } = useI18n()
const [loading, setLoading] = useState(false);
const [form] = Form.useForm
();
+ const emailVal = Form.useWatch('email', form);
+ const passwordVal = Form.useWatch('password', form);
+ const canLogin = !!(emailVal && passwordVal);
const { message } = App.useApp();
useEffect(() => {
@@ -43,6 +49,7 @@ const inputClassName = "rb:rounded-[8px]! rb:p-[12px]! rb:h-[44px]!"
/** Handle login form submission */
const handleLogin: FormProps['onFinish'] = async (values) => {
+ if (!canLogin) return;
if (!values.email) {
message.warning(t('login.emailPlaceholder'));
return;
@@ -64,42 +71,45 @@ const inputClassName = "rb:rounded-[8px]! rb:p-[12px]! rb:h-[44px]!"
return (
-
+
-

-
-
{t('login.title')}
-
{t('login.subTitle')}
+
+
+
+
{t('login.subTitle')}
-
- {['intelligentMemory', 'instantRecall', 'knowledgeAssociation'].map(key => (
-
+
+ {['intelligentMemory', 'instantRecall', 'knowledgeAssociation'].map((key, index) => (
+
{t(`login.${key}`)}
-
{t(`login.${key}Desc`)}
+
{t(`login.${key}Desc`)}
))}
-
-
-
{t('login.welcome')}
+
+
+
{t('login.welcome')}
+
}
placeholder={t('login.emailPlaceholder')}
className={inputClassName}
/>
-
+
}
placeholder={t('login.passwordPlaceholder')}
@@ -111,7 +121,11 @@ const inputClassName = "rb:rounded-[8px]! rb:p-[12px]! rb:h-[44px]!"
block
loading={loading}
htmlType="submit"
- className="rb:h-10! rb:rounded-lg! rb:mt-4"
+ disabled={!canLogin}
+ className={clsx("rb:h-11.5! rb:rounded-lg! rb:mt-12", {
+ 'rb:hover:bg-[#2d6ef1]! rb:bg-[#155EEF]! rb:border-[#155EEF]!': canLogin,
+ 'rb:bg-[#171719]! rb:border-[#171719]!': !canLogin
+ })}
>
{t('login.loginIn')}
diff --git a/web/src/views/ToolManagement/Market.tsx b/web/src/views/ToolManagement/Market.tsx
index 2c2cb6a9..3d70f08e 100644
--- a/web/src/views/ToolManagement/Market.tsx
+++ b/web/src/views/ToolManagement/Market.tsx
@@ -361,7 +361,7 @@ const Market: React.FC<{ getStatusTag?: (status: string) => ReactNode }> = () =>
)}
-
{source.name}
+
{source.name}
{t('tool.availableMcp')} ({mcpTotal})