@@ -11,7 +11,6 @@ import {
1111 __unstableMotion as motion ,
1212 __unstableAnimatePresence as AnimatePresence ,
1313 __unstableUseNavigateRegions as useNavigateRegions ,
14- ResizableBox ,
1514} from '@wordpress/components' ;
1615import {
1716 useReducedMotion ,
@@ -38,7 +37,7 @@ import getIsListPage from '../../utils/get-is-list-page';
3837import Header from '../header-edit-mode' ;
3938import useInitEditedEntityFromURL from '../sync-state-with-url/use-init-edited-entity-from-url' ;
4039import SiteHub from '../site-hub' ;
41- import ResizeHandle from '../block-editor/resize-handle ' ;
40+ import ResizableFrame from '../resizable-frame ' ;
4241import useSyncCanvasModeWithURL from '../sync-state-with-url/use-sync-canvas-mode-with-url' ;
4342import { unlock } from '../../private-apis' ;
4443import SavePanel from '../save-panel' ;
@@ -47,17 +46,6 @@ import KeyboardShortcutsGlobal from '../keyboard-shortcuts/global';
4746import { useCommands } from '../../hooks/commands' ;
4847
4948const ANIMATION_DURATION = 0.5 ;
50- const emptyResizeHandleStyles = {
51- position : undefined ,
52- userSelect : undefined ,
53- cursor : undefined ,
54- width : undefined ,
55- height : undefined ,
56- top : undefined ,
57- right : undefined ,
58- bottom : undefined ,
59- left : undefined ,
60- } ;
6149
6250export default function Layout ( ) {
6351 // This ensures the edited entity id and type are initialized properly.
@@ -87,6 +75,7 @@ export default function Layout() {
8775 select ( preferencesStore ) . get ( 'fixedToolbar' ) ,
8876 } ;
8977 } , [ ] ) ;
78+ const isEditing = canvasMode === 'edit' ;
9079 const navigateRegionsProps = useNavigateRegions ( {
9180 previous : previousShortcut ,
9281 next : nextShortcut ,
@@ -98,25 +87,17 @@ export default function Layout() {
9887 ( isMobileViewport && ! isListPage ) ||
9988 ( ! isMobileViewport && ( canvasMode === 'view' || ! isEditorPage ) ) ;
10089 const showCanvas =
101- ( isMobileViewport && isEditorPage && canvasMode === 'edit' ) ||
90+ ( isMobileViewport && isEditorPage && isEditing ) ||
10291 ! isMobileViewport ||
10392 ! isEditorPage ;
10493 const showFrame =
10594 ( ! isEditorPage && ! isMobileViewport ) ||
10695 ( ! isMobileViewport && isEditorPage && canvasMode === 'view' ) ;
10796 const isFullCanvas =
108- ( isMobileViewport && isListPage ) ||
109- ( isEditorPage && canvasMode === 'edit' ) ;
97+ ( isMobileViewport && isListPage ) || ( isEditorPage && isEditing ) ;
11098 const [ canvasResizer , canvasSize ] = useResizeObserver ( ) ;
111- const [ fullResizer , fullSize ] = useResizeObserver ( ) ;
112- const [ forcedWidth , setForcedWidth ] = useState ( null ) ;
113- const [ isResizing , setIsResizing ] = useState ( false ) ;
114- const isResizingEnabled = ! isMobileViewport && canvasMode === 'view' ;
115- const defaultSidebarWidth = isMobileViewport ? '100vw' : 360 ;
116- let canvasWidth = isResizing ? '100%' : fullSize . width ;
117- if ( showFrame && ! isResizing ) {
118- canvasWidth = canvasSize . width - canvasPadding ;
119- }
99+ const [ fullResizer ] = useResizeObserver ( ) ;
100+ const [ isResizing ] = useState ( false ) ;
120101
121102 // Synchronizing the URL with the store value of canvasMode happens in an effect
122103 // This condition ensures the component is only rendered after the synchronization happens
@@ -139,15 +120,15 @@ export default function Layout() {
139120 navigateRegionsProps . className ,
140121 {
141122 'is-full-canvas' : isFullCanvas ,
142- 'is-edit-mode' : canvasMode === 'edit' ,
123+ 'is-edit-mode' : isEditing ,
143124 'has-fixed-toolbar' : hasFixedToolbar ,
144125 }
145126 ) }
146127 >
147128 < SiteHub ref = { hubRef } className = "edit-site-layout__hub" />
148129
149130 < AnimatePresence initial = { false } >
150- { isEditorPage && canvasMode === 'edit' && (
131+ { isEditorPage && isEditing && (
151132 < NavigableRegion
152133 className = "edit-site-layout__header"
153134 ariaLabel = { __ ( 'Editor top bar' ) }
@@ -169,16 +150,15 @@ export default function Layout() {
169150 ease : 'easeOut' ,
170151 } }
171152 >
172- { canvasMode === 'edit' && < Header /> }
153+ { isEditing && < Header /> }
173154 </ NavigableRegion >
174155 ) }
175156 </ AnimatePresence >
176157
177158 < div className = "edit-site-layout__content" >
178159 < AnimatePresence initial = { false } >
179160 { showSidebar && (
180- < ResizableBox
181- as = { motion . div }
161+ < motion . div
182162 initial = { {
183163 opacity : 0 ,
184164 } }
@@ -190,86 +170,35 @@ export default function Layout() {
190170 } }
191171 transition = { {
192172 type : 'tween' ,
193- duration :
194- disableMotion || isResizing
195- ? 0
196- : ANIMATION_DURATION ,
173+ duration : ANIMATION_DURATION ,
197174 ease : 'easeOut' ,
198175 } }
199- size = { {
200- height : '100%' ,
201- width :
202- isResizingEnabled && forcedWidth
203- ? forcedWidth
204- : defaultSidebarWidth ,
205- } }
206176 className = "edit-site-layout__sidebar"
207- enable = { {
208- right : isResizingEnabled ,
209- } }
210- onResizeStop = { ( event , direction , elt ) => {
211- setForcedWidth ( elt . clientWidth ) ;
212- setIsResizing ( false ) ;
213- } }
214- onResizeStart = { ( ) => {
215- setIsResizing ( true ) ;
216- } }
217- onResize = { ( event , direction , elt ) => {
218- // This is a performance optimization
219- // We set the width imperatively to avoid re-rendering
220- // the whole component while resizing.
221- hubRef . current . style . width =
222- elt . clientWidth - 48 + 'px' ;
223- } }
224- handleComponent = { {
225- right : (
226- < ResizeHandle
227- direction = "right"
228- variation = "separator"
229- resizeWidthBy = { ( delta ) => {
230- setForcedWidth (
231- ( forcedWidth ??
232- defaultSidebarWidth ) +
233- delta
234- ) ;
235- } }
236- />
237- ) ,
238- } }
239- handleClasses = { undefined }
240- handleStyles = { {
241- right : emptyResizeHandleStyles ,
242- } }
243- minWidth = { isResizingEnabled ? 320 : undefined }
244- maxWidth = {
245- isResizingEnabled && fullSize
246- ? fullSize . width - 360
247- : undefined
248- }
249177 >
250178 < NavigableRegion
251179 ariaLabel = { __ ( 'Navigation sidebar' ) }
252180 >
253181 < Sidebar />
254182 </ NavigableRegion >
255- </ ResizableBox >
183+ </ motion . div >
256184 ) }
257185 </ AnimatePresence >
258186
259187 < SavePanel />
260188
261189 { showCanvas && (
262- < div
190+ < motion . div
263191 className = { classnames (
264192 'edit-site-layout__canvas-container' ,
265193 {
266194 'is-resizing' : isResizing ,
267195 }
268196 ) }
269- style = { {
197+ animate = { {
270198 paddingTop : showFrame ? canvasPadding : 0 ,
271199 paddingBottom : showFrame ? canvasPadding : 0 ,
272200 } }
201+ transition = { { duration : ANIMATION_DURATION } }
273202 >
274203 { canvasResizer }
275204 { ! ! canvasSize . width && (
@@ -301,34 +230,18 @@ export default function Layout() {
301230 ease : 'easeOut' ,
302231 } }
303232 >
304- < motion . div
305- style = { {
306- position : 'absolute' ,
307- top : 0 ,
308- left : 0 ,
309- bottom : 0 ,
310- } }
311- initial = { false }
312- animate = { {
313- width : canvasWidth ,
314- } }
315- transition = { {
316- type : 'tween' ,
317- duration :
318- disableMotion || isResizing
319- ? 0
320- : ANIMATION_DURATION ,
321- ease : 'easeOut' ,
322- } }
233+ < ResizableFrame
234+ startWidth = { canvasSize . width }
235+ isFull = { isEditing }
323236 >
324237 < ErrorBoundary >
325238 { isEditorPage && < Editor /> }
326239 { isListPage && < ListPage /> }
327240 </ ErrorBoundary >
328- </ motion . div >
241+ </ ResizableFrame >
329242 </ motion . div >
330243 ) }
331- </ div >
244+ </ motion . div >
332245 ) }
333246 </ div >
334247 </ div >
0 commit comments