From 629ddb01224dc0c49aaecfc52cd97a77905ee7e3 Mon Sep 17 00:00:00 2001 From: Michael Suchacz <203725896+ibetitsmike@users.noreply.github.com> Date: Tue, 17 Feb 2026 00:30:41 +0000 Subject: [PATCH 01/48] =?UTF-8?q?=F0=9F=A4=96=20feat:=20add=20immersive=20?= =?UTF-8?q?review=20foundation=20utilities?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Settings/sections/KeybindsSection.tsx | 11 +++ src/browser/components/WorkspaceShell.tsx | 18 +++- src/browser/components/ui/Keycap.tsx | 99 +++++++++++++++++++ src/browser/utils/review/navigation.ts | 51 ++++++++++ src/browser/utils/review/quickReviewNotes.ts | 78 +++++++++++++++ src/browser/utils/ui/keybinds.ts | 33 +++++++ 6 files changed, 289 insertions(+), 1 deletion(-) create mode 100644 src/browser/components/ui/Keycap.tsx create mode 100644 src/browser/utils/review/quickReviewNotes.ts diff --git a/src/browser/components/Settings/sections/KeybindsSection.tsx b/src/browser/components/Settings/sections/KeybindsSection.tsx index c990f3f2a7..f87c063248 100644 --- a/src/browser/components/Settings/sections/KeybindsSection.tsx +++ b/src/browser/components/Settings/sections/KeybindsSection.tsx @@ -59,6 +59,17 @@ const KEYBIND_LABELS: Record = { // Modal-only keybinds; intentionally omitted from KEYBIND_GROUPS. CONFIRM_DIALOG_YES: "Confirm dialog action", CONFIRM_DIALOG_NO: "Cancel dialog action", + TOGGLE_REVIEW_IMMERSIVE: "Toggle immersive review", + REVIEW_NEXT_FILE: "Next file (immersive)", + REVIEW_PREV_FILE: "Previous file (immersive)", + REVIEW_NEXT_HUNK: "Next hunk (immersive)", + REVIEW_PREV_HUNK: "Previous hunk (immersive)", + REVIEW_CURSOR_DOWN: "Line cursor down (immersive)", + REVIEW_CURSOR_UP: "Line cursor up (immersive)", + REVIEW_CURSOR_JUMP_DOWN: "Jump 10 lines down (immersive)", + REVIEW_CURSOR_JUMP_UP: "Jump 10 lines up (immersive)", + REVIEW_QUICK_LIKE: "Quick like (immersive)", + REVIEW_QUICK_DISLIKE: "Quick dislike (immersive)", // Easter egg keybind; intentionally omitted from KEYBIND_GROUPS. TOGGLE_POWER_MODE: "", }; diff --git a/src/browser/components/WorkspaceShell.tsx b/src/browser/components/WorkspaceShell.tsx index 18ef023be2..34e13b44b2 100644 --- a/src/browser/components/WorkspaceShell.tsx +++ b/src/browser/components/WorkspaceShell.tsx @@ -5,6 +5,7 @@ import { RIGHT_SIDEBAR_WIDTH_KEY } from "@/common/constants/storage"; import { useResizableSidebar } from "@/browser/hooks/useResizableSidebar"; import { useResizeObserver } from "@/browser/hooks/useResizeObserver"; import { useOpenTerminal } from "@/browser/hooks/useOpenTerminal"; +import { usePersistedState } from "@/browser/hooks/usePersistedState"; import { RightSidebar } from "./RightSidebar"; import { PopoverError } from "./PopoverError"; import type { RuntimeConfig } from "@/common/types/runtime"; @@ -127,6 +128,11 @@ export const WorkspaceShell: React.FC = (props) => { ); const workspaceState = useWorkspaceState(props.workspaceId); + const [isReviewImmersive] = usePersistedState( + `review-immersive:${props.workspaceId}`, + false, + { listener: true } + ); const backgroundBashError = useBackgroundBashError(); if (!workspaceState || workspaceState.loading) { @@ -147,7 +153,7 @@ export const WorkspaceShell: React.FC = (props) => {
= (props) => { onToggleLeftSidebarCollapsed={props.onToggleLeftSidebarCollapsed} runtimeConfig={props.runtimeConfig} onOpenTerminal={handleOpenTerminal} + aria-hidden={isReviewImmersive || undefined} /> = (props) => { onReviewNote={handleReviewNote} isCreating={props.isInitializing === true} addTerminalRef={addTerminalRef} + aria-hidden={isReviewImmersive || undefined} + /> + + {/* Portal target for immersive review mode overlay */} +