返回 DeepSeek-Reasonix
workspaceLayout.ts
根目录 / desktop / frontend / src / lib / workspaceLayout.ts
1 export const SIDEBAR_AUTO_COLLAPSE_WIDTH = 1024;
2 export const DOCK_FULLSCREEN_WIDTH = 768;
3 export const DOCK_DEFAULT_RATIO = 0.45;
4 export const DOCK_MAX_RATIO = 0.7;
5
6 export function availableWorkspacePanelWidth({
7 viewportWidth,
8 sidebarCollapsed,
9 sidebarWidth,
10 chatMinWidth,
11 resizerWidth,
12 }: {
13 viewportWidth: number;
14 sidebarCollapsed: boolean;
15 sidebarWidth: number;
16 chatMinWidth: number;
17 resizerWidth: number;
18 }): number {
19 return Math.max(0, Math.min(viewportWidth * DOCK_MAX_RATIO, viewportWidth - (sidebarCollapsed ? 0 : sidebarWidth) - chatMinWidth - resizerWidth));
20 }
21
22 export function resolveWorkspacePanelWidth({
23 open,
24 maximized,
25 preferredWidth,
26 minWidth,
27 availableWidth,
28 }: {
29 open: boolean;
30 maximized: boolean;
31 preferredWidth: number;
32 minWidth: number;
33 availableWidth: number;
34 }): number {
35 if (!open || maximized) return preferredWidth;
36 return Math.min(Math.max(minWidth, preferredWidth), Math.max(0, availableWidth));
37 }
38
39 export function resolveLiveWorkspacePanelWidth({
40 viewportWidth,
41 sidebarCollapsed,
42 sidebarWidth,
43 chatMinWidth,
44 resizerWidth,
45 open,
46 maximized,
47 preferredWidth,
48 minWidth,
49 }: {
50 viewportWidth: number;
51 sidebarCollapsed: boolean;
52 sidebarWidth: number;
53 chatMinWidth: number;
54 resizerWidth: number;
55 open: boolean;
56 maximized: boolean;
57 preferredWidth: number;
58 minWidth: number;
59 }): number {
60 return resolveWorkspacePanelWidth({
61 open,
62 maximized,
63 preferredWidth,
64 minWidth,
65 availableWidth: availableWorkspacePanelWidth({
66 viewportWidth,
67 sidebarCollapsed,
68 sidebarWidth,
69 chatMinWidth,
70 resizerWidth,
71 }),
72 });
73 }
74
75 export function workspacePanelAriaMinWidth(minWidth: number, renderedWidth: number): number {
76 return Math.min(minWidth, renderedWidth);
77 }
78
79 export function resolveWorkspacePanelPlacement({
80 viewportWidth, sidebarCollapsed, sidebarWidth, chatMinWidth, resizerWidth,
81 open, maximized, preferredWidth, minWidth, minRenderWidth, liveWidth,
82 }: {
83 viewportWidth: number; sidebarCollapsed: boolean; sidebarWidth: number;
84 chatMinWidth: number; resizerWidth: number; open: boolean; maximized: boolean;
85 preferredWidth: number; minWidth: number; minRenderWidth: number; liveWidth?: number | null;
86 }) {
87 const resolvedWidth = resolveLiveWorkspacePanelWidth({
88 viewportWidth, sidebarCollapsed, sidebarWidth, chatMinWidth, resizerWidth,
89 open, maximized, preferredWidth, minWidth,
90 });
91 const fullscreen = open && viewportWidth < DOCK_FULLSCREEN_WIDTH;
92 const overlay = fullscreen || (open && !maximized && resolvedWidth < minRenderWidth);
93 const storedWidth = maximized
94 ? preferredWidth
95 : overlay ? Math.min(preferredWidth, Math.max(minWidth, viewportWidth - 16)) : resolvedWidth;
96 const renderWidth = fullscreen ? viewportWidth : liveWidth ?? storedWidth;
97 const renderable = open && (maximized || overlay || renderWidth >= minRenderWidth);
98 return { renderWidth, overlay, renderable, gridOpen: renderable && !maximized && !overlay };
99 }
100
100 lines TYPESCRIPT