@@ -44,6 +44,18 @@ export const SettingsDrawer: React.FC<SettingsDrawerProps> = ({
4444 onClose ( ) ;
4545 } ;
4646
47+ const handleUseCurrentViewport = ( ) => {
48+ const viewport = getViewport ( ) ;
49+ setLocalSettings ( settings => ( {
50+ ...settings ,
51+ viewport : {
52+ x : Math . round ( viewport . x ) ,
53+ y : Math . round ( viewport . y ) ,
54+ zoom : parseFloat ( viewport . zoom . toFixed ( 2 ) ) ,
55+ }
56+ } ) ) ;
57+ } ;
58+
4759 return (
4860 < >
4961 < div className = "drawer-overlay" onClick = { onClose } />
@@ -82,6 +94,59 @@ export const SettingsDrawer: React.FC<SettingsDrawerProps> = ({
8294 onChange = { color => setLocalSettings ( settings => ( { ...settings , background : { ...settings . background , color } } ) ) }
8395 />
8496 </ div >
97+
98+ < div className = "form-group" >
99+ < label > { t . initialViewport } </ label >
100+ < div style = { { display : 'flex' , gap : '8px' , alignItems : 'center' , marginTop : '8px' } } >
101+ < div style = { { flex : 1 } } >
102+ < label style = { { fontSize : '0.875rem' , color : '#666' } } > { t . viewportX } </ label >
103+ < input
104+ type = "number"
105+ value = { localSettings ?. viewport ?. x ?? 0 }
106+ onChange = { ( e ) => setLocalSettings ( settings => ( {
107+ ...settings ,
108+ viewport : { ...settings . viewport , x : parseFloat ( e . target . value ) || 0 , y : settings . viewport ?. y ?? 0 , zoom : settings . viewport ?. zoom ?? 1 }
109+ } ) ) }
110+ style = { { width : '100%' } }
111+ />
112+ </ div >
113+ < div style = { { flex : 1 } } >
114+ < label style = { { fontSize : '0.875rem' , color : '#666' } } > { t . viewportY } </ label >
115+ < input
116+ type = "number"
117+ value = { localSettings ?. viewport ?. y ?? 0 }
118+ onChange = { ( e ) => setLocalSettings ( settings => ( {
119+ ...settings ,
120+ viewport : { ...settings . viewport , y : parseFloat ( e . target . value ) || 0 , x : settings . viewport ?. x ?? 0 , zoom : settings . viewport ?. zoom ?? 1 }
121+ } ) ) }
122+ style = { { width : '100%' } }
123+ />
124+ </ div >
125+ < div style = { { flex : 1 } } >
126+ < label style = { { fontSize : '0.875rem' , color : '#666' } } > { t . viewportZoom } </ label >
127+ < input
128+ type = "number"
129+ step = "0.1"
130+ min = "0.1"
131+ max = "10"
132+ value = { localSettings ?. viewport ?. zoom ?? 1 }
133+ onChange = { ( e ) => setLocalSettings ( settings => ( {
134+ ...settings ,
135+ viewport : { ...settings . viewport , zoom : parseFloat ( e . target . value ) || 1 , x : settings . viewport ?. x ?? 0 , y : settings . viewport ?. y ?? 0 }
136+ } ) ) }
137+ style = { { width : '100%' } }
138+ />
139+ </ div >
140+ </ div >
141+ < button
142+ onClick = { handleUseCurrentViewport }
143+ className = "secondary-button"
144+ style = { { marginTop : '8px' , width : '100%' } }
145+ type = "button"
146+ >
147+ { t . useCurrentViewport }
148+ </ button >
149+ </ div >
85150 </ div >
86151
87152 < div className = "drawer-footer" >
0 commit comments