refactor: release v1.0.5 安全精简与网站发布
web-platform-ci / Standalone decision service (no cloud credentials) (push) Has been cancelled
web-platform-ci / TypeScript, lint, unit, build (push) Has been cancelled
web-platform-ci / Playwright E2E (push) Has been cancelled
lekiwi-compatibility / cpu-compatibility (push) Has been cancelled
web-platform-ci / Standalone decision service (no cloud credentials) (pull_request) Has been cancelled
web-platform-ci / TypeScript, lint, unit, build (pull_request) Has been cancelled
web-platform-ci / Playwright E2E (pull_request) Has been cancelled
lekiwi-compatibility / cpu-compatibility (pull_request) Has been cancelled

This commit is contained in:
2026-09-29 09:55:08 +08:00
parent 7ebe9092ba
commit 26bb5634bd
64 changed files with 9048 additions and 3688 deletions
@@ -0,0 +1,113 @@
import { useEffect, useState, type RefObject } from 'react';
import {
DEFAULT_VIEWER_DISPLAY_OPTIONS,
type ViewerDisplayOptions,
} from '../../viewer/displayOptions';
import { dispatchLayoutWidths, type LayoutPreset } from '../components/LayoutSettingsDialog';
import type { WorkspaceTool } from '../components/WorkspaceToolsPanel';
import { useSidebarLayout } from './useSidebarLayout';
import { useThemePreference } from './useThemePreference';
function initialDisplayOptions(): ViewerDisplayOptions {
try {
const stored = JSON.parse(
localStorage.getItem('mujoco-platform-display') ?? 'null',
) as Partial<ViewerDisplayOptions> | null;
if (!stored) return { ...DEFAULT_VIEWER_DISPLAY_OPTIONS };
const next = { ...DEFAULT_VIEWER_DISPLAY_OPTIONS };
for (const key of Object.keys(next) as (keyof ViewerDisplayOptions)[])
if (typeof stored[key] === 'boolean') next[key] = stored[key];
return next;
} catch {
return { ...DEFAULT_VIEWER_DISPLAY_OPTIONS };
}
}
/** 仅持有工作台界面状态;不加载模型、不创建 Viewer、不持有物理时钟。 */
export function useWorkbenchChrome(root: RefObject<HTMLDivElement | null>) {
const sidebars = useSidebarLayout();
const { setLeftOpen, setRightOpen } = sidebars;
const [theme, setTheme] = useThemePreference();
const [forceScale, setForceScale] = useState(50),
[helpOpen, setHelpOpen] = useState(false),
[commandOpen, setCommandOpen] = useState(false),
[sourceOpen, setSourceOpen] = useState(false),
[removeConfirmOpen, setRemoveConfirmOpen] = useState(false),
[fullscreen, setFullscreen] = useState(false),
[settingsOpen, setSettingsOpen] = useState(false),
[layoutOpen, setLayoutOpen] = useState(false),
[diagnosticsOpen, setDiagnosticsOpen] = useState(false),
[workspaceTool, setWorkspaceTool] = useState<WorkspaceTool | null>(null),
[displayOptions, setDisplayOptions] = useState<ViewerDisplayOptions>(initialDisplayOptions),
[showSensorCamera, setShowSensorCamera] = useState(true),
[jointAdvanced, setJointAdvanced] = useState(false),
[angleUnit, setAngleUnit] = useState<'rad' | 'deg'>('rad');
useEffect(() => {
const change = () => setFullscreen(document.fullscreenElement === root.current);
document.addEventListener('fullscreenchange', change);
return () => document.removeEventListener('fullscreenchange', change);
}, [root]);
const toggleFullscreen = () => {
if (document.fullscreenElement) void document.exitFullscreen().catch(() => {});
else if (root.current) void root.current.requestFullscreen().catch(() => {});
};
const showWorkspaceTool = (tool: WorkspaceTool) => {
setWorkspaceTool(tool);
setRightOpen(true);
};
const applyLayoutPreset = (preset: LayoutPreset) => {
if (preset === 'viewport') {
setLeftOpen(false);
setRightOpen(false);
dispatchLayoutWidths(288, 288);
} else if (preset === 'project') {
setLeftOpen(true);
setRightOpen(false);
dispatchLayoutWidths(384, 288);
} else if (preset === 'control') {
setLeftOpen(false);
setRightOpen(true);
setWorkspaceTool('controls');
dispatchLayoutWidths(288, 384);
} else {
setLeftOpen(true);
setRightOpen(true);
dispatchLayoutWidths(288, 288);
}
};
return {
...sidebars,
theme,
setTheme,
forceScale,
setForceScale,
helpOpen,
setHelpOpen,
commandOpen,
setCommandOpen,
sourceOpen,
setSourceOpen,
removeConfirmOpen,
setRemoveConfirmOpen,
fullscreen,
toggleFullscreen,
settingsOpen,
setSettingsOpen,
layoutOpen,
setLayoutOpen,
diagnosticsOpen,
setDiagnosticsOpen,
workspaceTool,
setWorkspaceTool,
showWorkspaceTool,
displayOptions,
setDisplayOptions,
showSensorCamera,
setShowSensorCamera,
jointAdvanced,
setJointAdvanced,
angleUnit,
setAngleUnit,
applyLayoutPreset,
};
}