diff --git a/frontend-web/src/components/workspace/appearance-controls.tsx b/frontend-web/src/components/workspace/appearance-controls.tsx index 8decbe91..02efa7c8 100644 --- a/frontend-web/src/components/workspace/appearance-controls.tsx +++ b/frontend-web/src/components/workspace/appearance-controls.tsx @@ -126,13 +126,21 @@ const LAYOUT_OPTIONS = [ ]; /** - * 界面模式(全量 / 简洁)下拉切换。简洁模式下全局顶栏被隐藏,故把外观设置里的 - * 「界面模式」切换也搬到页面级顶栏右上角,图标 + 下拉,与换肤并排。 + * 界面模式(全量 / 简洁)下拉切换。换肤旁并排,图标 + 下拉: + * - 简洁模式 ChatPage 顶栏(全局顶栏被隐藏)。 + * - 全量模式 Header 右上角。 + * 用户未显式设置过界面模式时(mode === undefined),当前态按调用方所在的实际界面 + * 兜底——`fallback` 指明这一回退值(Header 传 "full",ChatPage 传 "compact")。 */ -export function LayoutModeSwitcher({ tone }: { tone: AppearanceControlTone }) { +export function LayoutModeSwitcher({ + tone, + fallback = "compact", +}: { + tone: AppearanceControlTone; + fallback?: "full" | "compact"; +}) { const [mode, setLayoutMode] = useLayoutMode(); - // 未显式设置过时简洁模式才会渲染本控件(全量模式有全局顶栏),故当前态按 compact 兜底。 - const current = mode === "full" ? "full" : "compact"; + const current = mode ?? fallback; const TriggerIcon = current === "full" ? PanelLeftIcon : LayoutIcon; return ( diff --git a/frontend-web/src/strategy-components/Header.tsx b/frontend-web/src/strategy-components/Header.tsx index 57d7480e..0bcb8334 100644 --- a/frontend-web/src/strategy-components/Header.tsx +++ b/frontend-web/src/strategy-components/Header.tsx @@ -4,7 +4,7 @@ import { useLocation, useNavigate } from "react-router-dom"; import { Button } from "@/components/ui/button"; import "@/components/page-sdebar.css"; -import { ThemeSwitcher } from "@/components/workspace/appearance-controls"; +import { LayoutModeSwitcher, ThemeSwitcher } from "@/components/workspace/appearance-controls"; import { NotificationDialog } from "@/components/workspace/notification-dialog"; import { getStoredAuth, getAccountDisplayName } from "@/core/auth"; import { isWujieEnv } from "@/core/embed/wujie"; @@ -126,6 +126,11 @@ const Header = ({ collapsed }: HeaderProps) => { <> + +