From ac4e39edc58c8fe29aebdea49d76b1d699f7ae9a Mon Sep 17 00:00:00 2001 From: Michael Ramos Date: Sun, 23 Aug 2026 14:08:10 -0700 Subject: [PATCH 1/2] feat(ui): redesign compact touch settings --- packages/editor/components/AppHeader.tsx | 5 + packages/review-editor/App.tsx | 3 + .../components/ReviewHeaderMenu.tsx | 3 + packages/ui/components/PlanHeaderMenu.tsx | 3 + .../Settings.compactDisplay.test.tsx | 6 +- .../ui/components/Settings.mobile.test.tsx | 153 +++++++ packages/ui/components/Settings.tsx | 392 +++++++++++++++--- packages/ui/theme.css | 49 +++ 8 files changed, 554 insertions(+), 60 deletions(-) create mode 100644 packages/ui/components/Settings.mobile.test.tsx diff --git a/packages/editor/components/AppHeader.tsx b/packages/editor/components/AppHeader.tsx index 7c3f95ef2..c18586e58 100644 --- a/packages/editor/components/AppHeader.tsx +++ b/packages/editor/components/AppHeader.tsx @@ -194,6 +194,8 @@ export const AppHeader = React.memo(({ bearConfigured, octarineConfigured, }) => { + const settingsReturnFocusRef = React.useRef(null); + return (
(({ onExternalClose={onCloseSettings} gitUser={gitUser} agentTerminalAvailable={agentTerminalAvailable} + isCompactTouchLayout={compactTouchLayout} + returnFocusRef={settingsReturnFocusRef} /> { const [showExportModal, setShowExportModal] = useState(false); const [showWorktreeDialog, setShowWorktreeDialog] = useState(false); const [openSettingsMenu, setOpenSettingsMenu] = useState(false); + const settingsReturnFocusRef = useRef(null); const [showNoAnnotationsDialog, setShowNoAnnotationsDialog] = useState(false); const [isLoading, setIsLoading] = useState(true); const diffStyle = useConfigValue('diffStyle'); @@ -4034,6 +4035,7 @@ const ReviewApp: React.FC = () => {
setOpenSettingsMenu(true)} onOpenReviewSetup={sectionsCapable ? () => { reviewSetupIsFirstRun.current = false; setShowReviewSetup(true); } : undefined} onOpenExport={() => setShowExportModal(true)} @@ -4534,6 +4536,7 @@ const ReviewApp: React.FC = () => { // Display tab hides the Split/Unified control rather than writing // the desktop preference from a phone. isCompactTouchLayout={isCompactTouchLayout} + returnFocusRef={settingsReturnFocusRef} />
diff --git a/packages/review-editor/components/ReviewHeaderMenu.tsx b/packages/review-editor/components/ReviewHeaderMenu.tsx index 64899ab0a..5a3a9c19e 100644 --- a/packages/review-editor/components/ReviewHeaderMenu.tsx +++ b/packages/review-editor/components/ReviewHeaderMenu.tsx @@ -33,6 +33,7 @@ export interface CompactReviewAction { } interface ReviewHeaderMenuProps { + triggerRef?: React.Ref; onOpenSettings: () => void; onOpenReviewSetup?: () => void; onOpenExport: () => void; @@ -56,6 +57,7 @@ interface ReviewHeaderMenuProps { } export const ReviewHeaderMenu: React.FC = ({ + triggerRef, onOpenSettings, onOpenReviewSetup, onOpenExport, @@ -90,6 +92,7 @@ export const ReviewHeaderMenu: React.FC = ({ } renderTrigger={({ isOpen, toggleMenu }) => ( - - -
- {/* Mobile: horizontal tab bar */} - + ) : ( +
+ ) : ( +
+

Settings

+ +
+ )} + +
+ {isCompactTouchLayout && compactScreen === 'sections' && ( + + + + )} {/* Content — scrollable */} - -
+ {(!isCompactTouchLayout || compactScreen === 'detail') && ( + +
{/* === GENERAL TAB === */} {activeTab === 'general' && ( @@ -2135,7 +2406,7 @@ export const Settings: React.FC = ({ taterMode, onTaterModeChange
-
+
{vaultsLoading ? ( @@ -2472,6 +2743,7 @@ tags: [plan, ...]
+ )}
, @@ -2479,7 +2751,10 @@ tags: [plan, ...] )} {themePreview && createPortal( -
+
Theme Preview