@@ -230,10 +230,12 @@ export const MainApp: React.FC = () => {
230230 const [ isRestoringActiveDocument , setIsRestoringActiveDocument ] = useState ( true ) ;
231231 const [ hasRestoredActiveDocument , setHasRestoredActiveDocument ] = useState ( false ) ;
232232 const [ previewScale , setPreviewScale ] = useState ( PREVIEW_INITIAL_SCALE ) ;
233+ const [ editorScale , setEditorScale ] = useState ( PREVIEW_INITIAL_SCALE ) ;
233234 const [ previewResetSignal , setPreviewResetSignal ] = useState ( 0 ) ;
234235 const [ isPreviewVisible , setIsPreviewVisible ] = useState ( false ) ;
235236 const [ isPreviewZoomReady , setIsPreviewZoomReady ] = useState ( false ) ;
236237 const [ previewMetadata , setPreviewMetadata ] = useState < PreviewMetadata | null > ( null ) ;
238+ const [ workspaceZoomTarget , setWorkspaceZoomTarget ] = useState < 'preview' | 'editor' > ( 'editor' ) ;
237239
238240 useEffect ( ( ) => {
239241 if ( ! isPreviewVisible ) {
@@ -251,25 +253,41 @@ export const MainApp: React.FC = () => {
251253 const openDocumentIds = tabState . order ;
252254 const storedActiveDocumentIdRef = useRef < string | null > ( null ) ;
253255
254- const clampPreviewScale = useCallback ( ( value : number ) => {
256+ const clampZoomScale = useCallback ( ( value : number ) => {
255257 return Math . min ( Math . max ( value , PREVIEW_MIN_SCALE ) , PREVIEW_MAX_SCALE ) ;
256258 } , [ ] ) ;
257259
258260 const handlePreviewScaleChange = useCallback ( ( value : number ) => {
259- setPreviewScale ( clampPreviewScale ( value ) ) ;
260- } , [ clampPreviewScale ] ) ;
261+ setPreviewScale ( clampZoomScale ( value ) ) ;
262+ } , [ clampZoomScale ] ) ;
261263
262264 const handlePreviewZoomIn = useCallback ( ( ) => {
263- setPreviewScale ( prev => clampPreviewScale ( prev * ( 1 + PREVIEW_ZOOM_STEP ) ) ) ;
264- } , [ clampPreviewScale ] ) ;
265+ if ( workspaceZoomTarget === 'preview' ) {
266+ setPreviewScale ( prev => clampZoomScale ( prev * ( 1 + PREVIEW_ZOOM_STEP ) ) ) ;
267+ } else {
268+ setEditorScale ( prev => clampZoomScale ( prev * ( 1 + PREVIEW_ZOOM_STEP ) ) ) ;
269+ }
270+ } , [ clampZoomScale , workspaceZoomTarget ] ) ;
265271
266272 const handlePreviewZoomOut = useCallback ( ( ) => {
267- setPreviewScale ( prev => clampPreviewScale ( prev / ( 1 + PREVIEW_ZOOM_STEP ) ) ) ;
268- } , [ clampPreviewScale ] ) ;
273+ if ( workspaceZoomTarget === 'preview' ) {
274+ setPreviewScale ( prev => clampZoomScale ( prev / ( 1 + PREVIEW_ZOOM_STEP ) ) ) ;
275+ } else {
276+ setEditorScale ( prev => clampZoomScale ( prev / ( 1 + PREVIEW_ZOOM_STEP ) ) ) ;
277+ }
278+ } , [ clampZoomScale , workspaceZoomTarget ] ) ;
269279
270280 const handlePreviewReset = useCallback ( ( ) => {
271- setPreviewScale ( PREVIEW_INITIAL_SCALE ) ;
272- setPreviewResetSignal ( prev => prev + 1 ) ;
281+ if ( workspaceZoomTarget === 'preview' ) {
282+ setPreviewScale ( PREVIEW_INITIAL_SCALE ) ;
283+ setPreviewResetSignal ( prev => prev + 1 ) ;
284+ } else {
285+ setEditorScale ( PREVIEW_INITIAL_SCALE ) ;
286+ }
287+ } , [ workspaceZoomTarget ] ) ;
288+
289+ const handleWorkspaceZoomTargetChange = useCallback ( ( target : 'preview' | 'editor' ) => {
290+ setWorkspaceZoomTarget ( target ) ;
273291 } , [ ] ) ;
274292
275293 const activateDocumentTab = useCallback ( ( documentId : string ) => {
@@ -482,11 +500,39 @@ export const MainApp: React.FC = () => {
482500 }
483501 } , [ activeDocument ] ) ;
484502
503+ const previewZoomAvailable = useMemo ( ( ) => {
504+ if ( view === 'info' ) {
505+ return true ;
506+ }
507+ return isPreviewVisible && isPreviewZoomReady ;
508+ } , [ isPreviewVisible , isPreviewZoomReady , view ] ) ;
509+
510+ const editorZoomAvailable = useMemo ( ( ) => {
511+ return view === 'editor' && documentView === 'editor' && Boolean ( activeDocument ) ;
512+ } , [ activeDocument , documentView , view ] ) ;
513+
514+ useEffect ( ( ) => {
515+ if ( workspaceZoomTarget === 'preview' && ! previewZoomAvailable && editorZoomAvailable ) {
516+ setWorkspaceZoomTarget ( 'editor' ) ;
517+ } else if ( workspaceZoomTarget === 'editor' && ! editorZoomAvailable && previewZoomAvailable ) {
518+ setWorkspaceZoomTarget ( 'preview' ) ;
519+ }
520+ } , [ editorZoomAvailable , previewZoomAvailable , workspaceZoomTarget ] ) ;
521+
522+ const isWorkspaceZoomAvailable = useMemo ( ( ) => {
523+ return workspaceZoomTarget === 'preview' ? previewZoomAvailable : editorZoomAvailable ;
524+ } , [ editorZoomAvailable , previewZoomAvailable , workspaceZoomTarget ] ) ;
525+
526+ const workspaceZoomScale = useMemo ( ( ) => {
527+ return workspaceZoomTarget === 'preview' ? previewScale : editorScale ;
528+ } , [ editorScale , previewScale , workspaceZoomTarget ] ) ;
529+
485530 const documentItems = useMemo ( ( ) => items . filter ( item => item . type === 'document' ) , [ items ] ) ;
486531 const activeDocumentId = activeDocument ?. id ?? null ;
487532
488533 useEffect ( ( ) => {
489534 setPreviewScale ( PREVIEW_INITIAL_SCALE ) ;
535+ setEditorScale ( PREVIEW_INITIAL_SCALE ) ;
490536 setPreviewResetSignal ( prev => prev + 1 ) ;
491537 } , [ activeNode ?. id , activeNode ?. type ] ) ;
492538
@@ -2779,7 +2825,7 @@ export const MainApp: React.FC = () => {
27792825 return (
27802826 < InfoView
27812827 settings = { settings }
2782- previewScale = { previewScale }
2828+ previewScale = { workspaceZoomScale }
27832829 onPreviewScaleChange = { handlePreviewScaleChange }
27842830 previewZoomOptions = { {
27852831 minScale : PREVIEW_MIN_SCALE ,
@@ -2790,6 +2836,7 @@ export const MainApp: React.FC = () => {
27902836 previewResetSignal = { previewResetSignal }
27912837 onPreviewVisibilityChange = { setIsPreviewVisible }
27922838 onPreviewZoomAvailabilityChange = { setIsPreviewZoomReady }
2839+ onZoomTargetChange = { handleWorkspaceZoomTargetChange }
27932840 />
27942841 ) ;
27952842 }
@@ -2829,6 +2876,7 @@ export const MainApp: React.FC = () => {
28292876 onToggleLock = { ( locked ) => handleSetNodeLockState ( activeNode . id , locked ) }
28302877 formatTrigger = { formatTrigger }
28312878 previewScale = { previewScale }
2879+ editorScale = { editorScale }
28322880 onPreviewScaleChange = { handlePreviewScaleChange }
28332881 previewMinScale = { PREVIEW_MIN_SCALE }
28342882 previewMaxScale = { PREVIEW_MAX_SCALE }
@@ -2838,6 +2886,7 @@ export const MainApp: React.FC = () => {
28382886 onPreviewVisibilityChange = { setIsPreviewVisible }
28392887 onPreviewZoomAvailabilityChange = { setIsPreviewZoomReady }
28402888 onPreviewMetadataChange = { setPreviewMetadata }
2889+ onZoomTargetChange = { handleWorkspaceZoomTargetChange }
28412890 />
28422891 ) ;
28432892 }
@@ -3022,15 +3071,16 @@ export const MainApp: React.FC = () => {
30223071 databaseStatus = { databaseStatus }
30233072 onDatabaseMenu = { handleDatabaseMenu }
30243073 onOpenAbout = { handleOpenAbout }
3025- previewScale = { previewScale }
3074+ previewScale = { workspaceZoomScale }
30263075 onPreviewZoomIn = { handlePreviewZoomIn }
30273076 onPreviewZoomOut = { handlePreviewZoomOut }
30283077 onPreviewReset = { handlePreviewReset }
3029- isPreviewZoomAvailable = { isPreviewVisible && isPreviewZoomReady }
3078+ isPreviewZoomAvailable = { isWorkspaceZoomAvailable }
30303079 previewMinScale = { PREVIEW_MIN_SCALE }
30313080 previewMaxScale = { PREVIEW_MAX_SCALE }
30323081 previewInitialScale = { PREVIEW_INITIAL_SCALE }
30333082 previewMetadata = { previewMetadata }
3083+ zoomTarget = { workspaceZoomTarget }
30343084 />
30353085 </ div >
30363086
0 commit comments