From 9ce158aaa0658fee71bbfafae71d65bc75d8f9c4 Mon Sep 17 00:00:00 2001 From: ddCat <2695092045@qq.com> Date: Thu, 17 Sep 2026 21:29:35 +0800 Subject: [PATCH] =?UTF-8?q?refactor(admin):=20=E7=AE=A1=E7=90=86=E5=90=8E?= =?UTF-8?q?=E5=8F=B0=20UI=20-=20=E7=8B=AC=E7=AB=8B=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E5=B9=B6=E4=B8=8E=E7=94=A8=E6=88=B7=E7=AB=AF?= =?UTF-8?q?=E9=9A=94=E7=A6=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 把后台 token、Ant 主题、壳层控件和抽屉弹窗从用户工作台拆开,去掉树状侧栏装饰线,色板仍用原来的中性黑白台阶。 Co-authored-by: Cursor --- docs/content/docs/progress/pending-test.mdx | 9 + docs/design/admin-ui-change-log.md | 27 + docs/design/admin-ui-design-standard.md | 23 +- .../pages/admin/channels/channels-page.tsx | 2 +- .../components/access-settings-panel.tsx | 2 +- .../components/admin-announcements-panel.tsx | 4 +- .../pages/admin/components/admin-shell.tsx | 156 ++- web/src/pages/admin/components/admin-ui.tsx | 179 ++- .../components/admin-user-detail-drawer.tsx | 14 +- .../admin/components/analytics-panel.tsx | 5 +- .../components/api-log-detail-drawer.tsx | 6 +- .../admin/components/channel-model-editor.tsx | 6 +- .../components/channel-model-manager.tsx | 2 +- .../admin/components/channel-order-dialog.tsx | 4 +- .../components/credit-operations-panel.tsx | 2 +- .../admin/components/email-settings-panel.tsx | 4 +- .../components/feature-availability-panel.tsx | 2 +- .../components/redemption-codes-panel.tsx | 2 +- .../components/storage-resources-panel.tsx | 2 +- web/src/pages/admin/index.tsx | 10 +- .../logical-models/logical-models-page.tsx | 2 +- .../model-routing-capabilities.tsx | 4 +- web/src/pages/admin/logs/logs-page.tsx | 4 +- .../pages/admin/payments/payments-page.tsx | 12 +- web/src/pages/admin/plugins/plugins-page.tsx | 4 +- .../settings/appearance-settings-page.tsx | 2 +- .../ark-private-assets-settings-page.tsx | 2 +- .../settings/components/skin-theme-editor.tsx | 5 +- .../settings/components/welcome-setting.tsx | 2 +- .../admin/settings/libtv-settings-page.tsx | 2 +- .../response-interception-settings-page.tsx | 2 +- .../admin/settings/storage-settings-page.tsx | 4 +- .../storyboard-prompts-page.tsx | 14 +- web/src/pages/admin/theme/admin-ant-theme.ts | 156 +++ web/src/pages/admin/theme/admin-chrome.css | 978 ++++++++++++++ web/src/pages/admin/theme/admin-tokens.css | 144 +++ web/src/pages/admin/ui/controls.tsx | 190 +++ web/src/pages/admin/ui/overlays.tsx | 48 + web/src/pages/admin/users/users-drawer.tsx | 2 +- web/src/pages/admin/users/users-panel.tsx | 4 +- web/src/styles/admin-ui.css | 118 +- web/src/styles/globals.css | 1122 ----------------- web/test/admin-ui-regressions.test.ts | 40 + 43 files changed, 1912 insertions(+), 1410 deletions(-) create mode 100644 web/src/pages/admin/theme/admin-ant-theme.ts create mode 100644 web/src/pages/admin/theme/admin-chrome.css create mode 100644 web/src/pages/admin/theme/admin-tokens.css create mode 100644 web/src/pages/admin/ui/controls.tsx create mode 100644 web/src/pages/admin/ui/overlays.tsx diff --git a/docs/content/docs/progress/pending-test.mdx b/docs/content/docs/progress/pending-test.mdx index 588ccdd1d..884000ab6 100644 --- a/docs/content/docs/progress/pending-test.mdx +++ b/docs/content/docs/progress/pending-test.mdx @@ -5,6 +5,15 @@ description: 当前项目已实现功能的手工验证清单与未确认边界 # 待测试 +## 管理后台独立设计系统(2026-09-17) + +管理后台改为独立 token / Ant 主题 / 壳层控件,不再消费用户端皮肤和 `WorkspacePage`。待管理员登录后核对: + +- [ ] `/admin/settings/features`:命令条不再是玻璃大卡,功能域是紧凑分组表,开关立即保存逻辑不变。 +- [ ] `/admin/users` 与 `/admin`:侧栏无树状分组线、无选中描边和左侧指示条;表格、分页与用户工作台视觉隔离;用户首页/作品库样式未被带动。颜色回到原来的中性黑白台阶,不是冷蓝灰。 +- [ ] 亮/暗切换只改变后台冷灰台阶,不套用当前产品皮肤的圆角、主色或动效。 +- [ ] 抽屉、下拉、确认框仍可操作;关闭积分/前台模型仍有确认。用户详情、支付订单、提示词版本、模型编辑器不再使用产品 `AppDrawer`/`AppModal`。 + ## 模型选择器、画布摘要与首页视频入库 - 全站 `ModelPicker` 统一为先选品牌、再选模型的左右二级菜单(左品牌轨 + 右模型列表),含 Agent 对话、审批卡、章节提取、分镜脚本节点、项目设置。窗口窄于 720px 时才收成单栏。 diff --git a/docs/design/admin-ui-change-log.md b/docs/design/admin-ui-change-log.md index a664da92a..dd422ef1e 100644 --- a/docs/design/admin-ui-change-log.md +++ b/docs/design/admin-ui-change-log.md @@ -1191,3 +1191,30 @@ - 集成验证:隔离迁移正常退出,schema current/expected 6/6,公开主题可从 schema 5 配置读取并投影为 schema 6;既有 appearance 数据摘要保持不变。首页、注册、登录、找回密码、后台深链、liveness、readiness、公开外观与版本接口均通过,未登录管理员外观 API 返回 401。生产构建产物已确认包含 `.admin-shell .app-workspace-nav-link{border-radius:var(--menu-radius)}` 与“后台菜单”预览。 - 浏览器验收:1440×900、1280×800、430×932、390×844 均无横向溢出、无可见内置品牌或仓库名残留,首屏直接显示当前自定义品牌。测试会话无管理员登录态,因此真实主题增删改保存、危险按钮/开关各状态和后台菜单圆角的登录后截图仍留作人工验收,不伪造账户或运营数据。 - 回滚与残余风险:本批不增加关系型数据库迁移;源码回滚应成对恢复 schema v6 新增颜色字段、前后端兼容补全、Ant/CSS 映射、编辑器和测试。回滚前先备份当前 appearance JSON,避免丢失管理员在 schema v6 下保存的主题状态色。`project-memory/` 继续 Git 忽略且不进入 Git。 + +## 批次 138:管理后台独立设计系统与用户端隔离 + +- 日期时间:2026-09-17 20:45 CST +- 目的:把管理后台从用户工作台的皮肤、token、Ant 主题和共享控件中拆出来,用一套高密度运营台规范覆盖全部后台页面,而不是继续给每个入口打补丁。 +- 隔离:新增 `pages/admin/theme/admin-tokens.css`、`admin-chrome.css`、`admin-ant-theme.ts` 与 `pages/admin/ui/controls.tsx`。壳层挂 `data-admin-root`,浮层走 `body.admin-overlays`。后台不再调用 `getAdminAntThemeConfig`、`WorkspacePage`、用户端 `Switch/Select/Checkbox/Tooltip/StatusBadge/EmptyState`。`globals.css` 中约 1100 行管理端规则已删除。 +- 视觉:冷灰表面台阶、发丝线、32px 控件、40px 表行;命令条统一为页头下粘性条,设置卡与功能开放域共用同一分组卡,不做玻璃拟态或逐页皮肤。 +- 验证:后台回归测试覆盖隔离合同;`tsc` 中本批管理端文件无新增错误。用户端组件未被改样式。登录态浏览器验收见 pending-test。 +- 逐项回滚:恢复本批新增的 `pages/admin/theme/`、`pages/admin/ui/controls.tsx`,以及 `admin-shell.tsx`、`admin-ui.tsx`、`globals.css`、`admin-ui.css` 和各页面 import 改写。 + +## 批次 139:管理端抽屉/弹窗脱离产品壳 + +- 日期时间:2026-09-17 20:50 CST +- 目的:后台浮层不再复用用户端 `AppDrawer` / `AppModal`,避免产品弹窗内边距和外壳样式渗进运营台。 +- 涉及文件:`web/src/pages/admin/ui/overlays.tsx`(新增)、用户详情抽屉、提示词模板页、支付页、渠道模型编辑器、`admin-chrome.css`。 +- 具体改动:新增 `AdminDrawer` / `AdminModal`,强制挂 `admin-drawer` / `admin-modal-root`;浮层表面、标题和分隔线走 `--admin-*`。 +- 验证:后台回归测试覆盖不再引用产品壳;浏览器用独立预览核对照片密度与用户登录页隔离。 +- 逐项回滚:删除 `overlays.tsx` 并把四处调用改回产品壳即可。 + +## 批次 140:侧栏去掉树状线并恢复原中性色 + +- 日期时间:2026-09-17 21:20 CST +- 目的:上一批把后台换成冷蓝灰,但树状分组线、选中描边和左侧指示条还在。按反馈恢复原来的黑白后台色,并真正拆掉那些装饰线。 +- 涉及文件:`admin-tokens.css`、`admin-ant-theme.ts`、`admin-chrome.css`、`admin-ui.css`、设计规范。 +- 具体改动:暗色回到 `#0f0f0f / #181818`,亮色回到 `#f5f5f5 / #ffffff`,仍写死在后台 token 里不读皮肤。分组标题取消圆点与渐隐短线;组内取消竖向连接线和缩进;当前页只保留底色,不再加描边和左侧指示条。 +- 验证:回归测试更新隔离色值与“无树状线”断言。 +- 逐项回滚:恢复本批上述文件即可。 diff --git a/docs/design/admin-ui-design-standard.md b/docs/design/admin-ui-design-standard.md index 4ac5cd37e..cb45da701 100644 --- a/docs/design/admin-ui-design-standard.md +++ b/docs/design/admin-ui-design-standard.md @@ -1,20 +1,27 @@ # 管理后台 UI 与布局规范 -本规范仅约束 `web/src/pages/admin/` 及对应的 `.admin-*` 样式,目标是在不改变业务流程、权限与 API 合同的前提下,统一管理界面的信息层级、密度、响应式行为和可访问性。 +本规范只约束 `web/src/pages/admin/` 及其专用样式。管理后台是运营控制台,不是创作工作台;视觉、组件和 token 必须与用户端隔离。改用户端不得影响后台,改后台也不得改用户端组件。 + +## 0. 隔离合同 + +- Token 源:`web/src/pages/admin/theme/admin-tokens.css`。只在 `[data-admin-root]`、`body.admin-overlays` 和 `.admin-drawer/.admin-modal-root` 内生效。 +- 控件主题:`getIsolatedAdminAntTheme()`。不读取产品皮肤、不复用 `getAntThemeConfig()`。 +- 壳层与控件:`admin-shell`、`admin-ui`、`pages/admin/ui/controls.tsx`、`pages/admin/ui/overlays.tsx`。不得再引用 `WorkspacePage`、`StatusBadge`、`EmptyState`、用户端 `Switch/Select/Checkbox/Tooltip`、`AppDrawer`、`AppModal`。 +- `globals.css` 与用户皮肤变量不得再承载后台视觉。后台可在自己的根节点上覆盖 `--workspace-*` 作为防火墙,但后台颜色的真值必须是 `--admin-*`。 +- 动效:只保留 120ms 颜色过渡,不做页面进入位移、主题圆形揭示或卡片抬升。尊重 `prefers-reduced-motion`。 ## 1. 视觉基线 -- 颜色:继续使用 `globals.css` 的 Primitive → Semantic → Component 三层 token。管理端组件优先引用 `--admin-*`,不在页面内新增亮暗主题颜色字面值。 -- 表面:页面与 PC 侧栏共用 `--admin-layer-0` 作为连续底色,表格、卡片、表单主体及当前导航项使用 `--admin-layer-1`,表头、摘要区、分页与输入底色使用 `--admin-layer-2`,强调表面使用 `--admin-layer-3`;区域关系通过细分隔线、选中表面和间距表达,不用大块异色把侧栏与内容割裂。亮暗主题均需保持相邻层级可见,不允许页面和卡片使用难以分辨的同色表面。 -- 文字:标题、正文、辅助信息分别使用 `--admin-text-primary`、`--admin-text-secondary`、`--admin-text-muted`;不以低于辅助色的透明度承载必要信息。 -- 浮层提示:侧栏图标、纯图标按钮等 Tooltip 必须同时声明主题背景、边框、箭头和文字色,不能只覆盖浮层背景而继续继承另一主题的文字 token。普通后台提示跟随当前主题;收起侧栏的图标提示与普通用户工作台复用同一高对比浮层类,亮色界面使用深底白字,暗色界面使用浅底深字,字号不低于 13px/650。侧栏提示尺寸必须由文字内容驱动,短文案自动收紧、长文案自然扩展,只在超过 220px 或视口安全宽度时换行;不得用固定宽高制造大面积空白,必要提示不得出现深底黑字或浅底白字。 -- 密度:桌面端表格保持 42px 表头、52px 基础行高;主操作可点区不小于 32px,移动端主要导航可点区不小于 40px。 -- 圆角与阴影:小控件使用 6–8px,主容器使用 10–12px;常态信息层级以底色和分隔线表达,不堆叠阴影。 +- 字体:系统无衬线栈(SF Pro / PingFang / Noto Sans),不用用户端 Inter Variable。 +- 颜色:沿用后台原有中性黑白台阶,不跟产品皮肤走,也不另造冷蓝灰。亮色画布/侧栏 `#f5f5f5`、表面 `#ffffff`。暗色画布/侧栏 `#0f0f0f`、表面 `#181818`。主按钮用墨色/浅字,开关开启用成功绿。 +- 密度:控件高 32px,表头 36px,数据行 40px,侧栏展开 224px / 收起 64px。间距走 8px 网格。 +- 圆角:控件 6px,卡片 8px。层级靠表面台阶和 1px 发丝线,不堆阴影。 +- 页面只有三种骨架:列表(页头 + 工具栏 + 表 + 分页)、设置(页头 + 命令条 + 分组卡)、概览(页头 + 指标 + 图表/表)。禁止为单个入口另造视觉语言。 ## 2. 布局规则 - 大屏(≥1024px):保留可折叠侧栏;内容区使用弹性高度,表格自身滚动,页面标题和分页保持稳定。 -- PC 侧栏:与页面使用同一基底,右侧细线界定导航区域;分组标题采用“节点 + 标题 + 渐隐短线”的树状分组头,组内入口向右内缩,并用与标题节点对齐的低对比竖线连接。分组标题使用 12px/700,普通入口使用不低于 13px/500 和约 82% 前景色,不能因追求弱化而损失可读性。当前页面所属分组增强标题和节点;当前入口必须同时使用强调表面、至少 26% 前景色边框、较粗文字和左侧位置指示,确保亮暗主题与页面缩放下均能快速识别,不能只依赖轻微底色差。悬停项提升一个可见层级。顶部身份区使用单个可点击品牌信息块承载更新日志入口:展开态为左侧自适应品牌图标,右侧第一行品牌名“影策”、第二行当前版本号;点击整个信息块只打开更新日志弹窗,不执行页面导航。收起态仅保留水平居中的品牌图标,点击行为不变,并提供明确提示。底部辅助区只保留返回创作台等跨工作区动作,用分隔线与主导航区分,不额外引入整块背景;“返回创作台”固定进入 `/home`,并与普通用户端“管理员后台”使用相同的 34px 行高、图标尺寸和折叠提示。展开态宽 224px,收纳态宽 64px并保留品牌、导航和底部操作图标;展开/收纳入口放在侧栏与内容区之间的垂直中部边缘,不占用顶部品牌区。边缘把手必须用不透明侧栏表面和外围遮罩完整切断分界线,禁止线条从控件内部穿过;使用简洁左右方向箭头,默认融入边界,仅在悬停和聚焦时提升对比,并提供提示、`aria-label`、焦点反馈和与普通用户工作台即时同步的本地状态记忆。前后台展开宽度、折叠宽度和 PC 外壳外侧留白必须一致,往返页面不得发生 12px 内容宽度跳变。 +- PC 侧栏:与页面使用同一基底,右侧细线界定导航区域。分组标题只保留 11px 弱化文字,禁止节点、渐隐短线和组内竖向连接线。组内入口不缩进。当前入口只用强调底色和较粗文字,不加描边、不加左侧指示条。悬停项提升一个可见底色层级。顶部身份区使用单个可点击品牌信息块承载更新日志入口:展开态为左侧自适应品牌图标,右侧第一行品牌名“影策”、第二行当前版本号;点击整个信息块只打开更新日志弹窗,不执行页面导航。收起态仅保留水平居中的品牌图标,点击行为不变,并提供明确提示。底部辅助区只保留返回创作台等跨工作区动作,用分隔线与主导航区分,不额外引入整块背景;“返回创作台”固定进入 `/home`。展开态宽 224px,收纳态宽 64px并保留品牌、导航和底部操作图标;展开/收纳入口放在侧栏与内容区之间的垂直中部边缘,不占用顶部品牌区。边缘把手必须用不透明侧栏表面和外围遮罩完整切断分界线,禁止线条从控件内部穿过;使用简洁左右方向箭头,默认融入边界,仅在悬停和聚焦时提升对比,并提供提示、`aria-label`、焦点反馈和与普通用户工作台即时同步的本地状态记忆。前后台展开宽度、折叠宽度和 PC 外壳外侧留白必须一致,往返页面不得发生 12px 内容宽度跳变。 - PC 后台主题入口:每个页面标题栏右上角必须提供独立明暗主题切换,不要求返回创作台;使用纯图标按钮、明确的 `aria-label` 和悬停提示,并与页面业务操作保持 8px 间距。 - 数据概览:定位为“运营健康驾驶舱”,首屏必须依次回答当前健康度、变化趋势和待处理事项,不能只是指标卡与大图表的纵向堆叠。工具栏优先提供 7 天、30 天、本月快捷范围和明确日期范围,用户、模型、渠道、能力等低频条件收进可展开筛选;刷新与导出保持在右侧。健康指标固定归纳为用户活跃、生成任务、服务质量和估算费用四域,队列、上游请求、P95 等从属信息进入对应指标卡,禁止在下一行重复展示;日变化必须写明“较前一日”,费用不可估算时明确提示价格未完整配置,不显示含义不明的 `--`。趋势区只在“用量 / 质量 / 活跃”三类中切换显示相关曲线,避免双坐标和多条曲线同时争夺注意力,高度控制在约 `280px`。CSS 视口达到 `1280px` 时趋势与“需要关注”按约 2:0.82 双列排列,关注区提前展示异常请求、排队任务和费用覆盖,并可跳转到对应分析或配置;更窄 PC 自动纵向排列。下方深度分析只保留模型、用户和异常三类读操作,模型价格作为独立配置入口进入抽屉,不与分析标签混排。所有筛选、导出、价格 CRUD、分页、接口和原始统计口径保持兼容。 - 中小屏(<1024px):不将全部导航项平铺成长横向列表;始终显示当前页面,完整导航通过分组菜单打开。 diff --git a/web/src/pages/admin/channels/channels-page.tsx b/web/src/pages/admin/channels/channels-page.tsx index d263d5b4c..b2f4ee9fd 100644 --- a/web/src/pages/admin/channels/channels-page.tsx +++ b/web/src/pages/admin/channels/channels-page.tsx @@ -6,7 +6,7 @@ import { useEffect, useRef, useState } from "react"; import { useSearchParams } from "react-router"; import { ChannelHeadersEditor, validateChannelHeaders } from "@/components/channel-headers-editor"; -import { PaginationBar } from "@/components/layout/workspace-page"; +import { PaginationBar } from "@/pages/admin/components/admin-ui"; import { useDebouncedValue } from "@/hooks/use-debounced-value"; import { refreshSystemChannels } from "@/lib/user-session"; import { createAdminChannel, deleteAdminChannel, duplicateAdminChannel, listAdminChannels, updateAdminChannel } from "@/services/api/auth"; diff --git a/web/src/pages/admin/components/access-settings-panel.tsx b/web/src/pages/admin/components/access-settings-panel.tsx index d47604f4b..3c3dea9ff 100644 --- a/web/src/pages/admin/components/access-settings-panel.tsx +++ b/web/src/pages/admin/components/access-settings-panel.tsx @@ -1,5 +1,5 @@ import { App, Button, Form, Input, Select, Skeleton } from "antd"; -import { Switch } from "@/components/ui/base/switch"; +import { Switch } from "@/pages/admin/ui/controls"; import { AlertTriangle, BadgeCheck, ChevronDown, Globe2, KeyRound, LockKeyhole, RefreshCw, RotateCcw, Save, ShieldCheck, UserPlus, UsersRound } from "lucide-react"; import { useCallback, useEffect, useRef, useState, type ReactNode } from "react"; import { useBlocker } from "react-router"; diff --git a/web/src/pages/admin/components/admin-announcements-panel.tsx b/web/src/pages/admin/components/admin-announcements-panel.tsx index ad05886cf..05f7021d1 100644 --- a/web/src/pages/admin/components/admin-announcements-panel.tsx +++ b/web/src/pages/admin/components/admin-announcements-panel.tsx @@ -1,11 +1,11 @@ import { useEffect, useRef, useState, type ChangeEvent } from "react"; import { App, Button, Form, Input, Modal, Select } from "antd"; -import { Switch } from "@/components/ui/base/switch"; +import { Switch } from "@/pages/admin/ui/controls"; import type { InputRef } from "antd"; import type { ColumnsType } from "antd/es/table"; import { PencilLine, Pin, Plus, RefreshCw, Search, Send, Upload, X } from "lucide-react"; -import { PaginationBar } from "@/components/layout/workspace-page"; +import { PaginationBar } from "@/pages/admin/components/admin-ui"; import { AnnouncementContent } from "@/components/ui/announcement-content"; import { useDebouncedValue } from "@/hooks/use-debounced-value"; import { ApiError } from "@/services/api/request"; diff --git a/web/src/pages/admin/components/admin-shell.tsx b/web/src/pages/admin/components/admin-shell.tsx index 08ac736cd..40a95c127 100644 --- a/web/src/pages/admin/components/admin-shell.tsx +++ b/web/src/pages/admin/components/admin-shell.tsx @@ -1,5 +1,4 @@ -import { ConfigProvider, Dropdown } from "antd"; -import { Tooltip } from "@/components/ui/base/tooltip"; +import { App, ConfigProvider, Dropdown } from "antd"; import type { MenuProps } from "antd"; import { Activity, @@ -41,14 +40,16 @@ import { Link, NavLink, Outlet, useLocation } from "react-router"; import { AppChangelogButton } from "@/components/layout/app-changelog-modal"; import { BrandLogoFrame } from "@/components/brand/brand-logo"; -import { WorkspacePage } from "@/components/layout/workspace-page"; import { publishWorkspaceSidebarCollapsed, readWorkspaceSidebarCollapsed, subscribeWorkspaceSidebarCollapsed } from "@/components/layout/workspace-sidebar-state"; -import { getAdminAntThemeConfig } from "@/lib/app-theme"; import { cn } from "@/lib/utils"; -import "@/styles/admin-ui.css"; import { useThemeStore } from "@/stores/use-theme-store"; import { useUserStore } from "@/stores/use-user-store"; import { useAppearanceStore } from "@/stores/use-appearance-store"; +import { getIsolatedAdminAntTheme } from "../theme/admin-ant-theme"; +import { AdminTooltip } from "../ui/controls"; +import "@/styles/admin-ui.css"; +import "../theme/admin-tokens.css"; +import "../theme/admin-chrome.css"; type AdminNavigationItem = { path: string; @@ -111,6 +112,10 @@ function isAdminNavigationPath(pathname: string, navigationPath: string) { return pathname === navigationPath || pathname.startsWith(`${navigationPath}/`); } +function adminPopupContainer(node?: HTMLElement) { + return document.getElementById("admin-root") || node?.closest("[data-admin-root]") || document.body; +} + export function AdminShell() { const appearance = useAppearanceStore((state) => state.appearance); const [collapsed, setCollapsed] = useState(readWorkspaceSidebarCollapsed); @@ -132,54 +137,52 @@ export function AdminShell() { }; return ( - -
- - - - -
- - - 正在加载管理页面… - - } - > - - -
-
+ adminPopupContainer(node)}> + +
+ + + + +
+ + + 正在加载管理页面… + + } + > + + +
+
+
); } @@ -192,16 +195,16 @@ export function AdminPageFrame({ title, description, actions, back, scroll = fal const sectionPath = back ? (currentItem?.path ?? currentSection?.items[0]?.path ?? "/admin") : (currentSection?.items[0]?.path ?? "/admin"); return ( - +
-
+
{back ? ( - - - + ) : null}
{description ?

{description}

: null}
-
+
{actions}
{children}
- +
); } @@ -233,11 +236,11 @@ function AdminThemeButton() { const dark = theme === "dark"; return ( - - - + ); } @@ -263,7 +266,7 @@ function MobileAdminNavigation() { })); return ( -