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