@@ -11,6 +11,7 @@ import {
11
11
__unstableMotion as motion ,
12
12
__unstableAnimatePresence as AnimatePresence ,
13
13
__unstableUseNavigateRegions as useNavigateRegions ,
14
+ ResizableBox ,
14
15
} from '@wordpress/components' ;
15
16
import {
16
17
useReducedMotion ,
@@ -35,8 +36,20 @@ import getIsListPage from '../../utils/get-is-list-page';
35
36
import Header from '../header-edit-mode' ;
36
37
import useInitEditedEntityFromURL from '../sync-state-with-url/use-init-edited-entity-from-url' ;
37
38
import SiteHub from '../site-hub' ;
39
+ import ResizeHandle from '../block-editor/resize-handle' ;
38
40
39
41
const ANIMATION_DURATION = 0.5 ;
42
+ const emptyResizeHandleStyles = {
43
+ position : undefined ,
44
+ userSelect : undefined ,
45
+ cursor : undefined ,
46
+ width : undefined ,
47
+ height : undefined ,
48
+ top : undefined ,
49
+ right : undefined ,
50
+ bottom : undefined ,
51
+ left : undefined ,
52
+ } ;
40
53
41
54
export default function Layout ( { onError } ) {
42
55
// This ensures the edited entity id and type are initialized properly.
@@ -86,6 +99,8 @@ export default function Layout( { onError } ) {
86
99
// Ideally this effect could be removed if we move the "isMobileCanvasVisible" into the store.
87
100
const [ canvasResizer , canvasSize ] = useResizeObserver ( ) ;
88
101
const [ fullResizer , fullSize ] = useResizeObserver ( ) ;
102
+ const [ forcedWidth , setForcedWidth ] = useState ( null ) ;
103
+ const [ isResizing , setIsResizing ] = useState ( false ) ;
89
104
useEffect ( ( ) => {
90
105
if ( canvasMode === 'view' && isMobileViewport ) {
91
106
setIsMobileCanvasVisible ( false ) ;
@@ -113,6 +128,9 @@ export default function Layout( { onError } ) {
113
128
>
114
129
< SiteHub
115
130
className = "edit-site-layout__hub"
131
+ style = { {
132
+ width : forcedWidth ? forcedWidth - 48 : undefined ,
133
+ } }
116
134
isMobileCanvasVisible = { isMobileCanvasVisible }
117
135
setIsMobileCanvasVisible = { setIsMobileCanvasVisible }
118
136
/>
@@ -149,7 +167,7 @@ export default function Layout( { onError } ) {
149
167
< div className = "edit-site-layout__content" >
150
168
< AnimatePresence initial = { false } >
151
169
{ showSidebar && (
152
- < NavigableRegion
170
+ < ResizableBox
153
171
as = { motion . div }
154
172
initial = { {
155
173
opacity : 0 ,
@@ -167,17 +185,58 @@ export default function Layout( { onError } ) {
167
185
: ANIMATION_DURATION ,
168
186
ease : 'easeOut' ,
169
187
} }
188
+ size = { {
189
+ height : '100%' ,
190
+ width :
191
+ ! isMobileViewport &&
192
+ isEditorPage &&
193
+ canvasMode === 'view'
194
+ ? forcedWidth ?? 360
195
+ : undefined ,
196
+ } }
170
197
className = "edit-site-layout__sidebar"
171
- ariaLabel = { __ ( 'Navigation sidebar' ) }
198
+ enable = { {
199
+ right :
200
+ ! isMobileViewport &&
201
+ isEditorPage &&
202
+ canvasMode === 'view' ,
203
+ } }
204
+ onResizeStop = { ( event , direction , elt ) => {
205
+ setForcedWidth ( elt . clientWidth ) ;
206
+ setIsResizing ( false ) ;
207
+ } }
208
+ onResizeStart = { ( ) => {
209
+ setIsResizing ( true ) ;
210
+ } }
211
+ handleComponent = { {
212
+ right : < ResizeHandle direction = "right" /> ,
213
+ } }
214
+ handleClasses = { undefined }
215
+ handleStyles = { {
216
+ right : emptyResizeHandleStyles ,
217
+ } }
218
+ minWidth = { 320 }
219
+ maxWidth = {
220
+ fullSize ? fullSize . width - 360 : undefined
221
+ }
172
222
>
173
- < Sidebar />
174
- </ NavigableRegion >
223
+ < NavigableRegion
224
+ ariaLabel = { __ ( 'Navigation sidebar' ) }
225
+ >
226
+ < Sidebar />
227
+ </ NavigableRegion >
228
+ </ ResizableBox >
175
229
) }
176
230
</ AnimatePresence >
177
231
178
232
{ showCanvas && (
179
233
< div
180
- className = "edit-site-layout__canvas-container"
234
+ className = { classnames (
235
+ 'edit-site-layout__canvas-container' ,
236
+ {
237
+ 'is-resizing' : isResizing ,
238
+ }
239
+ ) }
181
240
style = { {
182
241
paddingTop : showFrame ? canvasPadding : 0 ,
183
242
paddingBottom : showFrame ? canvasPadding : 0 ,
@@ -191,9 +250,10 @@ export default function Layout( { onError } ) {
191
250
className = "edit-site-layout__canvas"
192
251
transition = { {
193
252
type : 'tween' ,
194
- duration : disableMotion
195
- ? 0
196
- : ANIMATION_DURATION ,
253
+ duration :
254
+ disableMotion || isResizing
255
+ ? 0
256
+ : ANIMATION_DURATION ,
197
257
ease : 'easeOut' ,
198
258
} }
199
259
>
@@ -213,9 +273,10 @@ export default function Layout( { onError } ) {
213
273
} }
214
274
transition = { {
215
275
type : 'tween' ,
216
- duration : disableMotion
217
- ? 0
218
- : ANIMATION_DURATION ,
276
+ duration :
277
+ disableMotion || isResizing
278
+ ? 0
279
+ : ANIMATION_DURATION ,
219
280
ease : 'easeOut' ,
220
281
} }
221
282
>
0 commit comments