Skip to content

画面接管里 ⌘K 照样拉起快速切换,盖在画面上不结束接管;叠放层级收成一张表;浮层关掉后焦点不再落到 body - #125

Merged
joesmart merged 3 commits into
mainfrom
joesmart/fix-quickswitch-takeover
Oct 25, 2026
Merged

joesmart merged 3 commits into
mainfrom
joesmart/fix-quickswitch-takeover

Conversation

@joesmart

@joesmart joesmart commented Oct 25, 2026 •

Copy link
Copy Markdown
Contributor

Refs #33

改了什么

  • ⌘K 在画面接管里归 App(Win/Linux 是 Ctrl+K)。LivePanel 收到 ⌘K 时不转发、也不 preventDefault,让它冒到窗口上;MainWindow 的窗口监听在接管时不再整个摘掉,只认 switch 这一个快捷键,拉起快速切换。其他组合键(包括 ⌘/)照旧发到电脑。终端面板里 ⌘K 仍然发给 shell(Ctrl+K 在 shell 里是删到行尾),一个快捷键都不拦。
  • 快速切换开着时按键不发:焦点在快速切换的输入框里,画面收不到键。另外画面那边记住「按下发过去的键」:没发过按下的键,抬起也不发(比如关快速切换那下 Esc,抬起时焦点已经回到画面上);焦点离开画面时,替还按着的键补发抬起,免得电脑那页以为 ⌘ 一直按着。
  • 叠放层级只在一张表里定:00-foundation.css 加了 --layer-* 变量,从下往上是 菜单/抽屉 → 导航/弹窗 → 画面 → 快速切换 → 接手提示 → toast。各处 z-index 都改成引用变量,不再写数字。快速切换盖在画面上;右下角的接手提示在快速切换遮罩上面,还点得到。
  • 接管不中断:拉起和关掉快速切换都不结束接管;Esc 关掉后焦点回到画面,按键接着发。选了别的群就按现有规则来:画面面板是页级的,换路由不收,所以画面照旧摆着,焦点也回到画面。
  • 焦点还原改成整层只记一次:原来 useRestoreFocus 写在 QuickSwitch 和 ShortcutSheet 各自里面,从快速切换按 ⌘/ 换成快捷键表时,后挂上的那个记下的是正要卸掉的输入框,关掉后焦点落到 body。现在由 RestoreFocus 包住整层浮层,在首次渲染时记下打开前的位置,整层收起才还回去。两个遮罩的 onMouseDown 加了 preventDefault:不加的话,按下的默认动作会在遮罩卸掉之后把焦点清到 body。
  • 打开新画面时先收起快速切换:快速切换开着时点接手提示的「打开画面」,新画面会挂在快速切换下面,焦点却被画面抢走,看到的和收键的不是同一层。现在摆出的画面一换成新的,MainWindow 就在同一次渲染里收起快速切换,RestoreFocus 先还焦点,画面随后接过焦点。
  • 快捷键表「画面接管和终端」那一节按新行为改了文案。

改动的文件

  • packages/web/src/routes/MainWindow.tsx
  • packages/web/src/live/LivePanel.tsx
  • packages/web/src/components/RestoreFocus.tsx(新)、QuickSwitch.tsx、ShortcutSheet.tsx、shortcuts.ts
  • packages/web/src/styles/00-foundation.css 和 8 个用到 z-index 的样式文件
  • packages/web/e2e/quick-switch-takeover.spec.ts(新)

怎么验证

新用例在 e2e/quick-switch-takeover.spec.ts,共 5 条:

  1. 画面接管开着时 ⌘K 拉起快速切换,盖在画面上;⌘K 和快速切换里打的字都不发到电脑,Esc 关掉后焦点回到画面、字母接着发过去
  2. 画面接管开着时在快速切换里选别的群:跳过去,画面照旧摆着不结束,焦点回到画面
  3. 画面开着、另一个 Bot 请人接手时按 ⌘K:右下角的接手提示不被快速切换的遮罩盖住,点得到(用 elementFromPoint 断言)
  4. 快速切换开着时点接手提示的「打开画面」:快速切换收起,画面在最上面,打的字发到电脑
  5. 快捷键表关掉后焦点回到打开之前的地方,不落到 body:从快速切换里按 ⌘/ 换过去也一样

在 main(f82cafe)上跑前 4 条和第 5 条,全红(第 4 条是复核后补的,在本 PR 修之前的 eb05b0c 上也红,卡在「画面打开时快速切换收起」):

1/3: expect(locator).toBeVisible() failed … getByTestId('quick-switch') element(s) not found
2:   locator.fill: Test timeout of 30000ms exceeded(快速切换没出来)
5:   Error: 焦点不在 body 上 … Expected: not "BODY"
4 failed

改完之后:

E2E_API_PORT=3963 E2E_WEB_PORT=5963 pnpm --filter @baize/web test
  vitest: Test Files 51 passed (51), Tests 366 passed (366)
  playwright: 543 passed (7.9m)
pnpm format:check   → All matched files use Prettier code style!
pnpm typecheck      → 通过
pnpm lint           → 0 error,12 条 warning 都是原来就有的,不在本次改动的文件里

需要知道的

  • .trigger-menu 原来是 z-index: 5,现在归到 --layer-menu(2),跟其他下拉菜单一样。全量 Playwright 没有因此出问题,但值确实变小了。
  • 跑全量时 15-p1-4.spec.ts:507(断线前只收到半句的流式回复…)红过一次,单独 --repeat-each 3 连过 3 次,是跟本改动无关的偶发红。

🤖 Generated with Claude Code

https://claude.ai/code/session_01Be3SZps2JjqvyrJ1vbLmni

joesmart and others added 3 commits October 25, 2026 20:48
之前点接手提示的「打开画面」时,画面挂在快速切换下面,焦点却被画面抢走。
人看到的是快速切换,打的字发到了电脑,Esc 也关不掉快速切换。
现在摆出的画面一换成新的,就在同一次渲染里收起快速切换。

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Be3SZps2JjqvyrJ1vbLmni
@joesmart
joesmart force-pushed the joesmart/fix-quickswitch-takeover branch from 835f05e to 79ca4c1 Compare October 25, 2026 12:58
@joesmart
joesmart merged commit 8b90f0e into main Oct 25, 2026
1 check failed
@joesmart
joesmart deleted the joesmart/fix-quickswitch-takeover branch October 25, 2026 13:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant