From 9badd3597fd7d09ee91c7328d7ed5cd7bd21f348 Mon Sep 17 00:00:00 2001 From: "tao.chen" <93983997+taochen-ct@users.noreply.github.com> Date: Fri, 28 Aug 2026 12:00:14 +0800 Subject: [PATCH] update: style --- frontend/app/app.css | 79 +++++-------------- .../app/components/common/AppFormDialog.tsx | 13 +-- .../app/components/common/ConfirmDialog.tsx | 3 +- frontend/app/components/common/Topbar.tsx | 8 +- .../app/components/common/buttonClasses.ts | 12 +++ frontend/app/features/admin/DashboardPage.tsx | 14 ++-- .../app/features/admin/ImportMemberDialog.tsx | 2 +- .../app/features/admin/ProjectEditDialog.tsx | 10 +-- .../features/admin/ProjectManagementPage.tsx | 21 +++-- .../features/admin/ProjectMembersDrawer.tsx | 3 +- .../app/features/admin/RoleEditDialog.tsx | 6 +- .../app/features/admin/RoleManagementPage.tsx | 20 +++-- .../app/features/admin/UserManagementPage.tsx | 30 +++---- frontend/app/features/admin/adminUi.ts | 4 +- .../features/platform/CreateFolderModal.tsx | 6 +- .../features/platform/CreateScriptModal.tsx | 8 +- .../platform/DataResourceUploadModal.tsx | 6 +- .../app/features/platform/PublishModal.tsx | 6 +- .../app/features/platform/PythonEditor.tsx | 8 +- .../app/features/platform/ScriptExplorer.tsx | 6 +- .../app/features/platform/ScriptWorkspace.tsx | 25 +++--- .../app/features/platform/ScriptsPage.tsx | 2 +- .../app/features/platform/TreeContextMenu.tsx | 4 +- .../features/platform/VersionReceiptModal.tsx | 2 +- .../app/features/platform/WelcomePanel.tsx | 2 +- .../app/features/platform/WorkspaceTree.tsx | 2 +- frontend/app/features/platform/modalUi.ts | 15 ++-- .../app/features/schedules/ArtifactList.tsx | 8 +- .../app/features/schedules/NodeInspector.tsx | 36 ++++----- .../app/features/schedules/RunHistory.tsx | 16 ++-- .../features/schedules/ScheduleInspector.tsx | 34 ++++---- .../app/features/schedules/ScheduleList.tsx | 4 +- .../app/features/schedules/SchedulePage.tsx | 23 +++--- frontend/app/routes/login.tsx | 6 +- 34 files changed, 207 insertions(+), 237 deletions(-) create mode 100644 frontend/app/components/common/buttonClasses.ts diff --git a/frontend/app/app.css b/frontend/app/app.css index 0bcef87..c3f6cfa 100644 --- a/frontend/app/app.css +++ b/frontend/app/app.css @@ -3,9 +3,18 @@ @theme { --font-sans: Inter, "PingFang SC", "Microsoft YaHei", system-ui, sans-serif; + /* STYLE_GUIDE §3.2 字号补充 token */ + --text-2xs: 0.625rem; /* 10px */ + --text-3xs: 0.5625rem; /* 9px */ + --text-4xs: 0.5rem; /* 8px */ + + /* STYLE_GUIDE §3.3 字重补充 token */ + --font-weight-medium-plus: 650; + --color-brand: #1978d4; --color-brand-strong: #0e5fb9; --color-brand-soft: #edf6ff; + --color-brand-deep: #0e5bad; --color-success: #18b979; --color-success-strong: #0f7d55; @@ -21,6 +30,7 @@ --color-ink: #27394d; --color-ink-muted: #5d7186; --color-ink-subtle: #8b99a8; + --color-ink-caption: #748598; --color-line: #dce4ec; --color-line-soft: #edf1f5; @@ -29,6 +39,13 @@ --color-bg-panel: #ffffff; --color-bg-canvas: #f9fbfd; --color-bg-log: #17212b; + + /* STYLE_GUIDE §4.2 间距补充 token */ + --spacing-page-x: 22px; + --spacing-button-x: 15px; + --spacing-gap-icon: 7px; + --spacing-gap-sm: 5px; + --spacing-gap-md: 9px; } @theme inline { --color-sidebar: var(--sidebar-background); @@ -256,19 +273,13 @@ } } -@keyframes spin { - to { - transform: rotate(360deg); - } -} - /* Shared UI classes still used by admin / schedules pages */ .icon-button { display: grid; width: 34px; height: 34px; place-items: center; - border: 1px solid #dfe6ed; + border: 1px solid var(--color-line); border-radius: 7px; background: #fff; cursor: pointer; @@ -289,58 +300,4 @@ background: linear-gradient(145deg, #3b92ed, #1869c9); font-size: 14px; font-weight: 700; -} - -.primary-button, -.secondary-button { - display: inline-flex; - align-items: center; - justify-content: center; - gap: 7px; - border-radius: 6px; - cursor: pointer; - font-weight: 650; -} - -.primary-button { - min-height: 37px; - padding: 0 15px; - border: 1px solid #126ac3; - color: #fff; - background: linear-gradient(135deg, #1881e7, #1268c9); - box-shadow: 0 6px 15px rgb(20 111 202 / 18%); - font-size: 12px; -} - -.primary-button:hover:not(:disabled) { - background: linear-gradient(135deg, #1175d8, #0e5bad); -} - -.primary-button:disabled { - cursor: not-allowed; - opacity: 0.58; -} - -.secondary-button { - min-height: 37px; - padding: 0 15px; - border: 1px solid #d8e1e9; - color: #56687c; - background: #fff; - font-size: 12px; -} - -.button-spinner { - width: 13px; - height: 13px; - border: 2px solid rgb(255 255 255 / 45%); - border-top-color: #fff; - border-radius: 50%; - animation: spin 0.7s linear infinite; -} - -.button-spinner.button-spinner--blue, -.button-spinner--blue { - border-color: rgb(34 121 199 / 22%); - border-top-color: #2279c7; } \ No newline at end of file diff --git a/frontend/app/components/common/AppFormDialog.tsx b/frontend/app/components/common/AppFormDialog.tsx index 4bb7312..4b4a7c6 100644 --- a/frontend/app/components/common/AppFormDialog.tsx +++ b/frontend/app/components/common/AppFormDialog.tsx @@ -9,13 +9,14 @@ import { } from "~/components/ui/dialog" import { cn } from "~/lib/utils" +import { primaryGradientButtonClass } from "./buttonClasses" + /** 与系统管理弹窗 footer 一致的次要按钮样式 */ export const dialogSecondaryButtonClass = "h-[37px] gap-[7px] rounded-md border-[#d8e1e9] bg-white px-[15px] text-xs font-[650] text-[#56687c]" -/** 与系统管理弹窗 footer 一致的主按钮样式 */ -export const dialogPrimaryButtonClass = - "h-[37px] gap-[7px] rounded-md border border-[#126ac3] bg-gradient-to-br from-[#1881e7] to-[#1268c9] px-[15px] text-xs font-[650] text-white shadow-[0_6px_15px_rgb(20_111_202/18%)] enabled:hover:from-[#1175d8] enabled:hover:to-[#0e5bad]" +/** 与系统管理弹窗 footer 一致的主按钮样式(STYLE_GUIDE §2.2 官方渐变) */ +export const dialogPrimaryButtonClass = primaryGradientButtonClass const EYEBROW_CLASS = "text-[9px] font-extrabold tracking-[0.12em] text-[#2d82d4]" @@ -59,13 +60,13 @@ function AppFormDialog({ {eyebrow || title ? ( - + {eyebrow ? {eyebrow} : null} {title ? ( @@ -78,7 +79,7 @@ function AppFormDialog({ {children} {footer ? ( - + {footer} ) : null} diff --git a/frontend/app/components/common/ConfirmDialog.tsx b/frontend/app/components/common/ConfirmDialog.tsx index a9791ea..b568603 100644 --- a/frontend/app/components/common/ConfirmDialog.tsx +++ b/frontend/app/components/common/ConfirmDialog.tsx @@ -14,6 +14,7 @@ import { dialogPrimaryButtonClass, dialogSecondaryButtonClass, } from "./AppFormDialog" +import { dangerSolidButtonClass } from "./buttonClasses" type ConfirmDialogProps = { open: boolean @@ -58,7 +59,7 @@ function ConfirmDialog({ size="sm" className={cn( destructive - ? "h-[37px] gap-[7px] rounded-md border-0 bg-[#d75b5b] px-[15px] text-xs font-[650] text-white hover:bg-[#a94f4f]" + ? dangerSolidButtonClass : dialogPrimaryButtonClass, )} onClick={() => void onConfirm()} diff --git a/frontend/app/components/common/Topbar.tsx b/frontend/app/components/common/Topbar.tsx index 2c536c8..e04338a 100644 --- a/frontend/app/components/common/Topbar.tsx +++ b/frontend/app/components/common/Topbar.tsx @@ -54,15 +54,15 @@ export function Topbar({ {apiOnline ? "服务已连接" : "服务未连接"}
{workspaceMenuOpen && ( -
+
{workspaces.map((workspace) => { const isSelected = workspace.workspace_id === currentWorkspace.workspace_id; diff --git a/frontend/app/components/common/buttonClasses.ts b/frontend/app/components/common/buttonClasses.ts new file mode 100644 index 0000000..98f9788 --- /dev/null +++ b/frontend/app/components/common/buttonClasses.ts @@ -0,0 +1,12 @@ +/** + * STYLE_GUIDE §2.2 官方按钮类。 + * 收敛自 modalUi.primaryButtonClass / AppFormDialog.dialogPrimaryButtonClass / + * admin 三页 PRIMARY_BUTTON_CLASS 的重复定义,色值统一走 @theme token。 + */ + +export const primaryGradientButtonClass = + "inline-flex min-h-[37px] cursor-pointer items-center justify-center gap-gap-icon rounded-md border border-brand bg-gradient-to-br from-brand to-brand-deep px-button-x text-xs font-medium-plus text-white shadow-md enabled:hover:from-brand-strong enabled:hover:to-brand-deep disabled:cursor-not-allowed disabled:opacity-[0.58]"; + +/** 危险确认按钮(ConfirmDialog destructive 态),token 化自原 bg-[#d75b5b] 写法 */ +export const dangerSolidButtonClass = + "inline-flex min-h-[37px] cursor-pointer items-center justify-center gap-gap-icon rounded-md border-0 bg-danger px-button-x text-xs font-medium-plus text-white enabled:hover:bg-danger-strong disabled:cursor-not-allowed disabled:opacity-[0.58]"; diff --git a/frontend/app/features/admin/DashboardPage.tsx b/frontend/app/features/admin/DashboardPage.tsx index 45286a5..34d03d8 100644 --- a/frontend/app/features/admin/DashboardPage.tsx +++ b/frontend/app/features/admin/DashboardPage.tsx @@ -38,7 +38,7 @@ export function DashboardPage({ return (
-
+
MODEL DEVELOPMENT PLATFORM @@ -78,7 +78,7 @@ export function DashboardPage({ {item.value} - {item.label} + {item.label} ))} @@ -114,7 +114,7 @@ export function DashboardPage({
-
+
@@ -136,7 +136,7 @@ export function DashboardPage({ {Math.round(value / 7)} @@ -157,7 +157,7 @@ export function DashboardPage({
-
+
@@ -170,7 +170,7 @@ export function DashboardPage({
{scriptCount} - 全部脚本 + 全部脚本
@@ -206,7 +206,7 @@ export function DashboardPage({
-
+
diff --git a/frontend/app/features/admin/ImportMemberDialog.tsx b/frontend/app/features/admin/ImportMemberDialog.tsx index bdf38d7..8ada20d 100644 --- a/frontend/app/features/admin/ImportMemberDialog.tsx +++ b/frontend/app/features/admin/ImportMemberDialog.tsx @@ -67,7 +67,7 @@ export function ImportMemberDialog({ >