@@ -8,6 +8,8 @@ import { storage, getAutoClose } from '@plannotator/ui/utils/storage';
88import { getIdentity } from '@plannotator/ui/utils/identity' ;
99import { getAgentSwitchSettings , getEffectiveAgentName } from '@plannotator/ui/utils/agentSwitch' ;
1010import { CodeAnnotation , CodeAnnotationType , SelectedLineRange , DiffAnnotationMetadata } from '@plannotator/ui/types' ;
11+ import { useResizablePanel } from '@plannotator/ui/hooks/useResizablePanel' ;
12+ import { ResizeHandle } from '@plannotator/ui/components/ResizeHandle' ;
1113import { DiffViewer } from './components/DiffViewer' ;
1214import { ReviewPanel } from './components/ReviewPanel' ;
1315import { FileTree } from './components/FileTree' ;
@@ -155,6 +157,14 @@ const ReviewApp: React.FC = () => {
155157
156158 const identity = useMemo ( ( ) => getIdentity ( ) , [ ] ) ;
157159
160+ // Resizable panels
161+ const panelResize = useResizablePanel ( { storageKey : 'plannotator-review-panel-width' } ) ;
162+ const fileTreeResize = useResizablePanel ( {
163+ storageKey : 'plannotator-filetree-width' ,
164+ defaultWidth : 256 , minWidth : 160 , maxWidth : 400 , side : 'left' ,
165+ } ) ;
166+ const isResizing = panelResize . isDragging || fileTreeResize . isDragging ;
167+
158168 // Global keyboard shortcuts
159169 useEffect ( ( ) => {
160170 const handleKeyDown = ( e : KeyboardEvent ) => {
@@ -714,28 +724,32 @@ const ReviewApp: React.FC = () => {
714724 </ header >
715725
716726 { /* Main content */ }
717- < div className = " flex-1 flex overflow-hidden" >
727+ < div className = { ` flex-1 flex overflow-hidden ${ isResizing ? 'select-none' : '' } ` } >
718728 { /* File tree sidebar - show when multiple files OR diff options available */ }
719729 { ( files . length > 1 || gitContext ?. diffOptions ) && (
720- < FileTree
721- files = { files }
722- activeFileIndex = { activeFileIndex }
723- onSelectFile = { handleFileSwitch }
724- annotations = { annotations }
725- viewedFiles = { viewedFiles }
726- onToggleViewed = { handleToggleViewed }
727- hideViewedFiles = { hideViewedFiles }
728- onToggleHideViewed = { ( ) => setHideViewedFiles ( prev => ! prev ) }
729- enableKeyboardNav = { ! showExportModal }
730- diffOptions = { gitContext ?. diffOptions }
731- activeDiffType = { diffType }
732- onSelectDiff = { handleDiffSwitch }
733- isLoadingDiff = { isLoadingDiff }
734- />
730+ < >
731+ < FileTree
732+ files = { files }
733+ activeFileIndex = { activeFileIndex }
734+ onSelectFile = { handleFileSwitch }
735+ annotations = { annotations }
736+ viewedFiles = { viewedFiles }
737+ onToggleViewed = { handleToggleViewed }
738+ hideViewedFiles = { hideViewedFiles }
739+ onToggleHideViewed = { ( ) => setHideViewedFiles ( prev => ! prev ) }
740+ enableKeyboardNav = { ! showExportModal }
741+ diffOptions = { gitContext ?. diffOptions }
742+ activeDiffType = { diffType }
743+ onSelectDiff = { handleDiffSwitch }
744+ isLoadingDiff = { isLoadingDiff }
745+ width = { fileTreeResize . width }
746+ />
747+ < ResizeHandle { ...fileTreeResize . handleProps } />
748+ </ >
735749 ) }
736750
737751 { /* Diff viewer */ }
738- < main className = "flex-1 overflow-hidden" >
752+ < main className = "flex-1 min-w-0 overflow-hidden" >
739753 { activeFile ? (
740754 < DiffViewer
741755 patch = { activeFile . patch }
@@ -779,6 +793,9 @@ const ReviewApp: React.FC = () => {
779793 ) }
780794 </ main >
781795
796+ { /* Resize Handle */ }
797+ { isPanelOpen && < ResizeHandle { ...panelResize . handleProps } /> }
798+
782799 { /* Annotations panel */ }
783800 < ReviewPanel
784801 isOpen = { isPanelOpen }
@@ -789,6 +806,7 @@ const ReviewApp: React.FC = () => {
789806 onSelectAnnotation = { handleSelectAnnotation }
790807 onDeleteAnnotation = { handleDeleteAnnotation }
791808 feedbackMarkdown = { feedbackMarkdown }
809+ width = { panelResize . width }
792810 />
793811 </ div >
794812
0 commit comments