Skip to content

Commit 9bd591d

Browse files
committed
fix: prioritize fullscreen escape over focus mode
1 parent 107bc12 commit 9bd591d

4 files changed

Lines changed: 60 additions & 0 deletions

File tree

docs/help/desktop-guide.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
- 终端面板切换按钮
2828
- 文件面板切换按钮
2929
- 设置按钮
30+
- 全屏按钮
3031

3132
### 左侧面板
3233

@@ -138,6 +139,12 @@
138139

139140
`F` 键进入专注模式,会隐藏左侧面板和底部终端面板,只保留中央工作区。按 `Escape` 退出专注模式。
140141

142+
### 原生全屏
143+
144+
点击设置按钮右侧的全屏按钮可进入浏览器原生全屏。处于全屏时,同一位置的按钮会切换为退出全屏,按 `Escape` 也可以退出。
145+
146+
如果同时开启了专注模式和原生全屏,`Escape` 会先退出原生全屏,再退出专注模式。
147+
141148
## 常见问题
142149

143150
**Q:如何找回被关闭的面板?**

docs/help/mobile-guide.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
- 工作区名称(点击打开工作区抽屉,可切换工作区)
2424
- 设置入口
25+
- 全屏入口(仅在浏览器支持原生全屏时显示)
2526

2627
### 当前 Agent 区域
2728

@@ -76,6 +77,8 @@
7677
- 移动端适合"查看"为主,复杂的文件编辑和 Agent 管理建议在桌面端完成
7778
- 手机键盘弹出时会压缩底部 Dock 区域,操作时注意布局变化
7879
- 终端操作在小屏幕上可能不便,建议仅在需要时查看
80+
- 如果浏览器支持原生全屏,可点击顶部栏右侧的全屏按钮进入;再次点击同一位置的按钮可退出
81+
- 某些移动端浏览器不支持原生全屏,此时不会显示该按钮
7982

8083
## 常见问题
8184

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { fireEvent, render } from "@testing-library/react";
2+
import { createStore, Provider } from "jotai";
3+
import { describe, expect, it } from "vitest";
4+
import { focusModeAtom } from "../../workspace/atoms";
5+
import { FocusMode } from "./focus-mode";
6+
7+
function renderFocusModeWithStore(initialFocusMode: boolean) {
8+
const store = createStore();
9+
store.set(focusModeAtom, initialFocusMode);
10+
11+
render(
12+
<Provider store={store}>
13+
<FocusMode />
14+
</Provider>
15+
);
16+
17+
return store;
18+
}
19+
20+
describe("FocusMode escape priority", () => {
21+
it("does not close focus mode while native fullscreen is active", () => {
22+
Object.defineProperty(document, "fullscreenElement", {
23+
configurable: true,
24+
get: () => document.body,
25+
});
26+
27+
const store = renderFocusModeWithStore(true);
28+
29+
fireEvent.keyDown(window, { key: "Escape" });
30+
31+
expect(store.get(focusModeAtom)).toBe(true);
32+
});
33+
34+
it("still exits focus mode when fullscreen is not active", () => {
35+
Object.defineProperty(document, "fullscreenElement", {
36+
configurable: true,
37+
get: () => null,
38+
});
39+
40+
const store = renderFocusModeWithStore(true);
41+
42+
fireEvent.keyDown(window, { key: "Escape" });
43+
44+
expect(store.get(focusModeAtom)).toBe(false);
45+
});
46+
});

packages/web/src/features/focus-mode/components/focus-mode.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,10 @@ export function FocusMode() {
8484

8585
// Escape key exits focus mode
8686
if (e.key === "Escape" && focusMode) {
87+
if (document.fullscreenElement) {
88+
return;
89+
}
90+
8791
e.preventDefault();
8892
setFocusMode(false);
8993
}

0 commit comments

Comments
 (0)