ci / 质量门禁 (push) Canceled after 0s
- 建立 pnpm workspace + Turborepo 单仓、ESLint 9/Prettier/commitlint/husky 门禁 - NestJS + Fastify API:统一错误体、trace_id、Zod 管道、/health 真实依赖探活、OpenAPI 3.1 契约 - Prisma 基线:outbox_events/idempotency_keys/system_configs 与首版迁移、幂等种子 - shared 契约包:错误码、权限点、ULID、游标分页、命名/时间工具 - ui 包与 Web 壳层:Semi + Remix 图标统一出口、Cloud Blue 视觉、登录/工作台/错误页 - worker 骨架、Playwright 冒烟、Gitea CI、OpenAPI 快照与 oasdiff 回退脚本 - 补充 A0 实施报告与本地开发说明
36 lines
1.0 KiB
TypeScript
36 lines
1.0 KiB
TypeScript
import type { ReactNode } from 'react';
|
|
|
|
import { LoginBrandPanel } from './LoginBrandPanel';
|
|
import { LoginFormCard } from './LoginFormCard';
|
|
import { useLoginForm } from './use-login-form';
|
|
|
|
export default function LoginPage(): ReactNode {
|
|
const { account, password, submitting, setAccount, setPassword, handleSubmit } = useLoginForm();
|
|
|
|
return (
|
|
<main className="lx-login">
|
|
<LoginBrandPanel />
|
|
<section className="lx-login__panel">
|
|
<LoginFormCard
|
|
account={account}
|
|
password={password}
|
|
submitting={submitting}
|
|
onAccountChange={setAccount}
|
|
onPasswordChange={setPassword}
|
|
onSubmit={(event) => {
|
|
void handleSubmit(event);
|
|
}}
|
|
/>
|
|
</section>
|
|
<footer className="lx-login__footer">
|
|
<span>© 2026 灵犀 · 内部系统</span>
|
|
<span className="lx-login__footer-links">
|
|
<span>隐私政策</span>
|
|
<span>服务条款</span>
|
|
<span>华东一区</span>
|
|
</span>
|
|
</footer>
|
|
</main>
|
|
);
|
|
}
|