fix: restore polished account experience and align AI with Lark design

This commit is contained in:
yuxuanhui
2026-09-07 23:31:23 +08:00
parent 3f3d417296
commit 7dcf46836f
23 changed files with 1669 additions and 807 deletions
+34 -57
View File
@@ -9,14 +9,6 @@ import {
Spin,
Toast,
} from "@douyinfe/semi-ui-19";
import {
IconGridView,
IconUser,
IconBell,
IconExit,
IconArrowRight,
IconPulse,
} from "@douyinfe/semi-icons";
import zhCN from "@douyinfe/semi-ui-19/lib/es/locale/source/zh_CN";
import { api, post } from "./api";
import type { Account, Job } from "./types";
@@ -162,28 +154,25 @@ export default function App() {
/>
) : (
<div className="workspace">
<aside className="sidebar">
<aside className="sidebar" inert={chatOpen && viewport < 1440}>
<div className="brand">
<span className="brand-mark">α</span>
<div>
ALPHA<span>RESEARCH WORKSPACE</span>
</div>
<div>Alpha 研究</div>
</div>
<div className="nav-label">工作空间</div>
<button
aria-label="Alpha 管理"
className={`nav-item ${page === "alphas" ? "active" : ""}`}
aria-current={page === "alphas" ? "page" : undefined}
onClick={() => changePage("alphas")}
>
<IconGridView size="large" />
Alpha 管理
</button>
<button
aria-label="个人信息"
className={`nav-item ${page === "account" ? "active" : ""}`}
aria-current={page === "account" ? "page" : undefined}
onClick={() => changePage("account")}
>
<IconUser size="large" />
个人信息
</button>
<div className="sidebar-bottom">
@@ -199,20 +188,16 @@ export default function App() {
? "WorldQuant 已连接"
: "WorldQuant 未连接"}
</div>
<span>个人研究空间 · v0.1</span>
</div>
</aside>
<div className="main-shell">
<div className="main-shell" inert={chatOpen && viewport < 1440}>
<header className="topbar">
<div className="breadcrumbs">
工作空间 <span>/</span>{" "}
{page === "alphas" ? "Alpha 管理" : "个人信息"}
</div>
<div className="breadcrumbs">研究工作空间</div>
<div className="top-actions">
<Badge count={pending}>
<Button
type="tertiary"
theme="borderless"
icon={<IconBell />}
onClick={() => {
focusBusiness();
setShowJobs(true);
@@ -223,27 +208,34 @@ export default function App() {
</Badge>
<Button
aria-label="切换研究助手"
aria-expanded={chatOpen}
aria-controls="research-assistant"
type="tertiary"
theme={chatOpen ? "light" : "borderless"}
onClick={() => setChatOpen(!chatOpen)}
>
AI 助手
</Button>
<div className="top-divider" />
<Avatar size="small" color="purple">
<Avatar size="small" color="grey">
{account?.display_name.slice(0, 1) || "研"}
</Avatar>
<span className="account-name">
{account?.display_name ?? "研究员"}
</span>
<Button
type="tertiary"
aria-label="退出登录"
theme="borderless"
icon={<IconExit />}
onClick={() => void logout()}
/>
>
退出
</Button>
</div>
</header>
<main className="page-content">
<main
className={`page-content ${page === "alphas" ? "bounded-page" : "account-page"}`}
>
{pollError && (
<Banner
type="warning"
@@ -257,7 +249,7 @@ export default function App() {
onTask={taskCreated}
/>
</div>
<div hidden={page !== "alphas"}>
<div className="alpha-page-view" hidden={page !== "alphas"}>
<AlphaPage
taskPanelOpen={showJobs}
account={account}
@@ -292,12 +284,20 @@ export default function App() {
<Button
className="ai-launcher"
aria-label="打开研究助手"
theme="solid"
theme="light"
type="tertiary"
onClick={() => setChatOpen(true)}
>
AI 研究助手
</Button>
)}
{chatOpen && viewport < 1440 && (
<div
className="ai-mask"
aria-hidden="true"
onClick={() => setChatOpen(false)}
/>
)}
<ChatPanel
jobs={jobs}
open={chatOpen}
@@ -309,6 +309,11 @@ export default function App() {
onSettings={() => {
focusBusiness();
changePage("account");
requestAnimationFrame(() =>
document
.getElementById("model-settings")
?.scrollIntoView({ block: "start" }),
);
}}
onChanged={actionDone}
onAction={(action) => {
@@ -344,35 +349,9 @@ function Login({ onLogin }: { onLogin: () => void }) {
}
return (
<div className="login-page">
<section className="login-story">
<div className="brand">
<span className="brand-mark">α</span>
<div>
ALPHA<span>RESEARCH WORKSPACE</span>
</div>
</div>
<div className="story-copy">
<div className="eyebrow">WORLDQUANT RESEARCH</div>
<h1>
让每一次研究,
<br />
都有迹可循。
</h1>
<p>
从想法到验证,从信号到洞察。
<br />
在一个工作空间里,管理你的 Alpha 研究。
</p>
<div className="story-signal">
<IconPulse size="extra-large" />
<span>观察 · 记录 · 迭代</span>
</div>
</div>
<div className="login-footnote">你的个人 Alpha 研究工作空间</div>
</section>
<section className="login-form-shell">
<form className="login-form" onSubmit={submit}>
<div className="eyebrow">欢迎回来</div>
<div className="login-brand">Alpha 研究</div>
<h2>登录研究工作空间</h2>
<p>使用部署时设置的系统账户登录。</p>
{error && <Banner type="danger" description={error} />}
@@ -403,8 +382,6 @@ function Login({ onLogin }: { onLogin: () => void }) {
size="large"
block
loading={busy}
icon={<IconArrowRight />}
iconPosition="right"
>
进入工作空间
</Button>