From e12a0ebd64bbac6827bdd9d896385c4b772e529b Mon Sep 17 00:00:00 2001 From: khafaji-ahmed Date: Mon, 7 Sep 2026 20:55:47 -0400 Subject: [PATCH] fix(ui): keep layout responsive at every interface scale --- .github/pr-evidence/ui-scale-100.png | Bin 0 -> 39021 bytes .github/pr-evidence/ui-scale-80.png | Bin 0 -> 42850 bytes packages/electron/main.mjs | 14 +++++ .../ui/src/components/browser/BrowserPane.tsx | 14 +++++ .../src/components/chat/DraftPresetChips.tsx | 2 +- .../chat/composer/ui/DraftTargetSelectors.tsx | 4 +- .../ui/src/components/layout/ContextPanel.tsx | 18 +++++- packages/ui/src/components/layout/Header.tsx | 10 +++- packages/ui/src/components/layout/Sidebar.tsx | 2 +- .../components/mini-chat/MiniChatLayout.tsx | 3 +- .../components/multirun/MultiRunLauncher.tsx | 2 +- .../components/providers/ThemeProvider.tsx | 28 +++++++++ .../session/SessionSwitcherDropdown.tsx | 4 +- .../sidebar/projects/SessionGroupSection.tsx | 2 +- .../projects/SessionProjectScroller.tsx | 2 +- .../sidebar/projects/sortableItems.tsx | 2 +- .../recent/SidebarActivitySections.tsx | 2 +- packages/ui/src/hooks/useMenuActions.ts | 11 +++- packages/ui/src/lib/surfaces/DOCUMENTATION.md | 5 +- .../stores/useUIStore.contextPanel.test.ts | 55 +++++++++++++++++- packages/ui/src/stores/useUIStore.ts | 52 ++++++++++++----- 21 files changed, 197 insertions(+), 35 deletions(-) create mode 100644 .github/pr-evidence/ui-scale-100.png create mode 100644 .github/pr-evidence/ui-scale-80.png diff --git a/.github/pr-evidence/ui-scale-100.png b/.github/pr-evidence/ui-scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..ec3262168b0ab26e116df43c90ab87552a466426 GIT binary patch literal 39021 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 JWt~$(695mN@Gk%W literal 0 HcmV?d00001 diff --git a/.github/pr-evidence/ui-scale-80.png b/.github/pr-evidence/ui-scale-80.png new file mode 100644 index 0000000000000000000000000000000000000000..b8cb602afb554a113887e1861c8a439c16785b18 GIT binary patch literal 42850 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
|>MbuI$dG~qhDRzyinXJ@6pC;4VcU4+m$2|+TM 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

mE)4i8DhAgPi987Ofp4>ybHbQSTvZAt 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 { const dispatchMenuAction = (action) => { const target = getMenuTargetWindow(); + // Zoom actions are consumed by the renderer's DOM listener. Sending them + // through both the IPC bridge and the DOM event would invoke the handler + // multiple times because preload fans the IPC event back into both paths. + if (action === 'zoom-in' || action === 'zoom-out' || action === 'zoom-reset') { + dispatchDomEventToWindow(target, 'openchamber:menu-action', action); + return; + } emitToWindow(target, 'openchamber:menu-action', action); dispatchDomEventToWindow(target, 'openchamber:menu-action', action); }; @@ -4963,6 +4970,10 @@ const buildMacMenu = () => { { role: 'minimize' }, { role: 'zoom' }, { type: 'separator' }, + { label: 'Zoom In', accelerator: 'CmdOrCtrl+=', click: () => dispatchAction('zoom-in') }, + { label: 'Zoom Out', accelerator: 'CmdOrCtrl+-', click: () => dispatchAction('zoom-out') }, + { label: 'Reset Zoom', accelerator: 'CmdOrCtrl+0', click: () => dispatchAction('zoom-reset') }, + { type: 'separator' }, { role: 'close' }, ], }, @@ -5076,6 +5087,9 @@ const buildAutoHiddenMenu = () => { label: 'Window', submenu: [ { role: 'minimize' }, + { label: 'Zoom In', accelerator: 'Ctrl+=', click: () => dispatchAction('zoom-in') }, + { label: 'Zoom Out', accelerator: 'Ctrl+-', click: () => dispatchAction('zoom-out') }, + { label: 'Reset Zoom', accelerator: 'Ctrl+0', click: () => dispatchAction('zoom-reset') }, { role: 'togglefullscreen' }, { type: 'separator' }, { role: 'close' }, diff --git a/packages/ui/src/components/browser/BrowserPane.tsx b/packages/ui/src/components/browser/BrowserPane.tsx index 638b9547..216f9448 100644 --- a/packages/ui/src/components/browser/BrowserPane.tsx +++ b/packages/ui/src/components/browser/BrowserPane.tsx @@ -588,6 +588,20 @@ const WebviewBrowser: React.FC = ({ initialUrl, directory, tab } }, []); + React.useEffect(() => { + const handleZoom = (event: Event) => { + if (!(event instanceof CustomEvent)) return; + const action = event.detail; + const webview = webviewRef.current; + if (!webview || document.activeElement !== webview) return; + if (action === 'zoom-in') applyZoom(zoomLevel + ZOOM_STEP); + else if (action === 'zoom-out') applyZoom(zoomLevel - ZOOM_STEP); + else if (action === 'zoom-reset') applyZoom(0); + }; + window.addEventListener('openchamber:zoom', handleZoom); + return () => window.removeEventListener('openchamber:zoom', handleZoom); + }, [applyZoom, zoomLevel]); + const clearBrowsingData = React.useCallback((what: 'cookies' | 'cache') => { void invokeDesktopCommand('desktop_browser_clear_data', { partition: BROWSER_PARTITION, diff --git a/packages/ui/src/components/chat/DraftPresetChips.tsx b/packages/ui/src/components/chat/DraftPresetChips.tsx index 31230b64..0b5bd058 100644 --- a/packages/ui/src/components/chat/DraftPresetChips.tsx +++ b/packages/ui/src/components/chat/DraftPresetChips.tsx @@ -94,7 +94,7 @@ const SortableChip: React.FC<{ {...attributes} {...listeners} onClick={() => onSubmit(item)} - className="group inline-flex touch-none select-none items-center gap-1.5 rounded-full border px-3 py-1.5 text-sm text-muted-foreground transition-colors hover:bg-[var(--interactive-hover)] hover:text-foreground" + className="group inline-flex touch-none select-none items-center gap-1.5 rounded-full border px-3 py-1.5 typography-ui-label text-muted-foreground transition-colors hover:bg-[var(--interactive-hover)] hover:text-foreground" style={chipStyle} title={item.shared ? t('chat.draftStarters.sharedTitle') : undefined} > diff --git a/packages/ui/src/components/chat/composer/ui/DraftTargetSelectors.tsx b/packages/ui/src/components/chat/composer/ui/DraftTargetSelectors.tsx index abccd7d6..5b4c6d29 100644 --- a/packages/ui/src/components/chat/composer/ui/DraftTargetSelectors.tsx +++ b/packages/ui/src/components/chat/composer/ui/DraftTargetSelectors.tsx @@ -310,7 +310,7 @@ export function DraftTargetSelectors(props: DraftTargetProps) { > {selectedProject.kind === 'chat' - ? {t('chat.chatInput.chooseProject')} + ? {t('chat.chatInput.chooseProject')} : } @@ -498,7 +498,7 @@ export function MobileDraftTargetTriggers( onClick={() => onOpenPicker('project')} > {selectedProject.kind === 'chat' - ? {t('chat.chatInput.chooseProject')} + ? {t('chat.chatInput.chooseProject')} : } diff --git a/packages/ui/src/components/layout/ContextPanel.tsx b/packages/ui/src/components/layout/ContextPanel.tsx index 0b7eef5d..ed8de6ba 100644 --- a/packages/ui/src/components/layout/ContextPanel.tsx +++ b/packages/ui/src/components/layout/ContextPanel.tsx @@ -52,7 +52,7 @@ import { import { getContextSurfaceWidthFraction } from '@/lib/surfaces/registry'; import { isTerminalEventTarget } from '@/lib/terminalFocus'; -const CONTEXT_PANEL_MIN_WIDTH = 380; +const CONTEXT_PANEL_MIN_WIDTH = 320; const CONTEXT_PANEL_MAX_WIDTH = 1400; const CONTEXT_PANEL_DEFAULT_WIDTH = 600; const RESIZE_FOLLOW_INTERVAL_MS = 100; @@ -484,10 +484,21 @@ export const ContextPanel: React.FC = () => { const [availablePanelAreaWidth, setAvailablePanelAreaWidth] = React.useState(null); const activeModeForWidth = activeTab?.mode ?? null; const manualWidth = activeModeForWidth ? panelState?.widthByMode?.[activeModeForWidth] : undefined; + const manualWidthFraction = activeModeForWidth ? panelState?.widthFractionByMode?.[activeModeForWidth] : undefined; const widthFraction = activeModeForWidth ? getContextSurfaceWidthFraction(activeModeForWidth) : 0.5; const widthFallbackBase = availablePanelAreaWidth ?? (typeof window !== 'undefined' ? window.innerWidth : CONTEXT_PANEL_DEFAULT_WIDTH * 2); - const width = clampWidth(manualWidth ?? Math.round(widthFraction * widthFallbackBase)); + const effectiveManualWidth = manualWidthFraction != null && availablePanelAreaWidth != null + ? Math.round(manualWidthFraction * availablePanelAreaWidth) + : manualWidth; + const width = clampWidth(effectiveManualWidth ?? Math.round(widthFraction * widthFallbackBase)); + + // Convert legacy pixel-only preferences to a ratio the first time the + // available area is known, so existing users also get responsive sizing. + React.useEffect(() => { + if (!directoryKey || !activeModeForWidth || manualWidthFraction != null || manualWidth == null || availablePanelAreaWidth == null) return; + setContextPanelWidth(directoryKey, activeModeForWidth, manualWidth, availablePanelAreaWidth); + }, [activeModeForWidth, availablePanelAreaWidth, directoryKey, manualWidth, manualWidthFraction, setContextPanelWidth]); const chatSessionIDs = React.useMemo(() => { const ids: string[] = []; for (const tab of tabs) { @@ -592,6 +603,7 @@ export const ContextPanel: React.FC = () => { // Apply the final width once, letting the regular 200ms width transition // carry the panel to the release position. const finalWidth = clampWidthForDrag(resizingWidthRef.current ?? width); + const availableWidth = resizeAvailableWidthRef.current; resizingWidthRef.current = null; resizeAvailableWidthRef.current = null; if (resizeFollowTimerRef.current !== null) { @@ -600,7 +612,7 @@ export const ContextPanel: React.FC = () => { } document.documentElement.style.cursor = ''; if (directoryKey && activeModeForWidth) { - setContextPanelWidth(directoryKey, activeModeForWidth, finalWidth); + setContextPanelWidth(directoryKey, activeModeForWidth, finalWidth, availableWidth ?? undefined); } setIsResizing(false); activeResizePointerIDRef.current = null; diff --git a/packages/ui/src/components/layout/Header.tsx b/packages/ui/src/components/layout/Header.tsx index 3f2af834..bcca36af 100644 --- a/packages/ui/src/components/layout/Header.tsx +++ b/packages/ui/src/components/layout/Header.tsx @@ -1076,7 +1076,9 @@ export const Header: React.FC = () => { // `--oc-titlebar-left-inset` so the sidebar strip can mirror it. const titlebarLeftInset = React.useMemo(() => { if (isDesktopApp && isMacPlatform && !isDesktopWindowFullscreen) { - return '5.5rem'; + // Native traffic lights have a fixed physical footprint. Keep this + // clearance in pixels so shrinking the interface cannot overlap them. + return '88px'; } if (isTabletStandalonePwa) { return 'max(calc(0.75rem + var(--oc-wco-left-inset, 0px)), 5.5rem)'; @@ -1170,8 +1172,10 @@ export const Header: React.FC = () => { // Left inset is handled by the no-drag spacer (see renderDesktop); only // the right inset / titlebar height are owned by the window-controls overlay. paddingRight: 'calc(0.75rem + var(--oc-wco-right-inset, 0px))', - minHeight: 'max(3rem, var(--oc-wco-titlebar-height, 0px))', - height: 'max(3rem, var(--oc-wco-titlebar-height, 0px))', + // Keep the titlebar safe area in physical pixels. Interface zoom may + // shrink rem content, but native macOS traffic lights must never overlap it. + minHeight: 'max(56px, var(--oc-wco-titlebar-height, 0px))', + height: 'max(56px, var(--oc-wco-titlebar-height, 0px))', }; }, [isDesktopApp, isVSCode, usesFramelessChrome, windowControlsSide]); diff --git a/packages/ui/src/components/layout/Sidebar.tsx b/packages/ui/src/components/layout/Sidebar.tsx index 77a7b32d..f18d3a3a 100644 --- a/packages/ui/src/components/layout/Sidebar.tsx +++ b/packages/ui/src/components/layout/Sidebar.tsx @@ -6,7 +6,7 @@ import { useUIStore } from '@/stores/useUIStore'; import { ScrollableOverlay } from '@/components/ui/ScrollableOverlay'; const SIDEBAR_CONTENT_WIDTH = 280; -const SIDEBAR_MIN_WIDTH = 280; +const SIDEBAR_MIN_WIDTH = 168; const SIDEBAR_MAX_WIDTH = 500; interface SidebarProps { diff --git a/packages/ui/src/components/mini-chat/MiniChatLayout.tsx b/packages/ui/src/components/mini-chat/MiniChatLayout.tsx index 84afce61..58883fb5 100644 --- a/packages/ui/src/components/mini-chat/MiniChatLayout.tsx +++ b/packages/ui/src/components/mini-chat/MiniChatLayout.tsx @@ -264,7 +264,8 @@ const MiniChatHeader: React.FC<{ mode: MiniChatMode }> = ({ mode }) => { className={cn( 'flex items-center gap-3 bg-background', usesFramelessChrome && windowControlsSide === 'right' ? 'pr-0' : 'pr-3', - hasMacTrafficLights ? 'pl-[5.5rem]' : 'pl-3', + // Native traffic lights are fixed-size OS chrome, not scaled UI. + hasMacTrafficLights ? 'pl-[88px]' : 'pl-3', usesFramelessChrome ? 'h-12' : macosHeaderSizeClass || 'min-h-14', )} style={dragRegionStyle} diff --git a/packages/ui/src/components/multirun/MultiRunLauncher.tsx b/packages/ui/src/components/multirun/MultiRunLauncher.tsx index 36323a3b..7543588a 100644 --- a/packages/ui/src/components/multirun/MultiRunLauncher.tsx +++ b/packages/ui/src/components/multirun/MultiRunLauncher.tsx @@ -208,7 +208,7 @@ export const MultiRunLauncher: React.FC = ({ const desktopHeaderPaddingClass = React.useMemo(() => { if ((isDesktopApp && isMacPlatform) || isTabletStandalonePwa) { // Match main app header: reserve space for Mac/iPadOS traffic lights. - return 'pl-[5.5rem]'; + return 'pl-[88px]'; } return 'pl-3'; }, [isDesktopApp, isMacPlatform, isTabletStandalonePwa]); diff --git a/packages/ui/src/components/providers/ThemeProvider.tsx b/packages/ui/src/components/providers/ThemeProvider.tsx index 918aa272..3086bab0 100644 --- a/packages/ui/src/components/providers/ThemeProvider.tsx +++ b/packages/ui/src/components/providers/ThemeProvider.tsx @@ -1,4 +1,5 @@ import React from 'react'; +import { isTerminalEventTarget } from '@/lib/terminalFocus'; import { useUIStore } from '@/stores/useUIStore'; interface ThemeProviderProps { @@ -16,5 +17,32 @@ export const ThemeProvider: React.FC = ({ children }) => { applyPadding(); }, [fontSize, applyTypography, padding, applyPadding]); + React.useEffect(() => { + const handleZoom = (event: Event) => { + if (!(event instanceof CustomEvent)) return; + const action = event.detail; + if (action !== 'zoom-in' && action !== 'zoom-out' && action !== 'zoom-reset') return; + const active = document.activeElement; + if (active?.tagName === 'WEBVIEW' || active?.closest('webview')) return; + const state = useUIStore.getState(); + const isTerminal = isTerminalEventTarget(active) + || active?.matches('[data-terminal-hidden-input="true"]') === true; + const isEditor = active?.closest('.cm-editor') != null; + if (action === 'zoom-reset') { + if (isTerminal) state.setTerminalFontSize(14); + else if (isEditor) state.setEditorFontSize(13); + else state.setFontSize(100); + } else if (isTerminal) { + state.setTerminalFontSize(state.terminalFontSize + (action === 'zoom-in' ? 1 : -1)); + } else if (isEditor) { + state.setEditorFontSize(state.editorFontSize + (action === 'zoom-in' ? 1 : -1)); + } else { + state.setFontSize(state.fontSize + (action === 'zoom-in' ? 10 : -10)); + } + }; + window.addEventListener('openchamber:zoom', handleZoom); + return () => window.removeEventListener('openchamber:zoom', handleZoom); + }, []); + return <>{children}; }; diff --git a/packages/ui/src/components/session/SessionSwitcherDropdown.tsx b/packages/ui/src/components/session/SessionSwitcherDropdown.tsx index 0cfba1ec..35cc65e4 100644 --- a/packages/ui/src/components/session/SessionSwitcherDropdown.tsx +++ b/packages/ui/src/components/session/SessionSwitcherDropdown.tsx @@ -143,7 +143,7 @@ function SwitcherContent({ onSelect, variant, scopeProjectId }: SwitcherContentP )} > - + {t('sessions.sidebar.header.actions.newSession')} @@ -293,7 +293,7 @@ function SwitcherRow({ session, depth, variant, secondaryMeta, hasChildren, isEx {isExpanded ? : } ) : null} - + {sessionTitle} diff --git a/packages/ui/src/components/session/sidebar/projects/SessionGroupSection.tsx b/packages/ui/src/components/session/sidebar/projects/SessionGroupSection.tsx index e92a9d2b..f1e85efd 100644 --- a/packages/ui/src/components/session/sidebar/projects/SessionGroupSection.tsx +++ b/packages/ui/src/components/session/sidebar/projects/SessionGroupSection.tsx @@ -1146,7 +1146,7 @@ function SessionGroupSectionBase(props: SessionGroupSectionProps): React.ReactNo {...(dragHandleProps?.listeners ?? {})} >

-

+

{group.isArchivedBucket ? ( diff --git a/packages/ui/src/components/session/sidebar/projects/SessionProjectScroller.tsx b/packages/ui/src/components/session/sidebar/projects/SessionProjectScroller.tsx index 3e29f58c..68ef5ef2 100644 --- a/packages/ui/src/components/session/sidebar/projects/SessionProjectScroller.tsx +++ b/packages/ui/src/components/session/sidebar/projects/SessionProjectScroller.tsx @@ -425,7 +425,7 @@ function SessionProjectScrollerComponent(props: Props): React.ReactNode { ) : ( <> - + {t('sessions.sidebar.activity.recentTitle')} diff --git a/packages/ui/src/components/session/sidebar/projects/sortableItems.tsx b/packages/ui/src/components/session/sidebar/projects/sortableItems.tsx index 00b0ab08..e49593a4 100644 --- a/packages/ui/src/components/session/sidebar/projects/sortableItems.tsx +++ b/packages/ui/src/components/session/sidebar/projects/sortableItems.tsx @@ -96,7 +96,7 @@ export const ProjectHeaderIdentity: React.FC = ({ )} - {projectLabel} + {projectLabel} ); }; diff --git a/packages/ui/src/components/session/sidebar/recent/SidebarActivitySections.tsx b/packages/ui/src/components/session/sidebar/recent/SidebarActivitySections.tsx index 1f75ff6f..69401ebf 100644 --- a/packages/ui/src/components/session/sidebar/recent/SidebarActivitySections.tsx +++ b/packages/ui/src/components/session/sidebar/recent/SidebarActivitySections.tsx @@ -264,7 +264,7 @@ export function SidebarActivitySections(props: Props): React.ReactNode { {isCollapsed ? : } - {section.title} + {section.title} {section.key === 'chats' && props.onNewChat ? (