: null}
);
}
diff --git a/client/src/components/shell/AppBrand.tsx b/client/src/components/shell/AppBrand.tsx
index 82c86e5b..69705719 100644
--- a/client/src/components/shell/AppBrand.tsx
+++ b/client/src/components/shell/AppBrand.tsx
@@ -1,12 +1,14 @@
export function AppBrand({ compact = false }: { compact?: boolean }) {
return (
-
- H
+
-
海音达工作台
-
企业微信入口 + 工作台主平台
+
海音达工作台
+
Hyinda OA · 小团队运营中枢
);
diff --git a/client/src/components/ui/button.tsx b/client/src/components/ui/button.tsx
index 236853f6..f536bac3 100644
--- a/client/src/components/ui/button.tsx
+++ b/client/src/components/ui/button.tsx
@@ -4,15 +4,15 @@ import { cva, type VariantProps } from "class-variance-authority";
import { cn } from "../../lib/utils";
const buttonVariants = cva(
- "inline-flex items-center justify-center whitespace-nowrap rounded-xl text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-zinc-300 disabled:pointer-events-none disabled:opacity-50",
+ "inline-flex items-center justify-center whitespace-nowrap rounded-xl text-sm font-medium transition duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/20 disabled:pointer-events-none disabled:opacity-50",
{
variants: {
variant: {
- default: "bg-[var(--color-accent-primary)] text-white hover:bg-[var(--color-accent-primary-hover)] shadow-sm",
- secondary: "border border-zinc-200 bg-white text-zinc-700 hover:bg-zinc-50 shadow-sm",
- outline: "border border-zinc-200 bg-transparent text-zinc-900 hover:bg-zinc-50",
+ default: "bg-[var(--color-accent-primary)] text-white shadow-sm hover:-translate-y-0.5 hover:bg-[var(--color-accent-primary-hover)] hover:shadow-md",
+ secondary: "border border-slate-200 bg-white/90 text-slate-700 shadow-sm hover:-translate-y-0.5 hover:bg-white hover:shadow-md",
+ outline: "border border-slate-200 bg-transparent text-slate-900 hover:bg-white/80",
destructive: "bg-red-600 text-white hover:bg-red-700 shadow-sm",
- ghost: "bg-transparent text-zinc-700 hover:bg-zinc-100",
+ ghost: "bg-transparent text-slate-700 hover:bg-slate-100",
link: "bg-transparent text-primary underline-offset-4 hover:underline",
},
size: {
diff --git a/client/src/design/theme.css b/client/src/design/theme.css
index 400d5049..04408b7c 100644
--- a/client/src/design/theme.css
+++ b/client/src/design/theme.css
@@ -1,25 +1,31 @@
:root {
- --color-bg-canvas: #f5f7fa;
+ --color-bg-canvas: #f5f7f8;
+ --color-bg-canvas-deep: #e8eef5;
--color-bg-surface: #ffffff;
- --color-bg-surface-subtle: #fafafb;
- --color-bg-primary-soft: #f2f5f8;
- --color-text-primary: #111827;
- --color-text-secondary: #667085;
- --color-text-tertiary: #98a2b3;
- --color-border-default: #e4e7ec;
- --color-border-strong: #d0d5dd;
- --color-accent-primary: #111827;
- --color-accent-primary-hover: #1f2937;
+ --color-bg-surface-subtle: #f8fafc;
+ --color-bg-surface-raised: rgba(255, 255, 255, 0.92);
+ --color-bg-primary-soft: #e6ecf4;
+ --color-text-primary: #0f172a;
+ --color-text-secondary: #475569;
+ --color-text-tertiary: #94a3b8;
+ --color-border-default: #e2e8f0;
+ --color-border-strong: #cbd5e1;
+ --color-accent-primary: #00398a;
+ --color-accent-primary-hover: #002e6e;
+ --color-accent-secondary: #13a8b8;
+ --color-accent-ink: #001f4d;
--color-success: #067647;
--color-warning: #b54708;
--color-danger: #b42318;
- --color-info: #155eef;
+ --color-info: #00398a;
--radius-sm: 0.5rem;
--radius-md: 0.75rem;
--radius-lg: 1rem;
--radius-xl: 1.25rem;
- --radius-panel: 1rem;
- --shadow-xs: 0 1px 2px rgba(16, 24, 40, 0.04);
- --shadow-sm: 0 1px 3px rgba(16, 24, 40, 0.08), 0 1px 2px rgba(16, 24, 40, 0.04);
- --shadow-md: 0 8px 24px rgba(16, 24, 40, 0.08);
+ --radius-2xl: 1.5rem;
+ --radius-panel: 1.25rem;
+ --shadow-xs: 0 1px 2px rgba(15, 23, 42, 0.05);
+ --shadow-sm: 0 8px 24px rgba(15, 23, 42, 0.08), 0 1px 2px rgba(15, 23, 42, 0.05);
+ --shadow-md: 0 22px 55px rgba(0, 57, 138, 0.14);
+ --shadow-focus: 0 0 0 4px rgba(0, 57, 138, 0.14);
}
diff --git a/client/src/design/tokens.ts b/client/src/design/tokens.ts
index 0b23eed6..7eea726c 100644
--- a/client/src/design/tokens.ts
+++ b/client/src/design/tokens.ts
@@ -1,32 +1,38 @@
export const semanticTokens = {
colors: {
- bgCanvas: "#f5f7fa",
+ bgCanvas: "#f5f7f8",
+ bgCanvasDeep: "#e8eef5",
bgSurface: "#ffffff",
- bgSurfaceSubtle: "#fafafb",
- bgPrimarySoft: "#f2f5f8",
- textPrimary: "#111827",
- textSecondary: "#667085",
- textTertiary: "#98a2b3",
- borderDefault: "#e4e7ec",
- borderStrong: "#d0d5dd",
- accentPrimary: "#111827",
- accentPrimaryHover: "#1f2937",
+ bgSurfaceSubtle: "#f8fafc",
+ bgSurfaceRaised: "rgba(255, 255, 255, 0.92)",
+ bgPrimarySoft: "#e6ecf4",
+ textPrimary: "#0f172a",
+ textSecondary: "#475569",
+ textTertiary: "#94a3b8",
+ borderDefault: "#e2e8f0",
+ borderStrong: "#cbd5e1",
+ accentPrimary: "#00398a",
+ accentPrimaryHover: "#002e6e",
+ accentSecondary: "#13a8b8",
+ accentInk: "#001f4d",
success: "#067647",
warning: "#b54708",
danger: "#b42318",
- info: "#155eef",
+ info: "#00398a",
},
radius: {
sm: "0.5rem",
md: "0.75rem",
lg: "1rem",
xl: "1.25rem",
- panel: "1rem",
+ "2xl": "1.5rem",
+ panel: "1.25rem",
},
shadow: {
- xs: "0 1px 2px rgba(16, 24, 40, 0.04)",
- sm: "0 1px 3px rgba(16, 24, 40, 0.08), 0 1px 2px rgba(16, 24, 40, 0.04)",
- md: "0 8px 24px rgba(16, 24, 40, 0.08)",
+ xs: "0 1px 2px rgba(15, 23, 42, 0.05)",
+ sm: "0 8px 24px rgba(15, 23, 42, 0.08), 0 1px 2px rgba(15, 23, 42, 0.05)",
+ md: "0 22px 55px rgba(0, 57, 138, 0.14)",
+ focus: "0 0 0 4px rgba(0, 57, 138, 0.14)",
},
spacing: {
pageX: "1.5rem",
diff --git a/client/src/index.css b/client/src/index.css
index e966baf8..91abbbf4 100644
--- a/client/src/index.css
+++ b/client/src/index.css
@@ -14,12 +14,18 @@
@layer base {
html {
color-scheme: light;
+ background: var(--color-bg-canvas);
}
body {
- background: var(--color-bg-canvas);
+ min-height: 100vh;
+ background:
+ radial-gradient(circle at 10% -8%, rgba(0, 57, 138, 0.10), transparent 30rem),
+ radial-gradient(circle at 92% 0%, rgba(19, 168, 184, 0.12), transparent 32rem),
+ linear-gradient(180deg, #ffffff 0%, var(--color-bg-canvas) 18rem, #eef2f6 100%);
+ background-attachment: fixed;
color: var(--color-text-primary);
- @apply font-sans antialiased selection:bg-zinc-900 selection:text-white;
+ @apply font-sans antialiased selection:bg-primary selection:text-white;
}
#root {
@@ -33,142 +39,234 @@
@layer components {
.layout-container {
- @apply mx-auto w-full px-4 sm:px-6 lg:px-8;
+ @apply mx-auto w-full px-0 sm:px-1 lg:px-2;
}
.page-scaffold {
+ animation: page-reveal 420ms ease-out both;
@apply space-y-6;
}
.workbench-hero {
- background: linear-gradient(135deg, rgba(17, 24, 39, 0.03), rgba(255, 255, 255, 0.96));
- border: 1px solid var(--color-border-default);
- border-radius: var(--radius-xl);
- box-shadow: var(--shadow-xs);
- @apply flex flex-col gap-4 px-6 py-6 md:flex-row md:items-end md:justify-between;
+ position: relative;
+ overflow: hidden;
+ background:
+ radial-gradient(circle at 12% 4%, rgba(0, 57, 138, 0.14), transparent 17rem),
+ radial-gradient(circle at 86% 12%, rgba(19, 168, 184, 0.15), transparent 19rem),
+ linear-gradient(135deg, rgba(255, 255, 255, 0.98), rgba(230, 236, 244, 0.94));
+ border: 1px solid rgba(226, 232, 240, 0.92);
+ border-radius: var(--radius-2xl);
+ box-shadow: var(--shadow-sm);
+ @apply flex flex-col gap-5 px-6 py-7 md:flex-row md:items-end md:justify-between md:px-7;
+ }
+
+ .workbench-hero::after {
+ position: absolute;
+ inset: auto -5rem -7rem auto;
+ width: 18rem;
+ height: 18rem;
+ content: "";
+ background:
+ repeating-radial-gradient(ellipse at center, rgba(0, 57, 138, 0.13) 0 1px, transparent 1px 16px);
+ border-radius: 9999px;
+ transform: rotate(-8deg);
+ }
+
+ .workbench-hero > * {
+ position: relative;
+ z-index: 1;
}
.workbench-hero__eyebrow {
- @apply text-xs font-semibold uppercase tracking-[0.18em] text-zinc-500;
+ color: var(--color-accent-primary);
+ @apply text-xs font-bold uppercase tracking-[0.22em];
}
.workbench-hero__title {
- @apply mt-2 text-3xl font-semibold tracking-tight text-zinc-900;
+ color: var(--color-text-primary);
+ @apply mt-2 text-3xl font-semibold tracking-tight md:text-4xl;
}
.workbench-hero__subtitle {
- @apply mt-2 max-w-3xl text-sm leading-6 text-zinc-600;
+ color: var(--color-text-secondary);
+ @apply mt-3 max-w-3xl text-sm leading-6 md:text-base md:leading-7;
}
.card-std {
- background: var(--color-bg-surface);
- border: 1px solid var(--color-border-default);
+ background: var(--color-bg-surface-raised);
+ border: 1px solid rgba(226, 232, 240, 0.92);
border-radius: var(--radius-panel);
box-shadow: var(--shadow-sm);
+ backdrop-filter: blur(18px);
}
.card-title {
- @apply text-xs font-semibold uppercase tracking-[0.18em] text-zinc-500;
+ color: var(--color-text-tertiary);
+ @apply text-xs font-semibold uppercase tracking-[0.18em];
}
.card-desc {
- @apply mt-2 text-sm leading-6 text-zinc-600;
+ color: var(--color-text-secondary);
+ @apply mt-2 text-sm leading-6;
}
.card-value {
- @apply text-3xl font-semibold tracking-tight text-zinc-900;
+ color: var(--color-text-primary);
+ @apply text-3xl font-semibold tracking-tight;
}
.section-panel {
- @apply p-6;
+ position: relative;
+ overflow: hidden;
+ @apply p-5 md:p-6;
+ }
+
+ .section-panel::before {
+ position: absolute;
+ inset: 0 0 auto 0;
+ height: 3px;
+ content: "";
+ background: linear-gradient(90deg, var(--color-accent-primary), rgba(19, 168, 184, 0.72), transparent);
+ opacity: 0.7;
}
.section-panel__header {
+ position: relative;
+ z-index: 1;
@apply flex flex-wrap items-start justify-between gap-3;
}
.section-panel__title {
- @apply text-base font-semibold text-zinc-900;
+ color: var(--color-text-primary);
+ @apply text-base font-semibold tracking-tight;
}
.section-panel__desc {
- @apply mt-1 text-sm text-zinc-500;
+ color: var(--color-text-secondary);
+ @apply mt-1 text-sm leading-6;
}
.section-panel__body {
+ position: relative;
+ z-index: 1;
@apply mt-5;
}
.metric-card {
- background: var(--color-bg-surface);
- border: 1px solid var(--color-border-default);
- border-radius: var(--radius-lg);
+ position: relative;
+ overflow: hidden;
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.98), rgba(248, 250, 252, 0.86));
+ border: 1px solid rgba(226, 232, 240, 0.96);
+ border-radius: var(--radius-panel);
box-shadow: var(--shadow-xs);
- @apply block px-5 py-5 transition-colors hover:bg-zinc-50;
+ @apply block px-5 py-5 transition duration-200 hover:-translate-y-0.5 hover:shadow-sm;
+ }
+
+ .metric-card::before {
+ position: absolute;
+ inset: 0 auto 0 0;
+ width: 4px;
+ content: "";
+ background: linear-gradient(180deg, var(--color-accent-primary), rgba(19, 168, 184, 0.72));
+ opacity: 0.82;
}
.metric-card--warning {
- @apply border-amber-200 bg-amber-50 hover:bg-amber-100;
+ background: linear-gradient(180deg, rgba(255, 251, 235, 0.98), rgba(254, 243, 199, 0.78));
+ @apply border-amber-200;
+ }
+
+ .metric-card--warning::before {
+ @apply bg-amber-500;
}
.metric-card--danger {
- @apply border-red-200 bg-red-50 hover:bg-red-100;
+ background: linear-gradient(180deg, rgba(254, 242, 242, 0.98), rgba(254, 226, 226, 0.76));
+ @apply border-red-200;
+ }
+
+ .metric-card--danger::before {
+ @apply bg-red-500;
}
.metric-card__title {
- @apply text-sm font-medium text-zinc-500;
+ color: var(--color-text-secondary);
+ @apply text-sm font-medium;
}
.metric-card__value {
- @apply mt-2 text-2xl font-semibold tracking-tight text-zinc-900;
+ color: var(--color-text-primary);
+ @apply mt-2 text-2xl font-semibold tracking-tight;
}
.metric-card__note {
- @apply mt-2 text-sm text-zinc-500;
+ color: var(--color-text-secondary);
+ @apply mt-2 text-sm leading-6;
}
.info-chip {
- @apply inline-flex items-center rounded-full border border-zinc-200 bg-white px-3 py-1 text-xs font-medium text-zinc-600;
+ border-color: rgba(203, 213, 225, 0.86);
+ background: rgba(255, 255, 255, 0.82);
+ color: var(--color-text-secondary);
+ @apply inline-flex items-center rounded-full border px-3 py-1 text-xs font-medium;
}
.surface-muted {
- @apply rounded-2xl border border-zinc-200 bg-zinc-50;
+ border-color: rgba(226, 232, 240, 0.92);
+ background: rgba(248, 250, 252, 0.86);
+ @apply rounded-2xl border;
}
.input-std {
- @apply h-11 w-full rounded-xl border border-zinc-200 bg-white px-3 py-2 text-sm text-zinc-900 shadow-sm outline-none transition-colors placeholder:text-zinc-400 focus:border-zinc-400 focus:ring-2 focus:ring-zinc-200;
+ border-color: rgba(203, 213, 225, 0.92);
+ background: rgba(255, 255, 255, 0.96);
+ color: var(--color-text-primary);
+ @apply h-11 w-full rounded-xl border px-3 py-2 text-sm shadow-sm outline-none transition placeholder:text-zinc-400 focus:border-primary focus:ring-2 focus:ring-primary/15;
}
.select-std {
- @apply h-11 w-full rounded-xl border border-zinc-200 bg-white px-3 py-2 text-sm text-zinc-700 shadow-sm outline-none transition-colors focus:border-zinc-400 focus:ring-2 focus:ring-zinc-200;
+ border-color: rgba(203, 213, 225, 0.92);
+ background: rgba(255, 255, 255, 0.96);
+ color: var(--color-text-primary);
+ @apply h-11 w-full rounded-xl border px-3 py-2 text-sm shadow-sm outline-none transition focus:border-primary focus:ring-2 focus:ring-primary/15;
}
.select-sm {
- @apply h-8 rounded-lg border border-zinc-200 bg-white px-2 py-1 text-xs font-medium text-zinc-600 shadow-sm outline-none transition-colors focus:border-zinc-400 focus:ring-2 focus:ring-zinc-200;
+ border-color: rgba(203, 213, 225, 0.92);
+ background: rgba(255, 255, 255, 0.96);
+ color: var(--color-text-secondary);
+ @apply h-8 rounded-lg border px-2 py-1 text-xs font-medium shadow-sm outline-none transition focus:border-primary focus:ring-2 focus:ring-primary/15;
}
.table-container {
- @apply overflow-hidden rounded-2xl border border-zinc-200 bg-white shadow-sm;
+ border-color: rgba(226, 232, 240, 0.92);
+ background: var(--color-bg-surface-raised);
+ @apply overflow-hidden rounded-2xl border shadow-sm backdrop-blur;
}
.table-header {
- @apply border-b border-zinc-100 bg-zinc-50/70;
+ border-color: rgba(226, 232, 240, 0.82);
+ background: rgba(248, 250, 252, 0.9);
+ @apply border-b;
}
.table-th {
- @apply px-6 py-4 text-left text-xs font-semibold uppercase tracking-wide text-zinc-500;
+ color: var(--color-text-tertiary);
+ @apply px-6 py-4 text-left text-xs font-semibold uppercase tracking-wide;
}
.table-row {
- @apply transition-colors hover:bg-zinc-50/80;
+ @apply transition-colors hover:bg-slate-50/90;
}
.table-td {
- @apply px-6 py-4 text-sm text-zinc-600;
+ color: var(--color-text-secondary);
+ @apply px-6 py-4 text-sm;
}
.table-td-strong {
- @apply px-6 py-4 text-sm font-semibold text-zinc-900;
+ color: var(--color-text-primary);
+ @apply px-6 py-4 text-sm font-semibold;
}
.page-shell-grid {
@@ -180,7 +278,7 @@
}
.badge-success {
- @apply inline-flex items-center rounded-full bg-emerald-50 px-2.5 py-0.5 text-xs font-semibold text-emerald-700 ring-1 ring-inset ring-emerald-600/10;
+ @apply inline-flex items-center rounded-full bg-emerald-50 px-2.5 py-0.5 text-xs font-semibold text-emerald-700 ring-1 ring-inset ring-emerald-600/15;
}
.badge-warning {
@@ -192,6 +290,79 @@
}
.badge-neutral {
- @apply inline-flex items-center rounded-full bg-zinc-100 px-2.5 py-0.5 text-xs font-semibold text-zinc-700 ring-1 ring-inset ring-zinc-600/10;
+ background: rgba(241, 245, 249, 0.92);
+ color: var(--color-text-secondary);
+ @apply inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-semibold ring-1 ring-inset ring-slate-300/55;
+ }
+
+ .portal-list-card {
+ background: rgba(255, 255, 255, 0.92);
+ border: 1px solid rgba(226, 232, 240, 0.94);
+ border-radius: var(--radius-panel);
+ box-shadow: var(--shadow-xs);
+ @apply block px-4 py-4 transition duration-200;
+ }
+
+ .portal-list-card:hover {
+ background: #ffffff;
+ box-shadow: var(--shadow-sm);
+ transform: translateY(-1px);
+ }
+
+ .portal-list-card--warning {
+ background: rgba(255, 251, 235, 0.9);
+ border-color: rgba(245, 158, 11, 0.36);
+ }
+
+ .portal-action-tile {
+ min-height: 100%;
+ background:
+ linear-gradient(180deg, rgba(255, 255, 255, 0.96), rgba(248, 250, 252, 0.86));
+ border: 1px solid rgba(226, 232, 240, 0.94);
+ border-radius: var(--radius-panel);
+ box-shadow: var(--shadow-xs);
+ @apply px-4 py-4 text-left transition duration-200;
+ }
+
+ .portal-action-tile:hover {
+ box-shadow: var(--shadow-sm);
+ transform: translateY(-2px);
+ }
+
+ .portal-action-tile--disabled {
+ background: rgba(241, 245, 249, 0.86);
+ color: var(--color-text-tertiary);
+ cursor: not-allowed;
+ transform: none;
+ }
+
+ .portal-action-icon {
+ background: linear-gradient(135deg, rgba(0, 57, 138, 0.12), rgba(19, 168, 184, 0.12));
+ color: var(--color-accent-primary);
+ @apply flex size-10 items-center justify-center rounded-2xl;
+ }
+
+ .portal-action-icon--muted {
+ background: rgba(226, 232, 240, 0.72);
+ color: var(--color-text-tertiary);
+ }
+
+ .portal-status-card {
+ background: rgba(255, 255, 255, 0.92);
+ border: 1px solid rgba(226, 232, 240, 0.94);
+ border-radius: var(--radius-panel);
+ @apply px-4 py-4;
+ }
+}
+
+@keyframes page-reveal {
+ from {
+ opacity: 0;
+ transform: translateY(8px);
+ }
+
+ to {
+ opacity: 1;
+ transform: translateY(0);
}
}
diff --git a/client/src/layouts/AppShellLayout.tsx b/client/src/layouts/AppShellLayout.tsx
index c9781dea..c0ecf43a 100644
--- a/client/src/layouts/AppShellLayout.tsx
+++ b/client/src/layouts/AppShellLayout.tsx
@@ -20,13 +20,14 @@ export function AppShellLayout() {
}, [location.pathname]);
return (
-
+
+
-
+
diff --git a/client/src/layouts/AuthLayout.tsx b/client/src/layouts/AuthLayout.tsx
index 99916169..ab73004c 100644
--- a/client/src/layouts/AuthLayout.tsx
+++ b/client/src/layouts/AuthLayout.tsx
@@ -3,27 +3,27 @@ import { AppBrand } from "../components/shell/AppBrand";
export function AuthLayout() {
return (
-
+
-
+
-
统一入口
-
让员工先找到今天要做什么
-
+
统一入口
+
让员工先找到今天要做什么
+
企业微信负责进入和提醒,真正的审批、项目、周报与留痕都在 OA 内完成。
-
主路径稳定
-
Portal、团队、请假、报销、资产、周报、待办、公告、项目保持稳定结构。
+
主路径稳定
+
Portal、团队、请假、报销、资产、周报、待办、公告、项目保持稳定结构。
-
入口可回退
-
企业微信免登失败时仍可使用账号密码,不让员工猜测下一步。
+
入口可回退
+
企业微信免登失败时仍可使用账号密码,不让员工猜测下一步。
diff --git a/client/src/pages/LoginPage.tsx b/client/src/pages/LoginPage.tsx
index cdb8cda4..e2ec7b8a 100644
--- a/client/src/pages/LoginPage.tsx
+++ b/client/src/pages/LoginPage.tsx
@@ -32,7 +32,7 @@ function noticeClasses(tone: WecomNotice["tone"]) {
if (tone === "warning") {
return "border-amber-200 bg-amber-50 text-amber-700";
}
- return "border-zinc-200 bg-zinc-50 text-zinc-700";
+ return "border-slate-200 bg-slate-50 text-slate-700";
}
export function LoginPage() {
@@ -104,11 +104,11 @@ export function LoginPage() {
function renderPasswordPanel(testId: string, primary: boolean) {
return (
-
+
-
{primary ? "推荐入口" : "回退入口"}
-
使用账号密码登录
-
+
{primary ? "推荐入口" : "回退入口"}
+
使用账号密码登录
+
{primary
? "适合桌面浏览器直接登录;若企业微信入口暂未开放,也可正常使用。"
: "企业微信免登失败、未绑定或超时时,可改用账号密码继续进入。"}
@@ -152,14 +152,14 @@ export function LoginPage() {
}
return (
-
-
-
统一入口
-
登录海音达工作台
-
+
+
+
统一入口
+
登录海音达工作台
+
企业微信负责进入与提醒,真正的审批、项目、周报和团队留痕都在海音达工作台内完成。
-
+
{isWecomContext
? "当前在企业微信中打开,推荐直接使用企业微信进入工作台;失败时可随时回退到账号密码登录。"
: "当前为浏览器场景,推荐直接使用账号密码登录;企业微信入口会作为次级入口提供。"}
@@ -176,10 +176,10 @@ export function LoginPage() {
{primaryMode === "wecom" && wecomEntry?.loginUrl ? (
-
+
推荐入口
-
使用企业微信进入工作台
-
当前是企业微信场景,优先使用免登入口;若未绑定或回调失效,仍可切换为账号密码登录。
+
使用企业微信进入工作台
+
当前是企业微信场景,优先使用免登入口;若未绑定或回调失效,仍可切换为账号密码登录。
@@ -192,10 +192,10 @@ export function LoginPage() {
)}
{((primaryMode !== "wecom" && wecomEntry?.loginUrl) || oidcProvider) ? (
-
-
补充入口
-
其他进入方式
-
入口失败时请优先选择可理解、可回退的方式继续进入。
+
+
补充入口
+
其他进入方式
+
入口失败时请优先选择可理解、可回退的方式继续进入。
{primaryMode !== "wecom" && wecomEntry?.loginUrl ? (
-
-
企业微信入口状态:{wecomStatus.label}
+
+
企业微信入口状态:{wecomStatus.label}
{wecomStatus.description}
{wecomStatus.reasonLabels.length ? (
-